From 8590db077090efaae6ddf3eafd9e8e406c8aae9b Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Wed, 5 Feb 2020 06:34:33 +0100 Subject: [PATCH 001/646] Fix immediate editing of reference constraints. Before this commit, if immediate editing of constraints was enabled, then when adding a reference constraint, an editor was incorrectly opened. --- src/constraint.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/constraint.cpp b/src/constraint.cpp index 8ab76f278..fb5c74cb8 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -196,9 +196,6 @@ void Constraint::MenuConstrain(Command id) { c.valA = 0; c.ModifyToSatisfy(); AddConstraint(&c); - if (SS.immediatelyEditDimension) { - SS.GW.EditConstraint(c.h); - } break; } @@ -610,9 +607,6 @@ void Constraint::MenuConstrain(Command id) { c.ModifyToSatisfy(); AddConstraint(&c); - if (SS.immediatelyEditDimension) { - SS.GW.EditConstraint(c.h); - } break; } @@ -769,6 +763,10 @@ void Constraint::MenuConstrain(Command id) { } } + if ((id == Command::DISTANCE_DIA || id == Command::ANGLE) && SS.immediatelyEditDimension) { + SS.GW.EditConstraint(c.h); + } + SS.GW.ClearSelection(); } From 4a56431fdddd03280fe2ae040fe9e54eb7bc626f Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Sat, 8 Feb 2020 15:42:01 +0100 Subject: [PATCH 002/646] snap: Build snaps on Travis without remote-build & drop i386 + armhf Snapcraft's remote-build does not fit the requirements of CI, so replace it with builds running directly on Travis: 1. Builds on Travis can run independently, whereas remote-build competes for the same resource (Launchpad) and will potentially block if multiple commits require building in succession. 2. Snapcrafts CLI for remote-build is not designed to be easily scriptable. 3. Travis recently introduced building on arm64, so builds for arm64 are now very fast and don't require emulation. We do not build for armhf and i386 any more because they are of little relevance on the desktop. --- .travis.yml | 16 ++++++++++------ .travis/build-snap.sh | 15 ++------------- .travis/launchpad-credentials.enc | Bin 224 -> 0 bytes 3 files changed, 12 insertions(+), 19 deletions(-) delete mode 100644 .travis/launchpad-credentials.enc diff --git a/.travis.yml b/.travis.yml index 9e3fa7929..0d215176d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,14 +25,16 @@ jobs: on: repo: solvespace/solvespace tags: true - - stage: deploy - name: "Snap" + - &deploy-snap + stage: deploy + name: Snap amd64 os: linux + arch: amd64 dist: bionic addons: - snaps: - - name: snapcraft - confinement: classic + snaps: + - name: snapcraft + confinement: classic script: ./.travis/build-snap.sh deploy: - provider: script @@ -47,4 +49,6 @@ jobs: on: branch: master tags: true - + - <<: *deploy-snap + name: Snap arm64 + arch: arm64 diff --git a/.travis/build-snap.sh b/.travis/build-snap.sh index d824b3836..634e01c4c 100755 --- a/.travis/build-snap.sh +++ b/.travis/build-snap.sh @@ -1,15 +1,4 @@ #!/bin/sh -xe -lp_data_dir="$HOME/.local/share/snapcraft/provider/launchpad" -lp_credentials="$lp_data_dir/credentials" - -mkdir -p "$lp_data_dir" -openssl aes-256-cbc -K $encrypted_c4bc81f026a2_key -iv $encrypted_c4bc81f026a2_iv \ - -in .travis/launchpad-credentials.enc \ - -out "$lp_credentials" -d -chmod 600 "$lp_credentials" - -./pkg/snap/build.sh remote-build \ - --launchpad-user solvespace \ - --launchpad-accept-public-upload \ - --build-on=amd64,arm64,armhf,i386 +sudo apt-get update +sudo ./pkg/snap/build.sh --destructive-mode diff --git a/.travis/launchpad-credentials.enc b/.travis/launchpad-credentials.enc deleted file mode 100644 index 5eba3cca8d33bb4a74b3ba3e16e2ba9386aed6af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224 zcmV<603ZKgph6-3zoy0tXgIY!>i6M+dUZj*-`(E?wsYF>r!Bz8^PiU?4`vw|Q}>Z;pZ8$`R6EG`(BcE13d zh~XeM$}hlxwwL6)TL{i;WIzkkOi?;2=>tTznXKORAsBjGLMdj$%@Q+W413Zvex?me zZB6|=cmIC>y%bkY2?aB?;W7Ia&uE#hM1y^ST?Es&E!tbbfi?|+K>b$RcBNIOnt Date: Sat, 8 Feb 2020 17:47:36 +0100 Subject: [PATCH 003/646] snap: Add missing sudo in Travis deploy step Running the build step with sudo necessitates running the deploy step with sudo too. Otherwise, we face permission problems. --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0d215176d..26d94da97 100644 --- a/.travis.yml +++ b/.travis.yml @@ -38,13 +38,13 @@ jobs: script: ./.travis/build-snap.sh deploy: - provider: script - script: ./.travis/deploy-snap.sh edge + script: sudo ./.travis/deploy-snap.sh edge skip_cleanup: true on: branch: master tags: false - provider: script - script: ./.travis/deploy-snap.sh edge,beta + script: sudo ./.travis/deploy-snap.sh edge,beta skip_cleanup: true on: branch: master From e6a7016f3255996be8956c17f4d4fd3b50cca4be Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Thu, 13 Feb 2020 16:20:52 +0100 Subject: [PATCH 004/646] snap: Remove superfluous files from package Remove all files from snap that are already included in the base snap or in any connected content snaps. The main advantage is the massively reduced snap size: From ~70 MB down to ~6 MB. --- pkg/snap/snap/snapcraft.yaml | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index e17ecda19..ce0c45ef7 100644 --- a/pkg/snap/snap/snapcraft.yaml +++ b/pkg/snap/snap/snapcraft.yaml @@ -26,7 +26,7 @@ apps: extensions: [gnome-3-28] plugs: [opengl, unity7, home, removable-media, gsettings, network] environment: - __EGL_VENDOR_LIBRARY_DIRS: $SNAP/usr/share/glvnd/egl_vendor.d + __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 plugs: [home, removable-media, network] @@ -71,6 +71,14 @@ parts: - libglibmm-2.4-1v5 - libpangomm-1.4-1v5 - libsigc++-2.0-0v5 - - libglew2.0 - - libegl-mesa0 - - libdrm2 + cleanup: + after: [solvespace] + plugin: nil + build-snaps: [core18, gnome-3-28-1804] + 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-28-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/{}" \; + done From 3477be96ebf94052373a02ac605a648aadb541aa Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Thu, 13 Feb 2020 17:10:37 +0100 Subject: [PATCH 005/646] snap: Fix missing extension for cli solvespace-cli needs the gnome-3-28 extension to find its libraries. --- pkg/snap/snap/snapcraft.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index ce0c45ef7..940d08379 100644 --- a/pkg/snap/snap/snapcraft.yaml +++ b/pkg/snap/snap/snapcraft.yaml @@ -29,6 +29,7 @@ apps: __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-28] plugs: [home, removable-media, network] parts: From 9ebbf8f4ee533cfa23ddf14a9d67090ce5380046 Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 18 Dec 2019 16:51:17 +0200 Subject: [PATCH 006/646] Fix some trivial warnings found by MSVC. NFC. Found with /W4 by MSVC 2019 (Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314) A bunch of implicit casts 'double' to 'float' and one 'int64_t' to 'unsigned'. .\src\platform\guiwin.cpp(1237): warning C4701: potentially uninitialized local variable 'cursorName' used .\src\platform\guiwin.cpp(1237): warning C4703: potentially uninitialized local pointer variable 'cursorName' used .\src\solvespace.cpp(805,30): warning C4456: declaration of 'gs' hides previous local declaration .\src\solvespace.cpp(715,17): message : see declaration of 'gs' .\src\solvespace.cpp(849,47): warning C4456: declaration of 'e' hides previous local declaration .\src\solvespace.cpp(847,29): message : see declaration of 'e' .\src\render\render.h(288,51): warning C4458: declaration of 'camera' hides class member .\src\render\render.h(271,17): message : see declaration of 'SolveSpace::SurfaceRenderer::camera' .\src\render\render.h(289,57): warning C4458: declaration of 'lighting' hides class member .\src\render\render.h(272,17): message : see declaration of 'SolveSpace::SurfaceRenderer::lighting' --- src/export.cpp | 14 +++++++------- src/platform/guiwin.cpp | 2 +- src/render/render.h | 4 ++-- src/solvespace.cpp | 5 ++--- src/textscreens.cpp | 5 +++-- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/export.cpp b/src/export.cpp index 621fa2e62..31c6c3759 100644 --- a/src/export.cpp +++ b/src/export.cpp @@ -917,13 +917,13 @@ void SolveSpaceUI::ExportMeshAsQ3doTo(FILE *f, SMesh *sm) { } Vector faceNormal = t.Normal(); - auto a = q3d::Vector3(t.a.x/s, t.a.y/s, t.a.z/s); - auto b = q3d::Vector3(t.b.x/s, t.b.y/s, t.b.z/s); - auto c = q3d::Vector3(t.c.x/s, t.c.y/s, t.c.z/s); - auto fn = q3d::Vector3(faceNormal.x, faceNormal.y, faceNormal.x); - auto n1 = q3d::Vector3(t.normals[0].x, t.normals[0].y, t.normals[0].z); - auto n2 = q3d::Vector3(t.normals[1].x, t.normals[1].y, t.normals[1].z); - auto n3 = q3d::Vector3(t.normals[2].x, t.normals[2].y, t.normals[2].z); + auto a = q3d::Vector3((float)(t.a.x/s), (float)(t.a.y/s), (float)(t.a.z/s)); + auto b = q3d::Vector3((float)(t.b.x/s), (float)(t.b.y/s), (float)(t.b.z/s)); + auto c = q3d::Vector3((float)(t.c.x/s), (float)(t.c.y/s), (float)(t.c.z/s)); + auto fn = q3d::Vector3((float)faceNormal.x, (float)faceNormal.y, (float)faceNormal.x); + auto n1 = q3d::Vector3((float)t.normals[0].x, (float)t.normals[0].y, (float)t.normals[0].z); + auto n2 = q3d::Vector3((float)t.normals[1].x, (float)t.normals[1].y, (float)t.normals[1].z); + auto n3 = q3d::Vector3((float)t.normals[2].x, (float)t.normals[2].y, (float)t.normals[2].z); auto tri = q3d::CreateTriangle(builder, &a, &b, &c, &fn, &n1, &n2, &n3); materialTriangles[color].push_back(tri); } diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index 2f6ce523f..8a54deedc 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1227,7 +1227,7 @@ class WindowImplWin32 final : public Window { } void SetCursor(Cursor cursor) override { - LPWSTR cursorName; + LPWSTR cursorName = IDC_ARROW; switch(cursor) { case Cursor::POINTER: cursorName = IDC_ARROW; break; case Cursor::HAND: cursorName = IDC_HAND; break; diff --git a/src/render/render.h b/src/render/render.h index 70d5863f6..b1692f139 100644 --- a/src/render/render.h +++ b/src/render/render.h @@ -285,8 +285,8 @@ class SurfaceRenderer : public ViewportCanvas { const Camera &GetCamera() const override { return camera; } // ViewportCanvas interface. - void SetCamera(const Camera &camera) override { this->camera = camera; } - void SetLighting(const Lighting &lighting) override { this->lighting = lighting; } + void SetCamera(const Camera &cam) override { this->camera = cam; } + void SetLighting(const Lighting &light) override { this->lighting = light; } void DrawLine(const Vector &a, const Vector &b, hStroke hcs) override; void DrawEdges(const SEdgeList &el, hStroke hcs) override; diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 4d1913685..a3a53caac 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -802,7 +802,6 @@ void SolveSpaceUI::MenuAnalyze(Command id) { case Command::AREA: { Group *g = SK.GetGroup(SS.GW.activeGroup); SS.GW.GroupSelection(); - auto const &gs = SS.GW.gs; if(gs.faces > 0) { std::vector faces; @@ -844,8 +843,8 @@ void SolveSpaceUI::MenuAnalyze(Command id) { if(gs.n > 0 && gs.n == gs.entities) { double perimeter = 0.0; for(int i = 0; i < gs.entities; i++) { - Entity *e = SK.entity.FindById(gs.entity[i]); - SEdgeList *el = e->GetOrGenerateEdges(); + Entity *en = SK.entity.FindById(gs.entity[i]); + SEdgeList *el = en->GetOrGenerateEdges(); for(const SEdge &e : el->l) { perimeter += e.b.Minus(e.a).Magnitude(); } diff --git a/src/textscreens.cpp b/src/textscreens.cpp index 7e9423932..1ea8f1330 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -604,7 +604,7 @@ void TextWindow::ScreenStepDimGo(int link, uint32_t v) { if(time - SS.TW.stepDim.time < STEP_MILLIS) { SS.TW.stepDim.timer->RunAfterNextFrame(); } else { - SS.TW.stepDim.timer->RunAfter(time - SS.TW.stepDim.time - STEP_MILLIS); + SS.TW.stepDim.timer->RunAfter((unsigned)(time - SS.TW.stepDim.time - STEP_MILLIS)); } SS.TW.stepDim.time = time; } else { @@ -758,7 +758,8 @@ void TextWindow::EditControlDone(std::string s) { Group *g = SK.group.FindByIdNoOops(SS.TW.shown.group); if(!g) break; - g->color = RgbaColor::FromFloat(rgb.x, rgb.y, rgb.z, g->color.alphaF()); + g->color = RgbaColor::FromFloat((float)rgb.x, (float)rgb.y, (float)rgb.z, + g->color.alphaF()); SS.MarkGroupDirty(g->h); SS.GW.ClearSuper(); From 1d0e0abac54724c494430827fc6ca42b9ec02855 Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 18 Dec 2019 17:10:37 +0200 Subject: [PATCH 007/646] Fix a bug with 3Dconnexion: SpaceMouse A warning found with /W4 by MSVC 2019 (Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314) is an actual bug. How does the SpaceMouse (I do not have one) work at all when the global `hSpaceWareDriverClass` is NULL?! .\src\platform\guiwin.cpp(1392,34): warning C4459: declaration of 'hSpaceWareDriverClass' hides global declaration .\src\platform\guiwin.cpp(1389,13): message : see declaration of 'SolveSpace::Platform::hSpaceWareDriverClass' --- src/platform/guiwin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index 8a54deedc..70160bbcc 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1389,7 +1389,7 @@ WindowRef CreateWindow(Window::Kind kind, WindowRef parentWindow) { static HWND hSpaceWareDriverClass; void Open3DConnexion() { - HWND hSpaceWareDriverClass = FindWindowW(L"SpaceWare Driver Class", NULL); + hSpaceWareDriverClass = FindWindowW(L"SpaceWare Driver Class", NULL); if(hSpaceWareDriverClass != NULL) { SiInitialize(); } From b0feef77cf405ec5b7641f5533e6bb0ef92f2a5d Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 20 Dec 2019 14:19:42 +0200 Subject: [PATCH 008/646] Win32: Drastically reduce stack usage at startup. NFC? See: https://github.com/solvespace/solvespace/issues/92#issuecomment-567831112 The problem was first introduced here: https://github.com/solvespace/solvespace/commit/dabd57847edf142f145491175fb203455023d9d7 and later "fixed" here: https://github.com/solvespace/solvespace/commit/f324477dd06c15022670a4486bf83be3abbf48b5 by setting the stack size to /STACK:33554432 Solvespace now starts up even with /STACK:554432 According to this: https://en.cppreference.com/w/cpp/language/value_initialization ``` "2) if T is a class type with a default constructor that is neither user-provided nor deleted (that is, it may be a class with an implicitly-defined or defaulted default constructor), the object is zero-initialized and then it is default-initialized if it has a non-trivial default constructor; " ``` So removing the `{}` should leave both the `System` and `TextWindow` class instances properly initialized. --- src/CMakeLists.txt | 2 +- src/solvespace.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 36fdc5f53..928b45229 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -340,7 +340,7 @@ if(ENABLE_GUI) if(MSVC) set_target_properties(solvespace PROPERTIES - LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF /STACK:33554432") + LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF") elseif(APPLE) set_target_properties(solvespace PROPERTIES OUTPUT_NAME SolveSpace) diff --git a/src/solvespace.h b/src/solvespace.h index be0284cd2..2a553024f 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -810,8 +810,8 @@ class SolveSpaceUI { // where it puts zero-initialized global data in the binary (~30M of zeroes) // in release builds. SolveSpaceUI() - : pTW(new TextWindow({})), TW(*pTW), - pSys(new System({})), sys(*pSys) {} + : pTW(new TextWindow()), TW(*pTW), + pSys(new System()), sys(*pSys) {} ~SolveSpaceUI() { delete pTW; From 4a3b87f08db7d93f61fa940903fd1e254cf1b2ef Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Sun, 8 Mar 2020 15:54:07 +0100 Subject: [PATCH 009/646] Update flatbuffers, fixing build on Clang trunk flatbuffers hard-code general -Werror, which led to builds failing on clang 11.0.0-++20200307120047+01c48d7d11e-1~exp1~20200307110643.632 with a plethora of ../extlib/flatbuffers/include/flatbuffers/flatbuffers.h:1720:25: error: definition of implicit copy constructor for 'TableKeyComparator' is deprecated because it has a user-declared copy assignment operator [-Werror,-Wdeprecated-copy] --- extlib/flatbuffers | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/flatbuffers b/extlib/flatbuffers index a1f14005a..f73d205bc 160000 --- a/extlib/flatbuffers +++ b/extlib/flatbuffers @@ -1 +1 @@ -Subproject commit a1f14005ab823adc1300754fd37c01e9842ed4bc +Subproject commit f73d205bc7536991e620d3027a711e713a789967 From 0d1f8ac30070d6d46ab6764881fceac46d56bddc Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Sun, 8 Mar 2020 16:39:19 +0100 Subject: [PATCH 010/646] Fix two trivial implicit double to int conversion warnings. NFC --- src/render/rendergl3.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render/rendergl3.cpp b/src/render/rendergl3.cpp index b620aee0b..481649665 100644 --- a/src/render/rendergl3.cpp +++ b/src/render/rendergl3.cpp @@ -693,8 +693,8 @@ void OpenGl3Renderer::Clear() { } std::shared_ptr OpenGl3Renderer::ReadFrame() { - int width = camera.width * camera.pixelRatio; - int height = camera.height * camera.pixelRatio; + int width = (int)(camera.width * camera.pixelRatio); + int height = (int)(camera.height * camera.pixelRatio); std::shared_ptr pixmap = Pixmap::Create(Pixmap::Format::RGBA, (size_t)width, (size_t)height); glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, &pixmap->data[0]); From 31bf72824866a6a0cabfef39276372c78050851d Mon Sep 17 00:00:00 2001 From: Roc <1844478+rorlork@users.noreply.github.com> Date: Fri, 13 Mar 2020 00:03:26 +0100 Subject: [PATCH 011/646] Fix a crash when trying to show an error with bad separator. For example, a single dot or colon at the end of the error string. --- src/util.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/util.cpp b/src/util.cpp index 6840257f2..f2d33c2d4 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -138,9 +138,11 @@ static void MessageBox(const char *fmt, va_list va, bool error, } } - std::string::iterator it = description.begin(); - while(isspace(*it)) it++; - description = description.substr(it - description.begin()); + if(description.length() > 0) { + std::string::iterator it = description.begin(); + while(isspace(*it)) it++; + description = description.substr(it - description.begin()); + } Platform::MessageDialogRef dialog = CreateMessageDialog(SS.GW.window); if (!dialog) { From 1d271c84083057fedafc08b7ec2597ef1be11b48 Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Sat, 14 Mar 2020 01:24:03 +0100 Subject: [PATCH 012/646] Update ANGLE to 8776e911bf71f68518ddd1995ce09d80db8c1216 --- extlib/angle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/angle b/extlib/angle index 17dc43e04..8776e911b 160000 --- a/extlib/angle +++ b/extlib/angle @@ -1 +1 @@ -Subproject commit 17dc43e04c94ff526e195ae66b47b6d7e43dd949 +Subproject commit 8776e911bf71f68518ddd1995ce09d80db8c1216 From 80a55d27223b3602b065595770c2543aa100e1b0 Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Sat, 14 Mar 2020 01:24:45 +0100 Subject: [PATCH 013/646] Force vendor zlib, png, and FreeType on Win32, too This has lead to linker problems if the environment does have standard versions of zlib/png (like from MSYS2), see discussion in referenced issue Closes #559 --- CMakeLists.txt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d442eee96..bc15578b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -144,11 +144,9 @@ if(WIN32 OR APPLE) include(FindVendoredPackage) include(AddVendoredSubdirectory) - if(APPLE) - set(FORCE_VENDORED_ZLIB ON) - set(FORCE_VENDORED_PNG ON) - set(FORCE_VENDORED_Freetype ON) - endif() + set(FORCE_VENDORED_ZLIB ON) + set(FORCE_VENDORED_PNG ON) + set(FORCE_VENDORED_Freetype ON) find_vendored_package(ZLIB zlib ZLIB_LIBRARY zlibstatic From b48a8ceaca80e884c0f9be2a972bd20364a39926 Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Mon, 23 Mar 2020 01:24:47 +0100 Subject: [PATCH 014/646] Accept both slashes in test harness on Win32 This fixes tests when __FILE__ produces output separated with / instead of \, like on my Windows+MSYS2+GCC config Fixes #563 --- test/harness.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/test/harness.cpp b/test/harness.cpp index 601242582..df7ada6ad 100644 --- a/test/harness.cpp +++ b/test/harness.cpp @@ -23,9 +23,11 @@ namespace Platform { #ifdef TEST_BUILD_ON_WINDOWS -static char BUILD_PATH_SEP = '\\'; +static const char *VALID_BUILD_PATH_SEPS = "/\\"; +static char BUILD_PATH_SEP = '\\'; #else -static char BUILD_PATH_SEP = '/'; +static const char *VALID_BUILD_PATH_SEPS = "/"; +static char BUILD_PATH_SEP = '/'; #endif static std::string BuildRoot() { @@ -33,7 +35,7 @@ static std::string BuildRoot() { if(!rootDir.empty()) return rootDir; rootDir = __FILE__; - rootDir.erase(rootDir.rfind(BUILD_PATH_SEP) + 1); + rootDir.erase(rootDir.find_last_of(VALID_BUILD_PATH_SEPS) + 1); return rootDir; } @@ -156,7 +158,7 @@ Platform::Path Test::Helper::GetAssetPath(std::string testFile, std::string asse assetName.insert(assetName.rfind('.'), "." + mangle); } testFile.erase(0, BuildRoot().size()); - testFile.erase(testFile.rfind(BUILD_PATH_SEP) + 1); + testFile.erase(testFile.find_last_of(VALID_BUILD_PATH_SEPS) + 1); return HostRoot().Join(Platform::Path::FromPortable(testFile + assetName)); } @@ -354,7 +356,7 @@ int main(int argc, char **argv) { for(Test::Case &testCase : *testCasesPtr) { std::string testCaseName = testCase.fileName; testCaseName.erase(0, BuildRoot().size()); - testCaseName.erase(testCaseName.rfind(BUILD_PATH_SEP)); + testCaseName.erase(testCaseName.find_last_of(VALID_BUILD_PATH_SEPS)); testCaseName += BUILD_PATH_SEP + testCase.caseName; std::smatch filterMatch; From 2ab2df6244ecbe920352065cca3a7065f643e37f Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Tue, 24 Mar 2020 13:04:06 +0100 Subject: [PATCH 015/646] Force SSE2 floats for i686 targets Both GCC and Clang use x87 instructions by default on 32-bit x86 targets, but the loss of precision resulting from that has yielded crashing tests (see referenced issue), and it can be safely assumed there are very few CPUs that both don't support SSE2 and are expected to run SolveSpace This commit also removes a now-redundant check for 32-bit Windows against TARGET, which doesn't seem to be actually set by CMake at all Ref: #565 --- CMakeLists.txt | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bc15578b8..3e98325d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,11 +80,20 @@ endif() if(MINGW) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++") +endif() - if(TRIPLE STREQUAL "i686-w64-mingw32") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -msse2") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2") +# Ensure that all platforms use 64-bit IEEE floating point operations for consistency; +# this is most important for the testsuite, which compares savefiles directly +# and depends on consistent rounding of intermediate results. +if(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X86") + if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") + set(FLOAT_FLAGS "-mfpmath=sse -msse2") + elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(FLOAT_FLAGS "-msse2") endif() + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLOAT_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLOAT_FLAGS}") endif() if(APPLE OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") From e1be0591f1771122a9bb7d5565449f63c39a62bd Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 27 Mar 2020 15:08:35 -0400 Subject: [PATCH 016/646] Added developer instructions for creating new entity transformations in the solver. (#491) --- developer_docs/Solver_Transforms.txt | 154 +++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 developer_docs/Solver_Transforms.txt diff --git a/developer_docs/Solver_Transforms.txt b/developer_docs/Solver_Transforms.txt new file mode 100644 index 000000000..1ea3ae5f2 --- /dev/null +++ b/developer_docs/Solver_Transforms.txt @@ -0,0 +1,154 @@ + +CREATING NEW GROUPS in 3D +================================= + +New Transformed Entity Types: +----------------------------- +New construction tools may require new transformations of entities - Points, +Normals, and Faces. A number of "Types" exist to transform an entity to a new +location. The term "Type" refers to the type of transformation an entity was +created from, and should not be confused with the 3 kinds of Entity (there are +other entities but they rely on others of the 3 base types for position and +orientation information, so they don't directly transform). A list of +Types is at the top of the EntityBase class definition: + + enum class Type : uint32_t { + POINT_IN_3D = 2000, + POINT_IN_2D = 2001, + POINT_N_TRANS = 2010, + POINT_N_ROT_TRANS = 2011, + POINT_N_COPY = 2012, + POINT_N_ROT_AA = 2013, + POINT_N_ROT_AXIS_TRANS = 2014, + + NORMAL_IN_3D = 3000, + NORMAL_IN_2D = 3001, + NORMAL_N_COPY = 3010, + NORMAL_N_ROT = 3011, + NORMAL_N_ROT_AA = 3012, + + FACE_NORMAL_PT = 5000, + FACE_XPROD = 5001, + FACE_N_ROT_TRANS = 5002, + FACE_N_TRANS = 5003, + FACE_N_ROT_AA = 5004, + +Some of the point definitions with _N_ in the name are points defined by +N application of a transformation. The number of times a particular entity +is transformed is given in the member variable "timesApplied". The following +is a dectription of the various transformation Types. + +POINT_N_TRANS: Translates a point by a vector defined by param[0],param[1],param[2] + the vector is multiplied by timesApplied. + +POINT_N_ROT_TRANS: Rotates a point via quaternion param[3],param[4],param[5],param[6] + and then translates it by vector param[0],param[1],param[2] + +POINT_N_COPY: A non-transformed copy of a point - numeric copy? + +POINT_N_ROT_AA: A point rotated arount point param[0],param[1],param[2] Where the + angle is given by param[3]*timesApplied (times 2?) and the axis + of rotation defined by param[4],param[5],param[6] + +POINT_N_ROT_AXIS_TRANS: Same as POINT_N_ROT_AA but after rotation, the point is + translated along the rotation axis by distance param[7]. + +NORMAL_N_COPY A non-transformed copy of a normal - numeric copy? + +NORMAL_N_ROT: A normal rotated by a quaternion defeined by param[0],param[1],param[2],param[3] + +NORMAL_N_ROT_AA A normal rotated by timesApplied*param[0] around the axis + specified by param[1],param[2],parma[3] + +FACE_N_ROT_TRANS A face rotated then translated. Rotation is defined by + quaternion param[3],param[4],param[5],param[6]. The translation + is defined by param[0],param[1],param[2]. + +FACE_N_TRANS: Translates a face by a vector defined by param[0],param[1],param[2] + faces are defined by a point and a normal, so this just moves the point. + +FACE_N_ROT_AA Face rotated about point param[0],param[1],param[2]. The axis + is param[4],param[5],param[6]. Angle is timesApplied*param[3]. + + +All entities are copied by the function Group::CopyEntity() which has a CopyAs +parameter to indicate which kind of copy is to be made. The mapping from CopyAs to +Entity Types can be found in that function. Most point types get copied the same +way depending on CopyAs. Several of the normals get copied to the same new +entity Type because they are unaffected by translation - you don't care if CopyAs +specified a translation with rotation or just a rotation, a normal is affected the +same in either case. The mapping from entity type to new entity type has to be +decoded from the cases and if-else logic in that function. + +It is important that a transformation be properly applied to all three of the +fundamental entities - points, normals, and surfaces. + +FUNCTIONS THAT MAY NEED TO BE EXTENDED when new entity types are defined: + +These functions have default cases, so they only need to be extended to return True: +EntityBase::IsPoint() +EntityBase::IsNormal() +EntityBAse::IsFace() + +For new normal transforms the following should be filled in: +Quaternion EntityBase::NormalGetNum() +void EntityBase::NormalForceTo(Quaternion q) +ExprQuaternion EntityBase::NormalGetExprs() + +For points: +Vector EntityBase::PointGetNum() +void EntityBase::PointForceTo(Vector p) +ExprVector EntityBase::PointGetExprs() + +For Faces: +ExprVector EntityBase::FaceGetNormalExprs() +Vector EntityBase::FaceGetNormalNum() +ExprVector EntityBase::FaceGetPointExprs() +Vector EntityBase::FaceGetPointNum() + +The basic model for these transformed entities is that the group containing them +will have parameters that define the transformed entity in terms of the one it +was copied from. For example, in PointGetNum() under the case POINT_N_TRANS we see: + + Vector trans = Vector::From(param[0], param[1], param[2]); + p = numPoint.Plus(trans.ScaledBy(timesApplied)); + break; + +This take the original "numPoint" and adds a vector created from 3 parameters and +multiplied by "timesApplied". This is used in the step-translating groups. It's also +used in extrude groups where there are constraints on the 3 parameters to keep the +vector perpendicular to the sketch it was extruded from. This function returns a +numerical version of the copied point, hence "GetNum" in the name. + +Another function PointGetExprs() returns the same coordinates of the point but +returns an expression vector. When the user applies a constraint to a point, this +function is called to get algebraic expressions for the point that are suitable for +use in the solver. Most points will not be constrained directly, so expressions +are not needed for them. It is also notable that the expressions are not part of +the entity itself. + +The ForceTo() functions are shortcuts for using the solver. They are passed the +desired location of a point (or orientation of a normal...) and have the opportunity +to back-calculate what the group parameters should be to place it there. This is +used for mouse dragging of copied entites. It is notable that the constraints will +still be applied afterward, but this is a good shortcut. + +When creating a new entity transformation, the first thing to do is define the +numerical copy (xxxGetNum). That should allow display. Dragging will not work +until ForceTo is implemented, and user constraints will not work until GetExprs() +is completed. Most of these functions have an assert that will fire if the required +new case is missing. This is may not be a complete list of everything you need to +make new entity transformations. + +One thing of note, parameters in both entities and groups are stored by their handle. +An entity can have up to 8 parameters to define how it is transformed from another +entity. By convention this array of parameter handles matches that of the group but +this is probably not strictly necessary. + +ADDING GROUP CONSTRAINTS: +The example above where a point is copied via POINT_N_TRANS for both EXTRUDE and +STEP TRANSLATING groups is a good example here. For the EXTRUDE case, two constraint +equations are added to keep the offset vector perpendicular to the sketch. These +equations are created in Group::GenerateEquations() and are nothing more than an +expression which is implicitly set equal to zero in the solver. + From 8e5145e24eec708288eccfe5283f82d53317f48d Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 27 Mar 2020 15:40:58 -0400 Subject: [PATCH 017/646] Nurbs (#473) * Limit u,v range between 0 and 1 in Newton. Fixes issue #471 * Change the math for projecting a point onto a plane to work better with non-orthogonal U,V derivatives in several places. Fixes #472. --- src/srf/ratpoly.cpp | 62 +++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/src/srf/ratpoly.cpp b/src/srf/ratpoly.cpp index d4fd703f8..70c66b558 100644 --- a/src/srf/ratpoly.cpp +++ b/src/srf/ratpoly.cpp @@ -439,9 +439,14 @@ void SSurface::ClosestPointTo(Vector p, double *u, double *v, bool mustConverge) bu = (ctrl[1][0]).Minus(orig), bv = (ctrl[0][1]).Minus(orig); if((ctrl[1][1]).Equals(orig.Plus(bu).Plus(bv))) { + + Vector n = bu.Cross(bv); + Vector ty = n.Cross(bu).ScaledBy(1.0/bu.MagSquared()); + Vector tx = bv.Cross(n).ScaledBy(1.0/bv.MagSquared()); + Vector dp = p.Minus(orig); - *u = dp.Dot(bu) / bu.MagSquared(); - *v = dp.Dot(bv) / bv.MagSquared(); + *u = dp.Dot(bu) / tx.MagSquared(); + *v = dp.Dot(bv) / ty.MagSquared(); return; } } @@ -501,16 +506,28 @@ bool SSurface::ClosestPointNewton(Vector p, double *u, double *v, bool mustConve } } - Vector tu, tv; + Vector tu, tv, tx, ty; TangentsAt(*u, *v, &tu, &tv); + Vector n = tu.Cross(tv); + // since tu and tv may not be orthogonal, use y in place of v. + // |y| = |v|sin(theta) where theta is the angle between tu and tv. + ty = n.Cross(tu).ScaledBy(1.0/tu.MagSquared()); + tx = tv.Cross(n).ScaledBy(1.0/tv.MagSquared()); // Project the point into a plane through p0, with basis tu, tv; a // second-order thing would converge faster but needs second // derivatives. Vector dp = p.Minus(p0); - double du = dp.Dot(tu), dv = dp.Dot(tv); - *u += du / (tu.MagSquared()); - *v += dv / (tv.MagSquared()); + double du = dp.Dot(tx), + dv = dp.Dot(ty); + *u += du / (tx.MagSquared()); + *v += dv / (ty.MagSquared()); + + if (*u < 0.0) *u = 0.0; + else if (*u > 1.0) *u = 1.0; + if (*v < 0.0) *v = 0.0; + else if (*v > 1.0) *v = 1.0; + } if(mustConverge) { @@ -540,13 +557,17 @@ bool SSurface::PointIntersectingLine(Vector p0, Vector p1, double *u, double *v) // Check for convergence if(pi.Equals(p, RATPOLY_EPS)) return true; + n = tu.Cross(tv); + Vector ty = n.Cross(tu).ScaledBy(1.0/tu.MagSquared()); + Vector tx = tv.Cross(n).ScaledBy(1.0/tv.MagSquared()); + // Adjust our guess and iterate Vector dp = pi.Minus(p); - double du = dp.Dot(tu), dv = dp.Dot(tv); - *u += du / (tu.MagSquared()); - *v += dv / (tv.MagSquared()); + double du = dp.Dot(tx), dv = dp.Dot(ty); + *u += du / tx.MagSquared(); + *v += dv / ty.MagSquared(); } -// dbp("didn't converge (surface intersecting line)"); + dbp("didn't converge (surface intersecting line)"); return false; } @@ -582,10 +603,14 @@ Vector SSurface::ClosestPointOnThisAndSurface(SSurface *srf2, Vector p) { // Adjust our guess and iterate for(j = 0; j < 2; j++) { + Vector n = tu[j].Cross(tv[j]); + Vector ty = n.Cross(tu[j]).ScaledBy(1.0/tu[j].MagSquared()); + Vector tx = tv[j].Cross(n).ScaledBy(1.0/tv[j].MagSquared()); + Vector dc = pc.Minus(cp[j]); - double du = dc.Dot(tu[j]), dv = dc.Dot(tv[j]); - puv[j].x += du / ((tu[j]).MagSquared()); - puv[j].y += dv / ((tv[j]).MagSquared()); + double du = dc.Dot(tx), dv = dc.Dot(ty); + puv[j].x += du / tx.MagSquared(); + puv[j].y += dv / ty.MagSquared(); } } if(i >= 10) { @@ -637,10 +662,15 @@ void SSurface::PointOnSurfaces(SSurface *s1, SSurface *s2, double *up, double *v if(parallel) break; for(j = 0; j < 3; j++) { + Vector n = tu[j].Cross(tv[j]); + Vector ty = n.Cross(tu[j]).ScaledBy(1.0/tu[j].MagSquared()); + Vector tx = tv[j].Cross(n).ScaledBy(1.0/tv[j].MagSquared()); + Vector dp = pi.Minus(p[j]); - double du = dp.Dot(tu[j]), dv = dp.Dot(tv[j]); - u[j] += du / (tu[j]).MagSquared(); - v[j] += dv / (tv[j]).MagSquared(); + double du = dp.Dot(tx), dv = dp.Dot(ty); + + u[j] += du / tx.MagSquared(); + v[j] += dv / ty.MagSquared(); } } dbp("didn't converge (three surfaces intersecting)"); From 73d0d8314526310b04866c67c4e8b5c3bcd0a36b Mon Sep 17 00:00:00 2001 From: Tim Date: Sat, 28 Mar 2020 15:28:12 +0000 Subject: [PATCH 018/646] Fix segfault in Remove Spline Point context menu This was incorrectly capturing `r` by reference and using it after it left its scope. Changed to capture by value, and also explicitly capture `this` in case we were accidentally capturing any other scope variables by reference. Fixes #571 --- src/mouse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mouse.cpp b/src/mouse.cpp index c0d1798e3..6f016d31f 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -647,7 +647,7 @@ void GraphicsWindow::MouseRightUp(double x, double y) { int index = r->IndexOfPoint(gs.point[0]); if((r->type == Request::Type::CUBIC && (index > 1 && index < r->extraPoints + 2)) || r->type == Request::Type::CUBIC_PERIODIC) { - menu->AddItem(_("Remove Spline Point"), [&]() { + menu->AddItem(_("Remove Spline Point"), [this, r]() { int index = r->IndexOfPoint(gs.point[0]); ssassert(r->extraPoints != 0, "Expected a bezier with interior control points"); From b980fcf309f601257edf530f19572c25fa446e5b Mon Sep 17 00:00:00 2001 From: Tim Date: Sun, 29 Mar 2020 02:46:34 +0100 Subject: [PATCH 019/646] Fix more segfaults in mouse.cpp lambdas (#574) This changes all the lambdas to have explicit captures, since the use of implicit captures has led to some memory errors, especially segfaults in the right-click menu. I'm not 100% sure that the code is correct anyway - it really needs auditing to ensure all referenced values are still valid when the menu item is clicked (e.g. can you change stuff with keyboard shortcuts while the context menu is visible?), but it should at least be *more* correct! --- src/mouse.cpp | 46 ++++++++++++++++++++++++---------------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/mouse.cpp b/src/mouse.cpp index 6f016d31f..7f90a8a3b 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -563,25 +563,27 @@ void GraphicsWindow::MouseRightUp(double x, double y) { for(const Style &s : SK.style) { if(s.h.v < Style::FIRST_CUSTOM) continue; - styleMenu->AddItem(s.DescriptionString(), [&]() { - Style::AssignSelectionToStyle(s.h.v); + uint32_t v = s.h.v; + + styleMenu->AddItem(s.DescriptionString(), [v]() { + Style::AssignSelectionToStyle(v); }); empty = false; } if(!empty) styleMenu->AddSeparator(); - styleMenu->AddItem(_("No Style"), [&]() { + styleMenu->AddItem(_("No Style"), []() { Style::AssignSelectionToStyle(0); }); - styleMenu->AddItem(_("Newly Created Custom Style..."), [&]() { + styleMenu->AddItem(_("Newly Created Custom Style..."), [this]() { uint32_t vs = Style::CreateCustomStyle(); Style::AssignSelectionToStyle(vs); ForceTextWindowShown(); }); } if(gs.n + gs.constraints == 1) { - menu->AddItem(_("Group Info"), [&]() { + menu->AddItem(_("Group Info"), [this]() { hGroup hg; if(gs.entities == 1) { hg = SK.GetEntity(gs.entity[0])->group; @@ -601,7 +603,7 @@ void GraphicsWindow::MouseRightUp(double x, double y) { }); } if(gs.n + gs.constraints == 1 && gs.stylables == 1) { - menu->AddItem(_("Style Info"), [&]() { + menu->AddItem(_("Style Info"), [this]() { hStyle hs; if(gs.entities == 1) { hs = Style::ForEntity(gs.entity[0]); @@ -622,24 +624,24 @@ void GraphicsWindow::MouseRightUp(double x, double y) { } if(gs.withEndpoints > 0) { menu->AddItem(_("Select Edge Chain"), - [&]() { MenuEdit(Command::SELECT_CHAIN); }); + [this]() { MenuEdit(Command::SELECT_CHAIN); }); } if(gs.constraints == 1 && gs.n == 0) { Constraint *c = SK.GetConstraint(gs.constraint[0]); if(c->HasLabel() && c->type != Constraint::Type::COMMENT) { menu->AddItem(_("Toggle Reference Dimension"), - [&]() { Constraint::MenuConstrain(Command::REFERENCE); }); + []() { Constraint::MenuConstrain(Command::REFERENCE); }); } if(c->type == Constraint::Type::ANGLE || c->type == Constraint::Type::EQUAL_ANGLE) { menu->AddItem(_("Other Supplementary Angle"), - [&]() { Constraint::MenuConstrain(Command::OTHER_ANGLE); }); + []() { Constraint::MenuConstrain(Command::OTHER_ANGLE); }); } } if(gs.constraintLabels > 0 || gs.points > 0) { menu->AddItem(_("Snap to Grid"), - [&]() { MenuEdit(Command::SNAP_TO_GRID); }); + [this]() { MenuEdit(Command::SNAP_TO_GRID); }); } if(gs.points == 1 && gs.point[0].isFromRequest()) { @@ -682,7 +684,7 @@ void GraphicsWindow::MouseRightUp(double x, double y) { ssassert(addAfterPoint != -1, "Expected a nearest bezier point to be located"); // Skip derivative point. if(r->type == Request::Type::CUBIC) addAfterPoint++; - menu->AddItem(_("Add Spline Point"), [&]() { + menu->AddItem(_("Add Spline Point"), [this, r, addAfterPoint, v]() { int pointCount = r->extraPoints + ((r->type == Request::Type::CUBIC_PERIODIC) ? 3 : 4); if(pointCount >= MAX_POINTS_IN_ENTITY) { @@ -712,7 +714,7 @@ void GraphicsWindow::MouseRightUp(double x, double y) { } if(gs.entities == gs.n) { menu->AddItem(_("Toggle Construction"), - [&]() { MenuRequest(Command::CONSTRUCTION); }); + [this]() { MenuRequest(Command::CONSTRUCTION); }); } if(gs.points == 1) { @@ -726,7 +728,7 @@ void GraphicsWindow::MouseRightUp(double x, double y) { } } if(c) { - menu->AddItem(_("Delete Point-Coincident Constraint"), [&]() { + menu->AddItem(_("Delete Point-Coincident Constraint"), [this, p]() { if(!p->IsPoint()) return; SS.UndoRemember(); @@ -746,34 +748,34 @@ void GraphicsWindow::MouseRightUp(double x, double y) { menu->AddSeparator(); if(LockedInWorkplane()) { menu->AddItem(_("Cut"), - [&]() { MenuClipboard(Command::CUT); }); + [this]() { MenuClipboard(Command::CUT); }); menu->AddItem(_("Copy"), - [&]() { MenuClipboard(Command::COPY); }); + [this]() { MenuClipboard(Command::COPY); }); } } else { menu->AddItem(_("Select All"), - [&]() { MenuEdit(Command::SELECT_ALL); }); + [this]() { MenuEdit(Command::SELECT_ALL); }); } if((!SS.clipboard.r.IsEmpty() || !SS.clipboard.c.IsEmpty()) && LockedInWorkplane()) { menu->AddItem(_("Paste"), - [&]() { MenuClipboard(Command::PASTE); }); + [this]() { MenuClipboard(Command::PASTE); }); menu->AddItem(_("Paste Transformed..."), - [&]() { MenuClipboard(Command::PASTE_TRANSFORM); }); + [this]() { MenuClipboard(Command::PASTE_TRANSFORM); }); } if(itemsSelected) { menu->AddItem(_("Delete"), - [&]() { MenuClipboard(Command::DELETE); }); + [this]() { MenuClipboard(Command::DELETE); }); menu->AddSeparator(); menu->AddItem(_("Unselect All"), - [&]() { MenuEdit(Command::UNSELECT_ALL); }); + [this]() { MenuEdit(Command::UNSELECT_ALL); }); } // If only one item is selected, then it must be the one that we just // selected from the hovered item; in which case unselect all and hovered // are equivalent. if(!hover.IsEmpty() && selection.n > 1) { - menu->AddItem(_("Unselect Hovered"), [&] { + menu->AddItem(_("Unselect Hovered"), [this] { if(!hover.IsEmpty()) { MakeUnselected(&hover, /*coincidentPointTrick=*/true); } @@ -783,7 +785,7 @@ void GraphicsWindow::MouseRightUp(double x, double y) { if(itemsSelected) { menu->AddSeparator(); menu->AddItem(_("Zoom to Fit"), - [&]() { MenuView(Command::ZOOM_TO_FIT); }); + [this]() { MenuView(Command::ZOOM_TO_FIT); }); } menu->PopUp(); From 3bebb3e5fd1fe317497f86966ae7b2fe9c4628b6 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 1 Apr 2020 22:25:18 +0100 Subject: [PATCH 020/646] Add menu options for line styles / view / configuration. This is to make them a bit easier to find, since the natural place to look for config options is somewhere like File->Preferences or Edit->Settings. --- src/graphicswin.cpp | 22 ++++++++++++++++++++++ src/ui.h | 3 +++ 2 files changed, 25 insertions(+) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 0d520dd22..95a4ad02d 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -74,6 +74,12 @@ const MenuEntry Menu[] = { { 1, N_("Select &Edge Chain"), Command::SELECT_CHAIN, C|'e', KN, mEdit }, { 1, N_("Select &All"), Command::SELECT_ALL, C|'a', KN, mEdit }, { 1, N_("&Unselect All"), Command::UNSELECT_ALL, '\x1b', KN, mEdit }, +{ 1, NULL, Command::NONE, 0, KN, NULL }, +{ 1, N_("&Line Styles..."), Command::EDIT_LINE_STYLES, 0, KN, mEdit }, +{ 1, N_("&View Projection..."), Command::VIEW_PROJECTION, 0, KN, mEdit }, +#ifndef __APPLE__ +{ 1, N_("Con&figuration..."), Command::CONFIGURATION, 0, KN, mEdit }, +#endif { 0, N_("&View"), Command::NONE, 0, KN, mView }, { 1, N_("Zoom &In"), Command::ZOOM_IN, '+', KN, mView }, @@ -1183,6 +1189,22 @@ void GraphicsWindow::MenuEdit(Command id) { SS.ScheduleShowTW(); break; + case Command::EDIT_LINE_STYLES: + SS.TW.GoToScreen(TextWindow::Screen::LIST_OF_STYLES); + SS.GW.ForceTextWindowShown(); + SS.ScheduleShowTW(); + break; + case Command::VIEW_PROJECTION: + SS.TW.GoToScreen(TextWindow::Screen::EDIT_VIEW); + SS.GW.ForceTextWindowShown(); + SS.ScheduleShowTW(); + break; + case Command::CONFIGURATION: + SS.TW.GoToScreen(TextWindow::Screen::CONFIGURATION); + SS.GW.ForceTextWindowShown(); + SS.ScheduleShowTW(); + break; + default: ssassert(false, "Unexpected menu ID"); } } diff --git a/src/ui.h b/src/ui.h index 7d24e84db..2a068dc7d 100644 --- a/src/ui.h +++ b/src/ui.h @@ -105,6 +105,9 @@ enum class Command : uint32_t { ROTATE_90, UNSELECT_ALL, REGEN_ALL, + EDIT_LINE_STYLES, + VIEW_PROJECTION, + CONFIGURATION, // Request SEL_WORKPLANE, FREE_IN_3D, From 5e06de0512e7d8f3070bdeaf8dcaa13967cb7cb6 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Thu, 16 Apr 2020 20:27:01 +0200 Subject: [PATCH 021/646] snap: Use symlink instead of bind-mount for layout As per https://snapcraft.io/docs/snap-layouts, bind-mounts significantly increase the startup time of the snap. Use symlink instead for better performance. --- pkg/snap/snap/snapcraft.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index 940d08379..4a88733b0 100644 --- a/pkg/snap/snap/snapcraft.yaml +++ b/pkg/snap/snap/snapcraft.yaml @@ -17,7 +17,7 @@ license: GPL-3.0 layout: /usr/share/solvespace: - bind: $SNAP/usr/share/solvespace + symlink: $SNAP/usr/share/solvespace apps: solvespace: From c3e8c7638494b7da4e07729bdbb90b606a69e85e Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Thu, 16 Apr 2020 21:38:45 +0200 Subject: [PATCH 022/646] snap: Upgrade from gnome-3-28 extension to gnome-3-34 Using gnome-3-34 gives us a newer stack in general and also provides us with a sdk build-snap, so we don't need to specify as many build-packages and stage-packages. This makes the snap slimmer and delegates the responsibility for security updates to the gnome platform snap for even more packages. --- pkg/snap/snap/snapcraft.yaml | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index 4a88733b0..273f9d492 100644 --- a/pkg/snap/snap/snapcraft.yaml +++ b/pkg/snap/snap/snapcraft.yaml @@ -23,13 +23,13 @@ apps: solvespace: command: usr/bin/solvespace desktop: solvespace.desktop - extensions: [gnome-3-28] + extensions: [gnome-3-34] 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-28] + extensions: [gnome-3-34] plugs: [home, removable-media, network] parts: @@ -54,32 +54,25 @@ parts: build-packages: - zlib1g-dev - libpng-dev - - libcairo2-dev - libfreetype6-dev - libjson-c-dev - - libfontconfig1-dev - - libgtkmm-3.0-dev - - libpangomm-1.4-dev - libgl-dev - - libglu-dev + - libsigc++-2.0-dev - libspnav-dev - git + - g++ stage-packages: - libspnav0 - - libatkmm-1.6-1v5 - - libcairomm-1.0-1v5 - - libgtkmm-3.0-1v5 - - libglibmm-2.4-1v5 - - libpangomm-1.4-1v5 - libsigc++-2.0-0v5 + cleanup: after: [solvespace] plugin: nil - build-snaps: [core18, gnome-3-28-1804] + build-snaps: [core18, gnome-3-34-1804] 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-28-1804"; do # List all content-snaps and base snaps you're using here + 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/{}" \; done From 1836c9ea28f9e606341c7df5da3c633ce13279c6 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 9 Sep 2019 15:27:22 -0500 Subject: [PATCH 023/646] Use handles instead of pointers in GenerateAll(). NFC. --- src/generate.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/generate.cpp b/src/generate.cpp index a4016443f..70b57c156 100644 --- a/src/generate.cpp +++ b/src/generate.cpp @@ -216,31 +216,31 @@ void SolveSpaceUI::GenerateAll(Generate type, bool andFindFree, bool genForBBox) // Not using range-for because we're using the index inside the loop. for(i = 0; i < SK.groupOrder.n; i++) { - Group *g = SK.GetGroup(SK.groupOrder[i]); + hGroup hg = SK.groupOrder[i]; // The group may depend on entities or other groups, to define its // workplane geometry or for its operands. Those must already exist // in a previous group, so check them before generating. - if(PruneGroups(g->h)) + if(PruneGroups(hg)) goto pruned; for(auto &req : SK.request) { Request *r = &req; - if(r->group != g->h) continue; + if(r->group != hg) continue; r->Generate(&(SK.entity), &(SK.param)); } for(auto &con : SK.constraint) { Constraint *c = &con; - if(c->group != g->h) continue; + if(c->group != hg) continue; c->Generate(&(SK.param)); } - g->Generate(&(SK.entity), &(SK.param)); + SK.GetGroup(hg)->Generate(&(SK.entity), &(SK.param)); // The requests and constraints depend on stuff in this or the // previous group, so check them after generating. - if(PruneRequests(g->h) || PruneConstraints(g->h)) + if(PruneRequests(hg) || PruneConstraints(hg)) goto pruned; // Use the previous values for params that we've seen before, as @@ -256,8 +256,9 @@ void SolveSpaceUI::GenerateAll(Generate type, bool andFindFree, bool genForBBox) } } - if(g->h == Group::HGROUP_REFERENCES) { + if(hg == Group::HGROUP_REFERENCES) { ForceReferences(); + Group *g = SK.GetGroup(hg); g->solved.how = SolveResult::OKAY; g->clean = true; } else { @@ -265,8 +266,9 @@ void SolveSpaceUI::GenerateAll(Generate type, bool andFindFree, bool genForBBox) if(i >= first && i <= last) { // The group falls inside the range, so really solve it, // and then regenerate the mesh based on the solved stuff. + Group *g = SK.GetGroup(hg); if(genForBBox) { - SolveGroupAndReport(g->h, andFindFree); + SolveGroupAndReport(hg, andFindFree); g->GenerateLoops(); } else { g->GenerateShellAndMesh(); From fb625701b5164a4edc6aaf53de2c7fdbbf6c92f2 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 20 Apr 2020 21:24:33 -0400 Subject: [PATCH 024/646] Don't create extra copies of entities in Revolve and Helix groups. Might break some older files with those groups that depend on these extra entities. Fixes #549. --- src/group.cpp | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/group.cpp b/src/group.cpp index ad00efe1d..ac9ccf06d 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -566,8 +566,6 @@ void Group::Generate(IdList *entity, AddParam(param, h.param(5), axis_dir.y); AddParam(param, h.param(6), axis_dir.z); - int ai = 1; - // Not using range-for here because we're changing the size of entity in the loop. for(i = 0; i < entity->n; i++) { Entity *e = &(entity->Get(i)); @@ -576,10 +574,7 @@ void Group::Generate(IdList *entity, e->CalculateNumerical(/*forExport=*/false); hEntity he = e->h; - - CopyEntity(entity, SK.GetEntity(predef.origin), 0, ai, NO_PARAM, NO_PARAM, - NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, CopyAs::NUMERIC); - + // one copy for each end of the revolved surface for(a = 0; a < 2; a++) { //! @todo is this check redundant? Entity *e = &(entity->Get(i)); @@ -596,7 +591,6 @@ void Group::Generate(IdList *entity, // entity is not chiral, and dragging a revolve may break the arc by inverting it. // MakeLatheCircles(entity, param, he, axis_pos, axis_dir, ai); MakeLatheSurfacesSelectable(entity, he, axis_dir); - ai++; } return; @@ -618,8 +612,6 @@ void Group::Generate(IdList *entity, // distance to translate along the rotation axis AddParam(param, h.param(7), 20); - int ai = 1; - // Not using range-for here because we're changing the size of entity in the loop. for(i = 0; i < entity->n; i++) { Entity *e = &(entity->Get(i)); @@ -628,9 +620,7 @@ void Group::Generate(IdList *entity, e->CalculateNumerical(/*forExport=*/false); - CopyEntity(entity, SK.GetEntity(predef.origin), 0, ai, NO_PARAM, NO_PARAM, - NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, CopyAs::NUMERIC); - + // one copy for each end of the helix for(a = 0; a < 2; a++) { Entity *e = &(entity->Get(i)); e->CalculateNumerical(false); @@ -658,7 +648,6 @@ void Group::Generate(IdList *entity, entity->Add(&en); } } - ai++; } return; } From e52c2cdd30473684f35cfb7ea620d7f042a4b070 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 21 Apr 2020 00:44:27 -0400 Subject: [PATCH 025/646] Eliminate some entity copies in lathe groups. Eliminates a crash due to copy numbers going over 1000. May break some older files with constaints on lathed entities. (#582) --- src/group.cpp | 31 +++++++++++++------------------ src/sketch.h | 3 ++- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/group.cpp b/src/group.cpp index ac9ccf06d..733a06cef 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -516,9 +516,6 @@ void Group::Generate(IdList *entity, Vector axis_pos = SK.GetEntity(predef.origin)->PointGetNum(); Vector axis_dir = SK.GetEntity(predef.entityB)->VectorGetNum(); - // Remapped entity index. - int ai = 1; - // Not using range-for here because we're changing the size of entity in the loop. for(i = 0; i < entity->n; i++) { Entity *e = &(entity->Get(i)); @@ -529,24 +526,22 @@ void Group::Generate(IdList *entity, // As soon as I call CopyEntity, e may become invalid! That // adds entities, which may cause a realloc. - CopyEntity(entity, SK.GetEntity(predef.origin), 0, ai, - NO_PARAM, NO_PARAM, NO_PARAM, - NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, - CopyAs::NUMERIC); + // this is the regular copy of all entities CopyEntity(entity, SK.GetEntity(he), 0, REMAP_LATHE_START, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, CopyAs::NUMERIC); - CopyEntity(entity, SK.GetEntity(he), 0, REMAP_LATHE_END, - NO_PARAM, NO_PARAM, NO_PARAM, - NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, - CopyAs::NUMERIC); - - MakeLatheCircles(entity, param, he, axis_pos, axis_dir, ai); + if (e->IsPoint()) { + // for points this copy is used for the circle centers + CopyEntity(entity, SK.GetEntity(he), 0, REMAP_LATHE_ARC_CENTER, + NO_PARAM, NO_PARAM, NO_PARAM, + NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, + CopyAs::NUMERIC); + MakeLatheCircles(entity, param, he, axis_pos, axis_dir); + }; MakeLatheSurfacesSelectable(entity, he, axis_dir); - ai++; } return; } @@ -589,7 +584,7 @@ void Group::Generate(IdList *entity, } // Arcs are not generated for revolve groups, for now, because our current arc // entity is not chiral, and dragging a revolve may break the arc by inverting it. - // MakeLatheCircles(entity, param, he, axis_pos, axis_dir, ai); + // MakeLatheCircles(entity, param, he, axis_pos, axis_dir); MakeLatheSurfacesSelectable(entity, he, axis_dir); } @@ -853,15 +848,15 @@ void Group::MakeExtrusionLines(IdList *el, hEntity in) { } } -void Group::MakeLatheCircles(IdList *el, IdList *param, hEntity in, Vector pt, Vector axis, int ai) { +void Group::MakeLatheCircles(IdList *el, IdList *param, hEntity in, Vector pt, Vector axis) { Entity *ep = SK.GetEntity(in); Entity en = {}; if(ep->IsPoint()) { // A point gets revolved to form an arc. - en.point[0] = Remap(predef.origin, ai); + en.point[0] = Remap(ep->h, REMAP_LATHE_ARC_CENTER); en.point[1] = Remap(ep->h, REMAP_LATHE_START); - en.point[2] = Remap(ep->h, REMAP_LATHE_END); + en.point[2] = en.point[1]; //Remap(ep->h, REMAP_LATHE_END); // Get arc center and point on arc. Entity *pc = SK.GetEntity(en.point[0]); diff --git a/src/sketch.h b/src/sketch.h index 6cd4acaaa..2465aefa8 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -279,10 +279,11 @@ class Group { REMAP_LATHE_END = 1007, REMAP_PT_TO_ARC = 1008, REMAP_PT_TO_NORMAL = 1009, + REMAP_LATHE_ARC_CENTER = 1010, }; hEntity Remap(hEntity in, int copyNumber); void MakeExtrusionLines(EntityList *el, hEntity in); - void MakeLatheCircles(IdList *el, IdList *param, hEntity in, Vector pt, Vector axis, int ai); + void MakeLatheCircles(IdList *el, IdList *param, hEntity in, Vector pt, Vector axis); void MakeLatheSurfacesSelectable(IdList *el, hEntity in, Vector axis); void MakeExtrusionTopBottomFaces(EntityList *el, hEntity pt); void CopyEntity(EntityList *el, From 04e8dd57e8adca875af1c1b71dcb041ba1b7b0e1 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 22 Apr 2020 19:55:18 -0400 Subject: [PATCH 026/646] Allow Revolve and Helix end surface selection and constraints. (#584) --- src/group.cpp | 41 ++++++++++++++++++++++++++++++++++++++++- src/sketch.h | 1 + src/srf/surface.cpp | 17 +++++++++++++---- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/group.cpp b/src/group.cpp index 733a06cef..3128ecc46 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -561,12 +561,18 @@ void Group::Generate(IdList *entity, AddParam(param, h.param(5), axis_dir.y); AddParam(param, h.param(6), axis_dir.z); + // Get some arbitrary point in the sketch, that will be used + // as a reference when defining end faces. + hEntity pt = { 0 }; + // Not using range-for here because we're changing the size of entity in the loop. for(i = 0; i < entity->n; i++) { Entity *e = &(entity->Get(i)); if(e->group != opA) continue; + if(e->IsPoint()) pt = e->h; + e->CalculateNumerical(/*forExport=*/false); hEntity he = e->h; // one copy for each end of the revolved surface @@ -587,7 +593,7 @@ void Group::Generate(IdList *entity, // MakeLatheCircles(entity, param, he, axis_pos, axis_dir); MakeLatheSurfacesSelectable(entity, he, axis_dir); } - + MakeRevolveEndFaces(entity, pt); return; } @@ -607,12 +613,18 @@ void Group::Generate(IdList *entity, // distance to translate along the rotation axis AddParam(param, h.param(7), 20); + // Get some arbitrary point in the sketch, that will be used + // as a reference when defining end faces. + hEntity pt = { 0 }; + // Not using range-for here because we're changing the size of entity in the loop. for(i = 0; i < entity->n; i++) { Entity *e = &(entity->Get(i)); if((e->group.v != opA.v) && !(e->h == predef.origin)) continue; + if(e->IsPoint()) pt = e->h; + e->CalculateNumerical(/*forExport=*/false); // one copy for each end of the helix @@ -644,6 +656,7 @@ void Group::Generate(IdList *entity, } } } + MakeRevolveEndFaces(entity, pt); return; } @@ -927,6 +940,32 @@ void Group::MakeLatheSurfacesSelectable(IdList *el, hEntity in, } } +void Group::MakeRevolveEndFaces(IdList *el, hEntity pt) +{ + if(pt.v == 0) return; + Group *src = SK.GetGroup(opA); + Vector n = src->polyLoops.normal; + + // When there is no loop normal (e.g. if the loop is broken), use normal of workplane + // as fallback, to avoid breaking constraints depending on the faces. + if(n.Equals(Vector::From(0.0, 0.0, 0.0)) && src->type == Group::Type::DRAWING_WORKPLANE) { + n = SK.GetEntity(src->h.entity(0))->Normal()->NormalN(); + } + + Entity en = {}; + en.type = Entity::Type::FACE_NORMAL_PT; + en.group = h; + + en.numNormal = Quaternion::From(0, n.x, n.y, n.z); + en.point[0] = Remap(pt, REMAP_LATHE_END); + en.h = Remap(Entity::NO_ENTITY, REMAP_LATHE_END); + el->Add(&en); + + en.point[0] = Remap(pt, REMAP_LATHE_START); + en.h = Remap(Entity::NO_ENTITY, REMAP_LATHE_START); + el->Add(&en); +} + void Group::MakeExtrusionTopBottomFaces(IdList *el, hEntity pt) { if(pt.v == 0) return; diff --git a/src/sketch.h b/src/sketch.h index 2465aefa8..453df54d9 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -285,6 +285,7 @@ class Group { void MakeExtrusionLines(EntityList *el, hEntity in); void MakeLatheCircles(IdList *el, IdList *param, hEntity in, Vector pt, Vector axis); void MakeLatheSurfacesSelectable(IdList *el, hEntity in, Vector axis); + void MakeRevolveEndFaces(IdList *el, hEntity pt); void MakeExtrusionTopBottomFaces(EntityList *el, hEntity pt); void CopyEntity(EntityList *el, Entity *ep, int timesApplied, int remap, diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp index a61713c38..fa3605ff4 100644 --- a/src/srf/surface.cpp +++ b/src/srf/surface.cpp @@ -674,14 +674,23 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector // So we can now generate the end caps of the extrusion within // a translated and rotated (and maybe mirrored) version of that csys. SSurface s0, s1; - s0 = SSurface::FromPlane(orig.RotatedAbout(pt, axis, angles).Plus(axis.ScaledBy(dists)), + s0 = SSurface::FromPlane(orig.RotatedAbout(pt, axis, angles).Plus(axis.ScaledBy(dists)), u.RotatedAbout(axis, angles), v.RotatedAbout(axis, angles)); s0.color = color; - s1 = SSurface::FromPlane( + + hEntity face0 = group->Remap(Entity::NO_ENTITY, Group::REMAP_LATHE_END); + s0.face = face0.v; + + s1 = SSurface::FromPlane( orig.Plus(u).RotatedAbout(pt, axis, anglef).Plus(axis.ScaledBy(distf)), u.ScaledBy(-1).RotatedAbout(axis, anglef), v.RotatedAbout(axis, anglef)); - s1.color = color; - hSSurface hs0 = surface.AddAndAssignId(&s0), hs1 = surface.AddAndAssignId(&s1); + s1.color = color; + + hEntity face1 = group->Remap(Entity::NO_ENTITY, Group::REMAP_LATHE_START); + s1.face = face1.v; + + hSSurface hs0 = surface.AddAndAssignId(&s0); + hSSurface hs1 = surface.AddAndAssignId(&s1); // Now we actually build and trim the swept surfaces. One loop at a time. for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { From ca9d81014d4c044319b8c1162f305774f616a84e Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 24 Apr 2020 17:37:55 -0400 Subject: [PATCH 027/646] Add rotated face from point entity type. Fixes issue 585, problems constraining to Revolve and Helix ends. (#586) --- src/drawentity.cpp | 2 ++ src/entity.cpp | 9 +++--- src/group.cpp | 78 +++++++++++++++++++++++++++++---------------- src/sketch.h | 3 +- src/srf/surface.cpp | 4 +-- 5 files changed, 62 insertions(+), 34 deletions(-) diff --git a/src/drawentity.cpp b/src/drawentity.cpp index de93d730b..54477c8a5 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -120,6 +120,7 @@ void Entity::GetReferencePoints(std::vector *refs) { case Type::FACE_N_ROT_TRANS: case Type::FACE_N_TRANS: case Type::FACE_N_ROT_AA: + case Type::FACE_ROT_NORMAL_PT: break; } } @@ -755,6 +756,7 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { case Type::FACE_N_ROT_TRANS: case Type::FACE_N_TRANS: case Type::FACE_N_ROT_AA: + case Type::FACE_ROT_NORMAL_PT: // Do nothing; these are drawn with the triangle mesh return; } diff --git a/src/entity.cpp b/src/entity.cpp index 38800ab68..344e1acbd 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -701,6 +701,7 @@ bool EntityBase::IsFace() const { case Type::FACE_N_ROT_TRANS: case Type::FACE_N_TRANS: case Type::FACE_N_ROT_AA: + case Type::FACE_ROT_NORMAL_PT: return true; default: return false; @@ -728,7 +729,7 @@ ExprVector EntityBase::FaceGetNormalExprs() const { r = q.Rotate(r); } else if(type == Type::FACE_N_TRANS) { r = ExprVector::From(numNormal.vx, numNormal.vy, numNormal.vz); - } else if(type == Type::FACE_N_ROT_AA) { + } else if((type == Type::FACE_N_ROT_AA) || (type == Type::FACE_ROT_NORMAL_PT)) { r = ExprVector::From(numNormal.vx, numNormal.vy, numNormal.vz); ExprQuaternion q = GetAxisAngleQuaternionExprs(3); r = q.Rotate(r); @@ -751,7 +752,7 @@ Vector EntityBase::FaceGetNormalNum() const { r = q.Rotate(r); } else if(type == Type::FACE_N_TRANS) { r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz); - } else if(type == Type::FACE_N_ROT_AA) { + } else if((type == Type::FACE_N_ROT_AA) || (type == Type::FACE_ROT_NORMAL_PT)) { r = Vector::From(numNormal.vx, numNormal.vy, numNormal.vz); Quaternion q = GetAxisAngleQuaternion(3); r = q.Rotate(r); @@ -761,7 +762,7 @@ Vector EntityBase::FaceGetNormalNum() const { ExprVector EntityBase::FaceGetPointExprs() const { ExprVector r; - if(type == Type::FACE_NORMAL_PT) { + if((type == Type::FACE_NORMAL_PT) || (type==Type::FACE_ROT_NORMAL_PT)) { r = SK.GetEntity(point[0])->PointGetExprs(); } else if(type == Type::FACE_XPROD) { r = ExprVector::From(numPoint); @@ -790,7 +791,7 @@ ExprVector EntityBase::FaceGetPointExprs() const { Vector EntityBase::FaceGetPointNum() const { Vector r; - if(type == Type::FACE_NORMAL_PT) { + if((type == Type::FACE_NORMAL_PT) || (type==Type::FACE_ROT_NORMAL_PT)) { r = SK.GetEntity(point[0])->PointGetNum(); } else if(type == Type::FACE_XPROD) { r = numPoint; diff --git a/src/group.cpp b/src/group.cpp index 3128ecc46..686f4cee6 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -565,6 +565,12 @@ void Group::Generate(IdList *entity, // as a reference when defining end faces. hEntity pt = { 0 }; + int ai = 0, af = 2; + if (subtype == Subtype::TWO_SIDED) + { + ai = -1; + af = 1; + } // Not using range-for here because we're changing the size of entity in the loop. for(i = 0; i < entity->n; i++) { Entity *e = &(entity->Get(i)); @@ -576,24 +582,20 @@ void Group::Generate(IdList *entity, e->CalculateNumerical(/*forExport=*/false); hEntity he = e->h; // one copy for each end of the revolved surface - for(a = 0; a < 2; a++) { - //! @todo is this check redundant? - Entity *e = &(entity->Get(i)); - if(e->group != opA) - continue; + CopyEntity(entity, e, ai, REMAP_LATHE_START, h.param(0), + h.param(1), h.param(2), h.param(3), h.param(4), h.param(5), + h.param(6), NO_PARAM, CopyAs::N_ROT_AA); + + CopyEntity(entity, e, af, REMAP_LATHE_END, h.param(0), + h.param(1), h.param(2), h.param(3), h.param(4), h.param(5), + h.param(6), NO_PARAM, CopyAs::N_ROT_AA); - e->CalculateNumerical(false); - CopyEntity(entity, e, a * 2 - (subtype == Subtype::ONE_SIDED ? 0 : 1), - (a == 1) ? REMAP_LATHE_END : REMAP_LATHE_START, h.param(0), - h.param(1), h.param(2), h.param(3), h.param(4), h.param(5), - h.param(6), NO_PARAM, CopyAs::N_ROT_AA); - } // Arcs are not generated for revolve groups, for now, because our current arc // entity is not chiral, and dragging a revolve may break the arc by inverting it. // MakeLatheCircles(entity, param, he, axis_pos, axis_dir); MakeLatheSurfacesSelectable(entity, he, axis_dir); } - MakeRevolveEndFaces(entity, pt); + MakeRevolveEndFaces(entity, pt, ai, af); return; } @@ -617,6 +619,13 @@ void Group::Generate(IdList *entity, // as a reference when defining end faces. hEntity pt = { 0 }; + int ai = 0, af = 2; // initial and final number of transformations + if (subtype != Subtype::ONE_SIDED) + { + ai = -1; + af = 1; + } + // Not using range-for here because we're changing the size of entity in the loop. for(i = 0; i < entity->n; i++) { Entity *e = &(entity->Get(i)); @@ -628,14 +637,14 @@ void Group::Generate(IdList *entity, e->CalculateNumerical(/*forExport=*/false); // one copy for each end of the helix - for(a = 0; a < 2; a++) { - Entity *e = &(entity->Get(i)); - e->CalculateNumerical(false); - CopyEntity(entity, e, a * 2 - (subtype == Subtype::ONE_SIDED ? 0 : 1), - (a == 1) ? REMAP_LATHE_END : REMAP_LATHE_START, h.param(0), - h.param(1), h.param(2), h.param(3), h.param(4), h.param(5), - h.param(6), h.param(7), CopyAs::N_ROT_AXIS_TRANS); - } + CopyEntity(entity, e, ai, REMAP_LATHE_START, h.param(0), + h.param(1), h.param(2), h.param(3), h.param(4), h.param(5), + h.param(6), h.param(7), CopyAs::N_ROT_AXIS_TRANS); + + CopyEntity(entity, e, af, REMAP_LATHE_END, h.param(0), + h.param(1), h.param(2), h.param(3), h.param(4), h.param(5), + h.param(6), h.param(7), CopyAs::N_ROT_AXIS_TRANS); + // For point entities on the axis, create a construction line e = &(entity->Get(i)); if(e->IsPoint()) { @@ -656,7 +665,7 @@ void Group::Generate(IdList *entity, } } } - MakeRevolveEndFaces(entity, pt); + MakeRevolveEndFaces(entity, pt, ai, af); return; } @@ -940,7 +949,10 @@ void Group::MakeLatheSurfacesSelectable(IdList *el, hEntity in, } } -void Group::MakeRevolveEndFaces(IdList *el, hEntity pt) +// For Revolve and Helix groups the end faces are remapped from an arbitrary +// point on the sketch. We reference the transformed point but there is +// no existing normal so we need to define the rotation and timesApplied. +void Group::MakeRevolveEndFaces(IdList *el, hEntity pt, int ai, int af) { if(pt.v == 0) return; Group *src = SK.GetGroup(opA); @@ -953,17 +965,28 @@ void Group::MakeRevolveEndFaces(IdList *el, hEntity pt) } Entity en = {}; - en.type = Entity::Type::FACE_NORMAL_PT; + en.type = Entity::Type::FACE_ROT_NORMAL_PT; en.group = h; + // The center of rotation + en.param[0] = h.param(0); + en.param[1] = h.param(1); + en.param[2] = h.param(2); + // The rotation quaternion + en.param[3] = h.param(3); + en.param[4] = h.param(4); + en.param[5] = h.param(5); + en.param[6] = h.param(6); en.numNormal = Quaternion::From(0, n.x, n.y, n.z); - en.point[0] = Remap(pt, REMAP_LATHE_END); - en.h = Remap(Entity::NO_ENTITY, REMAP_LATHE_END); - el->Add(&en); - en.point[0] = Remap(pt, REMAP_LATHE_START); + en.timesApplied = ai; en.h = Remap(Entity::NO_ENTITY, REMAP_LATHE_START); el->Add(&en); + + en.point[0] = Remap(pt, REMAP_LATHE_END); + en.timesApplied = af; + en.h = Remap(Entity::NO_ENTITY, REMAP_LATHE_END); + el->Add(&en); } void Group::MakeExtrusionTopBottomFaces(IdList *el, hEntity pt) @@ -1086,6 +1109,7 @@ void Group::CopyEntity(IdList *el, case Entity::Type::FACE_N_ROT_TRANS: case Entity::Type::FACE_N_TRANS: case Entity::Type::FACE_N_ROT_AA: + case Entity::Type::FACE_ROT_NORMAL_PT: if(as == CopyAs::N_TRANS) { en.type = Entity::Type::FACE_N_TRANS; en.param[0] = dx; diff --git a/src/sketch.h b/src/sketch.h index 453df54d9..a4ef89a4f 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -285,7 +285,7 @@ class Group { void MakeExtrusionLines(EntityList *el, hEntity in); void MakeLatheCircles(IdList *el, IdList *param, hEntity in, Vector pt, Vector axis); void MakeLatheSurfacesSelectable(IdList *el, hEntity in, Vector axis); - void MakeRevolveEndFaces(IdList *el, hEntity pt); + void MakeRevolveEndFaces(IdList *el, hEntity pt, int ai, int af); void MakeExtrusionTopBottomFaces(EntityList *el, hEntity pt); void CopyEntity(EntityList *el, Entity *ep, int timesApplied, int remap, @@ -407,6 +407,7 @@ class EntityBase { FACE_N_ROT_TRANS = 5002, FACE_N_TRANS = 5003, FACE_N_ROT_AA = 5004, + FACE_ROT_NORMAL_PT = 5005, WORKPLANE = 10000, LINE_SEGMENT = 11000, diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp index fa3605ff4..01d5e9e70 100644 --- a/src/srf/surface.cpp +++ b/src/srf/surface.cpp @@ -678,7 +678,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector u.RotatedAbout(axis, angles), v.RotatedAbout(axis, angles)); s0.color = color; - hEntity face0 = group->Remap(Entity::NO_ENTITY, Group::REMAP_LATHE_END); + hEntity face0 = group->Remap(Entity::NO_ENTITY, Group::REMAP_LATHE_START); s0.face = face0.v; s1 = SSurface::FromPlane( @@ -686,7 +686,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector u.ScaledBy(-1).RotatedAbout(axis, anglef), v.RotatedAbout(axis, anglef)); s1.color = color; - hEntity face1 = group->Remap(Entity::NO_ENTITY, Group::REMAP_LATHE_START); + hEntity face1 = group->Remap(Entity::NO_ENTITY, Group::REMAP_LATHE_END); s1.face = face1.v; hSSurface hs0 = surface.AddAndAssignId(&s0); From 5097fc82e15f1bef7f5166d8d67ff138f211bb6b Mon Sep 17 00:00:00 2001 From: whitequark Date: Mon, 27 Apr 2020 17:23:55 +0000 Subject: [PATCH 028/646] README: update Linux-to-Windows cross-compilation instructions. --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 94eb67f31..5e0f72d57 100644 --- a/README.md +++ b/README.md @@ -99,10 +99,10 @@ by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation. ### Building for Windows -You will need the usual build tools, CMake and a Windows cross-compiler. +You will need the usual build tools, CMake, a Windows cross-compiler, and flatc. On a Debian derivative (e.g. Ubuntu) these can be installed with: - apt-get install git build-essential cmake mingw-w64 + apt-get install git build-essential cmake mingw-w64 libflatbuffers-dev Before building, check out the project and the necessary submodules: @@ -115,7 +115,8 @@ After that, build 32-bit SolveSpace as following: mkdir build cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake \ - -DCMAKE_BUILD_TYPE=Release + -DCMAKE_BUILD_TYPE=Release \ + -DFLATC=$(which flatc) make Or, build 64-bit SolveSpace as following: @@ -123,7 +124,8 @@ Or, build 64-bit SolveSpace as following: mkdir build cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake \ - -DCMAKE_BUILD_TYPE=Release + -DCMAKE_BUILD_TYPE=Release \ + -DFLATC=$(which flatc) make The graphical interface is built as `build/bin/solvespace.exe`, and the command-line interface From 88e23650d1f87b2e609f98b3dca8027ab5d00988 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Mon, 27 Apr 2020 20:25:28 +0200 Subject: [PATCH 029/646] Travis: allow Snap arm64 to fail arm64 builds on Travis are not yet fully mature and this causes a high failure rate that is not caused by our code. Continue building and deploying arm64 to the edge channel, but don't consider the result for the success of the whole build job. Alleviates #587 --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 26d94da97..1c90474b9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,9 @@ language: c git: submodules: false jobs: + allow_failures: + - stage: deploy + name: Snap arm64 include: - stage: test name: "Debian" From 6f3f45f5f6a107a7a7d96744e73a42c9061710ad Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 2 May 2020 14:56:50 -0400 Subject: [PATCH 030/646] Bernstein polynomials with no branching. (#591) --- src/srf/ratpoly.cpp | 95 ++++++++++----------------------------------- src/srf/surface.h | 4 -- 2 files changed, 21 insertions(+), 78 deletions(-) diff --git a/src/srf/ratpoly.cpp b/src/srf/ratpoly.cpp index 70c66b558..f4180cef6 100644 --- a/src/srf/ratpoly.cpp +++ b/src/srf/ratpoly.cpp @@ -13,84 +13,31 @@ // and convergence should be fast by now. #define RATPOLY_EPS (LENGTH_EPS/(1e2)) -double SolveSpace::Bernstein(int k, int deg, double t) +static double Bernstein(int k, int deg, double t) { - if(k > deg || k < 0) return 0; - - switch(deg) { - case 0: - return 1; - - case 1: - if(k == 0) { - return (1 - t); - } else if(k == 1) { - return t; - } - break; - - case 2: - if(k == 0) { - return (1 - t)*(1 - t); - } else if(k == 1) { - return 2*(1 - t)*t; - } else if(k == 2) { - return t*t; - } - break; - - case 3: - if(k == 0) { - return (1 - t)*(1 - t)*(1 - t); - } else if(k == 1) { - return 3*(1 - t)*(1 - t)*t; - } else if(k == 2) { - return 3*(1 - t)*t*t; - } else if(k == 3) { - return t*t*t; - } - break; - } - ssassert(false, "Unexpected degree of spline"); +// indexed by [degree][k][exponent] + static const double bernstein_coeff[4][4][4] = { + { { 1.0,0.0,0.0,0.0 }, { 1.0,0.0,0.0,0.0 }, { 1.0,0.0,0.0,0.0 }, { 1.0,0.0,0.0,0.0 } }, + { { 1.0,-1.0,0.0,0.0 }, { 0.0,1.0,0.0,0.0 }, { 0.0,0.0,0.0,0.0 }, { 0.0,0.0,0.0,0.0 } }, + { { 1.0,-2.0,1.0,0.0 }, { 0.0,2.0,-2.0,0.0 },{ 0.0,0.0,1.0,0.0 }, { 0.0,0.0,0.0,0.0 } }, + { { 1.0,-3.0,3.0,-1.0 },{ 0.0,3.0,-6.0,3.0 },{ 0.0,0.0,3.0,-3.0}, { 0.0,0.0,0.0,1.0 } } }; + + const double *c; + c = bernstein_coeff[deg][k]; + return (((c[3]*t+c[2])*t)+c[1])*t+c[0]; } -double SolveSpace::BernsteinDerivative(int k, int deg, double t) +static double BernsteinDerivative(int k, int deg, double t) { - switch(deg) { - case 0: - return 0; - - case 1: - if(k == 0) { - return -1; - } else if(k == 1) { - return 1; - } - break; - - case 2: - if(k == 0) { - return -2 + 2*t; - } else if(k == 1) { - return 2 - 4*t; - } else if(k == 2) { - return 2*t; - } - break; - - case 3: - if(k == 0) { - return -3 + 6*t - 3*t*t; - } else if(k == 1) { - return 3 - 12*t + 9*t*t; - } else if(k == 2) { - return 6*t - 9*t*t; - } else if(k == 3) { - return 3*t*t; - } - break; - } - ssassert(false, "Unexpected degree of spline"); + static const double bernstein_derivative_coeff[4][4][3] = { + { { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 } }, + { { -1.0,0.0,0.0 }, { 1.0,0.0,0.0 }, { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 } }, + { { -2.0,2.0,0.0 }, { 2.0,-4.0,0.0 },{ 0.0,2.0,0.0 }, { 0.0,0.0,0.0 } }, + { { -3.0,6.0,-3.0 },{ 3.0,-12.0,9.0 },{ 0.0,6.0,-9.0}, { 0.0,0.0,3.0 } } }; + + const double *c; + c = bernstein_derivative_coeff[deg][k]; + return ((c[2]*t)+c[1])*t+c[0]; } Vector SBezier::PointAt(double t) const { diff --git a/src/srf/surface.h b/src/srf/surface.h index 99418c53e..6fabf66ac 100644 --- a/src/srf/surface.h +++ b/src/srf/surface.h @@ -10,10 +10,6 @@ #ifndef SOLVESPACE_SURFACE_H #define SOLVESPACE_SURFACE_H -// Utility functions, Bernstein polynomials of order 1-3 and their derivatives. -double Bernstein(int k, int deg, double t); -double BernsteinDerivative(int k, int deg, double t); - class SBezierList; class SSurface; class SCurvePt; From 968c3af0ce272c923a8475d5d28433861af3ebe7 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 6 May 2020 17:24:10 -0400 Subject: [PATCH 031/646] Eliminate infinite loop AssemblePolygon --- src/polygon.cpp | 38 ++++++++++++++++---------------------- 1 file changed, 16 insertions(+), 22 deletions(-) diff --git a/src/polygon.cpp b/src/polygon.cpp index 4adee80a9..435771c52 100644 --- a/src/polygon.cpp +++ b/src/polygon.cpp @@ -269,31 +269,25 @@ bool SEdgeList::AssemblePolygon(SPolygon *dest, SEdge *errorAt, bool keepDir) co dest->Clear(); bool allClosed = true; - for(;;) { - Vector first = Vector::From(0, 0, 0); - Vector last = Vector::From(0, 0, 0); - int i; - for(i = 0; i < l.n; i++) { - if(!l[i].tag) { - first = l[i].a; - last = l[i].b; - /// @todo fix const! - const_cast(&(l[i]))->tag = 1; - break; + Vector first = Vector::From(0, 0, 0); + Vector last = Vector::From(0, 0, 0); + int i; + for(i = 0; i < l.n; i++) { + if(!l[i].tag) { + first = l[i].a; + last = l[i].b; + /// @todo fix const! + const_cast(&(l[i]))->tag = 1; + // Create a new empty contour in our polygon, and finish assembling + // into that contour. + dest->AddEmptyContour(); + if(!AssembleContour(first, last, dest->l.Last(), errorAt, keepDir)) { + allClosed = false; } + // But continue assembling, even if some of the contours are open } - if(i >= l.n) { - return allClosed; - } - - // Create a new empty contour in our polygon, and finish assembling - // into that contour. - dest->AddEmptyContour(); - if(!AssembleContour(first, last, dest->l.Last(), errorAt, keepDir)) { - allClosed = false; - } - // But continue assembling, even if some of the contours are open } + return allClosed; } //----------------------------------------------------------------------------- From 6d96dbae4cf32269b77d3154c9fea8392b6bb421 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 6 May 2020 17:27:31 -0400 Subject: [PATCH 032/646] Less work in AssembleContour --- src/polygon.cpp | 6 +++--- src/polygon.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/polygon.cpp b/src/polygon.cpp index 435771c52..f325fd9b4 100644 --- a/src/polygon.cpp +++ b/src/polygon.cpp @@ -224,7 +224,7 @@ void SEdgeList::AddEdge(Vector a, Vector b, int auxA, int auxB, int tag) { } bool SEdgeList::AssembleContour(Vector first, Vector last, SContour *dest, - SEdge *errorAt, bool keepDir) const + SEdge *errorAt, bool keepDir, int start) const { int i; @@ -232,7 +232,7 @@ bool SEdgeList::AssembleContour(Vector first, Vector last, SContour *dest, dest->AddPoint(last); do { - for(i = 0; i < l.n; i++) { + for(i = start; i < l.n; i++) { /// @todo fix const! SEdge *se = const_cast(&(l[i])); if(se->tag) continue; @@ -281,7 +281,7 @@ bool SEdgeList::AssemblePolygon(SPolygon *dest, SEdge *errorAt, bool keepDir) co // Create a new empty contour in our polygon, and finish assembling // into that contour. dest->AddEmptyContour(); - if(!AssembleContour(first, last, dest->l.Last(), errorAt, keepDir)) { + if(!AssembleContour(first, last, dest->l.Last(), errorAt, keepDir, i+1)) { allClosed = false; } // But continue assembling, even if some of the contours are open diff --git a/src/polygon.h b/src/polygon.h index a4be64bbe..948106f7c 100644 --- a/src/polygon.h +++ b/src/polygon.h @@ -53,7 +53,7 @@ class SEdgeList { void AddEdge(Vector a, Vector b, int auxA=0, int auxB=0, int tag=0); bool AssemblePolygon(SPolygon *dest, SEdge *errorAt, bool keepDir=false) const; bool AssembleContour(Vector first, Vector last, SContour *dest, - SEdge *errorAt, bool keepDir) const; + SEdge *errorAt, bool keepDir, int start) const; int AnyEdgeCrossings(Vector a, Vector b, Vector *pi=NULL, SPointList *spl=NULL) const; bool ContainsEdgeFrom(const SEdgeList *sel) const; From 938116f7e625fb5343b68fc5e685761395ec4eb1 Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 8 May 2020 10:36:14 +0300 Subject: [PATCH 033/646] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9787a9cd5..a5df02a20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -101,6 +101,8 @@ Other new features: * The numpad decimal separator key is bound to "." regardless of locale. * On Windows, full-screen mode is implemented. * On Linux, native file chooser dialog can be used. + * New edit menu items "Line Styles", "View Projection" and "Configuration" + that are shortcuts to the respective configuration screens. Bugs fixed: * A point in 3d constrained to any line whose length is free no longer @@ -120,6 +122,7 @@ Bugs fixed: them, such that their constraints are retained. * When linking a sketch file, missing custom styles are now imported from the linked file. + * 3Dconnexion SpaceMouse should now work (on Windows). 2.x --- From b6b1d73c55f83087c109bf1620f441f982e27320 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 6 May 2020 20:20:45 -0400 Subject: [PATCH 034/646] Don't create redundant edges in UvGridTriangulate into. --- src/srf/triangulate.cpp | 124 +++++++++++++++++++++++----------------- 1 file changed, 72 insertions(+), 52 deletions(-) diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index 895c9409e..b4ea24110 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -437,68 +437,88 @@ void SPolygon::UvGridTriangulateInto(SMesh *mesh, SSurface *srf) { srf->MakeTriangulationGridInto(&li, 0, 1, /*swapped=*/true); lj.Add(&v); srf->MakeTriangulationGridInto(&lj, 0, 1, /*swapped=*/false); + if ((li.n > 3) && (lj.n > 3)) { + // Now iterate over each quad in the grid. If it's outside the polygon, + // or if it intersects the polygon, then we discard it. Otherwise we + // generate two triangles in the mesh, and cut it out of our polygon. + // Quads around the perimeter would be rejected by AnyEdgeCrossings. + std::vector bottom(lj.n, false); // did we use this quad? + int i, j; + for(i = 1; i < (li.n-1); i++) { + bool prev_flag = false; + for(j = 1; j < (lj.n-1); j++) { + bool this_flag = true; + double us = li[i], uf = li[i+1], + vs = lj[j], vf = lj[j+1]; + + Vector a = Vector::From(us, vs, 0), + b = Vector::From(us, vf, 0), + c = Vector::From(uf, vf, 0), + d = Vector::From(uf, vs, 0); + + // | d-----c + // | | | + // | | | + // | a-----b + // | + // +-------------> j/v axis + + if( (i==(li.n-2)) || (j==(lj.n-2)) || + orig.AnyEdgeCrossings(a, b, NULL) || + orig.AnyEdgeCrossings(b, c, NULL) || + orig.AnyEdgeCrossings(c, d, NULL) || + orig.AnyEdgeCrossings(d, a, NULL)) + { + this_flag = false; + } - // Now iterate over each quad in the grid. If it's outside the polygon, - // or if it intersects the polygon, then we discard it. Otherwise we - // generate two triangles in the mesh, and cut it out of our polygon. - int i, j; - for(i = 0; i < (li.n - 1); i++) { - for(j = 0; j < (lj.n - 1); j++) { - double us = li[i], uf = li[i+1], - vs = lj[j], vf = lj[j+1]; - - Vector a = Vector::From(us, vs, 0), - b = Vector::From(us, vf, 0), - c = Vector::From(uf, vf, 0), - d = Vector::From(uf, vs, 0); - - if(orig.AnyEdgeCrossings(a, b, NULL) || - orig.AnyEdgeCrossings(b, c, NULL) || - orig.AnyEdgeCrossings(c, d, NULL) || - orig.AnyEdgeCrossings(d, a, NULL)) - { - continue; - } - - // There's no intersections, so it doesn't matter which point - // we decide to test. - if(!this->ContainsPoint(a)) { - continue; + // There's no intersections, so it doesn't matter which point + // we decide to test. + if(!this->ContainsPoint(a)) { + this_flag = false; + } + + if (this_flag) { + // Add the quad to our mesh + STriangle tr = {}; + tr.a = a; + tr.b = b; + tr.c = c; + mesh->AddTriangle(&tr); + tr.a = a; + tr.b = c; + tr.c = d; + mesh->AddTriangle(&tr); + + if (!prev_flag) // add our own left edge + holes.AddEdge(d, a); + if (!bottom[j]) // add our own bottom edge + holes.AddEdge(a, b); + } else { + if (prev_flag) // add our left neighbots right edge + holes.AddEdge(a, d); + if (bottom[j]) // add our bottom neighbors top edge + holes.AddEdge(b, a); + } + prev_flag = this_flag; + bottom[j] = this_flag; } - - // Add the quad to our mesh - STriangle tr = {}; - tr.a = a; - tr.b = b; - tr.c = c; - mesh->AddTriangle(&tr); - tr.a = a; - tr.b = c; - tr.c = d; - mesh->AddTriangle(&tr); - - holes.AddEdge(a, b); - holes.AddEdge(b, c); - holes.AddEdge(c, d); - holes.AddEdge(d, a); } - } - holes.CullExtraneousEdges(); - SPolygon hp = {}; - holes.AssemblePolygon(&hp, NULL, /*keepDir=*/true); + // Because no duplicate edges were created we do not need to cull them. + SPolygon hp = {}; + holes.AssemblePolygon(&hp, NULL, /*keepDir=*/true); - SContour *sc; - for(sc = hp.l.First(); sc; sc = hp.l.NextAfter(sc)) { - l.Add(sc); + SContour *sc; + for(sc = hp.l.First(); sc; sc = hp.l.NextAfter(sc)) { + l.Add(sc); + } + hp.l.Clear(); } - orig.Clear(); holes.Clear(); li.Clear(); lj.Clear(); - hp.l.Clear(); - UvTriangulateInto(mesh, srf); } From 7c74cea30d824d463614c8d3a5dd18f0c0fbf189 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 8 May 2020 15:04:27 -0400 Subject: [PATCH 035/646] No message if cached points to don't converge. Quiet the terminal. --- src/srf/ratpoly.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/srf/ratpoly.cpp b/src/srf/ratpoly.cpp index f4180cef6..9e70192a5 100644 --- a/src/srf/ratpoly.cpp +++ b/src/srf/ratpoly.cpp @@ -436,6 +436,13 @@ void SSurface::ClosestPointTo(Vector p, double *u, double *v, bool mustConverge) } // If we failed to converge, then at least don't return NaN. + if(mustConverge) { + Vector p0 = PointAt(*u, *v); + dbp("didn't converge"); + dbp("have %.3f %.3f %.3f", CO(p0)); + dbp("want %.3f %.3f %.3f", CO(p)); + dbp("distance = %g", (p.Minus(p0)).Magnitude()); + } if(isnan(*u) || isnan(*v)) { *u = *v = 0; } @@ -477,12 +484,6 @@ bool SSurface::ClosestPointNewton(Vector p, double *u, double *v, bool mustConve } - if(mustConverge) { - dbp("didn't converge"); - dbp("have %.3f %.3f %.3f", CO(p0)); - dbp("want %.3f %.3f %.3f", CO(p)); - dbp("distance = %g", (p.Minus(p0)).Magnitude()); - } return false; } From 44a35fa3b2468d2d619cf6e3cfd579b1dbea74d9 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 30 Apr 2020 17:11:59 -0400 Subject: [PATCH 036/646] Use OpenMP for triangulation --- src/srf/surface.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp index 01d5e9e70..a7be96825 100644 --- a/src/srf/surface.cpp +++ b/src/srf/surface.cpp @@ -1050,9 +1050,18 @@ void SShell::MakeSectionEdgesInto(Vector n, double d, SEdgeList *sel, SBezierLis } void SShell::TriangulateInto(SMesh *sm) { - SSurface *s; - for(s = surface.First(); s; s = surface.NextAfter(s)) { - s->TriangulateInto(this, sm); + std::vector tm(surface.n); + +#pragma omp parallel for + for(int i=0; iTriangulateInto(this, &tm[i]); + } + + // merge the per-surface meshes + for (auto& m : tm) { + sm->MakeFromCopyOf(&m); + m.Clear(); } } From 01ee880fa2ac18b0aa4e8437b30544f4bc9d006f Mon Sep 17 00:00:00 2001 From: whitequark Date: Sat, 9 May 2020 19:46:16 +0000 Subject: [PATCH 037/646] CMake: detect OpenMP and use if available. This is a missing part of commit b4e1ce44. --- CMakeLists.txt | 8 ++++++++ src/CMakeLists.txt | 1 + 2 files changed, 9 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3e98325d3..05c1bbf00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -96,6 +96,14 @@ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X8 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLOAT_FLAGS}") endif() +# We use OpenMP to speed up some geometric operations, but it's optional. +include(FindOpenMP) +if(OpenMP_FOUND) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") +else() + message(WARNING "OpenMP not found, geometric operations will be single-threaded") +endif() + if(APPLE OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 928b45229..4834a6555 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -224,6 +224,7 @@ add_dependencies(solvespace-core q3d_header) target_link_libraries(solvespace-core + ${OpenMP_CXX_LIBRARIES} dxfrw ${util_LIBRARIES} ${ZLIB_LIBRARY} From a5a1b80124ca682875e04b35b967a39cb595160f Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 10 May 2020 02:52:39 +0000 Subject: [PATCH 038/646] CMake: expand sanitizer support to include TSan. --- CMakeLists.txt | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 05c1bbf00..4f5eab56f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,12 +113,34 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") endif() if(ENABLE_SANITIZERS) - list(APPEND SANITIZERS address alignment bounds) - list(APPEND SANITIZERS shift signed-integer-overflow integer-divide-by-zero) - list(APPEND SANITIZERS null bool enum) - list(APPEND SANITIZERS return) - string(REPLACE ";" "," SANITIZERS "${SANITIZERS}") - set(SANITIZE_FLAGS "-O1 -fsanitize=${SANITIZERS} -fno-sanitize-recover=address,undefined") + if(NOT SANITIZERS) + set(SANITIZERS "address;undefined") + endif() + + if("thread" IN_LIST SANITIZERS) + list(REMOVE_ITEM SANITIZERS "thread") + list(APPEND SANITIZE_OPTIONS thread) + endif() + if("address" IN_LIST SANITIZERS) + list(REMOVE_ITEM SANITIZERS "address") + list(APPEND SANITIZE_OPTIONS address) + endif() + if("undefined" IN_LIST SANITIZERS) + list(REMOVE_ITEM SANITIZERS "undefined") + list(APPEND SANITIZE_OPTIONS alignment bounds) + list(APPEND SANITIZE_OPTIONS shift signed-integer-overflow integer-divide-by-zero) + list(APPEND SANITIZE_OPTIONS null bool enum) + list(APPEND SANITIZE_OPTIONS return) + endif() + if(SANITIZERS) + message(FATAL_ERROR "Unknown sanitizer(s) ${SANITIZERS}") + else() + message(STATUS "Using sanitizer options ${SANITIZE_OPTIONS}") + endif() + + string(REPLACE ";" "," SANITIZE_OPTIONS "${SANITIZE_OPTIONS}") + set(SANITIZE_FLAGS "-O1 -fsanitize=${SANITIZE_OPTIONS}") + set(SANITIZE_FLAGS "${SANITIZE_FLAGS} -fno-sanitize-recover=address,undefined") if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(SANITIZE_FLAGS "${SANITIZE_FLAGS} -fno-omit-frame-pointer -fno-optimize-sibling-calls") From 7f17b54e7c1859558c4ec35d62edd4e6f98a8fc0 Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 10 May 2020 03:37:52 +0000 Subject: [PATCH 039/646] Win32: use CRT heap instead of our own. Historically SolveSpace used its own heap on Windows since it gave better control and debugging options, but a lot of development these days happens on Linux, where that heap was a stub around malloc/free, and also Windows debugging tools got a lot better. In terms of immediate benefit, this commit fixes heap corruption on Windows introduced in commits b4e1ce44 and 47e82798, caused by allocating with HEAP_NO_SERIALIZE in parallel from OpenMP threads. Without HEAP_NO_SERIALIZE there's no performance benefit to keeping our own heap, either. The vl() function is also removed because for development there are better tools now, and the only place where it was permanently called from became a no-op, since temporary heap always validates after FreeAllTemporary() recreates it. --- CMakeLists.txt | 3 ++- src/platform/utilwin.cpp | 16 +++------------- src/solvespace.h | 1 - 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f5eab56f..6494993fb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,7 +98,8 @@ endif() # We use OpenMP to speed up some geometric operations, but it's optional. include(FindOpenMP) -if(OpenMP_FOUND) +# No MinGW distribution actually ships an OpenMP runtime, but FindOpenMP detects it anyway. +if(OpenMP_FOUND AND NOT MINGW) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") else() message(WARNING "OpenMP not found, geometric operations will be single-threaded") diff --git a/src/platform/utilwin.cpp b/src/platform/utilwin.cpp index 4e452802e..172039ae1 100644 --- a/src/platform/utilwin.cpp +++ b/src/platform/utilwin.cpp @@ -13,7 +13,7 @@ #include namespace SolveSpace { -static HANDLE PermHeap, TempHeap; +static HANDLE TempHeap; void dbp(const char *str, ...) { @@ -51,23 +51,15 @@ void FreeAllTemporary() { if(TempHeap) HeapDestroy(TempHeap); TempHeap = HeapCreate(HEAP_NO_SERIALIZE, 1024*1024*20, 0); - // This is a good place to validate, because it gets called fairly - // often. - vl(); } void *MemAlloc(size_t n) { - void *p = HeapAlloc(PermHeap, HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, n); + void *p = malloc(n); ssassert(p != NULL, "Cannot allocate memory"); return p; } void MemFree(void *p) { - HeapFree(PermHeap, HEAP_NO_SERIALIZE, p); -} - -void vl() { - ssassert(HeapValidate(TempHeap, HEAP_NO_SERIALIZE, NULL), "Corrupted heap"); - ssassert(HeapValidate(PermHeap, HEAP_NO_SERIALIZE, NULL), "Corrupted heap"); + free(p); } std::vector InitPlatform(int argc, char **argv) { @@ -81,8 +73,6 @@ std::vector InitPlatform(int argc, char **argv) { } #endif - // Create the heap used for long-lived stuff (that gets freed piecewise). - PermHeap = HeapCreate(HEAP_NO_SERIALIZE, 1024*1024*20, 0); // Create the heap that we use to store Exprs and other temp stuff. FreeAllTemporary(); diff --git a/src/solvespace.h b/src/solvespace.h index 2a553024f..fea705e85 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -152,7 +152,6 @@ void *AllocTemporary(size_t n); void FreeAllTemporary(); void *MemAlloc(size_t n); void MemFree(void *p); -void vl(); // debug function to validate heaps // End of platform-specific functions //================ From 2e0cad413ffb1e413e3f12411f5edf4d8874a550 Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 10 May 2020 06:11:53 +0000 Subject: [PATCH 040/646] Get rid of MemAlloc/MemFree. After commit 521473ee there's no point in keeping these around. Instead, use the same heap in containers as the C++ standard library. --- src/dsc.h | 14 +++++++------- src/mesh.cpp | 8 ++++---- src/platform/utilunix.cpp | 15 +-------------- src/platform/utilwin.cpp | 14 +------------- src/solvespace.h | 2 -- 5 files changed, 13 insertions(+), 40 deletions(-) diff --git a/src/dsc.h b/src/dsc.h index ce92c5963..5a431a73c 100644 --- a/src/dsc.h +++ b/src/dsc.h @@ -215,12 +215,12 @@ class List { void ReserveMore(int howMuch) { if(n + howMuch > elemsAllocated) { elemsAllocated = n + howMuch; - T *newElem = (T *)MemAlloc((size_t)elemsAllocated*sizeof(T)); + T *newElem = (T *)::operator new[]((size_t)elemsAllocated*sizeof(T)); for(int i = 0; i < n; i++) { new(&newElem[i]) T(std::move(elem[i])); elem[i].~T(); } - MemFree(elem); + ::operator delete[](elem); elem = newElem; } } @@ -286,7 +286,7 @@ class List { void Clear() { for(int i = 0; i < n; i++) elem[i].~T(); - if(elem) MemFree(elem); + if(elem) ::operator delete[](elem); elem = NULL; n = elemsAllocated = 0; } @@ -401,12 +401,12 @@ class IdList { void ReserveMore(int howMuch) { if(n + howMuch > elemsAllocated) { elemsAllocated = n + howMuch; - T *newElem = (T *)MemAlloc((size_t)elemsAllocated*sizeof(T)); + T *newElem = (T *)::operator new[]((size_t)elemsAllocated*sizeof(T)); for(int i = 0; i < n; i++) { new(&newElem[i]) T(std::move(elem[i])); elem[i].~T(); } - MemFree(elem); + ::operator delete[](elem); elem = newElem; } } @@ -525,7 +525,7 @@ class IdList { void DeepCopyInto(IdList *l) { l->Clear(); - l->elem = (T *)MemAlloc(elemsAllocated * sizeof(elem[0])); + l->elem = (T *)::operator new[](elemsAllocated * sizeof(elem[0])); for(int i = 0; i < n; i++) new(&l->elem[i]) T(elem[i]); l->elemsAllocated = elemsAllocated; @@ -537,7 +537,7 @@ class IdList { elem[i].Clear(); elem[i].~T(); } - if(elem) MemFree(elem); + if(elem) ::operator delete[](elem); elem = NULL; elemsAllocated = n = 0; } diff --git a/src/mesh.cpp b/src/mesh.cpp index 57aa87b47..047d61126 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -110,11 +110,11 @@ void SMesh::Simplify(int start) { STriMeta meta = l[start].meta; - STriangle *tout = (STriangle *)MemAlloc(maxTriangles*sizeof(*tout)); + STriangle *tout = new STriangle[maxTriangles]; int toutc = 0; Vector n = Vector::From(0, 0, 0); - Vector *conv = (Vector *)MemAlloc(maxTriangles*3*sizeof(*conv)); + Vector *conv = new Vector[maxTriangles * 3]; int convc = 0; int start0 = start; @@ -234,8 +234,8 @@ void SMesh::Simplify(int start) { for(i = 0; i < toutc; i++) { AddTriangle(&(tout[i])); } - MemFree(tout); - MemFree(conv); + delete[] tout; + delete[] conv; } void SMesh::AddAgainstBsp(SMesh *srcm, SBsp3 *bsp3) { diff --git a/src/platform/utilunix.cpp b/src/platform/utilunix.cpp index 646affcca..9a48426db 100644 --- a/src/platform/utilunix.cpp +++ b/src/platform/utilunix.cpp @@ -1,8 +1,5 @@ //----------------------------------------------------------------------------- -// Utility functions used by the Unix port. Notably, our memory allocation; -// we use two separate allocators, one for long-lived stuff and one for -// stuff that gets freed after every regeneration of the model, to save us -// the trouble of freeing the latter explicitly. +// Utility functions used by the Unix port. // // Copyright 2008-2013 Jonathan Westhues. // Copyright 2013 Daniel Richard G. @@ -64,16 +61,6 @@ void FreeAllTemporary() { Head = NULL; } -void *MemAlloc(size_t n) { - void *p = malloc(n); - ssassert(p != NULL, "Cannot allocate memory"); - return p; -} - -void MemFree(void *p) { - free(p); -} - std::vector InitPlatform(int argc, char **argv) { std::vector args; args.reserve(argc); diff --git a/src/platform/utilwin.cpp b/src/platform/utilwin.cpp index 172039ae1..b3a7b52b6 100644 --- a/src/platform/utilwin.cpp +++ b/src/platform/utilwin.cpp @@ -1,8 +1,5 @@ //----------------------------------------------------------------------------- -// Utility functions that depend on Win32. Notably, our memory allocation; -// we use two separate allocators, one for long-lived stuff and one for -// stuff that gets freed after every regeneration of the model, to save us -// the trouble of freeing the latter explicitly. +// Utility functions that depend on Win32. // // Copyright 2008-2013 Jonathan Westhues. //----------------------------------------------------------------------------- @@ -53,15 +50,6 @@ void FreeAllTemporary() TempHeap = HeapCreate(HEAP_NO_SERIALIZE, 1024*1024*20, 0); } -void *MemAlloc(size_t n) { - void *p = malloc(n); - ssassert(p != NULL, "Cannot allocate memory"); - return p; -} -void MemFree(void *p) { - free(p); -} - std::vector InitPlatform(int argc, char **argv) { #if !defined(LIBRARY) && defined(_MSC_VER) // We display our own message on abort; just call ReportFault. diff --git a/src/solvespace.h b/src/solvespace.h index fea705e85..f0e6c0fd5 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -150,8 +150,6 @@ std::vector InitPlatform(int argc, char **argv); void *AllocTemporary(size_t n); void FreeAllTemporary(); -void *MemAlloc(size_t n); -void MemFree(void *p); // End of platform-specific functions //================ From a5d9264e849aa399e6226fed18b8cbfc1756797d Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 10 May 2020 07:21:16 +0000 Subject: [PATCH 041/646] Refactor InitPlatform. This commit performs three related cleanups: * The slvs library no longer uses explicit platform initialization (which drags in the side effects of InitPlatform that are not desirable in a library). Instead, it just ensures that it has the temporary heap, which is what it was callingInitPlatform for. * InitPlatform is simplified and moved to platform.cpp, next to other path related functions. * InitPlatform is renamed to InitCli and is called from InitGui implementations. GUI toolkits sometimes have options they use internally (that's the case for for GTK and Cocoa at least), and we shouldn't try to parse those as a file to open. --- bench/harness.cpp | 2 +- src/lib.cpp | 8 ++----- src/platform/entrycli.cpp | 2 +- src/platform/entrygui.cpp | 3 +-- src/platform/gui.h | 2 +- src/platform/guigtk.cpp | 8 ++++++- src/platform/guimac.mm | 6 ++++- src/platform/guinone.cpp | 4 +++- src/platform/guiwin.cpp | 6 ++++- src/platform/platform.cpp | 48 ++++++++++++++++++++++++++++++++++++--- src/platform/platform.h | 3 +++ src/platform/utilunix.cpp | 13 ----------- src/platform/utilwin.cpp | 30 ++---------------------- src/solvespace.h | 2 -- test/debugtool.cpp | 2 +- test/harness.cpp | 2 +- 16 files changed, 78 insertions(+), 63 deletions(-) diff --git a/bench/harness.cpp b/bench/harness.cpp index 1f625c6be..4180558ad 100644 --- a/bench/harness.cpp +++ b/bench/harness.cpp @@ -41,7 +41,7 @@ static bool RunBenchmark(std::function setupFn, } int main(int argc, char **argv) { - std::vector args = InitPlatform(argc, argv); + std::vector args = Platform::InitCli(argc, argv); std::string mode; Platform::Path filename; diff --git a/src/lib.cpp b/src/lib.cpp index c16206b1b..d1d54ff7f 100644 --- a/src/lib.cpp +++ b/src/lib.cpp @@ -11,8 +11,6 @@ Sketch SolveSpace::SK = {}; static System SYS; -static int IsInit = 0; - void SolveSpace::Platform::FatalError(const std::string &message) { fprintf(stderr, "%s", message.c_str()); abort(); @@ -69,10 +67,8 @@ void Slvs_MakeQuaternion(double ux, double uy, double uz, void Slvs_Solve(Slvs_System *ssys, Slvs_hGroup shg) { - if(!IsInit) { - InitPlatform(0, NULL); - IsInit = 1; - } + // Create the temporary heap, if this is the first time we're solving. + FreeAllTemporary(); int i; for(i = 0; i < ssys->params; i++) { diff --git a/src/platform/entrycli.cpp b/src/platform/entrycli.cpp index c9efbf1ae..95d60a97c 100644 --- a/src/platform/entrycli.cpp +++ b/src/platform/entrycli.cpp @@ -351,7 +351,7 @@ static bool RunCommand(const std::vector args) { } int main(int argc, char **argv) { - std::vector args = InitPlatform(argc, argv); + std::vector args = Platform::InitCli(argc, argv); if(args.size() == 1) { ShowUsage(args[0]); diff --git a/src/platform/entrygui.cpp b/src/platform/entrygui.cpp index 654d25eac..30fd44389 100644 --- a/src/platform/entrygui.cpp +++ b/src/platform/entrygui.cpp @@ -11,9 +11,8 @@ using namespace SolveSpace; int main(int argc, char** argv) { - std::vector args = InitPlatform(argc, argv); + std::vector args = Platform::InitGui(argc, argv); - Platform::InitGui(argc, argv); Platform::Open3DConnexion(); SS.Init(); diff --git a/src/platform/gui.h b/src/platform/gui.h index c5d082c17..85a2abd11 100644 --- a/src/platform/gui.h +++ b/src/platform/gui.h @@ -377,7 +377,7 @@ FileDialogRef CreateSaveFileDialog(WindowRef parentWindow); std::vector GetFontFiles(); void OpenInBrowser(const std::string &url); -void InitGui(int argc, char **argv); +std::vector InitGui(int argc, char **argv); void RunGui(); void ExitGui(); void ClearGui(); diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index 73fb01ec1..e68fd3040 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -1432,7 +1432,7 @@ void OpenInBrowser(const std::string &url) { Gtk::Main *gtkMain; -void InitGui(int argc, char **argv) { +std::vector InitGui(int argc, char **argv) { // It would in principle be possible to judiciously use Glib::filename_{from,to}_utf8, // but it's not really worth the effort. // The setlocale() call is necessary for Glib::get_charset() to detect the system @@ -1445,8 +1445,12 @@ void InitGui(int argc, char **argv) { } setlocale(LC_ALL, "C"); + // Let GTK parse arguments and update argc/argv. (They're passed by reference.) gtkMain = new Gtk::Main(argc, argv, /*set_locale=*/false); + // Now that GTK arguments are removed, grab arguments for ourselves. + std::vector args = InitCli(argc, argv); + // Add our application-specific styles, to override GTK defaults. Glib::RefPtr style_provider = Gtk::CssProvider::create(); style_provider->load_from_data(R"( @@ -1468,6 +1472,8 @@ void InitGui(int argc, char **argv) { if(!*langNames) { SetLocale("en_US"); } + + return args; } void RunGui() { diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index cb939cf74..47d67e0fb 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -1441,7 +1441,9 @@ - (void)applicationTerminatePrompt { static SSApplicationDelegate *ssDelegate; -void InitGui(int argc, char **argv) { +std::vector InitGui(int argc, char **argv) { + std::vector args = InitCli(argc, argv); + ssDelegate = [[SSApplicationDelegate alloc] init]; NSApplication.sharedApplication.delegate = ssDelegate; @@ -1454,6 +1456,8 @@ void InitGui(int argc, char **argv) { if(languages.count == 0) { SolveSpace::SetLocale("en_US"); } + + return args; } void RunGui() { diff --git a/src/platform/guinone.cpp b/src/platform/guinone.cpp index 85beae37f..ef3c6f3ba 100644 --- a/src/platform/guinone.cpp +++ b/src/platform/guinone.cpp @@ -148,7 +148,9 @@ std::vector GetFontFiles() { void OpenInBrowser(const std::string &url) {} -void InitGui(int argc, char **argv) {} +std::vector InitGui(int argc, char **argv) { + return {}; +} void RunGui() {} diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index 70160bbcc..8e40efccb 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1656,7 +1656,9 @@ void OpenInBrowser(const std::string &url) { ShellExecuteW(NULL, L"open", Widen(url).c_str(), NULL, NULL, SW_SHOWNORMAL); } -void InitGui(int argc, char **argv) { +std::vector InitGui(int argc, char **argv) { + std::vector args = InitCli(argc, argv); + INITCOMMONCONTROLSEX icc; icc.dwSize = sizeof(icc); icc.dwICC = ICC_STANDARD_CLASSES|ICC_BAR_CLASSES; @@ -1665,6 +1667,8 @@ void InitGui(int argc, char **argv) { if(!SetLocale((uint16_t)GetUserDefaultLCID())) { SetLocale("en_US"); } + + return args; } void RunGui() { diff --git a/src/platform/platform.cpp b/src/platform/platform.cpp index e2382d41b..9f8ff83ed 100644 --- a/src/platform/platform.cpp +++ b/src/platform/platform.cpp @@ -14,6 +14,7 @@ #if defined(WIN32) // Conversely, include Microsoft headers after solvespace.h to avoid clashes. # include +# include #else # include # include @@ -452,7 +453,7 @@ bool WriteFile(const Platform::Path &filename, const std::string &data) { } //----------------------------------------------------------------------------- -// Loading resources, on Windows +// Loading resources, on Windows. //----------------------------------------------------------------------------- #if defined(WIN32) @@ -470,7 +471,7 @@ const void *LoadResource(const std::string &name, size_t *size) { #endif //----------------------------------------------------------------------------- -// Loading resources, on *nix +// Loading resources, on *nix. //----------------------------------------------------------------------------- #if defined(__APPLE__) @@ -588,8 +589,49 @@ const void *LoadResource(const std::string &name, size_t *size) { #endif //----------------------------------------------------------------------------- -// Command-line argument handling +// Startup and command-line argument handling, on Windows. //----------------------------------------------------------------------------- +#if defined(WIN32) + +std::vector InitCli(int argc, char **argv) { +#if defined(_MSC_VER) + // We display our own message on abort; just call ReportFault. + _set_abort_behavior(_CALL_REPORTFAULT, _WRITE_ABORT_MSG|_CALL_REPORTFAULT); + int crtReportTypes[] = {_CRT_WARN, _CRT_ERROR, _CRT_ASSERT}; + for(int crtReportType : crtReportTypes) { + _CrtSetReportMode(crtReportType, _CRTDBG_MODE_FILE|_CRTDBG_MODE_DEBUG); + _CrtSetReportFile(crtReportType, _CRTDBG_FILE_STDERR); + } +#endif + + // Create the heap that we use to store Exprs and other temp stuff. + FreeAllTemporary(); + + // Extract the command-line arguments; the ones from main() are ignored, + // since they are in the OEM encoding. + int argcW; + LPWSTR *argvW = CommandLineToArgvW(GetCommandLineW(), &argcW); + std::vector args; + for(int i = 0; i < argcW; i++) + args.push_back(Platform::Narrow(argvW[i])); + LocalFree(argvW); + return args; +} + +#endif + +//----------------------------------------------------------------------------- +// Startup and command-line argument handling, on *nix. +//----------------------------------------------------------------------------- + +#if !defined(WIN32) + +std::vector InitCli(int argc, char **argv) { + return {&argv[0], &argv[argc]}; +} + +#endif + } } diff --git a/src/platform/platform.h b/src/platform/platform.h index 011dfcc4f..de3f985f0 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -64,6 +64,9 @@ void RemoveFile(const Platform::Path &filename); // Resource loading function. const void *LoadResource(const std::string &name, size_t *size); +// Startup and command-line argument handling. +std::vector InitCli(int argc, char **argv); + } #endif diff --git a/src/platform/utilunix.cpp b/src/platform/utilunix.cpp index 9a48426db..fb3833158 100644 --- a/src/platform/utilunix.cpp +++ b/src/platform/utilunix.cpp @@ -4,11 +4,7 @@ // Copyright 2008-2013 Jonathan Westhues. // Copyright 2013 Daniel Richard G. //----------------------------------------------------------------------------- -#include "config.h" #include "solvespace.h" -#if defined(HAVE_BACKTRACE) -# include BACKTRACE_HEADER -#endif namespace SolveSpace { @@ -61,13 +57,4 @@ void FreeAllTemporary() { Head = NULL; } -std::vector InitPlatform(int argc, char **argv) { - std::vector args; - args.reserve(argc); - for(int i = 0; i < argc; i++) { - args.emplace_back(argv[i]); - } - return args; -} - }; diff --git a/src/platform/utilwin.cpp b/src/platform/utilwin.cpp index b3a7b52b6..87a2fb076 100644 --- a/src/platform/utilwin.cpp +++ b/src/platform/utilwin.cpp @@ -7,10 +7,8 @@ // Include after solvespace.h to avoid identifier clashes. #include -#include namespace SolveSpace { -static HANDLE TempHeap; void dbp(const char *str, ...) { @@ -38,6 +36,8 @@ void dbp(const char *str, ...) // to be sloppy with our memory management, and just free everything at once // at the end. //----------------------------------------------------------------------------- +static HANDLE TempHeap; + void *AllocTemporary(size_t n) { void *v = HeapAlloc(TempHeap, HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, n); @@ -50,30 +50,4 @@ void FreeAllTemporary() TempHeap = HeapCreate(HEAP_NO_SERIALIZE, 1024*1024*20, 0); } -std::vector InitPlatform(int argc, char **argv) { -#if !defined(LIBRARY) && defined(_MSC_VER) - // We display our own message on abort; just call ReportFault. - _set_abort_behavior(_CALL_REPORTFAULT, _WRITE_ABORT_MSG|_CALL_REPORTFAULT); - int crtReportTypes[] = {_CRT_WARN, _CRT_ERROR, _CRT_ASSERT}; - for(int crtReportType : crtReportTypes) { - _CrtSetReportMode(crtReportType, _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG); - _CrtSetReportFile(crtReportType, _CRTDBG_FILE_STDERR); - } -#endif - - // Create the heap that we use to store Exprs and other temp stuff. - FreeAllTemporary(); - - // Extract the command-line arguments; the ones from main() are ignored, - // since they are in the OEM encoding. - int argcW; - LPWSTR *argvW = CommandLineToArgvW(GetCommandLineW(), &argcW); - std::vector args; - for(int i = 0; i < argcW; i++) { - args.push_back(Platform::Narrow(argvW[i])); - } - LocalFree(argvW); - return args; -} - } diff --git a/src/solvespace.h b/src/solvespace.h index f0e6c0fd5..2227fa7f7 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -146,8 +146,6 @@ void dbp(const char *str, ...); dbp("tri: (%.3f %.3f %.3f) (%.3f %.3f %.3f) (%.3f %.3f %.3f)", \ CO((tri).a), CO((tri).b), CO((tri).c)) -std::vector InitPlatform(int argc, char **argv); - void *AllocTemporary(size_t n); void FreeAllTemporary(); diff --git a/test/debugtool.cpp b/test/debugtool.cpp index 546a79cb8..aa66c1fee 100644 --- a/test/debugtool.cpp +++ b/test/debugtool.cpp @@ -6,7 +6,7 @@ #include "solvespace.h" int main(int argc, char **argv) { - std::vector args = InitPlatform(argc, argv); + std::vector args = Platform::InitCli(argc, argv); if(args.size() == 3 && args[1] == "expr") { std::string expr = args[2], err; diff --git a/test/harness.cpp b/test/harness.cpp index df7ada6ad..2eee03738 100644 --- a/test/harness.cpp +++ b/test/harness.cpp @@ -335,7 +335,7 @@ int Test::Case::Register(Test::Case testCase) { } int main(int argc, char **argv) { - std::vector args = InitPlatform(argc, argv); + std::vector args = Platform::InitCli(argc, argv); std::regex filter(".*"); if(args.size() == 1) { From fbdcdd8b20b5ffb7ec38196f5de2e2b3b858fbdf Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 10 May 2020 07:28:42 +0000 Subject: [PATCH 042/646] macOS: ignore spurious `-psn_` command line argument. Fixes #602. --- src/platform/guimac.mm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index 47d67e0fb..55116ea1b 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -1443,6 +1443,12 @@ - (void)applicationTerminatePrompt { std::vector InitGui(int argc, char **argv) { std::vector args = InitCli(argc, argv); + if(args.size() >= 2 && args[1].find("-psn_") == 0) { + // For unknown reasons, Finder passes a Carbon PSN (Process Serial Number) argument + // when a freshly downloaded application is run for the first time. Remove it so + // that it isn't interpreted as a filename. + args.erase(args.begin() + 1); + } ssDelegate = [[SSApplicationDelegate alloc] init]; NSApplication.sharedApplication.delegate = ssDelegate; From 66e76f3bc9edbf55fd7c056775bdeb63a8e36d51 Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 10 May 2020 08:28:01 +0000 Subject: [PATCH 043/646] Refactor dbp. NFC. After this commit, dbp() is renamed to DebugPrint() and moved to platform.cpp, next to other similar functions. The existing short name is provided by a preprocessor macro, similar to ssassert(). This leaves just the (rather hacky) temporary heap in util*.cpp. --- src/platform/platform.cpp | 48 +++++++++++++++++++++++++++++++++++++++ src/platform/platform.h | 3 +++ src/platform/utilunix.cpp | 11 --------- src/platform/utilwin.cpp | 20 ---------------- src/solvespace.h | 10 ++++---- 5 files changed, 56 insertions(+), 36 deletions(-) diff --git a/src/platform/platform.cpp b/src/platform/platform.cpp index 9f8ff83ed..308c3fb3e 100644 --- a/src/platform/platform.cpp +++ b/src/platform/platform.cpp @@ -633,5 +633,53 @@ std::vector InitCli(int argc, char **argv) { #endif +//----------------------------------------------------------------------------- +// Debug output, on *nix. +//----------------------------------------------------------------------------- + +#if defined(WIN32) + +void DebugPrint(const char *fmt, ...) +{ + va_list va; + va_start(va, fmt); + int len = _vscprintf(fmt, va) + 1; + va_end(va); + + va_start(va, fmt); + char *buf = (char *)_alloca(len); + _vsnprintf(buf, len, fmt, va); + va_end(va); + + // The native version of OutputDebugString, unlike most others, + // is OutputDebugStringA. + OutputDebugStringA(buf); + OutputDebugStringA("\n"); + +#ifndef NDEBUG + // Duplicate to stderr in debug builds, but not in release; this is slow. + fputs(buf, stderr); + fputc('\n', stderr); +#endif +} + +#endif + +//----------------------------------------------------------------------------- +// Debug output, on *nix. +//----------------------------------------------------------------------------- + +#if !defined(WIN32) + +void DebugPrint(const char *fmt, ...) { + va_list va; + va_start(va, fmt); + vfprintf(stderr, fmt, va); + fputc('\n', stderr); + va_end(va); +} + +#endif + } } diff --git a/src/platform/platform.h b/src/platform/platform.h index de3f985f0..adf622858 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -67,6 +67,9 @@ const void *LoadResource(const std::string &name, size_t *size); // Startup and command-line argument handling. std::vector InitCli(int argc, char **argv); +// Debug print function. +void DebugPrint(const char *fmt, ...); + } #endif diff --git a/src/platform/utilunix.cpp b/src/platform/utilunix.cpp index fb3833158..9a471c663 100644 --- a/src/platform/utilunix.cpp +++ b/src/platform/utilunix.cpp @@ -8,17 +8,6 @@ namespace SolveSpace { -void dbp(const char *fmt, ...) -{ - va_list va; - va_start(va, fmt); - vfprintf(stdout, fmt, va); - fputc('\n', stdout); - va_end(va); - - fflush(stdout); -} - //----------------------------------------------------------------------------- // A separate heap, on which we allocate expressions. Maybe a bit faster, // since fragmentation is less of a concern, and it also makes it possible diff --git a/src/platform/utilwin.cpp b/src/platform/utilwin.cpp index 87a2fb076..16bce1906 100644 --- a/src/platform/utilwin.cpp +++ b/src/platform/utilwin.cpp @@ -10,26 +10,6 @@ namespace SolveSpace { -void dbp(const char *str, ...) -{ - va_list f; - static char buf[1024*50]; - va_start(f, str); - _vsnprintf(buf, sizeof(buf), str, f); - va_end(f); - - // The native version of OutputDebugString, unlike most others, - // is OutputDebugStringA. - OutputDebugStringA(buf); - OutputDebugStringA("\n"); - -#ifndef NDEBUG - // Duplicate to stderr in debug builds, but not in release; this is slow. - fputs(buf, stderr); - fputc('\n', stderr); -#endif -} - //----------------------------------------------------------------------------- // A separate heap, on which we allocate expressions. Maybe a bit faster, // since no fragmentation issues whatsoever, and it also makes it possible diff --git a/src/solvespace.h b/src/solvespace.h index 2227fa7f7..7ca2e01b2 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -71,6 +71,11 @@ typedef struct _cairo_surface cairo_surface_t; } while(0) #endif +#define dbp SolveSpace::Platform::DebugPrint +#define DBPTRI(tri) \ + dbp("tri: (%.3f %.3f %.3f) (%.3f %.3f %.3f) (%.3f %.3f %.3f)", \ + CO((tri).a), CO((tri).b), CO((tri).c)) + #ifndef isnan # define isnan(x) (((x) != (x)) || (x > 1e11) || (x < -1e11)) #endif @@ -141,11 +146,6 @@ const size_t MAX_RECENT = 8; #define AUTOSAVE_EXT "slvs~" -void dbp(const char *str, ...); -#define DBPTRI(tri) \ - dbp("tri: (%.3f %.3f %.3f) (%.3f %.3f %.3f) (%.3f %.3f %.3f)", \ - CO((tri).a), CO((tri).b), CO((tri).c)) - void *AllocTemporary(size_t n); void FreeAllTemporary(); From 37a5099d55cd18c39df36354be6f2bd251417134 Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 10 May 2020 09:24:12 +0000 Subject: [PATCH 044/646] Various header cleanups. NFC. * Don't use a reserved identifier in include guards. * Use fabs() from instead of our own ffabs(). This shouldn't make any difference with modern toolchains. * Convert a few preprocessor macros to constexprs. --- src/platform/gui.h | 2 ++ src/resource.h | 5 +++-- src/solvespace.cpp | 8 ++++---- src/solvespace.h | 36 +++++++++++++----------------------- src/system.cpp | 12 ++++++------ 5 files changed, 28 insertions(+), 35 deletions(-) diff --git a/src/platform/gui.h b/src/platform/gui.h index 85a2abd11..05dbb7a56 100644 --- a/src/platform/gui.h +++ b/src/platform/gui.h @@ -7,6 +7,8 @@ #ifndef SOLVESPACE_GUI_H #define SOLVESPACE_GUI_H +class RgbaColor; + namespace Platform { //----------------------------------------------------------------------------- diff --git a/src/resource.h b/src/resource.h index bb0e1c7a9..18c1e5821 100644 --- a/src/resource.h +++ b/src/resource.h @@ -4,13 +4,14 @@ // Copyright 2016 whitequark //----------------------------------------------------------------------------- -#ifndef __RESOURCE_H -#define __RESOURCE_H +#ifndef SOLVESPACE_RESOURCE_H +#define SOLVESPACE_RESOURCE_H class Camera; class Point2d; class Pixmap; class Vector; +class RgbaColor; std::string LoadString(const std::string &name); std::string LoadStringFromGzip(const std::string &name); diff --git a/src/solvespace.cpp b/src/solvespace.cpp index a3a53caac..042194c5d 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -151,7 +151,7 @@ void SolveSpaceUI::Init() { } bool SolveSpaceUI::LoadAutosaveFor(const Platform::Path &filename) { - Platform::Path autosaveFile = filename.WithExtension(AUTOSAVE_EXT); + Platform::Path autosaveFile = filename.WithExtension(BACKUP_EXT); FILE *f = OpenFile(autosaveFile, "rb"); if(!f) @@ -474,7 +474,7 @@ bool SolveSpaceUI::GetFilenameAndSave(bool saveAs) { if(saveAs || saveFile.IsEmpty()) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(GW.window); - dialog->AddFilter(C_("file-type", "SolveSpace models"), { "slvs" }); + dialog->AddFilter(C_("file-type", "SolveSpace models"), { SKETCH_EXT }); dialog->ThawChoices(settings, "Sketch"); if(!newSaveFile.IsEmpty()) { dialog->SetFilename(newSaveFile); @@ -503,13 +503,13 @@ void SolveSpaceUI::Autosave() ScheduleAutosave(); if(!saveFile.IsEmpty() && unsaved) { - SaveToFile(saveFile.WithExtension(AUTOSAVE_EXT)); + SaveToFile(saveFile.WithExtension(BACKUP_EXT)); } } void SolveSpaceUI::RemoveAutosave() { - Platform::Path autosaveFile = saveFile.WithExtension(AUTOSAVE_EXT); + Platform::Path autosaveFile = saveFile.WithExtension(BACKUP_EXT); RemoveFile(autosaveFile); } diff --git a/src/solvespace.h b/src/solvespace.h index 7ca2e01b2..7b3e0020b 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -85,6 +85,7 @@ namespace SolveSpace { using std::min; using std::max; using std::swap; +using std::fabs; #if defined(__GNUC__) __attribute__((noreturn)) @@ -116,44 +117,31 @@ inline double WRAP_SYMMETRIC(double v, double n) { return v; } -// Why is this faster than the library function? -inline double ffabs(double v) { return (v > 0) ? v : (-v); } - #define CO(v) (v).x, (v).y, (v).z -#define ANGLE_COS_EPS (1e-6) -#define LENGTH_EPS (1e-6) -#define VERY_POSITIVE (1e10) -#define VERY_NEGATIVE (-1e10) +static constexpr double ANGLE_COS_EPS = 1e-6; +static constexpr double LENGTH_EPS = 1e-6; +static constexpr double VERY_POSITIVE = 1e10; +static constexpr double VERY_NEGATIVE = -1e10; inline double Random(double vmax) { return (vmax*rand()) / RAND_MAX; } +#include "platform/platform.h" +#include "platform/gui.h" +#include "resource.h" + class Expr; class ExprVector; class ExprQuaternion; class RgbaColor; enum class Command : uint32_t; -//================ -// From the platform-specific code. - -#include "platform/platform.h" -#include "platform/gui.h" - -const size_t MAX_RECENT = 8; - -#define AUTOSAVE_EXT "slvs~" - +// Temporary heap, defined in the platform-specific code. void *AllocTemporary(size_t n); void FreeAllTemporary(); -// End of platform-specific functions -//================ - -#include "resource.h" - enum class Unit : uint32_t { MM = 0, INCHES, @@ -670,7 +658,9 @@ class SolveSpaceUI { static void MenuFile(Command id); void Autosave(); void RemoveAutosave(); - static const size_t MAX_RECENT = 8; + static constexpr size_t MAX_RECENT = 8; + static constexpr const char *SKETCH_EXT = "slvs"; + static constexpr const char *BACKUP_EXT = "slvs~"; std::vector recentFiles; bool Load(const Platform::Path &filename); bool GetFilenameAndSave(bool saveAs); diff --git a/src/system.cpp b/src/system.cpp index 08752600c..9c64b3084 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -187,15 +187,15 @@ bool System::SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS], // greater. First, find a pivot (between rows i and N-1). max = 0; for(ip = i; ip < n; ip++) { - if(ffabs(A[ip][i]) > max) { + if(fabs(A[ip][i]) > max) { imax = ip; - max = ffabs(A[ip][i]); + 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(ffabs(max) < 1e-20) continue; + if(fabs(max) < 1e-20) continue; // Swap row imax with row i for(jp = 0; jp < n; jp++) { @@ -217,7 +217,7 @@ bool System::SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS], // 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(ffabs(A[i][i]) < 1e-20) continue; + if(fabs(A[i][i]) < 1e-20) continue; temp = B[i]; for(j = n - 1; j > i; j--) { @@ -309,7 +309,7 @@ bool System::NewtonSolve(int tag) { if(isnan(mat.B.num[i])) { return false; } - if(ffabs(mat.B.num[i]) > CONVERGE_TOLERANCE) { + if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE) { converged = false; break; } @@ -493,7 +493,7 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad, SK.constraint.ClearTags(); // Not using range-for here because index is used in additional ways for(i = 0; i < eq.n; i++) { - if(ffabs(mat.B.num[i]) > CONVERGE_TOLERANCE || isnan(mat.B.num[i])) { + if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE || isnan(mat.B.num[i])) { // This constraint is unsatisfied. if(!mat.eq[i].isFromConstraint()) continue; From 5b5db0a357ee70236d9a325f5965f0996b6bfa85 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 10 May 2020 14:28:49 +0300 Subject: [PATCH 045/646] Update changelog f7b6f6930e06680d7429bb130a0fb5b77708bff7 162897eca70c1a7de02119aff596992787835555 14e095c93aeeb1e23959e4615549af47c5cc79e3 --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a5df02a20..32dfd9052 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -122,7 +122,9 @@ Bugs fixed: them, such that their constraints are retained. * When linking a sketch file, missing custom styles are now imported from the linked file. - * 3Dconnexion SpaceMouse should now work (on Windows). + * 3Dconnexion SpaceMouse should now work (on Windows and macOS X). + * Improved NURBS boolean operations on curved surfaces in some cases. + * Show only usable fonts in the font selector. 2.x --- From f229cf0822e1258a806ba456e7c3c330c07e4d9a Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 10 May 2020 14:35:21 +0300 Subject: [PATCH 046/646] Fix typo. NFC. --- src/platform/platform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/platform.cpp b/src/platform/platform.cpp index 308c3fb3e..974cce620 100644 --- a/src/platform/platform.cpp +++ b/src/platform/platform.cpp @@ -634,7 +634,7 @@ std::vector InitCli(int argc, char **argv) { #endif //----------------------------------------------------------------------------- -// Debug output, on *nix. +// Debug output, on Windows. //----------------------------------------------------------------------------- #if defined(WIN32) From a723dd6c4b1b6c529566c3bb6b21dcc73f3044aa Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 10 May 2020 14:41:16 +0300 Subject: [PATCH 047/646] Expand "edit newly added dimensions" to edit "Length Ratio" and "Length Difference" --- src/constraint.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/constraint.cpp b/src/constraint.cpp index fb5c74cb8..3f861b8cd 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -763,7 +763,9 @@ void Constraint::MenuConstrain(Command id) { } } - if ((id == Command::DISTANCE_DIA || id == Command::ANGLE) && SS.immediatelyEditDimension) { + if((id == Command::DISTANCE_DIA || id == Command::ANGLE || + id == Command::RATIO || id == Command::DIFFERENCE) && + SS.immediatelyEditDimension) { SS.GW.EditConstraint(c.h); } From 89194d56fa768a7bb9a2fe1e69fbc89d273d5b61 Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 10 May 2020 11:57:50 +0000 Subject: [PATCH 048/646] Win32: when building with MSVC, require VS2015. VS2013 does not have constexpr support and in general is quite buggy. There's no reason to use it anymore as even XP toolsets are available for VS2015 and VS2017. --- README.md | 4 +++- appveyor.yml | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5e0f72d57..e6b229b75 100644 --- a/README.md +++ b/README.md @@ -203,7 +203,9 @@ by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation. Building on Windows ------------------- -You will need [git][gitwin], [cmake][cmakewin] and Visual C++. +You will need [git][gitwin], [cmake][cmakewin] and a C++ compiler +(either Visual C++ or MinGW). If using Visual C++, Visual Studio 2015 +or later is required. ### Building with Visual Studio IDE diff --git a/appveyor.yml b/appveyor.yml index bb4c6d9b2..e2c632a95 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,7 +5,7 @@ before_build: - set tag=x%APPVEYOR_REPO_TAG_NAME% - if %tag:~,2% == xv (set BUILD_TYPE=RelWithDebInfo) else (set BUILD_TYPE=Debug) - mkdir build - - cmake -G"Visual Studio 12" -Tv120 -Bbuild -H. + - cmake -G"Visual Studio 14" -Tv140 -Bbuild -H. build_script: - msbuild "build\src\solvespace.vcxproj" /verbosity:minimal /property:Configuration=%BUILD_TYPE% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - msbuild "build\src\solvespace-cli.vcxproj" /verbosity:minimal /property:Configuration=%BUILD_TYPE% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" From a507f9ea788a35650e7719f3d9fc7f97ac154408 Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 8 May 2020 03:48:19 +0300 Subject: [PATCH 049/646] NURBS: Add intersection boolean operation. The NURBS operation is properly implemented. ToDo: The mesh operation in SMesh::MakeFromIntersectionOf is still done as C=A-(A-B). Implements: https://github.com/solvespace/solvespace/issues/35 --- CHANGELOG.md | 1 + src/groupmesh.cpp | 24 +++++++++++++++++------- src/mesh.cpp | 17 +++++++++++++++++ src/polygon.h | 1 + src/sketch.h | 3 ++- src/srf/boolean.cpp | 26 ++++++++++++++++++++------ src/srf/surface.h | 3 ++- src/textscreens.cpp | 23 ++++++++++++++++++----- 8 files changed, 78 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32dfd9052..a3845fd23 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Changelog --- New sketch features: + * New intersection boolean operation for solid models. * New groups, revolution and helical extrusion. * Extrude, lathe, translate and rotate groups can use the "assembly" boolean operation, to increase performance. diff --git a/src/groupmesh.cpp b/src/groupmesh.cpp index b2e390e14..8117834ef 100644 --- a/src/groupmesh.cpp +++ b/src/groupmesh.cpp @@ -143,7 +143,7 @@ void Group::GenerateForStepAndRepeat(T *steps, T *outs, Group::CombineAs forWhat // And tack this transformed copy on to the return. if(soFar->IsEmpty()) { scratch->MakeFromCopyOf(&transd); - } else if (forWhat == CombineAs::ASSEMBLE) { + } else if(forWhat == CombineAs::ASSEMBLE) { scratch->MakeFromAssemblyOf(soFar, &transd); } else { scratch->MakeFromUnionOf(soFar, &transd); @@ -170,12 +170,22 @@ void Group::GenerateForBoolean(T *prevs, T *thiss, T *outs, Group::CombineAs how // So our group's shell appears in thisShell. Combine this with the // previous group's shell, using the requested operation. - if(how == CombineAs::UNION) { - outs->MakeFromUnionOf(prevs, thiss); - } else if(how == CombineAs::DIFFERENCE) { - outs->MakeFromDifferenceOf(prevs, thiss); - } else { - outs->MakeFromAssemblyOf(prevs, thiss); + switch(how) { + case CombineAs::UNION: + outs->MakeFromUnionOf(prevs, thiss); + break; + + case CombineAs::DIFFERENCE: + outs->MakeFromDifferenceOf(prevs, thiss); + break; + + case CombineAs::INTERSECTION: + outs->MakeFromIntersectionOf(prevs, thiss); + break; + + case CombineAs::ASSEMBLE: + outs->MakeFromAssemblyOf(prevs, thiss); + break; } } diff --git a/src/mesh.cpp b/src/mesh.cpp index 047d61126..0a8478ab9 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -286,6 +286,23 @@ void SMesh::MakeFromDifferenceOf(SMesh *a, SMesh *b) { AddAgainstBsp(a, bspb); } +void SMesh::MakeFromIntersectionOf(SMesh *a, SMesh *b) { + // Emulate triangle mesh intersection with difference + // by doing C=A-(A-B). Figure out how to do it properly later. + SMesh c = {}; + c.MakeFromDifferenceOf(a, b); + MakeFromDifferenceOf(a, &c); + + c.Clear(); + +/* SBsp3 *bspa = SBsp3::FromMesh(a); + SBsp3 *bspb = SBsp3::FromMesh(b); + + AddAgainstBsp(a, bspb); + AddAgainstBsp(b, bspa); +*/ +} + void SMesh::MakeFromCopyOf(SMesh *a) { ssassert(this != a, "Can't make from copy of self"); for(int i = 0; i < a->l.n; i++) { diff --git a/src/polygon.h b/src/polygon.h index 948106f7c..a2afafece 100644 --- a/src/polygon.h +++ b/src/polygon.h @@ -269,6 +269,7 @@ class SMesh { void AddAgainstBsp(SMesh *srcm, SBsp3 *bsp3); void MakeFromUnionOf(SMesh *a, SMesh *b); void MakeFromDifferenceOf(SMesh *a, SMesh *b); + void MakeFromIntersectionOf(SMesh *a, SMesh *b); void MakeFromCopyOf(SMesh *a); void MakeFromTransformationOf(SMesh *a, Vector trans, diff --git a/src/sketch.h b/src/sketch.h index a4ef89a4f..72cda7eb8 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -239,7 +239,8 @@ class Group { enum class CombineAs : uint32_t { UNION = 0, DIFFERENCE = 1, - ASSEMBLE = 2 + ASSEMBLE = 2, + INTERSECTION = 3 }; CombineAs meshCombine; diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index f01ce625b..5ee54ff66 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -1,6 +1,6 @@ //----------------------------------------------------------------------------- -// Top-level functions to compute the Boolean union or difference between -// two shells of rational polynomial surfaces. +// Top-level functions to compute the Boolean union, difference or intersection +// between two shells of rational polynomial surfaces. // // Copyright 2008-2013 Jonathan Westhues. //----------------------------------------------------------------------------- @@ -16,6 +16,10 @@ void SShell::MakeFromDifferenceOf(SShell *a, SShell *b) { MakeFromBoolean(a, b, SSurface::CombineAs::DIFFERENCE); } +void SShell::MakeFromIntersectionOf(SShell *a, SShell *b) { + MakeFromBoolean(a, b, SSurface::CombineAs::INTERSECTION); +} + //----------------------------------------------------------------------------- // Take our original pwl curve. Wherever an edge intersects a surface within // either agnstA or agnstB, split the piecewise linear element. Then refine @@ -213,6 +217,13 @@ static bool KeepRegion(SSurface::CombineAs type, bool opA, SShell::Class shell, return inShell || inSame; } + case SSurface::CombineAs::INTERSECTION: + if(opA) { + return inShell; + } else { + return inShell || inSame; + } + default: ssassert(false, "Unexpected combine type"); } } @@ -463,7 +474,10 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, // point opposite to the surface normal. bool bkwds = true; if((tn.Cross(b.Minus(a))).Dot(sn) < 0) bkwds = !bkwds; - if(type == SSurface::CombineAs::DIFFERENCE && !opA) bkwds = !bkwds; + if((type == SSurface::CombineAs::DIFFERENCE && !opA) || + (type == SSurface::CombineAs::INTERSECTION)) { // Invert all newly created edges for intersection + bkwds = !bkwds; + } if(bkwds) { inter.AddEdge(tb, ta, sc->h.v, 1); } else { @@ -573,7 +587,7 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, // we can get duplicate edges if our surface intersects the other shell // at an edge, so that both surfaces intersect coincident (and both // generate an intersection edge). - final.CullExtraneousEdges(); + final.CullExtraneousEdges(/*both=*/true); // Use our reassembled edges to trim the new surface. ret.TrimFromEdgeList(&final, /*asUv=*/true); @@ -849,14 +863,14 @@ void SBspUv::InsertEdge(Point2d ea, Point2d eb, SSurface *srf) { m->more = more; more = m; } else if(fabs(dea) < LENGTH_EPS) { - // Point A lies on this lie, but point B does not + // Point A lies on this line, but point B does not if(deb > 0) { pos = InsertOrCreateEdge(pos, ea, eb, srf); } else { neg = InsertOrCreateEdge(neg, ea, eb, srf); } } else if(fabs(deb) < LENGTH_EPS) { - // Point B lies on this lie, but point A does not + // Point B lies on this line, but point A does not if(dea > 0) { pos = InsertOrCreateEdge(pos, ea, eb, srf); } else { diff --git a/src/srf/surface.h b/src/srf/surface.h index 6fabf66ac..a076f0828 100644 --- a/src/srf/surface.h +++ b/src/srf/surface.h @@ -256,7 +256,7 @@ class SSurface { enum class CombineAs : uint32_t { UNION = 10, DIFFERENCE = 11, - INTERSECT = 12 + INTERSECTION = 12 }; int tag; @@ -386,6 +386,7 @@ class SShell { void MakeFirstOrderRevolvedSurfaces(Vector pt, Vector axis, int i0); void MakeFromUnionOf(SShell *a, SShell *b); void MakeFromDifferenceOf(SShell *a, SShell *b); + void MakeFromIntersectionOf(SShell *a, SShell *b); void MakeFromBoolean(SShell *a, SShell *b, SSurface::CombineAs type); void CopyCurvesSplitAgainst(bool opA, SShell *agnst, SShell *into); void CopySurfacesTrimAgainst(SShell *sha, SShell *shb, SShell *into, SSurface::CombineAs type); diff --git a/src/textscreens.cpp b/src/textscreens.cpp index 1ea8f1330..e35c49f04 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -210,11 +210,19 @@ void TextWindow::ScreenChangeGroupOption(int link, uint32_t v) { if(g->type == Group::Type::EXTRUDE) { // When an extrude group is first created, it's positioned for a union // extrusion. If no constraints were added, flip it when we switch between - // union and difference modes to avoid manual work doing the same. - if(g->meshCombine != (Group::CombineAs)v && g->GetNumConstraints() == 0 && - ((Group::CombineAs)v == Group::CombineAs::DIFFERENCE || - g->meshCombine == Group::CombineAs::DIFFERENCE)) { - g->ExtrusionForceVectorTo(g->ExtrusionGetVector().Negated()); + // union/assemble and difference/intersection modes to avoid manual work doing the same. + if(g->meshCombine != (Group::CombineAs)v && g->GetNumConstraints() == 0) { + // I apologise for his if statement + if(((Group::CombineAs::DIFFERENCE == g->meshCombine || + Group::CombineAs::INTERSECTION == g->meshCombine) && + (Group::CombineAs::DIFFERENCE != (Group::CombineAs)v && + Group::CombineAs::INTERSECTION != (Group::CombineAs)v)) || + ((Group::CombineAs::DIFFERENCE != g->meshCombine && + Group::CombineAs::INTERSECTION != g->meshCombine) && + (Group::CombineAs::DIFFERENCE == (Group::CombineAs)v || + Group::CombineAs::INTERSECTION == (Group::CombineAs)v))) { + g->ExtrusionForceVectorTo(g->ExtrusionGetVector().Negated()); + } } } g->meshCombine = (Group::CombineAs)v; @@ -375,11 +383,13 @@ void TextWindow::ShowGroupInfo() { g->type == Group::Type::HELIX) { bool un = (g->meshCombine == Group::CombineAs::UNION); bool diff = (g->meshCombine == Group::CombineAs::DIFFERENCE); + bool intr = (g->meshCombine == Group::CombineAs::INTERSECTION); bool asy = (g->meshCombine == Group::CombineAs::ASSEMBLE); Printf(false, " %Ftsolid model as"); Printf(false, "%Ba %f%D%Lc%Fd%s union%E " "%f%D%Lc%Fd%s difference%E " + "%f%D%Lc%Fd%s intersection%E " "%f%D%Lc%Fd%s assemble%E ", &TextWindow::ScreenChangeGroupOption, Group::CombineAs::UNION, @@ -388,6 +398,9 @@ void TextWindow::ShowGroupInfo() { Group::CombineAs::DIFFERENCE, diff ? RADIO_TRUE : RADIO_FALSE, &TextWindow::ScreenChangeGroupOption, + Group::CombineAs::INTERSECTION, + intr ? RADIO_TRUE : RADIO_FALSE, + &TextWindow::ScreenChangeGroupOption, Group::CombineAs::ASSEMBLE, (asy ? RADIO_TRUE : RADIO_FALSE)); From 1dc3ad85b7569effa1cd8c8a92371a17ea044536 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 10 May 2020 03:35:53 +0300 Subject: [PATCH 050/646] Intersection boolen in triangle mesh mode is properly implemented In addition the union operation in tiangle mesh mode is changed to keep coplanar faces the same way as the NURBS union does. Finalizes: https://github.com/solvespace/solvespace/issues/35 --- src/bsp.cpp | 35 +++++++++++++++++++++++------------ src/mesh.cpp | 26 +++++++++++++------------- src/polygon.h | 1 + 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/bsp.cpp b/src/bsp.cpp index 9dcaace9b..bac5ff303 100644 --- a/src/bsp.cpp +++ b/src/bsp.cpp @@ -62,14 +62,17 @@ void SBsp3::InsertInPlane(bool pos2, STriangle *tr, SMesh *m) { ll = ll->more; } - if(m->flipNormal && ((!pos2 && !onFace) || - (onFace && !sameNormal && m->keepCoplanar))) - { - m->AddTriangle(tr->meta, tr->c, tr->b, tr->a); - } else if(!(m->flipNormal) && ((pos2 && !onFace) || - (onFace && sameNormal && m->keepCoplanar))) - { - m->AddTriangle(tr->meta, tr->a, tr->b, tr->c); + if((!onFace && ((m->keepInsideOtherShell && !pos2) || + (!m->keepInsideOtherShell && pos2))) || + (onFace && ((m->keepCoplanar && m->flipNormal && !sameNormal) || + (m->keepCoplanar && !m->flipNormal && sameNormal)))) { + // We have decided that we need to keep a triangle either inside, + // outside or on the other shell. So add it and flip it if requested. + if(!(m->flipNormal)) { + m->AddTriangle(tr->meta, tr->a, tr->b, tr->c); + } else { + m->AddTriangle(tr->meta, tr->c, tr->b, tr->a); + } } else { m->atLeastOneDiscarded = true; } @@ -101,10 +104,15 @@ void SBsp3::InsertHow(BspClass how, STriangle *tr, SMesh *instead) { return; alt: - if(how == BspClass::POS && !(instead->flipNormal)) { - instead->AddTriangle(tr->meta, tr->a, tr->b, tr->c); - } else if(how == BspClass::NEG && instead->flipNormal) { - instead->AddTriangle(tr->meta, tr->c, tr->b, tr->a); + if(((BspClass::POS == how) && !instead->keepInsideOtherShell) || + ((BspClass::NEG == how) && instead->keepInsideOtherShell)) { + // We have decided that we need to keep a triangle (either inside or + // outside the other shell. So add it and flip it if requested. + if(!(instead->flipNormal)) { + instead->AddTriangle(tr->meta, tr->a, tr->b, tr->c); + } else { + instead->AddTriangle(tr->meta, tr->c, tr->b, tr->a); + } } else if(how == BspClass::COPLANAR) { if(edges) { edges->InsertTriangle(tr, instead, this); @@ -431,6 +439,9 @@ SBsp3 *SBsp3::InsertConvex(STriMeta meta, Vector *vertex, size_t cnt, SMesh *ins SBsp3 *SBsp3::InsertOrCreate(SBsp3 *where, STriangle *tr, SMesh *instead) { if(where == NULL) { if(instead) { + // ruevs: I do not think this code is reachable, but in + // principle should we use instead->keepInsideOtherShell + // in place of instead->flipNormal ? if(instead->flipNormal) { instead->atLeastOneDiscarded = true; } else { diff --git a/src/mesh.cpp b/src/mesh.cpp index 0a8478ab9..1ef6c1766 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -265,11 +265,12 @@ void SMesh::MakeFromUnionOf(SMesh *a, SMesh *b) { SBsp3 *bspb = SBsp3::FromMesh(b); flipNormal = false; - keepCoplanar = false; - AddAgainstBsp(b, bspa); + keepInsideOtherShell = false; - flipNormal = false; keepCoplanar = true; + AddAgainstBsp(b, bspa); + + keepCoplanar = false; AddAgainstBsp(a, bspb); } @@ -279,28 +280,27 @@ void SMesh::MakeFromDifferenceOf(SMesh *a, SMesh *b) { flipNormal = true; keepCoplanar = true; + keepInsideOtherShell = true; AddAgainstBsp(b, bspa); flipNormal = false; keepCoplanar = false; + keepInsideOtherShell = false; AddAgainstBsp(a, bspb); } void SMesh::MakeFromIntersectionOf(SMesh *a, SMesh *b) { - // Emulate triangle mesh intersection with difference - // by doing C=A-(A-B). Figure out how to do it properly later. - SMesh c = {}; - c.MakeFromDifferenceOf(a, b); - MakeFromDifferenceOf(a, &c); - - c.Clear(); - -/* SBsp3 *bspa = SBsp3::FromMesh(a); + SBsp3 *bspa = SBsp3::FromMesh(a); SBsp3 *bspb = SBsp3::FromMesh(b); + keepInsideOtherShell = true; + flipNormal = false; + + keepCoplanar = false; AddAgainstBsp(a, bspb); + + keepCoplanar = true; AddAgainstBsp(b, bspa); -*/ } void SMesh::MakeFromCopyOf(SMesh *a) { diff --git a/src/polygon.h b/src/polygon.h index a2afafece..66023eb2b 100644 --- a/src/polygon.h +++ b/src/polygon.h @@ -252,6 +252,7 @@ class SMesh { List l; bool flipNormal; + bool keepInsideOtherShell; bool keepCoplanar; bool atLeastOneDiscarded; bool isTransparent; From 280191561b0eaaffce9a90d1d0cc50ef5b46424a Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 10 May 2020 05:22:51 +0300 Subject: [PATCH 051/646] UI: Fix the logic for switching between union/assemble and difference/intersection The logic that is flipping the extrusions was working by chance. --- src/textscreens.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/textscreens.cpp b/src/textscreens.cpp index e35c49f04..23eece601 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -212,15 +212,15 @@ void TextWindow::ScreenChangeGroupOption(int link, uint32_t v) { // extrusion. If no constraints were added, flip it when we switch between // union/assemble and difference/intersection modes to avoid manual work doing the same. if(g->meshCombine != (Group::CombineAs)v && g->GetNumConstraints() == 0) { - // I apologise for his if statement - if(((Group::CombineAs::DIFFERENCE == g->meshCombine || - Group::CombineAs::INTERSECTION == g->meshCombine) && - (Group::CombineAs::DIFFERENCE != (Group::CombineAs)v && - Group::CombineAs::INTERSECTION != (Group::CombineAs)v)) || - ((Group::CombineAs::DIFFERENCE != g->meshCombine && - Group::CombineAs::INTERSECTION != g->meshCombine) && - (Group::CombineAs::DIFFERENCE == (Group::CombineAs)v || - Group::CombineAs::INTERSECTION == (Group::CombineAs)v))) { + // I apologise for this if statement + if((((Group::CombineAs::DIFFERENCE == g->meshCombine) || + (Group::CombineAs::INTERSECTION == g->meshCombine)) && + (Group::CombineAs::DIFFERENCE != (Group::CombineAs)v) && + (Group::CombineAs::INTERSECTION != (Group::CombineAs)v)) || + ((Group::CombineAs::DIFFERENCE != g->meshCombine) && + (Group::CombineAs::INTERSECTION != g->meshCombine) && + ((Group::CombineAs::DIFFERENCE == (Group::CombineAs)v) || + (Group::CombineAs::INTERSECTION == (Group::CombineAs)v)))) { g->ExtrusionForceVectorTo(g->ExtrusionGetVector().Negated()); } } From 8c40da5730b92c4810c329b519ac11a077afb93c Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 10 May 2020 22:46:55 +0300 Subject: [PATCH 052/646] UI: split "union assemble" and "difference intersection" on two lines. --- src/textscreens.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/textscreens.cpp b/src/textscreens.cpp index 23eece601..c060eff34 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -388,21 +388,21 @@ void TextWindow::ShowGroupInfo() { Printf(false, " %Ftsolid model as"); Printf(false, "%Ba %f%D%Lc%Fd%s union%E " - "%f%D%Lc%Fd%s difference%E " - "%f%D%Lc%Fd%s intersection%E " "%f%D%Lc%Fd%s assemble%E ", &TextWindow::ScreenChangeGroupOption, Group::CombineAs::UNION, un ? RADIO_TRUE : RADIO_FALSE, &TextWindow::ScreenChangeGroupOption, + Group::CombineAs::ASSEMBLE, + (asy ? RADIO_TRUE : RADIO_FALSE)); + Printf(false, "%Ba %f%D%Lc%Fd%s difference%E " + "%f%D%Lc%Fd%s intersection%E ", + &TextWindow::ScreenChangeGroupOption, Group::CombineAs::DIFFERENCE, diff ? RADIO_TRUE : RADIO_FALSE, &TextWindow::ScreenChangeGroupOption, Group::CombineAs::INTERSECTION, - intr ? RADIO_TRUE : RADIO_FALSE, - &TextWindow::ScreenChangeGroupOption, - Group::CombineAs::ASSEMBLE, - (asy ? RADIO_TRUE : RADIO_FALSE)); + intr ? RADIO_TRUE : RADIO_FALSE); if(g->type == Group::Type::EXTRUDE || g->type == Group::Type::LATHE || g->type == Group::Type::REVOLVE || g->type == Group::Type::HELIX) { From accbe9444b80aac29fe2787b36a16f0ddfef0bd6 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 11 May 2020 10:19:38 -0400 Subject: [PATCH 053/646] Split quads based on angle. --- src/srf/triangulate.cpp | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index b4ea24110..3ebb2bc8b 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -443,6 +443,7 @@ void SPolygon::UvGridTriangulateInto(SMesh *mesh, SSurface *srf) { // generate two triangles in the mesh, and cut it out of our polygon. // Quads around the perimeter would be rejected by AnyEdgeCrossings. std::vector bottom(lj.n, false); // did we use this quad? + Vector tu = {0,0,0}, tv = {0,0,0}; int i, j; for(i = 1; i < (li.n-1); i++) { bool prev_flag = false; @@ -480,16 +481,28 @@ void SPolygon::UvGridTriangulateInto(SMesh *mesh, SSurface *srf) { if (this_flag) { // Add the quad to our mesh - STriangle tr = {}; - tr.a = a; - tr.b = b; - tr.c = c; - mesh->AddTriangle(&tr); - tr.a = a; - tr.b = c; - tr.c = d; - mesh->AddTriangle(&tr); - + srf->TangentsAt(us,vs, &tu,&tv); + if (tu.Dot(tv) < 0.0) { //split the other way if angle>90 + STriangle tr = {}; + tr.a = a; + tr.b = b; + tr.c = c; + mesh->AddTriangle(&tr); + tr.a = a; + tr.b = c; + tr.c = d; + mesh->AddTriangle(&tr); + } else{ + STriangle tr = {}; + tr.a = a; + tr.b = b; + tr.c = d; + mesh->AddTriangle(&tr); + tr.a = b; + tr.b = c; + tr.c = d; + mesh->AddTriangle(&tr); + } if (!prev_flag) // add our own left edge holes.AddEdge(d, a); if (!bottom[j]) // add our own bottom edge From f19af61c0d2155ca37b4276f0851aa0ea907a86c Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 11 May 2020 14:57:02 -0400 Subject: [PATCH 054/646] Use omp critical to simplify parallel triangulation. NFC. --- src/srf/surface.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp index a7be96825..6afcc791b 100644 --- a/src/srf/surface.cpp +++ b/src/srf/surface.cpp @@ -1050,16 +1050,12 @@ void SShell::MakeSectionEdgesInto(Vector n, double d, SEdgeList *sel, SBezierLis } void SShell::TriangulateInto(SMesh *sm) { - std::vector tm(surface.n); - #pragma omp parallel for for(int i=0; iTriangulateInto(this, &tm[i]); - } - - // merge the per-surface meshes - for (auto& m : tm) { + SMesh m; + s->TriangulateInto(this, &m); + #pragma omp critical sm->MakeFromCopyOf(&m); m.Clear(); } From 99385ac9689fb93d4e2a6dd2c044d7fffc97346d Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Tue, 12 May 2020 15:49:19 +0200 Subject: [PATCH 055/646] Use C++ instead of C versions of standard library headers. We use std::fabs, but doesn't provide it; it worked by accident. Include that provides std::fabs, and switch all other headers to their C++ variants, too. --- src/solvespace.h | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/solvespace.h b/src/solvespace.h index 7b3e0020b..3a535a5ac 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -7,16 +7,16 @@ #ifndef SOLVESPACE_H #define SOLVESPACE_H -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include From 22f581831378f8c83aa909d9dc96c1ce89712495 Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 12 May 2020 13:59:23 +0000 Subject: [PATCH 056/646] Rename our isnan() function to IsReasonable(). Commit ea6db67 added an unusual isnan macro: #define isnan(x) (((x) != (x)) || (x > 1e11) || (x < -1e11)) Commit 8bc322e adds a preprocessor guard that looks like it would cause the isnan function from math.h to be preferred, but doesn't actually do that on many platforms, e.g. glibc: #ifndef isnan # define isnan(x) (((x) != (x)) || (x > 1e11) || (x < -1e11)) #endif This commit renames our isnan() to make it clear that it differs from the standard library operation, and makes it a function. Fixes #603. --- src/confscreen.cpp | 4 ++-- src/modify.cpp | 2 +- src/solvespace.h | 8 ++++---- src/srf/ratpoly.cpp | 2 +- src/system.cpp | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/confscreen.cpp b/src/confscreen.cpp index 646f91e01..cdf6e518e 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -448,7 +448,7 @@ bool TextWindow::EditControlDoneForConfiguration(const std::string &s) { Expr *e = Expr::From(s, /*popUpError=*/true); if(e) { double ev = e->Eval(); - if(fabs(ev) < 0.001 || isnan(ev)) { + if(fabs(ev) < 0.001 || IsReasonable(ev)) { Error(_("Export scale must not be zero!")); } else { SS.exportScale = (float)ev; @@ -460,7 +460,7 @@ bool TextWindow::EditControlDoneForConfiguration(const std::string &s) { Expr *e = Expr::From(s, /*popUpError=*/true); if(e) { double ev = SS.ExprToMm(e); - if(isnan(ev) || ev < 0) { + if(IsReasonable(ev) || ev < 0) { Error(_("Cutter radius offset must not be negative!")); } else { SS.exportOffset = (float)ev; diff --git a/src/modify.cpp b/src/modify.cpp index 48c10957a..94b247878 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -383,7 +383,7 @@ void GraphicsWindow::MakeTangentArc() { if(fabs(tp[0] - t[0]) > 1e-3 || fabs(tp[1] - t[1]) > 1e-3 || t[0] < 0.01 || t[1] < 0.01 || t[0] > 0.99 || t[1] > 0.99 || - isnan(t[0]) || isnan(t[1])) + IsReasonable(t[0]) || IsReasonable(t[1])) { Error(_("Couldn't round this corner. Try a smaller radius, or try " "creating the desired geometry by hand with tangency " diff --git a/src/solvespace.h b/src/solvespace.h index 3a535a5ac..165fd0866 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -76,10 +76,6 @@ typedef struct _cairo_surface cairo_surface_t; dbp("tri: (%.3f %.3f %.3f) (%.3f %.3f %.3f) (%.3f %.3f %.3f)", \ CO((tri).a), CO((tri).b), CO((tri).c)) -#ifndef isnan -# define isnan(x) (((x) != (x)) || (x > 1e11) || (x < -1e11)) -#endif - namespace SolveSpace { using std::min; @@ -98,6 +94,10 @@ __attribute__((__format__ (__printf__, 1, 2))) #endif std::string ssprintf(const char *fmt, ...); +inline bool IsReasonable(double x) { + return std::isnan(x) || x > 1e11 || x < -1e11; +} + inline int WRAP(int v, int n) { // Clamp it to the range [0, n) while(v >= n) v -= n; diff --git a/src/srf/ratpoly.cpp b/src/srf/ratpoly.cpp index 9e70192a5..1ffa33858 100644 --- a/src/srf/ratpoly.cpp +++ b/src/srf/ratpoly.cpp @@ -443,7 +443,7 @@ void SSurface::ClosestPointTo(Vector p, double *u, double *v, bool mustConverge) dbp("want %.3f %.3f %.3f", CO(p)); dbp("distance = %g", (p.Minus(p0)).Magnitude()); } - if(isnan(*u) || isnan(*v)) { + if(IsReasonable(*u) || IsReasonable(*v)) { *u = *v = 0; } } diff --git a/src/system.cpp b/src/system.cpp index 9c64b3084..933f153a0 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -293,7 +293,7 @@ bool System::NewtonSolve(int tag) { for(i = 0; i < mat.n; i++) { Param *p = param.FindById(mat.param[i]); p->val -= mat.X[i]; - if(isnan(p->val)) { + if(IsReasonable(p->val)) { // Very bad, and clearly not convergent return false; } @@ -306,7 +306,7 @@ bool System::NewtonSolve(int tag) { // Check for convergence converged = true; for(i = 0; i < mat.m; i++) { - if(isnan(mat.B.num[i])) { + if(IsReasonable(mat.B.num[i])) { return false; } if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE) { @@ -493,7 +493,7 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad, SK.constraint.ClearTags(); // Not using range-for here because index is used in additional ways for(i = 0; i < eq.n; i++) { - if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE || isnan(mat.B.num[i])) { + if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE || IsReasonable(mat.B.num[i])) { // This constraint is unsatisfied. if(!mat.eq[i].isFromConstraint()) continue; From 3a98eadaa2ede83832e70fa2d337d25888e06338 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 12 May 2020 15:09:36 -0400 Subject: [PATCH 057/646] Fix use-after-free in Lathe, Revolve, and Helix. Issue #611. --- src/group.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/group.cpp b/src/group.cpp index 686f4cee6..dac0764bf 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -533,6 +533,7 @@ void Group::Generate(IdList *entity, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, NO_PARAM, CopyAs::NUMERIC); + e = &(entity->Get(i)); // because we copied. if (e->IsPoint()) { // for points this copy is used for the circle centers CopyEntity(entity, SK.GetEntity(he), 0, REMAP_LATHE_ARC_CENTER, @@ -586,6 +587,7 @@ void Group::Generate(IdList *entity, h.param(1), h.param(2), h.param(3), h.param(4), h.param(5), h.param(6), NO_PARAM, CopyAs::N_ROT_AA); + e = &(entity->Get(i)); // because we copied. CopyEntity(entity, e, af, REMAP_LATHE_END, h.param(0), h.param(1), h.param(2), h.param(3), h.param(4), h.param(5), h.param(6), NO_PARAM, CopyAs::N_ROT_AA); @@ -641,6 +643,7 @@ void Group::Generate(IdList *entity, h.param(1), h.param(2), h.param(3), h.param(4), h.param(5), h.param(6), h.param(7), CopyAs::N_ROT_AXIS_TRANS); + e = &(entity->Get(i)); // because we copied. CopyEntity(entity, e, af, REMAP_LATHE_END, h.param(0), h.param(1), h.param(2), h.param(3), h.param(4), h.param(5), h.param(6), h.param(7), CopyAs::N_ROT_AXIS_TRANS); From ba38345dac5a07d45affb8dc7c259a6c46a5ee9d Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 13 May 2020 00:36:26 +0300 Subject: [PATCH 058/646] Improve triangle mesh (splitting of quads based on angle). When checking the dot product of the tangents `tu` and `tv` to decide in which direction to split a quad compare it to to LENGTH_EPS instead of zero to avoid alternating triangle "orientations" when the tangents are orthogonal (revolve, lathe etc.). This improves the quality of the resulting triangle mesh. --- src/srf/triangulate.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index 3ebb2bc8b..51a31dddf 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -482,7 +482,11 @@ void SPolygon::UvGridTriangulateInto(SMesh *mesh, SSurface *srf) { if (this_flag) { // Add the quad to our mesh srf->TangentsAt(us,vs, &tu,&tv); - if (tu.Dot(tv) < 0.0) { //split the other way if angle>90 + if(tu.Dot(tv) < LENGTH_EPS) { + /* Split "the other way" if angle>90 + compare to LENGTH_EPS instead of zero to avoid alternating triangle + "orientations" when the tangents are orthogonal (revolve, lathe etc.) + this results in a higher quality mesh. */ STriangle tr = {}; tr.a = a; tr.b = b; From 303d370f1306ef600433df3e22429dd9cdfc3c46 Mon Sep 17 00:00:00 2001 From: whitequark Date: Thu, 21 May 2020 11:17:28 +0000 Subject: [PATCH 059/646] Simplify MmToString. NFC. --- src/solvespace.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 042194c5d..3af691253 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -322,14 +322,7 @@ const char *SolveSpaceUI::UnitName() { std::string SolveSpaceUI::MmToString(double v) { v /= MmPerUnit(); - switch(viewUnits) { - case Unit::INCHES: - return ssprintf("%.*f", afterDecimalInch, v); - case Unit::METERS: - case Unit::MM: - return ssprintf("%.*f", afterDecimalMm, v); - } - return ""; + return ssprintf("%.*f", UnitDigitsAfterDecimal(), v); } static const char *DimToString(int dim) { switch(dim) { From e312ff1fb45351426adf88ce7ccfe59941c7cd2c Mon Sep 17 00:00:00 2001 From: whitequark Date: Thu, 21 May 2020 11:22:09 +0000 Subject: [PATCH 060/646] Eliminate a trailing dot before the SI prefix if there are no decimals. Fixes #617. --- src/solvespace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 3af691253..c88f50a73 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -365,7 +365,7 @@ std::string SolveSpaceUI::MmToStringSI(double v, int dim) { v /= pow(10.0, sdeg * dim); } int pdeg = (int)ceil(log10(fabs(v) + 1e-10)); - return ssprintf("%#.*g%s%s%s", pdeg + UnitDigitsAfterDecimal(), v, + return ssprintf("%.*g%s%s%s", pdeg + UnitDigitsAfterDecimal(), v, compact ? "" : " ", unit.c_str(), DimToString(dim)); } std::string SolveSpaceUI::DegreeToString(double v) { From 4a961554ff06808a7466afcc534f1e90b24e851d Mon Sep 17 00:00:00 2001 From: whitequark Date: Thu, 21 May 2020 11:39:37 +0000 Subject: [PATCH 061/646] Use HTML comments in issue template. Many people don't replace all text that should be filled in, which makes issues harder to read. Make the text at least invisible. --- .github/ISSUE_TEMPLATE.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 24a800026..e3747b22b 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,18 +1,18 @@ ### System information -SolveSpace version: (e.g. 3.0~3dd2fc00; go to Help → About...) +SolveSpace version: -Operating system: (e.g. Debian testing) +Operating system: ### Expected behavior -What should have happened? + ### Actual behavior -What actually happened? + ### Additional information -For bugs, please attach a savefile that shows the problematic behavior. -You can attach `.slvs` files by archiving them into a `.zip` first. + From 122e1f92cfa188dad71a0312d7534d28b794cae6 Mon Sep 17 00:00:00 2001 From: whitequark Date: Fri, 22 May 2020 13:45:37 +0000 Subject: [PATCH 062/646] Use a thread-safe temporary arena on every platform. This commit continues the work started in commits 521473ee and e84fd464 that parallelizes certain geometric operations. This commit cleans up the temporary arena implementations and makes them thread-safe. Also, in commit 521473ee, a call to FreeAllTemporary() was added during initialization to create the heap on Windows. This is now not necessary as the heap is created transparently on the first call to AllocTemporary(). --- src/CMakeLists.txt | 8 ----- src/lib.cpp | 3 -- src/platform/platform.cpp | 64 +++++++++++++++++++++++++++++++++++++-- src/platform/platform.h | 4 +++ src/platform/utilunix.cpp | 49 ------------------------------ src/platform/utilwin.cpp | 33 -------------------- src/solvespace.h | 7 ++--- 7 files changed, 68 insertions(+), 100 deletions(-) delete mode 100644 src/platform/utilunix.cpp delete mode 100644 src/platform/utilwin.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4834a6555..d1d9fc354 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -26,14 +26,6 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in # platform utilities -if(WIN32) - set(util_SOURCES - platform/utilwin.cpp) -else() - set(util_SOURCES - platform/utilunix.cpp) -endif() - if(APPLE) set(util_LIBRARIES ${APPKIT_LIBRARY}) diff --git a/src/lib.cpp b/src/lib.cpp index d1d54ff7f..b0d8e1d6c 100644 --- a/src/lib.cpp +++ b/src/lib.cpp @@ -67,9 +67,6 @@ void Slvs_MakeQuaternion(double ux, double uy, double uz, void Slvs_Solve(Slvs_System *ssys, Slvs_hGroup shg) { - // Create the temporary heap, if this is the first time we're solving. - FreeAllTemporary(); - int i; for(i = 0; i < ssys->params; i++) { Slvs_Param *sp = &(ssys->param[i]); diff --git a/src/platform/platform.cpp b/src/platform/platform.cpp index 974cce620..a1d29ea8e 100644 --- a/src/platform/platform.cpp +++ b/src/platform/platform.cpp @@ -18,6 +18,7 @@ #else # include # include +# include #endif namespace SolveSpace { @@ -605,9 +606,6 @@ std::vector InitCli(int argc, char **argv) { } #endif - // Create the heap that we use to store Exprs and other temp stuff. - FreeAllTemporary(); - // Extract the command-line arguments; the ones from main() are ignored, // since they are in the OEM encoding. int argcW; @@ -681,5 +679,65 @@ void DebugPrint(const char *fmt, ...) { #endif +//----------------------------------------------------------------------------- +// Temporary arena, on Windows. +//----------------------------------------------------------------------------- + +#if defined(WIN32) + +static HANDLE TempArena = NULL; + +void *AllocTemporary(size_t size) +{ + if(!TempArena) + TempArena = HeapCreate(0, 0, 0); + void *ptr = HeapAlloc(TempArena, HEAP_ZERO_MEMORY, size); + ssassert(ptr != NULL, "out of memory"); + return ptr; +} + +void FreeAllTemporary() +{ + HeapDestroy(TempArena); + TempArena = NULL; +} + +#endif + +//----------------------------------------------------------------------------- +// Temporary arena, on Linux. +//----------------------------------------------------------------------------- + +#if !defined(WIN32) + +struct ArenaChunk { + ArenaChunk *next; +}; + +static std::mutex TempArenaMutex; +static ArenaChunk *TempArena = NULL; + +void *AllocTemporary(size_t size) +{ + ArenaChunk *chunk = (ArenaChunk *)calloc(1, sizeof(ArenaChunk) + size); + ssassert(chunk != NULL, "out of memory"); + std::lock_guard guard(TempArenaMutex); + chunk->next = TempArena; + TempArena = chunk; + return (void *)(chunk + 1); +} + +void FreeAllTemporary() +{ + std::lock_guard guard(TempArenaMutex); + while(TempArena) { + ArenaChunk *chunk = TempArena; + TempArena = TempArena->next; + free(chunk); + } +} + +#endif + } } diff --git a/src/platform/platform.h b/src/platform/platform.h index adf622858..5664fa217 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -70,6 +70,10 @@ std::vector InitCli(int argc, char **argv); // Debug print function. void DebugPrint(const char *fmt, ...); +// Temporary arena functions. +void *AllocTemporary(size_t size); +void FreeAllTemporary(); + } #endif diff --git a/src/platform/utilunix.cpp b/src/platform/utilunix.cpp deleted file mode 100644 index 9a471c663..000000000 --- a/src/platform/utilunix.cpp +++ /dev/null @@ -1,49 +0,0 @@ -//----------------------------------------------------------------------------- -// Utility functions used by the Unix port. -// -// Copyright 2008-2013 Jonathan Westhues. -// Copyright 2013 Daniel Richard G. -//----------------------------------------------------------------------------- -#include "solvespace.h" - -namespace SolveSpace { - -//----------------------------------------------------------------------------- -// A separate heap, on which we allocate expressions. Maybe a bit faster, -// since fragmentation is less of a concern, and it also makes it possible -// to be sloppy with our memory management, and just free everything at once -// at the end. -//----------------------------------------------------------------------------- - -typedef struct _AllocTempHeader AllocTempHeader; - -typedef struct _AllocTempHeader { - AllocTempHeader *prev; - AllocTempHeader *next; -} AllocTempHeader; - -static AllocTempHeader *Head = NULL; - -void *AllocTemporary(size_t n) -{ - AllocTempHeader *h = - (AllocTempHeader *)malloc(n + sizeof(AllocTempHeader)); - h->prev = NULL; - h->next = Head; - if(Head) Head->prev = h; - Head = h; - memset(&h[1], 0, n); - return (void *)&h[1]; -} - -void FreeAllTemporary() { - AllocTempHeader *h = Head; - while(h) { - AllocTempHeader *f = h; - h = h->next; - free(f); - } - Head = NULL; -} - -}; diff --git a/src/platform/utilwin.cpp b/src/platform/utilwin.cpp deleted file mode 100644 index 16bce1906..000000000 --- a/src/platform/utilwin.cpp +++ /dev/null @@ -1,33 +0,0 @@ -//----------------------------------------------------------------------------- -// Utility functions that depend on Win32. -// -// Copyright 2008-2013 Jonathan Westhues. -//----------------------------------------------------------------------------- -#include "solvespace.h" - -// Include after solvespace.h to avoid identifier clashes. -#include - -namespace SolveSpace { - -//----------------------------------------------------------------------------- -// A separate heap, on which we allocate expressions. Maybe a bit faster, -// since no fragmentation issues whatsoever, and it also makes it possible -// to be sloppy with our memory management, and just free everything at once -// at the end. -//----------------------------------------------------------------------------- -static HANDLE TempHeap; - -void *AllocTemporary(size_t n) -{ - void *v = HeapAlloc(TempHeap, HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, n); - ssassert(v != NULL, "Cannot allocate memory"); - return v; -} -void FreeAllTemporary() -{ - if(TempHeap) HeapDestroy(TempHeap); - TempHeap = HeapCreate(HEAP_NO_SERIALIZE, 1024*1024*20, 0); -} - -} diff --git a/src/solvespace.h b/src/solvespace.h index 165fd0866..17e74b544 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -132,16 +132,15 @@ inline double Random(double vmax) { #include "platform/gui.h" #include "resource.h" +using Platform::AllocTemporary; +using Platform::FreeAllTemporary; + class Expr; class ExprVector; class ExprQuaternion; class RgbaColor; enum class Command : uint32_t; -// Temporary heap, defined in the platform-specific code. -void *AllocTemporary(size_t n); -void FreeAllTemporary(); - enum class Unit : uint32_t { MM = 0, INCHES, From a2f1b9463a0088beb07b42177a3890851750590a Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 19 May 2020 20:42:06 -0400 Subject: [PATCH 063/646] Bring some parallelism to boolean code --- src/srf/boolean.cpp | 30 +++++++++++++++++++----------- src/srf/surface.h | 2 +- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 5ee54ff66..6f1041c10 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -403,7 +403,8 @@ void SSurface::EdgeNormalsWithinSurface(Point2d auv, Point2d buv, SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, SShell *sha, SShell *shb, SShell *into, - SSurface::CombineAs type) + SSurface::CombineAs type, + int dbg_index) { bool opA = (parent == sha); SShell *agnst = opA ? shb : sha; @@ -594,9 +595,11 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, SPolygon poly = {}; final.l.ClearTags(); - if(!final.AssemblePolygon(&poly, NULL, /*keepDir=*/true)) { + if(!final.AssemblePolygon(&poly, NULL, /*keepDir=*/true)) +#pragma omp critical + { into->booleanFailed = true; - dbp("failed: I=%d, avoid=%d", I, choosing.l.n); + dbp("failed: I=%d, avoid=%d", I+dbg_index, choosing.l.n); DEBUGEDGELIST(&final, &ret); } poly.Clear(); @@ -609,13 +612,18 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, } void SShell::CopySurfacesTrimAgainst(SShell *sha, SShell *shb, SShell *into, SSurface::CombineAs type) { - SSurface *ss; - for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { +#pragma omp parallel for + for (int i = 0; i < surface.n; i++) + { + SSurface *ss = &surface[i]; SSurface ssn; - ssn = ss->MakeCopyTrimAgainst(this, sha, shb, into, type); - ss->newH = into->surface.AddAndAssignId(&ssn); - I++; + ssn = ss->MakeCopyTrimAgainst(this, sha, shb, into, type, i); +#pragma omp critical + { + ss->newH = into->surface.AddAndAssignId(&ssn); + } } + I += surface.n; } void SShell::MakeIntersectionCurvesAgainst(SShell *agnst, SShell *into) { @@ -758,9 +766,9 @@ void SShell::MakeFromBoolean(SShell *a, SShell *b, SSurface::CombineAs type) { // All of the BSP routines that we use to perform and accelerate polygon ops. //----------------------------------------------------------------------------- void SShell::MakeClassifyingBsps(SShell *useCurvesFrom) { - SSurface *ss; - for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { - ss->MakeClassifyingBsp(this, useCurvesFrom); +#pragma omp parallel for + for(int i = 0; i Date: Fri, 29 May 2020 17:45:09 +0000 Subject: [PATCH 064/646] Get rid of the FPS counter. The counter was added solely as a debug feature in commit e7c8c1c8, which introduced the new Canvas system. It doesn't work all that well and brings little value, so let's get rid of the visual noise. --- src/draw.cpp | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/draw.cpp b/src/draw.cpp index 907ca0044..5c6dd8a7b 100644 --- a/src/draw.cpp +++ b/src/draw.cpp @@ -841,17 +841,15 @@ void GraphicsWindow::Paint() { ForceTextWindowShown(); } - auto renderStartTime = std::chrono::high_resolution_clock::now(); - canvas->SetLighting(lighting); canvas->SetCamera(camera); canvas->StartFrame(); + + // Draw the 3d objects. Draw(canvas.get()); canvas->FlushFrame(); - auto renderEndTime = std::chrono::high_resolution_clock::now(); - std::chrono::duration renderTime = renderEndTime - renderStartTime; - + // Draw the 2d UI overlay. camera.LoadIdentity(); camera.offset.x = -(double)camera.width / 2.0; camera.offset.y = -(double)camera.height / 2.0; @@ -888,19 +886,6 @@ void GraphicsWindow::Paint() { ToolbarDraw(&uiCanvas); } - // Also display an fps counter. - RgbaColor renderTimeColor; - if(renderTime.count() > 16.67) { - // We aim for a steady 60fps; draw the counter in red when we're slower. - renderTimeColor = { 255, 0, 0, 255 }; - } else { - renderTimeColor = { 255, 255, 255, 255 }; - } - uiCanvas.DrawBitmapText(ssprintf("rendered in %ld ms (%ld 1/s)", - (long)renderTime.count(), - (long)(1000 / std::max(0.1, renderTime.count()))), - 5, 5, renderTimeColor); - canvas->FlushFrame(); canvas->FinishFrame(); canvas->Clear(); From b99753d46c04620bfba8226646b326ab5769a5ae Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 1 Jun 2020 21:10:25 -0400 Subject: [PATCH 065/646] Fix SSurface::EdgeNormalsWithinSurface() to handle non-orthogonal u,v derivatives correctly. --- src/srf/boolean.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 6f1041c10..cb72cd8f5 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -379,11 +379,17 @@ void SSurface::EdgeNormalsWithinSurface(Point2d auv, Point2d buv, enxyz = (ab.Cross(*surfn)).WithMagnitude(SS.ChordTolMm()); // And based on that, compute the edge's inner normal in uv space. This // vector is perpendicular to the edge in xyz, but not necessarily in uv. - Vector tu, tv; + Vector tu, tv, tx, ty; TangentsAt(muv.x, muv.y, &tu, &tv); + Vector n = tu.Cross(tv); + // since tu and tv may not be orthogonal, use y in place of v, x in place of u. + // |y| = |v|sin(theta) where theta is the angle between tu and tv. + ty = n.Cross(tu).ScaledBy(1.0/tu.MagSquared()); + tx = tv.Cross(n).ScaledBy(1.0/tv.MagSquared()); + Point2d enuv; - enuv.x = enxyz.Dot(tu) / tu.MagSquared(); - enuv.y = enxyz.Dot(tv) / tv.MagSquared(); + enuv.x = enxyz.Dot(tx) / tx.MagSquared(); + enuv.y = enxyz.Dot(ty) / ty.MagSquared(); // Compute the inner and outer normals of this edge (within the srf), // in xyz space. These are not necessarily antiparallel, if the From 78d9ed812b79e7b540210dac67552aa19f7ac4c9 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 4 Jun 2020 19:03:54 -0400 Subject: [PATCH 066/646] Change criteria for short edge removal --- src/srf/curve.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/srf/curve.cpp b/src/srf/curve.cpp index 9bdcca289..eae0479a8 100644 --- a/src/srf/curve.cpp +++ b/src/srf/curve.cpp @@ -799,20 +799,37 @@ SSurface *SCurve::GetSurfaceB(SShell *a, SShell *b) const { // stuff in the Booleans. So remove them. //----------------------------------------------------------------------------- void SCurve::RemoveShortSegments(SSurface *srfA, SSurface *srfB) { - // Three, not two; curves are pwl'd to at least two edges (three points) - // even if not necessary, to avoid square holes. - if(pts.n <= 3) return; + if(pts.n <= 2) return; pts.ClearTags(); Vector prev = pts[0].p; + double tprev = 0; + double t = 0; + double tnext = 0; + int i, a; for(i = 1; i < pts.n - 1; i++) { SCurvePt *sct = &(pts[i]), *scn = &(pts[i+1]); + if(sct->vertex) { prev = sct->p; continue; } + + // if the curve is exact and points are >0.1 appart wrt t, point is there + // deliberately regardless of chord tolerance (ex: small circles) + tprev = t = tnext = 0; + if (isExact) { + exact.ClosestPointTo(prev, &tprev, /*mustconverge=*/ true); + exact.ClosestPointTo(sct->p, &t, /*mustconverge=*/ true); + exact.ClosestPointTo(scn->p, &tnext, /*mustconverge=*/ true); + } + if ( (t - tprev > 0.1) && (tnext - t > 0.1) ) { + prev = sct->p; + continue; + } + bool mustKeep = false; // We must check against both surfaces; the piecewise linear edge @@ -826,7 +843,7 @@ void SCurve::RemoveShortSegments(SSurface *srfA, SSurface *srfB) { srf->ClosestPointTo(prev, &(puv.x), &(puv.y)); srf->ClosestPointTo(scn->p, &(nuv.x), &(nuv.y)); - if(srf->ChordToleranceForEdge(nuv, puv) > SS.ChordTolMm()) { + if(srf->ChordToleranceForEdge(nuv, puv) > SS.ChordTolMm() ) { mustKeep = true; } } From c47b8f592955601f9452e2f277d89cdf667794a3 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 4 Jun 2020 19:04:42 -0400 Subject: [PATCH 067/646] Make sure circles have at least 16 segments. Before this commit, with the highest chord tolerance settings, circles would render as octagons, which confused a lot of people. See #295. --- src/srf/ratpoly.cpp | 2 +- test/request/ttf_text/normal.png | Bin 6162 -> 6154 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/srf/ratpoly.cpp b/src/srf/ratpoly.cpp index 1ffa33858..7affff028 100644 --- a/src/srf/ratpoly.cpp +++ b/src/srf/ratpoly.cpp @@ -259,7 +259,7 @@ void SBezier::MakePwlInitialWorker(List *l, double ta, double tb, double }); double step = 1.0/SS.GetMaxSegments(); - if((tb - ta) < step || d < chordTol) { + if( ((tb - ta) < step || d < chordTol) && ((tb-ta) < 0.2) ) { // A previous call has already added the beginning of our interval. l->Add(&pb); } else { diff --git a/test/request/ttf_text/normal.png b/test/request/ttf_text/normal.png index 9aa4d185373e07540cd3ebb2985cc867c8f8072e..ccb581f00aeae407da622342f3f8f36250276b27 100644 GIT binary patch delta 3553 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 From 646d728a27868fb3008cf860fc76d6fc3d6aedf8 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 11 Jun 2020 20:50:21 -0400 Subject: [PATCH 068/646] Change default chord tolerance (to 0.1%) and maximum segments (to 20). See the discussion in #627 for details. --- src/solvespace.cpp | 4 ++-- test/constraint/arc_line_tangent/normal.png | Bin 5101 -> 5100 bytes .../cubic_line_tangent/free_in_3d.png | Bin 5049 -> 5073 bytes test/constraint/cubic_line_tangent/normal.png | Bin 5208 -> 5220 bytes .../curve_curve_tangent/arc_arc.png | Bin 5017 -> 5027 bytes .../curve_curve_tangent/arc_cubic.png | Bin 5219 -> 5201 bytes test/constraint/diameter/normal.png | Bin 5023 -> 5024 bytes test/constraint/diameter/reference.png | Bin 5100 -> 5101 bytes test/constraint/equal_line_arc_len/normal.png | Bin 4554 -> 4564 bytes test/constraint/equal_line_arc_len/pi.png | Bin 4672 -> 4667 bytes test/constraint/equal_line_arc_len/tau.png | Bin 4966 -> 4963 bytes test/constraint/equal_radius/normal.png | Bin 5249 -> 5258 bytes test/constraint/pt_face_distance/normal.png | Bin 4305 -> 4314 bytes .../constraint/pt_face_distance/reference.png | Bin 4369 -> 4378 bytes test/constraint/pt_on_circle/normal.png | Bin 4879 -> 4884 bytes test/constraint/pt_on_face/normal.png | Bin 4661 -> 4662 bytes test/request/arc_of_circle/normal.png | Bin 4569 -> 4560 bytes test/request/circle/free_in_3d.png | Bin 4803 -> 4796 bytes test/request/circle/free_in_3d_dof.png | Bin 7197 -> 7195 bytes test/request/circle/normal.png | Bin 4803 -> 4796 bytes test/request/circle/normal_dof.png | Bin 4836 -> 4830 bytes test/request/cubic/normal.png | Bin 4947 -> 4949 bytes test/request/cubic_periodic/normal.png | Bin 5223 -> 5225 bytes test/request/ttf_text/normal.png | Bin 6154 -> 6158 bytes 24 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index c88f50a73..736846ca8 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -44,9 +44,9 @@ void SolveSpaceUI::Init() { exportMode = false; // Chord tolerance - chordTol = settings->ThawFloat("ChordTolerancePct", 0.5); + chordTol = settings->ThawFloat("ChordTolerancePct", 0.1); // Max pwl segments to generate - maxSegments = settings->ThawInt("MaxSegments", 10); + maxSegments = settings->ThawInt("MaxSegments", 20); // Chord tolerance exportChordTol = settings->ThawFloat("ExportChordTolerance", 0.1); // Max pwl segments to generate diff --git a/test/constraint/arc_line_tangent/normal.png b/test/constraint/arc_line_tangent/normal.png index b885995f86ab05f5afd6d0a1841a6aaa6282d999..ab59db735cdd656b8eff17463b758c7b6c2add85 100644 GIT binary patch literal 5100 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 literal 5101 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
WHDb}CxB1eaL=*BW50y%-v}mXc*fR7rvPWX zuS?zj0$&XPW41KJ{(95Qz-uu;6QrJdqI`Cb$O)U`zig#%$eA!z0K4X~20behGTppS zjsnnAzfX^GtNf``UTWVS_*gstY6bvuKL5J_-6>NUwN(blq$_3mscix1-mXHD4F&Kn z_!%zsJHX&OeGFsC}AFZZ9!YhgwiV_F2!c`srezooItTq3b(7?WzASuZxS43(1pS!+9NrNrAmy zeZnXF#;}}2@8VnzNme!A6uX*Lb?5Xv?btf_g5Mq1-E*t8F;CD@B+>3@kn}vw6)pu! z%x1pfXX}iKL&xHo7JV^Zy<+j!!AnskG4Pb~Tk~LUXiFM%ba+aIKr&_+mHDB;^1GY^ z?k)R`jB;GuA@lG;((2!8uJrb7yWju%X7Lzkx;CHZQ*@!N;pl~`_ig}PHCQ6wE#CI) zwWzHjGq?0*^@;1>Cv=fQ`-Y=RIzneko_@$UC4){qrAqI!dFqhz)@hGSSIQGsA2T~# z=abo3f_wd9OWNM7E{P61yFXO9?&gqZ!gB8-aahS3_-s%qQ?kq?Z@x|Qa^}tUx#F!p zTopD_@j|b-c6HQUQ}9WF*6hObKg4hqxTxWRU6$&{?&+RoxWNtS)EO->cHDu>VC8O^3f0 z=?r|1>@L6G7xl`#d^Qt@vk;s5n3m!+t*)i3FV TiV^%753I3SzbbnLkPV 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 Oz{YiUR@^nLi2nmA5tzpS literal 5049 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 diff --git a/test/constraint/cubic_line_tangent/normal.png b/test/constraint/cubic_line_tangent/normal.png index 66d86a0fcbb53334becfc70aadc87386a3930e0e..394f8ff73f425202b8707b3862be09473e65dcd0 100644 GIT binary patch delta 3579 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 HyyU+FK_n~E delta 3587 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 diff --git a/test/constraint/curve_curve_tangent/arc_arc.png b/test/constraint/curve_curve_tangent/arc_arc.png index c6ceb2abf9a5a3f1c13fb0cdd9dadd22d6e98fba..c83e0a8890f47f4c2cc4ae968c82f58c611fb0bd 100644 GIT binary patch literal 5027 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 OKCphRvwf}|6!AZ4{mI4v diff --git a/test/constraint/diameter/normal.png b/test/constraint/diameter/normal.png index c58025bd0ef2ccf623037dc3c533a104402a0a4e..fc57623150ada2185bfde3200d1b167c1f5b36be 100644 GIT binary patch literal 5024 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 literal 5023 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 literal 5100 zcmeI0dpOkj9>>2kjC¹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 literal 4554 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 delta 949 zcmdn3azJH*3M2bQ)s4*cs*4!}3n7!z88&Je>E0YC3zf>!~Ksdwmq$XDDVo!kwHOsEelFwkPw-y8nJ`qxU z;}XL-XZnFA*$(Z7V&Mn@wRH>v5dtdf7&3el9D8;!J?K8r#8CKE@pH^xriM@!v6c>P zhJ745KbE~-zJ=K#dun6qmGcZSQY;VTgmo$=1Jw&QvNH6ne$h4aK$H25IK~e>K)O?# zK~6AY!^HPMb)t=|`38IInI1?svPuILYydj7*JnLLg=@k=uVvv3Yg9KRFkjYYxF!&> zq3PvSM;-64Tn+a`=9;sJF*wXP&@?qhjwM02kyU?(4ab47;Ow*a7O_1K*uFE*eEv$5VU5z{DNF+OzXJC%Sgd*{fAPcf z$^C!-Z470YGs(M!;lPfrbu&117#a*fnxDz(_`UpeyX*Jre>)!*M`vH&-#vf&*X@Qs zivE9|wsY(L+E>lzSs&;!bq7ZYJI9;vEdRXV;%$$rlG_LO>^Lc#kgg}l#LzM`;UM#6 zldpeQumx*17^y`tFeEZ@doU>YBryK{aJTP3nCo+1sIyzw<(IH8XgR>dz%e^2`(GuW ze~jMrIyp101Bx>e7#UhPbs`SdMlj?kZh(5~pY~*BwxIgO>oupHfCN9t_q@v@7;Ka` zJn+q{U_-s%(qr%P5$Z9PR$?#llLxQ>z_k%rmnpv%P^XYs~Wt>yr%qjNf zjnyij%@2O)?f+SP>N}^-kA}=yF-AT!AVI$2LGwCg?+nHs?}UTxcl|cEh#jbS#dLbb z{K>`nVh48kY*;WMQ|!PD7BQIvdoKt@GcdY_pQ)Q7Bf8`DH*4PgUyFJF*L>P|fBXBs z{7+vWT>djpTNRW?-k;w!H?1;3)AqndP92LK)#it}^%|0eBQ8w5J)ue@X6;t9zu5;~ z{JOuiinVb1|D8V?Q{6wGH{7?m{6w*X`<*9zvcGp({=2t%6MHF_NJgFR`=(k4O9mkD MboFyt=akR{0J0#NrT_o{ diff --git a/test/constraint/equal_line_arc_len/tau.png b/test/constraint/equal_line_arc_len/tau.png index 5336ac9645ebbe9e39f8320a0a68708fc034e1e8..1abd363cd474e157522b2b20b5ebef35ccdd5194 100644 GIT binary patch literal 4963 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 diff --git a/test/constraint/equal_radius/normal.png b/test/constraint/equal_radius/normal.png index c7f8e797d10020ffc2aa995e8f5cb7a59ef78cd5..2d338c93b3735bfe553753f3e99aede6f0578167 100644 GIT binary patch delta 3465 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 diff --git a/test/constraint/pt_face_distance/normal.png b/test/constraint/pt_face_distance/normal.png index c92fc4f3e767cee126cb99e4de0e0fa6f96b75b0..5fe42722bbb52363aa3c4bcff7a982c1ca233260 100644 GIT binary patch literal 4314 zcmeI0dr(t%7RP^yNexDnH)s*CBNQY+6d$;Vs61TCLn{hdfpAfg-H8DN5rF~;Dhz@$ z-BpN{V#Nmvgv3X9L?S^{tOgO0%OeobEXL)jrUW%4>;<;zTurSz)1CdNGsz@#^GohI z=lA`6&*vn2OTZ@GISc0i0Cau+?70;HEM@9R_zbyna}TQ<0KKz5o*T9uEFA9H5NGbS zF!QNMCp<&<_?lTau@5>$i!Od+UF>qp^I*f@?K`5ZM48SE=66Syct67^b_zZ!zRi>^A(b{=~ocs)vjAbz|4e1 z34^|mYc>MVdK+zV}a(DfuG#JDhd{BYs+pi}Eq6!pb zN-2t(1^n*gwA7BVubehEhtXp6eh^4j+nulgve6p3rtIY7k(a3$p$|F(WS3aMEfRlJ zbVxChigW?l&QROd-Mv!LW)Hjr_xI?bN;L*|1qld%af*dX>iu08y5wI-#)B_E5D7%} zN?DCZ)iQzEpR@`H&--apj#(o=hy%?0TM|4_H-tlIA!AMbExwUAt!DG!RIGom7pt`7*)`DZ(x433>B?H88j4GR_i65DrV6 zryKVT2XwruK`6!sLj!{394MM2y!|q*%F1Mc;ob{9##Cn^n$n2 zJonN95PL$Hv0<&T$B&#fvUqTi6>=EqLJ5YX`3vwxPse-HIaI9hYmG;WY!V^cGwV`I zQCFvR+Ia{+_l^Y;&@YP}HbS;_Dn-bc0XRNo0?&CQ>k?zMN6_QK^I@1b^plXaH*U5! zgm$0V$FLq(W)sbrh#8PM#jBra+Tx!1Cgc<0=_+2b4%pP@&t1FQ2(V5}N3ZFjo&TIS z_s$`2roI+$MQ)b)%x6SMKwOg5dUYFzVUM^NtCcVD%zwm>_Nr53iHs!n;G_r9@g9cKYeqVEd7rrz4d^jd_+KH1^oKN3J^l>}o3}UfAu&w(VP{ z3q-!5U!NZdI}D;?b7I3YtG!<2TOGlfka0|&lLyYkC@x3uzhD?SUzv8o6y5I1h~>p8 z#Q-=pX=~|7t6|fA{2RLG&9w7A7X3!eHbI(-f6)3m-1VOvBssxYj@ zSxnAVE9hee)g|Lp0j|SA)BBQXP5%18&XtY4;46Nl|e8FFgLXI*bDa8&jd=Rl~0a`LA!QuV-R>746UI2)0Yu)&da4=;4 zV5?S~2!lF(F~0(bA5qe8f}s{3pFyK@cKm1piU1Kapw0o%R*f;D0AEBygkg`W+aR0A zPSyv&d6_nH`q*4x)`&Qn7P>ntIHTs_?Hz zD?Zm4aacG+ZzCdb8Ei^9nPTT@0$yfR#2_c~<%g3EtDT=;7=%&`Eatf#kdH)(eS?v$ z6#bvI@vL|xtx~Yx7zl4`C2Z~H2S409+-1R@59In3SL^G2m|yhDa~7nk=>}dVAa@fq z{3K$xjsq~u5_T}U*DFN?WKK1rN*#N#ax5VJQr7Bl{@38zO7AP7VZZVHpWCL=U z&zF?Vq66<*nmgDHKP-GD1E3vxEc~unRc#OixG`9o%#RKFh~-n(2_HYT10!VN;CWN8 z9XR+Q3weE$ERUWHt5M$33kGDz=K8Kv4KaDMx}~n`!6Ed}qUplZzO68(WX05{4LNjf z7Hn5O*;V*%A7D5S+j9eW74x%NJlqu>GD&J$%W5XBsD6?ow7NUDykzZuOq%UgzY4%G zT^wv-<|Bt7kBnfchmGKG{GAZSW-zt_DG2dEvDr`xZt zRgLDQHrbs?e7Ht3R0KjIY!lGQ6a(So>3l8kG zWR6jmWZNL)s&u6OPq~~D3)?v$c7yaYco!ncEqg`6423byTPnZ5YAtR%5+P8e9NxaV<=o0<5kN;jnzQW!AhpY3>E$FgG Q{<8o+UICsJ8=;JU17L2V3jhEB literal 4305 zcmeHKX;c$w7X2!OCV(u8BFf^pjM^F{ZVd`?1EevC3nF1Jn^ByOER7~15J)06jELgW z1Bgh*tvM`_fD^(ZP^dF%qkxV^_MixA2w^V+XM7!t5%#S(#sB?1aRKD-s z_wIY|-Xq(5Jk3mIng9UIyuNhb0RWDwdkCMQZ)*2ucK~3S?d85wp zFa!=869Jd>U;3!!s0|XuFF4)2yxE59FOB(CFnyY zm0U=0GQ{ME&g*4;0gy`*o=7@Q7vuq(E%#Y&m>G=04qw9KbrL(YNpH>G|s^w zK+A$$OB?K*iYd<{!_4Qc0GuwH=tRU>B8tbsD?Of@VJb*PDe%Y*fV(%%F`)E|o*o`h zxBxgGeUBB2MO92+476R-sd*6w!25>@Pwb&SmKk&JPd(>^Wm%1=+|L36Br6vTD1FY6 zj_)bR1KmXZ_`uzw7hPMh&_ZBVo*5v0KH-V!;UPr}z$V{=U6z;&QM&CS;{oD5VL9LR z#V3O3O@&Vc!4A&%2%@?W54v63{e$}JR0$l7Br$qjxuhV2b+-z12$KyBDr{X+>$*4t z(+!(f&r)R5Aw~hpXcubCi+rOl)#%s0Z+fZ0_6btT#TU76|J8KHp4d_u?&6ht|9}rT zr&yK|FrC|^YZze_<#5A;wyI2fhsIKkqWg7+|KrtzUCd)kEBDV(y3vM`UK5MSaY~sV zO(5!0YnamtD~wDXnmNwH&$h={NF4m|-Q}I`olNb>pzKzkHc_ilKbnhNF($$bXRS*r zc7VF)sdYWyT7SqbIruYqovNv}XDHY6^ITmN>YVX6iYD1);De4LtHsqb>|w{W+VhR( z)|2E6@kBNcv97(bmM{xu@T2S1xM_<<4%sQQcG@m?@EnhDgds#}_xkTlb4zbA)(a zd2O0z#FPm7L{~Ve*1;zc9Gt|sTCv=z(qK&WkLTJ^1&1@<&#xO%JNY}LRBJUsG`@D^ zTCHqhR<&(Fe<0cHbWwZ#Yd?GpZ~TgQyl;!rhW$XQlt`7bWlNdrQ|Fu9TxVwyptz(c zrqJDb>m{+I{M1~|%P^U5dv!*D_SBMa-Ll9#F;~0UY`?Z4O=PL5P8}21n53RzS&-vqpR_#Tbk9!x5sFIioT*?q-mB4x9IPiy&E z-$y8jqYKW9BwckJX&_CY4s|t_pSIW64!@?UCS)wn@8FiHpt}I8aO56J0J7r7RFO&o zSb+8=p+;RE8I+(Ir7IV*%OZo6gc!8{?Ige72-|4xos~_lxTp>#NdSd6-rao-fu!9VdaxN%R-u0XA z+Tx|c4hr-kX$%yBk5An&!HkV~T4a&K)50i@xaObj(n^dH2S#0PKyUrOE>#qy;Z&Y!TtOKPvmGHOyX>g~K=8gW9{mcvW?lN= zm?(TGVQk!E9ezq2UR#Gtwpk%`h?N=-*WNBWUt#tD`}(%>k5m@U5?zLZ6XSB|CrN ri;q4;bq#Xq-$wX7PX7;$yif}z8~pk9<|rKMX94i?@NvJg5kB-2(vGjN diff --git a/test/constraint/pt_face_distance/reference.png b/test/constraint/pt_face_distance/reference.png index b01d4ea8fe58b5ecfb518ef5f8c5fcfc8b069833..6e392b3c61c4a9e483479e07a2c677ede3fb41ff 100644 GIT binary patch literal 4378 zcmeHLc~FyQ9)9yd1cJz21O=pCWeA5>i6W;0Y9T~W4k6MYC~XngC9psuIl#hd1x682 zL}2ZT2SfrIE=7V!P*6e_2owQBQ4B{o3gHgy7u{h^%`n@Y-Th<7KQi;q_kA<(^Shqk z^W^LyxBV(8Jrn>y<=_EF4*(z^$xm?={N&Ne%UuAd^&WI|I1-aB?8ZjCbT&xp^*+fVIhN2q2cUZ<~(5};l1saYxOG|F?LXf?1@|80B(yb~FN zl)5pB{)S=+*m;Fg@cvP`=F}6na}do}uTLaORq)hz3`ScTT>Z1367sI^KPBW-hrB1d z|M z0})+vWG4Ts{M>wOfrH=m6OAEex;nHWH3^ACWh(w~_w3`{JgPpvfByK(A!k1u(#WrT zVx~Pew#kY7bj{-Uu0U0*v0>Bxn;-DN?y#_A2JM{o%KCOR_v{>^AL6gp1< zQeJaxc00etuDzZl!$Q+juM zXzYv4eg1a_y?YlH=SRKu4L3LtYSOE;_C0IQp2&9bCy!uVr%QsB^Wt63NJ2F63EPgs z^I{=V~`z$l-hD+ChcxV0t{oB#))Uu1P$iZ3m!H|TAGAZ z`?B6%g!BI4N*uJT;KKFr_)|wY*-R8=&({ z?3NaYA}!!{$FC+L%^eU9nW;k`EZvi7dz!T|dPovM8meR|y?YlOp&)rj+x7xp66Jvq zd@^mk`BcMqnjsi6XM(luB@1@<`H90dP~|VqKjL418)WJt#Fs03F==t+rLmZ?S}JvB zqDCkdE{W%-%8Gspvq?;ELx<&=F;6GR1z)yx4JFN&lJu-4r#TBxT;FM&x$a!_pG`{Q zk!*2sR$V%l!D79Bnmdn;8`PWI+?Pu{)-%JwEJktc)|35x{oD*kb6-)Zi`fPXW1@D> z()01r$Hk+)NB*k2MC#KSeo&x-UZ+AooHHUk+K;Od@f)es*!kJ63d2|8n1!_PFifiA z)t=FP?%^@;)}F3coyA{aLv!2a6)tdt+6EW3;uy%!nBl6K*Lb3qu*CMFuXWrK>l;f9 z?I@=hEK96@Ra)~MZOkS(7gs$^P~})T(5K<8b(^eX#MZ@s-j!))re3+}fDs)T=|B*= z=+Keh<3E@G*JTj9+<iaDN@KWNMjTaMh4#lt%)07bYlRz&rY zrfg1)y(>$Z6q+%IZve3B#K+AKYZ}@gO-STp^K31$Kz6y38Tb8ip=ct=ttMfU#48?nnXZoFnnXYh9S%TSEr(*45& z@cy97?xz*3)_Xr9!2T4wPpa0i`Iv%TVuI|clL>@X>V^9y-{9YYvgckY`2ouooZn9n zUTTgHmUt6dj}~mOculUtqUtT~K?r-QJkL$vIine(Q4|aH?`0uD+#SgnS-v~QdfL#3 zVvHT~)3}0~&P6?cz^0Ttb`&+9(VE`4Xyr%Vw zr1gBIY6K)W^Wot9#^9C~v8_%kPZgI1RZn^e8G)z7)_{FwO54ZJv~eO}va3GDW_o9-MxhPzXQO$(mDVD literal 4369 zcmeI0c~nz(7RN7v2#UxmCG^Kq-?*gsSXI$h;H}rx9eFp7xyiqkrU_ocDgoyT5zC zzx(~%7j*!?M{SAz5&%$h+PnL601Q#~QCWmuDLa0>13;t2Y4^@UXOjCnEn-*g(ZAf? zcWG01)xID_u~Lmy>q#>Rnb|TH2K)=vSF5gsMtd=(M&HJF5JRtZazVGV^FFCpM-0Pi1h)L z#tv@-b=4z!)Ffaa=<%}oqLon9O}ajJ$7TxT6V++9qxI>QC=x0^vp% zbn3`uqzM~0*$NPGCt{w|?XZu#MZ=_9y&FVJqq|35B*2O&g9Q^R;@P^n06S_k}oVO0hS>K$e#qiyH&ZOr>`0Gv{OLV&Cx+j zo~X@PF2BUXE=_NRGvq_cT@N%uP=|)xZD$sTLsJ39)s}|~X^s(A9XPB6 zNprMnUXV$#!pf=Oba-#rRzT8U%BAV8xa*k5a#BI$TpzGY?)FwxZhapE{N=BI2;}FJ z|A#<+8-cW3=~EyFiQOnkVJU`^VP$6MRHM7lEAUwf^T9~nYwPUPkg*OHMImM{`Jq}$ zbWEj)w!w8%=rc>Pq0RCLUU`|(w^cd^{8BwU;!e;#!m+$C+7CX3MP`9cUCC{|6W{Ya z?+*B6d1tq{!zf}&q^@l!Y{=?NH?6wRUh(4jo|j5So7N%)i%q&V$9G)IsEAZwle-7DJ+&kvq;pqH z7!U47V0nJ$^nl>Q=+p#%YMFA@Mg4rEMb+{F2^l6eE z1|cof(~9dqt^0@l^wALHp!AbYbHoo@h#!v2N-MM`jGUE13xYsLeMAqBntZ$bA2$X z3=7kzyvJJZqbyOaH(9~F;Mh3*L*wPsQ-U<#U~7UPeoqkm^3w*b4v_Nyd6RB`g3Pr+F%xKDK0_w&FTwgKyfAEGEO~U z7hV%Xr5gsbck5dH8SReOLZ-hjZxr4ODI`g+nfl0#x`-q_(|`6$-|f<{!mz2=ZxV3h ze zwx#OX#{}hcfjh-F(Ru>!Q0i*CHXMtzymUW^`0B%ocy8w2&JazECt_R?`r-$j48jE+ zE#eM6rRK6AP2z#avpDe~+!G`279PZHo~^CSO;N{No}!HfuI0Rz2Qd`VzUQv<*-Qi^$Y0xiY_44+dpd~;iFJwe>{!TV_{l)@4bI|Xb-u+G2rN8QxHWWZ5E{@sLPf~_|fs;yO3^XmaEMD zCR^*M^<<1;e*fSr42)D7SHun*MuBPJwACdvZ=~7sUf62razL-L;(A}3(_ZrN zcB9?nj`m7g+zV3gaQx6pqRZKrFhxAtT8sg|n*zi-Hp{g1An#yr-VxCivlzzywl6tP)hFG{?|9DpI=GI@pQw&%PJg3eCU&?b&$SG;uUdvwYN*>0UhXCIlPLP{j~|C z6Vt*^_cdlTL;;eKx%GM*Z_?7%p6{j*f2sql>xDA8#x@O*QwEK^bKKE^x@cy$*2_^v n$!6zv*&zHOruX|Uk}5tqQeEuq+NglO>HsH4{O$q=@`e8Zx18eF diff --git a/test/constraint/pt_on_circle/normal.png b/test/constraint/pt_on_circle/normal.png index fe0734c2bbfb8bb60b5797d4541fc21092dcaef4..406aa817df87ee2ad6e5484d4c88285172613ae2 100644 GIT binary patch delta 2880 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 C;5J(T diff --git a/test/constraint/pt_on_face/normal.png b/test/constraint/pt_on_face/normal.png index 1f7a7e895a9b2d4c3d5a34466ee6b6fcb7877ad8..0d6ef8215d12540e19517c40006ac4f53ed8239f 100644 GIT binary patch literal 4662 zcmeHLdpMM78-M0CqhTnA9KLEPV%top&9V$85!Pv2Vw^`}TeK6tXh!i;tx#-bQ9?)O zVQP0A7ca^r6^db1%&xC>n1pqhgz>%7woT1;eb-*s_kI8DT<=`(T=Txq^W69Eci;E( zyPt&59j#@hS4jf^WNmFMzW@NDEPnBl=s&fA8IJ&vpSQK#=5p}-$m4Bc4{gqU^Rs2V zUi<1Hh462rO9x~W2X!3$pSAH5jko(+^xWBOl(ed9ug4|wkY@Dy-{=~uJIey}t`Mu-CROZ= z^OUqfFTcn_3pU$f;^uwfQ~QLc$)B)Nw5tppnTEnA!Z8blx6lU*kW(2VUcF5_+5Fc^1`ZU7dVvDF-^(h>5GMlWf!HU} zp8#arS#dMAr34iCVA?V-O?)E)Zb%R_t55|4_OBPqUMxoH8n^ad z2a$-ScvCBLWWoN=#m+eC?_THzCUXaWTqgo9)yoz5d|Mk^K zJ=EP$N1N-32`Q7NYQ7HLVqI2ZNdhz*X`Iy?JvWg<6OxeL?jyKV+neoCoU_`7d~6V& zNOc~)*)}mT5nm^mD({+}NT7Zn3M1y3Xmt30OP z(UcOfY49b6_w@k&r!B?YN4e{sklMH0 zh0GeuZ)2W?(FK#ed9LN>%?%@ymYHp*Vv0T(I?Y?v+S+PWdNcj+boa^>*+@mpL7%Cb(x8cN{ z$-?9=wI;Owk5O|e`f9PbBjY#Kc;l!Q4O)c^p$v7+Qasg@z0`{P+40x#L|C@c9`BE? z4tzT>Wm-!Ki0pXU7#E5ssvgyQmLhn_51vwhv*ajXT@1;T-RI+bO!;XuDV@YbApDE| zp&{$NHJr@lyyuHym=RdtUAs#U94zk5(<)u4!ly0>XE;s^GcK%4Q@Wb`l)S^GO1BC# zsY>38IOFMZ;l0)A=`s%AQ`ew-a0r4WG<^}3Fs9>N9MG&jd)eQ(wm(bNv{*b|?pMP?A4<(;HuSU}!YjCugTEWq zzK)6?s;1FGmI)qVWdF%;gHdPss* zz%ZY4M^sUkZfI?U_bqaA+*36PiQ87O703D@7RQo5Md(Kxy~=2~gFwVtt^WJw%Z7KYiV_^wSf0ONkz{#hp$n-F%`2OOV`i z2^yoIZv-~{W;D>{dZ!@+UH-O;kTbEWu>$>hZ>3Iaur#_*H@)G$og8Ui7&WEf`f*KM z)~jeVTK8?IT``oR#e%u#^lezzJ}^S-b!57y!*%3~j;{~UTnb}ZMG+)zG@1BWwn3$h&Z z)cx-B1Gf9&)-Tqid)w~&@0HTw$q(zwE2AN+Ht^#5&)ldVp84e{joD~Z$d8^_7O~4R z3%CcKCT!>&#ZSm~i^cSV$6&5geyo3|ph_YM1yIv3>gois}#W!>;5*W$Rh+-5MoN zW&lmFHXr^BB5XLIb5ysV-`huM^9bJO{#iEn_dUtMXoRBM-5bDu!sa@5CIMii zAb!Z7cY1L2o$x7XxOe3nebs6`mLsZmKyryLYop+c<3zxVZOTL!B)!`;iUXu)Z~0?V zOqui0MgU8E{Qr*7Oyj>|ib;6T<;NcCAlaHalG+w$_ynsSLcTPxCeG76Nyq%C#i+r_&B zb>zh2ofgzPQl~RuE)$9a^I_`6S(U2^6#{ORGcKYQ$yQ2V@?0QvvIt6OQEj2FFyD-4yS_;C@J8h{5+Ac;5 zsNS3|=ITTUgyi=jjFejtNSyiyWz^gFpP$Nu3YQK^=h=y9*@xfPNmry#NTMcxi1yMZ zt|s*_Zn+7s4nIeQ$*arviY}VH%WrF0{7+9r{^S5=)?B@N$U}>`We0j51Z=GwElVt@ GasLL6s(|+Z literal 4661 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 diff --git a/test/request/arc_of_circle/normal.png b/test/request/arc_of_circle/normal.png index e006a1d84bd0ad4492fea73f2396098fddcd796d..2839007cc95fc697f1a43d21aae85094b3dc6524 100644 GIT binary patch literal 4560 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 U!C812`=tiBIC<>gY=`6i1zXKwMF0Q* literal 4569 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 KFXu)_X3ifNt2a~t delta 2596 zcmeH{eLT~98^^!<*)Tsu%kq$^k#tB>N~w%Il%yogL;N~A#0b?KrP+p)Je0JKqmD*; zLQZyp+*cz)=`_Qz)}d;KbGmZy-NgRQi67Mg^O)jsauy7m0H zY2C=hPmC#R<1(@23I^znm}K9vtW9eX9Ino$(r z9359<3LMJBq%B7<$9)i&Wn7&94<~Q5+;z^AL7hH`kj*%J?+Ejir*P>lAl9cQP&^CC zJzT$7OsqLyw)nK3f9uSG5YOOcsIR7tBa3Uf<>dr^1*=~bM?cfxz3H5vb4A9dOaI^> zi_GW;XCl*ZIFIbJ-B|_EL^Qtlk!d4yXsxS$OeYZ1fh+KJ26k2ircH^-Z_L@cV|Y-mX#&dp2uj5T)UtpyyhuSF?wZZBav03X=8YwVX-M?Z-0HV4iOc_ z>O&v{Kle{a#z^y;9gMsF>2Va6y(JZ(x3iV=^HAu{D#a6xcsn(Q-nUnP#i}~g-&}HW zVCt6-;GCTh(%tzNqdi39=G2j+~N?F)!%gNJ7VGc~ChwmTu48=4MsOY|v0muRf z?nSZ%X6@DpR<*RiRyF@%H=m6&o3CCxb}tE8_hk2>VAYoI|9O2PE_W*;%yc7yNi1>K zgK;gxju*jWEeAFA;O=^QgEEGvh$@}{7UvO{le~Kq%~o@)xRB)ziMS#*nr4?j!7REB ziCk5*xrvLL4d!S|B3CJQhGL@3`G{vtK3&{4KM*y-+jMrtQHz#W9lX5zt4#)%MQ`XR zcpXR0vX)1Grk=Q3ACtn{L zpD?{ozd%<=(b`UOhFY!kN2kZMKX1sby0m6KK70Gz*{pMT4eYp(VB=U4m_Kpq_R$4N z?+E40r#!)xBps6;PgR!|rQ?Z?CbWx ziIppr3#LV*;im1Qrn5+kG-5izf9vp3#)rI3D|svAqRE#9A6;(FR@9#O7*;JAXJBxP&8ABXf4?;7F{*726+0G`wL>oeNU;}wy+(2NZe;VaKbUZCLS#;xnmWnwrAhz; z=0f<|408>%Rv@`{!QNctouf!-{Z>M+BBtfXUih=iTqsK*ah0q-W7Oe^aH?Duv)NHC`>h~x=>wzq3C1u%^c17{VI~eC|8$#Yj=NV8U5FbW*Jliis zzhLaaLjyU^h8V99gPwJ#NB6Z(UK$^G$-UnuiEHd$Jl!XjIr&Z=U{szyJpC$+@vJ;N zq)wDFDNnui)3hj2x=AFFe;Vw3vxs%dHuLDyvDVp{A!&7&o(N;$9Ier(Tg^*y1FEsj L-N)^QE0Xq4woPZN diff --git a/test/request/circle/free_in_3d_dof.png b/test/request/circle/free_in_3d_dof.png index 0a4422b0e2ad5020f922bc3613a65f385db408f2..2b5dff0e5ea948effb9fce02f99a9f59e235c707 100644 GIT binary patch literal 7195 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 LW`_Ct* literal 7197 zcmZ{pdpy(a|HnU@En~={K0?7%EEr_4DycA#0MgE`#}NzN-N!*a-3 zqZ}eO3FWv*lpIP(!tX=(_rANo_xJb59-q&yJ$7x^b-fSI*XwiB+R~VpTZ9_`0A5p* zBgX&$iraW0wtyq`XHo|NK=i%o5&aWk>C;2b=LXc%NX}vHYW*6=;?BgCQ9ns{WWHE= z)^YGzyx^{Ii7yc5@up8@V=`sfgklKy&pr1qZ9i8vWL7m&Jd6Z7M=P^BFFV$806-lI z2e34$b{`Q~fJA^I0f|(G)a`-kiyY0PUlpHulEe1a{JIZ|vh5eq~g$;}CKofImgWXf_LV>P5jr8yPMek1IzWtZ>>1Qwk>IAFbhHfbz;5A!zQVgv5Q+DBCxG) znpK)_W1lUF9NUJAPhg2$nN_$qE`n`+d9&hl#Q<|vE;0y)cAJ0=%8uBXSp4fp3Ii>i zG=Ck@=57*B%y`;mwFpHm*qAL>Uyvms?d7#ITLhzI=_LPLcDVRqwn82v(!YI0^eZL+ z{!*v`8lg7C8Rx3)#2_=kDbC#D-#G8Tj^@8kOR0okrm*eOY~9Nh%XMwF?&aDGoTON+ z-4!PN` zfOdA7y)G-+sn@p|BERnD7{@^hxCT#)#RDZ>Gn^A6JQYZ@Q`zAVnIqBWt*D(Vm@hSsa zR8FCem!B}sHN|aA#|X|8JKrxl1SP(_E&n#8#_{Rag9FL~rOdbe%r65SQ>`i9^Or0t z&hL=4W`5&i)ZIsCuC7S=ICjJNp9@Oz&kjX*J{T9yZS;JqI=b69t15X zFFuh~o8A4`ePnUCsqfW%&HeDlF?Hwn=MB_G^Q(^xTaC)ECJn!;2f(P?OzX<1E=l#y zsa;~fZ9JnmZ(v{!6DO?bDu!j>EzcUBH~?Fdq7#C0C4NN_!Ob9hf1Co(Q9{Fw^zY2E z$5E18SfQJVtHIifih>(cy;S1eOs~JP;IE9cHJUl!{5+gvW&C1$`hE&Pp} zDKGu2g#2@j!d16%;WKZyw1gF=KXXm*oaoU4Iv(@!W7O&_YyH?ejOYZVRhfvVTBeLr zu$o;_Cc`7XMhO{}vi+ga0UBI-Vg^Wal+qr~hd>)@L1%+*vp|LSV9WK^JbReI( zRh7r+&lwwm=fGC!G!C)vU}bl#6PQz)ve(b5ePU`!NJzY*Kxy#KxCcX5 zslRDVtz9%VA|zbrz_Qi#wn3v8HL{_Bv0O3|8wqEh2l;;rK--=bo$5gk9`#d;u9l0d zJ6YiR7WP6IF;5k zMIcVYwnU%sMT?V%G@ND4uH&QwpgEmq4~Ih1kCZhP;VbTD6pX3%(q!POU*g{ z{*k{L!NyQ>SMO@^peRzJxX!iG_2Oo1LTKgC_>mxilzdyMLV6){<_fU zv)*F-GXjvHOO)H?dQCB-G|!r%Hd^^`i7Ei4K3K*R1b$mYGd zlRb#E^{Toz+w1`=0bG2O5?Sh*hr$zcF{pNj0X1H~qf+ySf9A43hm0(}(`}cNQ-Gnv z^y-S;XO6i;6WPbPXv$&7<{uS|d3o!aq3q+617Gch*;-^iuPrDK{l+Cfc|GvN$r(dj zwCw)bM~{1ZYI$Y;cIJdV}q(rdU z_LgJh+ryO|5!Pm4J*+u`X86OB@d$*p8f%u+X4 zhp`E83HreyzX%uhCE?K;yCs*!~sQ96lm4Y>U5sc^$S!xQ=z?GFv4?OAFQuaAL%z~(V3 zAvGYdY>ZJMDH6Pj7(FJ%a$(updEAlu;Clz~3IVTpaGWnZ=@@1xdwbpBzKI(N^|l1{ za0;Pn$F}#%ar>w^#=XSA3u`EB``7NoE~DTSXVu0&9!%oTpP6d(KXm8lUS*7Z?k|gl z)pviXI&_+_D}w$mzKi^94|>j|G4OIdgFGCA#@(kZt8zF_jY)-O@7y28sVPAxO$nDn zHKpmKMWH6>9|Aa5noZwzrCacz_w%2`0FgPb)*ec3u|gO8o;ysA%4b`7?IfAIS7YYE zW@B_zHcUO+ps3!{(!wkodVAb`y<*;fb&0F*s^fAwM|gF%R;O4)njbstX|x=`#vBh! zSMRydiAX`owR#-Fm#aNGdDjLj(Wq3iPtA0QvCVd_TJAwxXDaug@_Ii+Dnk$-%yAT_ zf5@(7J45(b905}0sG+Lvk;ZRgM9^>dvJ&vKcvjADo5vOT9EPTNDL9!6Kx>=8cr<-} zqqFaJf+VR8jD-DO__J~}eEk#8*P^F6K7tYBlUaxMmNUom$&ucJ+!cYn%JU&7NG0~d zjRL!RKT@=gctZ(p&-?DfI7rziJyG8{0+$?-N$pA(f9AEU>b{02)qgH~H5<8$mhE`z z@#9cP*j9a)G=Ab+Gp$t-+$eW{1tmt@xG)8Vj&Gn*BcM|u0=DrD)N$?$Jp7SxnfX$_ zluGgwb6qa6g)fqa01@XL8)BEOLyV#rf(1dw7!-V=r z$!ltES8o%spG>aO@DYT{@L7P)k zuUA(_p01rg06nV_2`|(XF>7x!GDI`R!RB@}ubh_2d#{W9DGo$JLKcH8zOY!-INmq! zfwI@@hM~W?B;6PNaQZ%-qdx>lU@R;%VO0y~t* zaGf^H2|$b=r%29xzzq?Rp=aCaIK(X&AK*pY1K)V)9I{5cl#wALhr5W6jaB2H!8Wxr4{+u@(ffZun z^WAP@NiyJ(?>X$&vD7lTJ)XiK+mvJM3qNx*qQUXcW7O5D5{eUq3k0mfE?UYcAKMU$ z{QhLSy~h@--tuYy4MWel`nJ)N0u7EjK*Tl?a*IVkDJApcy7ZWb{NVHL@#!cU#jm1Z ziDct*ty3j;p)OLN3K@v%17J_u}Y(B^fat-=~eVuuverPyEt@k$+P!Ck?KrS=kjkJ z%ds@wTdmMeNjmAre(nMdsy*Wl3~g=20eG}Uk5&S6& zQBuTz>fyii-v5@G|IjmwzeExMTmb*kzo*4h5^RC|EYV=40ep%z)y-YBID z3$V>))mk+oRZ)0=ac93*Y#@iX6b&FLJG{oEcme?8&t-)*OrMeA2SnU|t*y=U7p{|ectnE!;R2sLkl&yY zn7p@9wVl=GC(;BZnT&cRqG<9uhwRO_L-}85xF<41uGwHoi|YGBr>IF^gBL6TM*K@` z5GW4*hZa!{vqJ#J+SQCz+WgIVTlHBfTGOaEQ2U7%cq8znDzxCBl@ss;%S1Ik5`|7- zGhYHecdWW@7VNLwGKE#0^(W3?vbU;ICqh>2-<)tbIbo~e@%8E!!qMr#tAVVCV0S1} zb#a$LN@Ph_v^qb2T zb!P8t_D^yU=mgxcP+(N8ILbiWl*KA0j_$cp@ET@&W_|~|S7e`eL-`H@l$R~yEo~dy z;>ktBir2NqIziR93~$@6@NvGo^2R4h-~uIe*?K)S_QP0;-IfDoMRxt(u+l0&fr3WPsSfmu}ah2bYI_KGBNvD=b~Q=>2py4VEoCdW#nt z?b{7;mAe&7<5tKgiCgF%vDA%kB!{9(W?Lg&rw&EU>jeVP3!|yc97gmo=CFP$`)ID~n-maaPH<1!g%>xpO)2JJd&S-cbKC`M{CF{sb7!3v3ILJrdD`_JTN8_} z@qV!0N6bmbGo(7tnVr3`^0g~e3a^E%yfwztfbG_!mACenIMg?k@G;)j4%{)L5Nukg zJ?x62jq3ykeC*-ugH+peJwiZi`7Y5E&WiJtLXLUbX)=ib>(fc*$G=!kVN-j-?^*&E_KLIoC)XMkXiJi;Z8;A1Na+pHsinSY#oRmEd zfXF~(DnFK?0mS&|!H?0%cMu|pksHp8C06xG0y_k7Wz)$x{Hblw$+$jsUhu82Ldqgv zQBemuLd>yJXg~P&O zTlXl0gzkP~FZG(~#AUy=08T$*99>Ey($H_7)vv{W*XgSEPxfI>bJVNrRJ9usDsAJr zp_Q4Hxg5~wFWQ=6(O6(uhEDLSmw^GbCIt8Q@3$(VK`i*C|C_=-=yFx3qC1^oQ4I)e zb7}2#r?e%{oaPd*n{{u4i+M5jMD-Jsk3VOj5nXA)vVzGMFOB(Z`m`>dp*$|`M zMGQg7q+_wydrPBlH=2Ctj&$0=(}_Tv4_9S$s{Ap2uki*2*8u7qtXSPsNp>()6jXcf z2_bxO%Gw`-&+)|tf`(it;UOm}2Z0T1=~^hubi9Zpy@sJ{T_XY~jSqiskDi1~rhx83 z+-O@34TzGWvro2PGpsPDp7K6^HILUbVM6BW_ma0h5HR8D3d1i=tv@(jysB|``m^tp zhEM6+Oz`aVla?27^C;5tbkO1&&4#1MO+?hdo+y~xA?>Yc&$R~+5;Dkds^=BHN*-o8|k^!`xcqSVM`@pZoeaY(D6p?e1tVsea6^feSO`9`qw5OMxT%nz?9&sck~`=vy$MXb|(qV7;$?iqI$t za6rYI!bpR9op-K54!zT<8#z@xQOuj~MPc+ym#~BDhDXkF8@KNV6n=nK=_4(rRatPf zy|oRqOXm`=p1_Z-w3|1`)k@bl2t5sSUvDJ)_FFqZwtv$hmj?%ES=&W{486o_QalS9 zkg8h?Qw;LTS0UBPy>*DA2OhzJ6B8o;V46Qo_H6m$qO4^1A$bA<1m3cVJF1Up9&i;C z&=2j8mUV`!fPM?BsBmEBhFo@l5uJqjkg$tJYTh(JF^|vbYq8WpxE*+s$1!BZPuw(w zf47E}&P6IPaGPp=v%#`-byqoL1#o)nGfT6r+wcri82W5%!Ptk09e4&9Mb>?SDuq~X zFV!$MY{T|rJxuX$t)~Q?Gz+@#fFa`f3z2;w0uyF7DE)ug>sz>K#Y#^z zFVo~!BF_#7AU+GR9j~@4%({+C0}8FxSh%(0gfwny?}AN4%%kFD=G7eG42|X=_KYY? zV|u12RVf#K`GC~CW}KK}w>_aQ(@ZKl=jIi4@uS&60=R(lGG#)s68X=@xDQWB&_Br} zuyQX#vk%1`;E@X;^jJxN=Upr1OvuR6F+c)gM!AgYLxDvj9Du|XnJGef!ogx%)=Bpm zdG8s3(iEVZ(ahm}N4EWWRr9&6v9J?=I2!;G4A3>B7sa3obh^dE<=1KkyN?9Y8OgO{ z{MF~aB6>>&ynHFRX$>XcO3DG!NaZwN(D-u{O*%leF9atqCf4->zbsVS)M~7ok}!Ue z+f!B1Fjb3|l5(7U+`2<|e+lB9%%DOJ{G+1~F8o^0;4m@8)4)LeORPRoA1~{8r9546 zO0DQaZxIu}qKXNr3HM*BNt`xu$bx@N*CsFQp{4AoTymC^v)KMMX)jGEu?uT5e$T$Z zZtdowZrACA$$2?ADIi0UykPFIkRg%>hY)y*YKlI0T^R^H24$p*;PRX?F5EyfVS_nw zV`>+-u-#LFN$nunPu_7CV{ZdX<9oN3liEw{6X5MA%owS?^_?K-#0DBrRWlQj9+_P37O?4`>lKjXVstfR>@zk%V1kguYGlwFDte zyXz$2Bu#&TK+^(7NiCr7`m+Ope#s>l7Tblzf#OR5L-C{ z6%0U=d{c(}OITEk1ABV5Y> diff --git a/test/request/circle/normal.png b/test/request/circle/normal.png index 86257e073098c089a4b0acaeff1e7d2d6d60a86e..31e2499f9dd2402663bfd7a77611b323bf906d42 100644 GIT binary patch delta 2407 zcmd^A`#+TV9{_YMa@kt=80dX_qO^4ZMG=S_<4K zz8vf)^CcjoOjFH*JzOISdds84TMHU2+@IFIGR;uuM!TkKffy>ohk4Dkt^DZauQ7{n z%U{B;dJ`y-*9dJayV|+mAn8RU$8vXX-o&7@h9vG?XfDp=pFfpKNYScp?EP5MEbq$RYU5R6AQGrbQ(Ygx zW9bCW=!fDFJ1i;h4ELi)6MImNrb-BaU!0{eBU7@YgaUHc(1J6`%8W>>{N4)Zx`i)M zstMR#!$7tcq&~xv?jJnzMr?+4rSREKggWE^O6gD>qoaJ)HRcG)+{9;6=!=+i7iNc^ z2X8i_09S;Dr<^5K;^!kd=TK5~0ZxHp>y{-pLYfZqU?BAzWI3TSH34IOk`bAMvlRckZXy#XT$vbdKSqsny=DA_Fzc^7rt!_#UN&ohRt4HCzL_qOK|j;7;)WJe$i(P8+N$N#EiBs z&b1G@1BMG~?zP$TZ3})U{H6ADiG$PaMp^Q)uwWeW4^(c|6<}Kh=UEldL!mR-)@v6%MO{L%7miJFgK(Vd^Fj7M+9BzuJRC;|1Ummb8cjTkD^m!f`IB zWWqh#%S&xf?59xNpX!(ktZ^vr68x}QA-QM!1IQJvLr+Jtdp$&1$C%y}KE2yAP9?RO zW_)7`26r44e(9n9ck6b!<1QWfP&otRAOB`3X(aXl|xqGg@ zIlr_O>Oa8j=uhYz_b5rxyST;+v-148_Ks#^MK#L4xt0I6ZBpnHrLgE+sJ)0%{)5$c z7$=M=tsR=$Ri<*(lj(5Tw+;$?qK;PSY8V5q+%4PQK-$s&bVJ&Y(31K^vM33Lr$Rn;y$ef@jjs*qbe$`SD#J}Mb8sqY<)nQDjlw+Ha{Am0b~OBZ zMotXrN-r!7;*P-c3csb^Li*!}$%_Hq-<<5G5Bxs&-1f+ZuQEd`79s@hvAuU^mZE#- zD#c;3jj!$v$60izEjH`7OMdauV;GETR+;d|x!f3`Jhq|qQ(98U(t?cp=}f$%sgF<( z?R%wnW|dx#UhG8LRB4q)$?&1XL*}Obw}a85p+(#qRi2!@j;rxc3WYSt&xGpJJMq9_ zT>WUnhs1S|=95x#lJRQY#I1u$iVbyBvaJPCHxqecSuKOoTO@DKPnzi-9}9ACU% zNu{PT(pq}`*V~*?Xj@6KhOYk?jF}^;#{hfZUqxSOL>)u?UFPtdY$ctN0UhO{*g!Wg zb51|TiZh1S{Qq+R|8I!aIvWMQ{|m;Y)xA@_Cyd!bZ366&^6h9+Qn##i^q+|Usze4@ z10T}(YhJ9*7=CTJJbo8XkZKl!16EeV)v@!pVJr!7ir4Gt4&g+5FO};8rZ<%VKscl! zJ^geS-wz$9=%Uke;^JxW8(px`C!T3h*aLz5L+vi6Xc!M@?oVT6O5Bzv6K%jh9f6ud z?9rdSSQvEgu;nZ$wG=BmJ<^YI zwPbcTGfrxOB;{OXQF_8_HwFf|rBpbXXBeqtD%z>1H*pgSz9}(M)tLK<- zF@D9VEo*z%2B47LpUO=cNc*mRC0$?g!~q_IUhYX`;^#4g0NHkB7e9y?2oQK{zX7A+ zEDeyo*3xL2onnl_NXSm%O63X+`-(${AT9uhXLJftOVY}w?n*! zkckHiDfAajtclhs!)SR*W=h;~EyVRw=iaxUCSZ7WrCCDg$81>1NPDeA<^FIQpx;3k KFXu)_X3ifNt2a~t delta 2596 zcmeH{eLT~98^^!<*)Tsu%kq$^k#tB>N~w%Il%yogL;N~A#0b?KrP+p)Je0JKqmD*; zLQZyp+*cz)=`_Qz)}d;KbGmZy-NgRQi67Mg^O)jsauy7m0H zY2C=hPmC#R<1(@23I^znm}K9vtW9eX9Ino$(r z9359<3LMJBq%B7<$9)i&Wn7&94<~Q5+;z^AL7hH`kj*%J?+Ejir*P>lAl9cQP&^CC zJzT$7OsqLyw)nK3f9uSG5YOOcsIR7tBa3Uf<>dr^1*=~bM?cfxz3H5vb4A9dOaI^> zi_GW;XCl*ZIFIbJ-B|_EL^Qtlk!d4yXsxS$OeYZ1fh+KJ26k2ircH^-Z_L@cV|Y-mX#&dp2uj5T)UtpyyhuSF?wZZBav03X=8YwVX-M?Z-0HV4iOc_ z>O&v{Kle{a#z^y;9gMsF>2Va6y(JZ(x3iV=^HAu{D#a6xcsn(Q-nUnP#i}~g-&}HW zVCt6-;GCTh(%tzNqdi39=G2j+~N?F)!%gNJ7VGc~ChwmTu48=4MsOY|v0muRf z?nSZ%X6@DpR<*RiRyF@%H=m6&o3CCxb}tE8_hk2>VAYoI|9O2PE_W*;%yc7yNi1>K zgK;gxju*jWEeAFA;O=^QgEEGvh$@}{7UvO{le~Kq%~o@)xRB)ziMS#*nr4?j!7REB ziCk5*xrvLL4d!S|B3CJQhGL@3`G{vtK3&{4KM*y-+jMrtQHz#W9lX5zt4#)%MQ`XR zcpXR0vX)1Grk=Q3ACtn{L zpD?{ozd%<=(b`UOhFY!kN2kZMKX1sby0m6KK70Gz*{pMT4eYp(VB=U4m_Kpq_R$4N z?+E40r#!)xBps6;PgR!|rQ?Z?CbWx ziIppr3#LV*;im1Qrn5+kG-5izf9vp3#)rI3D|svAqRE#9A6;(FR@9#O7*;JAXJBxP&8ABXf4?;7F{*726+0G`wL>oeNU;}wy+(2NZe;VaKbUZCLS#;xnmWnwrAhz; z=0f<|408>%Rv@`{!QNctouf!-{Z>M+BBtfXUih=iTqsK*ah0q-W7Oe^aH?Duv)NHC`>h~x=>wzq3C1u%^c17{VI~eC|8$#Yj=NV8U5FbW*Jliis zzhLaaLjyU^h8V99gPwJ#NB6Z(UK$^G$-UnuiEHd$Jl!XjIr&Z=U{szyJpC$+@vJ;N zq)wDFDNnui)3hj2x=AFFe;Vw3vxs%dHuLDyvDVp{A!&7&o(N;$9Ier(Tg^*y1FEsj L-N)^QE0Xq4woPZN diff --git a/test/request/circle/normal_dof.png b/test/request/circle/normal_dof.png index a032f1aa3105641d6c7ac4b6dde80b94461c1a01..0e62eba3dbcd8923d76338faf33196ccbd7ecc55 100644 GIT binary patch literal 4830 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 literal 4836 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 x#go1*;D8Pd%c#{2KrO diff --git a/test/request/cubic/normal.png b/test/request/cubic/normal.png index c4fc05047440a458dcb706f9e18230ab8ea34eb8..e7eb94d81a78bb0ccc1e5238b2b7fe99fb678396 100644 GIT binary patch delta 3065 zcmai$c~}$I8pcnC1VX}&1dv6==6L_nHmC4xO6s@Zscn{R`9H6} za4=`rGvS@QT>*iGnX3WVB);bZ04D%RQ&dM#oLXA8BjST6Snyoi!NI}B14&tyLCO%4CZ&m7gkmU@r%o!)a_oM3L|{QRtU-e?LHz zkSv^*+CFvqK(IWJ`!}8p^qesH(1xB(X}=ok+tJeRL=)^nu(Egxu)D^A08y0=fUhfK z+^vQPSZSp`I5$XZ=5{m=C@xmb&A$KG&5VsS0Y)$KHpZlrjJx`+&WHtBrqeF^F8RA|FH(J7~F(F zXJhX*L!#~kGVhX!eNNv-grHj$XjSN=uz(Cg^>!HdBlS#Y*=YO6#U+rv4rQH9tN+*&)!S}PrniKltPrg& zMQud~h>BBZ*IbdR9w+*SCGVn4rN~mI(p#FXJOaE9(8&A@4&?K;?7O;i#(ZTqp&4$1ICr``vYNHI_z4uOLN1=pFy^;j z>0_G($wIN&*x=%)owL_}#uZ|nLcG1KLb3lGO=^bl6#mRUEhYD3K@eHN#p`I3AE{}t zIz2N*UL?qpLdIA?6kU zo|~UQUxf}Bm_JJ>Suy^e*5rO)TZjxB2C3FttyJORdJ{KN*aUQ4xva083Vv7m>iE3J{X z_?;y0Ox~8O0j#B0gf82w7(n6OSYm0he$t`#FmCK}a*Dm(3(LdM3av1>v2>;t>;=fm z+S->ILU!9lbw{9>`(ND*MHGVxowJmcr^A3 z#QYqi)aaK$5c=^$TAhkvV~Ct{aYQYsK%ljGMW6IqH}Mk@vw69Uuh;VHlo7`nNP~6$ zkLalq+SYPXTT!iU9y5Dsb})_#TOmm#18a=JlK6CHRxD+^~+^NWhPdxoZDQmIAq+=Nf+K!BoG??d%S+-`!Wjq)Mq*|W7UvMgx z7-{O%#<{JjYvE+2x%%`svuBNREZBrTy$1v9iddypoQ&ZIu2Nj@o$2jRQ>Oq7h7n$h^$5 zN$YAgM@D?{U8vjuWtmpT4oxI?s?%4caKVOB1Q5A zU8m0%bR|;y%mvvI@OJDc#9J5?vc3SogZQqt>mE3c_K0ryyBZ13(TeR1MREm>!BpH}lCf&4Epr}c$0!`; zR9(om=(sz2R|Vg$KB&RO6>o?h;58}6)GFNZT=Q6cJELOW^yC=gd2(_`f8h+(rtN)P z%$F_Pt>xjF-9_DTAuV4rhiYSPmZkQV`X!$LKA}C&k7lhAiv}j$r=yCsPuyRa9y_7i zf7K#;RuEepKbF~a1M_XGyW=za%4?$f`uqBPYOr%Ea!c6;7l8~YZ^f-g zbX3+c)!&pJt$8|wv^CAQl@xWq>@^>M9alFKRykW)v*FX6)SlZ@k3@UA?;K-VS4Rc) zw^@qKDjz)xJFXRyjDG)2Cx9dFpBJ^0CSYy8_NzjsYd zk^}XiO)&3OeCh+ZZs#K}8E|H;#NpM_WPsGEuvWdQA~_vqJvsrf&n^d-9YywV!hZm+ C#abc& delta 3044 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 A2mk;8 diff --git a/test/request/ttf_text/normal.png b/test/request/ttf_text/normal.png index ccb581f00aeae407da622342f3f8f36250276b27..b023b8388bcb35bb4aed0b2fe7f0e9f88dc24cc0 100644 GIT binary patch delta 1694 zcmV;P24VS%Fpe;gBmvd2B@GUL^nq*1tkrzKwd3mO19xxdV;$vLSh)Ap2b1>mzK!29dwaST@o%ufUs(2ve%zLSwPKcGDx_?FyW zZR?p9&bgYaF^;n@6>fRWv^2~3R;Bk1fdw39%YnM}gVb8d$1^|BEqzXZ*Z!HKX0BR` zxRj&LpS$m4ttGF6Z(cKJ`+cqVT1cvwd7*d)#j?Z|=h|{OvKcGVZ-*l%Bmlw$5fg3zWSt zc$(VJfz1)aYm!|nA6W)Dym*> zW4`^=>+p!bC_J0NOg#7V_}u%ov?#0&dJk%qzyiKjI}9Gj(BiUx+dGf5GDkn3d(T4b z^?06bH}$)(@fU?2UbkkfmU9jkKm%$WXdN)mWv@@&CeNq53Nu*1*AD%g_iw))x37ae zI|=%TbBm5#PU=OEW4=o*74~|5V=Dv}Kx1Bg+U(l{+|dWj`3c=eN}R{kyRFO4d!08| z)ihPvt-u1la_E~*?>JU_v#jCMCnmq$?h$%CIQKZ_XTG^C#95w$ngkX=<6eDYa?79P zdX}Ew=e3e0u;8pN@G5g3zT1PBJ_ zHBD7^E0cf(Fq04w3>&K#SmRi2*8l)}GJ^#G5GJsIewg_N)~fWrA(IdjBnl?50D$wF zrYgG?ljH(0lg|(g8`TS}ajdp$0DwK2!2$pX6Ieh$%zOiDReIkLlYtN$k*^GsffE&z zp#>tdkPtZm8C@^1ZnXyh0G!?R0;?2}1pw^ont=rXup^V<5+)9-U3T;SXosq!002(R z43psm9h1-z2a}u-Hbiv;%SWyOfD@`4Skol30D#k}zeFgq0D!$rQ@J_E}aL<0Z~ z>oc%QIc;R!%GEBd4*=)WZ(x;j+Q=$JXu(q_{qG&vQKk2dz5}b2(?!-${{A(IA`1Ze z(|=%#(RsisYN>>>WSPe641ps{#SPe331ps{$SdB4j1pxgUickAD<^IbMR{+qj>s|+| z(JRS6emxE_)98P<0FSO4SSS2~XaJxM*A1*vL>7Mlu#0O4Rw*J20EiP+beV4+WJfLyZi%{Q{c%^oPz1sh`&-q^4{j~jB+X3Jb+6b&yk<@B5 zt@RjC??UUu(3oKRp`3ImY{hovM?7WzxXBpP+&p{dhE}`GRdgXt} z$odp@TgI~HD)oG3i4cGa+E^l7>)kTi(Fej$%X*3HC*8O6&9)xL(%Wp>r^o*6_wed@ zTPyMW15iiB_v%Ysm%`)e@aDO7yWhMP+}zwcxt(u`u$CILX8=Hx>Mjv}3X*T8^_IlW z9@|gt_nTO=ecM0t_7m?LXMTQc-}V@7f7^D$hVo-73)*#-%XI*783GFcAj~xi3*NYbZ z?@zD4DNZjl5|P5G8>5mr+h^tvScV>T2WzE8u1*SkN^_@hLWcHaWP4vobRfmMPknlr znp(Nqj9EcKjeUnIVL1wTBmZ7GsiZDe!+1v7L5E4=_=qgGu-a33a&b&J0WN=@JgnBn zohCxMwQ8V||L`}tx7MW{GY~d6NBcN_d2q7~hnOlnwNFm)?YN(-dvrHn!tlEj(Ie9Fn}zWn*|v_O)4DNnlJZAuVN$8#u}Mm3;j=jTvFXM4v_ zqFMr%1yw#93AVdx+ZekI0vaPF9E>HQS^BSMYyu*b^Q#-oiRI}LE}NNrsN97&+q9d% z*2c>2ZnX9-*Io}uS^t=<^Q}K$IJ7X2vX16jh%%vdPgG%v!zTzRojYDA)BzVlO$n(x@=7x5XN2T<66- zd0DN5EPsH#-!5Htavn}xoR%fc3x{hsX%C++VfQ5bRFb@K2aXUg`?z39muGGm20Ahd z9oEqDIK(>-X>i0|OqQH6qzoE(v!;EHZPi0C-s+z;C{8lFm67#9@&4UP@M$-;?vG?Z zz4iOIu!Va{=1%rJg}$s=4FI*Rn?U^KNGqUTyolxjkozTl z(!$y7Dt|C@=Abe%#|nsktfn8k~4|unaLyf^~sNSCGSR|(Ntz+M>%jLPhoiGBkeM5Ar%^^y$LFEcc57^5{ z#H|}Cpe~`<0PEIprzy5`g1ruzEz+1aMSX|Fvkg7-7a!|{F#o5jo{>D_FIT(z?O)4# zUCv*E1W`2m_m*t%>}_;wDFUeG9B9$6%ll8*wc)|P8wzMSt#%E8)e9GgSvB2PVi@vp&YNzq?}$&)jgS_*u66Xnw)6`(YwHTOUxBR zlI?d^5VIpWFhyy+xhZJ>PZurvr+z2}9Gm8wMVv{*zZ(z-MeM=?VoZpR(lU zI@jGo{SzZ3qHt}=bQ6E6dbL0MBa9k_k}zme&?Y;o_|iSySA~3_(VoBDeA+nbqMr48bkP zhAunEbz07;w*Qu-cXW=CBJ`i^UROaenVIL~ zBj5}6%5Mi{L19X|tGmS2hud7mpSEGVD50q9Wv5m6SA>F_^H6|#ypqj(k2Y>5TupGq zbN}?Am~j6t<6Y3|)PC~xZdONpx<7~uLDJUU@5S7C!gqu%UQ7`d4DngFh3ekR|zm3`T~RrVC@g z_SXb$rsBWK+Ig(a?HQNN;R^{7KS2b8l=sQQNpvVwv7S){Zhz;z6k&oc^l~wu0)8Q0sJ7_2K9Hey#_5^Uay>LZ5{YZ~PAs C$5JH# From adcfe234876dce03e0b3505f43493eab31960044 Mon Sep 17 00:00:00 2001 From: whitequark Date: Fri, 19 Jun 2020 01:04:01 +0000 Subject: [PATCH 069/646] Use C++11 [[noreturn]] attribute instead of GNU-specific one. --- src/platform/gui.h | 4 +--- src/solvespace.h | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/platform/gui.h b/src/platform/gui.h index 05dbb7a56..a56028d18 100644 --- a/src/platform/gui.h +++ b/src/platform/gui.h @@ -101,9 +101,7 @@ std::string AcceleratorDescription(const KeyboardEvent &accel); //----------------------------------------------------------------------------- // Handling fatal errors. -#if defined(__GNUC__) -__attribute__((noreturn)) -#endif +[[noreturn]] void FatalError(const std::string &message); // A native settings store. diff --git a/src/solvespace.h b/src/solvespace.h index 17e74b544..70658d5a0 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -83,9 +83,7 @@ using std::max; using std::swap; using std::fabs; -#if defined(__GNUC__) -__attribute__((noreturn)) -#endif +[[noreturn]] void AssertFailure(const char *file, unsigned line, const char *function, const char *condition, const char *message); From 358114564e5650682928e0cc3c78624f54f1ebce Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 21 Jun 2020 00:55:17 +0000 Subject: [PATCH 070/646] Disable OpenMP. This is unfortunate, but OpenMP is not available on some toolchains (most MinGW builds) and, more importantly, breaks the distribution model we use on Windows, which is a single self-contained executable. Leave the OpenMP disabled by default everywhere so that we don't have any second-class platforms where SolveSpace is slower than on first- class ones. Fixes #631. --- CMakeLists.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6494993fb..5a258f4b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,8 @@ set(ENABLE_COVERAGE OFF CACHE BOOL "Whether code coverage information will be collected") 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(OPENGL 3 CACHE STRING "OpenGL version to use (one of: 1 3)") @@ -96,13 +98,11 @@ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X8 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLOAT_FLAGS}") endif() -# We use OpenMP to speed up some geometric operations, but it's optional. -include(FindOpenMP) -# No MinGW distribution actually ships an OpenMP runtime, but FindOpenMP detects it anyway. -if(OpenMP_FOUND AND NOT MINGW) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") -else() - message(WARNING "OpenMP not found, geometric operations will be single-threaded") +if(ENABLE_OPENMP) + include(FindOpenMP) + if(OpenMP_FOUND) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + endif() endif() if(APPLE OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") From 34dde1dcf9098b415d6511addbb18681173cc29f Mon Sep 17 00:00:00 2001 From: whitequark Date: Sun, 21 Jun 2020 01:20:57 +0000 Subject: [PATCH 071/646] GTK: filter events more precisely. Turns out that GDK_MOD2_MASK, at least on some systems, corresponds to NumLock. Use the function provided by GDK to handle this. Fixes #634. --- src/platform/guigtk.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index e68fd3040..cd5d0b8df 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -565,7 +565,8 @@ class GtkGLWidget : public Gtk::GLArea { KeyboardEvent event = {}; event.type = type; - if(gdk_event->state & ~(GDK_SHIFT_MASK|GDK_CONTROL_MASK)) { + Gdk::ModifierType mod_mask = get_modifier_mask(Gdk::MODIFIER_INTENT_DEFAULT_MOD_MASK); + if((gdk_event->state & mod_mask) & ~(GDK_SHIFT_MASK|GDK_CONTROL_MASK)) { return false; } From 747778cd5ee9e1bb163e87b9bb1bc0d248dd9a2e Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 23 Jun 2020 01:05:51 +0000 Subject: [PATCH 072/646] Delete all entities on a workplane request that is being deleted. Fixes #628. --- src/graphicswin.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 95a4ad02d..bc4e485f5 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -954,9 +954,17 @@ void GraphicsWindow::ForceTextWindowShown() { } void GraphicsWindow::DeleteTaggedRequests() { + Request *r; + // Delete any requests that were affected by this deletion. + for(r = SK.request.First(); r; r = SK.request.NextAfter(r)) { + if(r->workplane == Entity::FREE_IN_3D) continue; + if(!r->workplane.isFromRequest()) continue; + Request *wrkpl = SK.GetRequest(r->workplane.request()); + if(wrkpl->tag) + r->tag = 1; + } // Rewrite any point-coincident constraints that were affected by this // deletion. - Request *r; for(r = SK.request.First(); r; r = SK.request.NextAfter(r)) { if(!r->tag) continue; FixConstraintsForRequestBeingDeleted(r->h); From f5f8c3411230a0372d56032204f3d53f9251e57c Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 23 Jun 2020 01:16:58 +0000 Subject: [PATCH 073/646] Show center of mass using the same format as for constraints. --- src/draw.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/draw.cpp b/src/draw.cpp index 5c6dd8a7b..c3ce4561f 100644 --- a/src/draw.cpp +++ b/src/draw.cpp @@ -769,9 +769,13 @@ void GraphicsWindow::Draw(Canvas *canvas) { const double size = 10.0; const int subdiv = 16; double h = Style::DefaultTextHeight() / camera.scale; - canvas->DrawVectorText(ssprintf("%.3f, %.3f, %.3f", p.x, p.y, p.z), h, + std::string s = + SS.MmToStringSI(p.x) + ", " + + SS.MmToStringSI(p.y) + ", " + + SS.MmToStringSI(p.z); + canvas->DrawVectorText(s.c_str(), h, p.Plus(u.ScaledBy((size + 5.0)/scale)).Minus(v.ScaledBy(h / 2.0)), - u, v,hcsDatum); + u, v, hcsDatum); u = u.WithMagnitude(size / scale); v = v.WithMagnitude(size / scale); From ef840cb297e4029ff2bf93e9f3b98a98326206e5 Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 23 Jun 2020 02:24:12 +0000 Subject: [PATCH 074/646] Show area of closed contour with SI units. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Similar to the way that Analyze → Measure Area... works. Fixes #639. --- src/groupmesh.cpp | 6 +----- test/analysis/contour_area/normal.png | Bin 4872 -> 4787 bytes 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/groupmesh.cpp b/src/groupmesh.cpp index 8117834ef..a46bb2214 100644 --- a/src/groupmesh.cpp +++ b/src/groupmesh.cpp @@ -767,11 +767,7 @@ void Group::DrawContourAreaLabels(Canvas *canvas) { Canvas::Stroke stroke = Style::Stroke(hs); stroke.layer = Canvas::Layer::FRONT; - double scale = SS.MmPerUnit(); - std::string label = ssprintf("%.3f %s²", - fabs(sbls.SignedArea() / (scale * scale)), - SS.UnitName()); - + std::string label = SS.MmToStringSI(fabs(sbls.SignedArea()), /*dim=*/2); double fontHeight = Style::TextHeight(hs); double textWidth = VectorFont::Builtin()->GetWidth(fontHeight, label), textHeight = VectorFont::Builtin()->GetCapHeight(fontHeight); diff --git a/test/analysis/contour_area/normal.png b/test/analysis/contour_area/normal.png index 9daf8eebb6a11cd10651ddfb29e9bfb8865aa9a3..486fcdc4102cb485be2fb3f83264897aada4eeae 100644 GIT binary patch delta 2645 zcma)8X;hO}8omjTAYn7OAiGkfDhL$`C}L1>sHF-O#DHKzMV5wu6hzh}r~@O_Ab!)J zpac$sR3H$GA;^{h+SHLnp%Nr)DQZv%vL1aG@=(9xLxHH!I9KyCCs=|QH%0Ptj`A_V}DY7G_ZY=j&zn<0|UhFpQ;Ez~;P zvTx#>xM)f~b!FC0$WrHzzUC{%pD#Z2ILuU-KiVH%OLZ3M6?7zi3`iK{cxpq3k((iV z%(`twmPcbZX(v>U)okMzPMsKt>_EFlAUT=a*< zD3zKi_gc1jL>F%7jQpI*&-%&W#ca<2{Bp@+y|-C2j!a8Wx!p12raQi#ASfSNaaSrM zT@_N-rigtj(=+2tYYZVvfLxlc9*EyLM9zGd^vpN1Wt3(}m_kXJ1Y36HIh6}Q4g}wT$B{o+wDwV%~Ys|-Y$nf?VQ_DRo9)GN;utr(GEchJ$ znwIthTlw(Kp|tt*THo*0qC>rH3o><_LaqPq7R8LrAlKLp=*LipdeY{*avG0L7JRf< zPo}0e$E3xoqcMz{(rRH@9y`VCT6ItNY+Ly5;p~)>L=+}*g!AObmECuj{!j((7%&-b zyJ^FrpK7=9jw_?7%hA)*jPva`Tx@+}Xiilm#bol5$4!{&xIIN@om^+U$+GuvMX9Xu zfavEn0fPF*Y(pf>Pb~Q(iq;{q+me#K8wT9Yp?A0*9P1ixu992FoU~nsWOH$kq!A4o zHibm1SN#qPmTu4IaOC+-od$I$NG)0x?jw7p=-`MoA%d&xYylk#Mq5Ex%t`&OvfmtZ zpIT?g;;4d)pUcR=G+;Afl#mz+=uT^8>5gwt(@^ZHkI~L;vDr=H-+%CigT(wL?Nvlh zF&B5*09hMZ$nv=nYMkwb6pzB{ZHIg{w&Zd!5DSCe004RKmA@*OPQAT|nmm;-Xb8n& zZ6G`JhP|*gRat08zdVR%nY1}<$kD77E+RyqT>*ryWrGVTgql6Z%|ZA>3|$iwA2 zH(+SWbiqoS|&W@jBSa{KAHz}##ex$Fw z=kzi28qL;{c&cFAr$x16w?bPn7XO2D)GFuDIP$Cihfe60rZr@!hrtp;NH@;CE=GXf zFx2XPK`j__*jJ6vbY=eiTWva!7~ueaW1u2k>k}Lyrt&d-I0%N^&XTx0eg*VXZs8;Z zsQenf{UsfTH4k2!4U6gXAJCd9kBn_duH$;V{}Ry69k1jTTf?Y0j|x3o`^PAd_zRA6 z|5z9TH2Cp7zl5>5-}*fZ9oMMf{%UFfIGGgqxDYV3VaQcA{TX5&BlA6=14zO(9ieII zC?+dJ8$=UW8E?^^8o;zSg2b&A|DG={Y2qFN6F&TmSN$>86;8!k5wf{7bbx=t;Fv2X zNE{NTClgviaM~ig5*yUJ+ z+vGBdGI#Hd5AC4-g|HH-o#25`uhLvaj|3!B3ujJ{5iJl1c3HsdF$x6kcLhHjhuQoN zIqnWWwj##~FU9XQ!1Awb!GU{+>-Uu;Q0_;)Kg6V_QJ#(R6NwML@*m23Mf3tLa756D z?jMI9^BZdCoEhQlBAd?BMMmkUUMJ}ufppvR>t2OuJcwk^n-R)hJ_^Hq*jKKJn0rd2 zU8kpR3~{cVZY%Whct0TA^Ylgc`Q}lp)UMJNk>}v!>B0W4X-dQVe%_(lgu7)Ygy~Vw z(-l3RPs~5ZZfiua9iFmd+emuTvkhz_8NtUFbPByEOLflD0w% z9K6}gx^nSg4d)dv*o9H)J?h%5m*?-*S31g{KSU(+d2%Ax5?Hk2kmD!6pg84EUNrF) z9U1SYR5e@n9#G};$j^S#VwN|n5o6!*yIKw?8gDBK&(|rEEdGTUp>3TrCFC_mgbilb zi>|*dy!1ed^S%l;^!XF26udNNRF}KCsCA)Md?@<+kj-g))T8*?6_5 d!*1?VgAsGZ$@!)JVYuf5$Bv%xtU5xv{2!c>=3)Q< delta 2740 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 From a2c0b5887363921e3a6b2d280eea018d4117f4fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Thu, 9 Jul 2020 11:19:21 +0200 Subject: [PATCH 075/646] README: fix extlib/q3d{o,} typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e6b229b75..cd72564dc 100644 --- a/README.md +++ b/README.md @@ -185,7 +185,7 @@ Before building, check out the project and the necessary submodules: git clone https://github.com/solvespace/solvespace cd solvespace - git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3do + git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d After that, build SolveSpace as following: From bea3194ea162ca967b1fe3ca6c581d75a56b721d Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 1 Jul 2020 16:16:27 -0400 Subject: [PATCH 076/646] Better helical triangulation - issue 489. Resolve issue #489 helix has stairsteps. Force helix axis line to 8 segments. Grid triangulation to use a minimum of 4 segments for degree>1. Adds twist dependence for grid triangulation with degree=1. Added a max_dt parameter for PWL creation and use that for helical edges. --- src/srf/ratpoly.cpp | 52 ++++++++++++++++++++++++----------------- src/srf/surface.cpp | 12 +++++++--- src/srf/surface.h | 15 ++++++------ src/srf/triangulate.cpp | 48 ++++++++++++++++++++++++++++++------- 4 files changed, 87 insertions(+), 40 deletions(-) diff --git a/src/srf/ratpoly.cpp b/src/srf/ratpoly.cpp index 7affff028..6498cc4a0 100644 --- a/src/srf/ratpoly.cpp +++ b/src/srf/ratpoly.cpp @@ -173,18 +173,18 @@ void SBezier::SplitAt(double t, SBezier *bef, SBezier *aft) const { } } -void SBezier::MakePwlInto(SEdgeList *sel, double chordTol) const { +void SBezier::MakePwlInto(SEdgeList *sel, double chordTol, double max_dt) const { List lv = {}; - MakePwlInto(&lv, chordTol); + MakePwlInto(&lv, chordTol, max_dt); int i; for(i = 1; i < lv.n; i++) { sel->AddEdge(lv[i-1], lv[i]); } lv.Clear(); } -void SBezier::MakePwlInto(List *l, double chordTol) const { +void SBezier::MakePwlInto(List *l, double chordTol, double max_dt) const { List lv = {}; - MakePwlInto(&lv, chordTol); + MakePwlInto(&lv, chordTol, max_dt); int i; for(i = 0; i < lv.n; i++) { SCurvePt scpt; @@ -195,32 +195,42 @@ void SBezier::MakePwlInto(List *l, double chordTol) const { } lv.Clear(); } -void SBezier::MakePwlInto(SContour *sc, double chordTol) const { +void SBezier::MakePwlInto(SContour *sc, double chordTol, double max_dt) const { List lv = {}; - MakePwlInto(&lv, chordTol); + MakePwlInto(&lv, chordTol, max_dt); int i; for(i = 0; i < lv.n; i++) { sc->AddPoint(lv[i]); } lv.Clear(); } -void SBezier::MakePwlInto(List *l, double chordTol) const { +//-------------------------------------------------------------------------------------- +// all variants of MakePwlInto come here. Split a rational Bezier into Piecewise Linear +// segments that don't deviate from the actual curve by more than the chordTol distance. +// max_dt allows to force curves to be split into spans of no more than a certain +// length based on t-parameter. RemoveShortSegments() may delete points when dt <= 0.1 +//-------------------------------------------------------------------------------------- +void SBezier::MakePwlInto(List *l, double chordTol, double max_dt) const { if(EXACT(chordTol == 0)) { // Use the default chord tolerance. chordTol = SS.ChordTolMm(); } + // Never do fewer than three intermediate points for curves; people seem to get + // unhappy when their circles turn into squares, but maybe less + // unhappy with octagons. Now 16-gons. + if (EXACT(max_dt == 0.0)) { + max_dt = (deg == 1) ? 1.0 : 0.25; + } l->Add(&(ctrl[0])); - if(deg == 1) { + // don't split first degee (lines) unless asked to by the caller via max_dt + if((deg == 1) && (max_dt >= 1.0)) { l->Add(&(ctrl[1])); } else { - // Never do fewer than one intermediate point; people seem to get - // unhappy when their circles turn into squares, but maybe less - // unhappy with octagons. - MakePwlInitialWorker(l, 0.0, 0.5, chordTol); - MakePwlInitialWorker(l, 0.5, 1.0, chordTol); + MakePwlInitialWorker(l, 0.0, 0.5, chordTol, max_dt); + MakePwlInitialWorker(l, 0.5, 1.0, chordTol, max_dt); } } -void SBezier::MakePwlWorker(List *l, double ta, double tb, double chordTol) const +void SBezier::MakePwlWorker(List *l, double ta, double tb, double chordTol, double max_dt) const { Vector pa = PointAt(ta); Vector pb = PointAt(tb); @@ -229,16 +239,16 @@ void SBezier::MakePwlWorker(List *l, double ta, double tb, double chordT double d = pm.DistanceToLine(pa, pb.Minus(pa)); double step = 1.0/SS.GetMaxSegments(); - if((tb - ta) < step || d < chordTol) { + if(((tb - ta) < step || d < chordTol) && ((tb-ta) <= max_dt) ) { // A previous call has already added the beginning of our interval. l->Add(&pb); } else { double tm = (ta + tb) / 2; - MakePwlWorker(l, ta, tm, chordTol); - MakePwlWorker(l, tm, tb, chordTol); + MakePwlWorker(l, ta, tm, chordTol, max_dt); + MakePwlWorker(l, tm, tb, chordTol, max_dt); } } -void SBezier::MakePwlInitialWorker(List *l, double ta, double tb, double chordTol) const +void SBezier::MakePwlInitialWorker(List *l, double ta, double tb, double chordTol, double max_dt) const { Vector pa = PointAt(ta); Vector pb = PointAt(tb); @@ -259,13 +269,13 @@ void SBezier::MakePwlInitialWorker(List *l, double ta, double tb, double }); double step = 1.0/SS.GetMaxSegments(); - if( ((tb - ta) < step || d < chordTol) && ((tb-ta) < 0.2) ) { + if( ((tb - ta) < step || d < chordTol) && ((tb-ta) <= max_dt) ) { // A previous call has already added the beginning of our interval. l->Add(&pb); } else { double tm = (ta + tb) / 2; - MakePwlWorker(l, ta, tm, chordTol); - MakePwlWorker(l, tm, tb, chordTol); + MakePwlWorker(l, ta, tm, chordTol, max_dt); + MakePwlWorker(l, tm, tb, chordTol, max_dt); } } diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp index 6afcc791b..fbdc5d92f 100644 --- a/src/srf/surface.cpp +++ b/src/srf/surface.cpp @@ -746,7 +746,9 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector sc = {}; sc.isExact = true; sc.exact = sb->TransformedBy(ts, qs, 1.0); - (sc.exact).MakePwlInto(&(sc.pts)); + double max_dt = 0.5; + if (sc.exact.deg > 1) max_dt = 0.25; + (sc.exact).MakePwlInto(&(sc.pts), 0.0, max_dt); // the surfaces already exist so trim with this curve if(j < sections) { @@ -771,7 +773,9 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector sc = {}; sc.isExact = true; sc.exact = sb->TransformedBy(ts, qs, 1.0); - (sc.exact).MakePwlInto(&(sc.pts)); + double max_dt = 0.5; + if (sc.exact.deg > 1) max_dt = 0.25; + (sc.exact).MakePwlInto(&(sc.pts), 0.0, max_dt); sc.surfA = hs1; // end cap sc.surfB = hs0; // staring cap hSCurve hcb = curve.AddAndAssignId(&sc); @@ -793,7 +797,9 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector sc.isExact = true; sc.exact = SBezier::From(ss->ctrl[0][0], ss->ctrl[0][1], ss->ctrl[0][2]); sc.exact.weight[1] = ss->weight[0][1]; - (sc.exact).MakePwlInto(&(sc.pts)); + double max_dt = 0.5; + if (sc.exact.deg > 1) max_dt = 0.125; + (sc.exact).MakePwlInto(&(sc.pts), 0.0, max_dt); sc.surfA = revs[j]; sc.surfB = revsp[j]; diff --git a/src/srf/surface.h b/src/srf/surface.h index c82af1ce5..d1918b6c1 100644 --- a/src/srf/surface.h +++ b/src/srf/surface.h @@ -92,12 +92,12 @@ class SBezier { Vector Start() const; Vector Finish() const; bool Equals(SBezier *b) const; - void MakePwlInto(SEdgeList *sel, double chordTol=0) const; - void MakePwlInto(List *l, double chordTol=0) const; - void MakePwlInto(SContour *sc, double chordTol=0) const; - void MakePwlInto(List *l, double chordTol=0) const; - void MakePwlWorker(List *l, double ta, double tb, double chordTol) const; - void MakePwlInitialWorker(List *l, double ta, double tb, double chordTol) const; + void MakePwlInto(SEdgeList *sel, double chordTol=0, double max_dt=0.0) const; + void MakePwlInto(List *l, double chordTol=0, double max_dt=0.0) const; + void MakePwlInto(SContour *sc, double chordTol=0, double max_dt=0.0) const; + void MakePwlInto(List *l, double chordTol=0, double max_dt=0.0) const; + void MakePwlWorker(List *l, double ta, double tb, double chordTol, double max_dt) const; + void MakePwlInitialWorker(List *l, double ta, double tb, double chordTol, double max_dt) const; void MakeNonrationalCubicInto(SBezierList *bl, double tolerance, int depth = 0) const; void AllIntersectionsWith(const SBezier *sbb, SPointList *spl) const; @@ -362,8 +362,9 @@ class SSurface { void MakeClassifyingBsp(SShell *shell, SShell *useCurvesFrom); double ChordToleranceForEdge(Vector a, Vector b) const; void MakeTriangulationGridInto(List *l, double vs, double vf, - bool swapped) const; + bool swapped, int depth) const; Vector PointAtMaybeSwapped(double u, double v, bool swapped) const; + Vector NormalAtMaybeSwapped(double u, double v, bool swapped) const; void Reverse(); void Clear(); diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index 51a31dddf..d02db791b 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -382,13 +382,24 @@ Vector SSurface::PointAtMaybeSwapped(double u, double v, bool swapped) const { } } +Vector SSurface::NormalAtMaybeSwapped(double u, double v, bool swapped) const { + Vector du, dv; + if(swapped) { + TangentsAt(v, u, &dv, &du); + } else { + TangentsAt(u, v, &du, &dv); + } + return du.Cross(dv).WithMagnitude(1.0); +} + void SSurface::MakeTriangulationGridInto(List *l, double vs, double vf, - bool swapped) const + bool swapped, int depth) const { double worst = 0; // Try piecewise linearizing four curves, at u = 0, 1/3, 2/3, 1; choose // the worst chord tolerance of any of those. + double worst_twist = 1.0; int i; for(i = 0; i <= 3; i++) { double u = i/3.0; @@ -405,16 +416,24 @@ void SSurface::MakeTriangulationGridInto(List *l, double vs, double vf, Vector pm1 = PointAtMaybeSwapped(u, vm1, swapped), pm2 = PointAtMaybeSwapped(u, vm2, swapped); + // 0.999 is about 2.5 degrees of twist over the middle 1/3 V-span. + // we don't check at the ends because the derivative may not be valid there. + double twist = 1.0; + if (degm == 1) twist = NormalAtMaybeSwapped(u, vm1, swapped).Dot( + NormalAtMaybeSwapped(u, vm2, swapped) ); + if (twist < worst_twist) worst_twist = twist; + worst = max(worst, pm1.DistanceToLine(ps, pf.Minus(ps))); worst = max(worst, pm2.DistanceToLine(ps, pf.Minus(ps))); } double step = 1.0/SS.GetMaxSegments(); - if((vf - vs) < step || worst < SS.ChordTolMm()) { + if( ((vf - vs) < step || worst < SS.ChordTolMm()) + && ((worst_twist > 0.999) || (depth > 4)) ) { l->Add(&vf); } else { - MakeTriangulationGridInto(l, vs, (vs+vf)/2, swapped); - MakeTriangulationGridInto(l, (vs+vf)/2, vf, swapped); + MakeTriangulationGridInto(l, vs, (vs+vf)/2, swapped, depth+1); + MakeTriangulationGridInto(l, (vs+vf)/2, vf, swapped, depth+1); } } @@ -432,11 +451,22 @@ void SPolygon::UvGridTriangulateInto(SMesh *mesh, SSurface *srf) { List li, lj; li = {}; lj = {}; - double v = 0; - li.Add(&v); - srf->MakeTriangulationGridInto(&li, 0, 1, /*swapped=*/true); - lj.Add(&v); - srf->MakeTriangulationGridInto(&lj, 0, 1, /*swapped=*/false); + double v[5] = {0.0, 0.25, 0.5, 0.75, 1.0}; + li.Add(&v[0]); + srf->MakeTriangulationGridInto(&li, 0, 1, /*swapped=*/true, 0); + lj.Add(&v[0]); + srf->MakeTriangulationGridInto(&lj, 0, 1, /*swapped=*/false, 0); + + // force 2nd order grid to have at least 4 segments in each direction + if ((li.n < 5) && (srf->degm>1)) { // 4 segments minimun + li.Clear(); + li.Add(&v[0]);li.Add(&v[1]);li.Add(&v[2]);li.Add(&v[3]);li.Add(&v[4]); + } + if ((lj.n < 5) && (srf->degn>1)) { // 4 segments minimun + lj.Clear(); + lj.Add(&v[0]);lj.Add(&v[1]);lj.Add(&v[2]);lj.Add(&v[3]);lj.Add(&v[4]); + } + if ((li.n > 3) && (lj.n > 3)) { // Now iterate over each quad in the grid. If it's outside the polygon, // or if it intersects the polygon, then we discard it. Otherwise we From 0ffb9d20b106fa61db500dfd3a847eb937087209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Thu, 9 Jul 2020 15:25:36 +0200 Subject: [PATCH 077/646] Add and build mimalloc at 07c6e60a5a3bd7de09e4a170cd97bafba59cfafd --- .gitmodules | 3 +++ .travis/install-debian.sh | 2 +- CMakeLists.txt | 8 ++++++++ README.md | 4 ++-- extlib/mimalloc | 1 + pkg/snap/snap/snapcraft.yaml | 2 +- src/CMakeLists.txt | 15 +++++++++++---- 7 files changed, 27 insertions(+), 8 deletions(-) create mode 160000 extlib/mimalloc diff --git a/.gitmodules b/.gitmodules index 51dd07929..51193203e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -26,3 +26,6 @@ [submodule "extlib/q3d"] path = extlib/q3d url = https://github.com/q3k/q3d +[submodule "extlib/mimalloc"] + path = extlib/mimalloc + url = https://github.com/microsoft/mimalloc diff --git a/.travis/install-debian.sh b/.travis/install-debian.sh index c8b7d70b2..fb20fffaa 100755 --- a/.travis/install-debian.sh +++ b/.travis/install-debian.sh @@ -7,4 +7,4 @@ sudo apt-get install -q -y \ libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev libgl-dev \ libgl-dev libglu-dev libspnav-dev -git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d +git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d extlib/mimalloc diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a258f4b7..c4914d63c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -175,6 +175,14 @@ message(STATUS "Using in-tree q3d") add_subdirectory(extlib/q3d) set(Q3D_INCLUDE_DIR ${CMAKE_BINARY_DIR}/extlib/q3d) +message(STATUS "Using in-tree mimalloc") +set(MI_OVERRIDE OFF CACHE BOOL "") +set(MI_BUILD_SHARED OFF CACHE BOOL "") +set(MI_BUILD_OBJECT OFF CACHE BOOL "") +set(MI_BUILD_TESTS OFF CACHE BOOL "") +add_subdirectory(extlib/mimalloc) +set(MIMALLOC_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/extlib/mimalloc/include) + 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 diff --git a/README.md b/README.md index cd72564dc..295f25fea 100644 --- a/README.md +++ b/README.md @@ -83,7 +83,7 @@ Before building, check out the project and the necessary submodules: git clone https://github.com/solvespace/solvespace cd solvespace - git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d + git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d extlib/mimalloc After that, build SolveSpace as following: @@ -185,7 +185,7 @@ Before building, check out the project and the necessary submodules: git clone https://github.com/solvespace/solvespace cd solvespace - git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d + git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d extlib/mimalloc After that, build SolveSpace as following: diff --git a/extlib/mimalloc b/extlib/mimalloc new file mode 160000 index 000000000..07c6e60a5 --- /dev/null +++ b/extlib/mimalloc @@ -0,0 +1 @@ +Subproject commit 07c6e60a5a3bd7de09e4a170cd97bafba59cfafd diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index 273f9d492..195a50868 100644 --- a/pkg/snap/snap/snapcraft.yaml +++ b/pkg/snap/snap/snapcraft.yaml @@ -45,7 +45,7 @@ parts: snapcraftctl set-version "$version" git describe --exact-match HEAD && grade="stable" || grade="devel" snapcraftctl set-grade "$grade" - git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d + git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d extlib/mimalloc configflags: - -DCMAKE_INSTALL_PREFIX=/usr - -DCMAKE_BUILD_TYPE=Release diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d1d9fc354..16d6e360c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -59,7 +59,11 @@ target_include_directories(slvs PUBLIC ${CMAKE_SOURCE_DIR}/include) target_link_libraries(slvs - ${util_LIBRARIES}) + ${util_LIBRARIES} + mimalloc-static) + +add_dependencies(slvs + mimalloc-static) set_target_properties(slvs PROPERTIES PUBLIC_HEADER ${CMAKE_SOURCE_DIR}/include/slvs.h @@ -81,7 +85,8 @@ include_directories( ${PNG_PNG_INCLUDE_DIR} ${FREETYPE_INCLUDE_DIRS} ${CAIRO_INCLUDE_DIRS} - ${Q3D_INCLUDE_DIR}) + ${Q3D_INCLUDE_DIR} + ${MIMALLOC_INCLUDE_DIR}) if(Backtrace_FOUND) include_directories( @@ -213,7 +218,8 @@ add_library(solvespace-core STATIC ${solvespace_core_SOURCES}) add_dependencies(solvespace-core - q3d_header) + q3d_header + mimalloc-static) target_link_libraries(solvespace-core ${OpenMP_CXX_LIBRARIES} @@ -222,7 +228,8 @@ target_link_libraries(solvespace-core ${ZLIB_LIBRARY} ${PNG_LIBRARY} ${FREETYPE_LIBRARY} - flatbuffers) + flatbuffers + mimalloc-static) if(Backtrace_FOUND) target_link_libraries(solvespace-core From ec183464fe56f5bb9a36a9b105cbceb68d2c91d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Thu, 9 Jul 2020 15:27:35 +0200 Subject: [PATCH 078/646] Replace {Alloc,FreeAll}Temporary() with mimalloc The heaps are wrapped in a RAIIish thread_local handler, since being affined affined to a single thread for allocations is required by the API Ref: #642 --- src/platform/platform.cpp | 67 +++++++++++---------------------------- 1 file changed, 18 insertions(+), 49 deletions(-) diff --git a/src/platform/platform.cpp b/src/platform/platform.cpp index a1d29ea8e..934220cab 100644 --- a/src/platform/platform.cpp +++ b/src/platform/platform.cpp @@ -10,6 +10,7 @@ # include #endif #include "solvespace.h" +#include "mimalloc.h" #include "config.h" #if defined(WIN32) // Conversely, include Microsoft headers after solvespace.h to avoid clashes. @@ -18,7 +19,6 @@ #else # include # include -# include #endif namespace SolveSpace { @@ -680,64 +680,33 @@ void DebugPrint(const char *fmt, ...) { #endif //----------------------------------------------------------------------------- -// Temporary arena, on Windows. +// Temporary arena. //----------------------------------------------------------------------------- -#if defined(WIN32) - -static HANDLE TempArena = NULL; - -void *AllocTemporary(size_t size) -{ - if(!TempArena) - TempArena = HeapCreate(0, 0, 0); - void *ptr = HeapAlloc(TempArena, HEAP_ZERO_MEMORY, size); - ssassert(ptr != NULL, "out of memory"); - return ptr; -} +struct MimallocHeap { + mi_heap_t *heap = mi_heap_new(); -void FreeAllTemporary() -{ - HeapDestroy(TempArena); - TempArena = NULL; -} - -#endif - -//----------------------------------------------------------------------------- -// Temporary arena, on Linux. -//----------------------------------------------------------------------------- - -#if !defined(WIN32) + MimallocHeap() { + ssassert(heap != NULL, "out of memory"); + } -struct ArenaChunk { - ArenaChunk *next; + ~MimallocHeap() { + mi_heap_destroy(heap); + } }; -static std::mutex TempArenaMutex; -static ArenaChunk *TempArena = NULL; +static thread_local MimallocHeap TempArena; -void *AllocTemporary(size_t size) -{ - ArenaChunk *chunk = (ArenaChunk *)calloc(1, sizeof(ArenaChunk) + size); - ssassert(chunk != NULL, "out of memory"); - std::lock_guard guard(TempArenaMutex); - chunk->next = TempArena; - TempArena = chunk; - return (void *)(chunk + 1); +void *AllocTemporary(size_t size) { + void *ptr = mi_heap_zalloc(TempArena.heap, size); + ssassert(ptr != NULL, "out of memory"); + return ptr; } -void FreeAllTemporary() -{ - std::lock_guard guard(TempArenaMutex); - while(TempArena) { - ArenaChunk *chunk = TempArena; - TempArena = TempArena->next; - free(chunk); - } +void FreeAllTemporary() { + MimallocHeap temp; + std::swap(TempArena.heap, temp.heap); } -#endif - } } From 044cf1b7383df5a5b1afe9fd278c05c99136e7b5 Mon Sep 17 00:00:00 2001 From: xzcvczx <2816060+xzcvczx@users.noreply.github.com> Date: Mon, 13 Jul 2020 08:57:02 +1200 Subject: [PATCH 079/646] CMake: don't install mimalloc. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c4914d63c..46505922d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -180,7 +180,7 @@ set(MI_OVERRIDE OFF CACHE BOOL "") set(MI_BUILD_SHARED OFF CACHE BOOL "") set(MI_BUILD_OBJECT OFF CACHE BOOL "") set(MI_BUILD_TESTS OFF CACHE BOOL "") -add_subdirectory(extlib/mimalloc) +add_subdirectory(extlib/mimalloc EXCLUDE_FROM_ALL) set(MIMALLOC_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/extlib/mimalloc/include) if(WIN32 OR APPLE) From 328f54412dfafccc82ea45ebb1391e748e9c7998 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 11 Jul 2020 19:42:06 -0400 Subject: [PATCH 080/646] Fix #647 Helix mesh defects. Use the grid spacing algorithm for helical curve PWL creation. This makes the grid and trim curves have similar spacing. --- src/srf/curve.cpp | 4 ++-- src/srf/surface.cpp | 28 +++++++++++++++++++++------- src/srf/triangulate.cpp | 2 +- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/srf/curve.cpp b/src/srf/curve.cpp index eae0479a8..55496b670 100644 --- a/src/srf/curve.cpp +++ b/src/srf/curve.cpp @@ -817,7 +817,7 @@ void SCurve::RemoveShortSegments(SSurface *srfA, SSurface *srfB) { continue; } - // if the curve is exact and points are >0.1 appart wrt t, point is there + // if the curve is exact and points are >0.05 appart wrt t, point is there // deliberately regardless of chord tolerance (ex: small circles) tprev = t = tnext = 0; if (isExact) { @@ -825,7 +825,7 @@ void SCurve::RemoveShortSegments(SSurface *srfA, SSurface *srfB) { exact.ClosestPointTo(sct->p, &t, /*mustconverge=*/ true); exact.ClosestPointTo(scn->p, &tnext, /*mustconverge=*/ true); } - if ( (t - tprev > 0.1) && (tnext - t > 0.1) ) { + if ( (t - tprev > 0.05) && (tnext - t > 0.05) ) { prev = sct->p; continue; } diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp index fbdc5d92f..eeed9dd65 100644 --- a/src/srf/surface.cpp +++ b/src/srf/surface.cpp @@ -732,6 +732,15 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector sb = &(sbl->l[i]); + // we will need the grid t-values for this entire row of surfaces + List t_values; + t_values = {}; + if (revs[0].v) { + double ps = 0.0; + t_values.Add(&ps); + (surface.FindById(revs[0]))->MakeTriangulationGridInto( + &t_values, 0.0, 1.0, true, 0); + } // we generate one more curve than we did surfaces for(j = 0; j <= sections; j++) { SCurve sc; @@ -746,11 +755,16 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector sc = {}; sc.isExact = true; sc.exact = sb->TransformedBy(ts, qs, 1.0); - double max_dt = 0.5; - if (sc.exact.deg > 1) max_dt = 0.25; - (sc.exact).MakePwlInto(&(sc.pts), 0.0, max_dt); + // make the PWL for the curve based on t value list + for(int x = 0; x < t_values.n; x++) { + SCurvePt scpt; + scpt.tag = 0; + scpt.p = sc.exact.PointAt(t_values[x]); + scpt.vertex = (x == 0) || (x == (t_values.n - 1)); + sc.pts.Add(&scpt); + } - // the surfaces already exist so trim with this curve + // the surfaces already exists so trim with this curve if(j < sections) { sc.surfA = revs[j]; } else { @@ -762,6 +776,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector } else { sc.surfB = hs0; // staring cap } + hSCurve hcb = curve.AddAndAssignId(&sc); STrimBy stb; @@ -773,9 +788,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector sc = {}; sc.isExact = true; sc.exact = sb->TransformedBy(ts, qs, 1.0); - double max_dt = 0.5; - if (sc.exact.deg > 1) max_dt = 0.25; - (sc.exact).MakePwlInto(&(sc.pts), 0.0, max_dt); + (sc.exact).MakePwlInto(&(sc.pts)); sc.surfA = hs1; // end cap sc.surfB = hs0; // staring cap hSCurve hcb = curve.AddAndAssignId(&sc); @@ -812,6 +825,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector (surface.FindById(sc.surfB))->trim.Add(&stb); } } + t_values.Clear(); } hsl.Clear(); diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index d02db791b..65c1301f3 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -429,7 +429,7 @@ void SSurface::MakeTriangulationGridInto(List *l, double vs, double vf, double step = 1.0/SS.GetMaxSegments(); if( ((vf - vs) < step || worst < SS.ChordTolMm()) - && ((worst_twist > 0.999) || (depth > 4)) ) { + && ((worst_twist > 0.999) || (depth > 3)) ) { l->Add(&vf); } else { MakeTriangulationGridInto(l, vs, (vs+vf)/2, swapped, depth+1); From cb5716bb0323a348562d6e98f57a12c4a3c64d03 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 17 Jul 2020 16:59:17 -0400 Subject: [PATCH 081/646] Implement #524 Allow flat colors. Adds an edit control for Ambient lighting. --- src/confscreen.cpp | 15 ++++++++++++++- src/solvespace.cpp | 3 ++- src/ui.h | 2 ++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/confscreen.cpp b/src/confscreen.cpp index cdf6e518e..b988df5a1 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -18,6 +18,12 @@ void TextWindow::ScreenChangeLightIntensity(int link, uint32_t v) { SS.TW.edit.i = v; } +void TextWindow::ScreenChangeLightAmbient(int link, uint32_t v) { + SS.TW.ShowEditControl(31, ssprintf("%.2f", SS.ambientIntensity)); + SS.TW.edit.meaning = Edit::LIGHT_AMBIENT; + SS.TW.edit.i = 0; +} + void TextWindow::ScreenChangeColor(int link, uint32_t v) { SS.TW.ShowEditControlWithColorPicker(13, SS.modelColor[v]); @@ -218,6 +224,10 @@ void TextWindow::ShowConfiguration() { CO(SS.lightDir[i]), i, &ScreenChangeLightDirection, SS.lightIntensity[i], i, &ScreenChangeLightIntensity); } + Printf(false, "%Bp ambient lighting " + "%2 %Fl%D%f%Ll[c]%E", + (i & 1) ? 'd' : 'a', i, + SS.ambientIntensity, &ScreenChangeLightAmbient); Printf(false, ""); Printf(false, "%Ft chord tolerance (in percents)%E"); @@ -371,7 +381,10 @@ bool TextWindow::EditControlDoneForConfiguration(const std::string &s) { SS.lightIntensity[edit.i] = min(1.0, max(0.0, atof(s.c_str()))); SS.GW.Invalidate(); break; - + case Edit::LIGHT_AMBIENT: + SS.ambientIntensity = min(1.0, max(0.0, atof(s.c_str()))); + SS.GW.Invalidate(); + break; case Edit::LIGHT_DIRECTION: { double x, y, z; if(sscanf(s.c_str(), "%lf, %lf, %lf", &x, &y, &z)==3) { diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 736846ca8..b058651e6 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -33,7 +33,7 @@ void SolveSpaceUI::Init() { // Light intensities lightIntensity[0] = settings->ThawFloat("LightIntensity_0", 1.0); lightIntensity[1] = settings->ThawFloat("LightIntensity_1", 0.5); - ambientIntensity = 0.3; // no setting for that yet + ambientIntensity = settings->ThawFloat("Light_Ambient", 0.3); // Light positions lightDir[0].x = settings->ThawFloat("LightDir_0_Right", -1.0); lightDir[0].y = settings->ThawFloat("LightDir_0_Up", 1.0); @@ -213,6 +213,7 @@ void SolveSpaceUI::Exit() { // Light intensities settings->FreezeFloat("LightIntensity_0", (float)lightIntensity[0]); settings->FreezeFloat("LightIntensity_1", (float)lightIntensity[1]); + settings->FreezeFloat("Light_Ambient", (float)ambientIntensity); // Light directions settings->FreezeFloat("LightDir_0_Right", (float)lightDir[0].x); settings->FreezeFloat("LightDir_0_Up", (float)lightDir[0].y); diff --git a/src/ui.h b/src/ui.h index 2a068dc7d..8f29a73c4 100644 --- a/src/ui.h +++ b/src/ui.h @@ -315,6 +315,7 @@ class TextWindow { G_CODE_FEED = 114, G_CODE_PLUNGE_FEED = 115, AUTOSAVE_INTERVAL = 116, + LIGHT_AMBIENT = 117, // For TTF text TTF_TEXT = 300, // For the step dimension screen @@ -467,6 +468,7 @@ class TextWindow { static void ScreenChangeGroupScale(int link, uint32_t v); static void ScreenChangeLightDirection(int link, uint32_t v); static void ScreenChangeLightIntensity(int link, uint32_t v); + static void ScreenChangeLightAmbient(int link, uint32_t v); static void ScreenChangeColor(int link, uint32_t v); static void ScreenChangeChordTolerance(int link, uint32_t v); static void ScreenChangeMaxSegments(int link, uint32_t v); From ca6760b4518b7dadb27078b89d81a35498b046a2 Mon Sep 17 00:00:00 2001 From: whitequark Date: Wed, 22 Jul 2020 11:04:48 +0000 Subject: [PATCH 082/646] Create mimalloc heaps only when necessary. The mimalloc temporary heap is a thread-local object that uses RAII to manage heap lifetimes even in threads that are created implicitly, e.g. by OpenMP. However, not all threads are necessarily created by the application; graphics drivers may create their own threads, and this can lead to deadlocks when combined with library unloading. Fixes #657. --- src/platform/platform.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/platform/platform.cpp b/src/platform/platform.cpp index 934220cab..a0809821d 100644 --- a/src/platform/platform.cpp +++ b/src/platform/platform.cpp @@ -684,20 +684,21 @@ void DebugPrint(const char *fmt, ...) { //----------------------------------------------------------------------------- struct MimallocHeap { - mi_heap_t *heap = mi_heap_new(); - - MimallocHeap() { - ssassert(heap != NULL, "out of memory"); - } + mi_heap_t *heap = NULL; ~MimallocHeap() { - mi_heap_destroy(heap); + if(heap != NULL) + mi_heap_destroy(heap); } }; static thread_local MimallocHeap TempArena; void *AllocTemporary(size_t size) { + if(TempArena.heap == NULL) { + TempArena.heap = mi_heap_new(); + ssassert(TempArena.heap != NULL, "out of memory"); + } void *ptr = mi_heap_zalloc(TempArena.heap, size); ssassert(ptr != NULL, "out of memory"); return ptr; From 24b47e0c41b913b852502d9e64289bd65e544168 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 19 Jul 2020 13:05:52 -0400 Subject: [PATCH 083/646] NFC: Remove a redundant pass over all verticies in ear triangulation. --- src/srf/triangulate.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index 65c1301f3..2c9f1fb89 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -312,14 +312,6 @@ void SContour::UvTriangulateInto(SMesh *m, SSurface *srf) { bool toggle = false; while(l.n > 3) { - // Some points may have changed ear-ness, so recalculate - for(i = 0; i < l.n; i++) { - if(l[i].ear == EarType::UNKNOWN) { - (l[i]).ear = IsEar(i, scaledEps) ? - EarType::EAR : EarType::NOT_EAR; - } - } - int bestEar = -1; double bestChordTol = VERY_POSITIVE; // Alternate the starting position so we generate strip-like @@ -328,6 +320,9 @@ void SContour::UvTriangulateInto(SMesh *m, SSurface *srf) { int offset = toggle ? -1 : 0; for(i = 0; i < l.n; i++) { int ear = WRAP(i+offset, l.n); + if(l[ear].ear == EarType::UNKNOWN) { + (l[ear]).ear = IsEar(ear, scaledEps) ? EarType::EAR : EarType::NOT_EAR; + } if(l[ear].ear == EarType::EAR) { if(srf->degm == 1 && srf->degn == 1) { // This is a plane; any ear is a good ear. From f934ab0541ffcdef4f75b6dc422f7dbb59d13057 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 20 Jul 2020 12:51:07 -0400 Subject: [PATCH 084/646] remove another redundant pass checking earness --- src/srf/triangulate.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index 2c9f1fb89..e6cd6e493 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -297,19 +297,17 @@ void SContour::UvTriangulateInto(SMesh *m, SSurface *srf) { int i; // Clean the original contour by removing any zero-length edges. + // initialize eartypes to unknown while we're going over them. l.ClearTags(); + l[0].ear = EarType::UNKNOWN; for(i = 1; i < l.n; i++) { + l[i].ear = EarType::UNKNOWN; if((l[i].p).Equals(l[i-1].p)) { l[i].tag = 1; } } l.RemoveTagged(); - // Now calculate the ear-ness of each vertex - for(i = 0; i < l.n; i++) { - (l[i]).ear = IsEar(i, scaledEps) ? EarType::EAR : EarType::NOT_EAR; - } - bool toggle = false; while(l.n > 3) { int bestEar = -1; From b3ac55b5ccf1d13e5e9edec6e9248b6af706e7a8 Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 28 Jul 2020 13:12:14 +0000 Subject: [PATCH 085/646] Make "Toggle Reference" remember undo state. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Turning a reference dimension into a constraint one can make the sketch unsolvable, which suggests Edit → Undo, which would undo either too much or nothing at all. --- src/constraint.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/constraint.cpp b/src/constraint.cpp index 3f861b8cd..a66f6d367 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -558,6 +558,7 @@ void Constraint::MenuConstrain(Command id) { if(gs.constraints == 1 && gs.n == 0) { Constraint *c = SK.GetConstraint(gs.constraint[0]); if(c->HasLabel() && c->type != Type::COMMENT) { + SS.UndoRemember(); (c->reference) = !(c->reference); SS.MarkGroupDirty(c->group, /*onlyThis=*/true); break; From 4f52350bfc2cf01bf51d90ad42e69fe2621f9997 Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 28 Jul 2020 14:10:19 +0000 Subject: [PATCH 086/646] =?UTF-8?q?Fix=20"Sketch=20=E2=86=92=20In=20Workpl?= =?UTF-8?q?ane"=20not=20updating=20the=20UI=20immediately.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/graphicswin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index bc4e485f5..073fb5d8c 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -1227,6 +1227,8 @@ void GraphicsWindow::MenuRequest(Command id) { if(SS.GW.gs.n == 1 && SS.GW.gs.workplanes == 1) { // A user-selected workplane g->activeWorkplane = SS.GW.gs.entity[0]; + SS.GW.EnsureValidActives(); + SS.ScheduleShowTW(); } else if(g->type == Group::Type::DRAWING_WORKPLANE) { // The group's default workplane g->activeWorkplane = g->h.entity(0); From 79b1adee096fa97ed0328feac6823b576b0de729 Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 28 Jul 2020 14:56:55 +0000 Subject: [PATCH 087/646] Drop backtrace generation. This has been completely broken since 2018 (commit a93283df), and no one noticed, so it probably wasn't useful. Instead of fixing it, just drop the feature and a bunch of odd nonportable code. --- src/CMakeLists.txt | 5 ----- src/config.h.in | 4 ---- src/platform/guinone.cpp | 20 -------------------- 3 files changed, 29 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 16d6e360c..fbebccfc8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -6,11 +6,6 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}) -set(HAVE_BACKTRACE ${Backtrace_FOUND}) -if(HAVE_BACKTRACE) - set(BACKTRACE_HEADER <${Backtrace_HEADER}>) -endif() - set(HAVE_SPACEWARE ${SPACEWARE_FOUND}) if(NOT WIN32 OR APPLE) diff --git a/src/config.h.in b/src/config.h.in index 475b973d2..144c46d04 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -12,10 +12,6 @@ /* What OpenGL version do we use? */ #define HAVE_OPENGL @OPENGL@ -/* Do we have backtrace() function, and if yes, in which library? */ -#cmakedefine HAVE_BACKTRACE -#define BACKTRACE_HEADER @BACKTRACE_HEADER@ - /* If we use GTK, can we use the native file chooser? */ #cmakedefine HAVE_GTK_FILECHOOSERNATIVE diff --git a/src/platform/guinone.cpp b/src/platform/guinone.cpp index ef3c6f3ba..4641b984b 100644 --- a/src/platform/guinone.cpp +++ b/src/platform/guinone.cpp @@ -24,26 +24,6 @@ namespace Platform { void FatalError(const std::string &message) { fprintf(stderr, "%s", message.c_str()); - -#if !defined(LIBRARY) && defined(HAVE_BACKTRACE) - static void *ptrs[1024] = {}; - size_t nptrs = backtrace(ptrs, sizeof(ptrs) / sizeof(ptrs[0])); - char **syms = backtrace_symbols(ptrs, nptrs); - - fprintf(stderr, "Backtrace:\n"); - if(syms != NULL) { - for(size_t i = 0; i < nptrs; i++) { - fprintf(stderr, "%2zu: %s\n", i, syms[i]); - } - } else { - for(size_t i = 0; i < nptrs; i++) { - fprintf(stderr, "%2zu: %p\n", i, ptrs[i]); - } - } -#else - fprintf(stderr, "Backtrace support not compiled in.\n"); -#endif - abort(); } From 03b8045f6bcc4d21d5702aa98c8c1d6eb9663716 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 31 Jul 2020 22:10:29 -0400 Subject: [PATCH 088/646] Fix #656 by making SSurface::SplitInHalf thread safe. SSurface::SplitInHalf was modifying the surface and then restoring it at the end. Make temporary copy instead. --- src/srf/raycast.cpp | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/src/srf/raycast.cpp b/src/srf/raycast.cpp index 4d6533778..bb66e3958 100644 --- a/src/srf/raycast.cpp +++ b/src/srf/raycast.cpp @@ -130,39 +130,38 @@ void SSurface::SplitInHalf(bool byU, SSurface *sa, SSurface *sb) { sa->degn = sb->degn = degn; // by de Casteljau's algorithm in a projective space; so we must work - // on points (w*x, w*y, w*z, w) - WeightControlPoints(); + // on points (w*x, w*y, w*z, w) so create a temporary copy + SSurface st; + st = *this; + st.WeightControlPoints(); switch(byU ? degm : degn) { case 1: - sa->CopyRowOrCol (byU, 0, this, 0); - sb->CopyRowOrCol (byU, 1, this, 1); + sa->CopyRowOrCol (byU, 0, &st, 0); + sb->CopyRowOrCol (byU, 1, &st, 1); - sa->BlendRowOrCol(byU, 1, this, 0, this, 1); - sb->BlendRowOrCol(byU, 0, this, 0, this, 1); + sa->BlendRowOrCol(byU, 1, &st, 0, &st, 1); + sb->BlendRowOrCol(byU, 0, &st, 0, &st, 1); break; case 2: - sa->CopyRowOrCol (byU, 0, this, 0); - sb->CopyRowOrCol (byU, 2, this, 2); + sa->CopyRowOrCol (byU, 0, &st, 0); + sb->CopyRowOrCol (byU, 2, &st, 2); - sa->BlendRowOrCol(byU, 1, this, 0, this, 1); - sb->BlendRowOrCol(byU, 1, this, 1, this, 2); + sa->BlendRowOrCol(byU, 1, &st, 0, &st, 1); + sb->BlendRowOrCol(byU, 1, &st, 1, &st, 2); sa->BlendRowOrCol(byU, 2, sa, 1, sb, 1); sb->BlendRowOrCol(byU, 0, sa, 1, sb, 1); break; case 3: { - SSurface st; - st.degm = degm; st.degn = degn; + sa->CopyRowOrCol (byU, 0, &st, 0); + sb->CopyRowOrCol (byU, 3, &st, 3); - sa->CopyRowOrCol (byU, 0, this, 0); - sb->CopyRowOrCol (byU, 3, this, 3); - - sa->BlendRowOrCol(byU, 1, this, 0, this, 1); - sb->BlendRowOrCol(byU, 2, this, 2, this, 3); - st. BlendRowOrCol(byU, 0, this, 1, this, 2); // scratch var + sa->BlendRowOrCol(byU, 1, &st, 0, &st, 1); + sb->BlendRowOrCol(byU, 2, &st, 2, &st, 3); + st. BlendRowOrCol(byU, 0, &st, 1, &st, 2); // use row/col 0 as scratch sa->BlendRowOrCol(byU, 2, sa, 1, &st, 0); sb->BlendRowOrCol(byU, 1, sb, 2, &st, 0); @@ -177,7 +176,6 @@ void SSurface::SplitInHalf(bool byU, SSurface *sa, SSurface *sb) { sa->UnWeightControlPoints(); sb->UnWeightControlPoints(); - UnWeightControlPoints(); } //----------------------------------------------------------------------------- From 0dc2150f897c8e95b0d65c00b6094ba0377c2da0 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 2 Aug 2020 19:24:53 -0400 Subject: [PATCH 089/646] Remove the Random() function and use a fixed table of arbitrary vectors in raycast.cpp This also fixes issue #666. --- src/solvespace.h | 4 ---- src/srf/raycast.cpp | 10 ++++++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/solvespace.h b/src/solvespace.h index 70658d5a0..42784390d 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -122,10 +122,6 @@ static constexpr double LENGTH_EPS = 1e-6; static constexpr double VERY_POSITIVE = 1e10; static constexpr double VERY_NEGATIVE = -1e10; -inline double Random(double vmax) { - return (vmax*rand()) / RAND_MAX; -} - #include "platform/platform.h" #include "platform/gui.h" #include "resource.h" diff --git a/src/srf/raycast.cpp b/src/srf/raycast.cpp index bb66e3958..808056296 100644 --- a/src/srf/raycast.cpp +++ b/src/srf/raycast.cpp @@ -419,6 +419,11 @@ SShell::Class SShell::ClassifyRegion(Vector edge_n, Vector inter_surf_n, // using the closest intersection point. If the ray hits a surface on edge, // then just reattempt in a different random direction. //----------------------------------------------------------------------------- + +// table of vectors in 6 arbitrary directions covering 4 of the 8 octants. +// use overlapping sets of 3 to reduce memory usage. +static const double Random[8] = {1.278, 5.0103, 9.427, -2.331, 7.13, 2.954, 5.034, -4.777}; + bool SShell::ClassifyEdge(Class *indir, Class *outdir, Vector ea, Vector eb, Vector p, @@ -549,7 +554,7 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, // Cast a ray in a random direction (two-sided so that we test if // the point lies on a surface, but use only one side for in/out // testing) - Vector ray = Vector::From(Random(1), Random(1), Random(1)); + Vector ray = Vector::From(Random[cnt], Random[cnt+1], Random[cnt+2]); AllPointsIntersecting( p.Minus(ray), p.Plus(ray), &l, @@ -598,7 +603,8 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, // then our ray always lies on edge, and that's okay. Otherwise // try again in a different random direction. if(!onEdge) break; - if(cnt++ > 5) { + cnt++; + if(cnt > 5) { dbp("can't find a ray that doesn't hit on edge!"); dbp("on edge = %d, edge_inters = %d", onEdge, edge_inters); SS.nakedEdges.AddEdge(ea, eb); From 4af7a33f64a369c0d1f9b42fd46f873be8d811d9 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 3 Aug 2020 11:57:19 -0400 Subject: [PATCH 090/646] Don't init srand(0) because rand isn't used any more. --- src/srf/raycast.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/srf/raycast.cpp b/src/srf/raycast.cpp index 808056296..587792821 100644 --- a/src/srf/raycast.cpp +++ b/src/srf/raycast.cpp @@ -431,8 +431,6 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, { List l = {}; - srand(0); - // First, check for edge-on-edge int edge_inters = 0; Vector inter_surf_n[2], inter_edge_n[2]; From 93683129569c94107f2c06bce50e8e8d6c06734c Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 28 Jul 2020 19:13:40 +0000 Subject: [PATCH 091/646] Improve text screen for a selected constraint. * Show the type of a constraint. * Show the workplane a constraint is in, for constraints which can be both projected to workplane or be free in 3d space. * Clearly distinguish reference from non-reference constraints. * Add a checkbox for toggling the reference option. * When showing requests a constraint applies to, highlight on hover the specific entity being constrained, not just the first one. --- src/constrainteq.cpp | 44 ++++++++++++++++++++++++++ src/describescreen.cpp | 71 +++++++++++++++++++++++++++++++++--------- src/sketch.h | 1 + src/ui.h | 1 + 4 files changed, 103 insertions(+), 14 deletions(-) diff --git a/src/constrainteq.cpp b/src/constrainteq.cpp index 985545c7d..965a13d07 100644 --- a/src/constrainteq.cpp +++ b/src/constrainteq.cpp @@ -28,6 +28,50 @@ bool ConstraintBase::HasLabel() const { } } +bool ConstraintBase::IsProjectible() const { + switch(type) { + case Type::POINTS_COINCIDENT: + case Type::PT_PT_DISTANCE: + case Type::PT_LINE_DISTANCE: + case Type::PT_ON_LINE: + case Type::EQUAL_LENGTH_LINES: + case Type::EQ_LEN_PT_LINE_D: + case Type::EQ_PT_LN_DISTANCES: + case Type::EQUAL_ANGLE: + case Type::LENGTH_RATIO: + case Type::LENGTH_DIFFERENCE: + case Type::SYMMETRIC: + case Type::SYMMETRIC_HORIZ: + case Type::SYMMETRIC_VERT: + case Type::SYMMETRIC_LINE: + case Type::AT_MIDPOINT: + case Type::HORIZONTAL: + case Type::VERTICAL: + case Type::ANGLE: + case Type::PARALLEL: + case Type::PERPENDICULAR: + case Type::WHERE_DRAGGED: + case Type::COMMENT: + return true; + + case Type::PT_PLANE_DISTANCE: + case Type::PT_FACE_DISTANCE: + case Type::PROJ_PT_DISTANCE: + case Type::PT_IN_PLANE: + case Type::PT_ON_FACE: + case Type::EQUAL_LINE_ARC_LEN: + case Type::DIAMETER: + case Type::PT_ON_CIRCLE: + case Type::SAME_ORIENTATION: + case Type::CUBIC_LINE_TANGENT: + case Type::CURVE_CURVE_TANGENT: + case Type::ARC_LINE_TANGENT: + case Type::EQUAL_RADIUS: + return false; + } + ssassert(false, "Impossible"); +} + ExprVector ConstraintBase::VectorsParallel3d(ExprVector a, ExprVector b, hParam p) { return a.Minus(b.ScaledBy(Expr::From(p))); } diff --git a/src/describescreen.cpp b/src/describescreen.cpp index 4ebe20e56..f17baaa1b 100644 --- a/src/describescreen.cpp +++ b/src/describescreen.cpp @@ -40,6 +40,16 @@ void TextWindow::ScreenSetTtfFont(int link, uint32_t v) { SS.ScheduleShowTW(); } +void TextWindow::ScreenConstraintToggleReference(int link, uint32_t v) { + hConstraint hc = { v }; + Constraint *c = SK.GetConstraint(hc); + + SS.UndoRemember(); + c->reference = !c->reference; + + SS.ScheduleShowTW(); +} + void TextWindow::ScreenConstraintShowAsRadius(int link, uint32_t v) { hConstraint hc = { v }; Constraint *c = SK.GetConstraint(hc); @@ -365,16 +375,45 @@ void TextWindow::DescribeSelection() { Printf(false, "%FtSELECTED:%E comment text"); } else if(gs.n == 0 && gs.constraints == 1) { Constraint *c = SK.GetConstraint(gs.constraint[0]); - - if(c->type == Constraint::Type::DIAMETER) { - Printf(false, "%FtDIAMETER CONSTRAINT"); - - Printf(true, " %Fd%f%D%Ll%s show as radius", - &ScreenConstraintShowAsRadius, gs.constraint[0].v, - c->other ? CHECK_TRUE : CHECK_FALSE); + const std::string &desc = c->DescriptionString().c_str(); + + if(c->type == Constraint::Type::COMMENT) { + Printf(false, "%FtCOMMENT%E %s", desc.c_str()); + } else if(c->HasLabel()) { + if(c->reference) { + Printf(false, "%FtREFERENCE%E %s", desc.c_str()); + } else { + Printf(false, "%FtDIMENSION%E %s", desc.c_str()); + } + Printf(true, " %Fd%f%D%Ll%s reference", + &ScreenConstraintToggleReference, gs.constraint[0].v, + c->reference ? CHECK_TRUE : CHECK_FALSE); + if(c->type == Constraint::Type::DIAMETER) { + Printf(false, " %Fd%f%D%Ll%s use radius", + &ScreenConstraintShowAsRadius, gs.constraint[0].v, + c->other ? CHECK_TRUE : CHECK_FALSE); + } } else { - Printf(false, "%FtSELECTED:%E %s", - c->DescriptionString().c_str()); + Printf(false, "%FtCONSTRAINT%E %s", desc.c_str()); + } + + if(c->IsProjectible()) { + if(c->workplane == Entity::FREE_IN_3D) { + Printf(true, "%FtNOT PROJECTED TO WORKPLANE%E"); + } else { + Entity *w = SK.GetEntity(c->workplane); + if(w->h.isFromRequest()) { + Printf(true, "%FtIN WORKPLANE%E %Fl%Ll%D%f%h%s%E", + w->h.request().v, + (&TextWindow::ScreenSelectRequest), &(TextWindow::ScreenHoverRequest), + w->DescriptionString().c_str()); + } else { + Printf(true, "%FtIN WORKPLANE%E %Fl%Ll%D%f%h%s%E", + w->h.group().v, + (&TextWindow::ScreenSelectGroup), (&TextWindow::ScreenHoverGroupWorkplane), + w->DescriptionString().c_str()); + } + } } std::vector lhe = {}; @@ -391,16 +430,20 @@ void TextWindow::DescribeSelection() { lhe.erase(it, lhe.end()); if(!lhe.empty()) { - Printf(true, "%FtCONSTRAINS:%E"); + if(c->reference) { + Printf(true, "%FtMEASURES:%E"); + } else { + Printf(true, "%FtCONSTRAINS:%E"); + } int a = 0; for(hEntity he : lhe) { - Request *r = SK.GetRequest(he.request()); - std::string s = r->DescriptionString(); + Entity *e = SK.GetEntity(he); Printf(false, "%Bp %Fl%Ll%D%f%h%s%E", (a & 1) ? 'd' : 'a', - r->h.v, (&TextWindow::ScreenSelectRequest), - &(TextWindow::ScreenHoverRequest), s.c_str()); + e->h.v, (&TextWindow::ScreenSelectEntity), + &(TextWindow::ScreenHoverEntity), + e->DescriptionString().c_str()); a++; } } diff --git a/src/sketch.h b/src/sketch.h index 72cda7eb8..95aebd054 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -703,6 +703,7 @@ class ConstraintBase { } bool HasLabel() const; + bool IsProjectible() const; void Generate(IdList *param); diff --git a/src/ui.h b/src/ui.h index 8f29a73c4..a29bad1cb 100644 --- a/src/ui.h +++ b/src/ui.h @@ -397,6 +397,7 @@ class TextWindow { static void ScreenUnselectAll(int link, uint32_t v); // when we're describing a constraint + static void ScreenConstraintToggleReference(int link, uint32_t v); static void ScreenConstraintShowAsRadius(int link, uint32_t v); // and the rest from the stuff in textscreens.cpp From 8d261bfd558f51a6da36d53c1838bbf49419bd11 Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 28 Jul 2020 23:17:04 +0000 Subject: [PATCH 092/646] Improve text screen for a selected entity. * Add a link to its request, unless it's the first entity in that request (which would just select the same entity again). * Add a link to its group. * Add a link to its workplane. * Add a link to its style; and hide the style row for entities that aren't stylable. * Show constraints and measurements (reference constraints) in separate lists. * For curve entities, show constraints that apply to the points related to the curve, not just to the curve itself. --- src/describescreen.cpp | 92 +++++++++++++++++++++++++++++++----------- src/style.cpp | 1 + src/textscreens.cpp | 34 ++++++++++++---- src/ui.h | 5 ++- 4 files changed, 100 insertions(+), 32 deletions(-) diff --git a/src/describescreen.cpp b/src/describescreen.cpp index f17baaa1b..17f736127 100644 --- a/src/describescreen.cpp +++ b/src/describescreen.cpp @@ -221,52 +221,96 @@ void TextWindow::DescribeSelection() { break; } - Group *g = SK.GetGroup(e->group); Printf(false, ""); - Printf(false, "%FtIN GROUP%E %s", g->DescriptionString().c_str()); + if(e->h.isFromRequest()) { + Request *r = SK.GetRequest(e->h.request()); + if(e->h == r->h.entity(0)) { + Printf(false, "%FtFROM REQUEST%E %s", + r->DescriptionString().c_str()); + } else { + Printf(false, "%FtFROM REQUEST%E %Fl%Ll%D%f%h%s%E", + r->h.v, (&TextWindow::ScreenSelectRequest), &(TextWindow::ScreenHoverRequest), + r->DescriptionString().c_str()); + } + } + Group *g = SK.GetGroup(e->group); + Printf(false, "%FtIN GROUP%E %Fl%Ll%D%f%s%E", + g->h.v, (&TextWindow::ScreenSelectGroup), + g->DescriptionString().c_str()); if(e->workplane == Entity::FREE_IN_3D) { Printf(false, "%FtNOT LOCKED IN WORKPLANE%E"); } else { Entity *w = SK.GetEntity(e->workplane); - Printf(false, "%FtIN WORKPLANE%E %s", w->DescriptionString().c_str()); + if(w->h.isFromRequest()) { + Printf(false, "%FtIN WORKPLANE%E %Fl%Ll%D%f%h%s%E", + w->h.request().v, + (&TextWindow::ScreenSelectRequest), &(TextWindow::ScreenHoverRequest), + w->DescriptionString().c_str()); + } else { + Printf(false, "%FtIN WORKPLANE%E %Fl%Ll%D%f%h%s%E", + w->h.group().v, + (&TextWindow::ScreenSelectGroup), (&TextWindow::ScreenHoverGroupWorkplane), + w->DescriptionString().c_str()); + } } - if(e->style.v) { - Style *s = Style::Get(e->style); - Printf(false, "%FtIN STYLE%E %s", s->DescriptionString().c_str()); - } else { - Printf(false, "%FtIN STYLE%E none"); + if(e->IsStylable()) { + if(e->style.v) { + Style *s = Style::Get(e->style); + Printf(false, "%FtIN STYLE%E %Fl%Ll%D%f%s%E", + s->h.v, (&TextWindow::ScreenShowStyleInfo), + s->DescriptionString().c_str()); + } else { + Printf(false, "%FtIN STYLE%E none"); + } } if(e->construction) { Printf(false, "%FtCONSTRUCTION"); } std::vector lhc = {}; - for(const Constraint &c : SK.constraint) { - if(!(c.ptA == e->h || - c.ptB == e->h || - c.entityA == e->h || - c.entityB == e->h || - c.entityC == e->h || - c.entityD == e->h)) - continue; - lhc.push_back(c.h); + auto FindConstraints = [&](hEntity he) { + for(const Constraint &c : SK.constraint) { + if(!(c.ptA == he || c.ptB == he || + c.entityA == he || c.entityB == he || c.entityC == he || c.entityD == he)) + continue; + lhc.push_back(c.h); + } + }; + FindConstraints(e->h); + if(!e->IsPoint()) { + for(int i = 0; i < MAX_POINTS_IN_ENTITY; i++) { + if(e->point[i].v == 0) break; + FindConstraints(e->point[i]); + } } - if(!lhc.empty()) { - Printf(true, "%FtCONSTRAINED BY:%E"); + std::sort(lhc.begin(), lhc.end()); + lhc.erase(std::unique(lhc.begin(), lhc.end()), lhc.end()); + auto ListConstraints = [&](bool reference) { + bool first = true; int a = 0; for(hConstraint hc : lhc) { Constraint *c = SK.GetConstraint(hc); - std::string s = c->DescriptionString(); - Printf(false, "%Bp %Fl%Ll%D%f%h%s%E %s", + if(c->reference != reference) continue; + if(first) { + first = false; + if(reference) { + Printf(true, "%FtMEASURED BY:%E"); + } else { + Printf(true, "%FtCONSTRAINED BY:%E"); + } + } + Printf(false, "%Bp %Fl%Ll%D%f%h%s%E", (a & 1) ? 'd' : 'a', c->h.v, (&TextWindow::ScreenSelectConstraint), - (&TextWindow::ScreenHoverConstraint), s.c_str(), - c->reference ? "(ref)" : ""); + (&TextWindow::ScreenHoverConstraint), + c->DescriptionString().c_str()); a++; } - } + }; + ListConstraints(/*reference=*/false); + ListConstraints(/*reference=*/true); } else if(gs.n == 2 && gs.points == 2) { Printf(false, "%FtTWO POINTS"); Vector p0 = SK.GetEntity(gs.point[0])->PointGetNum(); diff --git a/src/style.cpp b/src/style.cpp index a60740a43..1f719f671 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -375,6 +375,7 @@ void TextWindow::ScreenShowListOfStyles(int link, uint32_t v) { SS.TW.GoToScreen(Screen::LIST_OF_STYLES); } void TextWindow::ScreenShowStyleInfo(int link, uint32_t v) { + GraphicsWindow::MenuEdit(Command::UNSELECT_ALL); SS.TW.GoToScreen(Screen::STYLE_INFO); SS.TW.shown.style.v = v; } diff --git a/src/textscreens.cpp b/src/textscreens.cpp index c060eff34..d4cce9850 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -44,6 +44,7 @@ void TextWindow::ShowHeader(bool withNav) { // to hide or show them, and to view them in detail. This is our home page. //----------------------------------------------------------------------------- void TextWindow::ScreenSelectGroup(int link, uint32_t v) { + GraphicsWindow::MenuEdit(Command::UNSELECT_ALL); SS.TW.GoToScreen(Screen::GROUP_INFO); SS.TW.shown.group.v = v; } @@ -167,12 +168,16 @@ void TextWindow::ShowListOfGroups() { // The screen that shows information about a specific group, and allows the // user to edit various things about it. //----------------------------------------------------------------------------- -void TextWindow::ScreenHoverConstraint(int link, uint32_t v) { - if(!SS.GW.showConstraints) return; - - hConstraint hc = { v }; +void TextWindow::ScreenHoverGroupWorkplane(int link, uint32_t v) { SS.GW.hover.Clear(); - SS.GW.hover.constraint = hc; + hGroup hg = { v }; + SS.GW.hover.entity = hg.entity(0); + SS.GW.hover.emphasized = true; +} +void TextWindow::ScreenHoverEntity(int link, uint32_t v) { + SS.GW.hover.Clear(); + hEntity he = { v }; + SS.GW.hover.entity = he; SS.GW.hover.emphasized = true; } void TextWindow::ScreenHoverRequest(int link, uint32_t v) { @@ -181,10 +186,19 @@ void TextWindow::ScreenHoverRequest(int link, uint32_t v) { SS.GW.hover.entity = hr.entity(0); SS.GW.hover.emphasized = true; } -void TextWindow::ScreenSelectConstraint(int link, uint32_t v) { +void TextWindow::ScreenHoverConstraint(int link, uint32_t v) { + if(!SS.GW.showConstraints) return; + + hConstraint hc = { v }; + SS.GW.hover.Clear(); + SS.GW.hover.constraint = hc; + SS.GW.hover.emphasized = true; +} +void TextWindow::ScreenSelectEntity(int link, uint32_t v) { SS.GW.ClearSelection(); GraphicsWindow::Selection sel = {}; - sel.constraint.v = v; + hEntity he = { v }; + sel.entity = he; SS.GW.selection.Add(&sel); } void TextWindow::ScreenSelectRequest(int link, uint32_t v) { @@ -194,6 +208,12 @@ void TextWindow::ScreenSelectRequest(int link, uint32_t v) { sel.entity = hr.entity(0); SS.GW.selection.Add(&sel); } +void TextWindow::ScreenSelectConstraint(int link, uint32_t v) { + SS.GW.ClearSelection(); + GraphicsWindow::Selection sel = {}; + sel.constraint.v = v; + SS.GW.selection.Add(&sel); +} void TextWindow::ScreenChangeGroupOption(int link, uint32_t v) { SS.UndoRemember(); diff --git a/src/ui.h b/src/ui.h index a29bad1cb..fc2d7d856 100644 --- a/src/ui.h +++ b/src/ui.h @@ -408,9 +408,12 @@ class TextWindow { static void ScreenShowGroupsSpecial(int link, uint32_t v); static void ScreenDeleteGroup(int link, uint32_t v); - static void ScreenHoverConstraint(int link, uint32_t v); + static void ScreenHoverGroupWorkplane(int link, uint32_t v); static void ScreenHoverRequest(int link, uint32_t v); + static void ScreenHoverEntity(int link, uint32_t v); + static void ScreenHoverConstraint(int link, uint32_t v); static void ScreenSelectRequest(int link, uint32_t v); + static void ScreenSelectEntity(int link, uint32_t v); static void ScreenSelectConstraint(int link, uint32_t v); static void ScreenChangeGroupOption(int link, uint32_t v); From 89c305234327635afcd1a85e431d9b80ff927cb0 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 26 Jul 2020 11:43:52 -0400 Subject: [PATCH 093/646] Update mimalloc to v1.6.4 --- extlib/mimalloc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/mimalloc b/extlib/mimalloc index 07c6e60a5..a9686d6ec 160000 --- a/extlib/mimalloc +++ b/extlib/mimalloc @@ -1 +1 @@ -Subproject commit 07c6e60a5a3bd7de09e4a170cd97bafba59cfafd +Subproject commit a9686d6ecf00e4467e772f7c0b4ef76a15f325f6 From c411062a849924dccfe86b0402806e3ac8e360ff Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 25 Jul 2020 16:01:01 -0400 Subject: [PATCH 094/646] Fix issue659 - Problems constraining to ends of Helix. Create a new copy type for faces that includes the translation aspect of helical extrusions. Also swap the end remappings when the shell is inside out - this was also affecting some Revolve extrusions. --- src/drawentity.cpp | 2 ++ src/entity.cpp | 18 ++++++++++++++++++ src/group.cpp | 13 ++++++++++++- src/sketch.h | 1 + src/srf/surface.cpp | 6 ++++-- 5 files changed, 37 insertions(+), 3 deletions(-) diff --git a/src/drawentity.cpp b/src/drawentity.cpp index 54477c8a5..6d40c8fda 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -121,6 +121,7 @@ void Entity::GetReferencePoints(std::vector *refs) { case Type::FACE_N_TRANS: case Type::FACE_N_ROT_AA: case Type::FACE_ROT_NORMAL_PT: + case Type::FACE_N_ROT_AXIS_TRANS: break; } } @@ -757,6 +758,7 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { case Type::FACE_N_TRANS: case Type::FACE_N_ROT_AA: case Type::FACE_ROT_NORMAL_PT: + case Type::FACE_N_ROT_AXIS_TRANS: // Do nothing; these are drawn with the triangle mesh return; } diff --git a/src/entity.cpp b/src/entity.cpp index 344e1acbd..a0f2f9461 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -702,6 +702,7 @@ bool EntityBase::IsFace() const { case Type::FACE_N_TRANS: case Type::FACE_N_ROT_AA: case Type::FACE_ROT_NORMAL_PT: + case Type::FACE_N_ROT_AXIS_TRANS: return true; default: return false; @@ -774,6 +775,15 @@ ExprVector EntityBase::FaceGetPointExprs() const { r = ExprVector::From(numPoint); r = q.Rotate(r); r = r.Plus(trans); + } else if(type == Type::FACE_N_ROT_AXIS_TRANS) { + ExprVector orig = ExprVector::From(numPoint); + ExprVector trans = ExprVector::From(param[0], param[1], param[2]); + ExprVector displace = ExprVector::From(param[4], param[5], param[6]) + .WithMagnitude(Expr::From(param[7])).ScaledBy(Expr::From(timesApplied)); + ExprQuaternion q = GetAxisAngleQuaternionExprs(3); + orig = orig.Minus(trans); + orig = q.Rotate(orig); + r = orig.Plus(trans).Plus(displace); } else if(type == Type::FACE_N_TRANS) { ExprVector trans = ExprVector::From(param[0], param[1], param[2]); r = ExprVector::From(numPoint); @@ -801,6 +811,14 @@ Vector EntityBase::FaceGetPointNum() const { Quaternion q = Quaternion::From(param[3], param[4], param[5], param[6]); r = q.Rotate(numPoint); r = r.Plus(trans); + } else if(type == Type::FACE_N_ROT_AXIS_TRANS) { + Vector offset = Vector::From(param[0], param[1], param[2]); + Vector displace = Vector::From(param[4], param[5], param[6]) + .WithMagnitude(SK.GetParam(param[7])->val).ScaledBy(timesApplied); + Quaternion q = PointGetQuaternion(); + r = numPoint.Minus(offset); + r = q.Rotate(r); + r = r.Plus(offset).Plus(displace); } else if(type == Type::FACE_N_TRANS) { Vector trans = Vector::From(param[0], param[1], param[2]); r = numPoint.Plus(trans.ScaledBy(timesApplied)); diff --git a/src/group.cpp b/src/group.cpp index dac0764bf..7a6161691 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -1113,6 +1113,7 @@ void Group::CopyEntity(IdList *el, case Entity::Type::FACE_N_TRANS: case Entity::Type::FACE_N_ROT_AA: case Entity::Type::FACE_ROT_NORMAL_PT: + case Entity::Type::FACE_N_ROT_AXIS_TRANS: if(as == CopyAs::N_TRANS) { en.type = Entity::Type::FACE_N_TRANS; en.param[0] = dx; @@ -1120,8 +1121,18 @@ void Group::CopyEntity(IdList *el, en.param[2] = dz; } else if (as == CopyAs::NUMERIC) { en.type = Entity::Type::FACE_NORMAL_PT; + } else if (as == CopyAs::N_ROT_AXIS_TRANS) { + en.type = Entity::Type::FACE_N_ROT_AXIS_TRANS; + en.param[0] = dx; + en.param[1] = dy; + en.param[2] = dz; + en.param[3] = qw; + en.param[4] = qvx; + en.param[5] = qvy; + en.param[6] = qvz; + en.param[7] = dist; } else { - if(as == CopyAs::N_ROT_AA || as == CopyAs::N_ROT_AXIS_TRANS) { + if(as == CopyAs::N_ROT_AA) { en.type = Entity::Type::FACE_N_ROT_AA; } else { en.type = Entity::Type::FACE_N_ROT_TRANS; diff --git a/src/sketch.h b/src/sketch.h index 95aebd054..2892bf36a 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -409,6 +409,7 @@ class EntityBase { FACE_N_TRANS = 5003, FACE_N_ROT_AA = 5004, FACE_ROT_NORMAL_PT = 5005, + FACE_N_ROT_AXIS_TRANS = 5006, WORKPLANE = 10000, LINE_SEGMENT = 11000, diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp index eeed9dd65..3e97bb21d 100644 --- a/src/srf/surface.cpp +++ b/src/srf/surface.cpp @@ -648,12 +648,14 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector double dist = distf - dists; int sections = (int)(fabs(anglef - angles) / (PI / 2) + 1); double wedge = (anglef - angles) / sections; + int startMapping = Group::REMAP_LATHE_START, endMapping = Group::REMAP_LATHE_END; if(CheckNormalAxisRelationship(sbls, pt, axis, anglef-angles, distf-dists)) { swap(angles, anglef); swap(dists, distf); dist = -dist; wedge = -wedge; + swap(startMapping, endMapping); } // Define a coordinate system to contain the original sketch, and get @@ -678,7 +680,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector u.RotatedAbout(axis, angles), v.RotatedAbout(axis, angles)); s0.color = color; - hEntity face0 = group->Remap(Entity::NO_ENTITY, Group::REMAP_LATHE_START); + hEntity face0 = group->Remap(Entity::NO_ENTITY, startMapping); s0.face = face0.v; s1 = SSurface::FromPlane( @@ -686,7 +688,7 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector u.ScaledBy(-1).RotatedAbout(axis, anglef), v.RotatedAbout(axis, anglef)); s1.color = color; - hEntity face1 = group->Remap(Entity::NO_ENTITY, Group::REMAP_LATHE_END); + hEntity face1 = group->Remap(Entity::NO_ENTITY, endMapping); s1.face = face1.v; hSSurface hs0 = surface.AddAndAssignId(&s0); From 897d7c0ad9dcd7841208a8fddbd17db26a29a858 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 22 Jul 2020 11:12:34 -0400 Subject: [PATCH 095/646] Add a pass in triangulation to create convex triangle fans. These triangles will have smaller bounding boxes and look better. --- src/polygon.h | 1 + src/srf/triangulate.cpp | 100 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/src/polygon.h b/src/polygon.h index 66023eb2b..cf0f32283 100644 --- a/src/polygon.h +++ b/src/polygon.h @@ -131,6 +131,7 @@ class SContour { void FindPointWithMinX(); Vector AnyEdgeMidpoint() const; + bool IsEmptyTriangle(int ap, int bp, int cp, double scaledEPS) const; bool IsEar(int bp, double scaledEps) const; bool BridgeToContour(SContour *sc, SEdgeList *el, List *vl); void ClipEarInto(SMesh *m, int bp, double scaledEps); diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index e6cd6e493..a9fce6c72 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -213,6 +213,41 @@ bool SContour::BridgeToContour(SContour *sc, return true; } +bool SContour::IsEmptyTriangle(int ap, int bp, int cp, double scaledEPS) const { + + STriangle tr = {}; + tr.a = l[ap].p; + tr.b = l[bp].p; + tr.c = l[cp].p; + + // Accelerate with an axis-aligned bounding box test + Vector maxv = tr.a, minv = tr.a; + (tr.b).MakeMaxMin(&maxv, &minv); + (tr.c).MakeMaxMin(&maxv, &minv); + + Vector n = Vector::From(0, 0, -1); + + int i; + for(i = 0; i < l.n; i++) { + if(i == ap || i == bp || i == cp) continue; + + Vector p = l[i].p; + if(p.OutsideAndNotOn(maxv, minv)) continue; + + // A point on the edge of the triangle is considered to be inside, + // and therefore makes it a non-ear; but a point on the vertex is + // "outside", since that's necessary to make bridges work. + if(p.EqualsExactly(tr.a)) continue; + if(p.EqualsExactly(tr.b)) continue; + if(p.EqualsExactly(tr.c)) continue; + + if(tr.ContainsPointProjd(n, p)) { + return false; + } + } + return true; +} + bool SContour::IsEar(int bp, double scaledEps) const { int ap = WRAP(bp-1, l.n), cp = WRAP(bp+1, l.n); @@ -308,6 +343,71 @@ void SContour::UvTriangulateInto(SMesh *m, SSurface *srf) { } l.RemoveTagged(); + // Handle simple triangle fans all at once. This pass is optional. + if(srf->degm == 1 && srf->degn == 1) { + l.ClearTags(); + int j=0; + int pstart = 0; + double elen = -1.0; + double oldspan = 0.0; + for(i = 1; i < l.n; i++) { + Vector ab = l[i].p.Minus(l[i-1].p); + // first time just measure the segment + if (elen < 0.0) { + elen = ab.Dot(ab); + oldspan = elen; + j = 1; + continue; + } + // check for consecutive segments of similar size which are also + // ears and where the group forms a convex ear + bool end = false; + double ratio = ab.Dot(ab) / elen; + if ((ratio < 0.25) || (ratio > 4.0)) end = true; + + double slen = l[pstart].p.Minus(l[i].p).MagSquared(); + if (slen < oldspan) end = true; + + if (!IsEar(i-1, scaledEps) ) end = true; +// if ((j>0) && !IsEar(pstart, i-1, i, scaledEps)) end = true; + if ((j>0) && !IsEmptyTriangle(pstart, i-1, i, scaledEps)) end = true; + // the new segment is valid so add to the fan + if (!end) { + j++; + oldspan = slen; + } + // we need to stop at the end of polygon but may still + if (i == l.n-1) { + end = true; + } + if (end) { // triangulate the fan and tag the verticies + if (j > 3) { + Vector center = l[pstart+1].p.Plus(l[pstart+j-1].p).ScaledBy(0.5); + for (int x=0; xAddTriangle(&tr); + } + for (int x=1; xAddTriangle(&tr); + } + pstart = i-1; + elen = ab.Dot(ab); + oldspan = elen; + j = 1; + } + } + l.RemoveTagged(); + } // end optional fan creation pass + bool toggle = false; while(l.n > 3) { int bestEar = -1; From 58cdd6861e95932d2f553bb79b264b39313d5e3d Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 7 Aug 2020 16:59:25 -0400 Subject: [PATCH 096/646] Fix issue161 and 174. Use the same logic for selction and dragging, but ignore entites that are inherently undraggable. This allows the selection to reach through entities to their corresponding ones on the underlying sketch which can be dragged if they are not fully constrained. This is decided in a new function Entity::CanBeDragged(). --- src/draw.cpp | 30 +++++++++++++++++++++++------- src/drawentity.cpp | 19 +++++++++++++++++++ src/sketch.h | 1 + 3 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/draw.cpp b/src/draw.cpp index c3ce4561f..db2f33e58 100644 --- a/src/draw.cpp +++ b/src/draw.cpp @@ -353,18 +353,34 @@ GraphicsWindow::Selection GraphicsWindow::ChooseFromHoverToSelect() { return sel; } +// This uses the same logic as hovering and static entity selection +// but ignores points known not to be draggable GraphicsWindow::Selection GraphicsWindow::ChooseFromHoverToDrag() { Selection sel = {}; + if(hoverList.IsEmpty()) + return sel; + + Group *activeGroup = SK.GetGroup(SS.GW.activeGroup); + int bestOrder = -1; + int bestZIndex = 0; for(const Hover &hov : hoverList) { - if(hov.selection.entity.v == 0) continue; - if(!hov.selection.entity.isFromRequest()) continue; + hGroup hg = {}; + if(hov.selection.entity.v != 0) { + Entity *e = SK.GetEntity(hov.selection.entity); + if (!e->CanBeDragged()) continue; + hg = e->group; + } else if(hov.selection.constraint.v != 0) { + hg = SK.GetConstraint(hov.selection.constraint)->group; + } + + Group *g = SK.GetGroup(hg); + if(g->order > activeGroup->order) continue; + if(bestOrder != -1 && (bestOrder >= g->order || bestZIndex > hov.zIndex)) continue; + bestOrder = g->order; + bestZIndex = hov.zIndex; sel = hov.selection; - break; } - if(!sel.IsEmpty()) { - return sel; - } - return ChooseFromHoverToSelect(); + return sel; } void GraphicsWindow::HitTestMakeSelection(Point2d mp) { diff --git a/src/drawentity.cpp b/src/drawentity.cpp index 6d40c8fda..bd455f718 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -180,6 +180,25 @@ bool Entity::IsVisible() const { return true; } +// entities that were created via some copy types will not be +// draggable with the mouse. We identify the undraggables here +bool Entity::CanBeDragged() const { + // a numeric copy can not move + if(type == Entity::Type::POINT_N_COPY) return false; + // these transforms applied zero times can not be moved + if(((type == Entity::Type::POINT_N_TRANS) || + (type == Entity::Type::POINT_N_ROT_AA) || + (type == Entity::Type::POINT_N_ROT_TRANS) || + (type == Entity::Type::POINT_N_ROT_AXIS_TRANS)) + && (timesApplied == 0)) return false; + // for these types of entities the first point will indicate draggability + if(HasEndpoints() || type == Entity::Type::CIRCLE) { + return SK.GetEntity(point[0])->CanBeDragged(); + } + // if we're not certain it can't be dragged then default to true + return true; +} + void Entity::CalculateNumerical(bool forExport) { if(IsPoint()) actPoint = PointGetNum(); if(IsNormal()) actNormal = NormalGetNum(); diff --git a/src/sketch.h b/src/sketch.h index 2892bf36a..50347bef4 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -566,6 +566,7 @@ class Entity : public EntityBase { bool IsStylable() const; bool IsVisible() const; + bool CanBeDragged() const; enum class DrawAs { DEFAULT, OVERLAY, HIDDEN, HOVERED, SELECTED }; void Draw(DrawAs how, Canvas *canvas); From 9176c74f0c97edac19b29ea6562cdb96340a706a Mon Sep 17 00:00:00 2001 From: Paul <14852918+phkahler@users.noreply.github.com> Date: Tue, 11 Aug 2020 21:00:23 -0400 Subject: [PATCH 097/646] NURBS boolean improvement. The 3-plane intersection code fails to converge when a curve joins two tangent NURBS patches. This adds a new function for intersecting exact curves with a surface to avoid those failures. Fixes simplified test model for issue #315. --- src/srf/boolean.cpp | 11 +++++++-- src/srf/ratpoly.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++ src/srf/surface.h | 1 + src/srf/surfinter.cpp | 6 ++++- 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index cb72cd8f5..17e9d15c3 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -88,8 +88,15 @@ SCurve SCurve::MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB, } } - // We're keeping the intersection, so actually refine it. - (pi->srf)->PointOnSurfaces(srfA, srfB, &(puv.x), &(puv.y)); + // We're keeping the intersection, so actually refine it. Finding the intersection + // to within EPS is important to match the ends of different chopped trim curves. + // The general 3-surface intersection fails to refine for trims where surfaces + // are tangent at the curve, but those trims are usually exact, so… + if(isExact) { + (pi->srf)->PointOnCurve(&exact, &(puv.x), &(puv.y)); + } else { + (pi->srf)->PointOnSurfaces(srfA, srfB, &(puv.x), &(puv.y)); + } pi->p = (pi->srf)->PointAt(puv); } il.RemoveTagged(); diff --git a/src/srf/ratpoly.cpp b/src/srf/ratpoly.cpp index 6498cc4a0..bd878ab16 100644 --- a/src/srf/ratpoly.cpp +++ b/src/srf/ratpoly.cpp @@ -634,3 +634,58 @@ void SSurface::PointOnSurfaces(SSurface *s1, SSurface *s2, double *up, double *v dbp("didn't converge (three surfaces intersecting)"); } +void SSurface::PointOnCurve(const SBezier *curve, double *up, double *vp) +{ + Vector tu,tv,n; + double u = *up, v = *vp; + Vector ps = PointAt(u, v); + // Get initial guesses for t on the curve + double tCurve = 0.5; + curve->ClosestPointTo(ps, &tCurve, /*mustConverge=*/false); + if(tCurve < 0.0) tCurve = 0.0; + if(tCurve > 1.0) tCurve = 1.0; + + for(int i = 0; i < 30; i++) { + // Approximate the surface by a plane + Vector ps = PointAt(u, v); + TangentsAt(u, v, &tu, &tv); + n = tu.Cross(tv).WithMagnitude(1); + + // point on curve and tangent line direction + Vector pc = curve->PointAt(tCurve); + Vector tc = curve->TangentAt(tCurve); + + if(ps.Equals(pc, RATPOLY_EPS)) { + *up = u; + *vp = v; + return; + } + + //pi is where the curve tangent line intersects the surface tangent plane + Vector pi; + double d = tc.Dot(n); + if (fabs(d) < 1e-10) { // parallel line and plane, guess the average rather than fail + pi = pc.Plus(ps).ScaledBy(0.5); + } else { + pi = pc.Minus(tc.ScaledBy(pc.Minus(ps).Dot(n)/d)); + } + + // project the point onto the tangent plane and line + { + Vector n = tu.Cross(tv); + Vector ty = n.Cross(tu).ScaledBy(1.0/tu.MagSquared()); + Vector tx = tv.Cross(n).ScaledBy(1.0/tv.MagSquared()); + + Vector dp = pi.Minus(ps); + double du = dp.Dot(tx), dv = dp.Dot(ty); + + u += du / tx.MagSquared(); + v += dv / ty.MagSquared(); + } + tCurve += pi.Minus(pc).Dot(tc) / tc.MagSquared(); + if(tCurve < 0.0) tCurve = 0.0; + if(tCurve > 1.0) tCurve = 1.0; + } + dbp("didn't converge (surface and curve intersecting)"); +} + diff --git a/src/srf/surface.h b/src/srf/surface.h index d1918b6c1..ba4414a2a 100644 --- a/src/srf/surface.h +++ b/src/srf/surface.h @@ -332,6 +332,7 @@ class SSurface { bool PointIntersectingLine(Vector p0, Vector p1, double *u, double *v) const; Vector ClosestPointOnThisAndSurface(SSurface *srf2, Vector p); void PointOnSurfaces(SSurface *s1, SSurface *s2, double *u, double *v); + void PointOnCurve(const SBezier *curve, double *up, double *vp); Vector PointAt(double u, double v) const; Vector PointAt(Point2d puv) const; void TangentsAt(double u, double v, Vector *tu, Vector *tv) const; diff --git a/src/srf/surfinter.cpp b/src/srf/surfinter.cpp index 9f6c85cc4..0a2f09c00 100644 --- a/src/srf/surfinter.cpp +++ b/src/srf/surfinter.cpp @@ -341,7 +341,11 @@ void SSurface::IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB, Vector p = si->p; double u, v; srfB->ClosestPointTo(p, &u, &v); - srfB->PointOnSurfaces(srfA, other, &u, &v); + if(sc->isExact) { + srfB->PointOnCurve(&(sc->exact), &u, &v); + } else { + srfB->PointOnSurfaces(srfA, other, &u, &v); + } p = srfB->PointAt(u, v); if(!spl.ContainsPoint(p)) { SPoint sp; From a33d52e0ad3101b1f078eddb51e130983c853af4 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 13 Aug 2020 15:24:53 -0400 Subject: [PATCH 098/646] Ratpoly - Less noise in terminal. Comment out expected dbg print and try harder to converge. --- src/srf/ratpoly.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/srf/ratpoly.cpp b/src/srf/ratpoly.cpp index bd878ab16..8e43367de 100644 --- a/src/srf/ratpoly.cpp +++ b/src/srf/ratpoly.cpp @@ -447,11 +447,13 @@ void SSurface::ClosestPointTo(Vector p, double *u, double *v, bool mustConverge) // If we failed to converge, then at least don't return NaN. if(mustConverge) { - Vector p0 = PointAt(*u, *v); - dbp("didn't converge"); - dbp("have %.3f %.3f %.3f", CO(p0)); - dbp("want %.3f %.3f %.3f", CO(p)); - dbp("distance = %g", (p.Minus(p0)).Magnitude()); +// This is expected not to converge when the target point is not on the surface but nearby. +// let's not pollute the output window for normal use. +// Vector p0 = PointAt(*u, *v); +// dbp("didn't converge"); +// dbp("have %.3f %.3f %.3f", CO(p0)); +// dbp("want %.3f %.3f %.3f", CO(p)); +// dbp("distance = %g", (p.Minus(p0)).Magnitude()); } if(IsReasonable(*u) || IsReasonable(*v)) { *u = *v = 0; @@ -500,7 +502,7 @@ bool SSurface::ClosestPointNewton(Vector p, double *u, double *v, bool mustConve bool SSurface::PointIntersectingLine(Vector p0, Vector p1, double *u, double *v) const { int i; - for(i = 0; i < 15; i++) { + for(i = 0; i < 20; i++) { Vector pi, p, tu, tv; p = PointAt(*u, *v); TangentsAt(*u, *v, &tu, &tv); @@ -510,7 +512,10 @@ bool SSurface::PointIntersectingLine(Vector p0, Vector p1, double *u, double *v) bool parallel; pi = Vector::AtIntersectionOfPlaneAndLine(n, d, p0, p1, ¶llel); - if(parallel) break; + if(parallel) { + dbp("parallel (surface intersecting line)"); + break; + } // Check for convergence if(pi.Equals(p, RATPOLY_EPS)) return true; @@ -617,7 +622,10 @@ void SSurface::PointOnSurfaces(SSurface *s1, SSurface *s2, double *up, double *v Vector pi = Vector::AtIntersectionOfPlanes(n[0], d[0], n[1], d[1], n[2], d[2], ¶llel); - if(parallel) break; + + if(parallel) { // lets try something else for parallel planes + pi = p[0].Plus(p[1]).Plus(p[2]).ScaledBy(1.0/3.0); + } for(j = 0; j < 3; j++) { Vector n = tu[j].Cross(tv[j]); From a30a223f28580854f64b33133c0c288bc2c9ec63 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 13 Aug 2020 20:59:05 -0400 Subject: [PATCH 099/646] Don't duplicate points when connecting contours with zero length bridge. Fixes #303 --- src/srf/triangulate.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index a9fce6c72..7b75bd150 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -109,6 +109,7 @@ bool SContour::BridgeToContour(SContour *sc, SEdgeList *avoidEdges, List *avoidPts) { int i, j; + bool withbridge = true; // Start looking for a bridge on our new hole near its leftmost (min x) // point. @@ -152,6 +153,7 @@ bool SContour::BridgeToContour(SContour *sc, b = sc->l[scp].p; if(a.Equals(b)) { + withbridge = false; goto haveEdge; } } @@ -190,7 +192,9 @@ bool SContour::BridgeToContour(SContour *sc, haveEdge: SContour merged = {}; for(i = 0; i < l.n; i++) { - merged.AddPoint(l[i].p); + if(withbridge || (i != thisp)) { + merged.AddPoint(l[i].p); + } if(i == thisp) { // less than or equal; need to duplicate the join point for(j = 0; j <= (sc->l.n - 1); j++) { @@ -198,7 +202,9 @@ bool SContour::BridgeToContour(SContour *sc, merged.AddPoint((sc->l[jp]).p); } // and likewise duplicate join point for the outer curve - merged.AddPoint(l[i].p); + if(withbridge) { + merged.AddPoint(l[i].p); + } } } From 135c879c92ddcee0c4142645299419196f66af5b Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 15 Aug 2020 17:47:40 -0400 Subject: [PATCH 100/646] NFC replace 2 nested loops with 1 loop and a lookup for speed improvement. --- src/srf/boolean.cpp | 85 ++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 43 deletions(-) diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 17e9d15c3..296d64288 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -454,49 +454,48 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, SEdgeList inter = {}; SSurface *ss; - for(ss = agnst->surface.First(); ss; ss = agnst->surface.NextAfter(ss)) { - SCurve *sc; - for(sc = into->curve.First(); sc; sc = into->curve.NextAfter(sc)) { - if(sc->source != SCurve::Source::INTERSECTION) continue; - if(opA) { - if(sc->surfA != h || sc->surfB != ss->h) continue; - } else { - if(sc->surfB != h || sc->surfA != ss->h) continue; - } - - int i; - for(i = 1; i < sc->pts.n; i++) { - Vector a = sc->pts[i-1].p, - b = sc->pts[i].p; - - Point2d auv, buv; - ss->ClosestPointTo(a, &(auv.x), &(auv.y)); - ss->ClosestPointTo(b, &(buv.x), &(buv.y)); - - SBspUv::Class c = (ss->bsp) ? ss->bsp->ClassifyEdge(auv, buv, ss) : SBspUv::Class::OUTSIDE; - if(c != SBspUv::Class::OUTSIDE) { - Vector ta = Vector::From(0, 0, 0); - Vector tb = Vector::From(0, 0, 0); - ret.ClosestPointTo(a, &(ta.x), &(ta.y)); - ret.ClosestPointTo(b, &(tb.x), &(tb.y)); - - Vector tn = ret.NormalAt(ta.x, ta.y); - Vector sn = ss->NormalAt(auv.x, auv.y); - - // We are subtracting the portion of our surface that - // lies in the shell, so the in-plane edge normal should - // point opposite to the surface normal. - bool bkwds = true; - if((tn.Cross(b.Minus(a))).Dot(sn) < 0) bkwds = !bkwds; - if((type == SSurface::CombineAs::DIFFERENCE && !opA) || - (type == SSurface::CombineAs::INTERSECTION)) { // Invert all newly created edges for intersection - bkwds = !bkwds; - } - if(bkwds) { - inter.AddEdge(tb, ta, sc->h.v, 1); - } else { - inter.AddEdge(ta, tb, sc->h.v, 0); - } + SCurve *sc; + for(sc = into->curve.First(); sc; sc = into->curve.NextAfter(sc)) { + if(sc->source != SCurve::Source::INTERSECTION) continue; + if(opA) { + if(sc->surfA != h) continue; + ss = shb->surface.FindById(sc->surfB); + } else { + if(sc->surfB != h) continue; + ss = sha->surface.FindById(sc->surfA); + } + int i; + for(i = 1; i < sc->pts.n; i++) { + Vector a = sc->pts[i-1].p, + b = sc->pts[i].p; + + Point2d auv, buv; + ss->ClosestPointTo(a, &(auv.x), &(auv.y)); + ss->ClosestPointTo(b, &(buv.x), &(buv.y)); + + SBspUv::Class c = (ss->bsp) ? ss->bsp->ClassifyEdge(auv, buv, ss) : SBspUv::Class::OUTSIDE; + if(c != SBspUv::Class::OUTSIDE) { + Vector ta = Vector::From(0, 0, 0); + Vector tb = Vector::From(0, 0, 0); + ret.ClosestPointTo(a, &(ta.x), &(ta.y)); + ret.ClosestPointTo(b, &(tb.x), &(tb.y)); + + Vector tn = ret.NormalAt(ta.x, ta.y); + Vector sn = ss->NormalAt(auv.x, auv.y); + + // We are subtracting the portion of our surface that + // lies in the shell, so the in-plane edge normal should + // point opposite to the surface normal. + bool bkwds = true; + if((tn.Cross(b.Minus(a))).Dot(sn) < 0) bkwds = !bkwds; + if((type == SSurface::CombineAs::DIFFERENCE && !opA) || + (type == SSurface::CombineAs::INTERSECTION)) { // Invert all newly created edges for intersection + bkwds = !bkwds; + } + if(bkwds) { + inter.AddEdge(tb, ta, sc->h.v, 1); + } else { + inter.AddEdge(ta, tb, sc->h.v, 0); } } } From a1b625a0696500feceaba25eab2d74452c604d27 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 15 Aug 2020 18:58:27 -0400 Subject: [PATCH 101/646] NFC: remove a critical section, runs faster. --- src/srf/boolean.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 296d64288..6c2443e13 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -624,16 +624,17 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, } void SShell::CopySurfacesTrimAgainst(SShell *sha, SShell *shb, SShell *into, SSurface::CombineAs type) { + std::vector ssn(surface.n); #pragma omp parallel for for (int i = 0; i < surface.n; i++) { SSurface *ss = &surface[i]; - SSurface ssn; - ssn = ss->MakeCopyTrimAgainst(this, sha, shb, into, type, i); -#pragma omp critical - { - ss->newH = into->surface.AddAndAssignId(&ssn); - } + ssn[i] = ss->MakeCopyTrimAgainst(this, sha, shb, into, type, i); + } + + for (int i = 0; i < surface.n; i++) + { + surface[i].newH = into->surface.AddAndAssignId(&ssn[i]); } I += surface.n; } From adddac50b5777854d0e0febebd977fae83e51bfd Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 27 Aug 2020 16:39:03 -0400 Subject: [PATCH 102/646] Performance: Don't call std::inplace_merge for IdList::AddAndAssignID() via Add() because it is redundant. --- src/dsc.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/dsc.h b/src/dsc.h index 5a431a73c..f07d9321d 100644 --- a/src/dsc.h +++ b/src/dsc.h @@ -368,7 +368,11 @@ class IdList { H AddAndAssignId(T *t) { t->h.v = (MaximumId() + 1); - Add(t); + AllocForOneMore(); + + // Copy-construct at the end of the list. + new(&elem[n]) T(*t); + ++n; return t->h; } From 2a9fcce0a7b1d140c5f28f3351c6c8fc9a861e41 Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Wed, 25 Mar 2020 04:26:58 +0100 Subject: [PATCH 103/646] Add ExportBackgroundColor config to GUI and CLI --- src/confscreen.cpp | 7 +++++++ src/platform/entrycli.cpp | 28 ++++++++++++++++++++++++---- src/solvespace.cpp | 4 ++++ src/solvespace.h | 1 + src/ui.h | 1 + 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/confscreen.cpp b/src/confscreen.cpp index b988df5a1..347d77b79 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -94,6 +94,10 @@ void TextWindow::ScreenChangeFixExportColors(int link, uint32_t v) { SS.fixExportColors = !SS.fixExportColors; } +void TextWindow::ScreenChangeExportBackgroundColor(int link, uint32_t v) { + SS.exportBackgroundColor = !SS.exportBackgroundColor; +} + void TextWindow::ScreenChangeBackFaces(int link, uint32_t v) { SS.drawBackFaces = !SS.drawBackFaces; SS.GW.Invalidate(/*clearPersistent=*/true); @@ -299,6 +303,9 @@ void TextWindow::ShowConfiguration() { Printf(false, " %Fd%f%Ll%s fix white exported lines%E", &ScreenChangeFixExportColors, SS.fixExportColors ? CHECK_TRUE : CHECK_FALSE); + Printf(false, " %Fd%f%Ll%s export background color%E", + &ScreenChangeExportBackgroundColor, + SS.exportBackgroundColor ? CHECK_TRUE : CHECK_FALSE); Printf(false, ""); Printf(false, "%Ft export canvas size: " diff --git a/src/platform/entrycli.cpp b/src/platform/entrycli.cpp index 95d60a97c..8d961b488 100644 --- a/src/platform/entrycli.cpp +++ b/src/platform/entrycli.cpp @@ -25,6 +25,8 @@ Common options: piecewise linear, and exact surfaces into triangle meshes. For export commands, the unit is mm, and the default is 1.0 mm. For non-export commands, the unit is %%, and the default is 1.0 %%. + -b, --bg-color + Whether to export the background colour in vector formats. Defaults to off. Commands: thumbnail --output --size --view @@ -33,6 +35,7 @@ Common options: is x, in pixels. Graphics acceleration is not used, and the output may look slightly different from the GUI. export-view --output --view [--chord-tol ] + [--bg-color ] Exports a view of the sketch, in a 2d vector format. export-wireframe --output [--chord-tol ] Exports a wireframe of the sketch, in a 3d vector format. @@ -155,6 +158,21 @@ static bool RunCommand(const std::vector args) { } else return false; }; + bool bg_color = false; + auto ParseBgColor = [&](size_t &argn) { + if(argn + 1 < args.size() && (args[argn] == "--bg-color" || + args[argn] == "-b")) { + argn++; + if(args[argn] == "on") { + bg_color = true; + return true; + } else if(args[argn] == "off") { + bg_color = false; + return true; + } else return false; + } else return false; + }; + unsigned width = 0, height = 0; if(args[1] == "thumbnail") { auto ParseSize = [&](size_t &argn) { @@ -221,7 +239,8 @@ static bool RunCommand(const std::vector args) { if(!(ParseInputFile(argn) || ParseOutputPattern(argn) || ParseViewDirection(argn) || - ParseChordTolerance(argn))) { + ParseChordTolerance(argn) || + ParseBgColor(argn))) { fprintf(stderr, "Unrecognized option '%s'.\n", args[argn].c_str()); return false; } @@ -233,9 +252,10 @@ static bool RunCommand(const std::vector args) { } runner = [&](const Platform::Path &output) { - SS.GW.projRight = projRight; - SS.GW.projUp = projUp; - SS.exportChordTol = chordTol; + SS.GW.projRight = projRight; + SS.GW.projUp = projUp; + SS.exportChordTol = chordTol; + SS.exportBackgroundColor = bg_color; SS.ExportViewOrWireframeTo(output, /*exportWireframe=*/false); }; diff --git a/src/solvespace.cpp b/src/solvespace.cpp index b058651e6..697e7402e 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -68,6 +68,8 @@ void SolveSpaceUI::Init() { exportOffset = settings->ThawFloat("ExportOffset", 0.0); // Rewrite exported colors close to white into black (assuming white bg) fixExportColors = settings->ThawBool("FixExportColors", true); + // Export background color + exportBackgroundColor = settings->ThawBool("ExportBackgroundColor", false); // Draw back faces of triangles (when mesh is leaky/self-intersecting) drawBackFaces = settings->ThawBool("DrawBackFaces", true); // Use turntable mouse navigation @@ -246,6 +248,8 @@ void SolveSpaceUI::Exit() { settings->FreezeFloat("ExportOffset", exportOffset); // Rewrite exported colors close to white into black (assuming white bg) settings->FreezeBool("FixExportColors", fixExportColors); + // Export background color + settings->FreezeBool("ExportBackgroundColor", exportBackgroundColor); // Draw back faces of triangles (when mesh is leaky/self-intersecting) settings->FreezeBool("DrawBackFaces", drawBackFaces); // Draw closed polygons areas diff --git a/src/solvespace.h b/src/solvespace.h index 42784390d..f98a53f0f 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -559,6 +559,7 @@ class SolveSpaceUI { double exportScale; double exportOffset; bool fixExportColors; + bool exportBackgroundColor; bool drawBackFaces; bool showContourAreas; bool checkClosedContour; diff --git a/src/ui.h b/src/ui.h index fc2d7d856..9e9bf503f 100644 --- a/src/ui.h +++ b/src/ui.h @@ -434,6 +434,7 @@ class TextWindow { static void ScreenGoToWebsite(int link, uint32_t v); static void ScreenChangeFixExportColors(int link, uint32_t v); + static void ScreenChangeExportBackgroundColor(int link, uint32_t v); static void ScreenChangeBackFaces(int link, uint32_t v); static void ScreenChangeShowContourAreas(int link, uint32_t v); static void ScreenChangeCheckClosedContour(int link, uint32_t v); From 59b985b88cd6eb599a0784bb4fa698585cd67bf2 Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Wed, 25 Mar 2020 21:40:14 +0100 Subject: [PATCH 104/646] Export backgrounds in vector files VectorFileWriter::Background() is an empty impl, except that it writes * a rectangle the size of the output for EPS and PDF, and * a \r\n"); } +void SvgFileWriter::Background(RgbaColor color) { + fprintf(f, +"\r\n", + color.red, color.green, color.blue); +} + void SvgFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth, bool filled, RgbaColor fillRgb, hStyle hs) { @@ -1146,6 +1212,9 @@ void HpglFileWriter::StartFile() { fprintf(f, "SP1;\r\n"); } +void HpglFileWriter::Background(RgbaColor color) { +} + void HpglFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth, bool filled, RgbaColor fillRgb, hStyle hs) { @@ -1187,6 +1256,8 @@ void GCodeFileWriter::StartPath(RgbaColor strokeRgb, double lineWidth, bool filled, RgbaColor fillRgb, hStyle hs) { } +void GCodeFileWriter::Background(RgbaColor color) { +} void GCodeFileWriter::FinishPath(RgbaColor strokeRgb, double lineWidth, bool filled, RgbaColor fillRgb, hStyle hs) { @@ -1248,6 +1319,9 @@ void Step2dFileWriter::StartFile() { sfw.WriteHeader(); } +void Step2dFileWriter::Background(RgbaColor color) { +} + void Step2dFileWriter::Triangle(STriangle *tr) { } diff --git a/src/solvespace.h b/src/solvespace.h index f98a53f0f..425e4c8d9 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -339,6 +339,7 @@ class VectorFileWriter { virtual void Bezier(SBezier *sb) = 0; virtual void Triangle(STriangle *tr) = 0; virtual bool OutputConstraints(IdList *) { return false; } + virtual void Background(RgbaColor color) = 0; virtual void StartFile() = 0; virtual void FinishAndCloseFile() = 0; virtual bool HasCanvasSize() const = 0; @@ -363,6 +364,7 @@ class DxfFileWriter : public VectorFileWriter { bool filled, RgbaColor fillRgb, hStyle hs) override; void Triangle(STriangle *tr) override; void Bezier(SBezier *sb) override; + void Background(RgbaColor color) override; void StartFile() override; void FinishAndCloseFile() override; bool HasCanvasSize() const override { return false; } @@ -380,6 +382,7 @@ class EpsFileWriter : public VectorFileWriter { bool filled, RgbaColor fillRgb, hStyle hs) override; void Triangle(STriangle *tr) override; void Bezier(SBezier *sb) override; + void Background(RgbaColor color) override; void StartFile() override; void FinishAndCloseFile() override; bool HasCanvasSize() const override { return true; } @@ -398,6 +401,7 @@ class PdfFileWriter : public VectorFileWriter { bool filled, RgbaColor fillRgb, hStyle hs) override; void Triangle(STriangle *tr) override; void Bezier(SBezier *sb) override; + void Background(RgbaColor color) override; void StartFile() override; void FinishAndCloseFile() override; bool HasCanvasSize() const override { return true; } @@ -414,6 +418,7 @@ class SvgFileWriter : public VectorFileWriter { bool filled, RgbaColor fillRgb, hStyle hs) override; void Triangle(STriangle *tr) override; void Bezier(SBezier *sb) override; + void Background(RgbaColor color) override; void StartFile() override; void FinishAndCloseFile() override; bool HasCanvasSize() const override { return true; } @@ -428,6 +433,7 @@ class HpglFileWriter : public VectorFileWriter { bool filled, RgbaColor fillRgb, hStyle hs) override; void Triangle(STriangle *tr) override; void Bezier(SBezier *sb) override; + void Background(RgbaColor color) override; void StartFile() override; void FinishAndCloseFile() override; bool HasCanvasSize() const override { return false; } @@ -441,6 +447,7 @@ class Step2dFileWriter : public VectorFileWriter { bool filled, RgbaColor fillRgb, hStyle hs) override; void Triangle(STriangle *tr) override; void Bezier(SBezier *sb) override; + void Background(RgbaColor color) override; void StartFile() override; void FinishAndCloseFile() override; bool HasCanvasSize() const override { return false; } @@ -455,6 +462,7 @@ class GCodeFileWriter : public VectorFileWriter { bool filled, RgbaColor fillRgb, hStyle hs) override; void Triangle(STriangle *tr) override; void Bezier(SBezier *sb) override; + void Background(RgbaColor color) override; void StartFile() override; void FinishAndCloseFile() override; bool HasCanvasSize() const override { return false; } From d19f02961124aa65f8a1e585f01cb28d0f420c25 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 6 Sep 2020 10:39:37 -0400 Subject: [PATCH 105/646] NFC, Performance: Use OpenMP for boolean function MakeItersectionCurvesAgainst. This is the last long-running single-threaded part of the boolean code. On one test model this took Regenerate form 27 seconds down to 18s. The critical sections needed a name (into) because that object must not be modified while in use in different places. --- src/srf/boolean.cpp | 6 ++++-- src/srf/surfinter.cpp | 35 ++++++++++++++++++++++------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 6c2443e13..b0b175dae 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -640,8 +640,10 @@ void SShell::CopySurfacesTrimAgainst(SShell *sha, SShell *shb, SShell *into, SSu } void SShell::MakeIntersectionCurvesAgainst(SShell *agnst, SShell *into) { - SSurface *sa; - for(sa = surface.First(); sa; sa = surface.NextAfter(sa)) { +#pragma omp parallel for + for(int i = 0; i< surface.n; i++) { + SSurface *sa = &surface[i]; + SSurface *sb; for(sb = agnst->surface.First(); sb; sb = agnst->surface.NextAfter(sb)){ // Intersect every surface from our shell against every surface diff --git a/src/srf/surfinter.cpp b/src/srf/surfinter.cpp index 0a2f09c00..ddcbad23d 100644 --- a/src/srf/surfinter.cpp +++ b/src/srf/surfinter.cpp @@ -27,19 +27,22 @@ void SSurface::AddExactIntersectionCurve(SBezier *sb, SSurface *srfB, SBezier sbrev = *sb; sbrev.Reverse(); bool backwards = false; - for(se = into->curve.First(); se; se = into->curve.NextAfter(se)) { - if(se->isExact) { - if(sb->Equals(&(se->exact))) { - existing = se; - break; - } - if(sbrev.Equals(&(se->exact))) { - existing = se; - backwards = true; - break; +#pragma omp critical(into) + { + for(se = into->curve.First(); se; se = into->curve.NextAfter(se)) { + if(se->isExact) { + if(sb->Equals(&(se->exact))) { + existing = se; + break; + } + if(sbrev.Equals(&(se->exact))) { + existing = se; + backwards = true; + break; + } } } - } + }// end omp critical if(existing) { SCurvePt *v; for(v = existing->pts.First(); v; v = existing->pts.NextAfter(v)) { @@ -101,7 +104,10 @@ void SSurface::AddExactIntersectionCurve(SBezier *sb, SSurface *srfB, "Unexpected zero-length edge"); split.source = SCurve::Source::INTERSECTION; - into->curve.AddAndAssignId(&split); +#pragma omp critical(into) + { + into->curve.AddAndAssignId(&split); + } } void SSurface::IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB, @@ -456,7 +462,10 @@ void SSurface::IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB, // And now we split and insert the curve SCurve split = sc.MakeCopySplitAgainst(agnstA, agnstB, this, b); sc.Clear(); - into->curve.AddAndAssignId(&split); +#pragma omp critical(into) + { + into->curve.AddAndAssignId(&split); + } } spl.Clear(); } From 8c346020fae5e63a77521e59749df4641378e357 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 8 Sep 2020 13:01:37 -0400 Subject: [PATCH 106/646] NFC:Triangulation - don't add zero-length bridges to avoid list. --- src/srf/triangulate.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index 7b75bd150..e2e94c673 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -210,8 +210,10 @@ bool SContour::BridgeToContour(SContour *sc, // and future bridges mustn't cross our bridge, and it's tricky to get // things right if two bridges come from the same point - avoidEdges->AddEdge(a, b); - avoidPts->Add(&a); + if(withbridge) { + avoidEdges->AddEdge(a, b); + avoidPts->Add(&a); + } avoidPts->Add(&b); l.Clear(); From 9a741797fd5ac8df9361a1a66c8842083f5fe66c Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 8 Sep 2020 13:20:12 -0400 Subject: [PATCH 107/646] Fix #693 issues. This set of changes covers all triangulation errors in issue 693. A point coincident with a triangle vertex is OK and needed for bridges, but sometimes the middle point has edges cutting through the triangle that make it a non-ear. We fix that and a couple of off-by-one error (that fixes one of the test cases). --- src/srf/triangulate.cpp | 42 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index e2e94c673..d1e0de181 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -124,7 +124,7 @@ bool SContour::BridgeToContour(SContour *sc, // to the leftmost point of the new segment. int thiso = 0; double dmin = 1e10; - for(i = 0; i < l.n; i++) { + for(i = 0; i < l.n-1; i++) { Vector p = l[i].p; double d = (p.Minus(sc->xminPt)).MagSquared(); if(d < dmin) { @@ -140,7 +140,7 @@ bool SContour::BridgeToContour(SContour *sc, // First check if the contours share a point; in that case we should // merge them there, without a bridge. for(i = 0; i < l.n; i++) { - thisp = WRAP(i+thiso, l.n); + thisp = WRAP(i+thiso, l.n-1); a = l[thisp].p; for(f = avoidPts->First(); f; f = avoidPts->NextAfter(f)) { @@ -256,6 +256,28 @@ bool SContour::IsEmptyTriangle(int ap, int bp, int cp, double scaledEPS) const { return true; } +// Test if ray b->d passes through triangle a,b,c +static bool RayIsInside(Vector a, Vector c, Vector b, Vector d) { + // coincident edges are not considered to intersect the triangle + if (d.Equals(a)) return false; + if (d.Equals(c)) return false; + // if d and c are on opposite sides of ba, we are ok + // likewise if d and a are on opposite sides of bc + Vector ba = a.Minus(b); + Vector bc = c.Minus(b); + Vector bd = d.Minus(b); + + // perpendicular to (x,y) is (x,-y) so dot that with the two points. If they + // have opposite signs their product will be negative. If bd and bc are on + // opposite sides of ba the ray does not intersect. Likewise for bd,ba and bc. + if ( (bd.x*(ba.y) + (bd.y * (-ba.x))) * ( bc.x*(ba.y) + (bc.y * (-ba.x))) < LENGTH_EPS) + return false; + if ( (bd.x*(bc.y) + (bd.y * (-bc.x))) * ( ba.x*(bc.y) + (ba.y * (-bc.x))) < LENGTH_EPS) + return false; + + return true; +} + bool SContour::IsEar(int bp, double scaledEps) const { int ap = WRAP(bp-1, l.n), cp = WRAP(bp+1, l.n); @@ -294,8 +316,19 @@ bool SContour::IsEar(int bp, double scaledEps) const { // and therefore makes it a non-ear; but a point on the vertex is // "outside", since that's necessary to make bridges work. if(p.EqualsExactly(tr.a)) continue; - if(p.EqualsExactly(tr.b)) continue; if(p.EqualsExactly(tr.c)) continue; + // points coincident with bp have to be allowed for bridges but edges + // from that other point must not cross through our triangle. + if(p.EqualsExactly(tr.b)) { + int j = WRAP(i-1, l.n); + int k = WRAP(i+1, l.n); + Vector jp = l[j].p; + Vector kp = l[k].p; + + // check both edges from the point in question + if (!RayIsInside(tr.a, tr.c, p,jp) && !RayIsInside(tr.a, tr.c, p,kp)) + continue; + } if(tr.ContainsPointProjd(n, p)) { return false; @@ -349,6 +382,9 @@ void SContour::UvTriangulateInto(SMesh *m, SSurface *srf) { l[i].tag = 1; } } + if( (l[0].p).Equals(l[l.n-1].p) ) { + l[l.n-1].tag = 1; + } l.RemoveTagged(); // Handle simple triangle fans all at once. This pass is optional. From 20fdd31e1fb29c62b032f0d4f39eb3f8c8927b1e Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 8 Sep 2020 13:23:59 -0400 Subject: [PATCH 108/646] Fix issue #296. We need to recognize two consecutive bridges as a non-ear. --- src/srf/triangulate.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index d1e0de181..d02f96380 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -325,6 +325,8 @@ bool SContour::IsEar(int bp, double scaledEps) const { Vector jp = l[j].p; Vector kp = l[k].p; + // two consecutive bridges (A,B,C) and later (C,B,A) are not an ear + if (jp.Equals(tr.c) && kp.Equals(tr.a)) return false; // check both edges from the point in question if (!RayIsInside(tr.a, tr.c, p,jp) && !RayIsInside(tr.a, tr.c, p,kp)) continue; From a99be4268ab108d5e3f25710f7951db0c0a146d4 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 12 Sep 2020 17:21:20 -0400 Subject: [PATCH 109/646] Fix #696. Account for multiple coincident edges when looking for naked edges. --- src/mesh.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mesh.cpp b/src/mesh.cpp index 1ef6c1766..57377d0cc 100644 --- a/src/mesh.cpp +++ b/src/mesh.cpp @@ -971,9 +971,15 @@ void SKdNode::MakeCertainEdgesInto(SEdgeList *sel, EdgeKind how, bool coplanarIs switch(how) { case EdgeKind::NAKED_OR_SELF_INTER: + // there should be one anti-parllel edge if(info.count != 1) { - sel->AddEdge(a, b, auxA); - if(leaky) *leaky = true; + // but there may be multiple parallel coincident edges + SKdNode::EdgeOnInfo parallelInfo = {}; + FindEdgeOn(b, a, -cnt, coplanarIsInter, ¶llelInfo); + if (info.count != parallelInfo.count) { + sel->AddEdge(a, b, auxA); + if(leaky) *leaky = true; + } } if(info.intersectsMesh) { sel->AddEdge(a, b, auxA); From 5d99e1a5ef04f77bd8cc0c635e4796d9d534817d Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 11 Sep 2020 15:00:10 -0400 Subject: [PATCH 110/646] Fix #131. Prevent UI freeze by having a timeout when finding which constraints can be removed to fix jacobian. --- src/sketch.h | 1 + src/system.cpp | 7 +++++++ src/textscreens.cpp | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/src/sketch.h b/src/sketch.h index 50347bef4..65d9c1557 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -189,6 +189,7 @@ class Group { struct { SolveResult how; int dof; + bool timeout; List remove; } solved; diff --git a/src/system.cpp b/src/system.cpp index 933f153a0..2b471e427 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -355,10 +355,17 @@ void System::WriteEquationsExceptFor(hConstraint hc, Group *g) { } void System::FindWhichToRemoveToFixJacobian(Group *g, List *bad, bool forceDofCheck) { + auto time = GetMilliseconds(); + g->solved.timeout = false; int a; for(a = 0; a < 2; a++) { for(auto &con : SK.constraint) { + if((GetMilliseconds() - time) > 1500) { // todo: make timeout configurable + g->solved.timeout = true; + return; + } + ConstraintBase *c = &con; if(c->group != g->h) continue; if((c->type == Constraint::Type::POINTS_COINCIDENT && a == 0) || diff --git a/src/textscreens.cpp b/src/textscreens.cpp index d4cce9850..aac270337 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -578,6 +578,11 @@ void TextWindow::ShowGroupSolveInfo() { c->DescriptionString().c_str()); } + if(g->solved.timeout) { + Printf(true, "%FxSome items in list have been ommitted%Fd"); + Printf(false, "%Fxbecause the operation timed out.%Fd"); + } + Printf(true, "It may be possible to fix the problem "); Printf(false, "by selecting Edit -> Undo."); From 1cdc39f86114c367df12f820f065b6d517cb691c Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 12 Sep 2020 15:52:27 -0400 Subject: [PATCH 111/646] Make the redundant constraint timeout a configuration value and add the config UI elements to edit that value. --- src/confscreen.cpp | 20 ++++++++++++++++++++ src/generate.cpp | 1 + src/sketch.h | 1 + src/solvespace.cpp | 4 ++++ src/solvespace.h | 4 +++- src/system.cpp | 2 +- src/ui.h | 2 ++ 7 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/confscreen.cpp b/src/confscreen.cpp index 347d77b79..07c42b743 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -204,6 +204,11 @@ void TextWindow::ScreenChangeAutosaveInterval(int link, uint32_t v) { SS.TW.edit.meaning = Edit::AUTOSAVE_INTERVAL; } +void TextWindow::ScreenChangeFindConstraintTimeout(int link, uint32_t v) { + SS.TW.ShowEditControl(3, std::to_string(SS.timeoutRedundantConstr)); + SS.TW.edit.meaning = Edit::FIND_CONSTRAINT_TIMEOUT; +} + void TextWindow::ShowConfiguration() { int i; Printf(true, "%Ft user color (r, g, b)"); @@ -371,6 +376,10 @@ void TextWindow::ShowConfiguration() { Printf(false, "%Ft autosave interval (in minutes)%E"); Printf(false, "%Ba %d %Fl%Ll%f[change]%E", SS.autosaveInterval, &ScreenChangeAutosaveInterval); + Printf(false, ""); + Printf(false, "%Ft redundant constraint timeout (in ms)%E"); + Printf(false, "%Ba %d %Fl%Ll%f[change]%E", + SS.timeoutRedundantConstr, &ScreenChangeFindConstraintTimeout); if(canvas) { const char *gl_vendor, *gl_renderer, *gl_version; @@ -542,6 +551,17 @@ bool TextWindow::EditControlDoneForConfiguration(const std::string &s) { } break; } + case Edit::FIND_CONSTRAINT_TIMEOUT: { + int timeout = atoi(s.c_str()); + if(timeout) { + if(timeout >= 1) { + SS.timeoutRedundantConstr = timeout; + } else { + SS.timeoutRedundantConstr = 1000; + } + } + break; + } default: return false; } diff --git a/src/generate.cpp b/src/generate.cpp index 70b57c156..fdda99462 100644 --- a/src/generate.cpp +++ b/src/generate.cpp @@ -533,6 +533,7 @@ void SolveSpaceUI::SolveGroup(hGroup hg, bool andFindFree) { WriteEqSystemForGroup(hg); Group *g = SK.GetGroup(hg); g->solved.remove.Clear(); + g->solved.findToFixTimeout = SS.timeoutRedundantConstr; SolveResult how = sys.Solve(g, NULL, &(g->solved.dof), &(g->solved.remove), diff --git a/src/sketch.h b/src/sketch.h index 65d9c1557..869e0b6f1 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -189,6 +189,7 @@ class Group { struct { SolveResult how; int dof; + int findToFixTimeout; bool timeout; List remove; } solved; diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 697e7402e..d68cedf2d 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -51,6 +51,8 @@ void SolveSpaceUI::Init() { exportChordTol = settings->ThawFloat("ExportChordTolerance", 0.1); // Max pwl segments to generate exportMaxSegments = settings->ThawInt("ExportMaxSegments", 64); + // Timeout value for finding redundant constrains (ms) + timeoutRedundantConstr = settings->ThawInt("TimeoutRedundantConstraints", 1000); // View units viewUnits = (Unit)settings->ThawInt("ViewUnits", (uint32_t)Unit::MM); // Number of digits after the decimal point @@ -231,6 +233,8 @@ void SolveSpaceUI::Exit() { settings->FreezeFloat("ExportChordTolerance", (float)exportChordTol); // Export Max pwl segments to generate settings->FreezeInt("ExportMaxSegments", (uint32_t)exportMaxSegments); + // Timeout for finding which constraints to fix Jacobian + settings->FreezeInt("TimeoutRedundantConstraints", (uint32_t)timeoutRedundantConstr); // View units settings->FreezeInt("ViewUnits", (uint32_t)viewUnits); // Number of digits after the decimal point diff --git a/src/solvespace.h b/src/solvespace.h index 425e4c8d9..795c888f7 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -268,7 +268,8 @@ class System { void EvalJacobian(); void WriteEquationsExceptFor(hConstraint hc, Group *g); - void FindWhichToRemoveToFixJacobian(Group *g, List *bad, bool forceDofCheck); + void FindWhichToRemoveToFixJacobian(Group *g, List *bad, + bool forceDofCheck); void SolveBySubstitution(); bool IsDragged(hParam p); @@ -562,6 +563,7 @@ class SolveSpaceUI { int maxSegments; double exportChordTol; int exportMaxSegments; + int timeoutRedundantConstr; //milliseconds double cameraTangent; double gridSpacing; double exportScale; diff --git a/src/system.cpp b/src/system.cpp index 2b471e427..1119c3431 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -361,7 +361,7 @@ void System::FindWhichToRemoveToFixJacobian(Group *g, List *bad, bo for(a = 0; a < 2; a++) { for(auto &con : SK.constraint) { - if((GetMilliseconds() - time) > 1500) { // todo: make timeout configurable + if((GetMilliseconds() - time) > g->solved.findToFixTimeout) { g->solved.timeout = true; return; } diff --git a/src/ui.h b/src/ui.h index 9e9bf503f..b44d566b6 100644 --- a/src/ui.h +++ b/src/ui.h @@ -316,6 +316,7 @@ class TextWindow { G_CODE_PLUNGE_FEED = 115, AUTOSAVE_INTERVAL = 116, LIGHT_AMBIENT = 117, + FIND_CONSTRAINT_TIMEOUT = 118, // For TTF text TTF_TEXT = 300, // For the step dimension screen @@ -488,6 +489,7 @@ class TextWindow { static void ScreenChangeExportOffset(int link, uint32_t v); static void ScreenChangeGCodeParameter(int link, uint32_t v); static void ScreenChangeAutosaveInterval(int link, uint32_t v); + static void ScreenChangeFindConstraintTimeout(int link, uint32_t v); static void ScreenChangeStyleName(int link, uint32_t v); static void ScreenChangeStyleMetric(int link, uint32_t v); static void ScreenChangeStyleTextAngle(int link, uint32_t v); From 07efd8d561c0d28a5ff9be7275818f384099dcbe Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 16 Sep 2020 17:57:43 -0400 Subject: [PATCH 112/646] Fix 197 Update the state of checkboxes in menus after failed workplace activation. --- src/graphicswin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 073fb5d8c..5aed9663b 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -1243,6 +1243,8 @@ void GraphicsWindow::MenuRequest(Command id) { "not have a default workplane. Try selecting a " "workplane, or activating a sketch-in-new-workplane " "group.")); + //update checkboxes in the menus + SS.GW.EnsureValidActives(); } break; } From 5aaa81a341e8f0526295a80c0ee31b32aeed7711 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 17 Sep 2020 17:28:15 -0400 Subject: [PATCH 113/646] Fix 699: Allow dragging linked objects in an assembly. --- src/drawentity.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/drawentity.cpp b/src/drawentity.cpp index bd455f718..d67976618 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -188,7 +188,6 @@ bool Entity::CanBeDragged() const { // these transforms applied zero times can not be moved if(((type == Entity::Type::POINT_N_TRANS) || (type == Entity::Type::POINT_N_ROT_AA) || - (type == Entity::Type::POINT_N_ROT_TRANS) || (type == Entity::Type::POINT_N_ROT_AXIS_TRANS)) && (timesApplied == 0)) return false; // for these types of entities the first point will indicate draggability From 9d85789c308b769a050e4b347be40ee76443205b Mon Sep 17 00:00:00 2001 From: Reini Urban Date: Fri, 18 Sep 2020 13:16:39 +0200 Subject: [PATCH 114/646] de_DE: missing translations --- res/locales/de_DE.po | 65 +++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index d24c19b41..74da231e1 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -594,12 +594,13 @@ msgstr "Freihandlinien wurden mit durchgehenden Linien ersetzt" msgid "zigzag lines were replaced with continuous lines" msgstr "Zickzacklinien wurden mit durchgehenden Linien ersetzt" -#: exportvector.cpp:590 +#: exportvector.cpp:597 msgid "" -"Some aspects of the drawing have no DXF equivalent and were not exported:\n" +"Some aspects of the drawing have no DXF equivalent and " +"were not exported:\n" msgstr "" -"Eine Teile der Skizze haben kein Gegenstück in DXF und wurden nicht " -"exportiert:\n" +"Teile der Zeichnung haben keine Entsprechung in DXF und " +"wurden nicht exportiert:\n" #: exportvector.cpp:807 msgid "" @@ -696,11 +697,11 @@ msgstr "&Wiederholen" #: graphicswin.cpp:51 msgid "Re&generate All" -msgstr "Alles neu zeichnen" +msgstr "Alles &neu zeichnen" #: graphicswin.cpp:53 msgid "Snap Selection to &Grid" -msgstr "Auswahl auf Raster ausrichten" +msgstr "Auswahl auf &Raster ausrichten" #: graphicswin.cpp:54 msgid "Rotate Imported &90°" @@ -720,23 +721,35 @@ msgstr "Einfügen" #: graphicswin.cpp:59 msgid "Paste &Transformed..." -msgstr "Transformiert einfügen…" +msgstr "&Transformiert einfügen…" #: graphicswin.cpp:60 msgid "&Delete" -msgstr "Löschen" +msgstr "&Löschen" #: graphicswin.cpp:62 msgid "Select &Edge Chain" -msgstr "Kantenverlauf auswählen" +msgstr "&Kantenverlauf auswählen" #: graphicswin.cpp:63 msgid "Select &All" -msgstr "Alle auswählen" +msgstr "&Alle auswählen" #: graphicswin.cpp:64 msgid "&Unselect All" -msgstr "Alle deselektieren" +msgstr "Alle &deselektieren" + +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "&Linien Stile..." + +#: graphicswin.cpp:78 +msgid "&View Projection..." +msgstr "An&sichts Projektion..." + +#: graphicswin.cpp:78 +msgid "Con&figuration..." +msgstr "&Einstellungen..." #: graphicswin.cpp:66 msgid "&View" @@ -780,7 +793,7 @@ msgstr "Perspektivische Projektion" #: graphicswin.cpp:78 msgid "Dimension &Units" -msgstr "Masseinheit" +msgstr "Maßeinheit" #: graphicswin.cpp:79 msgid "Dimensions in &Inches" @@ -828,11 +841,19 @@ msgstr "Kopieren und drehen" #: graphicswin.cpp:95 msgid "E&xtrude" -msgstr "Extrudieren" +msgstr "E&xtrudieren" + +#: graphicswin.cpp:114 +msgid "&Helix" +msgstr "&Helix" #: graphicswin.cpp:96 msgid "&Lathe" -msgstr "Rotieren" +msgstr "R&otieren" + +#: graphicswin.cpp:96 +msgid "Re&volve" +msgstr "D&rehen" #: graphicswin.cpp:98 msgid "Link / Assemble..." @@ -860,15 +881,15 @@ msgstr "Bezugspunkt" #: graphicswin.cpp:106 msgid "&Workplane" -msgstr "Arbeitsebene" +msgstr "Arbeits&ebene" #: graphicswin.cpp:108 msgid "Line &Segment" -msgstr "Linie" +msgstr "&Linie" #: graphicswin.cpp:109 msgid "C&onstruction Line Segment" -msgstr "Konstruktionslinie" +msgstr "K&onstruktionslinie" #: graphicswin.cpp:110 msgid "&Rectangle" @@ -884,7 +905,7 @@ msgstr "Kreisbogen" #: graphicswin.cpp:113 msgid "&Bezier Cubic Spline" -msgstr "Kubischer Bezier-Spline" +msgstr "Kubischer &Bezier-Spline" #: graphicswin.cpp:115 msgid "&Text in TrueType Font" @@ -892,7 +913,7 @@ msgstr "&Text in Truetype-Font" #: graphicswin.cpp:116 msgid "&Image" -msgstr "Bild" +msgstr "B&ild" #: graphicswin.cpp:118 msgid "To&ggle Construction" @@ -1014,9 +1035,9 @@ msgstr "Freiliegende Kanten anzeigen" msgid "Show &Center of Mass" msgstr "Massenmittelpunkt anzeigen" -#: graphicswin.cpp:154 -msgid "Show Degrees of &Freedom" -msgstr "Freiheitsgrade anzeigen" +#: graphicswin.cpp:174 +msgid "Show &Underconstrained Points" +msgstr "&Unterbeschränkte Punkte anzeigen" #: graphicswin.cpp:156 msgid "&Trace Point" From f45b850c6ec87b089094df1e4f00b91509fcc74e Mon Sep 17 00:00:00 2001 From: Christoph Dittmann Date: Fri, 18 Sep 2020 09:38:40 +0200 Subject: [PATCH 115/646] solvespace-cli: Fix --view This fixes issues #499. The --view option changes projUp and projRight. For --view to affect the camera, the camera needs to be initialized using these values. --- src/platform/entrycli.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/entrycli.cpp b/src/platform/entrycli.cpp index 8d961b488..2f8f50e3f 100644 --- a/src/platform/entrycli.cpp +++ b/src/platform/entrycli.cpp @@ -211,8 +211,8 @@ static bool RunCommand(const std::vector args) { camera.gridFit = true; camera.width = width; camera.height = height; - camera.projUp = SS.GW.projUp; - camera.projRight = SS.GW.projRight; + camera.projUp = projUp; + camera.projRight = projRight; SS.GW.projUp = projUp; SS.GW.projRight = projRight; From f7d97b2203c5355ee307777c81272a44a5e50531 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 19 Sep 2020 13:35:17 -0400 Subject: [PATCH 116/646] Fix view centering and directions or cli thumbnail function. --- src/platform/entrycli.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/platform/entrycli.cpp b/src/platform/entrycli.cpp index 2f8f50e3f..61b20db18 100644 --- a/src/platform/entrycli.cpp +++ b/src/platform/entrycli.cpp @@ -121,22 +121,22 @@ static bool RunCommand(const std::vector args) { argn++; if(args[argn] == "top") { projRight = Vector::From(1, 0, 0); - projUp = Vector::From(0, 1, 0); + projUp = Vector::From(0, 0, -1); } else if(args[argn] == "bottom") { - projRight = Vector::From(-1, 0, 0); - projUp = Vector::From(0, 1, 0); - } else if(args[argn] == "left") { - projRight = Vector::From(0, 1, 0); + projRight = Vector::From(1, 0, 0); projUp = Vector::From(0, 0, 1); + } else if(args[argn] == "left") { + projRight = Vector::From(0, 0, 1); + projUp = Vector::From(0, 1, 0); } else if(args[argn] == "right") { - projRight = Vector::From(0, -1, 0); - projUp = Vector::From(0, 0, 1); + projRight = Vector::From(0, 0, -1); + projUp = Vector::From(0, 1, 0); } else if(args[argn] == "front") { - projRight = Vector::From(-1, 0, 0); - projUp = Vector::From(0, 0, 1); - } else if(args[argn] == "back") { projRight = Vector::From(1, 0, 0); - projUp = Vector::From(0, 0, 1); + projUp = Vector::From(0, 1, 0); + } else if(args[argn] == "back") { + projRight = Vector::From(-1, 0, 0); + projUp = Vector::From(0, 1, 0); } else if(args[argn] == "isometric") { projRight = Vector::From(0.707, 0.000, -0.707); projUp = Vector::From(-0.408, 0.816, -0.408); @@ -218,6 +218,7 @@ static bool RunCommand(const std::vector args) { SS.GW.projRight = projRight; SS.GW.scale = SS.GW.ZoomToFit(camera); camera.scale = SS.GW.scale; + camera.offset = SS.GW.offset; SS.GenerateAll(); CairoPixmapRenderer pixmapCanvas; From ec9e473d7cde41b8f48ae5767f19c4701d17b788 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 16 Sep 2020 17:22:50 -0400 Subject: [PATCH 117/646] Flip sign of exportCanvas dx and dy. Fixes issue #523 --- src/export.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/export.cpp b/src/export.cpp index 720841c17..e0c6182c6 100644 --- a/src/export.cpp +++ b/src/export.cpp @@ -717,8 +717,8 @@ void VectorFileWriter::OutputLinesAndMesh(SBezierLoopSetSet *sblss, SMesh *sm) { ptMin.y -= s*SS.exportMargin.bottom; ptMax.y += s*SS.exportMargin.top; } else { - ptMin.x = -(s*SS.exportCanvas.dx); - ptMin.y = -(s*SS.exportCanvas.dy); + ptMin.x = (s*SS.exportCanvas.dx); + ptMin.y = (s*SS.exportCanvas.dy); ptMax.x = ptMin.x + (s*SS.exportCanvas.width); ptMax.y = ptMin.y + (s*SS.exportCanvas.height); } From bf51a1e74ed0702c7b64decb2c7c9b97028e08a6 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 21 Sep 2020 15:16:26 -0400 Subject: [PATCH 118/646] Add cmake option ENABLE_LTO for link time optimization on Release builds. --- CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 46505922d..40071be4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -98,6 +98,10 @@ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X8 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLOAT_FLAGS}") endif() +if(ENABLE_LTO) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) +endif() + if(ENABLE_OPENMP) include(FindOpenMP) if(OpenMP_FOUND) From 34a972a3a4d91de9fb6b3d1ac4bf33fd6c051870 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 22 Sep 2020 14:53:51 -0400 Subject: [PATCH 119/646] add debug message showing the name of a group whose linked file can't be found. --- src/file.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/file.cpp b/src/file.cpp index 657a4b2ae..3cfcfbb33 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -892,6 +892,7 @@ bool SolveSpaceUI::ReloadAllLinked(const Platform::Path &saveFile, bool canCance } } } else if(linkMap.count(g.linkFile) == 0) { + dbp("Missing file for group: %s", g.name.c_str()); // The file was moved; prompt the user for its new location. switch(LocateImportedFile(g.linkFile.RelativeTo(saveFile), canCancel)) { case Platform::MessageDialog::Response::YES: { From 13ba9095ca744e55255befe4c290cf786a1a731a Mon Sep 17 00:00:00 2001 From: Reini Urban Date: Mon, 21 Sep 2020 10:57:34 +0200 Subject: [PATCH 120/646] translate_solvespace updates for all languages. See PR #705 my russian is not good enough to fix the remaining ru and uk strings. german and french are now complete. --- res/locales/de_DE.po | 1061 ++++++++++++++++++++++------------------- res/locales/en_US.po | 1087 +++++++++++++++++++++++++----------------- res/locales/fr_FR.po | 1073 +++++++++++++++++++++++------------------ res/locales/ru_RU.po | 1021 +++++++++++++++++++++------------------ res/locales/uk_UA.po | 852 +++++++++++++++++---------------- res/messages.pot | 843 ++++++++++++++++---------------- 6 files changed, 3251 insertions(+), 2686 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index 74da231e1..fb4f19b41 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -1,20 +1,19 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR the PACKAGE authors +# German translations for the SolveSpace package. +# Copyright (C) 2018 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. -# FIRST AUTHOR , YEAR. # Guido Hoss , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2018-07-12 22:40+0000\n" +"POT-Creation-Date: 2020-09-21 09:28+0200\n" +"PO-Revision-Date: 2018-07-19 06:55+0000\n" +"Last-Translator: Reini Urban \n" +"Language-Team: none\n" +"Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"PO-Revision-Date: 2018-07-19 06:55+0000\n" -"Last-Translator: Guido Hoss \n" -"Language-Team: LANGUAGE \n" -"Language: de\n" "X-Generator: Zanata 4.5.0\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -24,7 +23,8 @@ msgid "" "\n" "Activate one with Sketch -> In Workplane." msgstr "" -"Ausschneiden, Einfügen und Kopieren sind nur in einer Arbeitsebene zulässig.\n" +"Ausschneiden, Einfügen und Kopieren sind nur in einer Arbeitsebene " +"zulässig.\n" "\n" "Aktivieren Sie eine mit Skizze -> In Arbeitsebene" @@ -36,19 +36,19 @@ 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:354 textscreens.cpp:709 +#: clipboard.cpp:354 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "Maßstab kann nicht Null sein." -#: clipboard.cpp:392 +#: clipboard.cpp:396 msgid "Select one point to define origin of rotation." msgstr "Wählen Sie einen Punkt, um den Drehmittelpunkt zu definieren." -#: clipboard.cpp:404 +#: clipboard.cpp:408 msgid "Select two points to define translation vector." msgstr "Wählen Sie zwei Punkte, um den Verschiebungsvektor zu definieren." -#: clipboard.cpp:414 +#: clipboard.cpp:418 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -56,25 +56,25 @@ msgstr "" "Die Transformation ist die Identität. Alle Kopien werden deckungsgleich " "übereinanderliegen." -#: clipboard.cpp:418 +#: clipboard.cpp:422 msgid "Too many items to paste; split this into smaller pastes." msgstr "" "Zuviele Objekte zum Einfügen; teilen Sie diese in kleinere " "Einfügeoperationen auf." -#: clipboard.cpp:423 +#: clipboard.cpp:427 msgid "No workplane active." msgstr "Es ist keine Arbeitsebene aktiv." -#: confscreen.cpp:336 +#: confscreen.cpp:410 msgid "Bad format: specify coordinates as x, y, z" msgstr "Ungültiges Format: geben Sie Koordinaten als x, y, z an" -#: confscreen.cpp:347 style.cpp:653 textscreens.cpp:730 +#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "Ungültiges Format: geben Sie Farben als r, g, b an" -#: confscreen.cpp:372 +#: confscreen.cpp:446 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -82,24 +82,25 @@ msgstr "" "Der Perspektivfaktor wird sich nicht auswirken, bis Sie Ansicht -> " "Perspektive Projektion aktivieren." -#: confscreen.cpp:386 -msgid "Specify between 0 and 8 digits after the decimal." -msgstr "Geben Sie 0 bis 8 Ziffern nach dem Dezimalzeichen an." +#: confscreen.cpp:459 confscreen.cpp:469 +#, 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:398 +#: confscreen.cpp:481 msgid "Export scale must not be zero!" msgstr "Der Exportmaßstab darf nicht Null sein!" -#: confscreen.cpp:410 +#: confscreen.cpp:493 msgid "Cutter radius offset must not be negative!" msgstr "Der Werkzeugradialabstand darf nicht negativ sein!" -#: confscreen.cpp:464 +#: confscreen.cpp:547 msgid "Bad value: autosave interval should be positive" msgstr "" "Ungültiger Wert: Interval für automatisches Speichern muss positiv sein" -#: confscreen.cpp:467 +#: confscreen.cpp:550 msgid "Bad format: specify interval in integral minutes" msgstr "Ungültiges Format: geben Sie das Interval in ganzen Minuten an" @@ -278,7 +279,7 @@ msgctxt "constr-name" msgid "comment" msgstr "Kommentar" -#: constraint.cpp:160 +#: constraint.cpp:171 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -302,7 +303,7 @@ msgstr "" " * eine Seitenfläche und ein Punkt [minimaler Abstand]\n" " * ein Kreis oder ein Bogen [Durchmesser]\n" -#: constraint.cpp:213 +#: constraint.cpp:224 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -322,7 +323,7 @@ msgstr "" " * einen Punkt und einen Kreis oder Bogen [Punkt auf Kurve]\n" " * einen Punkt und eine Seitenfläche [Punkt auf Fläche]\n" -#: constraint.cpp:275 +#: constraint.cpp:286 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -345,15 +346,15 @@ msgstr "" " * ein Liniensegment und zwei Punkte [gleiche Punkt-Linien-Abstände]\n" " * ein Liniensegment und ein Punkt oder Liniensegment [Abstand Punkt-" "Linie gleich Länge]\n" -" * vier Liniensegmente oder Normale [gleicher Winkel zwischen A,B und " -"C,D]\n" -" * drei Liniensegmente oder Normale [gleicher Winkel zwischen A,B und " -"B,C]\n" +" * vier Liniensegmente oder Normale [gleicher Winkel zwischen A,B und C," +"D]\n" +" * drei Liniensegmente oder Normale [gleicher Winkel zwischen A,B und B," +"C]\n" " * zwei Kreise oder Bögen [gleicher Radius]\n" " * ein Liniensegment und ein Bogen [Länge des Liniensegments gleich " "Bogenlänge]\n" -#: constraint.cpp:314 +#: constraint.cpp:325 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" @@ -364,10 +365,10 @@ msgstr "" "\n" " * zwei Liniensegmente\n" -#: constraint.cpp:331 +#: constraint.cpp:342 msgid "" -"Bad selection for length difference constraint. This constraint can apply to:" -"\n" +"Bad selection for length difference constraint. This constraint can apply " +"to:\n" "\n" " * two line segments\n" msgstr "" @@ -376,7 +377,7 @@ msgstr "" "\n" " * zwei Liniensegmente\n" -#: constraint.cpp:357 +#: constraint.cpp:368 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -390,7 +391,7 @@ msgstr "" " * ein Liniensegment und eine Arbeitsebene [Mittelpunkt der Linie auf " "Ebene]\n" -#: constraint.cpp:415 +#: constraint.cpp:426 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -411,7 +412,7 @@ msgstr "" " * eine Arbeitsebene und zwei Punkte oder ein Liniensegment [symmetrisch " "zu Arbeitsebene]\n" -#: constraint.cpp:429 +#: constraint.cpp:440 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -419,7 +420,7 @@ msgstr "" "Eine Arbeitsebene muss aktiv sein, um die Symmetrie ohne explizite " "Symmetrieebene einzuschränken." -#: constraint.cpp:459 +#: constraint.cpp:470 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -427,7 +428,7 @@ msgstr "" "Aktivieren Sie eine Arbeitsebene (mit Skizze -> In Arbeitsebene), bevor Sie " "horizontal oder vertikal einschränken." -#: constraint.cpp:472 +#: constraint.cpp:483 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -441,9 +442,10 @@ msgstr "" " * zwei Punkte\n" " * ein Liniensegment\n" -#: constraint.cpp:493 +#: constraint.cpp:504 msgid "" -"Bad selection for same orientation constraint. This constraint can apply to:\n" +"Bad selection for same orientation constraint. This constraint can apply " +"to:\n" "\n" " * two normals\n" msgstr "" @@ -452,15 +454,15 @@ msgstr "" "\n" " * zwei Normale\n" -#: constraint.cpp:545 +#: constraint.cpp:554 msgid "Must select an angle constraint." msgstr "Sie müssen einen eingeschränkten Winkel auswählen." -#: constraint.cpp:557 +#: constraint.cpp:567 msgid "Must select a constraint with associated label." msgstr "Sie müssen eine Einschränkung mit zugeordneter Kennzeichnung angeben." -#: constraint.cpp:568 +#: constraint.cpp:578 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -475,7 +477,7 @@ msgstr "" " * ein Liniensegment und eine Normale\n" " * zwei Normale\n" -#: constraint.cpp:625 +#: constraint.cpp:635 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -484,7 +486,7 @@ msgstr "" "haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " "Tangente einschränken. -> Sc" -#: constraint.cpp:649 +#: constraint.cpp:659 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -493,21 +495,20 @@ msgstr "" "haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " "Tangente einschränken. -> Sc" -#: constraint.cpp:659 +#: constraint.cpp:669 msgid "Curve-curve tangency must apply in workplane." msgstr "" "Die Kurven-Kurven-Tangente muss in der Arbeitsebene eingeschränkt werden." -#: constraint.cpp:677 +#: constraint.cpp:687 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." msgstr "" "Die Kurven müssen einen gemeinsamen Endpunkt haben. Schränken Sie mit " -"\"Einschränkung / Auf Punkt\" ein, bevor Sie die Tangente einschränken. -> " -"Sc" +"\"Einschränkung / Auf Punkt\" ein, bevor Sie die Tangente einschränken. -> Sc" -#: constraint.cpp:686 +#: constraint.cpp:696 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -515,8 +516,7 @@ msgid "" " * two line segments (parallel)\n" " * a line segment and a normal (parallel)\n" " * two normals (parallel)\n" -" * two line segments, arcs, or beziers, that share an endpoint " -"(tangent)\n" +" * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" "Ungültige Auswahl für Einschränkung \"Parallel / Tangente\". Diese " "Einschränkung ist anwendbar auf:\n" @@ -527,7 +527,7 @@ msgstr "" " * zwei Liniensegmente, Bögen oder Beziers mit gemeinsamem Endpunkt " "[Tangente]\n" -#: constraint.cpp:704 +#: constraint.cpp:714 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -542,7 +542,7 @@ msgstr "" " * ein Liniensegment und eine Normale\n" " * zwei Normale\n" -#: constraint.cpp:719 +#: constraint.cpp:729 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -554,11 +554,11 @@ msgstr "" "\n" " * einen Punkt\n" -#: constraint.cpp:730 +#: constraint.cpp:740 msgid "click center of comment text" msgstr "Klicken Sie auf die Mitte des Kommentartextes" -#: export.cpp:18 +#: export.cpp:19 msgid "" "No solid model present; draw one with extrudes and revolves, or use Export " "2d View to export bare lines and curves." @@ -566,7 +566,7 @@ msgstr "" "Kein Festkörper vorhanden; zeichnen Sie eines mit Extrusionen und Drehungen, " "oder exportieren Sie bloße Linien und Kurven mit \"2D-Ansicht exportieren\"" -#: export.cpp:60 +#: export.cpp:61 msgid "" "Bad selection for export section. Please select:\n" "\n" @@ -577,12 +577,13 @@ msgid "" msgstr "" "Ungültige Auswahl für teilweisen Export. Bitte wählen Sie aus:\n" "\n" -" * nichts, mit einer aktiven Arbeitsebene [Arbeitsebene ist Schnittebene]\n" +" * nichts, mit einer aktiven Arbeitsebene [Arbeitsebene ist " +"Schnittebene]\n" " * eine Seitenfläche [Schnittebene durch Seitenfläche]\n" " * einen Punkt und zwei Liniensegmente [Schnittebene durch Punkt und " "parallel zu Linien]\n" -#: export.cpp:805 +#: export.cpp:822 msgid "Active group mesh is empty; nothing to export." msgstr "Das Netz der aktiven Gruppe ist leer; es gibt nichts zu exportieren." @@ -594,22 +595,22 @@ msgstr "Freihandlinien wurden mit durchgehenden Linien ersetzt" msgid "zigzag lines were replaced with continuous lines" msgstr "Zickzacklinien wurden mit durchgehenden Linien ersetzt" -#: exportvector.cpp:597 +#: exportvector.cpp:593 msgid "" "Some aspects of the drawing have no DXF equivalent and " "were not exported:\n" msgstr "" -"Teile der Zeichnung haben keine Entsprechung in DXF und " -"wurden nicht exportiert:\n" +"Teile der Zeichnung haben keine Entsprechung in DXF und wurden nicht " +"exportiert:\n" -#: exportvector.cpp:807 +#: exportvector.cpp:839 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" "Die PDF-Seitengröße überschreitet 200 x 200 Zoll; die Datei kann u.U. in " "vielen Programmen nicht geöffnet werden." -#: file.cpp:44 group.cpp:95 +#: file.cpp:44 group.cpp:91 msgctxt "group-name" msgid "sketch-in-plane" msgstr "Skizze-in-Ebene" @@ -619,7 +620,7 @@ msgctxt "group-name" msgid "#references" msgstr "#Referenzen" -#: file.cpp:539 +#: file.cpp:549 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -627,115 +628,153 @@ msgstr "" "Nicht erkannte Daten in der Datei. Diese Datei könnte beschädigt sein oder " "von einer neueren Version des Programms stammen." -#: graphicswin.cpp:29 +#: file.cpp:849 +msgctxt "title" +msgid "Missing File" +msgstr "Fehlende Datei" + +#: file.cpp:850 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "Die verlinkte Datei “%s” fehlt." + +#: file.cpp:852 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." +msgstr "" +"Möchten Sie sie selber auswählen?\n" +"Falls Sie ablehnen, wird jegliche mit der fehlenden Datei " +"verknüpfte Geometrie verworfen." + +#: file.cpp:855 +msgctxt "button" +msgid "&Yes" +msgstr "&Ja" + +#: file.cpp:857 +msgctxt "button" +msgid "&No" +msgstr "&Nein" + +#: file.cpp:859 +msgctxt "button" +msgid "&Cancel" +msgstr "&Abbrechen" + +#: graphicswin.cpp:41 msgid "&File" msgstr "&Datei" -#: graphicswin.cpp:30 +#: graphicswin.cpp:42 msgid "&New" msgstr "&Neu" -#: graphicswin.cpp:31 +#: graphicswin.cpp:43 msgid "&Open..." msgstr "&Öffnen" -#: graphicswin.cpp:32 +#: graphicswin.cpp:44 msgid "Open &Recent" msgstr "Öffne &letzte" -#: graphicswin.cpp:33 +#: graphicswin.cpp:45 msgid "&Save" msgstr "&Speichern" -#: graphicswin.cpp:34 +#: graphicswin.cpp:46 msgid "Save &As..." msgstr "Speichern &Als…" -#: graphicswin.cpp:36 +#: graphicswin.cpp:48 msgid "Export &Image..." msgstr "Exportiere &Bild…" -#: graphicswin.cpp:37 +#: graphicswin.cpp:49 msgid "Export 2d &View..." msgstr "Exportiere 2D-Ansicht…" -#: graphicswin.cpp:38 +#: graphicswin.cpp:50 msgid "Export 2d &Section..." msgstr "Exportiere 2D-Auswahl…" -#: graphicswin.cpp:39 +#: graphicswin.cpp:51 msgid "Export 3d &Wireframe..." msgstr "Exportiere 3D-Drahtgittermodell" -#: graphicswin.cpp:40 +#: graphicswin.cpp:52 msgid "Export Triangle &Mesh..." msgstr "Exportiere Dreiecksnetz…" -#: graphicswin.cpp:41 +#: graphicswin.cpp:53 msgid "Export &Surfaces..." msgstr "Exportiere Oberflächen…" -#: graphicswin.cpp:42 +#: graphicswin.cpp:54 msgid "Im&port..." msgstr "Im&port…" -#: graphicswin.cpp:45 +#: graphicswin.cpp:57 msgid "E&xit" msgstr "Beenden" -#: graphicswin.cpp:48 +#: graphicswin.cpp:60 msgid "&Edit" msgstr "&Bearbeiten" -#: graphicswin.cpp:49 +#: graphicswin.cpp:61 msgid "&Undo" msgstr "&Rückgängig machen" -#: graphicswin.cpp:50 +#: graphicswin.cpp:62 msgid "&Redo" msgstr "&Wiederholen" -#: graphicswin.cpp:51 +#: graphicswin.cpp:63 msgid "Re&generate All" msgstr "Alles &neu zeichnen" -#: graphicswin.cpp:53 +#: graphicswin.cpp:65 msgid "Snap Selection to &Grid" msgstr "Auswahl auf &Raster ausrichten" -#: graphicswin.cpp:54 +#: graphicswin.cpp:66 msgid "Rotate Imported &90°" msgstr "Importierte Objekte &90° drehen" -#: graphicswin.cpp:56 +#: graphicswin.cpp:68 msgid "Cu&t" msgstr "Ausschneiden" -#: graphicswin.cpp:57 +#: graphicswin.cpp:69 msgid "&Copy" msgstr "Kopieren" -#: graphicswin.cpp:58 +#: graphicswin.cpp:70 msgid "&Paste" msgstr "Einfügen" -#: graphicswin.cpp:59 +#: graphicswin.cpp:71 msgid "Paste &Transformed..." msgstr "&Transformiert einfügen…" -#: graphicswin.cpp:60 +#: graphicswin.cpp:72 msgid "&Delete" msgstr "&Löschen" -#: graphicswin.cpp:62 +#: graphicswin.cpp:74 msgid "Select &Edge Chain" msgstr "&Kantenverlauf auswählen" -#: graphicswin.cpp:63 +#: graphicswin.cpp:75 msgid "Select &All" msgstr "&Alle auswählen" -#: graphicswin.cpp:64 +#: graphicswin.cpp:76 msgid "&Unselect All" msgstr "Alle &deselektieren" @@ -743,103 +782,103 @@ msgstr "Alle &deselektieren" msgid "&Line Styles..." msgstr "&Linien Stile..." -#: graphicswin.cpp:78 +#: graphicswin.cpp:79 msgid "&View Projection..." msgstr "An&sichts Projektion..." -#: graphicswin.cpp:78 +#: graphicswin.cpp:81 msgid "Con&figuration..." msgstr "&Einstellungen..." -#: graphicswin.cpp:66 +#: graphicswin.cpp:84 msgid "&View" msgstr "Ansicht" -#: graphicswin.cpp:67 +#: graphicswin.cpp:85 msgid "Zoom &In" msgstr "Zoom größer" -#: graphicswin.cpp:68 +#: graphicswin.cpp:86 msgid "Zoom &Out" msgstr "Zoom kleiner" -#: graphicswin.cpp:69 +#: graphicswin.cpp:87 msgid "Zoom To &Fit" msgstr "Zoom anpassen" -#: graphicswin.cpp:71 +#: graphicswin.cpp:89 msgid "Align View to &Workplane" msgstr "Ansicht auf Arbeitsebene ausrichten" -#: graphicswin.cpp:72 +#: graphicswin.cpp:90 msgid "Nearest &Ortho View" msgstr "Nächste Ortho-Ansicht" -#: graphicswin.cpp:73 +#: graphicswin.cpp:91 msgid "Nearest &Isometric View" msgstr "Nächste isometrische Ansicht" -#: graphicswin.cpp:74 +#: graphicswin.cpp:92 msgid "&Center View At Point" msgstr "Ansicht auf Punkt zentrieren" -#: graphicswin.cpp:76 +#: graphicswin.cpp:94 msgid "Show Snap &Grid" msgstr "Arbeitsraster anzeigen" -#: graphicswin.cpp:77 +#: graphicswin.cpp:95 msgid "Use &Perspective Projection" msgstr "Perspektivische Projektion" -#: graphicswin.cpp:78 +#: graphicswin.cpp:96 msgid "Dimension &Units" msgstr "Maßeinheit" -#: graphicswin.cpp:79 -msgid "Dimensions in &Inches" -msgstr "Maße in Zoll" - -#: graphicswin.cpp:80 +#: graphicswin.cpp:97 msgid "Dimensions in &Millimeters" msgstr "Maße in Millimeter" -#: graphicswin.cpp:81 +#: graphicswin.cpp:98 msgid "Dimensions in M&eters" msgstr "Masse in M&etern" -#: graphicswin.cpp:83 +#: graphicswin.cpp:99 +msgid "Dimensions in &Inches" +msgstr "Maße in Zoll" + +#: graphicswin.cpp:101 msgid "Show &Toolbar" msgstr "Werkzeugleiste anzeigen" -#: graphicswin.cpp:84 +#: graphicswin.cpp:102 msgid "Show Property Bro&wser" msgstr "Attributbrowser anzeigen" -#: graphicswin.cpp:86 +#: graphicswin.cpp:104 msgid "&Full Screen" msgstr "Vollbildschirm" -#: graphicswin.cpp:88 +#: graphicswin.cpp:106 msgid "&New Group" msgstr "Neue Gruppe" -#: graphicswin.cpp:89 +#: graphicswin.cpp:107 msgid "Sketch In &3d" msgstr "In 3D skizzieren" -#: graphicswin.cpp:90 +#: graphicswin.cpp:108 msgid "Sketch In New &Workplane" msgstr "In neuer Arbeitsebene skizzieren" -#: graphicswin.cpp:92 +#: graphicswin.cpp:110 msgid "Step &Translating" msgstr "Kopieren und verschieben" -#: graphicswin.cpp:93 +#: graphicswin.cpp:111 msgid "Step &Rotating" msgstr "Kopieren und drehen" -#: graphicswin.cpp:95 +#: graphicswin.cpp:113 msgid "E&xtrude" msgstr "E&xtrudieren" @@ -847,191 +886,191 @@ msgstr "E&xtrudieren" msgid "&Helix" msgstr "&Helix" -#: graphicswin.cpp:96 +#: graphicswin.cpp:115 msgid "&Lathe" msgstr "R&otieren" -#: graphicswin.cpp:96 +#: graphicswin.cpp:116 msgid "Re&volve" msgstr "D&rehen" -#: graphicswin.cpp:98 +#: graphicswin.cpp:118 msgid "Link / Assemble..." msgstr "Verknüpfen / Zusammensetzen" -#: graphicswin.cpp:99 +#: graphicswin.cpp:119 msgid "Link Recent" msgstr "Letzte verknüpfen" -#: graphicswin.cpp:101 +#: graphicswin.cpp:121 msgid "&Sketch" msgstr "&Skizze" -#: graphicswin.cpp:102 +#: graphicswin.cpp:122 msgid "In &Workplane" msgstr "In Arbeitsebene" -#: graphicswin.cpp:103 +#: graphicswin.cpp:123 msgid "Anywhere In &3d" msgstr "Im 3D-Raum" -#: graphicswin.cpp:105 +#: graphicswin.cpp:125 msgid "Datum &Point" msgstr "Bezugspunkt" -#: graphicswin.cpp:106 +#: graphicswin.cpp:126 msgid "&Workplane" msgstr "Arbeits&ebene" -#: graphicswin.cpp:108 +#: graphicswin.cpp:128 msgid "Line &Segment" msgstr "&Linie" -#: graphicswin.cpp:109 +#: graphicswin.cpp:129 msgid "C&onstruction Line Segment" msgstr "K&onstruktionslinie" -#: graphicswin.cpp:110 +#: graphicswin.cpp:130 msgid "&Rectangle" msgstr "&Rechteck" -#: graphicswin.cpp:111 +#: graphicswin.cpp:131 msgid "&Circle" msgstr "&Kreis" -#: graphicswin.cpp:112 +#: graphicswin.cpp:132 msgid "&Arc of a Circle" msgstr "Kreisbogen" -#: graphicswin.cpp:113 +#: graphicswin.cpp:133 msgid "&Bezier Cubic Spline" msgstr "Kubischer &Bezier-Spline" -#: graphicswin.cpp:115 +#: graphicswin.cpp:135 msgid "&Text in TrueType Font" msgstr "&Text in Truetype-Font" -#: graphicswin.cpp:116 +#: graphicswin.cpp:136 msgid "&Image" msgstr "B&ild" -#: graphicswin.cpp:118 +#: graphicswin.cpp:138 msgid "To&ggle Construction" msgstr "Konstruktionselement an/aus" -#: graphicswin.cpp:119 +#: graphicswin.cpp:139 msgid "Tangent &Arc at Point" msgstr "Bogentangente an Punkt" -#: graphicswin.cpp:120 +#: graphicswin.cpp:140 msgid "Split Curves at &Intersection" msgstr "Kurven im Schnittpunkt trennen" -#: graphicswin.cpp:122 +#: graphicswin.cpp:142 msgid "&Constrain" msgstr "&Einschränkung" -#: graphicswin.cpp:123 +#: graphicswin.cpp:143 msgid "&Distance / Diameter" msgstr "Abstand / Durchmesser" -#: graphicswin.cpp:124 +#: graphicswin.cpp:144 msgid "Re&ference Dimension" msgstr "Referenzangabe" -#: graphicswin.cpp:125 +#: graphicswin.cpp:145 msgid "A&ngle" msgstr "Winkel" -#: graphicswin.cpp:126 +#: graphicswin.cpp:146 msgid "Reference An&gle" msgstr "Referenzwinkel" -#: graphicswin.cpp:127 +#: graphicswin.cpp:147 msgid "Other S&upplementary Angle" msgstr "Komplementärwinkel" -#: graphicswin.cpp:128 +#: graphicswin.cpp:148 msgid "Toggle R&eference Dim" msgstr "Referenzangabe ein/aus" -#: graphicswin.cpp:130 +#: graphicswin.cpp:150 msgid "&Horizontal" msgstr "Horizontal" -#: graphicswin.cpp:131 +#: graphicswin.cpp:151 msgid "&Vertical" msgstr "&Vertikal" -#: graphicswin.cpp:133 +#: graphicswin.cpp:153 msgid "&On Point / Curve / Plane" msgstr "Auf Punkt / Kurve / Ebene" -#: graphicswin.cpp:134 +#: graphicswin.cpp:154 msgid "E&qual Length / Radius / Angle" msgstr "Gleicher Abstand / Radius / Winkel" -#: graphicswin.cpp:135 +#: graphicswin.cpp:155 msgid "Length Ra&tio" msgstr "Längenverhältnis" -#: graphicswin.cpp:136 +#: graphicswin.cpp:156 msgid "Length Diff&erence" msgstr "Längendifferenz" -#: graphicswin.cpp:137 +#: graphicswin.cpp:157 msgid "At &Midpoint" msgstr "Auf &Mittelpunkt" -#: graphicswin.cpp:138 +#: graphicswin.cpp:158 msgid "S&ymmetric" msgstr "Symmetrisch" -#: graphicswin.cpp:139 +#: graphicswin.cpp:159 msgid "Para&llel / Tangent" msgstr "Paral&llel / Tangente" -#: graphicswin.cpp:140 +#: graphicswin.cpp:160 msgid "&Perpendicular" msgstr "Rechtwinklig" -#: graphicswin.cpp:141 +#: graphicswin.cpp:161 msgid "Same Orient&ation" msgstr "Gleiche Orientierung" -#: graphicswin.cpp:142 +#: graphicswin.cpp:162 msgid "Lock Point Where &Dragged" msgstr "Punkt an Position fixieren" -#: graphicswin.cpp:144 +#: graphicswin.cpp:164 msgid "Comment" msgstr "Kommentar" -#: graphicswin.cpp:146 +#: graphicswin.cpp:166 msgid "&Analyze" msgstr "&Analyse" -#: graphicswin.cpp:147 +#: graphicswin.cpp:167 msgid "Measure &Volume" msgstr "&Volumen bestimmen" -#: graphicswin.cpp:148 +#: graphicswin.cpp:168 msgid "Measure A&rea" msgstr "Fläche bestimmen" -#: graphicswin.cpp:149 +#: graphicswin.cpp:169 msgid "Measure &Perimeter" msgstr "Umfang bestimmen" -#: graphicswin.cpp:150 +#: graphicswin.cpp:170 msgid "Show &Interfering Parts" msgstr "Überlagernde Teile anzeigen" -#: graphicswin.cpp:151 +#: graphicswin.cpp:171 msgid "Show &Naked Edges" msgstr "Freiliegende Kanten anzeigen" -#: graphicswin.cpp:152 +#: graphicswin.cpp:172 msgid "Show &Center of Mass" msgstr "Massenmittelpunkt anzeigen" @@ -1039,40 +1078,49 @@ msgstr "Massenmittelpunkt anzeigen" msgid "Show &Underconstrained Points" msgstr "&Unterbeschränkte Punkte anzeigen" -#: graphicswin.cpp:156 +#: graphicswin.cpp:176 msgid "&Trace Point" msgstr "Punkt nachzeichnen" -#: graphicswin.cpp:157 +#: graphicswin.cpp:177 msgid "&Stop Tracing..." msgstr "Nachzeichnen beenden" -#: graphicswin.cpp:158 +#: graphicswin.cpp:178 msgid "Step &Dimension..." msgstr "Schrittgröße…" -#: graphicswin.cpp:160 +#: graphicswin.cpp:180 msgid "&Help" msgstr "&Hilfe" -#: graphicswin.cpp:161 -msgid "&Website / Manual" -msgstr "&Website / Anleitung" - -#: graphicswin.cpp:162 +#: graphicswin.cpp:181 msgid "&Language" msgstr "Sprache" -#: graphicswin.cpp:164 +#: graphicswin.cpp:182 +msgid "&Website / Manual" +msgstr "&Website / Anleitung" + +#: graphicswin.cpp:184 msgid "&About" msgstr "Über" -#: graphicswin.cpp:491 +#: graphicswin.cpp:352 +msgid "(no recent files)" +msgstr "(keine vorhergehenden Dateien)" + +#: graphicswin.cpp:360 +#, c-format +msgid "File '%s' does not exist." +msgstr "" + +#: graphicswin.cpp:721 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:500 +#: graphicswin.cpp:730 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1086,20 +1134,20 @@ msgstr "" "Ändern Sie den Faktor für die Perspektivprojektion in der " "Konfigurationsmaske. Ein typischer Wert ist ca. 0,3." -#: graphicswin.cpp:581 +#: graphicswin.cpp:809 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:862 +#: graphicswin.cpp:1103 msgid "No additional entities share endpoints with the selected entities." msgstr "" "Die ausgewählten Objekte teilen keine gemeinsamen Endpunkte mit anderen " "Objekten." -#: graphicswin.cpp:882 +#: graphicswin.cpp:1121 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1107,7 +1155,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:906 +#: graphicswin.cpp:1144 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1116,7 +1164,7 @@ msgstr "" "(mit Skizze -> In Arbeitsebene), um die Ebene für das Gitterraster zu " "definieren." -#: graphicswin.cpp:913 +#: graphicswin.cpp:1151 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1125,13 +1173,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:979 +#: graphicswin.cpp:1239 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:984 +#: graphicswin.cpp:1242 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-" @@ -1141,7 +1189,7 @@ msgstr "" "standardmäßige Arbeitsebene. Wählen Sie eine Arbeitsebene aus, oder " "erstellen Sie eine Gruppe in einer neuen Arbeitsebene." -#: graphicswin.cpp:1008 +#: graphicswin.cpp:1263 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1149,48 +1197,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:1019 +#: graphicswin.cpp:1274 msgid "click point on arc (draws anti-clockwise)" msgstr "" "Erstellen Sie einen Punkt auf dem Bogen (zeichnet im Gegenuhrzeigersinn)" -#: graphicswin.cpp:1020 +#: graphicswin.cpp:1275 msgid "click to place datum point" msgstr "Klicken Sie, um einen Bezugspunkt zu platzieren" -#: graphicswin.cpp:1021 +#: graphicswin.cpp:1276 msgid "click first point of line segment" msgstr "Klicken Sie auf den ersten Punkt des Liniensegments" -#: graphicswin.cpp:1023 +#: graphicswin.cpp:1278 msgid "click first point of construction line segment" msgstr "Klicken Sie auf den ersten Punkt der Konstruktionslinie" -#: graphicswin.cpp:1024 +#: graphicswin.cpp:1279 msgid "click first point of cubic segment" msgstr "Klicken Sie auf den ersten Punkt der kubischen Linie" -#: graphicswin.cpp:1025 +#: graphicswin.cpp:1280 msgid "click center of circle" msgstr "Klicken Sie auf den Kreismittelpunkt" -#: graphicswin.cpp:1026 +#: graphicswin.cpp:1281 msgid "click origin of workplane" msgstr "Klicken Sie auf den Ursprungspunkt der Arbeitsebene" -#: graphicswin.cpp:1027 +#: graphicswin.cpp:1282 msgid "click one corner of rectangle" msgstr "Klicken Sie auf eine Ecke des Rechtecks" -#: graphicswin.cpp:1028 +#: graphicswin.cpp:1283 msgid "click top left of text" msgstr "Klicken Sie auf die obere linke Ecke des Texts" -#: graphicswin.cpp:1034 +#: graphicswin.cpp:1289 msgid "click top left of image" msgstr "Klicken Sie auf die obere linke Ecke des Bilds" -#: graphicswin.cpp:1047 +#: graphicswin.cpp:1301 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1198,12 +1246,12 @@ msgstr "" "Es wurden keine Objekte ausgewählt Wählen Sie Objekte aus, bevor Sie sie von/" "zu Konstruktionsmerkmalen umwandeln." -#: group.cpp:90 +#: group.cpp:86 msgctxt "group-name" msgid "sketch-in-3d" msgstr "Skizze-in-3D" -#: group.cpp:146 +#: group.cpp:142 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" @@ -1220,7 +1268,7 @@ msgstr "" "Linien)\n" " * einer Arbeitsebene (Kopie der Arbeitsebene)\n" -#: group.cpp:158 +#: group.cpp:154 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1228,11 +1276,15 @@ msgstr "" "Aktivieren Sie vor der Extrusion eine Arbeitsebene (mit Skizze -> In " "Arbeitsebene). Die Skizze wird senkrecht zur Arbeitsebene extrudiert" -#: group.cpp:167 +#: group.cpp:163 msgctxt "group-name" msgid "extrude" msgstr "Extrusion" +#: group.cpp:168 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "" + #: group.cpp:179 msgid "" "Bad selection for new lathe group. This group can be created with:\n" @@ -1253,11 +1305,48 @@ msgctxt "group-name" msgid "lathe" msgstr "Drehung" -#: group.cpp:202 +#: group.cpp:194 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:205 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:217 +msgctxt "group-name" +msgid "revolve" +msgstr "" + +#: group.cpp:222 +msgid "Helix operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:233 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:245 +msgctxt "group-name" +msgid "helix" +msgstr "" + +#: group.cpp:258 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" -" * a point, while locked in workplane (rotate in plane, about that point)\n" +" * a point, while locked in workplane (rotate in plane, about that " +"point)\n" " * a point and a line or a normal (rotate about an axis through the " "point, and parallel to line / normal)\n" msgstr "" @@ -1268,41 +1357,41 @@ msgstr "" " * einem Punkt und einer Linie oder einer Normale (um eine Achse durch " "den Punkt drehen, parallel zur Linie / Normale)\n" -#: group.cpp:215 +#: group.cpp:271 msgctxt "group-name" msgid "rotate" msgstr "Drehen" -#: group.cpp:226 +#: group.cpp:282 msgctxt "group-name" msgid "translate" msgstr "Versetzen" -#: group.cpp:340 +#: group.cpp:400 msgid "(unnamed)" msgstr "unbenannt" -#: groupmesh.cpp:626 +#: groupmesh.cpp:689 msgid "not closed contour, or not all same style!" msgstr "Kontur nicht geschlossen, oder kein einheitlicher Linientyp!" -#: groupmesh.cpp:639 +#: groupmesh.cpp:702 msgid "points not all coplanar!" msgstr "Punkte sind nicht alle koplanar!" -#: groupmesh.cpp:641 +#: groupmesh.cpp:704 msgid "contour is self-intersecting!" msgstr "Kontur überschneidet sich selbst!" -#: groupmesh.cpp:643 +#: groupmesh.cpp:706 msgid "zero-length edge!" msgstr "Kante mit Länge Null!" -#: modify.cpp:237 +#: modify.cpp:254 msgid "Must be sketching in workplane to create tangent arc." msgstr "Eine Bogentangente kann nur in einer Arbeitsebene erstellt werden." -#: modify.cpp:284 +#: modify.cpp:301 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1311,26 +1400,26 @@ msgstr "" "nicht-Konstruktionslinien oder -kreise in dieser Gruppe und Arbeitsebene " "treffen. " -#: modify.cpp:371 +#: modify.cpp:388 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." msgstr "" "Diese Ecke konnte nicht abgerundet werden. Versuchen Sie einen kleineren " -"Radius, oder erstellen Sie die gewünschte Geometrie von Hand mit " -"\"Tangente\"-Einschränkungen." +"Radius, oder erstellen Sie die gewünschte Geometrie von Hand mit \"Tangente" +"\"-Einschränkungen." -#: modify.cpp:575 +#: modify.cpp:597 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" "Dieses Objekt konnte nicht geteilt werden. Dies geht nur für Linien, Kreise " "oder kubische Splines." -#: modify.cpp:601 +#: modify.cpp:624 msgid "Must be sketching in workplane to split." msgstr "Trennen ist nur in einer Arbeitsebene möglich." -#: modify.cpp:608 +#: modify.cpp:631 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." @@ -1338,109 +1427,109 @@ msgstr "" "Wählen Sie zwei Objekte aus, die sich schneiden (z.B. zwei Linien/Kreise/" "Bögen, oder eine Linie/Kreis/Bogen und ein Punkt)." -#: modify.cpp:713 +#: modify.cpp:736 msgid "Can't split; no intersection found." msgstr "Trennen nicht möglich; keine Überschneidung gefunden." -#: mouse.cpp:522 +#: mouse.cpp:560 +msgid "Assign to Style" +msgstr "Linientyp zuordnen" + +#: mouse.cpp:576 msgid "No Style" msgstr "Kein Linientyp" -#: mouse.cpp:523 +#: mouse.cpp:579 msgid "Newly Created Custom Style..." msgstr "Neu erstellter benutzerdefinierter Linientyp…" -#: mouse.cpp:571 -msgid "Assign to Style" -msgstr "Linientyp zuordnen" - -#: mouse.cpp:574 +#: mouse.cpp:586 msgid "Group Info" msgstr "Info zu Gruppe" -#: mouse.cpp:577 +#: mouse.cpp:606 msgid "Style Info" msgstr "Info zu Linientyp" -#: mouse.cpp:580 +#: mouse.cpp:626 msgid "Select Edge Chain" msgstr "Kantenverlauf auswählen" -#: mouse.cpp:585 +#: mouse.cpp:632 msgid "Toggle Reference Dimension" msgstr "Von/zu Referenzangabe wechseln" -#: mouse.cpp:591 +#: mouse.cpp:638 msgid "Other Supplementary Angle" msgstr "Anderer Komplementärwinkel" -#: mouse.cpp:596 +#: mouse.cpp:643 msgid "Snap to Grid" msgstr "Auf Raster ausrichten" -#: mouse.cpp:604 +#: mouse.cpp:652 msgid "Remove Spline Point" msgstr "Spline-Punkt löschen" -#: mouse.cpp:615 +#: mouse.cpp:687 msgid "Add Spline Point" msgstr "Spline-Punkt hinzufügen" -#: mouse.cpp:619 +#: mouse.cpp:691 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "" +"Spline-Punkt kann nicht hinzugefügt werden: maximale Anzahl der Punkte " +"erreicht." + +#: mouse.cpp:716 msgid "Toggle Construction" msgstr "Konstruktionselement an/aus" -#: mouse.cpp:633 +#: mouse.cpp:731 msgid "Delete Point-Coincident Constraint" msgstr "Einschränkung \"Punkte deckungsgleich\" löschen" -#: mouse.cpp:639 +#: mouse.cpp:750 msgid "Cut" msgstr "Ausschneiden" -#: mouse.cpp:640 +#: mouse.cpp:752 msgid "Copy" msgstr "Kopieren" -#: mouse.cpp:643 +#: mouse.cpp:756 msgid "Select All" msgstr "Alle auswählen" -#: mouse.cpp:647 +#: mouse.cpp:761 msgid "Paste" msgstr "Einfügen" -#: mouse.cpp:648 +#: mouse.cpp:763 msgid "Paste Transformed..." msgstr "Einfügen und transformieren…" -#: mouse.cpp:652 +#: mouse.cpp:768 msgid "Delete" msgstr "Löschen" -#: mouse.cpp:654 +#: mouse.cpp:771 msgid "Unselect All" msgstr "Alle deselektieren" -#: mouse.cpp:660 +#: mouse.cpp:778 msgid "Unselect Hovered" msgstr "Aktive deselektieren" -#: mouse.cpp:665 +#: mouse.cpp:787 msgid "Zoom to Fit" msgstr "Zoom an Bildschirm anpassen" -#: mouse.cpp:805 -msgid "Cannot add spline point: maximum number of points reached." -msgstr "" -"Spline-Punkt kann nicht hinzugefügt werden: maximale Anzahl der Punkte " -"erreicht." - -#: mouse.cpp:1009 mouse.cpp:1292 +#: mouse.cpp:990 mouse.cpp:1277 msgid "click next point of line, or press Esc" msgstr "Klicken Sie auf den nächsten Punkt der Linie, oder drücken Sie Esc" -#: mouse.cpp:1015 +#: mouse.cpp:996 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1448,15 +1537,15 @@ msgstr "" "Ein Rechteck kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1049 +#: mouse.cpp:1030 msgid "click to place other corner of rectangle" msgstr "Klicken Sie auf die gegenüberliegende Ecke des Rechtecks" -#: mouse.cpp:1069 +#: mouse.cpp:1050 msgid "click to set radius" msgstr "Klicken Sie, um den Radius festzulegen" -#: mouse.cpp:1074 +#: mouse.cpp:1055 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1464,24 +1553,23 @@ msgstr "" "Ein Kreisbogen kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1093 +#: mouse.cpp:1074 msgid "click to place point" msgstr "Klicken Sie, um einen Punkt zu platzieren" -#: mouse.cpp:1109 +#: mouse.cpp:1090 msgid "click next point of cubic, or press Esc" msgstr "" "Klicken Sie auf den nächsten Punkt der kubischen Linie, oder drücken Sie Esc" -#: mouse.cpp:1114 +#: mouse.cpp:1095 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." -"" msgstr "" "Eine Arbeitsebene ist bereits aktiv. Skizzieren Sie in 3D, bevor Sie eine " "neue Arbeitsebene erstellen." -#: mouse.cpp:1130 +#: mouse.cpp:1111 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1489,11 +1577,11 @@ msgstr "" "Text kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1146 -msgid "click to place bottom left of text" -msgstr "Klicken Sie auf die untere linke Ecke des Texts" +#: mouse.cpp:1128 +msgid "click to place bottom right of text" +msgstr "Klicken Sie auf die untere rechte Ecke des Texts" -#: mouse.cpp:1152 +#: mouse.cpp:1134 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1501,196 +1589,137 @@ msgstr "" "Das Bild kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1178 +#: mouse.cpp:1161 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEUER KOMMENTAR -- DOPPELKLICKEN ZUM BEARBEITEN" -#: platform/cocoamain.mm:481 platform/gtkmain.cpp:607 platform/w32main.cpp:451 -#: platform/w32main.cpp:1388 -msgctxt "title" -msgid "(new sketch)" -msgstr "(Neue Skizze)" - -#: platform/cocoamain.mm:710 platform/gtkmain.cpp:912 platform/w32main.cpp:1307 -msgid "(no recent files)" -msgstr "(keine vorhergehenden Dateien)" - -#: platform/cocoamain.mm:828 platform/gtkmain.cpp:1020 -msgid "untitled" -msgstr "unbenannt" +#: platform/gui.cpp:85 +msgctxt "file-type" +msgid "SolveSpace models" +msgstr "SolveSpace-Modelle" -#: platform/cocoamain.mm:860 -msgid "Do you want to save the changes you made to the new sketch?" -msgstr "Möchten Sie die Änderungen in Ihrer Skizze speichern?" +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "PNG image" +msgstr "PNG-Datei" -#: platform/cocoamain.mm:862 -msgid "Your changes will be lost if you don't save them." -msgstr "" -"Ihre Änderungen werden verworfen, wenn sie nicht abgespeichert werden." +#: platform/gui.cpp:93 +msgctxt "file-type" +msgid "STL mesh" +msgstr "STL-Netz" -#: platform/cocoamain.mm:863 -msgctxt "button" -msgid "Save" -msgstr "Speichern" +#: platform/gui.cpp:94 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" +msgstr "Wavefront OBJ-Netz" -#: platform/cocoamain.mm:864 platform/cocoamain.mm:905 -msgctxt "button" -msgid "Cancel" -msgstr "Abbrechen" +#: platform/gui.cpp:95 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" +msgstr "Three.js-kompatibles Netz, mit Ansicht" -#: platform/cocoamain.mm:865 -msgctxt "button" -msgid "Don't Save" -msgstr "Nicht speichern" +#: platform/gui.cpp:96 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "Three.js-kompatibles Netz, nur Netz" -#: platform/cocoamain.mm:880 -msgid "An autosave file is available for this project." -msgstr "Eine automatisch gespeicherte Datei ist für dieses Projekt vorhanden." +#: platform/gui.cpp:97 +msgctxt "file-type" +msgid "Q3D Object file" +msgstr "Q3D Objektdatei" -#: platform/cocoamain.mm:882 -msgid "Do you want to load the autosave file instead?" -msgstr "Möchten Sie die automatische Speicherdatei stattdessen öffnen?" +#: platform/gui.cpp:98 +msgctxt "file-type" +msgid "VRML text file" +msgstr "VRML Textdatei" -#: platform/cocoamain.mm:883 -msgctxt "button" -msgid "Load" -msgstr "Öffnen" +#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +msgctxt "file-type" +msgid "STEP file" +msgstr "STEP-Datei" -#: platform/cocoamain.mm:884 -msgctxt "button" -msgid "Don't Load" -msgstr "Nicht öffnen" +#: platform/gui.cpp:106 +msgctxt "file-type" +msgid "PDF file" +msgstr "PDF-Datei" -#: platform/cocoamain.mm:900 -msgid "" -"Do you want to locate it manually?\n" -"If you select “No”, any geometry that depends on the missing file will be " -"removed." -msgstr "" -"Möchten Sie sie selber auswählen?\n" -"Falls Sie \"Nein\" wählen, wird jegliche mit der fehlenden Datei verknüpfte " -"Geometrie verworfen." +#: platform/gui.cpp:107 +msgctxt "file-type" +msgid "Encapsulated PostScript" +msgstr "Eingebettetes Postscript" -#: platform/cocoamain.mm:903 -msgctxt "button" -msgid "Yes" -msgstr "Ja" +#: platform/gui.cpp:108 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "Skalierbare Vektorgrafik" -#: platform/cocoamain.mm:906 -msgctxt "button" -msgid "No" -msgstr "Nein" +#: platform/gui.cpp:110 platform/gui.cpp:117 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" +msgstr "DXF-Datei (AutoCAD 2007)" -#: platform/cocoamain.mm:1126 platform/w32main.cpp:183 -msgctxt "button" -msgid "OK" -msgstr "OK" +#: platform/gui.cpp:111 +msgctxt "file-type" +msgid "HPGL file" +msgstr "HPGL-Datei" -#: platform/cocoamain.mm:1211 platform/gtkmain.cpp:1382 platform/w32main.cpp:1410 -#: platform/w32main.cpp:1450 -msgctxt "title" -msgid "Property Browser" -msgstr "Attribut-Browser" +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "G Code" +msgstr "G-Code" -#: platform/gtkmain.cpp:968 -msgctxt "title" -msgid "Open File" -msgstr "Datei öffnen" +#: platform/gui.cpp:121 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" +msgstr "AutoCAD DXF- und DWG-Dateien" -#: platform/gtkmain.cpp:970 -msgid "_Cancel" -msgstr "_Abbrechen" +#: platform/gui.cpp:125 +msgctxt "file-type" +msgid "Comma-separated values" +msgstr "Werte durch Komma getrennt (CSV)" -#: platform/gtkmain.cpp:971 -msgid "_Open" -msgstr "_Öffnen" +#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +msgid "untitled" +msgstr "unbenannt" -#: platform/gtkmain.cpp:1010 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "Datei speichern" -#: platform/gtkmain.cpp:1013 platform/gtkmain.cpp:1049 platform/gtkmain.cpp:1097 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guiwin.cpp:1557 +msgctxt "title" +msgid "Open File" +msgstr "Datei öffnen" + +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 msgctxt "button" msgid "_Cancel" msgstr "_Abbrechen" -#: platform/gtkmain.cpp:1014 platform/gtkmain.cpp:1047 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 msgctxt "button" msgid "_Save" msgstr "_Speichern" -#: platform/gtkmain.cpp:1042 platform/w32main.cpp:1167 -msgid "" -"The file has changed since it was last saved.\n" -"\n" -"Do you want to save the changes?" -msgstr "" -"Die Datei wurde seit der letzten Speicherung geändert.\n" -"\n" -"Möchten Sie die Änderungen speichern?" - -#: platform/gtkmain.cpp:1046 platform/w32main.cpp:1169 -msgctxt "title" -msgid "Modified File" -msgstr "Geänderte Datei" - -#: platform/gtkmain.cpp:1048 +#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 msgctxt "button" -msgid "Do_n't Save" -msgstr "Nicht speichern" - -#: platform/gtkmain.cpp:1066 platform/w32main.cpp:1193 -msgid "" -"An autosave file is available for this project.\n" -"\n" -"Do you want to load the autosave file instead?" +msgid "_Open" msgstr "" -"Eine automatisch gespeicherte Datei ist für dieses Projekt vorhanden.\n" -"\n" -"Wollen Sie die automatisch gespeicherte Datei öffnen?" - -#: platform/gtkmain.cpp:1070 platform/w32main.cpp:1195 -msgctxt "title" -msgid "Autosave Available" -msgstr "Automatische Speicherdatei verfügbar" - -#: platform/gtkmain.cpp:1071 -msgctxt "button" -msgid "_Load autosave" -msgstr "AutoDatei öffnen" - -#: platform/gtkmain.cpp:1072 -msgctxt "button" -msgid "Do_n't Load" -msgstr "Nicht öffnen" - -#: platform/gtkmain.cpp:1093 platform/w32main.cpp:1223 -msgctxt "title" -msgid "Missing File" -msgstr "Fehlende Datei" -#: platform/gtkmain.cpp:1094 -msgctxt "button" -msgid "_Yes" -msgstr "_Ja" - -#: platform/gtkmain.cpp:1095 -msgctxt "button" -msgid "_No" -msgstr "_Nein" - -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 +# solvespace.cpp:557 msgctxt "title" -msgid "Error" -msgstr "Fehler" +msgid "(new sketch)" +msgstr "(Neue Skizze)" -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 +#: solvespace.cpp:564 msgctxt "title" -msgid "Message" -msgstr "Mitteilung" +msgid "Property Browser" +msgstr "Attribut-Browser" -#: style.cpp:160 +#: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -1699,27 +1728,27 @@ msgstr "" "Objekt abgeleitet wurde. Versuchen Sie, dem übergeordneten Objekt einen Typ " "zuzuordnen." -#: style.cpp:659 +#: style.cpp:665 msgid "Style name cannot be empty" msgstr "Name des Linientyps kann nicht leer sein." -#: textscreens.cpp:662 +#: textscreens.cpp:741 msgid "Can't repeat fewer than 1 time." msgstr "Nicht weniger als 1 Wiederholung möglich." -#: textscreens.cpp:666 +#: textscreens.cpp:745 msgid "Can't repeat more than 999 times." msgstr "Nicht mehr als 999 Wiederholungen möglich." -#: textscreens.cpp:695 +#: textscreens.cpp:770 msgid "Group name cannot be empty" msgstr "Der Name der Gruppe darf nicht leer sein." -#: textscreens.cpp:739 +#: textscreens.cpp:813 msgid "Opacity must be between zero and one." msgstr "Durchsichtigkeit muss zwischen Null und Eins sein." -#: textscreens.cpp:778 +#: textscreens.cpp:848 msgid "Radius cannot be zero or negative." msgstr "Radius darf nicht null oder negativ sein." @@ -1852,65 +1881,20 @@ msgstr "Nächste isometrische Ansicht" msgid "Align view to active workplane" msgstr "Ansicht auf Arbeitsebene ausrichten" -#: ui.h:69 -msgid "SolveSpace models" -msgstr "SolveSpace-Modelle" - -#: ui.h:74 -msgid "PNG file" -msgstr "PNG-Datei" - -#: ui.h:79 -msgid "STL mesh" -msgstr "STL-Netz" - -#: ui.h:80 -msgid "Wavefront OBJ mesh" -msgstr "Wavefront OBJ-Netz" - -#: ui.h:81 -msgid "Three.js-compatible mesh, with viewer" -msgstr "Three.js-kompatibles Netz, mit Ansicht" - -#: ui.h:82 -msgid "Three.js-compatible mesh, mesh only" -msgstr "Three.js-kompatibles Netz, nur Netz" - -#: ui.h:87 ui.h:95 ui.h:103 -msgid "STEP file" -msgstr "STEP-Datei" - -#: ui.h:92 -msgid "PDF file" -msgstr "PDF-Datei" - -#: ui.h:93 -msgid "Encapsulated PostScript" -msgstr "Eingebettetes Postscript" - -#: ui.h:94 -msgid "Scalable Vector Graphics" -msgstr "Skalierbare Vektorgrafik" - -#: ui.h:96 ui.h:104 -msgid "DXF file (AutoCAD 2007)" -msgstr "DXF-Datei (AutoCAD 2007)" - -#: ui.h:97 -msgid "HPGL file" -msgstr "HPGL-Datei" - -#: ui.h:98 -msgid "G Code" -msgstr "G-Code" +#: util.cpp:165 +msgctxt "title" +msgid "Error" +msgstr "Fehler" -#: ui.h:109 -msgid "AutoCAD DXF and DWG files" -msgstr "AutoCAD DXF- und DWG-Dateien" +#: util.cpp:165 +msgctxt "title" +msgid "Message" +msgstr "Mitteilung" -#: ui.h:114 -msgid "Comma-separated values" -msgstr "Werte durch Komma getrennt" +#: util.cpp:170 +msgctxt "button" +msgid "&OK" +msgstr "&OK" #: view.cpp:78 msgid "Scale cannot be zero or negative." @@ -1920,3 +1904,116 @@ msgstr "Der Maßstab kann nicht Null oder negativ sein." msgid "Bad format: specify x, y, z" msgstr "Ungültiges Format: geben Sie x, y, z ein" +#~ msgid "Specify between 0 and 8 digits after the decimal." +#~ msgstr "Geben Sie 0 bis 8 Ziffern nach dem Dezimalzeichen an." + +#~ msgid "click to place bottom left of text" +#~ msgstr "Klicken Sie auf die untere linke Ecke des Texts" + +#~ msgid "Do you want to save the changes you made to the new sketch?" +#~ msgstr "Möchten Sie die Änderungen in Ihrer Skizze speichern?" + +#~ msgid "Your changes will be lost if you don't save them." +#~ msgstr "" +#~ "Ihre Änderungen werden verworfen, wenn sie nicht abgespeichert werden." + +#~ msgctxt "button" +#~ msgid "Save" +#~ msgstr "Speichern" + +#~ msgctxt "button" +#~ msgid "Cancel" +#~ msgstr "Abbrechen" + +#~ msgctxt "button" +#~ msgid "Don't Save" +#~ msgstr "Nicht speichern" + +#~ msgid "An autosave file is available for this project." +#~ msgstr "" +#~ "Eine automatisch gespeicherte Datei ist für dieses Projekt vorhanden." + +#~ msgid "Do you want to load the autosave file instead?" +#~ msgstr "Möchten Sie die automatische Speicherdatei stattdessen öffnen?" + +#~ msgctxt "button" +#~ msgid "Load" +#~ msgstr "Öffnen" + +#~ msgctxt "button" +#~ msgid "Don't Load" +#~ msgstr "Nicht öffnen" + +#~ msgid "" +#~ "Do you want to locate it manually?\n" +#~ "If you select “No”, any geometry that depends on the missing file will be " +#~ "removed." +#~ msgstr "" +#~ "Möchten Sie sie selber auswählen?\n" +#~ "Falls Sie \"Nein\" wählen, wird jegliche mit der fehlenden Datei " +#~ "verknüpfte Geometrie verworfen." + +#~ msgctxt "button" +#~ msgid "Yes" +#~ msgstr "Ja" + +#~ msgctxt "button" +#~ msgid "No" +#~ msgstr "Nein" + +#~ msgctxt "button" +#~ msgid "OK" +#~ msgstr "OK" + +#~ msgid "_Cancel" +#~ msgstr "_Abbrechen" + +#~ msgid "_Open" +#~ msgstr "_Öffnen" + +#~ msgid "" +#~ "The file has changed since it was last saved.\n" +#~ "\n" +#~ "Do you want to save the changes?" +#~ msgstr "" +#~ "Die Datei wurde seit der letzten Speicherung geändert.\n" +#~ "\n" +#~ "Möchten Sie die Änderungen speichern?" + +#~ msgctxt "title" +#~ msgid "Modified File" +#~ msgstr "Geänderte Datei" + +#~ msgctxt "button" +#~ msgid "Do_n't Save" +#~ msgstr "Nicht speichern" + +#~ msgid "" +#~ "An autosave file is available for this project.\n" +#~ "\n" +#~ "Do you want to load the autosave file instead?" +#~ msgstr "" +#~ "Eine automatisch gespeicherte Datei ist für dieses Projekt vorhanden.\n" +#~ "\n" +#~ "Wollen Sie die automatisch gespeicherte Datei öffnen?" + +#~ msgctxt "title" +#~ msgid "Autosave Available" +#~ msgstr "Automatische Speicherdatei verfügbar" + +#~ msgctxt "button" +#~ msgid "_Load autosave" +#~ msgstr "AutoDatei öffnen" + +#~ msgctxt "button" +#~ msgid "Do_n't Load" +#~ msgstr "Nicht öffnen" + +#~ msgctxt "button" +#~ msgid "_Yes" +#~ msgstr "_Ja" + +#~ msgctxt "button" +#~ msgid "_No" +#~ msgstr "_Nein" + diff --git a/res/locales/en_US.po b/res/locales/en_US.po index f46db717e..45b609950 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2018-07-12 22:40+0000\n" +"POT-Creation-Date: 2020-09-21 09:28+0200\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -35,19 +35,19 @@ 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:354 textscreens.cpp:709 +#: clipboard.cpp:354 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "Scale cannot be zero." -#: clipboard.cpp:392 +#: clipboard.cpp:396 msgid "Select one point to define origin of rotation." msgstr "Select one point to define origin of rotation." -#: clipboard.cpp:404 +#: clipboard.cpp:408 msgid "Select two points to define translation vector." msgstr "Select two points to define translation vector." -#: clipboard.cpp:414 +#: clipboard.cpp:418 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -55,23 +55,23 @@ msgstr "" "Transformation is identity. So all copies will be exactly on top of each " "other." -#: clipboard.cpp:418 +#: clipboard.cpp:422 msgid "Too many items to paste; split this into smaller pastes." msgstr "Too many items to paste; split this into smaller pastes." -#: clipboard.cpp:423 +#: clipboard.cpp:427 msgid "No workplane active." msgstr "No workplane active." -#: confscreen.cpp:336 +#: confscreen.cpp:410 msgid "Bad format: specify coordinates as x, y, z" msgstr "Bad format: specify coordinates as x, y, z" -#: confscreen.cpp:347 style.cpp:653 textscreens.cpp:730 +#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "Bad format: specify color as r, g, b" -#: confscreen.cpp:372 +#: confscreen.cpp:446 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,23 +79,24 @@ msgstr "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." -#: confscreen.cpp:386 -msgid "Specify between 0 and 8 digits after the decimal." -msgstr "Specify between 0 and 8 digits after the decimal." +#: confscreen.cpp:459 confscreen.cpp:469 +#, c-format +msgid "Specify between 0 and %d digits after the decimal." +msgstr "Specify between 0 and %d digits after the decimal." -#: confscreen.cpp:398 +#: confscreen.cpp:481 msgid "Export scale must not be zero!" msgstr "Export scale must not be zero!" -#: confscreen.cpp:410 +#: confscreen.cpp:493 msgid "Cutter radius offset must not be negative!" msgstr "Cutter radius offset must not be negative!" -#: confscreen.cpp:464 +#: confscreen.cpp:547 msgid "Bad value: autosave interval should be positive" msgstr "Bad value: autosave interval should be positive" -#: confscreen.cpp:467 +#: confscreen.cpp:550 msgid "Bad format: specify interval in integral minutes" msgstr "Bad format: specify interval in integral minutes" @@ -274,7 +275,7 @@ msgctxt "constr-name" msgid "comment" msgstr "comment" -#: constraint.cpp:160 +#: constraint.cpp:171 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -298,7 +299,7 @@ msgstr "" " * a plane face and a point (minimum distance)\n" " * a circle or an arc (diameter)\n" -#: constraint.cpp:213 +#: constraint.cpp:224 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -318,7 +319,7 @@ msgstr "" " * a point and a circle or arc (point on curve)\n" " * a point and a plane face (point on face)\n" -#: constraint.cpp:275 +#: constraint.cpp:286 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -346,7 +347,7 @@ msgstr "" " * two circles or arcs (equal radius)\n" " * a line segment and an arc (line segment length equals arc length)\n" -#: constraint.cpp:314 +#: constraint.cpp:325 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" @@ -356,7 +357,7 @@ msgstr "" "\n" " * two line segments\n" -#: constraint.cpp:331 +#: constraint.cpp:342 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" @@ -368,7 +369,7 @@ msgstr "" "\n" " * two line segments\n" -#: constraint.cpp:357 +#: constraint.cpp:368 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -380,7 +381,7 @@ msgstr "" " * a line segment and a point (point at midpoint)\n" " * a line segment and a workplane (line's midpoint on plane)\n" -#: constraint.cpp:415 +#: constraint.cpp:426 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -400,7 +401,7 @@ msgstr "" " * workplane, and two points or a line segment (symmetric about " "workplane)\n" -#: constraint.cpp:429 +#: constraint.cpp:440 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -408,7 +409,7 @@ msgstr "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." -#: constraint.cpp:459 +#: constraint.cpp:470 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -416,7 +417,7 @@ msgstr "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." -#: constraint.cpp:472 +#: constraint.cpp:483 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -430,7 +431,7 @@ msgstr "" " * two points\n" " * a line segment\n" -#: constraint.cpp:493 +#: constraint.cpp:504 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -442,15 +443,15 @@ msgstr "" "\n" " * two normals\n" -#: constraint.cpp:545 +#: constraint.cpp:554 msgid "Must select an angle constraint." msgstr "Must select an angle constraint." -#: constraint.cpp:557 +#: constraint.cpp:567 msgid "Must select a constraint with associated label." msgstr "Must select a constraint with associated label." -#: constraint.cpp:568 +#: constraint.cpp:578 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -464,7 +465,7 @@ msgstr "" " * a line segment and a normal\n" " * two normals\n" -#: constraint.cpp:625 +#: constraint.cpp:635 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -472,7 +473,7 @@ msgstr "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." -#: constraint.cpp:649 +#: constraint.cpp:659 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -480,11 +481,11 @@ msgstr "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." -#: constraint.cpp:659 +#: constraint.cpp:669 msgid "Curve-curve tangency must apply in workplane." msgstr "Curve-curve tangency must apply in workplane." -#: constraint.cpp:677 +#: constraint.cpp:687 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -492,7 +493,7 @@ msgstr "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." -#: constraint.cpp:686 +#: constraint.cpp:696 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -510,7 +511,7 @@ msgstr "" " * two normals (parallel)\n" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" -#: constraint.cpp:704 +#: constraint.cpp:714 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -524,7 +525,7 @@ msgstr "" " * a line segment and a normal\n" " * two normals\n" -#: constraint.cpp:719 +#: constraint.cpp:729 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -536,11 +537,11 @@ msgstr "" "\n" " * a point\n" -#: constraint.cpp:730 +#: constraint.cpp:740 msgid "click center of comment text" msgstr "click center of comment text" -#: export.cpp:18 +#: export.cpp:19 msgid "" "No solid model present; draw one with extrudes and revolves, or use Export " "2d View to export bare lines and curves." @@ -548,7 +549,7 @@ msgstr "" "No solid model present; draw one with extrudes and revolves, or use Export " "2d View to export bare lines and curves." -#: export.cpp:60 +#: export.cpp:61 msgid "" "Bad selection for export section. Please select:\n" "\n" @@ -564,7 +565,7 @@ msgstr "" " * a point and two line segments (plane through point and parallel to " "lines)\n" -#: export.cpp:805 +#: export.cpp:822 msgid "Active group mesh is empty; nothing to export." msgstr "Active group mesh is empty; nothing to export." @@ -576,19 +577,19 @@ msgstr "freehand lines were replaced with continuous lines" msgid "zigzag lines were replaced with continuous lines" msgstr "zigzag lines were replaced with continuous lines" -#: exportvector.cpp:590 +#: exportvector.cpp:593 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" -#: exportvector.cpp:807 +#: exportvector.cpp:839 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." -#: file.cpp:44 group.cpp:95 +#: file.cpp:44 group.cpp:91 msgctxt "group-name" msgid "sketch-in-plane" msgstr "sketch-in-plane" @@ -598,7 +599,7 @@ msgctxt "group-name" msgid "#references" msgstr "#references" -#: file.cpp:539 +#: file.cpp:549 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -606,431 +607,499 @@ msgstr "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." -#: graphicswin.cpp:29 +#: file.cpp:849 +msgctxt "title" +msgid "Missing File" +msgstr "Missing File" + +#: file.cpp:850 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "The linked file “%s” is not present." + +#: file.cpp:852 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." +msgstr "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." + +#: file.cpp:855 +msgctxt "button" +msgid "&Yes" +msgstr "&Yes" + +#: file.cpp:857 +msgctxt "button" +msgid "&No" +msgstr "&No" + +#: file.cpp:859 +msgctxt "button" +msgid "&Cancel" +msgstr "&Cancel" + +#: graphicswin.cpp:41 msgid "&File" msgstr "&File" -#: graphicswin.cpp:30 +#: graphicswin.cpp:42 msgid "&New" msgstr "&New" -#: graphicswin.cpp:31 +#: graphicswin.cpp:43 msgid "&Open..." msgstr "&Open..." -#: graphicswin.cpp:32 +#: graphicswin.cpp:44 msgid "Open &Recent" msgstr "Open &Recent" -#: graphicswin.cpp:33 +#: graphicswin.cpp:45 msgid "&Save" msgstr "&Save" -#: graphicswin.cpp:34 +#: graphicswin.cpp:46 msgid "Save &As..." msgstr "Save &As..." -#: graphicswin.cpp:36 +#: graphicswin.cpp:48 msgid "Export &Image..." msgstr "Export &Image..." -#: graphicswin.cpp:37 +#: graphicswin.cpp:49 msgid "Export 2d &View..." msgstr "Export 2d &View..." -#: graphicswin.cpp:38 +#: graphicswin.cpp:50 msgid "Export 2d &Section..." msgstr "Export 2d &Section..." -#: graphicswin.cpp:39 +#: graphicswin.cpp:51 msgid "Export 3d &Wireframe..." msgstr "Export 3d &Wireframe..." -#: graphicswin.cpp:40 +#: graphicswin.cpp:52 msgid "Export Triangle &Mesh..." msgstr "Export Triangle &Mesh..." -#: graphicswin.cpp:41 +#: graphicswin.cpp:53 msgid "Export &Surfaces..." msgstr "Export &Surfaces..." -#: graphicswin.cpp:42 +#: graphicswin.cpp:54 msgid "Im&port..." msgstr "Im&port..." -#: graphicswin.cpp:45 +#: graphicswin.cpp:57 msgid "E&xit" msgstr "E&xit" -#: graphicswin.cpp:48 +#: graphicswin.cpp:60 msgid "&Edit" msgstr "&Edit" -#: graphicswin.cpp:49 +#: graphicswin.cpp:61 msgid "&Undo" msgstr "&Undo" -#: graphicswin.cpp:50 +#: graphicswin.cpp:62 msgid "&Redo" msgstr "&Redo" -#: graphicswin.cpp:51 +#: graphicswin.cpp:63 msgid "Re&generate All" msgstr "Re&generate All" -#: graphicswin.cpp:53 +#: graphicswin.cpp:65 msgid "Snap Selection to &Grid" msgstr "Snap Selection to &Grid" -#: graphicswin.cpp:54 +#: graphicswin.cpp:66 msgid "Rotate Imported &90°" msgstr "Rotate Imported &90°" -#: graphicswin.cpp:56 +#: graphicswin.cpp:68 msgid "Cu&t" msgstr "Cu&t" -#: graphicswin.cpp:57 +#: graphicswin.cpp:69 msgid "&Copy" msgstr "&Copy" -#: graphicswin.cpp:58 +#: graphicswin.cpp:70 msgid "&Paste" msgstr "&Paste" -#: graphicswin.cpp:59 +#: graphicswin.cpp:71 msgid "Paste &Transformed..." msgstr "Paste &Transformed..." -#: graphicswin.cpp:60 +#: graphicswin.cpp:72 msgid "&Delete" msgstr "&Delete" -#: graphicswin.cpp:62 +#: graphicswin.cpp:74 msgid "Select &Edge Chain" msgstr "Select &Edge Chain" -#: graphicswin.cpp:63 +#: graphicswin.cpp:75 msgid "Select &All" msgstr "Select &All" -#: graphicswin.cpp:64 +#: graphicswin.cpp:76 msgid "&Unselect All" msgstr "&Unselect All" -#: graphicswin.cpp:66 +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "&Line Styles..." + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "&View Projection..." + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "Con&figuration..." + +#: graphicswin.cpp:84 msgid "&View" msgstr "&View" -#: graphicswin.cpp:67 +#: graphicswin.cpp:85 msgid "Zoom &In" msgstr "Zoom &In" -#: graphicswin.cpp:68 +#: graphicswin.cpp:86 msgid "Zoom &Out" msgstr "Zoom &Out" -#: graphicswin.cpp:69 +#: graphicswin.cpp:87 msgid "Zoom To &Fit" msgstr "Zoom To &Fit" -#: graphicswin.cpp:71 +#: graphicswin.cpp:89 msgid "Align View to &Workplane" msgstr "Align View to &Workplane" -#: graphicswin.cpp:72 +#: graphicswin.cpp:90 msgid "Nearest &Ortho View" msgstr "Nearest &Ortho View" -#: graphicswin.cpp:73 +#: graphicswin.cpp:91 msgid "Nearest &Isometric View" msgstr "Nearest &Isometric View" -#: graphicswin.cpp:74 +#: graphicswin.cpp:92 msgid "&Center View At Point" msgstr "&Center View At Point" -#: graphicswin.cpp:76 +#: graphicswin.cpp:94 msgid "Show Snap &Grid" msgstr "Show Snap &Grid" -#: graphicswin.cpp:77 +#: graphicswin.cpp:95 msgid "Use &Perspective Projection" msgstr "Use &Perspective Projection" -#: graphicswin.cpp:78 +#: graphicswin.cpp:96 msgid "Dimension &Units" msgstr "Dimension &Units" -#: graphicswin.cpp:79 -msgid "Dimensions in &Inches" -msgstr "Dimensions in &Inches" - -#: graphicswin.cpp:80 +#: graphicswin.cpp:97 msgid "Dimensions in &Millimeters" msgstr "Dimensions in &Millimeters" -#: graphicswin.cpp:81 +#: graphicswin.cpp:98 msgid "Dimensions in M&eters" msgstr "Dimensions in M&eters" -#: graphicswin.cpp:83 +#: graphicswin.cpp:99 +msgid "Dimensions in &Inches" +msgstr "Dimensions in &Inches" + +#: graphicswin.cpp:101 msgid "Show &Toolbar" msgstr "Show &Toolbar" -#: graphicswin.cpp:84 +#: graphicswin.cpp:102 msgid "Show Property Bro&wser" msgstr "Show Property Bro&wser" -#: graphicswin.cpp:86 +#: graphicswin.cpp:104 msgid "&Full Screen" msgstr "&Full Screen" -#: graphicswin.cpp:88 +#: graphicswin.cpp:106 msgid "&New Group" msgstr "&New Group" -#: graphicswin.cpp:89 +#: graphicswin.cpp:107 msgid "Sketch In &3d" msgstr "Sketch In &3d" -#: graphicswin.cpp:90 +#: graphicswin.cpp:108 msgid "Sketch In New &Workplane" msgstr "Sketch In New &Workplane" -#: graphicswin.cpp:92 +#: graphicswin.cpp:110 msgid "Step &Translating" msgstr "Step &Translating" -#: graphicswin.cpp:93 +#: graphicswin.cpp:111 msgid "Step &Rotating" msgstr "Step &Rotating" -#: graphicswin.cpp:95 +#: graphicswin.cpp:113 msgid "E&xtrude" msgstr "E&xtrude" -#: graphicswin.cpp:96 +#: graphicswin.cpp:114 +msgid "&Helix" +msgstr "&Helix" + +#: graphicswin.cpp:115 msgid "&Lathe" msgstr "&Lathe" -#: graphicswin.cpp:98 +#: graphicswin.cpp:116 +msgid "Re&volve" +msgstr "Re&volve" + +#: graphicswin.cpp:118 msgid "Link / Assemble..." msgstr "Link / Assemble..." -#: graphicswin.cpp:99 +#: graphicswin.cpp:119 msgid "Link Recent" msgstr "Link Recent" -#: graphicswin.cpp:101 +#: graphicswin.cpp:121 msgid "&Sketch" msgstr "&Sketch" -#: graphicswin.cpp:102 +#: graphicswin.cpp:122 msgid "In &Workplane" msgstr "In &Workplane" -#: graphicswin.cpp:103 +#: graphicswin.cpp:123 msgid "Anywhere In &3d" msgstr "Anywhere In &3d" -#: graphicswin.cpp:105 +#: graphicswin.cpp:125 msgid "Datum &Point" msgstr "Datum &Point" -#: graphicswin.cpp:106 +#: graphicswin.cpp:126 msgid "&Workplane" msgstr "&Workplane" -#: graphicswin.cpp:108 +#: graphicswin.cpp:128 msgid "Line &Segment" msgstr "Line &Segment" -#: graphicswin.cpp:109 +#: graphicswin.cpp:129 msgid "C&onstruction Line Segment" msgstr "C&onstruction Line Segment" -#: graphicswin.cpp:110 +#: graphicswin.cpp:130 msgid "&Rectangle" msgstr "&Rectangle" -#: graphicswin.cpp:111 +#: graphicswin.cpp:131 msgid "&Circle" msgstr "&Circle" -#: graphicswin.cpp:112 +#: graphicswin.cpp:132 msgid "&Arc of a Circle" msgstr "&Arc of a Circle" -#: graphicswin.cpp:113 +#: graphicswin.cpp:133 msgid "&Bezier Cubic Spline" msgstr "&Bezier Cubic Spline" -#: graphicswin.cpp:115 +#: graphicswin.cpp:135 msgid "&Text in TrueType Font" msgstr "&Text in TrueType Font" -#: graphicswin.cpp:116 +#: graphicswin.cpp:136 msgid "&Image" msgstr "&Image" -#: graphicswin.cpp:118 +#: graphicswin.cpp:138 msgid "To&ggle Construction" msgstr "To&ggle Construction" -#: graphicswin.cpp:119 +#: graphicswin.cpp:139 msgid "Tangent &Arc at Point" msgstr "Tangent &Arc at Point" -#: graphicswin.cpp:120 +#: graphicswin.cpp:140 msgid "Split Curves at &Intersection" msgstr "Split Curves at &Intersection" -#: graphicswin.cpp:122 +#: graphicswin.cpp:142 msgid "&Constrain" msgstr "&Constrain" -#: graphicswin.cpp:123 +#: graphicswin.cpp:143 msgid "&Distance / Diameter" msgstr "&Distance / Diameter" -#: graphicswin.cpp:124 +#: graphicswin.cpp:144 msgid "Re&ference Dimension" msgstr "Re&ference Dimension" -#: graphicswin.cpp:125 +#: graphicswin.cpp:145 msgid "A&ngle" msgstr "A&ngle" -#: graphicswin.cpp:126 +#: graphicswin.cpp:146 msgid "Reference An&gle" msgstr "Reference An&gle" -#: graphicswin.cpp:127 +#: graphicswin.cpp:147 msgid "Other S&upplementary Angle" msgstr "Other S&upplementary Angle" -#: graphicswin.cpp:128 +#: graphicswin.cpp:148 msgid "Toggle R&eference Dim" msgstr "Toggle R&eference Dim" -#: graphicswin.cpp:130 +#: graphicswin.cpp:150 msgid "&Horizontal" msgstr "&Horizontal" -#: graphicswin.cpp:131 +#: graphicswin.cpp:151 msgid "&Vertical" msgstr "&Vertical" -#: graphicswin.cpp:133 +#: graphicswin.cpp:153 msgid "&On Point / Curve / Plane" msgstr "&On Point / Curve / Plane" -#: graphicswin.cpp:134 +#: graphicswin.cpp:154 msgid "E&qual Length / Radius / Angle" msgstr "E&qual Length / Radius / Angle" -#: graphicswin.cpp:135 +#: graphicswin.cpp:155 msgid "Length Ra&tio" msgstr "Length Ra&tio" -#: graphicswin.cpp:136 +#: graphicswin.cpp:156 msgid "Length Diff&erence" msgstr "Length Diff&erence" -#: graphicswin.cpp:137 +#: graphicswin.cpp:157 msgid "At &Midpoint" msgstr "At &Midpoint" -#: graphicswin.cpp:138 +#: graphicswin.cpp:158 msgid "S&ymmetric" msgstr "S&ymmetric" -#: graphicswin.cpp:139 +#: graphicswin.cpp:159 msgid "Para&llel / Tangent" msgstr "Para&llel / Tangent" -#: graphicswin.cpp:140 +#: graphicswin.cpp:160 msgid "&Perpendicular" msgstr "&Perpendicular" -#: graphicswin.cpp:141 +#: graphicswin.cpp:161 msgid "Same Orient&ation" msgstr "Same Orient&ation" -#: graphicswin.cpp:142 +#: graphicswin.cpp:162 msgid "Lock Point Where &Dragged" msgstr "Lock Point Where &Dragged" -#: graphicswin.cpp:144 +#: graphicswin.cpp:164 msgid "Comment" msgstr "Comment" -#: graphicswin.cpp:146 +#: graphicswin.cpp:166 msgid "&Analyze" msgstr "&Analyze" -#: graphicswin.cpp:147 +#: graphicswin.cpp:167 msgid "Measure &Volume" msgstr "Measure &Volume" -#: graphicswin.cpp:148 +#: graphicswin.cpp:168 msgid "Measure A&rea" msgstr "Measure A&rea" -#: graphicswin.cpp:149 +#: graphicswin.cpp:169 msgid "Measure &Perimeter" msgstr "Measure &Perimeter" -#: graphicswin.cpp:150 +#: graphicswin.cpp:170 msgid "Show &Interfering Parts" msgstr "Show &Interfering Parts" -#: graphicswin.cpp:151 +#: graphicswin.cpp:171 msgid "Show &Naked Edges" msgstr "Show &Naked Edges" -#: graphicswin.cpp:152 +#: graphicswin.cpp:172 msgid "Show &Center of Mass" msgstr "Show &Center of Mass" -#: graphicswin.cpp:154 -msgid "Show Degrees of &Freedom" -msgstr "Show Degrees of &Freedom" +#: graphicswin.cpp:174 +msgid "Show &Underconstrained Points" +msgstr "Show &Underconstrained Points" -#: graphicswin.cpp:156 +#: graphicswin.cpp:176 msgid "&Trace Point" msgstr "&Trace Point" -#: graphicswin.cpp:157 +#: graphicswin.cpp:177 msgid "&Stop Tracing..." msgstr "&Stop Tracing..." -#: graphicswin.cpp:158 +#: graphicswin.cpp:178 msgid "Step &Dimension..." msgstr "Step &Dimension..." -#: graphicswin.cpp:160 +#: graphicswin.cpp:180 msgid "&Help" msgstr "&Help" -#: graphicswin.cpp:161 -msgid "&Website / Manual" -msgstr "&Website / Manual" - -#: graphicswin.cpp:162 +#: graphicswin.cpp:181 msgid "&Language" msgstr "&Language" -#: graphicswin.cpp:164 +#: graphicswin.cpp:182 +msgid "&Website / Manual" +msgstr "&Website / Manual" + +#: graphicswin.cpp:184 msgid "&About" msgstr "&About" -#: graphicswin.cpp:491 +#: graphicswin.cpp:352 +msgid "(no recent files)" +msgstr "(no recent files)" + +#: graphicswin.cpp:360 +#, c-format +msgid "File '%s' does not exist." +msgstr "File '%s' does not exist." + +#: graphicswin.cpp:721 msgid "No workplane is active, so the grid will not appear." msgstr "No workplane is active, so the grid will not appear." -#: graphicswin.cpp:500 +#: graphicswin.cpp:730 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1044,17 +1113,17 @@ msgstr "" "For a perspective projection, modify the perspective factor in the " "configuration screen. A value around 0.3 is typical." -#: graphicswin.cpp:581 +#: graphicswin.cpp:809 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:862 +#: graphicswin.cpp:1103 msgid "No additional entities share endpoints with the selected entities." msgstr "No additional entities share endpoints with the selected entities." -#: graphicswin.cpp:882 +#: graphicswin.cpp:1121 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1062,7 +1131,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:906 +#: graphicswin.cpp:1144 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1070,7 +1139,7 @@ msgstr "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." -#: graphicswin.cpp:913 +#: graphicswin.cpp:1151 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1078,11 +1147,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:979 +#: graphicswin.cpp:1239 msgid "No workplane selected. Activating default workplane for this group." msgstr "No workplane selected. Activating default workplane for this group." -#: graphicswin.cpp:984 +#: graphicswin.cpp:1242 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-" @@ -1092,7 +1161,7 @@ msgstr "" "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." -#: graphicswin.cpp:1008 +#: graphicswin.cpp:1263 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1100,47 +1169,47 @@ msgstr "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." -#: graphicswin.cpp:1019 +#: graphicswin.cpp:1274 msgid "click point on arc (draws anti-clockwise)" msgstr "click point on arc (draws anti-clockwise)" -#: graphicswin.cpp:1020 +#: graphicswin.cpp:1275 msgid "click to place datum point" msgstr "click to place datum point" -#: graphicswin.cpp:1021 +#: graphicswin.cpp:1276 msgid "click first point of line segment" msgstr "click first point of line segment" -#: graphicswin.cpp:1023 +#: graphicswin.cpp:1278 msgid "click first point of construction line segment" msgstr "click first point of construction line segment" -#: graphicswin.cpp:1024 +#: graphicswin.cpp:1279 msgid "click first point of cubic segment" msgstr "click first point of cubic segment" -#: graphicswin.cpp:1025 +#: graphicswin.cpp:1280 msgid "click center of circle" msgstr "click center of circle" -#: graphicswin.cpp:1026 +#: graphicswin.cpp:1281 msgid "click origin of workplane" msgstr "click origin of workplane" -#: graphicswin.cpp:1027 +#: graphicswin.cpp:1282 msgid "click one corner of rectangle" msgstr "click one corner of rectangle" -#: graphicswin.cpp:1028 +#: graphicswin.cpp:1283 msgid "click top left of text" msgstr "click top left of text" -#: graphicswin.cpp:1034 +#: graphicswin.cpp:1289 msgid "click top left of image" msgstr "click top left of image" -#: graphicswin.cpp:1047 +#: graphicswin.cpp:1301 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1148,12 +1217,12 @@ msgstr "" "No entities are selected. Select entities before trying to toggle their " "construction state." -#: group.cpp:90 +#: group.cpp:86 msgctxt "group-name" msgid "sketch-in-3d" msgstr "sketch-in-3d" -#: group.cpp:146 +#: group.cpp:142 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" @@ -1169,7 +1238,7 @@ msgstr "" "lines)\n" " * a workplane (copy of the workplane)\n" -#: group.cpp:158 +#: group.cpp:154 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1177,11 +1246,15 @@ msgstr "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." -#: group.cpp:167 +#: group.cpp:163 msgctxt "group-name" msgid "extrude" msgstr "extrude" +#: group.cpp:168 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "Lathe operation can only be applied to planar sketches." + #: group.cpp:179 msgid "" "Bad selection for new lathe group. This group can be created with:\n" @@ -1201,7 +1274,53 @@ msgctxt "group-name" msgid "lathe" msgstr "lathe" -#: group.cpp:202 +#: group.cpp:194 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "Revolve operation can only be applied to planar sketches." + +#: group.cpp:205 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" + +#: group.cpp:217 +msgctxt "group-name" +msgid "revolve" +msgstr "revolve" + +#: group.cpp:222 +msgid "Helix operation can only be applied to planar sketches." +msgstr "Helix operation can only be applied to planar sketches." + +#: group.cpp:233 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" + +#: group.cpp:245 +msgctxt "group-name" +msgid "helix" +msgstr "helix" + +#: group.cpp:258 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1217,41 +1336,41 @@ msgstr "" " * a point and a line or a normal (rotate about an axis through the " "point, and parallel to line / normal)\n" -#: group.cpp:215 +#: group.cpp:271 msgctxt "group-name" msgid "rotate" msgstr "rotate" -#: group.cpp:226 +#: group.cpp:282 msgctxt "group-name" msgid "translate" msgstr "translate" -#: group.cpp:340 +#: group.cpp:400 msgid "(unnamed)" msgstr "(unnamed)" -#: groupmesh.cpp:626 +#: groupmesh.cpp:689 msgid "not closed contour, or not all same style!" msgstr "not closed contour, or not all same style!" -#: groupmesh.cpp:639 +#: groupmesh.cpp:702 msgid "points not all coplanar!" msgstr "points not all coplanar!" -#: groupmesh.cpp:641 +#: groupmesh.cpp:704 msgid "contour is self-intersecting!" msgstr "contour is self-intersecting!" -#: groupmesh.cpp:643 +#: groupmesh.cpp:706 msgid "zero-length edge!" msgstr "zero-length edge!" -#: modify.cpp:237 +#: modify.cpp:254 msgid "Must be sketching in workplane to create tangent arc." msgstr "Must be sketching in workplane to create tangent arc." -#: modify.cpp:284 +#: modify.cpp:301 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1259,7 +1378,7 @@ msgstr "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." -#: modify.cpp:371 +#: modify.cpp:388 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1267,15 +1386,15 @@ msgstr "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." -#: modify.cpp:575 +#: modify.cpp:597 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "Couldn't split this entity; lines, circles, or cubics only." -#: modify.cpp:601 +#: modify.cpp:624 msgid "Must be sketching in workplane to split." msgstr "Must be sketching in workplane to split." -#: modify.cpp:608 +#: modify.cpp:631 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." @@ -1283,107 +1402,107 @@ msgstr "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." -#: modify.cpp:713 +#: modify.cpp:736 msgid "Can't split; no intersection found." msgstr "Can't split; no intersection found." -#: mouse.cpp:522 +#: mouse.cpp:560 +msgid "Assign to Style" +msgstr "Assign to Style" + +#: mouse.cpp:576 msgid "No Style" msgstr "No Style" -#: mouse.cpp:523 +#: mouse.cpp:579 msgid "Newly Created Custom Style..." msgstr "Newly Created Custom Style..." -#: mouse.cpp:571 -msgid "Assign to Style" -msgstr "Assign to Style" - -#: mouse.cpp:574 +#: mouse.cpp:586 msgid "Group Info" msgstr "Group Info" -#: mouse.cpp:577 +#: mouse.cpp:606 msgid "Style Info" msgstr "Style Info" -#: mouse.cpp:580 +#: mouse.cpp:626 msgid "Select Edge Chain" msgstr "Select Edge Chain" -#: mouse.cpp:585 +#: mouse.cpp:632 msgid "Toggle Reference Dimension" msgstr "Toggle Reference Dimension" -#: mouse.cpp:591 +#: mouse.cpp:638 msgid "Other Supplementary Angle" msgstr "Other Supplementary Angle" -#: mouse.cpp:596 +#: mouse.cpp:643 msgid "Snap to Grid" msgstr "Snap to Grid" -#: mouse.cpp:604 +#: mouse.cpp:652 msgid "Remove Spline Point" msgstr "Remove Spline Point" -#: mouse.cpp:615 +#: mouse.cpp:687 msgid "Add Spline Point" msgstr "Add Spline Point" -#: mouse.cpp:619 +#: mouse.cpp:691 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "Cannot add spline point: maximum number of points reached." + +#: mouse.cpp:716 msgid "Toggle Construction" msgstr "Toggle Construction" -#: mouse.cpp:633 +#: mouse.cpp:731 msgid "Delete Point-Coincident Constraint" msgstr "Delete Point-Coincident Constraint" -#: mouse.cpp:639 +#: mouse.cpp:750 msgid "Cut" msgstr "Cut" -#: mouse.cpp:640 +#: mouse.cpp:752 msgid "Copy" msgstr "Copy" -#: mouse.cpp:643 +#: mouse.cpp:756 msgid "Select All" msgstr "Select All" -#: mouse.cpp:647 +#: mouse.cpp:761 msgid "Paste" msgstr "Paste" -#: mouse.cpp:648 +#: mouse.cpp:763 msgid "Paste Transformed..." msgstr "Paste Transformed..." -#: mouse.cpp:652 +#: mouse.cpp:768 msgid "Delete" msgstr "Delete" -#: mouse.cpp:654 +#: mouse.cpp:771 msgid "Unselect All" msgstr "Unselect All" -#: mouse.cpp:660 +#: mouse.cpp:778 msgid "Unselect Hovered" msgstr "Unselect Hovered" -#: mouse.cpp:665 +#: mouse.cpp:787 msgid "Zoom to Fit" msgstr "Zoom to Fit" -#: mouse.cpp:805 -msgid "Cannot add spline point: maximum number of points reached." -msgstr "Cannot add spline point: maximum number of points reached." - -#: mouse.cpp:1009 mouse.cpp:1292 +#: mouse.cpp:990 mouse.cpp:1277 msgid "click next point of line, or press Esc" msgstr "click next point of line, or press Esc" -#: mouse.cpp:1015 +#: mouse.cpp:996 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1391,15 +1510,15 @@ msgstr "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1049 +#: mouse.cpp:1030 msgid "click to place other corner of rectangle" msgstr "click to place other corner of rectangle" -#: mouse.cpp:1069 +#: mouse.cpp:1050 msgid "click to set radius" msgstr "click to set radius" -#: mouse.cpp:1074 +#: mouse.cpp:1055 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1407,21 +1526,21 @@ msgstr "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1093 +#: mouse.cpp:1074 msgid "click to place point" msgstr "click to place point" -#: mouse.cpp:1109 +#: mouse.cpp:1090 msgid "click next point of cubic, or press Esc" msgstr "click next point of cubic, or press Esc" -#: mouse.cpp:1114 +#: mouse.cpp:1095 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Sketching in a workplane already; sketch in 3d before creating new workplane." -#: mouse.cpp:1130 +#: mouse.cpp:1111 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1429,11 +1548,11 @@ msgstr "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1146 -msgid "click to place bottom left of text" -msgstr "click to place bottom left of text" +#: mouse.cpp:1128 +msgid "click to place bottom right of text" +msgstr "click to place bottom right of text" -#: mouse.cpp:1152 +#: mouse.cpp:1134 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1441,196 +1560,137 @@ msgstr "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1178 +#: mouse.cpp:1161 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -#: platform/cocoamain.mm:481 platform/gtkmain.cpp:607 platform/w32main.cpp:451 -#: platform/w32main.cpp:1388 -msgctxt "title" -msgid "(new sketch)" -msgstr "(new sketch)" - -#: platform/cocoamain.mm:710 platform/gtkmain.cpp:912 platform/w32main.cpp:1307 -msgid "(no recent files)" -msgstr "(no recent files)" - -#: platform/cocoamain.mm:828 platform/gtkmain.cpp:1020 -msgid "untitled" -msgstr "untitled" +#: platform/gui.cpp:85 +msgctxt "file-type" +msgid "SolveSpace models" +msgstr "SolveSpace models" -#: platform/cocoamain.mm:860 -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?" +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "PNG image" +msgstr "PNG image" -#: platform/cocoamain.mm:862 -msgid "Your changes will be lost if you don't save them." -msgstr "Your changes will be lost if you don't save them." +#: platform/gui.cpp:93 +msgctxt "file-type" +msgid "STL mesh" +msgstr "STL mesh" -#: platform/cocoamain.mm:863 -msgctxt "button" -msgid "Save" -msgstr "Save" +#: platform/gui.cpp:94 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" +msgstr "Wavefront OBJ mesh" -#: platform/cocoamain.mm:864 platform/cocoamain.mm:905 -msgctxt "button" -msgid "Cancel" -msgstr "Cancel" +#: platform/gui.cpp:95 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" +msgstr "Three.js-compatible mesh, with viewer" -#: platform/cocoamain.mm:865 -msgctxt "button" -msgid "Don't Save" -msgstr "Don't Save" +#: platform/gui.cpp:96 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "Three.js-compatible mesh, mesh only" -#: platform/cocoamain.mm:880 -msgid "An autosave file is available for this project." -msgstr "An autosave file is available for this project." +#: platform/gui.cpp:97 +msgctxt "file-type" +msgid "Q3D Object file" +msgstr "Q3D Object file" -#: platform/cocoamain.mm:882 -msgid "Do you want to load the autosave file instead?" -msgstr "Do you want to load the autosave file instead?" +#: platform/gui.cpp:98 +msgctxt "file-type" +msgid "VRML text file" +msgstr "VRML text file" -#: platform/cocoamain.mm:883 -msgctxt "button" -msgid "Load" -msgstr "Load" +#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +msgctxt "file-type" +msgid "STEP file" +msgstr "STEP file" -#: platform/cocoamain.mm:884 -msgctxt "button" -msgid "Don't Load" -msgstr "Don't Load" +#: platform/gui.cpp:106 +msgctxt "file-type" +msgid "PDF file" +msgstr "PDF file" -#: platform/cocoamain.mm:900 -msgid "" -"Do you want to locate it manually?\n" -"If you select “No”, any geometry that depends on the missing file will be " -"removed." -msgstr "" -"Do you want to locate it manually?\n" -"If you select “No”, any geometry that depends on the missing file will be " -"removed." +#: platform/gui.cpp:107 +msgctxt "file-type" +msgid "Encapsulated PostScript" +msgstr "Encapsulated PostScript" -#: platform/cocoamain.mm:903 -msgctxt "button" -msgid "Yes" -msgstr "Yes" +#: platform/gui.cpp:108 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "Scalable Vector Graphics" -#: platform/cocoamain.mm:906 -msgctxt "button" -msgid "No" -msgstr "No" +#: platform/gui.cpp:110 platform/gui.cpp:117 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" +msgstr "DXF file (AutoCAD 2007)" -#: platform/cocoamain.mm:1126 platform/w32main.cpp:183 -msgctxt "button" -msgid "OK" -msgstr "OK" +#: platform/gui.cpp:111 +msgctxt "file-type" +msgid "HPGL file" +msgstr "HPGL file" -#: platform/cocoamain.mm:1211 platform/gtkmain.cpp:1382 -#: platform/w32main.cpp:1410 platform/w32main.cpp:1450 -msgctxt "title" -msgid "Property Browser" -msgstr "Property Browser" +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "G Code" +msgstr "G Code" -#: platform/gtkmain.cpp:968 -msgctxt "title" -msgid "Open File" -msgstr "Open File" +#: platform/gui.cpp:121 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" +msgstr "AutoCAD DXF and DWG files" -#: platform/gtkmain.cpp:970 -msgid "_Cancel" -msgstr "_Cancel" +#: platform/gui.cpp:125 +msgctxt "file-type" +msgid "Comma-separated values" +msgstr "Comma-separated values" -#: platform/gtkmain.cpp:971 -msgid "_Open" -msgstr "_Open" +#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +msgid "untitled" +msgstr "untitled" -#: platform/gtkmain.cpp:1010 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "Save File" -#: platform/gtkmain.cpp:1013 platform/gtkmain.cpp:1049 -#: platform/gtkmain.cpp:1097 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guiwin.cpp:1557 +msgctxt "title" +msgid "Open File" +msgstr "Open File" + +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 msgctxt "button" msgid "_Cancel" msgstr "_Cancel" -#: platform/gtkmain.cpp:1014 platform/gtkmain.cpp:1047 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 msgctxt "button" msgid "_Save" msgstr "_Save" -#: platform/gtkmain.cpp:1042 platform/w32main.cpp:1167 -msgid "" -"The file has changed since it was last saved.\n" -"\n" -"Do you want to save the changes?" -msgstr "" -"The file has changed since it was last saved.\n" -"\n" -"Do you want to save the changes?" - -#: platform/gtkmain.cpp:1046 platform/w32main.cpp:1169 -msgctxt "title" -msgid "Modified File" -msgstr "Modified File" - -#: platform/gtkmain.cpp:1048 +#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 msgctxt "button" -msgid "Do_n't Save" -msgstr "Do_n't Save" - -#: platform/gtkmain.cpp:1066 platform/w32main.cpp:1193 -msgid "" -"An autosave file is available for this project.\n" -"\n" -"Do you want to load the autosave file instead?" -msgstr "" -"An autosave file is available for this project.\n" -"\n" -"Do you want to load the autosave file instead?" - -#: platform/gtkmain.cpp:1070 platform/w32main.cpp:1195 -msgctxt "title" -msgid "Autosave Available" -msgstr "Autosave Available" - -#: platform/gtkmain.cpp:1071 -msgctxt "button" -msgid "_Load autosave" -msgstr "_Load autosave" - -#: platform/gtkmain.cpp:1072 -msgctxt "button" -msgid "Do_n't Load" -msgstr "Do_n't Load" - -#: platform/gtkmain.cpp:1093 platform/w32main.cpp:1223 -msgctxt "title" -msgid "Missing File" -msgstr "Missing File" - -#: platform/gtkmain.cpp:1094 -msgctxt "button" -msgid "_Yes" -msgstr "_Yes" - -#: platform/gtkmain.cpp:1095 -msgctxt "button" -msgid "_No" -msgstr "_No" +msgid "_Open" +msgstr "_Open" -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 +#: solvespace.cpp:557 msgctxt "title" -msgid "Error" -msgstr "Error" +msgid "(new sketch)" +msgstr "(new sketch)" -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 +#: solvespace.cpp:564 msgctxt "title" -msgid "Message" -msgstr "Message" +msgid "Property Browser" +msgstr "Property Browser" -#: style.cpp:160 +#: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -1638,27 +1698,27 @@ msgstr "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." -#: style.cpp:659 +#: style.cpp:665 msgid "Style name cannot be empty" msgstr "Style name cannot be empty" -#: textscreens.cpp:662 +#: textscreens.cpp:741 msgid "Can't repeat fewer than 1 time." msgstr "Can't repeat fewer than 1 time." -#: textscreens.cpp:666 +#: textscreens.cpp:745 msgid "Can't repeat more than 999 times." msgstr "Can't repeat more than 999 times." -#: textscreens.cpp:695 +#: textscreens.cpp:770 msgid "Group name cannot be empty" msgstr "Group name cannot be empty" -#: textscreens.cpp:739 +#: textscreens.cpp:813 msgid "Opacity must be between zero and one." msgstr "Opacity must be between zero and one." -#: textscreens.cpp:778 +#: textscreens.cpp:848 msgid "Radius cannot be zero or negative." msgstr "Radius cannot be zero or negative." @@ -1790,73 +1850,202 @@ msgstr "Nearest isometric view" msgid "Align view to active workplane" msgstr "Align view to active workplane" -#: ui.h:69 -msgid "SolveSpace models" -msgstr "SolveSpace models" +#: util.cpp:165 +msgctxt "title" +msgid "Error" +msgstr "Error" -#: ui.h:74 -msgid "PNG file" -msgstr "PNG file" +#: util.cpp:165 +msgctxt "title" +msgid "Message" +msgstr "Message" -#: ui.h:79 -msgid "STL mesh" -msgstr "STL mesh" +#: util.cpp:170 +msgctxt "button" +msgid "&OK" +msgstr "&OK" -#: ui.h:80 -msgid "Wavefront OBJ mesh" -msgstr "Wavefront OBJ mesh" +#: view.cpp:78 +msgid "Scale cannot be zero or negative." +msgstr "Scale cannot be zero or negative." -#: ui.h:81 -msgid "Three.js-compatible mesh, with viewer" -msgstr "Three.js-compatible mesh, with viewer" +#: view.cpp:90 view.cpp:99 +msgid "Bad format: specify x, y, z" +msgstr "Bad format: specify x, y, z" -#: ui.h:82 -msgid "Three.js-compatible mesh, mesh only" -msgstr "Three.js-compatible mesh, mesh only" +#~ msgid "" +#~ "Some aspects of the drawing have no DWG equivalent and were not " +#~ "exported:\n" +#~ msgstr "" +#~ "Some aspects of the drawing have no DWG equivalent and were not " +#~ "exported:\n" -#: ui.h:87 ui.h:95 ui.h:103 -msgid "STEP file" -msgstr "STEP file" +#~ msgctxt "file-type" +#~ msgid "DWG file (AutoCAD 2000)" +#~ msgstr "DWG file (AutoCAD 2000)" -#: ui.h:92 -msgid "PDF file" -msgstr "PDF file" +#~ msgid "Specify between 0 and 8 digits after the decimal." +#~ msgstr "Specify between 0 and 8 digits after the decimal." -#: ui.h:93 -msgid "Encapsulated PostScript" -msgstr "Encapsulated PostScript" +#~ msgid "Show Degrees of &Freedom" +#~ msgstr "Show Degrees of &Freedom" -#: ui.h:94 -msgid "Scalable Vector Graphics" -msgstr "Scalable Vector Graphics" +#~ msgid "click to place bottom left of text" +#~ msgstr "click to place bottom left of text" -#: ui.h:96 ui.h:104 -msgid "DXF file (AutoCAD 2007)" -msgstr "DXF file (AutoCAD 2007)" +#~ 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?" -#: ui.h:97 -msgid "HPGL file" -msgstr "HPGL file" +#~ msgid "Your changes will be lost if you don't save them." +#~ msgstr "Your changes will be lost if you don't save them." -#: ui.h:98 -msgid "G Code" -msgstr "G Code" +#~ msgctxt "button" +#~ msgid "Save" +#~ msgstr "Save" -#: ui.h:109 -msgid "AutoCAD DXF and DWG files" -msgstr "AutoCAD DXF and DWG files" +#~ msgctxt "button" +#~ msgid "Cancel" +#~ msgstr "Cancel" -#: ui.h:114 -msgid "Comma-separated values" -msgstr "Comma-separated values" +#~ msgctxt "button" +#~ msgid "Don't Save" +#~ msgstr "Don't Save" -#: view.cpp:78 -msgid "Scale cannot be zero or negative." -msgstr "Scale cannot be zero or negative." +#~ msgid "An autosave file is available for this project." +#~ msgstr "An autosave file is available for this project." -#: view.cpp:90 view.cpp:99 -msgid "Bad format: specify x, y, z" -msgstr "Bad format: specify x, y, z" +#~ msgid "Do you want to load the autosave file instead?" +#~ msgstr "Do you want to load the autosave file instead?" + +#~ msgctxt "button" +#~ msgid "Load" +#~ msgstr "Load" + +#~ msgctxt "button" +#~ msgid "Don't Load" +#~ msgstr "Don't Load" + +#~ msgid "" +#~ "Do you want to locate it manually?\n" +#~ "If you select “No”, any geometry that depends on the missing file will be " +#~ "removed." +#~ msgstr "" +#~ "Do you want to locate it manually?\n" +#~ "If you select “No”, any geometry that depends on the missing file will be " +#~ "removed." + +#~ msgctxt "button" +#~ msgid "Yes" +#~ msgstr "Yes" + +#~ msgctxt "button" +#~ msgid "No" +#~ msgstr "No" + +#~ msgctxt "button" +#~ msgid "OK" +#~ msgstr "OK" + +#~ msgctxt "title" +#~ msgid "Property Browser" +#~ msgstr "Property Browser" + +#~ msgid "_Cancel" +#~ msgstr "_Cancel" + +#~ msgid "_Open" +#~ msgstr "_Open" + +#~ msgid "" +#~ "The file has changed since it was last saved.\n" +#~ "\n" +#~ "Do you want to save the changes?" +#~ msgstr "" +#~ "The file has changed since it was last saved.\n" +#~ "\n" +#~ "Do you want to save the changes?" + +#~ msgctxt "title" +#~ msgid "Modified File" +#~ msgstr "Modified File" + +#~ msgctxt "button" +#~ msgid "Do_n't Save" +#~ msgstr "Do_n't Save" + +#~ msgid "" +#~ "An autosave file is available for this project.\n" +#~ "\n" +#~ "Do you want to load the autosave file instead?" +#~ msgstr "" +#~ "An autosave file is available for this project.\n" +#~ "\n" +#~ "Do you want to load the autosave file instead?" + +#~ msgctxt "title" +#~ msgid "Autosave Available" +#~ msgstr "Autosave Available" + +#~ msgctxt "button" +#~ msgid "_Load autosave" +#~ msgstr "_Load autosave" + +#~ msgctxt "button" +#~ msgid "Do_n't Load" +#~ msgstr "Do_n't Load" + +#~ msgctxt "button" +#~ msgid "_Yes" +#~ msgstr "_Yes" + +#~ msgctxt "button" +#~ msgid "_No" +#~ msgstr "_No" + +#~ msgid "SolveSpace models" +#~ msgstr "SolveSpace models" + +#~ msgid "PNG file" +#~ msgstr "PNG file" + +#~ msgid "STL mesh" +#~ msgstr "STL mesh" + +#~ msgid "Wavefront OBJ mesh" +#~ msgstr "Wavefront OBJ mesh" + +#~ msgid "Three.js-compatible mesh, with viewer" +#~ msgstr "Three.js-compatible mesh, with viewer" + +#~ msgid "Three.js-compatible mesh, mesh only" +#~ msgstr "Three.js-compatible mesh, mesh only" + +#~ msgid "STEP file" +#~ msgstr "STEP file" + +#~ msgid "PDF file" +#~ msgstr "PDF file" + +#~ msgid "Encapsulated PostScript" +#~ msgstr "Encapsulated PostScript" + +#~ msgid "Scalable Vector Graphics" +#~ msgstr "Scalable Vector Graphics" + +#~ msgid "DXF file (AutoCAD 2007)" +#~ msgstr "DXF file (AutoCAD 2007)" + +#~ msgid "HPGL file" +#~ msgstr "HPGL file" + +#~ msgid "G Code" +#~ msgstr "G Code" + +#~ msgid "AutoCAD DXF and DWG files" +#~ msgstr "AutoCAD DXF and DWG files" + +#~ msgid "Comma-separated values" +#~ msgstr "Comma-separated values" #~ msgid "" #~ "Select two entities that intersect each other (e.g. two lines or two " diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index 7bc48765c..6b643f265 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -1,20 +1,19 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR the PACKAGE authors +# French translations for the SolveSpace package. +# Copyright (C) 2018 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. -# FIRST AUTHOR , YEAR. # whitequark , 2018. #zanata msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2018-07-12 22:40+0000\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" +"POT-Creation-Date: 2020-09-21 09:28+0200\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" "Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" "X-Generator: Zanata 4.4.5\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" @@ -36,19 +35,19 @@ 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:354 textscreens.cpp:709 +#: clipboard.cpp:354 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "L'échelle ne peut pas être zéro." -#: clipboard.cpp:392 +#: clipboard.cpp:396 msgid "Select one point to define origin of rotation." msgstr "Sélectionnez un point pour définir l'origine de la rotation." -#: clipboard.cpp:404 +#: clipboard.cpp:408 msgid "Select two points to define translation vector." msgstr "Sélectionnez deux points pour définir le vecteur de translation." -#: clipboard.cpp:414 +#: clipboard.cpp:418 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -56,23 +55,23 @@ msgstr "" "Transformation identique. Donc, toutes les copies seront exactement les unes " "au-dessus des autres." -#: clipboard.cpp:418 +#: clipboard.cpp:422 msgid "Too many items to paste; split this into smaller pastes." msgstr "Trop d'éléments à coller; Divisez-les en plus petits groupes." -#: clipboard.cpp:423 +#: clipboard.cpp:427 msgid "No workplane active." msgstr "Pas d'espace de travail actif." -#: confscreen.cpp:336 +#: confscreen.cpp:410 msgid "Bad format: specify coordinates as x, y, z" msgstr "Mauvais format: spécifiez les coordonnées comme x, y, z" -#: confscreen.cpp:347 style.cpp:653 textscreens.cpp:730 +#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "Mauvais format; spécifiez la couleur comme r, v, b" -#: confscreen.cpp:372 +#: confscreen.cpp:446 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -80,25 +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:386 -msgid "Specify between 0 and 8 digits after the decimal." -msgstr "Spécifiez entre 0 et 8 chiffres après la virgule." +#: confscreen.cpp:459 confscreen.cpp:469 +#, c-format +msgid "Specify between 0 and %d digits after the decimal." +msgstr "" -#: confscreen.cpp:398 +#: confscreen.cpp:481 msgid "Export scale must not be zero!" msgstr "L'échelle d'export ne doit pas être zéro!" -#: confscreen.cpp:410 +#: confscreen.cpp:493 msgid "Cutter radius offset must not be negative!" msgstr "Le décalage du rayon de coupe ne doit pas être négatif!" -#: confscreen.cpp:464 +#: confscreen.cpp:547 msgid "Bad value: autosave interval should be positive" msgstr "" "Mauvaise valeur: l'intervalle d'enregistrement automatique devrait être " "positif" -#: confscreen.cpp:467 +#: confscreen.cpp:550 msgid "Bad format: specify interval in integral minutes" msgstr "Mauvais format: spécifiez un nombre entier de minutes" @@ -277,7 +277,7 @@ msgctxt "constr-name" msgid "comment" msgstr "commentaire" -#: constraint.cpp:160 +#: constraint.cpp:171 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -301,7 +301,7 @@ msgstr "" "    * Une face plane et un point (distance minimale)\n" "    * Un cercle ou un arc (diamètre)\n" -#: constraint.cpp:213 +#: constraint.cpp:224 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -321,7 +321,7 @@ msgstr "" "    * Un point et un cercle ou un arc (point sur courbe)\n" "    * Un point et une face plane (point sur une face)\n" -#: constraint.cpp:275 +#: constraint.cpp:286 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -352,7 +352,7 @@ msgstr "" "    * Un segment de ligne et un arc (la longueur de segment de ligne est " "égale à la longueur d'arc)\n" -#: constraint.cpp:314 +#: constraint.cpp:325 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" @@ -363,10 +363,10 @@ msgstr "" "\n" "    * Deux segments de ligne\n" -#: constraint.cpp:331 +#: constraint.cpp:342 msgid "" -"Bad selection for length difference constraint. This constraint can apply to:" -"\n" +"Bad selection for length difference constraint. This constraint can apply " +"to:\n" "\n" " * two line segments\n" msgstr "" @@ -375,7 +375,7 @@ msgstr "" "\n" "    * Deux segments de ligne\n" -#: constraint.cpp:357 +#: constraint.cpp:368 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -386,10 +386,9 @@ msgstr "" "peut s'appliquer à:\n" "\n" "    * Un segment de ligne et un point (point au milieu)\n" -"    * Un segment de ligne et un plan de travail (point médian dans le " -"plan)\n" +"    * Un segment de ligne et un plan de travail (point médian dans le plan)\n" -#: constraint.cpp:415 +#: constraint.cpp:426 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -410,7 +409,7 @@ msgstr "" "    * Plan de travail, et deux points ou un segment de ligne (symétrique au " "plan de travail)\n" -#: constraint.cpp:429 +#: constraint.cpp:440 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -418,7 +417,7 @@ msgstr "" "Un plan de travail doit être actif lors d'une contrainte de symétrie sans " "plan de symétrie explicite." -#: constraint.cpp:459 +#: constraint.cpp:470 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -426,7 +425,7 @@ msgstr "" "Activez un plan de travail (avec Dessin -> Dans plan de travail) avant " "d'appliquer une contrainte horizontale ou verticale." -#: constraint.cpp:472 +#: constraint.cpp:483 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -440,9 +439,10 @@ msgstr "" "    * deux points\n" "    * Un segment de ligne\n" -#: constraint.cpp:493 +#: constraint.cpp:504 msgid "" -"Bad selection for same orientation constraint. This constraint can apply to:\n" +"Bad selection for same orientation constraint. This constraint can apply " +"to:\n" "\n" " * two normals\n" msgstr "" @@ -451,15 +451,15 @@ msgstr "" "\n" " * Deux normales\n" -#: constraint.cpp:545 +#: constraint.cpp:554 msgid "Must select an angle constraint." msgstr "Vous devez sélectionner une contrainte d'angle." -#: constraint.cpp:557 +#: constraint.cpp:567 msgid "Must select a constraint with associated label." msgstr "Vous devez sélectionner une contrainte avec une étiquette associée." -#: constraint.cpp:568 +#: constraint.cpp:578 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -474,7 +474,7 @@ msgstr "" "    * Un segment de ligne et une normale\n" "    * Deux normales\n" -#: constraint.cpp:625 +#: constraint.cpp:635 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -483,7 +483,7 @@ msgstr "" "Contraignez-les avec \"Contrainte -> Sur point avant de contraindre la " "tangente\"." -#: constraint.cpp:649 +#: constraint.cpp:659 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -492,11 +492,11 @@ msgstr "" "Contraignez-les avec \"Contrainte -> Sur point avant de contraindre la " "tangente\"." -#: constraint.cpp:659 +#: constraint.cpp:669 msgid "Curve-curve tangency must apply in workplane." msgstr "Courbe-Courbe tangence doit s'appliquer dans le plan de travail." -#: constraint.cpp:677 +#: constraint.cpp:687 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -504,7 +504,7 @@ msgstr "" "Les courbes doivent partager un point final. Contraignez-les avec " "\"Contrainte -> Sur point avant de contraindre la tangente\"." -#: constraint.cpp:686 +#: constraint.cpp:696 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -512,8 +512,7 @@ msgid "" " * two line segments (parallel)\n" " * a line segment and a normal (parallel)\n" " * two normals (parallel)\n" -" * two line segments, arcs, or beziers, that share an endpoint " -"(tangent)\n" +" * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" "Mauvaise sélection pour la contrainte parallèle / tangente. Cette contrainte " "peut s'appliquer à:\n" @@ -524,7 +523,7 @@ msgstr "" "    * Deux segments de ligne, des arcs ou des Béziers, qui partagent un " "point final (tangent)\n" -#: constraint.cpp:704 +#: constraint.cpp:714 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -539,7 +538,7 @@ msgstr "" "    * Un segment de ligne et une normale\n" "    * Deux normales\n" -#: constraint.cpp:719 +#: constraint.cpp:729 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -551,11 +550,11 @@ msgstr "" "\n" "    * un point\n" -#: constraint.cpp:730 +#: constraint.cpp:740 msgid "click center of comment text" msgstr "cliquez le centre du texte de commentaire" -#: export.cpp:18 +#: export.cpp:19 msgid "" "No solid model present; draw one with extrudes and revolves, or use Export " "2d View to export bare lines and curves." @@ -564,7 +563,7 @@ msgstr "" "révolution, ou utilisez \"Exporter vue 2d\" pour exporter les lignes et les " "courbes dépouillées." -#: export.cpp:60 +#: export.cpp:61 msgid "" "Bad selection for export section. Please select:\n" "\n" @@ -581,7 +580,7 @@ msgstr "" "    * Un point et deux segments de ligne (plan au-travers d'un point et " "parallèle aux lignes)\n" -#: export.cpp:805 +#: export.cpp:822 msgid "Active group mesh is empty; nothing to export." msgstr "Le maillage du groupe actif est vide; Rien à exporter." @@ -593,21 +592,21 @@ msgstr "les lignes à main levée ont été remplacées par des lignes continues msgid "zigzag lines were replaced with continuous lines" msgstr "les lignes en zigzag ont été remplacées par des lignes continues" -#: exportvector.cpp:590 +#: exportvector.cpp:593 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Certains aspects du dessin n'ont pas d'équivalent DXF et n'ont pas été " "exportés:\n" -#: exportvector.cpp:807 +#: exportvector.cpp:839 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" "La taille de la page PDF dépasse 200 par 200 pouces; De nombreux lecteurs " "peuvent rejeter ce fichier." -#: file.cpp:44 group.cpp:95 +#: file.cpp:44 group.cpp:91 msgctxt "group-name" msgid "sketch-in-plane" msgstr "dessin-dans-plan" @@ -617,7 +616,7 @@ msgctxt "group-name" msgid "#references" msgstr "#références" -#: file.cpp:539 +#: file.cpp:549 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -625,431 +624,495 @@ msgstr "" "Données non reconnues dans le fichier. Ce fichier peut être corrompu ou " "depuis une version plus récente du programme." -#: graphicswin.cpp:29 +#: file.cpp:849 +msgctxt "title" +msgid "Missing File" +msgstr "Fichier manquant" + +#: file.cpp:850 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "" + +#: file.cpp:852 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." +msgstr "" + +#: file.cpp:855 +msgctxt "button" +msgid "&Yes" +msgstr "" + +#: file.cpp:857 +msgctxt "button" +msgid "&No" +msgstr "" + +#: file.cpp:859 +msgctxt "button" +msgid "&Cancel" +msgstr "" + +#: graphicswin.cpp:41 msgid "&File" msgstr "&Fichier" -#: graphicswin.cpp:30 +#: graphicswin.cpp:42 msgid "&New" msgstr "&Nouveau" -#: graphicswin.cpp:31 +#: graphicswin.cpp:43 msgid "&Open..." msgstr "&Ouvrir..." -#: graphicswin.cpp:32 +#: graphicswin.cpp:44 msgid "Open &Recent" msgstr "Ouvrir &Récent" -#: graphicswin.cpp:33 +#: graphicswin.cpp:45 msgid "&Save" msgstr "&Sauver" -#: graphicswin.cpp:34 +#: graphicswin.cpp:46 msgid "Save &As..." msgstr "Sauver &Comme..." -#: graphicswin.cpp:36 +#: graphicswin.cpp:48 msgid "Export &Image..." msgstr "Exporter &Image..." -#: graphicswin.cpp:37 +#: graphicswin.cpp:49 msgid "Export 2d &View..." msgstr "Exporter &vue 2D..." -#: graphicswin.cpp:38 +#: graphicswin.cpp:50 msgid "Export 2d &Section..." msgstr "Exporter &Section 2d..." -#: graphicswin.cpp:39 +#: graphicswin.cpp:51 msgid "Export 3d &Wireframe..." msgstr "Exporter &Fil de fer 3d..." -#: graphicswin.cpp:40 +#: graphicswin.cpp:52 msgid "Export Triangle &Mesh..." msgstr "Exporter Triangle &Maillage..." -#: graphicswin.cpp:41 +#: graphicswin.cpp:53 msgid "Export &Surfaces..." msgstr "Export &Surfaces..." -#: graphicswin.cpp:42 +#: graphicswin.cpp:54 msgid "Im&port..." msgstr "Im&porter..." -#: graphicswin.cpp:45 +#: graphicswin.cpp:57 msgid "E&xit" msgstr "&Quitter" -#: graphicswin.cpp:48 +#: graphicswin.cpp:60 msgid "&Edit" msgstr "&Editer" -#: graphicswin.cpp:49 +#: graphicswin.cpp:61 msgid "&Undo" msgstr "&Annuler" -#: graphicswin.cpp:50 +#: graphicswin.cpp:62 msgid "&Redo" msgstr "&Refaire" -#: graphicswin.cpp:51 +#: graphicswin.cpp:63 msgid "Re&generate All" msgstr "Re&générer Tout" -#: graphicswin.cpp:53 +#: graphicswin.cpp:65 msgid "Snap Selection to &Grid" msgstr "Accrocher la sélection à la &Grille" -#: graphicswin.cpp:54 +#: graphicswin.cpp:66 msgid "Rotate Imported &90°" msgstr "Rotation importation &90°" -#: graphicswin.cpp:56 +#: graphicswin.cpp:68 msgid "Cu&t" msgstr "Co&uper" -#: graphicswin.cpp:57 +#: graphicswin.cpp:69 msgid "&Copy" msgstr "&Copier" -#: graphicswin.cpp:58 +#: graphicswin.cpp:70 msgid "&Paste" msgstr "Co&ller" -#: graphicswin.cpp:59 +#: graphicswin.cpp:71 msgid "Paste &Transformed..." msgstr "Coller &Transformer..." -#: graphicswin.cpp:60 +#: graphicswin.cpp:72 msgid "&Delete" msgstr "&Effacer" -#: graphicswin.cpp:62 +#: graphicswin.cpp:74 msgid "Select &Edge Chain" msgstr "Sélectionner une Chaîne d'&Arêtes" -#: graphicswin.cpp:63 +#: graphicswin.cpp:75 msgid "Select &All" msgstr "Sélectionner &Tout" -#: graphicswin.cpp:64 +#: graphicswin.cpp:76 msgid "&Unselect All" msgstr "&Désélectionner Tout" -#: graphicswin.cpp:66 +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "&Ligne styles..." + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "&Affichage Perspective..." + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "Con&figuration..." + +#: graphicswin.cpp:84 msgid "&View" msgstr "&Affichage" -#: graphicswin.cpp:67 +#: graphicswin.cpp:85 msgid "Zoom &In" msgstr "Zoom &Avant" -#: graphicswin.cpp:68 +#: graphicswin.cpp:86 msgid "Zoom &Out" msgstr "Zoom A&rrière" -#: graphicswin.cpp:69 +#: graphicswin.cpp:87 msgid "Zoom To &Fit" msgstr "Zoom A&justé" -#: graphicswin.cpp:71 +#: graphicswin.cpp:89 msgid "Align View to &Workplane" msgstr "Aligner la vue au &Plan de travail" -#: graphicswin.cpp:72 +#: graphicswin.cpp:90 msgid "Nearest &Ortho View" msgstr "Vue &Orthogonale la plus proche" -#: graphicswin.cpp:73 +#: graphicswin.cpp:91 msgid "Nearest &Isometric View" msgstr "Vue &Isométrique la plus proche" -#: graphicswin.cpp:74 +#: graphicswin.cpp:92 msgid "&Center View At Point" msgstr "&Centrer la Vue sur le Point" -#: graphicswin.cpp:76 +#: graphicswin.cpp:94 msgid "Show Snap &Grid" msgstr "Afficher la &grille d'accrochage" -#: graphicswin.cpp:77 +#: graphicswin.cpp:95 msgid "Use &Perspective Projection" msgstr "Utiliser la vue en &Perspective" -#: graphicswin.cpp:78 +#: graphicswin.cpp:96 msgid "Dimension &Units" msgstr "&Unités de dimensions" -#: graphicswin.cpp:79 -msgid "Dimensions in &Inches" -msgstr "Dimensions en &Pouces" - -#: graphicswin.cpp:80 +#: graphicswin.cpp:97 msgid "Dimensions in &Millimeters" msgstr "Dimensions en &Millimètres" -#: graphicswin.cpp:81 +#: graphicswin.cpp:98 msgid "Dimensions in M&eters" msgstr "Dimensions en &Mètres" -#: graphicswin.cpp:83 +#: graphicswin.cpp:99 +msgid "Dimensions in &Inches" +msgstr "Dimensions en &Pouces" + +#: graphicswin.cpp:101 msgid "Show &Toolbar" msgstr "Affichage &Barre d'outils" -#: graphicswin.cpp:84 +#: graphicswin.cpp:102 msgid "Show Property Bro&wser" msgstr "Affichage du &Navigateur de Propriété" -#: graphicswin.cpp:86 +#: graphicswin.cpp:104 msgid "&Full Screen" msgstr "&Plein Ecran" -#: graphicswin.cpp:88 +#: graphicswin.cpp:106 msgid "&New Group" msgstr "&Nouveau Groupe" -#: graphicswin.cpp:89 +#: graphicswin.cpp:107 msgid "Sketch In &3d" msgstr "Dessin en &3d" -#: graphicswin.cpp:90 +#: graphicswin.cpp:108 msgid "Sketch In New &Workplane" msgstr "Dessin dans un nouveau &Plan de travail" -#: graphicswin.cpp:92 +#: graphicswin.cpp:110 msgid "Step &Translating" msgstr "Espacement &Linéaire" -#: graphicswin.cpp:93 +#: graphicswin.cpp:111 msgid "Step &Rotating" msgstr "Espacement &Circulaire" -#: graphicswin.cpp:95 +#: graphicswin.cpp:113 msgid "E&xtrude" msgstr "E&xtruder" -#: graphicswin.cpp:96 +#: graphicswin.cpp:114 +msgid "&Helix" +msgstr "&Helix" + +#: graphicswin.cpp:115 msgid "&Lathe" -msgstr "&Révolution" +msgstr "&Lathe" -#: graphicswin.cpp:98 +#: graphicswin.cpp:116 +msgid "Re&volve" +msgstr "Ré&volution" + +#: graphicswin.cpp:118 msgid "Link / Assemble..." msgstr "Lié / Assembler..." -#: graphicswin.cpp:99 +#: graphicswin.cpp:119 msgid "Link Recent" msgstr "Lié Récent" -#: graphicswin.cpp:101 +#: graphicswin.cpp:121 msgid "&Sketch" msgstr "&Dessin" -#: graphicswin.cpp:102 +#: graphicswin.cpp:122 msgid "In &Workplane" msgstr "Dans le &Plan de travail" -#: graphicswin.cpp:103 +#: graphicswin.cpp:123 msgid "Anywhere In &3d" msgstr "N'importe où dans la &3d" -#: graphicswin.cpp:105 +#: graphicswin.cpp:125 msgid "Datum &Point" msgstr "&Point" -#: graphicswin.cpp:106 +#: graphicswin.cpp:126 msgid "&Workplane" msgstr "&Plan de travail" -#: graphicswin.cpp:108 +#: graphicswin.cpp:128 msgid "Line &Segment" msgstr "Ligne - &Polyligne" -#: graphicswin.cpp:109 +#: graphicswin.cpp:129 msgid "C&onstruction Line Segment" msgstr "Ligne de C&onstruction" -#: graphicswin.cpp:110 +#: graphicswin.cpp:130 msgid "&Rectangle" msgstr "&Rectangle" -#: graphicswin.cpp:111 +#: graphicswin.cpp:131 msgid "&Circle" msgstr "&Cercle" -#: graphicswin.cpp:112 +#: graphicswin.cpp:132 msgid "&Arc of a Circle" msgstr "&Arc de Cercle" -#: graphicswin.cpp:113 +#: graphicswin.cpp:133 msgid "&Bezier Cubic Spline" msgstr "Spline Cubique de &Beziers" -#: graphicswin.cpp:115 +#: graphicswin.cpp:135 msgid "&Text in TrueType Font" msgstr "&Texte en Police TrueType" -#: graphicswin.cpp:116 +#: graphicswin.cpp:136 msgid "&Image" msgstr "&Image" -#: graphicswin.cpp:118 +#: graphicswin.cpp:138 msgid "To&ggle Construction" msgstr "&Basculer en mode \"Construction\"" -#: graphicswin.cpp:119 +#: graphicswin.cpp:139 msgid "Tangent &Arc at Point" msgstr "&Arc Tangent au Point" -#: graphicswin.cpp:120 +#: graphicswin.cpp:140 msgid "Split Curves at &Intersection" msgstr "Diviser les Courbes à l'&Intersection" -#: graphicswin.cpp:122 +#: graphicswin.cpp:142 msgid "&Constrain" msgstr "&Constraintes" -#: graphicswin.cpp:123 +#: graphicswin.cpp:143 msgid "&Distance / Diameter" msgstr "&Distance / Diamètre" -#: graphicswin.cpp:124 +#: graphicswin.cpp:144 msgid "Re&ference Dimension" msgstr "Dimension Maîtresse / Indicative" -#: graphicswin.cpp:125 +#: graphicswin.cpp:145 msgid "A&ngle" msgstr "A&ngle" -#: graphicswin.cpp:126 +#: graphicswin.cpp:146 msgid "Reference An&gle" msgstr "An&gle Maître / Indicatif" -#: graphicswin.cpp:127 +#: graphicswin.cpp:147 msgid "Other S&upplementary Angle" msgstr "Autre angle S&upplémentaire" -#: graphicswin.cpp:128 +#: graphicswin.cpp:148 msgid "Toggle R&eference Dim" msgstr "Basculer cote Maîtresse / cote Indicative" -#: graphicswin.cpp:130 +#: graphicswin.cpp:150 msgid "&Horizontal" msgstr "&Horizontal" -#: graphicswin.cpp:131 +#: graphicswin.cpp:151 msgid "&Vertical" msgstr "&Vertical" -#: graphicswin.cpp:133 +#: graphicswin.cpp:153 msgid "&On Point / Curve / Plane" msgstr "&Sur Point / Courbe / Plan" -#: graphicswin.cpp:134 +#: graphicswin.cpp:154 msgid "E&qual Length / Radius / Angle" msgstr "&Egale Longueur / Rayon / Angle" -#: graphicswin.cpp:135 +#: graphicswin.cpp:155 msgid "Length Ra&tio" msgstr "R&apport de Longueur" -#: graphicswin.cpp:136 +#: graphicswin.cpp:156 msgid "Length Diff&erence" msgstr "D&ifférence de Longueur" -#: graphicswin.cpp:137 +#: graphicswin.cpp:157 msgid "At &Midpoint" msgstr "Au &Milieu" -#: graphicswin.cpp:138 +#: graphicswin.cpp:158 msgid "S&ymmetric" msgstr "&Symétrique" -#: graphicswin.cpp:139 +#: graphicswin.cpp:159 msgid "Para&llel / Tangent" msgstr "Para&llèle / Tangent" -#: graphicswin.cpp:140 +#: graphicswin.cpp:160 msgid "&Perpendicular" msgstr "&Perpendiculaire" -#: graphicswin.cpp:141 +#: graphicswin.cpp:161 msgid "Same Orient&ation" msgstr "Même Orient&ation" -#: graphicswin.cpp:142 +#: graphicswin.cpp:162 msgid "Lock Point Where &Dragged" msgstr "Accrocher le point à l'&Emplacement" -#: graphicswin.cpp:144 +#: graphicswin.cpp:164 msgid "Comment" msgstr "Commentaire" -#: graphicswin.cpp:146 +#: graphicswin.cpp:166 msgid "&Analyze" msgstr "&Analyse" -#: graphicswin.cpp:147 +#: graphicswin.cpp:167 msgid "Measure &Volume" msgstr "Mesure &Volume" -#: graphicswin.cpp:148 +#: graphicswin.cpp:168 msgid "Measure A&rea" msgstr "Mesure &Aire" -#: graphicswin.cpp:149 +#: graphicswin.cpp:169 msgid "Measure &Perimeter" msgstr "Mesure &Périmètre" -#: graphicswin.cpp:150 +#: graphicswin.cpp:170 msgid "Show &Interfering Parts" msgstr "Montrer les Pièces &Interférentes" -#: graphicswin.cpp:151 +#: graphicswin.cpp:171 msgid "Show &Naked Edges" msgstr "Montrer les Arêtes &Nues" -#: graphicswin.cpp:152 +#: graphicswin.cpp:172 msgid "Show &Center of Mass" msgstr "Montrer le &Centre de Gravité" -#: graphicswin.cpp:154 -msgid "Show Degrees of &Freedom" -msgstr "Montrer les Degrés de &Liberté" +#: graphicswin.cpp:174 +msgid "Show &Underconstrained Points" +msgstr "Montrer les &sous-contraintes Points" -#: graphicswin.cpp:156 +#: graphicswin.cpp:176 msgid "&Trace Point" msgstr "&Tracer Point" -#: graphicswin.cpp:157 +#: graphicswin.cpp:177 msgid "&Stop Tracing..." msgstr "&Arrêt Tracé..." -#: graphicswin.cpp:158 +#: graphicswin.cpp:178 msgid "Step &Dimension..." msgstr "Espacement &Dimension..." -#: graphicswin.cpp:160 +#: graphicswin.cpp:180 msgid "&Help" msgstr "&Aide" -#: graphicswin.cpp:161 -msgid "&Website / Manual" -msgstr "&Site web / Manuel" - -#: graphicswin.cpp:162 +#: graphicswin.cpp:181 msgid "&Language" msgstr "&Langue" -#: graphicswin.cpp:164 +#: graphicswin.cpp:182 +msgid "&Website / Manual" +msgstr "&Site web / Manuel" + +#: graphicswin.cpp:184 msgid "&About" msgstr "&A propos" -#: graphicswin.cpp:491 +#: graphicswin.cpp:352 +msgid "(no recent files)" +msgstr "(pas de fichier récent)" + +#: graphicswin.cpp:360 +#, c-format +msgid "File '%s' does not exist." +msgstr "" + +#: graphicswin.cpp:721 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:500 +#: graphicswin.cpp:730 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1063,19 +1126,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:581 +#: graphicswin.cpp:809 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:862 +#: graphicswin.cpp:1103 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:882 +#: graphicswin.cpp:1121 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1083,7 +1146,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:906 +#: graphicswin.cpp:1144 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1091,7 +1154,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:913 +#: graphicswin.cpp:1151 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1100,13 +1163,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:979 +#: graphicswin.cpp:1239 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:984 +#: graphicswin.cpp:1242 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-" @@ -1116,7 +1179,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:1008 +#: graphicswin.cpp:1263 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1124,49 +1187,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:1019 +#: graphicswin.cpp:1274 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:1020 +#: graphicswin.cpp:1275 msgid "click to place datum point" msgstr "cliquez pour placer un point" -#: graphicswin.cpp:1021 +#: graphicswin.cpp:1276 msgid "click first point of line segment" msgstr "cliquez le premier point du segment de ligne" -#: graphicswin.cpp:1023 +#: graphicswin.cpp:1278 msgid "click first point of construction line segment" msgstr "cliquez le premier point de la ligne de construction" -#: graphicswin.cpp:1024 +#: graphicswin.cpp:1279 msgid "click first point of cubic segment" msgstr "cliquez le premier point du segment cubique" -#: graphicswin.cpp:1025 +#: graphicswin.cpp:1280 msgid "click center of circle" msgstr "cliquez pour placer le centre du cercle" -#: graphicswin.cpp:1026 +#: graphicswin.cpp:1281 msgid "click origin of workplane" msgstr "cliquez pour placer l'origine du plan de travail" -#: graphicswin.cpp:1027 +#: graphicswin.cpp:1282 msgid "click one corner of rectangle" msgstr "cliquez un coin du rectangle" -#: graphicswin.cpp:1028 +#: graphicswin.cpp:1283 msgid "click top left of text" msgstr "cliquez le haut à gauche du texte" -#: graphicswin.cpp:1034 +#: graphicswin.cpp:1289 msgid "click top left of image" msgstr "cliquez le haut à gauche de l'image" -#: graphicswin.cpp:1047 +#: graphicswin.cpp:1301 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1174,12 +1237,12 @@ msgstr "" "Aucune entité n'est sélectionnée. Sélectionnez les entités avant d'essayer " "de basculer leurs états de construction." -#: group.cpp:90 +#: group.cpp:86 msgctxt "group-name" msgid "sketch-in-3d" msgstr "dessin-en-3d" -#: group.cpp:146 +#: group.cpp:142 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" @@ -1196,7 +1259,7 @@ msgstr "" "lignes)\n" "    * Un plan de travail (copie du plan de travail)\n" -#: group.cpp:158 +#: group.cpp:154 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1204,11 +1267,15 @@ msgstr "" "Activez un plan de travail (Dessin -> Dans plan de travail) avant " "l'extrusion. Le croquis sera extrudé normalement au plan de travail." -#: group.cpp:167 +#: group.cpp:163 msgctxt "group-name" msgid "extrude" msgstr "extruder" +#: group.cpp:168 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "" + #: group.cpp:179 msgid "" "Bad selection for new lathe group. This group can be created with:\n" @@ -1229,57 +1296,94 @@ msgctxt "group-name" msgid "lathe" msgstr "révolution" -#: group.cpp:202 +#: group.cpp:194 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:205 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:217 +msgctxt "group-name" +msgid "revolve" +msgstr "" + +#: group.cpp:222 +msgid "Helix operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:233 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:245 +msgctxt "group-name" +msgid "helix" +msgstr "" + +#: group.cpp:258 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" -" * a point, while locked in workplane (rotate in plane, about that point)\n" +" * a point, while locked in workplane (rotate in plane, about that " +"point)\n" " * a point and a line or a normal (rotate about an axis through the " "point, and parallel to line / normal)\n" msgstr "" -"Mauvaise sélection pour une nouvelle rotation. Ce groupe peut être créé avec:" -"\n" +"Mauvaise sélection pour une nouvelle rotation. Ce groupe peut être créé " +"avec:\n" "\n" "    * Un point, lorsqu'il est verrouillé dans un plan de travail (rotation " "dans le plan, autour de ce point)\n" "    * Un point et une ligne ou une normale (tourner autour d'un axe par le " "point et parallèle à la ligne / normale)\n" -#: group.cpp:215 +#: group.cpp:271 msgctxt "group-name" msgid "rotate" msgstr "rotation" -#: group.cpp:226 +#: group.cpp:282 msgctxt "group-name" msgid "translate" msgstr "translation" -#: group.cpp:340 +#: group.cpp:400 msgid "(unnamed)" msgstr "(sans nom)" -#: groupmesh.cpp:626 +#: groupmesh.cpp:689 msgid "not closed contour, or not all same style!" msgstr "contour non fermé ou tout n'est pas du même style!" -#: groupmesh.cpp:639 +#: groupmesh.cpp:702 msgid "points not all coplanar!" msgstr "les points ne sont pas tous coplanaires!" -#: groupmesh.cpp:641 +#: groupmesh.cpp:704 msgid "contour is self-intersecting!" msgstr "le contour s'entrecroise!" -#: groupmesh.cpp:643 +#: groupmesh.cpp:706 msgid "zero-length edge!" msgstr "arête de longueur nulle!" -#: modify.cpp:237 +#: modify.cpp:254 msgid "Must be sketching in workplane to create tangent arc." msgstr "Vous devez dessiner dans un plan pour créer un arc tangent." -#: modify.cpp:284 +#: modify.cpp:301 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1287,7 +1391,7 @@ msgstr "" "Pour créer un arc tangent, sélectionnez un point où deux lignes (pas de " "construction) ou cercles de ce groupe et de ce plan se joignent." -#: modify.cpp:371 +#: modify.cpp:388 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1295,123 +1399,123 @@ msgstr "" "Impossible d'arrondir ce coin. Essayez un rayon plus petit, ou essayez de " "créer la géométrie souhaitée à la main avec des contraintes tangentielles." -#: modify.cpp:575 +#: modify.cpp:597 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" "Impossible de diviser cette entité; Lignes, cercles ou cubiques uniquement." -#: modify.cpp:601 +#: modify.cpp:624 msgid "Must be sketching in workplane to split." msgstr "Vous devez dessiner dans un plan de travail pour diviser." -#: modify.cpp:608 +#: modify.cpp:631 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" -#: modify.cpp:713 +#: modify.cpp:736 msgid "Can't split; no intersection found." msgstr "Impossible de diviser; pas d'intersection trouvée." -#: mouse.cpp:522 +#: mouse.cpp:560 +msgid "Assign to Style" +msgstr "Appliquer au style" + +#: mouse.cpp:576 msgid "No Style" msgstr "Pas de style" -#: mouse.cpp:523 +#: mouse.cpp:579 msgid "Newly Created Custom Style..." msgstr "Style personnalisé nouvellement créé ..." -#: mouse.cpp:571 -msgid "Assign to Style" -msgstr "Appliquer au style" - -#: mouse.cpp:574 +#: mouse.cpp:586 msgid "Group Info" msgstr "Info Groupe" -#: mouse.cpp:577 +#: mouse.cpp:606 msgid "Style Info" msgstr "Info Style" -#: mouse.cpp:580 +#: mouse.cpp:626 msgid "Select Edge Chain" msgstr "Sélection Chaîne d'arêtes" -#: mouse.cpp:585 +#: mouse.cpp:632 msgid "Toggle Reference Dimension" msgstr "Basculer cote maîtresse / cote indicative" -#: mouse.cpp:591 +#: mouse.cpp:638 msgid "Other Supplementary Angle" msgstr "Autre angle supplémentaire" -#: mouse.cpp:596 +#: mouse.cpp:643 msgid "Snap to Grid" msgstr "Accrocher à la grille" -#: mouse.cpp:604 +#: mouse.cpp:652 msgid "Remove Spline Point" msgstr "Effacer le point de la Spline" -#: mouse.cpp:615 +#: mouse.cpp:687 msgid "Add Spline Point" msgstr "Ajouter un point à la Spline" -#: mouse.cpp:619 +#: mouse.cpp:691 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "" +"Impossible d'ajouter le point spline: nombre maximum de points atteints." + +#: mouse.cpp:716 msgid "Toggle Construction" msgstr "Basculer en mode \"construction\"." -#: mouse.cpp:633 +#: mouse.cpp:731 msgid "Delete Point-Coincident Constraint" msgstr "Effacer la contraint Point-Coïncident" -#: mouse.cpp:639 +#: mouse.cpp:750 msgid "Cut" msgstr "Couper" -#: mouse.cpp:640 +#: mouse.cpp:752 msgid "Copy" msgstr "Copier" -#: mouse.cpp:643 +#: mouse.cpp:756 msgid "Select All" msgstr "Sélectionner tout" -#: mouse.cpp:647 +#: mouse.cpp:761 msgid "Paste" msgstr "Coller" -#: mouse.cpp:648 +#: mouse.cpp:763 msgid "Paste Transformed..." msgstr "Coller transformé..." -#: mouse.cpp:652 +#: mouse.cpp:768 msgid "Delete" msgstr "Effacer" -#: mouse.cpp:654 +#: mouse.cpp:771 msgid "Unselect All" msgstr "Désélectionner tout" -#: mouse.cpp:660 +#: mouse.cpp:778 msgid "Unselect Hovered" msgstr "Désélectionner survolé" -#: mouse.cpp:665 +#: mouse.cpp:787 msgid "Zoom to Fit" msgstr "Zoom pour ajuster" -#: mouse.cpp:805 -msgid "Cannot add spline point: maximum number of points reached." -msgstr "" -"Impossible d'ajouter le point spline: nombre maximum de points atteints." - -#: mouse.cpp:1009 mouse.cpp:1292 +#: mouse.cpp:990 mouse.cpp:1277 msgid "click next point of line, or press Esc" msgstr "cliquez pou le prochain point de ligne or appuyez sur Esc" -#: mouse.cpp:1015 +#: mouse.cpp:996 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1419,15 +1523,15 @@ msgstr "" "Impossible de dessiner un rectangle en 3d; D'abord, activez un plan de " "travail avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1049 +#: mouse.cpp:1030 msgid "click to place other corner of rectangle" msgstr "cliquez pour placer un autre coin de rectangle" -#: mouse.cpp:1069 +#: mouse.cpp:1050 msgid "click to set radius" msgstr "cliquez pour ajuster le rayon" -#: mouse.cpp:1074 +#: mouse.cpp:1055 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1435,23 +1539,22 @@ msgstr "" "Ne peut pas dessiner l'arc en 3d; D'abord, activez un plan de travail avec " "\"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1093 +#: mouse.cpp:1074 msgid "click to place point" msgstr "cliquez pour placer un point" -#: mouse.cpp:1109 +#: mouse.cpp:1090 msgid "click next point of cubic, or press Esc" msgstr "cliquez le prochain point cubique ou appuyez sur Esc" -#: mouse.cpp:1114 +#: mouse.cpp:1095 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." -"" msgstr "" "Vous dessinez déjà dans un plan de travail; Sélectionner \"Dessiner en 3d\" " "avant de créer un nouveau plan de travail." -#: mouse.cpp:1130 +#: mouse.cpp:1111 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1459,11 +1562,11 @@ msgstr "" "Impossible de dessiner du texte en 3d; D'abord, activer un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1146 -msgid "click to place bottom left of text" -msgstr "cliquez pour placer le bas gauche du texte" +#: mouse.cpp:1128 +msgid "click to place bottom right of text" +msgstr "" -#: mouse.cpp:1152 +#: mouse.cpp:1134 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1471,194 +1574,137 @@ msgstr "" "Impossible de dessiner l'image en 3d; D'abord, activez un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1178 +#: mouse.cpp:1161 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NOUVEAU COMMENTAIRE - DOUBLE-CLIQUE POUR EDITER" -#: platform/cocoamain.mm:481 platform/gtkmain.cpp:607 platform/w32main.cpp:451 -#: platform/w32main.cpp:1388 -msgctxt "title" -msgid "(new sketch)" -msgstr "(nouveau dessin)" - -#: platform/cocoamain.mm:710 platform/gtkmain.cpp:912 platform/w32main.cpp:1307 -msgid "(no recent files)" -msgstr "(pas de fichier récent)" - -#: platform/cocoamain.mm:828 platform/gtkmain.cpp:1020 -msgid "untitled" -msgstr "sans nom" +#: platform/gui.cpp:85 +msgctxt "file-type" +msgid "SolveSpace models" +msgstr "" -#: platform/cocoamain.mm:860 -msgid "Do you want to save the changes you made to the new sketch?" +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "PNG image" msgstr "" -"Voulez-vous enregistrer les modifications que vous avez apportées au nouveau " -"dessin?" -#: platform/cocoamain.mm:862 -msgid "Your changes will be lost if you don't save them." -msgstr "Vos modifications seront perdues si vous ne les enregistrez pas." +#: platform/gui.cpp:93 +msgctxt "file-type" +msgid "STL mesh" +msgstr "" -#: platform/cocoamain.mm:863 -msgctxt "button" -msgid "Save" -msgstr "Sauver" +#: platform/gui.cpp:94 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" +msgstr "" -#: platform/cocoamain.mm:864 platform/cocoamain.mm:905 -msgctxt "button" -msgid "Cancel" -msgstr "Annuler" +#: platform/gui.cpp:95 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" +msgstr "" -#: platform/cocoamain.mm:865 -msgctxt "button" -msgid "Don't Save" -msgstr "Ne pas sauver" +#: platform/gui.cpp:96 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "" -#: platform/cocoamain.mm:880 -msgid "An autosave file is available for this project." +#: platform/gui.cpp:97 +msgctxt "file-type" +msgid "Q3D Object file" msgstr "" -#: platform/cocoamain.mm:882 -msgid "Do you want to load the autosave file instead?" -msgstr "Voulez-vous charger le fichier de sauvegarde à la place?" +#: platform/gui.cpp:98 +msgctxt "file-type" +msgid "VRML text file" +msgstr "" -#: platform/cocoamain.mm:883 -msgctxt "button" -msgid "Load" -msgstr "Charger" +#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +msgctxt "file-type" +msgid "STEP file" +msgstr "" -#: platform/cocoamain.mm:884 -msgctxt "button" -msgid "Don't Load" -msgstr "Ne pas charger" +#: platform/gui.cpp:106 +msgctxt "file-type" +msgid "PDF file" +msgstr "" -#: platform/cocoamain.mm:900 -msgid "" -"Do you want to locate it manually?\n" -"If you select “No”, any geometry that depends on the missing file will be " -"removed." +#: platform/gui.cpp:107 +msgctxt "file-type" +msgid "Encapsulated PostScript" msgstr "" -"Voulez-vous le localiser manuellement?\n" -"Si vous sélectionnez \"Non\", toute géométrie qui dépend du fichier manquant " -"sera supprimée." -#: platform/cocoamain.mm:903 -msgctxt "button" -msgid "Yes" -msgstr "Oui" +#: platform/gui.cpp:108 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "" -#: platform/cocoamain.mm:906 -msgctxt "button" -msgid "No" -msgstr "Non" +#: platform/gui.cpp:110 platform/gui.cpp:117 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" +msgstr "" -#: platform/cocoamain.mm:1126 platform/w32main.cpp:183 -msgctxt "button" -msgid "OK" -msgstr "Valider" +#: platform/gui.cpp:111 +msgctxt "file-type" +msgid "HPGL file" +msgstr "" -#: platform/cocoamain.mm:1211 platform/gtkmain.cpp:1382 platform/w32main.cpp:1410 -#: platform/w32main.cpp:1450 -msgctxt "title" -msgid "Property Browser" -msgstr "Navigateur de propriété" +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "G Code" +msgstr "" -#: platform/gtkmain.cpp:968 -msgctxt "title" -msgid "Open File" -msgstr "Ouvrir Fichier" +#: platform/gui.cpp:121 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" +msgstr "" -#: platform/gtkmain.cpp:970 -msgid "_Cancel" -msgstr "_Annuler" +#: platform/gui.cpp:125 +msgctxt "file-type" +msgid "Comma-separated values" +msgstr "" -#: platform/gtkmain.cpp:971 -msgid "_Open" -msgstr "_Ouvrir" +#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +msgid "untitled" +msgstr "sans nom" -#: platform/gtkmain.cpp:1010 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "Sauver fichier" -#: platform/gtkmain.cpp:1013 platform/gtkmain.cpp:1049 platform/gtkmain.cpp:1097 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guiwin.cpp:1557 +msgctxt "title" +msgid "Open File" +msgstr "Ouvrir Fichier" + +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 msgctxt "button" msgid "_Cancel" msgstr "_Annuler" -#: platform/gtkmain.cpp:1014 platform/gtkmain.cpp:1047 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 msgctxt "button" msgid "_Save" msgstr "_Sauver" -#: platform/gtkmain.cpp:1042 platform/w32main.cpp:1167 -msgid "" -"The file has changed since it was last saved.\n" -"\n" -"Do you want to save the changes?" -msgstr "" -"Le fichier a changé depuis sa dernière sauvegarde.\n" -"\n" -"Voulez-vous enregistrer les modifications?" - -#: platform/gtkmain.cpp:1046 platform/w32main.cpp:1169 -msgctxt "title" -msgid "Modified File" -msgstr "Fichier modifié" - -#: platform/gtkmain.cpp:1048 +#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 msgctxt "button" -msgid "Do_n't Save" -msgstr "_Ne pas sauver" - -#: platform/gtkmain.cpp:1066 platform/w32main.cpp:1193 -msgid "" -"An autosave file is available for this project.\n" -"\n" -"Do you want to load the autosave file instead?" +msgid "_Open" msgstr "" -#: platform/gtkmain.cpp:1070 platform/w32main.cpp:1195 -msgctxt "title" -msgid "Autosave Available" -msgstr "Sauvegarde automatique existante" - -#: platform/gtkmain.cpp:1071 -msgctxt "button" -msgid "_Load autosave" -msgstr "_Charger la sauvegarde automatique" - -#: platform/gtkmain.cpp:1072 -msgctxt "button" -msgid "Do_n't Load" -msgstr "_Ne pas charger" - -#: platform/gtkmain.cpp:1093 platform/w32main.cpp:1223 -msgctxt "title" -msgid "Missing File" -msgstr "Fichier manquant" - -#: platform/gtkmain.cpp:1094 -msgctxt "button" -msgid "_Yes" -msgstr "_Oui" - -#: platform/gtkmain.cpp:1095 -msgctxt "button" -msgid "_No" -msgstr "_Non" - -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 +#: solvespace.cpp:557 msgctxt "title" -msgid "Error" -msgstr "Erreur" +msgid "(new sketch)" +msgstr "(nouveau dessin)" -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 +#: solvespace.cpp:564 msgctxt "title" -msgid "Message" -msgstr "Message" +msgid "Property Browser" +msgstr "Navigateur de propriété" -#: style.cpp:160 +#: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -1666,27 +1712,27 @@ msgstr "" "Impossible d'attribuer le style à une entité dérivée d'une autre entité; " "Essayez d'attribuer un style au parent de cette entité." -#: style.cpp:659 +#: style.cpp:665 msgid "Style name cannot be empty" msgstr "Le nom d'un style ne peut pas être vide" -#: textscreens.cpp:662 +#: textscreens.cpp:741 msgid "Can't repeat fewer than 1 time." msgstr "Je ne peux pas répéter moins de 1 fois." -#: textscreens.cpp:666 +#: textscreens.cpp:745 msgid "Can't repeat more than 999 times." msgstr "Je ne peux pas répéter plus de 999 fois." -#: textscreens.cpp:695 +#: textscreens.cpp:770 msgid "Group name cannot be empty" msgstr "Un nom de groupe ne peut pas être vide" -#: textscreens.cpp:739 +#: textscreens.cpp:813 msgid "Opacity must be between zero and one." msgstr "L'opacité doit être entre 0 et 1." -#: textscreens.cpp:778 +#: textscreens.cpp:848 msgid "Radius cannot be zero or negative." msgstr "Le rayon ne peut pas être zéro ou négatif." @@ -1819,71 +1865,174 @@ msgstr "Vue isométrique la plus proche" msgid "Align view to active workplane" msgstr "Aligner la vue sur le plan de travail actif" -#: ui.h:69 -msgid "SolveSpace models" -msgstr "Modèles SolveSpace" +#: util.cpp:165 +msgctxt "title" +msgid "Error" +msgstr "Erreur" -#: ui.h:74 -msgid "PNG file" -msgstr "Fichier PNG" +#: util.cpp:165 +msgctxt "title" +msgid "Message" +msgstr "Message" -#: ui.h:79 -msgid "STL mesh" -msgstr "Maillage STL" +#: util.cpp:170 +msgctxt "button" +msgid "&OK" +msgstr "" -#: ui.h:80 -msgid "Wavefront OBJ mesh" -msgstr "Maillage Wavefront OBJ" +#: view.cpp:78 +msgid "Scale cannot be zero or negative." +msgstr "L'échelle ne peut pas être zéro ou négative." -#: ui.h:81 -msgid "Three.js-compatible mesh, with viewer" -msgstr "Maillage Three-js-compatible, avec visualisateur" +#: view.cpp:90 view.cpp:99 +msgid "Bad format: specify x, y, z" +msgstr "Mauvais format: Spécifiez x, y, z" -#: ui.h:82 -msgid "Three.js-compatible mesh, mesh only" -msgstr "Maillage Three-js-compatible, maillage seul" +#~ msgid "Specify between 0 and 8 digits after the decimal." +#~ msgstr "Spécifiez entre 0 et 8 chiffres après la virgule." + +#~ msgid "Show Degrees of &Freedom" +#~ msgstr "Montrer les Degrés de &Liberté" -#: ui.h:87 ui.h:95 ui.h:103 -msgid "STEP file" -msgstr "Fichier STEP" +#~ msgid "click to place bottom left of text" +#~ msgstr "cliquez pour placer le bas gauche du texte" -#: ui.h:92 -msgid "PDF file" -msgstr "Fichier PDF" +#~ msgid "Do you want to save the changes you made to the new sketch?" +#~ msgstr "" +#~ "Voulez-vous enregistrer les modifications que vous avez apportées au " +#~ "nouveau dessin?" -#: ui.h:93 -msgid "Encapsulated PostScript" -msgstr "Encapsulated PostScript" +#~ msgid "Your changes will be lost if you don't save them." +#~ msgstr "Vos modifications seront perdues si vous ne les enregistrez pas." -#: ui.h:94 -msgid "Scalable Vector Graphics" -msgstr "Scalable Vector Graphics" +#~ msgctxt "button" +#~ msgid "Save" +#~ msgstr "Sauver" -#: ui.h:96 ui.h:104 -msgid "DXF file (AutoCAD 2007)" -msgstr "Fichier DXF (AutoCAD 2007)" +#~ msgctxt "button" +#~ msgid "Cancel" +#~ msgstr "Annuler" -#: ui.h:97 -msgid "HPGL file" -msgstr "Fichier HPGL" +#~ msgctxt "button" +#~ msgid "Don't Save" +#~ msgstr "Ne pas sauver" -#: ui.h:98 -msgid "G Code" -msgstr "G Code" +#~ msgid "Do you want to load the autosave file instead?" +#~ msgstr "Voulez-vous charger le fichier de sauvegarde à la place?" -#: ui.h:109 -msgid "AutoCAD DXF and DWG files" -msgstr "Fichiers AutoCAD DXF et DWG" +#~ msgctxt "button" +#~ msgid "Load" +#~ msgstr "Charger" -#: ui.h:114 -msgid "Comma-separated values" -msgstr "Valeurs CSV séparées par des virgules" +#~ msgctxt "button" +#~ msgid "Don't Load" +#~ msgstr "Ne pas charger" -#: view.cpp:78 -msgid "Scale cannot be zero or negative." -msgstr "L'échelle ne peut pas être zéro ou négative." +#~ msgid "" +#~ "Do you want to locate it manually?\n" +#~ "If you select “No”, any geometry that depends on the missing file will be " +#~ "removed." +#~ msgstr "" +#~ "Voulez-vous le localiser manuellement?\n" +#~ "Si vous sélectionnez \"Non\", toute géométrie qui dépend du fichier " +#~ "manquant sera supprimée." -#: view.cpp:90 view.cpp:99 -msgid "Bad format: specify x, y, z" -msgstr "Mauvais format: Spécifiez x, y, z" +#~ msgctxt "button" +#~ msgid "Yes" +#~ msgstr "Oui" + +#~ msgctxt "button" +#~ msgid "No" +#~ msgstr "Non" + +#~ msgctxt "button" +#~ msgid "OK" +#~ msgstr "Valider" + +#~ msgid "_Cancel" +#~ msgstr "_Annuler" + +#~ msgid "_Open" +#~ msgstr "_Ouvrir" + +#~ msgid "" +#~ "The file has changed since it was last saved.\n" +#~ "\n" +#~ "Do you want to save the changes?" +#~ msgstr "" +#~ "Le fichier a changé depuis sa dernière sauvegarde.\n" +#~ "\n" +#~ "Voulez-vous enregistrer les modifications?" + +#~ msgctxt "title" +#~ msgid "Modified File" +#~ msgstr "Fichier modifié" + +#~ msgctxt "button" +#~ msgid "Do_n't Save" +#~ msgstr "_Ne pas sauver" + +#~ msgctxt "title" +#~ msgid "Autosave Available" +#~ msgstr "Sauvegarde automatique existante" + +#~ msgctxt "button" +#~ msgid "_Load autosave" +#~ msgstr "_Charger la sauvegarde automatique" + +#~ msgctxt "button" +#~ msgid "Do_n't Load" +#~ msgstr "_Ne pas charger" + +#~ msgctxt "button" +#~ msgid "_Yes" +#~ msgstr "_Oui" + +#~ msgctxt "button" +#~ msgid "_No" +#~ msgstr "_Non" + +#~ msgid "SolveSpace models" +#~ msgstr "Modèles SolveSpace" + +#~ msgid "PNG file" +#~ msgstr "Fichier PNG" + +#~ msgid "STL mesh" +#~ msgstr "Maillage STL" + +#~ msgid "Wavefront OBJ mesh" +#~ msgstr "Maillage Wavefront OBJ" + +#~ msgid "Three.js-compatible mesh, with viewer" +#~ msgstr "Maillage Three-js-compatible, avec visualisateur" + +#~ msgid "Three.js-compatible mesh, mesh only" +#~ msgstr "Maillage Three-js-compatible, maillage seul" + +#~ msgid "STEP file" +#~ msgstr "Fichier STEP" + +#~ msgid "PDF file" +#~ msgstr "Fichier PDF" + +#~ msgid "Encapsulated PostScript" +#~ msgstr "Encapsulated PostScript" + +#~ msgid "Scalable Vector Graphics" +#~ msgstr "Scalable Vector Graphics" + +#~ msgid "DXF file (AutoCAD 2007)" +#~ msgstr "Fichier DXF (AutoCAD 2007)" + +#~ msgid "HPGL file" +#~ msgstr "Fichier HPGL" + +#~ msgid "G Code" +#~ msgstr "G Code" + +#~ msgid "AutoCAD DXF and DWG files" +#~ msgstr "Fichiers AutoCAD DXF et DWG" +#~ msgid "Comma-separated values" +#~ msgstr "Valeurs CSV séparées par des virgules" diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index 661f6fae2..95a3a94e7 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -2,12 +2,11 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # EvilSpirit , 2017. -# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2018-07-12 22:40+0000\n" +"POT-Creation-Date: 2020-09-21 09:28+0200\n" "PO-Revision-Date: 2017-04-21 10:29+0700\n" "Last-Translator: evilspirit@evilspirit.org\n" "Language-Team: EvilSpirit\n" @@ -36,42 +35,42 @@ msgstr "Буфер обмена пуст; нечего вставлять." msgid "Number of copies to paste must be at least one." msgstr "Укажите в поле 'количество' хотя бы одну копию для вставки." -#: clipboard.cpp:354 textscreens.cpp:709 +#: clipboard.cpp:354 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "Масштабный коэффициент не может быть нулевым." -#: clipboard.cpp:392 +#: clipboard.cpp:396 msgid "Select one point to define origin of rotation." msgstr "Выберите одну точку в качестве центра вращения." -#: clipboard.cpp:404 +#: clipboard.cpp:408 msgid "Select two points to define translation vector." msgstr "Выберите две точки, чтобы задать вектор смещения." -#: clipboard.cpp:414 +#: clipboard.cpp:418 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "" "Трансформация не задана. Все копии будут расположены в одном и том же месте." -#: clipboard.cpp:418 +#: clipboard.cpp:422 msgid "Too many items to paste; split this into smaller pastes." msgstr "Слишком много элементов для вставки; разбейте на несколько частей." -#: clipboard.cpp:423 +#: clipboard.cpp:427 msgid "No workplane active." msgstr "Рабочая плоскость не активна" -#: confscreen.cpp:336 +#: confscreen.cpp:410 msgid "Bad format: specify coordinates as x, y, z" msgstr "Неверный формат: введите координаты как x, y, z" -#: confscreen.cpp:347 style.cpp:653 textscreens.cpp:730 +#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "Неверный формат: введите цвет как r, g, b" -#: confscreen.cpp:372 +#: confscreen.cpp:446 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,24 +78,25 @@ msgstr "" "Коэффициент перспективы не будет иметь эффект, пока вы не включите Вид-" ">Перспективная Проекция." -#: confscreen.cpp:386 -msgid "Specify between 0 and 8 digits after the decimal." -msgstr "Введите число от 0 до 8." +#: confscreen.cpp:459 confscreen.cpp:469 +#, c-format +msgid "Specify between 0 and %d digits after the decimal." +msgstr "Введите число от 0 до %d." -#: confscreen.cpp:398 +#: confscreen.cpp:481 msgid "Export scale must not be zero!" msgstr "Масштабный коэффициент не может быть нулевым!" -#: confscreen.cpp:410 +#: confscreen.cpp:493 msgid "Cutter radius offset must not be negative!" msgstr "Радиус режущего инструмента не может быть отрицательным!" -#: confscreen.cpp:464 +#: confscreen.cpp:547 msgid "Bad value: autosave interval should be positive" msgstr "" "Неверное значение: интервал автосохранения должен быть положительным числом" -#: confscreen.cpp:467 +#: confscreen.cpp:550 msgid "Bad format: specify interval in integral minutes" msgstr "" "Неверный формат: введите целое число, чтобы задать интервал автосохранения" @@ -276,7 +276,7 @@ msgctxt "constr-name" msgid "comment" msgstr "комментарий" -#: constraint.cpp:160 +#: constraint.cpp:171 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -301,7 +301,7 @@ msgstr "" " * грань и точку (расстояние от точки до плоскости грани)\n" " * окружность или дугу (диаметр / радиус)\n" -#: constraint.cpp:213 +#: constraint.cpp:224 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -321,7 +321,7 @@ msgstr "" " * точку и окружность / дугу / сплайн (точка на кривой)\n" " * точку и грань (точка на грани)\n" -#: constraint.cpp:275 +#: constraint.cpp:286 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -349,7 +349,7 @@ msgstr "" " * две окружности / дуги (равенство радиусов)\n" " * отрезок и дугу (равенство длины отрезка и длины дуги)\n" -#: constraint.cpp:314 +#: constraint.cpp:325 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" @@ -360,7 +360,7 @@ msgstr "" "\n" " * два отрезка\n" -#: constraint.cpp:331 +#: constraint.cpp:342 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" @@ -372,7 +372,7 @@ msgstr "" "\n" " * два отрезка\n" -#: constraint.cpp:357 +#: constraint.cpp:368 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -385,7 +385,7 @@ msgstr "" " * точку и отрезок (точка на середине отрезка)\n" " * отрезок и рабочую плоскость (середина отрезка на плоскости)\n" -#: constraint.cpp:415 +#: constraint.cpp:426 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -405,7 +405,7 @@ msgstr "" " * рабочую плоскость и две точки / отрезок (симметричность относительно " "рабочей плоскости\n" -#: constraint.cpp:429 +#: constraint.cpp:440 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -413,7 +413,7 @@ msgstr "" "Рабочая плоскость должна быть активна для того, чтобы создать\n" "ограничение симметричности без явного указания плоскости симметрии." -#: constraint.cpp:459 +#: constraint.cpp:470 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -421,7 +421,7 @@ msgstr "" "Рабочая плоскость должна быть активирована (Эскиз -> В рабочей плоскости)\n" "перед тем, как накладывать ограничения горизонтальности / вертикальности." -#: constraint.cpp:472 +#: constraint.cpp:483 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -435,7 +435,7 @@ msgstr "" " * две точки\n" " * отрезок\n" -#: constraint.cpp:493 +#: constraint.cpp:504 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -447,18 +447,18 @@ msgstr "" "\n" " * два координатных базиса('нормали')\n" -#: constraint.cpp:545 +#: constraint.cpp:554 msgid "Must select an angle constraint." msgstr "" "Переключатся между смежными углами можно только выбрав ограничение угла." -#: constraint.cpp:557 +#: constraint.cpp:567 msgid "Must select a constraint with associated label." msgstr "" "Переключать режим 'размера для справок' возможно только для ограничений, " "имеющих размерное значение." -#: constraint.cpp:568 +#: constraint.cpp:578 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -473,7 +473,7 @@ msgstr "" " * отрезок и координатный базис (нормаль)\n" " * два координатных базиса (нормали)\n" -#: constraint.cpp:625 +#: constraint.cpp:635 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -482,7 +482,7 @@ msgstr "" "'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " "касательности." -#: constraint.cpp:649 +#: constraint.cpp:659 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -491,12 +491,12 @@ msgstr "" "'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " "касательности." -#: constraint.cpp:659 +#: constraint.cpp:669 msgid "Curve-curve tangency must apply in workplane." msgstr "" "Ограничение касательности может быть наложено только в рабочей плоскости." -#: constraint.cpp:677 +#: constraint.cpp:687 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -505,7 +505,7 @@ msgstr "" "'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " "касательности." -#: constraint.cpp:686 +#: constraint.cpp:696 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -524,7 +524,7 @@ msgstr "" " * два отрезка, две дуги или два сплайна, соединенных крайними точками " "(касательность)\n" -#: constraint.cpp:704 +#: constraint.cpp:714 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -539,7 +539,7 @@ msgstr "" " * отрезок и координатный базис (нормаль)\n" " * два координатных базиса (нормали)\n" -#: constraint.cpp:719 +#: constraint.cpp:729 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -551,17 +551,17 @@ msgstr "" "\n" " * точку\n" -#: constraint.cpp:730 +#: constraint.cpp:740 msgid "click center of comment text" msgstr "кликните мышью там, где будет расположен текстовый комментарий" -#: export.cpp:18 +#: export.cpp:19 msgid "" "No solid model present; draw one with extrudes and revolves, or use Export " "2d View to export bare lines and curves." msgstr "" -#: export.cpp:60 +#: export.cpp:61 msgid "" "Bad selection for export section. Please select:\n" "\n" @@ -571,7 +571,7 @@ msgid "" "lines)\n" msgstr "" -#: export.cpp:805 +#: export.cpp:822 msgid "Active group mesh is empty; nothing to export." msgstr "" @@ -583,21 +583,21 @@ msgstr "Стили линии 'от руки' были заменены спло msgid "zigzag lines were replaced with continuous lines" msgstr "Стили линии 'зиг-заг' были заменены сплошными линиями" -#: exportvector.cpp:590 +#: exportvector.cpp:593 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Некоторые элементы чертежа не имеют аналогов в DXF-представлении и не были " "экспортированы:\n" -#: exportvector.cpp:807 +#: exportvector.cpp:839 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" "Размер страницы PDF превышает 200x200 дюймов; некоторые программы просмотра " "не смогут прочитать такой файл." -#: file.cpp:44 group.cpp:95 +#: file.cpp:44 group.cpp:91 msgctxt "group-name" msgid "sketch-in-plane" msgstr "эскиз-в-плоскости" @@ -607,7 +607,7 @@ msgctxt "group-name" msgid "#references" msgstr "система-координат" -#: file.cpp:539 +#: file.cpp:549 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -615,431 +615,498 @@ msgstr "" "Некоторые данные из этого файла не распознаны. Возможно, файл поврежден или " "создан в более новой версии программы" -#: graphicswin.cpp:29 +#: file.cpp:849 +msgctxt "title" +msgid "Missing File" +msgstr "Файл Отсутствует" + +#: file.cpp:850 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "" + +#: file.cpp:852 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." +msgstr "" +"Хотите найти их вручную?\n" +"Если вы ответите \"Нет\", то вся геометрия, которая зависит от " +"отсутствующего файла будет удалена." + +#: file.cpp:855 +msgctxt "button" +msgid "&Yes" +msgstr "Да" + +#: file.cpp:857 +msgctxt "button" +msgid "&No" +msgstr "Нет" + +#: file.cpp:859 +msgctxt "button" +msgid "&Cancel" +msgstr "Отменить" + +#: graphicswin.cpp:41 msgid "&File" msgstr "&Файл" -#: graphicswin.cpp:30 +#: graphicswin.cpp:42 msgid "&New" msgstr "&Новый" -#: graphicswin.cpp:31 +#: graphicswin.cpp:43 msgid "&Open..." msgstr "&Открыть..." -#: graphicswin.cpp:32 +#: graphicswin.cpp:44 msgid "Open &Recent" msgstr "Открыть Н&едавний" -#: graphicswin.cpp:33 +#: graphicswin.cpp:45 msgid "&Save" msgstr "&Сохранить" -#: graphicswin.cpp:34 +#: graphicswin.cpp:46 msgid "Save &As..." msgstr "Сохранить &Как..." -#: graphicswin.cpp:36 +#: graphicswin.cpp:48 msgid "Export &Image..." msgstr "Экспортировать И&зображение..." -#: graphicswin.cpp:37 +#: graphicswin.cpp:49 msgid "Export 2d &View..." msgstr "Экспортировать &2d Вид..." -#: graphicswin.cpp:38 +#: graphicswin.cpp:50 msgid "Export 2d &Section..." msgstr "Экспортировать 2d Се&чение..." -#: graphicswin.cpp:39 +#: graphicswin.cpp:51 msgid "Export 3d &Wireframe..." msgstr "Экспортировать &3d Каркас..." -#: graphicswin.cpp:40 +#: graphicswin.cpp:52 msgid "Export Triangle &Mesh..." msgstr "Экспортировать &Полигональную сетку..." -#: graphicswin.cpp:41 +#: graphicswin.cpp:53 msgid "Export &Surfaces..." msgstr "Экспортировать Повер&хности..." -#: graphicswin.cpp:42 +#: graphicswin.cpp:54 msgid "Im&port..." msgstr "&Импортировать..." -#: graphicswin.cpp:45 +#: graphicswin.cpp:57 msgid "E&xit" msgstr "&Выход" -#: graphicswin.cpp:48 +#: graphicswin.cpp:60 msgid "&Edit" msgstr "&Правка" -#: graphicswin.cpp:49 +#: graphicswin.cpp:61 msgid "&Undo" msgstr "&Отменить" -#: graphicswin.cpp:50 +#: graphicswin.cpp:62 msgid "&Redo" msgstr "&Вернуть" -#: graphicswin.cpp:51 +#: graphicswin.cpp:63 msgid "Re&generate All" msgstr "&Перегенерировать Все" -#: graphicswin.cpp:53 +#: graphicswin.cpp:65 msgid "Snap Selection to &Grid" msgstr "Привязать Выделение к &Сетке" -#: graphicswin.cpp:54 +#: graphicswin.cpp:66 msgid "Rotate Imported &90°" msgstr "Повернуть Импортированное на &90°" -#: graphicswin.cpp:56 +#: graphicswin.cpp:68 msgid "Cu&t" msgstr "Вы&резать" -#: graphicswin.cpp:57 +#: graphicswin.cpp:69 msgid "&Copy" msgstr "&Копировать" -#: graphicswin.cpp:58 +#: graphicswin.cpp:70 msgid "&Paste" msgstr "В&ставить" -#: graphicswin.cpp:59 +#: graphicswin.cpp:71 msgid "Paste &Transformed..." msgstr "Вставить с &Трансформацией..." -#: graphicswin.cpp:60 +#: graphicswin.cpp:72 msgid "&Delete" msgstr "&Удалить" -#: graphicswin.cpp:62 +#: graphicswin.cpp:74 msgid "Select &Edge Chain" msgstr "Вы&делить Последовательность Ребер" -#: graphicswin.cpp:63 +#: graphicswin.cpp:75 msgid "Select &All" msgstr "В&ыделить Все" -#: graphicswin.cpp:64 +#: graphicswin.cpp:76 msgid "&Unselect All" msgstr "С&бросить Выделение" -#: graphicswin.cpp:66 +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "" + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "&View Прое&кция..." + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "" + +#: graphicswin.cpp:84 msgid "&View" msgstr "&Вид" -#: graphicswin.cpp:67 +#: graphicswin.cpp:85 msgid "Zoom &In" msgstr "&Приблизить" -#: graphicswin.cpp:68 +#: graphicswin.cpp:86 msgid "Zoom &Out" msgstr "От&далить" -#: graphicswin.cpp:69 +#: graphicswin.cpp:87 msgid "Zoom To &Fit" msgstr "Показать &Все / Выделенное" -#: graphicswin.cpp:71 +#: graphicswin.cpp:89 msgid "Align View to &Workplane" msgstr "Выровнять Вид на &Рабочую Плоскость" -#: graphicswin.cpp:72 +#: graphicswin.cpp:90 msgid "Nearest &Ortho View" msgstr "Ближайший &Ортогональный Вид" -#: graphicswin.cpp:73 +#: graphicswin.cpp:91 msgid "Nearest &Isometric View" msgstr "Ближайший &Изометрический Вид" -#: graphicswin.cpp:74 +#: graphicswin.cpp:92 msgid "&Center View At Point" msgstr "&Центрировать Вид на Точке" -#: graphicswin.cpp:76 +#: graphicswin.cpp:94 msgid "Show Snap &Grid" msgstr "Показать &Сетку" -#: graphicswin.cpp:77 +#: graphicswin.cpp:95 msgid "Use &Perspective Projection" msgstr "Перспективная Прое&кция" -#: graphicswin.cpp:78 +#: graphicswin.cpp:96 msgid "Dimension &Units" msgstr "" -#: graphicswin.cpp:79 -msgid "Dimensions in &Inches" -msgstr "Размеры в Дю&ймах" - -#: graphicswin.cpp:80 +#: graphicswin.cpp:97 msgid "Dimensions in &Millimeters" msgstr "Размеры в Ми&ллиметрах" -#: graphicswin.cpp:81 +#: graphicswin.cpp:98 msgid "Dimensions in M&eters" msgstr "" -#: graphicswin.cpp:83 +#: graphicswin.cpp:99 +msgid "Dimensions in &Inches" +msgstr "Размеры в Дю&ймах" + +#: graphicswin.cpp:101 msgid "Show &Toolbar" msgstr "Показывать Па&нель Инструментов" -#: graphicswin.cpp:84 +#: graphicswin.cpp:102 msgid "Show Property Bro&wser" msgstr "Показывать Брау&зер" -#: graphicswin.cpp:86 +#: graphicswin.cpp:104 msgid "&Full Screen" msgstr "Полно&экранный Режим" -#: graphicswin.cpp:88 +#: graphicswin.cpp:106 msgid "&New Group" msgstr "&Группа" -#: graphicswin.cpp:89 +#: graphicswin.cpp:107 msgid "Sketch In &3d" msgstr "Создать Эскиз в &3d" -#: graphicswin.cpp:90 +#: graphicswin.cpp:108 msgid "Sketch In New &Workplane" msgstr "Создать Эскиз в Новой &Рабочей Плоскости" -#: graphicswin.cpp:92 +#: graphicswin.cpp:110 msgid "Step &Translating" msgstr "&Линейный Массив" -#: graphicswin.cpp:93 +#: graphicswin.cpp:111 msgid "Step &Rotating" msgstr "&Круговой Массив" -#: graphicswin.cpp:95 +#: graphicswin.cpp:113 msgid "E&xtrude" msgstr "Тело &Выдавливания" -#: graphicswin.cpp:96 +#: graphicswin.cpp:114 +msgid "&Helix" +msgstr "" + +#: graphicswin.cpp:115 msgid "&Lathe" msgstr "Тело В&ращения" -#: graphicswin.cpp:98 +#: graphicswin.cpp:116 +msgid "Re&volve" +msgstr "" + +#: graphicswin.cpp:118 msgid "Link / Assemble..." msgstr "&Импорт Детали / Сборка..." -#: graphicswin.cpp:99 +#: graphicswin.cpp:119 msgid "Link Recent" msgstr "Последние &Детали" -#: graphicswin.cpp:101 +#: graphicswin.cpp:121 msgid "&Sketch" msgstr "&Эскиз" -#: graphicswin.cpp:102 +#: graphicswin.cpp:122 msgid "In &Workplane" msgstr "В &Рабочей Плоскости" -#: graphicswin.cpp:103 +#: graphicswin.cpp:123 msgid "Anywhere In &3d" msgstr "Режим &3d" -#: graphicswin.cpp:105 +#: graphicswin.cpp:125 msgid "Datum &Point" msgstr "Опорная &Точка" -#: graphicswin.cpp:106 +#: graphicswin.cpp:126 msgid "&Workplane" msgstr "Рабочая &Плоскость" -#: graphicswin.cpp:108 +#: graphicswin.cpp:128 msgid "Line &Segment" msgstr "&Отрезок" -#: graphicswin.cpp:109 +#: graphicswin.cpp:129 msgid "C&onstruction Line Segment" msgstr "&Вспомогательный Отрезок" -#: graphicswin.cpp:110 +#: graphicswin.cpp:130 msgid "&Rectangle" msgstr "Прямоу&гольник" -#: graphicswin.cpp:111 +#: graphicswin.cpp:131 msgid "&Circle" msgstr "О&кружность" -#: graphicswin.cpp:112 +#: graphicswin.cpp:132 msgid "&Arc of a Circle" msgstr "Д&уга Окружности" -#: graphicswin.cpp:113 +#: graphicswin.cpp:133 msgid "&Bezier Cubic Spline" msgstr "Кубический &Сплайн Безье" -#: graphicswin.cpp:115 +#: graphicswin.cpp:135 msgid "&Text in TrueType Font" msgstr "Т&екст TrueType" -#: graphicswin.cpp:116 +#: graphicswin.cpp:136 msgid "&Image" -msgstr "" +msgstr "И&зображение" -#: graphicswin.cpp:118 +#: graphicswin.cpp:138 msgid "To&ggle Construction" msgstr "Переключить Режим Вс&помогательных Построений" -#: graphicswin.cpp:119 +#: graphicswin.cpp:139 msgid "Tangent &Arc at Point" msgstr "Кас&ательная в Точке" -#: graphicswin.cpp:120 +#: graphicswin.cpp:140 msgid "Split Curves at &Intersection" msgstr "Ра&збить Кривые Пересечением" -#: graphicswin.cpp:122 +#: graphicswin.cpp:142 msgid "&Constrain" msgstr "&Ограничения" -#: graphicswin.cpp:123 +#: graphicswin.cpp:143 msgid "&Distance / Diameter" msgstr "&Расстояние / Диаметр" -#: graphicswin.cpp:124 +#: graphicswin.cpp:144 msgid "Re&ference Dimension" msgstr "&Справочный Размер" -#: graphicswin.cpp:125 +#: graphicswin.cpp:145 msgid "A&ngle" msgstr "&Угол" -#: graphicswin.cpp:126 +#: graphicswin.cpp:146 msgid "Reference An&gle" msgstr "С&правочный Угол" -#: graphicswin.cpp:127 +#: graphicswin.cpp:147 msgid "Other S&upplementary Angle" msgstr "Переключить Сме&жный Угол" -#: graphicswin.cpp:128 +#: graphicswin.cpp:148 msgid "Toggle R&eference Dim" msgstr "Переключить Режим Размера Для Спра&вок" -#: graphicswin.cpp:130 +#: graphicswin.cpp:150 msgid "&Horizontal" msgstr "&Горизонтальность" -#: graphicswin.cpp:131 +#: graphicswin.cpp:151 msgid "&Vertical" msgstr "&Вертикальность" -#: graphicswin.cpp:133 +#: graphicswin.cpp:153 msgid "&On Point / Curve / Plane" msgstr "&Точка на Примитиве" -#: graphicswin.cpp:134 +#: graphicswin.cpp:154 msgid "E&qual Length / Radius / Angle" msgstr "&Равенство Длин / Радиусов / Углов" -#: graphicswin.cpp:135 +#: graphicswin.cpp:155 msgid "Length Ra&tio" msgstr "Отно&шение Длин" -#: graphicswin.cpp:136 +#: graphicswin.cpp:156 msgid "Length Diff&erence" msgstr "Ра&зница Длин" -#: graphicswin.cpp:137 +#: graphicswin.cpp:157 msgid "At &Midpoint" msgstr "&На Середине" -#: graphicswin.cpp:138 +#: graphicswin.cpp:158 msgid "S&ymmetric" msgstr "С&имметричность" -#: graphicswin.cpp:139 +#: graphicswin.cpp:159 msgid "Para&llel / Tangent" msgstr "Пара&ллельность / Касательность" -#: graphicswin.cpp:140 +#: graphicswin.cpp:160 msgid "&Perpendicular" msgstr "Перпендикул&ярность" -#: graphicswin.cpp:141 +#: graphicswin.cpp:161 msgid "Same Orient&ation" msgstr "Идентичная &Ориентация" -#: graphicswin.cpp:142 +#: graphicswin.cpp:162 msgid "Lock Point Where &Dragged" msgstr "За&фиксировать" -#: graphicswin.cpp:144 +#: graphicswin.cpp:164 msgid "Comment" msgstr "Текстовый &Комментарий" -#: graphicswin.cpp:146 +#: graphicswin.cpp:166 msgid "&Analyze" msgstr "&Анализ" -#: graphicswin.cpp:147 +#: graphicswin.cpp:167 msgid "Measure &Volume" msgstr "Измерить &Объем" -#: graphicswin.cpp:148 +#: graphicswin.cpp:168 msgid "Measure A&rea" msgstr "Измерить П&лощадь" -#: graphicswin.cpp:149 +#: graphicswin.cpp:169 msgid "Measure &Perimeter" msgstr "Измерить П&ериметр" -#: graphicswin.cpp:150 +#: graphicswin.cpp:170 msgid "Show &Interfering Parts" msgstr "Показать Пе&ресекающиеся Детали" -#: graphicswin.cpp:151 +#: graphicswin.cpp:171 msgid "Show &Naked Edges" msgstr "Показать Про&блемные Ребра" -#: graphicswin.cpp:152 +#: graphicswin.cpp:172 msgid "Show &Center of Mass" msgstr "" -#: graphicswin.cpp:154 -msgid "Show Degrees of &Freedom" -msgstr "Показать Степени С&вободы" +#: graphicswin.cpp:174 +msgid "Show &Underconstrained Points" +msgstr "" -#: graphicswin.cpp:156 +#: graphicswin.cpp:176 msgid "&Trace Point" msgstr "Включить &Трассировку Точки" -#: graphicswin.cpp:157 +#: graphicswin.cpp:177 msgid "&Stop Tracing..." msgstr "Остановить Тра&ссировку..." -#: graphicswin.cpp:158 +#: graphicswin.cpp:178 msgid "Step &Dimension..." msgstr "Плавное Из&менение Размера..." -#: graphicswin.cpp:160 +#: graphicswin.cpp:180 msgid "&Help" msgstr "&Помощь" -#: graphicswin.cpp:161 -msgid "&Website / Manual" -msgstr "Вебсайт / &Справка" - -#: graphicswin.cpp:162 +#: graphicswin.cpp:181 msgid "&Language" msgstr "&Язык" -#: graphicswin.cpp:164 +#: graphicswin.cpp:182 +msgid "&Website / Manual" +msgstr "Вебсайт / &Справка" + +#: graphicswin.cpp:184 msgid "&About" msgstr "О &Программе" -#: graphicswin.cpp:491 +#: graphicswin.cpp:352 +msgid "(no recent files)" +msgstr "(пусто)" + +#: graphicswin.cpp:360 +#, c-format +msgid "File '%s' does not exist." +msgstr "" + +#: graphicswin.cpp:721 msgid "No workplane is active, so the grid will not appear." msgstr "Сетку не будет видно, пока рабочая плоскость не активирована." -#: graphicswin.cpp:500 +#: graphicswin.cpp:730 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1053,16 +1120,16 @@ msgstr "" "перспективы на конфигурационной странице браузера.\n" "Значение по умолчанию 0.3." -#: graphicswin.cpp:581 +#: graphicswin.cpp:809 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "Выделите точку. Вид будет отцентрован по этой точке." -#: graphicswin.cpp:862 +#: graphicswin.cpp:1103 msgid "No additional entities share endpoints with the selected entities." msgstr "Нет дополнительных объектов, соединенных с выбранными примитивами." -#: graphicswin.cpp:882 +#: graphicswin.cpp:1121 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1071,7 +1138,7 @@ msgstr "" "принадлежащий импортированной детали или активируйте группу импортированной " "детали." -#: graphicswin.cpp:906 +#: graphicswin.cpp:1144 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1079,7 +1146,7 @@ msgstr "" "Рабочая плоскость не активна. Активируйте ее через Эскиз -> В Рабочей " "Плоскости чтобы определить плоскость для сетки." -#: graphicswin.cpp:913 +#: graphicswin.cpp:1151 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1088,13 +1155,13 @@ msgstr "" "текстовые комментарии или ограничения с размерными значениями. Чтобы " "привязать отрезок или другой примитив, выбирайте его точки." -#: graphicswin.cpp:979 +#: graphicswin.cpp:1239 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Рабочая плоскость не активна. Активирована рабочая плоскость по умолчанию " "для данной группы." -#: graphicswin.cpp:984 +#: graphicswin.cpp:1242 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-" @@ -1104,7 +1171,7 @@ msgstr "" "по умолчанию. Попробуйте выделить рабочую плоскость или создать новую с " "помощью Группа -> Создать Эскиз в Новой Рабочей Плоскости." -#: graphicswin.cpp:1008 +#: graphicswin.cpp:1263 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1113,53 +1180,53 @@ msgstr "" "точку, либо запустите команду без выделения, чтобы перейти к окну настроек " "этой команды." -#: graphicswin.cpp:1019 +#: graphicswin.cpp:1274 msgid "click point on arc (draws anti-clockwise)" msgstr "" "кликните мышью там, где хотите создать дугу окружности (дуга будет " "нарисована против часовой стрелки)" -#: graphicswin.cpp:1020 +#: graphicswin.cpp:1275 msgid "click to place datum point" msgstr "кликните мышью там, где хотите создать опорную точку" -#: graphicswin.cpp:1021 +#: graphicswin.cpp:1276 msgid "click first point of line segment" msgstr "кликните мышью там, где хотите создать первую точку отрезка" -#: graphicswin.cpp:1023 +#: graphicswin.cpp:1278 msgid "click first point of construction line segment" msgstr "" "кликните мышью там, где хотите создать первую точку вспомогательного отрезка" -#: graphicswin.cpp:1024 +#: graphicswin.cpp:1279 msgid "click first point of cubic segment" msgstr "" "кликните мышью там, где хотите создать первую точку кубического сплайна Безье" -#: graphicswin.cpp:1025 +#: graphicswin.cpp:1280 msgid "click center of circle" msgstr "кликните мышью там, где будет находиться центр окружности" -#: graphicswin.cpp:1026 +#: graphicswin.cpp:1281 msgid "click origin of workplane" msgstr "" "кликните мышью там, где будет находиться точка, через которую будет " "построена рабочая плоскость" -#: graphicswin.cpp:1027 +#: graphicswin.cpp:1282 msgid "click one corner of rectangle" msgstr "кликните мышью там, где будет находиться один из углов прямоугольника" -#: graphicswin.cpp:1028 +#: graphicswin.cpp:1283 msgid "click top left of text" msgstr "кликните мышью там, где хотите создать текст" -#: graphicswin.cpp:1034 +#: graphicswin.cpp:1289 msgid "click top left of image" msgstr "" -#: graphicswin.cpp:1047 +#: graphicswin.cpp:1301 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1167,12 +1234,12 @@ msgstr "" "Не выбран ни один примитив. Выберите примитивы перед тем, как переключать их " "режим дополнительных построений." -#: group.cpp:90 +#: group.cpp:86 msgctxt "group-name" msgid "sketch-in-3d" msgstr "эскиз-в-3d" -#: group.cpp:146 +#: group.cpp:142 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" @@ -1191,7 +1258,7 @@ msgstr "" "параллельная отрезкам)\n" " * рабочую плоскость (копия рабочей плоскости)\n" -#: group.cpp:158 +#: group.cpp:154 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1199,11 +1266,15 @@ msgstr "" "Выберите рабочую плоскость (Эскиз -> В Рабочей Плоскости) перед созданием " "группы выдавливания. Эскиз будет выдавлен по нормали к рабочей плоскости." -#: group.cpp:167 +#: group.cpp:163 msgctxt "group-name" msgid "extrude" msgstr "тело-выдавливания" +#: group.cpp:168 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "" + #: group.cpp:179 msgid "" "Bad selection for new lathe group. This group can be created with:\n" @@ -1226,7 +1297,43 @@ msgctxt "group-name" msgid "lathe" msgstr "тело-вращения" -#: group.cpp:202 +#: group.cpp:194 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:205 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:217 +msgctxt "group-name" +msgid "revolve" +msgstr "" + +#: group.cpp:222 +msgid "Helix operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:233 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:245 +msgctxt "group-name" +msgid "helix" +msgstr "" + +#: group.cpp:258 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1245,43 +1352,43 @@ msgstr "" "проходящей через точку и параллельной отрезку / нормали)\n" "\n" -#: group.cpp:215 +#: group.cpp:271 msgctxt "group-name" msgid "rotate" msgstr "круговой-массив" -#: group.cpp:226 +#: group.cpp:282 msgctxt "group-name" msgid "translate" msgstr "линейный-массив" -#: group.cpp:340 +#: group.cpp:400 msgid "(unnamed)" msgstr "(без имени)" -#: groupmesh.cpp:626 +#: groupmesh.cpp:689 msgid "not closed contour, or not all same style!" msgstr "незамкнутый контур или несовпадение стилей!" -#: groupmesh.cpp:639 +#: groupmesh.cpp:702 msgid "points not all coplanar!" msgstr "не все точки лежат в одной плоскости!" -#: groupmesh.cpp:641 +#: groupmesh.cpp:704 msgid "contour is self-intersecting!" msgstr "контур имеет самопересечения!" -#: groupmesh.cpp:643 +#: groupmesh.cpp:706 msgid "zero-length edge!" msgstr "вырожденный отрезок!" -#: modify.cpp:237 +#: modify.cpp:254 msgid "Must be sketching in workplane to create tangent arc." msgstr "" "Скругления эскиза можно создавать только когда рабочая плоскость " "активирована." -#: modify.cpp:284 +#: modify.cpp:301 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1289,7 +1396,7 @@ msgstr "" "Чтобы создать скругление эскиза, выберите точку, где соединяются два " "примитива, не принадлежащих к вспомогательной геометрии." -#: modify.cpp:371 +#: modify.cpp:388 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1297,369 +1404,310 @@ msgstr "" "Невозможно скруглить угол. Попробуйте радиус поменьше или создайте требуемую " "геометрию с помощью Ограничения -> Параллельность / Касательность." -#: modify.cpp:575 +#: modify.cpp:597 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" "Невозможно разделить такие примитивы. Выберите линии, окружности или " "кубические сплайны." -#: modify.cpp:601 +#: modify.cpp:624 msgid "Must be sketching in workplane to split." msgstr "" "Пересечение примитивов работает только когда рабочая плоскость активна." -#: modify.cpp:608 +#: modify.cpp:631 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" -#: modify.cpp:713 +#: modify.cpp:736 msgid "Can't split; no intersection found." msgstr "Невозможно разделить пересекаемые примитивы: пересечений нет." -#: mouse.cpp:522 +#: mouse.cpp:560 +msgid "Assign to Style" +msgstr "Применить Стиль" + +#: mouse.cpp:576 msgid "No Style" msgstr "Стиль по Умолчанию" -#: mouse.cpp:523 +#: mouse.cpp:579 msgid "Newly Created Custom Style..." msgstr "Создать Новый Стиль..." -#: mouse.cpp:571 -msgid "Assign to Style" -msgstr "Применить Стиль" - -#: mouse.cpp:574 +#: mouse.cpp:586 msgid "Group Info" msgstr "Настройки Группы" -#: mouse.cpp:577 +#: mouse.cpp:606 msgid "Style Info" msgstr "Настройки Стиля" -#: mouse.cpp:580 +#: mouse.cpp:626 msgid "Select Edge Chain" msgstr "Выделить Последовательность Примитивов" -#: mouse.cpp:585 +#: mouse.cpp:632 msgid "Toggle Reference Dimension" msgstr "Переключить Режим Размера Для Справок" -#: mouse.cpp:591 +#: mouse.cpp:638 msgid "Other Supplementary Angle" msgstr "Переключить Смежный Угол" -#: mouse.cpp:596 +#: mouse.cpp:643 msgid "Snap to Grid" msgstr "Привязать к Сетке" -#: mouse.cpp:604 +#: mouse.cpp:652 msgid "Remove Spline Point" msgstr "Удалить Точку Сплайна" -#: mouse.cpp:615 +#: mouse.cpp:687 msgid "Add Spline Point" msgstr "Добавить Точку Сплайна" -#: mouse.cpp:619 +#: mouse.cpp:691 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "" +"Невозможно добавить точку сплайна: достигнуто ограничение максимального " +"количества точек для сплайна." + +#: mouse.cpp:716 msgid "Toggle Construction" msgstr "Переключить Режим 'Дополнительные Построения'." -#: mouse.cpp:633 +#: mouse.cpp:731 msgid "Delete Point-Coincident Constraint" msgstr "Удалить Ограничение Совпадения Точек" -#: mouse.cpp:639 +#: mouse.cpp:750 msgid "Cut" msgstr "Вырезать" -#: mouse.cpp:640 +#: mouse.cpp:752 msgid "Copy" msgstr "Копировать" -#: mouse.cpp:643 +#: mouse.cpp:756 msgid "Select All" msgstr "Выделить Все" -#: mouse.cpp:647 +#: mouse.cpp:761 msgid "Paste" msgstr "Вставить" -#: mouse.cpp:648 +#: mouse.cpp:763 msgid "Paste Transformed..." msgstr "Вставить с Трансформацией..." -#: mouse.cpp:652 +#: mouse.cpp:768 msgid "Delete" msgstr "Удалить" -#: mouse.cpp:654 +#: mouse.cpp:771 msgid "Unselect All" msgstr "Сбросить Выделение" -#: mouse.cpp:660 +#: mouse.cpp:778 msgid "Unselect Hovered" msgstr "Снять Выделение с Выбранного" -#: mouse.cpp:665 +#: mouse.cpp:787 msgid "Zoom to Fit" msgstr "Показать Все" -#: mouse.cpp:805 -msgid "Cannot add spline point: maximum number of points reached." -msgstr "" -"Невозможно добавить точку сплайна: достигнуто ограничение максимального " -"количества точек для сплайна." - -#: mouse.cpp:1009 mouse.cpp:1292 +#: mouse.cpp:990 mouse.cpp:1277 msgid "click next point of line, or press Esc" msgstr "кликните мышью там, где хотите расположить следующую точку" -#: mouse.cpp:1015 +#: mouse.cpp:996 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" "Невозможно начертить прямоугольник, когда рабочая плоскость не активна." -#: mouse.cpp:1049 +#: mouse.cpp:1030 msgid "click to place other corner of rectangle" msgstr "кликните мышью там, где хотите расположить другой угол прямоугольника" -#: mouse.cpp:1069 +#: mouse.cpp:1050 msgid "click to set radius" msgstr "кликните, чтобы задать радиус" -#: mouse.cpp:1074 +#: mouse.cpp:1055 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать дугу, когда нет активной рабочей плоскости." -#: mouse.cpp:1093 +#: mouse.cpp:1074 msgid "click to place point" msgstr "кликните мышью там, где хотите создать точку" -#: mouse.cpp:1109 +#: mouse.cpp:1090 msgid "click next point of cubic, or press Esc" msgstr "" "кликните мышью там, где хотите создать следующую точку сплайна или нажмите " "Esc для завершения операции." -#: mouse.cpp:1114 +#: mouse.cpp:1095 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Рабочая плоскость уже активна. Перейдите в режим 3d перед созданием новой " "рабочей плоскости." -#: mouse.cpp:1130 +#: mouse.cpp:1111 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать текст, когда нет активной рабочей плоскости." -#: mouse.cpp:1146 -msgid "click to place bottom left of text" -msgstr "кликните мышью, чтобы расположить текст" +#: mouse.cpp:1128 +msgid "click to place bottom right of text" +msgstr "" -#: mouse.cpp:1152 +#: mouse.cpp:1134 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1178 +#: mouse.cpp:1161 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "КОММЕНТАРИЙ -- ДВОЙНОЙ ЩЕЛЧОК ДЛЯ РЕДАКТИРОВАНИЯ" -#: platform/cocoamain.mm:481 platform/gtkmain.cpp:607 platform/w32main.cpp:451 -#: platform/w32main.cpp:1388 -msgctxt "title" -msgid "(new sketch)" -msgstr "(новый проект)" - -#: platform/cocoamain.mm:710 platform/gtkmain.cpp:912 platform/w32main.cpp:1307 -msgid "(no recent files)" -msgstr "(пусто)" - -#: platform/cocoamain.mm:828 platform/gtkmain.cpp:1020 -msgid "untitled" -msgstr "без имени" +#: platform/gui.cpp:85 +msgctxt "file-type" +msgid "SolveSpace models" +msgstr "проекты SolveSpace" -#: platform/cocoamain.mm:860 -msgid "Do you want to save the changes you made to the new sketch?" -msgstr "Хотите сохранить ваши изменения?" +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "PNG image" +msgstr "PNG изображение" -#: platform/cocoamain.mm:862 -msgid "Your changes will be lost if you don't save them." -msgstr "Ваши изменения будут утеряны, если вы их не сохраните." +#: platform/gui.cpp:93 +msgctxt "file-type" +msgid "STL mesh" +msgstr "STL полигональная сетка" -#: platform/cocoamain.mm:863 -msgctxt "button" -msgid "Save" -msgstr "Сохранить" +#: platform/gui.cpp:94 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" +msgstr "Wavefront OBJ полигональная сетка" -#: platform/cocoamain.mm:864 platform/cocoamain.mm:905 -msgctxt "button" -msgid "Cancel" -msgstr "Отменить" +#: platform/gui.cpp:95 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" +msgstr "Three.js-совместимая полигональная сетка с просмторщиком" -#: platform/cocoamain.mm:865 -msgctxt "button" -msgid "Don't Save" -msgstr "Не Сохранять" +#: platform/gui.cpp:96 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "Three.js-совместимая полигональная сетка" -#: platform/cocoamain.mm:880 -msgid "An autosave file is available for this project." -msgstr "Файлы автосохранения доступны для данного проекта." +#: platform/gui.cpp:97 +msgctxt "file-type" +msgid "Q3D Object file" +msgstr "" -#: platform/cocoamain.mm:882 -msgid "Do you want to load the autosave file instead?" -msgstr "Хотите загрузить их вместо открываемого файла?" +#: platform/gui.cpp:98 +msgctxt "file-type" +msgid "VRML text file" +msgstr "" -#: platform/cocoamain.mm:883 -msgctxt "button" -msgid "Load" -msgstr "Загрузить Автосохранение" +#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +msgctxt "file-type" +msgid "STEP file" +msgstr "STEP файл" -#: platform/cocoamain.mm:884 -msgctxt "button" -msgid "Don't Load" -msgstr "Просто Открыть Файл" +#: platform/gui.cpp:106 +msgctxt "file-type" +msgid "PDF file" +msgstr "PDF документ" -#: platform/cocoamain.mm:900 -msgid "" -"Do you want to locate it manually?\n" -"If you select “No”, any geometry that depends on the missing file will be " -"removed." -msgstr "" -"Хотите найти их вручную?\n" -"Если вы ответите \"Нет\", то вся геометрия, которая зависит от " -"отсутствующего файла будет удалена." +#: platform/gui.cpp:107 +msgctxt "file-type" +msgid "Encapsulated PostScript" +msgstr "Encapsulated PostScript" -#: platform/cocoamain.mm:903 -msgctxt "button" -msgid "Yes" -msgstr "Да" +#: platform/gui.cpp:108 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "SVG изображение" -#: platform/cocoamain.mm:906 -msgctxt "button" -msgid "No" -msgstr "Нет" +#: platform/gui.cpp:110 platform/gui.cpp:117 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" +msgstr "DXF файл (AutoCAD 2007)" -#: platform/cocoamain.mm:1126 platform/w32main.cpp:183 -msgctxt "button" -msgid "OK" -msgstr "ХОРОШО" +#: platform/gui.cpp:111 +msgctxt "file-type" +msgid "HPGL file" +msgstr "HPGL файл" -#: platform/cocoamain.mm:1211 platform/gtkmain.cpp:1382 -#: platform/w32main.cpp:1410 platform/w32main.cpp:1450 -msgctxt "title" -msgid "Property Browser" -msgstr "Браузер" +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "G Code" +msgstr "G Code" -#: platform/gtkmain.cpp:968 -msgctxt "title" -msgid "Open File" -msgstr "Открыть Файл" +#: platform/gui.cpp:121 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" +msgstr "AutoCAD DXF и DWG файлы" -#: platform/gtkmain.cpp:970 -msgid "_Cancel" -msgstr "Отменить" +#: platform/gui.cpp:125 +msgctxt "file-type" +msgid "Comma-separated values" +msgstr "CSV файлы (значения, разделенные запятой)" -#: platform/gtkmain.cpp:971 -msgid "_Open" -msgstr "Открыть" +#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +msgid "untitled" +msgstr "без имени" -#: platform/gtkmain.cpp:1010 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "Сохранить Файл" -#: platform/gtkmain.cpp:1013 platform/gtkmain.cpp:1049 -#: platform/gtkmain.cpp:1097 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guiwin.cpp:1557 +msgctxt "title" +msgid "Open File" +msgstr "Открыть Файл" + +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 msgctxt "button" msgid "_Cancel" msgstr "Отменить" -#: platform/gtkmain.cpp:1014 platform/gtkmain.cpp:1047 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 msgctxt "button" msgid "_Save" msgstr "Сохранить" -#: platform/gtkmain.cpp:1042 platform/w32main.cpp:1167 -msgid "" -"The file has changed since it was last saved.\n" -"\n" -"Do you want to save the changes?" -msgstr "" -"Файл имеет несохраненные изменения.\n" -"\n" -"Хотите сохранить их?" - -#: platform/gtkmain.cpp:1046 platform/w32main.cpp:1169 -msgctxt "title" -msgid "Modified File" -msgstr "Измененный Файл" - -#: platform/gtkmain.cpp:1048 +#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 msgctxt "button" -msgid "Do_n't Save" -msgstr "Не Сохранять" - -#: platform/gtkmain.cpp:1066 platform/w32main.cpp:1193 -msgid "" -"An autosave file is available for this project.\n" -"\n" -"Do you want to load the autosave file instead?" +msgid "_Open" msgstr "" -"Файлы автосохранения доступны для данного проекта.\n" -"\n" -"Хотите загрузить их вместо открываемого файла?" - -#: platform/gtkmain.cpp:1070 platform/w32main.cpp:1195 -msgctxt "title" -msgid "Autosave Available" -msgstr "Автосохранение Доступно" - -#: platform/gtkmain.cpp:1071 -msgctxt "button" -msgid "_Load autosave" -msgstr "Загрузить Автосохранение" - -#: platform/gtkmain.cpp:1072 -msgctxt "button" -msgid "Do_n't Load" -msgstr "Не Загружать" - -#: platform/gtkmain.cpp:1093 platform/w32main.cpp:1223 -msgctxt "title" -msgid "Missing File" -msgstr "Файл Отсутствует" - -#: platform/gtkmain.cpp:1094 -msgctxt "button" -msgid "_Yes" -msgstr "Да" - -#: platform/gtkmain.cpp:1095 -msgctxt "button" -msgid "_No" -msgstr "Нет" -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 +#: solvespace.cpp:557 msgctxt "title" -msgid "Error" -msgstr "Ошибка" +msgid "(new sketch)" +msgstr "(новый проект)" -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 +#: solvespace.cpp:564 msgctxt "title" -msgid "Message" -msgstr "Сообщение" +msgid "Property Browser" +msgstr "Браузер" -#: style.cpp:160 +#: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -1667,27 +1715,27 @@ msgstr "" "Невозможно применить стиль к примитиву, который произошел от другого " "примитива. Попробуйте применить стиль к исходному примитиву." -#: style.cpp:659 +#: style.cpp:665 msgid "Style name cannot be empty" msgstr "Имя стиля не может быть пустым." -#: textscreens.cpp:662 +#: textscreens.cpp:741 msgid "Can't repeat fewer than 1 time." msgstr "Невозможно сделать повторение меньше, чем 1 раз." -#: textscreens.cpp:666 +#: textscreens.cpp:745 msgid "Can't repeat more than 999 times." msgstr "Невозможно сделать повтор больше, чем 999 раз." -#: textscreens.cpp:695 +#: textscreens.cpp:770 msgid "Group name cannot be empty" msgstr "Имя группы не может быть пустым." -#: textscreens.cpp:739 +#: textscreens.cpp:813 msgid "Opacity must be between zero and one." msgstr "Прозрачность должна быть числом от нуля до единицы." -#: textscreens.cpp:778 +#: textscreens.cpp:848 msgid "Radius cannot be zero or negative." msgstr "Радиус не может быть нулевым или отрицательным." @@ -1819,73 +1867,142 @@ msgstr "Ближайший изометрический вид" msgid "Align view to active workplane" msgstr "Выровнять вид на рабочую плоскость" -#: ui.h:69 -msgid "SolveSpace models" -msgstr "проекты SolveSpace" +#: util.cpp:165 +msgctxt "title" +msgid "Error" +msgstr "Ошибка" -#: ui.h:74 -msgid "PNG file" -msgstr "PNG изображение" +#: util.cpp:165 +msgctxt "title" +msgid "Message" +msgstr "Сообщение" -#: ui.h:79 -msgid "STL mesh" -msgstr "STL полигональная сетка" +#: util.cpp:170 +msgctxt "button" +msgid "&OK" +msgstr "ХОРОШО" -#: ui.h:80 -msgid "Wavefront OBJ mesh" -msgstr "Wavefront OBJ полигональная сетка" +#: view.cpp:78 +msgid "Scale cannot be zero or negative." +msgstr "Масштабный коэффициент не может быть нулевым или отрицательным." -#: ui.h:81 -msgid "Three.js-compatible mesh, with viewer" -msgstr "Three.js-совместимая полигональная сетка с просмторщиком" +#: view.cpp:90 view.cpp:99 +msgid "Bad format: specify x, y, z" +msgstr "Неверный формат: введите данные как x, y, z" -#: ui.h:82 -msgid "Three.js-compatible mesh, mesh only" -msgstr "Three.js-совместимая полигональная сетка" +#~ msgid "Specify between 0 and 8 digits after the decimal." +#~ msgstr "Введите число от 0 до 8." -#: ui.h:87 ui.h:95 ui.h:103 -msgid "STEP file" -msgstr "STEP файл" +#~ msgid "Show Degrees of &Freedom" +#~ msgstr "Показать Степени С&вободы" -#: ui.h:92 -msgid "PDF file" -msgstr "PDF документ" +#~ msgid "click to place bottom left of text" +#~ msgstr "кликните мышью, чтобы расположить текст" -#: ui.h:93 -msgid "Encapsulated PostScript" -msgstr "Encapsulated PostScript" +#~ msgid "Do you want to save the changes you made to the new sketch?" +#~ msgstr "Хотите сохранить ваши изменения?" -#: ui.h:94 -msgid "Scalable Vector Graphics" -msgstr "SVG изображение" +#~ msgid "Your changes will be lost if you don't save them." +#~ msgstr "Ваши изменения будут утеряны, если вы их не сохраните." -#: ui.h:96 ui.h:104 -msgid "DXF file (AutoCAD 2007)" -msgstr "DXF файл (AutoCAD 2007)" +#~ msgctxt "button" +#~ msgid "Save" +#~ msgstr "Сохранить" -#: ui.h:97 -msgid "HPGL file" -msgstr "HPGL файл" +#~ msgctxt "button" +#~ msgid "Cancel" +#~ msgstr "Отменить" -#: ui.h:98 -msgid "G Code" -msgstr "G Code" +#~ msgctxt "button" +#~ msgid "Don't Save" +#~ msgstr "Не Сохранять" -#: ui.h:109 -msgid "AutoCAD DXF and DWG files" -msgstr "AutoCAD DXF и DWG файлы" +#~ msgid "An autosave file is available for this project." +#~ msgstr "Файлы автосохранения доступны для данного проекта." -#: ui.h:114 -msgid "Comma-separated values" -msgstr "CSV файлы (значения, разделенные запятой)" +#~ msgid "Do you want to load the autosave file instead?" +#~ msgstr "Хотите загрузить их вместо открываемого файла?" -#: view.cpp:78 -msgid "Scale cannot be zero or negative." -msgstr "Масштабный коэффициент не может быть нулевым или отрицательным." +#~ msgctxt "button" +#~ msgid "Load" +#~ msgstr "Загрузить Автосохранение" -#: view.cpp:90 view.cpp:99 -msgid "Bad format: specify x, y, z" -msgstr "Неверный формат: введите данные как x, y, z" +#~ msgctxt "button" +#~ msgid "Don't Load" +#~ msgstr "Просто Открыть Файл" + +#~ msgid "" +#~ "Do you want to locate it manually?\n" +#~ "If you select “No”, any geometry that depends on the missing file will be " +#~ "removed." +#~ msgstr "" +#~ "Хотите найти их вручную?\n" +#~ "Если вы ответите \"Нет\", то вся геометрия, которая зависит от " +#~ "отсутствующего файла будет удалена." + +#~ msgctxt "button" +#~ msgid "Yes" +#~ msgstr "Да" + +#~ msgctxt "button" +#~ msgid "No" +#~ msgstr "Нет" + +#~ msgctxt "button" +#~ msgid "OK" +#~ msgstr "ХОРОШО" + +#~ msgid "_Cancel" +#~ msgstr "Отменить" + +#~ msgid "_Open" +#~ msgstr "Открыть" + +#~ msgid "" +#~ "The file has changed since it was last saved.\n" +#~ "\n" +#~ "Do you want to save the changes?" +#~ msgstr "" +#~ "Файл имеет несохраненные изменения.\n" +#~ "\n" +#~ "Хотите сохранить их?" + +#~ msgctxt "title" +#~ msgid "Modified File" +#~ msgstr "Измененный Файл" + +#~ msgctxt "button" +#~ msgid "Do_n't Save" +#~ msgstr "Не Сохранять" + +#~ msgid "" +#~ "An autosave file is available for this project.\n" +#~ "\n" +#~ "Do you want to load the autosave file instead?" +#~ msgstr "" +#~ "Файлы автосохранения доступны для данного проекта.\n" +#~ "\n" +#~ "Хотите загрузить их вместо открываемого файла?" + +#~ msgctxt "title" +#~ msgid "Autosave Available" +#~ msgstr "Автосохранение Доступно" + +#~ msgctxt "button" +#~ msgid "_Load autosave" +#~ msgstr "Загрузить Автосохранение" + +#~ msgctxt "button" +#~ msgid "Do_n't Load" +#~ msgstr "Не Загружать" + +#~ msgctxt "button" +#~ msgid "_Yes" +#~ msgstr "Да" + +#~ msgctxt "button" +#~ msgid "_No" +#~ msgstr "Нет" #~ msgid "" #~ "Select two entities that intersect each other (e.g. two lines or two " diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index b8982b56d..d4c052d1c 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -2,12 +2,11 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # AppSoft4 , 2017. -# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2018-07-12 22:40+0000\n" +"POT-Creation-Date: 2020-09-21 09:28+0200\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: appsoft@ua.fm\n" "Language-Team: OpenOrienteeringUkraine\n" @@ -32,63 +31,64 @@ msgstr "" msgid "Number of copies to paste must be at least one." msgstr "" -#: clipboard.cpp:354 textscreens.cpp:709 +#: clipboard.cpp:354 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "" -#: clipboard.cpp:392 +#: clipboard.cpp:396 msgid "Select one point to define origin of rotation." msgstr "" -#: clipboard.cpp:404 +#: clipboard.cpp:408 msgid "Select two points to define translation vector." msgstr "" -#: clipboard.cpp:414 +#: clipboard.cpp:418 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "" -#: clipboard.cpp:418 +#: clipboard.cpp:422 msgid "Too many items to paste; split this into smaller pastes." msgstr "" -#: clipboard.cpp:423 +#: clipboard.cpp:427 msgid "No workplane active." msgstr "" -#: confscreen.cpp:336 +#: confscreen.cpp:410 msgid "Bad format: specify coordinates as x, y, z" msgstr "" -#: confscreen.cpp:347 style.cpp:653 textscreens.cpp:730 +#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "" -#: confscreen.cpp:372 +#: confscreen.cpp:446 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." msgstr "" -#: confscreen.cpp:386 -msgid "Specify between 0 and 8 digits after the decimal." +#: confscreen.cpp:459 confscreen.cpp:469 +#, c-format +msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:398 +#: confscreen.cpp:481 msgid "Export scale must not be zero!" msgstr "" -#: confscreen.cpp:410 +#: confscreen.cpp:493 msgid "Cutter radius offset must not be negative!" msgstr "" -#: confscreen.cpp:464 +#: confscreen.cpp:547 msgid "Bad value: autosave interval should be positive" msgstr "" -#: confscreen.cpp:467 +#: confscreen.cpp:550 msgid "Bad format: specify interval in integral minutes" msgstr "" @@ -267,7 +267,7 @@ msgctxt "constr-name" msgid "comment" msgstr "" -#: constraint.cpp:160 +#: constraint.cpp:171 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -281,7 +281,7 @@ msgid "" " * a circle or an arc (diameter)\n" msgstr "" -#: constraint.cpp:213 +#: constraint.cpp:224 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -293,7 +293,7 @@ msgid "" " * a point and a plane face (point on face)\n" msgstr "" -#: constraint.cpp:275 +#: constraint.cpp:286 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -309,14 +309,14 @@ msgid "" " * a line segment and an arc (line segment length equals arc length)\n" msgstr "" -#: constraint.cpp:314 +#: constraint.cpp:325 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" msgstr "" -#: constraint.cpp:331 +#: constraint.cpp:342 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" @@ -324,7 +324,7 @@ msgid "" " * two line segments\n" msgstr "" -#: constraint.cpp:357 +#: constraint.cpp:368 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -332,7 +332,7 @@ msgid "" " * a line segment and a workplane (line's midpoint on plane)\n" msgstr "" -#: constraint.cpp:415 +#: constraint.cpp:426 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -344,19 +344,19 @@ msgid "" "workplane)\n" msgstr "" -#: constraint.cpp:429 +#: constraint.cpp:440 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." msgstr "" -#: constraint.cpp:459 +#: constraint.cpp:470 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." msgstr "" -#: constraint.cpp:472 +#: constraint.cpp:483 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -365,7 +365,7 @@ msgid "" " * a line segment\n" msgstr "" -#: constraint.cpp:493 +#: constraint.cpp:504 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -373,15 +373,15 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:545 +#: constraint.cpp:554 msgid "Must select an angle constraint." msgstr "" -#: constraint.cpp:557 +#: constraint.cpp:567 msgid "Must select a constraint with associated label." msgstr "" -#: constraint.cpp:568 +#: constraint.cpp:578 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -390,29 +390,29 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:625 +#: constraint.cpp:635 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." msgstr "" -#: constraint.cpp:649 +#: constraint.cpp:659 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." msgstr "" -#: constraint.cpp:659 +#: constraint.cpp:669 msgid "Curve-curve tangency must apply in workplane." msgstr "" -#: constraint.cpp:677 +#: constraint.cpp:687 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." msgstr "" -#: constraint.cpp:686 +#: constraint.cpp:696 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -423,7 +423,7 @@ msgid "" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" -#: constraint.cpp:704 +#: constraint.cpp:714 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -432,7 +432,7 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:719 +#: constraint.cpp:729 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -440,17 +440,17 @@ msgid "" " * a point\n" msgstr "" -#: constraint.cpp:730 +#: constraint.cpp:740 msgid "click center of comment text" msgstr "" -#: export.cpp:18 +#: export.cpp:19 msgid "" "No solid model present; draw one with extrudes and revolves, or use Export " "2d View to export bare lines and curves." msgstr "" -#: export.cpp:60 +#: export.cpp:61 msgid "" "Bad selection for export section. Please select:\n" "\n" @@ -460,7 +460,7 @@ msgid "" "lines)\n" msgstr "" -#: export.cpp:805 +#: export.cpp:822 msgid "Active group mesh is empty; nothing to export." msgstr "" @@ -472,17 +472,17 @@ msgstr "" msgid "zigzag lines were replaced with continuous lines" msgstr "" -#: exportvector.cpp:590 +#: exportvector.cpp:593 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" -#: exportvector.cpp:807 +#: exportvector.cpp:839 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" -#: file.cpp:44 group.cpp:95 +#: file.cpp:44 group.cpp:91 msgctxt "group-name" msgid "sketch-in-plane" msgstr "" @@ -492,437 +492,501 @@ msgctxt "group-name" msgid "#references" msgstr "" -#: file.cpp:539 +#: file.cpp:549 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." msgstr "" -#: graphicswin.cpp:29 +#: file.cpp:849 +msgctxt "title" +msgid "Missing File" +msgstr "" + +#: file.cpp:850 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "" + +#: file.cpp:852 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." +msgstr "" + +#: file.cpp:855 +msgctxt "button" +msgid "&Yes" +msgstr "" + +#: file.cpp:857 +msgctxt "button" +msgid "&No" +msgstr "" + +#: file.cpp:859 +msgctxt "button" +msgid "&Cancel" +msgstr "" + +#: graphicswin.cpp:41 msgid "&File" msgstr "&Файл" -#: graphicswin.cpp:30 +#: graphicswin.cpp:42 msgid "&New" msgstr "&Новий" -#: graphicswin.cpp:31 +#: graphicswin.cpp:43 msgid "&Open..." msgstr "&Відкрити..." -#: graphicswin.cpp:32 +#: graphicswin.cpp:44 msgid "Open &Recent" msgstr "Відкрити &Недавні" -#: graphicswin.cpp:33 +#: graphicswin.cpp:45 msgid "&Save" msgstr "&Зберегти" -#: graphicswin.cpp:34 +#: graphicswin.cpp:46 msgid "Save &As..." msgstr "Зберегти &Як..." -#: graphicswin.cpp:36 +#: graphicswin.cpp:48 msgid "Export &Image..." msgstr "Експортувати &Зображення..." -#: graphicswin.cpp:37 +#: graphicswin.cpp:49 msgid "Export 2d &View..." msgstr "Експортувати 2d &Вигляд..." -#: graphicswin.cpp:38 +#: graphicswin.cpp:50 msgid "Export 2d &Section..." msgstr "Експортувати 2d &Секцію..." -#: graphicswin.cpp:39 +#: graphicswin.cpp:51 msgid "Export 3d &Wireframe..." msgstr "Експортувати 3d &Скелет..." -#: graphicswin.cpp:40 +#: graphicswin.cpp:52 msgid "Export Triangle &Mesh..." msgstr "Експортувати Тригранний &Каркас..." -#: graphicswin.cpp:41 +#: graphicswin.cpp:53 msgid "Export &Surfaces..." msgstr "Експортувати &Поверхні..." -#: graphicswin.cpp:42 +#: graphicswin.cpp:54 msgid "Im&port..." msgstr "Ім&портувати..." -#: graphicswin.cpp:45 +#: graphicswin.cpp:57 msgid "E&xit" msgstr "В&ихід" -#: graphicswin.cpp:48 +#: graphicswin.cpp:60 msgid "&Edit" msgstr "&Редагувати" -#: graphicswin.cpp:49 +#: graphicswin.cpp:61 msgid "&Undo" msgstr "&Відмінити" -#: graphicswin.cpp:50 +#: graphicswin.cpp:62 msgid "&Redo" msgstr "&Повторити" -#: graphicswin.cpp:51 +#: graphicswin.cpp:63 msgid "Re&generate All" msgstr "Ре&генерувати Все" -#: graphicswin.cpp:53 +#: graphicswin.cpp:65 msgid "Snap Selection to &Grid" msgstr "Прикріпити Виділене до &Сітки" -#: graphicswin.cpp:54 +#: graphicswin.cpp:66 msgid "Rotate Imported &90°" msgstr "Обернути Імпортоване на &90°" -#: graphicswin.cpp:56 +#: graphicswin.cpp:68 msgid "Cu&t" msgstr "Ви&різати" -#: graphicswin.cpp:57 +#: graphicswin.cpp:69 msgid "&Copy" msgstr "&Копіювати" -#: graphicswin.cpp:58 +#: graphicswin.cpp:70 msgid "&Paste" msgstr "&Вставити" -#: graphicswin.cpp:59 +#: graphicswin.cpp:71 msgid "Paste &Transformed..." msgstr "Вставити &Трансфмованим..." -#: graphicswin.cpp:60 +#: graphicswin.cpp:72 msgid "&Delete" msgstr "&Delete" -#: graphicswin.cpp:62 +#: graphicswin.cpp:74 msgid "Select &Edge Chain" msgstr "Виділити Ланцуг &Ребер" -#: graphicswin.cpp:63 +#: graphicswin.cpp:75 msgid "Select &All" msgstr "Виділити &Усе" -#: graphicswin.cpp:64 +#: graphicswin.cpp:76 msgid "&Unselect All" msgstr "&Зняти Виділення з Усього" -#: graphicswin.cpp:66 +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "" + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "" + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "" + +#: graphicswin.cpp:84 msgid "&View" msgstr "&View" -#: graphicswin.cpp:67 +#: graphicswin.cpp:85 msgid "Zoom &In" msgstr "На&близити" -#: graphicswin.cpp:68 +#: graphicswin.cpp:86 msgid "Zoom &Out" msgstr "Від&далити" -#: graphicswin.cpp:69 +#: graphicswin.cpp:87 msgid "Zoom To &Fit" msgstr "Умістити на &Екрані" -#: graphicswin.cpp:71 +#: graphicswin.cpp:89 msgid "Align View to &Workplane" msgstr "Вирівняти Вигляд до Робочої &Площини" -#: graphicswin.cpp:72 +#: graphicswin.cpp:90 msgid "Nearest &Ortho View" msgstr "Найближчий &Ортогональний Вигляд" -#: graphicswin.cpp:73 +#: graphicswin.cpp:91 msgid "Nearest &Isometric View" msgstr "Найближчий &Ізометричний Вигляд" -#: graphicswin.cpp:74 +#: graphicswin.cpp:92 msgid "&Center View At Point" msgstr "&Центрувати Вигляд На Точці" -#: graphicswin.cpp:76 +#: graphicswin.cpp:94 msgid "Show Snap &Grid" msgstr "Показати &Сітку Прикріплення" -#: graphicswin.cpp:77 +#: graphicswin.cpp:95 msgid "Use &Perspective Projection" msgstr "Використовувати &Перспективну Проекцію" -#: graphicswin.cpp:78 +#: graphicswin.cpp:96 msgid "Dimension &Units" msgstr "" -#: graphicswin.cpp:79 -msgid "Dimensions in &Inches" -msgstr "Розміри в &Дюймах" - -#: graphicswin.cpp:80 +#: graphicswin.cpp:97 msgid "Dimensions in &Millimeters" msgstr "Розміри в &Міліметрах" -#: graphicswin.cpp:81 +#: graphicswin.cpp:98 msgid "Dimensions in M&eters" msgstr "" -#: graphicswin.cpp:83 +#: graphicswin.cpp:99 +msgid "Dimensions in &Inches" +msgstr "Розміри в &Дюймах" + +#: graphicswin.cpp:101 msgid "Show &Toolbar" msgstr "Показати Панель &Інструментів" -#: graphicswin.cpp:84 +#: graphicswin.cpp:102 msgid "Show Property Bro&wser" msgstr "Показати Вікно Власти&востей" -#: graphicswin.cpp:86 +#: graphicswin.cpp:104 msgid "&Full Screen" msgstr "&Повний Екран" -#: graphicswin.cpp:88 +#: graphicswin.cpp:106 msgid "&New Group" msgstr "&Нова Група" -#: graphicswin.cpp:89 +#: graphicswin.cpp:107 msgid "Sketch In &3d" msgstr "Креслення В &3d" -#: graphicswin.cpp:90 +#: graphicswin.cpp:108 msgid "Sketch In New &Workplane" msgstr "Креслення В Новій Робочій &Площині" -#: graphicswin.cpp:92 +#: graphicswin.cpp:110 msgid "Step &Translating" msgstr "Покрокове &Переміщення" -#: graphicswin.cpp:93 +#: graphicswin.cpp:111 msgid "Step &Rotating" msgstr "Покрокове &Обертання" -#: graphicswin.cpp:95 +#: graphicswin.cpp:113 msgid "E&xtrude" msgstr "Ви&давити" -#: graphicswin.cpp:96 +#: graphicswin.cpp:114 +msgid "&Helix" +msgstr "" + +#: graphicswin.cpp:115 msgid "&Lathe" msgstr "&Виточити" -#: graphicswin.cpp:98 +#: graphicswin.cpp:116 +msgid "Re&volve" +msgstr "" + +#: graphicswin.cpp:118 msgid "Link / Assemble..." msgstr "Приєднати / Монтувати..." -#: graphicswin.cpp:99 +#: graphicswin.cpp:119 msgid "Link Recent" msgstr "Приєднати Недавні" -#: graphicswin.cpp:101 +#: graphicswin.cpp:121 msgid "&Sketch" msgstr "&Креслення" -#: graphicswin.cpp:102 +#: graphicswin.cpp:122 msgid "In &Workplane" msgstr "В Робочій &Площині" -#: graphicswin.cpp:103 +#: graphicswin.cpp:123 msgid "Anywhere In &3d" msgstr "Будь-де В &3d" -#: graphicswin.cpp:105 +#: graphicswin.cpp:125 msgid "Datum &Point" msgstr "Опорна &Точка" -#: graphicswin.cpp:106 +#: graphicswin.cpp:126 msgid "&Workplane" msgstr "Робоча &Площина" -#: graphicswin.cpp:108 +#: graphicswin.cpp:128 msgid "Line &Segment" msgstr "&Відрізок Прямої" -#: graphicswin.cpp:109 +#: graphicswin.cpp:129 msgid "C&onstruction Line Segment" msgstr "Контсрук&ційний Відрізок Прямої" -#: graphicswin.cpp:110 +#: graphicswin.cpp:130 msgid "&Rectangle" msgstr "&Прямокутник" -#: graphicswin.cpp:111 +#: graphicswin.cpp:131 msgid "&Circle" msgstr "&Коло" -#: graphicswin.cpp:112 +#: graphicswin.cpp:132 msgid "&Arc of a Circle" msgstr "&Дуга Кола" -#: graphicswin.cpp:113 +#: graphicswin.cpp:133 msgid "&Bezier Cubic Spline" msgstr "Кубічний Сплайн &Без'є" -#: graphicswin.cpp:115 +#: graphicswin.cpp:135 msgid "&Text in TrueType Font" msgstr "&Текст з TrueType Шрифтом" -#: graphicswin.cpp:116 +#: graphicswin.cpp:136 msgid "&Image" msgstr "" -#: graphicswin.cpp:118 +#: graphicswin.cpp:138 msgid "To&ggle Construction" msgstr "Пере&мкнути Конструктивність" -#: graphicswin.cpp:119 +#: graphicswin.cpp:139 msgid "Tangent &Arc at Point" msgstr "Дотична &Дуга на Точці" -#: graphicswin.cpp:120 +#: graphicswin.cpp:140 msgid "Split Curves at &Intersection" msgstr "Розрізати Криві на &Перетині" -#: graphicswin.cpp:122 +#: graphicswin.cpp:142 msgid "&Constrain" msgstr "&Обмежити" -#: graphicswin.cpp:123 +#: graphicswin.cpp:143 msgid "&Distance / Diameter" msgstr "&Відстань / Діаметр" -#: graphicswin.cpp:124 +#: graphicswin.cpp:144 msgid "Re&ference Dimension" msgstr "Від&носний Розмір" -#: graphicswin.cpp:125 +#: graphicswin.cpp:145 msgid "A&ngle" msgstr "К&ут" -#: graphicswin.cpp:126 +#: graphicswin.cpp:146 msgid "Reference An&gle" msgstr "Відносний К&ут" -#: graphicswin.cpp:127 +#: graphicswin.cpp:147 msgid "Other S&upplementary Angle" msgstr "Інший Су&міжний Кут" -#: graphicswin.cpp:128 +#: graphicswin.cpp:148 msgid "Toggle R&eference Dim" msgstr "Перемкнути Від&носність Розмірів" -#: graphicswin.cpp:130 +#: graphicswin.cpp:150 msgid "&Horizontal" msgstr "&Горизонтально" -#: graphicswin.cpp:131 +#: graphicswin.cpp:151 msgid "&Vertical" msgstr "&Вертикально" -#: graphicswin.cpp:133 +#: graphicswin.cpp:153 msgid "&On Point / Curve / Plane" msgstr "&На точці / Кривій / Площині" -#: graphicswin.cpp:134 +#: graphicswin.cpp:154 msgid "E&qual Length / Radius / Angle" msgstr "Рі&вні Довжина / Радіус / Кут" -#: graphicswin.cpp:135 +#: graphicswin.cpp:155 msgid "Length Ra&tio" msgstr "Про&порція Довжин" -#: graphicswin.cpp:136 +#: graphicswin.cpp:156 msgid "Length Diff&erence" msgstr "Рі&зниця Довжин" -#: graphicswin.cpp:137 +#: graphicswin.cpp:157 msgid "At &Midpoint" msgstr "До &Середини" -#: graphicswin.cpp:138 +#: graphicswin.cpp:158 msgid "S&ymmetric" msgstr "Си&метрично" -#: graphicswin.cpp:139 +#: graphicswin.cpp:159 msgid "Para&llel / Tangent" msgstr "Пара&лельно / Дотична" -#: graphicswin.cpp:140 +#: graphicswin.cpp:160 msgid "&Perpendicular" msgstr "&Препендикулярно" -#: graphicswin.cpp:141 +#: graphicswin.cpp:161 msgid "Same Orient&ation" msgstr "Однакова Орієн&тація" -#: graphicswin.cpp:142 +#: graphicswin.cpp:162 msgid "Lock Point Where &Dragged" msgstr "Фіксувати Точку Після &Переміщення" -#: graphicswin.cpp:144 +#: graphicswin.cpp:164 msgid "Comment" msgstr "Коментар" -#: graphicswin.cpp:146 +#: graphicswin.cpp:166 msgid "&Analyze" msgstr "&Аналізувати" -#: graphicswin.cpp:147 +#: graphicswin.cpp:167 msgid "Measure &Volume" msgstr "Обрахувати &Об'єм" -#: graphicswin.cpp:148 +#: graphicswin.cpp:168 msgid "Measure A&rea" msgstr "Обрахувати Пл&ощу" -#: graphicswin.cpp:149 +#: graphicswin.cpp:169 msgid "Measure &Perimeter" msgstr "Обрахувати &Периметр" -#: graphicswin.cpp:150 +#: graphicswin.cpp:170 msgid "Show &Interfering Parts" msgstr "Показати &Дотичні Частини" -#: graphicswin.cpp:151 +#: graphicswin.cpp:171 msgid "Show &Naked Edges" msgstr "Показати &Приховані Ребра" -#: graphicswin.cpp:152 +#: graphicswin.cpp:172 msgid "Show &Center of Mass" msgstr "" -#: graphicswin.cpp:154 -msgid "Show Degrees of &Freedom" -msgstr "Показати Степені &Свободи" +#: graphicswin.cpp:174 +msgid "Show &Underconstrained Points" +msgstr "" -#: graphicswin.cpp:156 +#: graphicswin.cpp:176 msgid "&Trace Point" msgstr "&Трасувати Точку" -#: graphicswin.cpp:157 +#: graphicswin.cpp:177 msgid "&Stop Tracing..." msgstr "&Зупити Трасування..." -#: graphicswin.cpp:158 +#: graphicswin.cpp:178 msgid "Step &Dimension..." msgstr "Прорахувати &Розмір..." -#: graphicswin.cpp:160 +#: graphicswin.cpp:180 msgid "&Help" msgstr "&Довідка" -#: graphicswin.cpp:161 -msgid "&Website / Manual" -msgstr "&Вебсайт / Посібник" - -#: graphicswin.cpp:162 +#: graphicswin.cpp:181 msgid "&Language" msgstr "&Мова" -#: graphicswin.cpp:164 +#: graphicswin.cpp:182 +msgid "&Website / Manual" +msgstr "&Вебсайт / Посібник" + +#: graphicswin.cpp:184 msgid "&About" msgstr "&Про програму" -#: graphicswin.cpp:491 +#: graphicswin.cpp:352 +msgid "(no recent files)" +msgstr "" + +#: graphicswin.cpp:360 +#, c-format +msgid "File '%s' does not exist." +msgstr "" + +#: graphicswin.cpp:721 msgid "No workplane is active, so the grid will not appear." msgstr "" -#: graphicswin.cpp:500 +#: graphicswin.cpp:730 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -931,102 +995,102 @@ msgid "" "configuration screen. A value around 0.3 is typical." msgstr "" -#: graphicswin.cpp:581 +#: graphicswin.cpp:809 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:862 +#: graphicswin.cpp:1103 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:882 +#: graphicswin.cpp:1121 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:906 +#: graphicswin.cpp:1144 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -#: graphicswin.cpp:913 +#: graphicswin.cpp:1151 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:979 +#: graphicswin.cpp:1239 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:984 +#: graphicswin.cpp:1242 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:1008 +#: graphicswin.cpp:1263 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -#: graphicswin.cpp:1019 +#: graphicswin.cpp:1274 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1020 +#: graphicswin.cpp:1275 msgid "click to place datum point" msgstr "" -#: graphicswin.cpp:1021 +#: graphicswin.cpp:1276 msgid "click first point of line segment" msgstr "" -#: graphicswin.cpp:1023 +#: graphicswin.cpp:1278 msgid "click first point of construction line segment" msgstr "" -#: graphicswin.cpp:1024 +#: graphicswin.cpp:1279 msgid "click first point of cubic segment" msgstr "" -#: graphicswin.cpp:1025 +#: graphicswin.cpp:1280 msgid "click center of circle" msgstr "" -#: graphicswin.cpp:1026 +#: graphicswin.cpp:1281 msgid "click origin of workplane" msgstr "" -#: graphicswin.cpp:1027 +#: graphicswin.cpp:1282 msgid "click one corner of rectangle" msgstr "" -#: graphicswin.cpp:1028 +#: graphicswin.cpp:1283 msgid "click top left of text" msgstr "" -#: graphicswin.cpp:1034 +#: graphicswin.cpp:1289 msgid "click top left of image" msgstr "" -#: graphicswin.cpp:1047 +#: graphicswin.cpp:1301 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." msgstr "" -#: group.cpp:90 +#: group.cpp:86 msgctxt "group-name" msgid "sketch-in-3d" msgstr "" -#: group.cpp:146 +#: group.cpp:142 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" @@ -1036,17 +1100,21 @@ msgid "" " * a workplane (copy of the workplane)\n" msgstr "" -#: group.cpp:158 +#: group.cpp:154 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." msgstr "" -#: group.cpp:167 +#: group.cpp:163 msgctxt "group-name" msgid "extrude" msgstr "" +#: group.cpp:168 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "" + #: group.cpp:179 msgid "" "Bad selection for new lathe group. This group can be created with:\n" @@ -1061,7 +1129,43 @@ msgctxt "group-name" msgid "lathe" msgstr "" -#: group.cpp:202 +#: group.cpp:194 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:205 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:217 +msgctxt "group-name" +msgid "revolve" +msgstr "" + +#: group.cpp:222 +msgid "Helix operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:233 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:245 +msgctxt "group-name" +msgid "helix" +msgstr "" + +#: group.cpp:258 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1071,422 +1175,372 @@ msgid "" "point, and parallel to line / normal)\n" msgstr "" -#: group.cpp:215 +#: group.cpp:271 msgctxt "group-name" msgid "rotate" msgstr "" -#: group.cpp:226 +#: group.cpp:282 msgctxt "group-name" msgid "translate" msgstr "" -#: group.cpp:340 +#: group.cpp:400 msgid "(unnamed)" msgstr "" -#: groupmesh.cpp:626 +#: groupmesh.cpp:689 msgid "not closed contour, or not all same style!" msgstr "" -#: groupmesh.cpp:639 +#: groupmesh.cpp:702 msgid "points not all coplanar!" msgstr "" -#: groupmesh.cpp:641 +#: groupmesh.cpp:704 msgid "contour is self-intersecting!" msgstr "" -#: groupmesh.cpp:643 +#: groupmesh.cpp:706 msgid "zero-length edge!" msgstr "" -#: modify.cpp:237 +#: modify.cpp:254 msgid "Must be sketching in workplane to create tangent arc." msgstr "" -#: modify.cpp:284 +#: modify.cpp:301 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." msgstr "" -#: modify.cpp:371 +#: modify.cpp:388 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." msgstr "" -#: modify.cpp:575 +#: modify.cpp:597 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" -#: modify.cpp:601 +#: modify.cpp:624 msgid "Must be sketching in workplane to split." msgstr "" -#: modify.cpp:608 +#: modify.cpp:631 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" -#: modify.cpp:713 +#: modify.cpp:736 msgid "Can't split; no intersection found." msgstr "" -#: mouse.cpp:522 +#: mouse.cpp:560 +msgid "Assign to Style" +msgstr "Встановити Стиль" + +#: mouse.cpp:576 msgid "No Style" msgstr "Без Стилю" -#: mouse.cpp:523 +#: mouse.cpp:579 msgid "Newly Created Custom Style..." msgstr "Створити Користувацький Стиль..." -#: mouse.cpp:571 -msgid "Assign to Style" -msgstr "Встановити Стиль" - -#: mouse.cpp:574 +#: mouse.cpp:586 msgid "Group Info" msgstr "Параметри Групи" -#: mouse.cpp:577 +#: mouse.cpp:606 msgid "Style Info" msgstr "Параметри Стилю" -#: mouse.cpp:580 +#: mouse.cpp:626 msgid "Select Edge Chain" msgstr "Виділити Ланцюг Ребер" -#: mouse.cpp:585 +#: mouse.cpp:632 msgid "Toggle Reference Dimension" msgstr "Перемкнути Відносність Розміру" -#: mouse.cpp:591 +#: mouse.cpp:638 msgid "Other Supplementary Angle" msgstr "Інший Суміжний Кут" -#: mouse.cpp:596 +#: mouse.cpp:643 msgid "Snap to Grid" msgstr "Прикріпити до Сітки" -#: mouse.cpp:604 +#: mouse.cpp:652 msgid "Remove Spline Point" msgstr "Видалити Точку Сплайну" -#: mouse.cpp:615 +#: mouse.cpp:687 msgid "Add Spline Point" msgstr "Додати Точку Сплайну" -#: mouse.cpp:619 +#: mouse.cpp:691 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "" + +#: mouse.cpp:716 msgid "Toggle Construction" msgstr "Пермкнути Конструктивність" -#: mouse.cpp:633 +#: mouse.cpp:731 msgid "Delete Point-Coincident Constraint" msgstr "Роз'єднати З'єднання Точок" -#: mouse.cpp:639 +#: mouse.cpp:750 msgid "Cut" msgstr "Вирізати" -#: mouse.cpp:640 +#: mouse.cpp:752 msgid "Copy" msgstr "Копіювати" -#: mouse.cpp:643 +#: mouse.cpp:756 msgid "Select All" msgstr "Виділити Усе" -#: mouse.cpp:647 +#: mouse.cpp:761 msgid "Paste" msgstr "Вставити" -#: mouse.cpp:648 +#: mouse.cpp:763 msgid "Paste Transformed..." msgstr "Вставити Трансформованим..." -#: mouse.cpp:652 +#: mouse.cpp:768 msgid "Delete" msgstr "Видалити" -#: mouse.cpp:654 +#: mouse.cpp:771 msgid "Unselect All" msgstr "Зняти Виділення з Усього" -#: mouse.cpp:660 +#: mouse.cpp:778 msgid "Unselect Hovered" msgstr "Зняти Виділення з Наведеного" -#: mouse.cpp:665 +#: mouse.cpp:787 msgid "Zoom to Fit" msgstr "Умістити на Екрані" -#: mouse.cpp:805 -msgid "Cannot add spline point: maximum number of points reached." -msgstr "" - -#: mouse.cpp:1009 mouse.cpp:1292 +#: mouse.cpp:990 mouse.cpp:1277 msgid "click next point of line, or press Esc" msgstr "" -#: mouse.cpp:1015 +#: mouse.cpp:996 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1049 +#: mouse.cpp:1030 msgid "click to place other corner of rectangle" msgstr "" -#: mouse.cpp:1069 +#: mouse.cpp:1050 msgid "click to set radius" msgstr "" -#: mouse.cpp:1074 +#: mouse.cpp:1055 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1093 +#: mouse.cpp:1074 msgid "click to place point" msgstr "" -#: mouse.cpp:1109 +#: mouse.cpp:1090 msgid "click next point of cubic, or press Esc" msgstr "" -#: mouse.cpp:1114 +#: mouse.cpp:1095 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" -#: mouse.cpp:1130 +#: mouse.cpp:1111 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1146 -msgid "click to place bottom left of text" +#: mouse.cpp:1128 +msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1152 +#: mouse.cpp:1134 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1178 +#: mouse.cpp:1161 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" -#: platform/cocoamain.mm:481 platform/gtkmain.cpp:607 platform/w32main.cpp:451 -#: platform/w32main.cpp:1388 -msgctxt "title" -msgid "(new sketch)" -msgstr "" - -#: platform/cocoamain.mm:710 platform/gtkmain.cpp:912 platform/w32main.cpp:1307 -msgid "(no recent files)" -msgstr "" - -#: platform/cocoamain.mm:828 platform/gtkmain.cpp:1020 -msgid "untitled" +#: platform/gui.cpp:85 +msgctxt "file-type" +msgid "SolveSpace models" msgstr "" -#: platform/cocoamain.mm:860 -msgid "Do you want to save the changes you made to the new sketch?" +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "PNG image" msgstr "" -#: platform/cocoamain.mm:862 -msgid "Your changes will be lost if you don't save them." +#: platform/gui.cpp:93 +msgctxt "file-type" +msgid "STL mesh" msgstr "" -#: platform/cocoamain.mm:863 -msgctxt "button" -msgid "Save" +#: platform/gui.cpp:94 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" msgstr "" -#: platform/cocoamain.mm:864 platform/cocoamain.mm:905 -msgctxt "button" -msgid "Cancel" +#: platform/gui.cpp:95 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" msgstr "" -#: platform/cocoamain.mm:865 -msgctxt "button" -msgid "Don't Save" +#: platform/gui.cpp:96 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" msgstr "" -#: platform/cocoamain.mm:880 -msgid "An autosave file is available for this project." +#: platform/gui.cpp:97 +msgctxt "file-type" +msgid "Q3D Object file" msgstr "" -#: platform/cocoamain.mm:882 -msgid "Do you want to load the autosave file instead?" +#: platform/gui.cpp:98 +msgctxt "file-type" +msgid "VRML text file" msgstr "" -#: platform/cocoamain.mm:883 -msgctxt "button" -msgid "Load" +#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +msgctxt "file-type" +msgid "STEP file" msgstr "" -#: platform/cocoamain.mm:884 -msgctxt "button" -msgid "Don't Load" +#: platform/gui.cpp:106 +msgctxt "file-type" +msgid "PDF file" msgstr "" -#: platform/cocoamain.mm:900 -msgid "" -"Do you want to locate it manually?\n" -"If you select “No”, any geometry that depends on the missing file will be " -"removed." +#: platform/gui.cpp:107 +msgctxt "file-type" +msgid "Encapsulated PostScript" msgstr "" -#: platform/cocoamain.mm:903 -msgctxt "button" -msgid "Yes" +#: platform/gui.cpp:108 +msgctxt "file-type" +msgid "Scalable Vector Graphics" msgstr "" -#: platform/cocoamain.mm:906 -msgctxt "button" -msgid "No" +#: platform/gui.cpp:110 platform/gui.cpp:117 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/cocoamain.mm:1126 platform/w32main.cpp:183 -msgctxt "button" -msgid "OK" +#: platform/gui.cpp:111 +msgctxt "file-type" +msgid "HPGL file" msgstr "" -#: platform/cocoamain.mm:1211 platform/gtkmain.cpp:1382 -#: platform/w32main.cpp:1410 platform/w32main.cpp:1450 -msgctxt "title" -msgid "Property Browser" +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "G Code" msgstr "" -#: platform/gtkmain.cpp:968 -msgctxt "title" -msgid "Open File" +#: platform/gui.cpp:121 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gtkmain.cpp:970 -msgid "_Cancel" +#: platform/gui.cpp:125 +msgctxt "file-type" +msgid "Comma-separated values" msgstr "" -#: platform/gtkmain.cpp:971 -msgid "_Open" +#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +msgid "untitled" msgstr "" -#: platform/gtkmain.cpp:1010 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "" -#: platform/gtkmain.cpp:1013 platform/gtkmain.cpp:1049 -#: platform/gtkmain.cpp:1097 -msgctxt "button" -msgid "_Cancel" -msgstr "" - -#: platform/gtkmain.cpp:1014 platform/gtkmain.cpp:1047 -msgctxt "button" -msgid "_Save" -msgstr "" - -#: platform/gtkmain.cpp:1042 platform/w32main.cpp:1167 -msgid "" -"The file has changed since it was last saved.\n" -"\n" -"Do you want to save the changes?" -msgstr "" - -#: platform/gtkmain.cpp:1046 platform/w32main.cpp:1169 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guiwin.cpp:1557 msgctxt "title" -msgid "Modified File" -msgstr "" - -#: platform/gtkmain.cpp:1048 -msgctxt "button" -msgid "Do_n't Save" -msgstr "" - -#: platform/gtkmain.cpp:1066 platform/w32main.cpp:1193 -msgid "" -"An autosave file is available for this project.\n" -"\n" -"Do you want to load the autosave file instead?" -msgstr "" - -#: platform/gtkmain.cpp:1070 platform/w32main.cpp:1195 -msgctxt "title" -msgid "Autosave Available" -msgstr "" - -#: platform/gtkmain.cpp:1071 -msgctxt "button" -msgid "_Load autosave" +msgid "Open File" msgstr "" -#: platform/gtkmain.cpp:1072 +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 msgctxt "button" -msgid "Do_n't Load" -msgstr "" - -#: platform/gtkmain.cpp:1093 platform/w32main.cpp:1223 -msgctxt "title" -msgid "Missing File" +msgid "_Cancel" msgstr "" -#: platform/gtkmain.cpp:1094 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 msgctxt "button" -msgid "_Yes" +msgid "_Save" msgstr "" -#: platform/gtkmain.cpp:1095 +#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 msgctxt "button" -msgid "_No" +msgid "_Open" msgstr "" -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 +#: solvespace.cpp:557 msgctxt "title" -msgid "Error" +msgid "(new sketch)" msgstr "" -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 +#: solvespace.cpp:564 msgctxt "title" -msgid "Message" +msgid "Property Browser" msgstr "" -#: style.cpp:160 +#: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." msgstr "" -#: style.cpp:659 +#: style.cpp:665 msgid "Style name cannot be empty" msgstr "" -#: textscreens.cpp:662 +#: textscreens.cpp:741 msgid "Can't repeat fewer than 1 time." msgstr "" -#: textscreens.cpp:666 +#: textscreens.cpp:745 msgid "Can't repeat more than 999 times." msgstr "" -#: textscreens.cpp:695 +#: textscreens.cpp:770 msgid "Group name cannot be empty" msgstr "" -#: textscreens.cpp:739 +#: textscreens.cpp:813 msgid "Opacity must be between zero and one." msgstr "" -#: textscreens.cpp:778 +#: textscreens.cpp:848 msgid "Radius cannot be zero or negative." msgstr "" @@ -1618,64 +1672,19 @@ msgstr "Найближчий ізометричний вигляд" msgid "Align view to active workplane" msgstr "Вирівняти вигляд до активної робочої площини" -#: ui.h:69 -msgid "SolveSpace models" -msgstr "" - -#: ui.h:74 -msgid "PNG file" -msgstr "" - -#: ui.h:79 -msgid "STL mesh" -msgstr "" - -#: ui.h:80 -msgid "Wavefront OBJ mesh" -msgstr "" - -#: ui.h:81 -msgid "Three.js-compatible mesh, with viewer" -msgstr "" - -#: ui.h:82 -msgid "Three.js-compatible mesh, mesh only" -msgstr "" - -#: ui.h:87 ui.h:95 ui.h:103 -msgid "STEP file" -msgstr "" - -#: ui.h:92 -msgid "PDF file" -msgstr "" - -#: ui.h:93 -msgid "Encapsulated PostScript" -msgstr "" - -#: ui.h:94 -msgid "Scalable Vector Graphics" -msgstr "" - -#: ui.h:96 ui.h:104 -msgid "DXF file (AutoCAD 2007)" -msgstr "" - -#: ui.h:97 -msgid "HPGL file" -msgstr "" - -#: ui.h:98 -msgid "G Code" +#: util.cpp:165 +msgctxt "title" +msgid "Error" msgstr "" -#: ui.h:109 -msgid "AutoCAD DXF and DWG files" +#: util.cpp:165 +msgctxt "title" +msgid "Message" msgstr "" -#: ui.h:114 -msgid "Comma-separated values" +#: util.cpp:170 +msgctxt "button" +msgid "&OK" msgstr "" #: view.cpp:78 @@ -1686,5 +1695,8 @@ msgstr "" msgid "Bad format: specify x, y, z" msgstr "" +#~ msgid "Show Degrees of &Freedom" +#~ msgstr "Показати Степені &Свободи" + #~ msgid "Show Menu &Bar" #~ msgstr "Показати Панель &Меню" diff --git a/res/messages.pot b/res/messages.pot index e58b9cf3c..8ea9c85ba 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2018-07-12 22:40+0000\n" +"POT-Creation-Date: 2020-09-21 09:28+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -32,60 +32,61 @@ msgstr "" msgid "Number of copies to paste must be at least one." msgstr "" -#: clipboard.cpp:354 textscreens.cpp:709 +#: clipboard.cpp:354 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "" -#: clipboard.cpp:392 +#: clipboard.cpp:396 msgid "Select one point to define origin of rotation." msgstr "" -#: clipboard.cpp:404 +#: clipboard.cpp:408 msgid "Select two points to define translation vector." msgstr "" -#: clipboard.cpp:414 +#: clipboard.cpp:418 msgid "Transformation is identity. So all copies will be exactly on top of each other." msgstr "" -#: clipboard.cpp:418 +#: clipboard.cpp:422 msgid "Too many items to paste; split this into smaller pastes." msgstr "" -#: clipboard.cpp:423 +#: clipboard.cpp:427 msgid "No workplane active." msgstr "" -#: confscreen.cpp:336 +#: confscreen.cpp:410 msgid "Bad format: specify coordinates as x, y, z" msgstr "" -#: confscreen.cpp:347 style.cpp:653 textscreens.cpp:730 +#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "" -#: confscreen.cpp:372 +#: confscreen.cpp:446 msgid "" "The perspective factor will have no effect until you enable View -> Use Perspective Projection." msgstr "" -#: confscreen.cpp:386 -msgid "Specify between 0 and 8 digits after the decimal." +#: confscreen.cpp:459 confscreen.cpp:469 +#, c-format +msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:398 +#: confscreen.cpp:481 msgid "Export scale must not be zero!" msgstr "" -#: confscreen.cpp:410 +#: confscreen.cpp:493 msgid "Cutter radius offset must not be negative!" msgstr "" -#: confscreen.cpp:464 +#: confscreen.cpp:547 msgid "Bad value: autosave interval should be positive" msgstr "" -#: confscreen.cpp:467 +#: confscreen.cpp:550 msgid "Bad format: specify interval in integral minutes" msgstr "" @@ -264,7 +265,7 @@ msgctxt "constr-name" msgid "comment" msgstr "" -#: constraint.cpp:160 +#: constraint.cpp:171 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply to:\n" "\n" @@ -277,7 +278,7 @@ msgid "" " * a circle or an arc (diameter)\n" msgstr "" -#: constraint.cpp:213 +#: constraint.cpp:224 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can apply to:\n" "\n" @@ -288,7 +289,7 @@ msgid "" " * a point and a plane face (point on face)\n" msgstr "" -#: constraint.cpp:275 +#: constraint.cpp:286 msgid "" "Bad selection for equal length / radius constraint. This constraint can apply to:\n" "\n" @@ -302,21 +303,21 @@ msgid "" " * a line segment and an arc (line segment length equals arc length)\n" msgstr "" -#: constraint.cpp:314 +#: constraint.cpp:325 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" msgstr "" -#: constraint.cpp:331 +#: constraint.cpp:342 msgid "" "Bad selection for length difference constraint. This constraint can apply to:\n" "\n" " * two line segments\n" msgstr "" -#: constraint.cpp:357 +#: constraint.cpp:368 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -324,7 +325,7 @@ msgid "" " * a line segment and a workplane (line's midpoint on plane)\n" msgstr "" -#: constraint.cpp:415 +#: constraint.cpp:426 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -333,17 +334,17 @@ msgid "" " * workplane, and two points or a line segment (symmetric about workplane)\n" msgstr "" -#: constraint.cpp:429 +#: constraint.cpp:440 msgid "A workplane must be active when constraining symmetric without an explicit symmetry plane." msgstr "" -#: constraint.cpp:459 +#: constraint.cpp:470 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a horizontal or vertical " "constraint." msgstr "" -#: constraint.cpp:472 +#: constraint.cpp:483 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can apply to:\n" "\n" @@ -351,22 +352,22 @@ msgid "" " * a line segment\n" msgstr "" -#: constraint.cpp:493 +#: constraint.cpp:504 msgid "" "Bad selection for same orientation constraint. This constraint can apply to:\n" "\n" " * two normals\n" msgstr "" -#: constraint.cpp:545 +#: constraint.cpp:554 msgid "Must select an angle constraint." msgstr "" -#: constraint.cpp:557 +#: constraint.cpp:567 msgid "Must select a constraint with associated label." msgstr "" -#: constraint.cpp:568 +#: constraint.cpp:578 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -375,29 +376,29 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:625 +#: constraint.cpp:635 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with Constrain -> On " "Point before constraining tangent." msgstr "" -#: constraint.cpp:649 +#: constraint.cpp:659 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them with Constrain -> On " "Point before constraining tangent." msgstr "" -#: constraint.cpp:659 +#: constraint.cpp:669 msgid "Curve-curve tangency must apply in workplane." msgstr "" -#: constraint.cpp:677 +#: constraint.cpp:687 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point before constraining " "tangent." msgstr "" -#: constraint.cpp:686 +#: constraint.cpp:696 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply to:\n" "\n" @@ -407,7 +408,7 @@ msgid "" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" -#: constraint.cpp:704 +#: constraint.cpp:714 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -416,24 +417,24 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:719 +#: constraint.cpp:729 msgid "" "Bad selection for lock point where dragged constraint. This constraint can apply to:\n" "\n" " * a point\n" msgstr "" -#: constraint.cpp:730 +#: constraint.cpp:740 msgid "click center of comment text" msgstr "" -#: export.cpp:18 +#: export.cpp:19 msgid "" "No solid model present; draw one with extrudes and revolves, or use Export 2d View to export bare " "lines and curves." msgstr "" -#: export.cpp:60 +#: export.cpp:61 msgid "" "Bad selection for export section. Please select:\n" "\n" @@ -442,7 +443,7 @@ msgid "" " * a point and two line segments (plane through point and parallel to lines)\n" msgstr "" -#: export.cpp:805 +#: export.cpp:822 msgid "Active group mesh is empty; nothing to export." msgstr "" @@ -454,15 +455,15 @@ msgstr "" msgid "zigzag lines were replaced with continuous lines" msgstr "" -#: exportvector.cpp:590 +#: exportvector.cpp:593 msgid "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" -#: exportvector.cpp:807 +#: exportvector.cpp:839 msgid "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" -#: file.cpp:44 group.cpp:95 +#: file.cpp:44 group.cpp:91 msgctxt "group-name" msgid "sketch-in-plane" msgstr "" @@ -472,435 +473,498 @@ msgctxt "group-name" msgid "#references" msgstr "" -#: file.cpp:539 +#: file.cpp:549 msgid "Unrecognized data in file. This file may be corrupt, or from a newer version of the program." msgstr "" -#: graphicswin.cpp:29 +#: file.cpp:849 +msgctxt "title" +msgid "Missing File" +msgstr "" + +#: file.cpp:850 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "" + +#: file.cpp:852 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be permanently removed." +msgstr "" + +#: file.cpp:855 +msgctxt "button" +msgid "&Yes" +msgstr "" + +#: file.cpp:857 +msgctxt "button" +msgid "&No" +msgstr "" + +#: file.cpp:859 +msgctxt "button" +msgid "&Cancel" +msgstr "" + +#: graphicswin.cpp:41 msgid "&File" msgstr "" -#: graphicswin.cpp:30 +#: graphicswin.cpp:42 msgid "&New" msgstr "" -#: graphicswin.cpp:31 +#: graphicswin.cpp:43 msgid "&Open..." msgstr "" -#: graphicswin.cpp:32 +#: graphicswin.cpp:44 msgid "Open &Recent" msgstr "" -#: graphicswin.cpp:33 +#: graphicswin.cpp:45 msgid "&Save" msgstr "" -#: graphicswin.cpp:34 +#: graphicswin.cpp:46 msgid "Save &As..." msgstr "" -#: graphicswin.cpp:36 +#: graphicswin.cpp:48 msgid "Export &Image..." msgstr "" -#: graphicswin.cpp:37 +#: graphicswin.cpp:49 msgid "Export 2d &View..." msgstr "" -#: graphicswin.cpp:38 +#: graphicswin.cpp:50 msgid "Export 2d &Section..." msgstr "" -#: graphicswin.cpp:39 +#: graphicswin.cpp:51 msgid "Export 3d &Wireframe..." msgstr "" -#: graphicswin.cpp:40 +#: graphicswin.cpp:52 msgid "Export Triangle &Mesh..." msgstr "" -#: graphicswin.cpp:41 +#: graphicswin.cpp:53 msgid "Export &Surfaces..." msgstr "" -#: graphicswin.cpp:42 +#: graphicswin.cpp:54 msgid "Im&port..." msgstr "" -#: graphicswin.cpp:45 +#: graphicswin.cpp:57 msgid "E&xit" msgstr "" -#: graphicswin.cpp:48 +#: graphicswin.cpp:60 msgid "&Edit" msgstr "" -#: graphicswin.cpp:49 +#: graphicswin.cpp:61 msgid "&Undo" msgstr "" -#: graphicswin.cpp:50 +#: graphicswin.cpp:62 msgid "&Redo" msgstr "" -#: graphicswin.cpp:51 +#: graphicswin.cpp:63 msgid "Re&generate All" msgstr "" -#: graphicswin.cpp:53 +#: graphicswin.cpp:65 msgid "Snap Selection to &Grid" msgstr "" -#: graphicswin.cpp:54 +#: graphicswin.cpp:66 msgid "Rotate Imported &90°" msgstr "" -#: graphicswin.cpp:56 +#: graphicswin.cpp:68 msgid "Cu&t" msgstr "" -#: graphicswin.cpp:57 +#: graphicswin.cpp:69 msgid "&Copy" msgstr "" -#: graphicswin.cpp:58 +#: graphicswin.cpp:70 msgid "&Paste" msgstr "" -#: graphicswin.cpp:59 +#: graphicswin.cpp:71 msgid "Paste &Transformed..." msgstr "" -#: graphicswin.cpp:60 +#: graphicswin.cpp:72 msgid "&Delete" msgstr "" -#: graphicswin.cpp:62 +#: graphicswin.cpp:74 msgid "Select &Edge Chain" msgstr "" -#: graphicswin.cpp:63 +#: graphicswin.cpp:75 msgid "Select &All" msgstr "" -#: graphicswin.cpp:64 +#: graphicswin.cpp:76 msgid "&Unselect All" msgstr "" -#: graphicswin.cpp:66 +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "" + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "" + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "" + +#: graphicswin.cpp:84 msgid "&View" msgstr "" -#: graphicswin.cpp:67 +#: graphicswin.cpp:85 msgid "Zoom &In" msgstr "" -#: graphicswin.cpp:68 +#: graphicswin.cpp:86 msgid "Zoom &Out" msgstr "" -#: graphicswin.cpp:69 +#: graphicswin.cpp:87 msgid "Zoom To &Fit" msgstr "" -#: graphicswin.cpp:71 +#: graphicswin.cpp:89 msgid "Align View to &Workplane" msgstr "" -#: graphicswin.cpp:72 +#: graphicswin.cpp:90 msgid "Nearest &Ortho View" msgstr "" -#: graphicswin.cpp:73 +#: graphicswin.cpp:91 msgid "Nearest &Isometric View" msgstr "" -#: graphicswin.cpp:74 +#: graphicswin.cpp:92 msgid "&Center View At Point" msgstr "" -#: graphicswin.cpp:76 +#: graphicswin.cpp:94 msgid "Show Snap &Grid" msgstr "" -#: graphicswin.cpp:77 +#: graphicswin.cpp:95 msgid "Use &Perspective Projection" msgstr "" -#: graphicswin.cpp:78 +#: graphicswin.cpp:96 msgid "Dimension &Units" msgstr "" -#: graphicswin.cpp:79 -msgid "Dimensions in &Inches" -msgstr "" - -#: graphicswin.cpp:80 +#: graphicswin.cpp:97 msgid "Dimensions in &Millimeters" msgstr "" -#: graphicswin.cpp:81 +#: graphicswin.cpp:98 msgid "Dimensions in M&eters" msgstr "" -#: graphicswin.cpp:83 +#: graphicswin.cpp:99 +msgid "Dimensions in &Inches" +msgstr "" + +#: graphicswin.cpp:101 msgid "Show &Toolbar" msgstr "" -#: graphicswin.cpp:84 +#: graphicswin.cpp:102 msgid "Show Property Bro&wser" msgstr "" -#: graphicswin.cpp:86 +#: graphicswin.cpp:104 msgid "&Full Screen" msgstr "" -#: graphicswin.cpp:88 +#: graphicswin.cpp:106 msgid "&New Group" msgstr "" -#: graphicswin.cpp:89 +#: graphicswin.cpp:107 msgid "Sketch In &3d" msgstr "" -#: graphicswin.cpp:90 +#: graphicswin.cpp:108 msgid "Sketch In New &Workplane" msgstr "" -#: graphicswin.cpp:92 +#: graphicswin.cpp:110 msgid "Step &Translating" msgstr "" -#: graphicswin.cpp:93 +#: graphicswin.cpp:111 msgid "Step &Rotating" msgstr "" -#: graphicswin.cpp:95 +#: graphicswin.cpp:113 msgid "E&xtrude" msgstr "" -#: graphicswin.cpp:96 +#: graphicswin.cpp:114 +msgid "&Helix" +msgstr "" + +#: graphicswin.cpp:115 msgid "&Lathe" msgstr "" -#: graphicswin.cpp:98 +#: graphicswin.cpp:116 +msgid "Re&volve" +msgstr "" + +#: graphicswin.cpp:118 msgid "Link / Assemble..." msgstr "" -#: graphicswin.cpp:99 +#: graphicswin.cpp:119 msgid "Link Recent" msgstr "" -#: graphicswin.cpp:101 +#: graphicswin.cpp:121 msgid "&Sketch" msgstr "" -#: graphicswin.cpp:102 +#: graphicswin.cpp:122 msgid "In &Workplane" msgstr "" -#: graphicswin.cpp:103 +#: graphicswin.cpp:123 msgid "Anywhere In &3d" msgstr "" -#: graphicswin.cpp:105 +#: graphicswin.cpp:125 msgid "Datum &Point" msgstr "" -#: graphicswin.cpp:106 +#: graphicswin.cpp:126 msgid "&Workplane" msgstr "" -#: graphicswin.cpp:108 +#: graphicswin.cpp:128 msgid "Line &Segment" msgstr "" -#: graphicswin.cpp:109 +#: graphicswin.cpp:129 msgid "C&onstruction Line Segment" msgstr "" -#: graphicswin.cpp:110 +#: graphicswin.cpp:130 msgid "&Rectangle" msgstr "" -#: graphicswin.cpp:111 +#: graphicswin.cpp:131 msgid "&Circle" msgstr "" -#: graphicswin.cpp:112 +#: graphicswin.cpp:132 msgid "&Arc of a Circle" msgstr "" -#: graphicswin.cpp:113 +#: graphicswin.cpp:133 msgid "&Bezier Cubic Spline" msgstr "" -#: graphicswin.cpp:115 +#: graphicswin.cpp:135 msgid "&Text in TrueType Font" msgstr "" -#: graphicswin.cpp:116 +#: graphicswin.cpp:136 msgid "&Image" msgstr "" -#: graphicswin.cpp:118 +#: graphicswin.cpp:138 msgid "To&ggle Construction" msgstr "" -#: graphicswin.cpp:119 +#: graphicswin.cpp:139 msgid "Tangent &Arc at Point" msgstr "" -#: graphicswin.cpp:120 +#: graphicswin.cpp:140 msgid "Split Curves at &Intersection" msgstr "" -#: graphicswin.cpp:122 +#: graphicswin.cpp:142 msgid "&Constrain" msgstr "" -#: graphicswin.cpp:123 +#: graphicswin.cpp:143 msgid "&Distance / Diameter" msgstr "" -#: graphicswin.cpp:124 +#: graphicswin.cpp:144 msgid "Re&ference Dimension" msgstr "" -#: graphicswin.cpp:125 +#: graphicswin.cpp:145 msgid "A&ngle" msgstr "" -#: graphicswin.cpp:126 +#: graphicswin.cpp:146 msgid "Reference An&gle" msgstr "" -#: graphicswin.cpp:127 +#: graphicswin.cpp:147 msgid "Other S&upplementary Angle" msgstr "" -#: graphicswin.cpp:128 +#: graphicswin.cpp:148 msgid "Toggle R&eference Dim" msgstr "" -#: graphicswin.cpp:130 +#: graphicswin.cpp:150 msgid "&Horizontal" msgstr "" -#: graphicswin.cpp:131 +#: graphicswin.cpp:151 msgid "&Vertical" msgstr "" -#: graphicswin.cpp:133 +#: graphicswin.cpp:153 msgid "&On Point / Curve / Plane" msgstr "" -#: graphicswin.cpp:134 +#: graphicswin.cpp:154 msgid "E&qual Length / Radius / Angle" msgstr "" -#: graphicswin.cpp:135 +#: graphicswin.cpp:155 msgid "Length Ra&tio" msgstr "" -#: graphicswin.cpp:136 +#: graphicswin.cpp:156 msgid "Length Diff&erence" msgstr "" -#: graphicswin.cpp:137 +#: graphicswin.cpp:157 msgid "At &Midpoint" msgstr "" -#: graphicswin.cpp:138 +#: graphicswin.cpp:158 msgid "S&ymmetric" msgstr "" -#: graphicswin.cpp:139 +#: graphicswin.cpp:159 msgid "Para&llel / Tangent" msgstr "" -#: graphicswin.cpp:140 +#: graphicswin.cpp:160 msgid "&Perpendicular" msgstr "" -#: graphicswin.cpp:141 +#: graphicswin.cpp:161 msgid "Same Orient&ation" msgstr "" -#: graphicswin.cpp:142 +#: graphicswin.cpp:162 msgid "Lock Point Where &Dragged" msgstr "" -#: graphicswin.cpp:144 +#: graphicswin.cpp:164 msgid "Comment" msgstr "" -#: graphicswin.cpp:146 +#: graphicswin.cpp:166 msgid "&Analyze" msgstr "" -#: graphicswin.cpp:147 +#: graphicswin.cpp:167 msgid "Measure &Volume" msgstr "" -#: graphicswin.cpp:148 +#: graphicswin.cpp:168 msgid "Measure A&rea" msgstr "" -#: graphicswin.cpp:149 +#: graphicswin.cpp:169 msgid "Measure &Perimeter" msgstr "" -#: graphicswin.cpp:150 +#: graphicswin.cpp:170 msgid "Show &Interfering Parts" msgstr "" -#: graphicswin.cpp:151 +#: graphicswin.cpp:171 msgid "Show &Naked Edges" msgstr "" -#: graphicswin.cpp:152 +#: graphicswin.cpp:172 msgid "Show &Center of Mass" msgstr "" -#: graphicswin.cpp:154 -msgid "Show Degrees of &Freedom" +#: graphicswin.cpp:174 +msgid "Show &Underconstrained Points" msgstr "" -#: graphicswin.cpp:156 +#: graphicswin.cpp:176 msgid "&Trace Point" msgstr "" -#: graphicswin.cpp:157 +#: graphicswin.cpp:177 msgid "&Stop Tracing..." msgstr "" -#: graphicswin.cpp:158 +#: graphicswin.cpp:178 msgid "Step &Dimension..." msgstr "" -#: graphicswin.cpp:160 +#: graphicswin.cpp:180 msgid "&Help" msgstr "" -#: graphicswin.cpp:161 -msgid "&Website / Manual" +#: graphicswin.cpp:181 +msgid "&Language" msgstr "" -#: graphicswin.cpp:162 -msgid "&Language" +#: graphicswin.cpp:182 +msgid "&Website / Manual" msgstr "" -#: graphicswin.cpp:164 +#: graphicswin.cpp:184 msgid "&About" msgstr "" -#: graphicswin.cpp:491 +#: graphicswin.cpp:352 +msgid "(no recent files)" +msgstr "" + +#: graphicswin.cpp:360 +#, c-format +msgid "File '%s' does not exist." +msgstr "" + +#: graphicswin.cpp:721 msgid "No workplane is active, so the grid will not appear." msgstr "" -#: graphicswin.cpp:500 +#: graphicswin.cpp:730 msgid "" "The perspective factor is set to zero, so the view will always be a parallel projection.\n" "\n" @@ -908,98 +972,98 @@ msgid "" "around 0.3 is typical." msgstr "" -#: graphicswin.cpp:581 +#: graphicswin.cpp:809 msgid "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:862 +#: graphicswin.cpp:1103 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:882 +#: graphicswin.cpp:1121 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:906 +#: graphicswin.cpp:1144 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) to define the plane " "for the snap grid." msgstr "" -#: graphicswin.cpp:913 +#: graphicswin.cpp:1151 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:979 +#: graphicswin.cpp:1239 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:984 +#: graphicswin.cpp:1242 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:1008 +#: graphicswin.cpp:1263 msgid "" "Bad selection for tangent arc at point. Select a single point, or select nothing to set up arc " "parameters." msgstr "" -#: graphicswin.cpp:1019 +#: graphicswin.cpp:1274 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1020 +#: graphicswin.cpp:1275 msgid "click to place datum point" msgstr "" -#: graphicswin.cpp:1021 +#: graphicswin.cpp:1276 msgid "click first point of line segment" msgstr "" -#: graphicswin.cpp:1023 +#: graphicswin.cpp:1278 msgid "click first point of construction line segment" msgstr "" -#: graphicswin.cpp:1024 +#: graphicswin.cpp:1279 msgid "click first point of cubic segment" msgstr "" -#: graphicswin.cpp:1025 +#: graphicswin.cpp:1280 msgid "click center of circle" msgstr "" -#: graphicswin.cpp:1026 +#: graphicswin.cpp:1281 msgid "click origin of workplane" msgstr "" -#: graphicswin.cpp:1027 +#: graphicswin.cpp:1282 msgid "click one corner of rectangle" msgstr "" -#: graphicswin.cpp:1028 +#: graphicswin.cpp:1283 msgid "click top left of text" msgstr "" -#: graphicswin.cpp:1034 +#: graphicswin.cpp:1289 msgid "click top left of image" msgstr "" -#: graphicswin.cpp:1047 +#: graphicswin.cpp:1301 msgid "No entities are selected. Select entities before trying to toggle their construction state." msgstr "" -#: group.cpp:90 +#: group.cpp:86 msgctxt "group-name" msgid "sketch-in-3d" msgstr "" -#: group.cpp:146 +#: group.cpp:142 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" @@ -1008,17 +1072,21 @@ msgid "" " * a workplane (copy of the workplane)\n" msgstr "" -#: group.cpp:158 +#: group.cpp:154 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch will be extruded " "normal to the workplane." msgstr "" -#: group.cpp:167 +#: group.cpp:163 msgctxt "group-name" msgid "extrude" msgstr "" +#: group.cpp:168 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "" + #: group.cpp:179 msgid "" "Bad selection for new lathe group. This group can be created with:\n" @@ -1033,7 +1101,43 @@ msgctxt "group-name" msgid "lathe" msgstr "" -#: group.cpp:202 +#: group.cpp:194 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:205 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel to line / normal, " +"through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:217 +msgctxt "group-name" +msgid "revolve" +msgstr "" + +#: group.cpp:222 +msgid "Helix operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:233 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel to line / normal, " +"through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:245 +msgctxt "group-name" +msgid "helix" +msgstr "" + +#: group.cpp:258 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1042,411 +1146,353 @@ msgid "" "line / normal)\n" msgstr "" -#: group.cpp:215 +#: group.cpp:271 msgctxt "group-name" msgid "rotate" msgstr "" -#: group.cpp:226 +#: group.cpp:282 msgctxt "group-name" msgid "translate" msgstr "" -#: group.cpp:340 +#: group.cpp:400 msgid "(unnamed)" msgstr "" -#: groupmesh.cpp:626 +#: groupmesh.cpp:689 msgid "not closed contour, or not all same style!" msgstr "" -#: groupmesh.cpp:639 +#: groupmesh.cpp:702 msgid "points not all coplanar!" msgstr "" -#: groupmesh.cpp:641 +#: groupmesh.cpp:704 msgid "contour is self-intersecting!" msgstr "" -#: groupmesh.cpp:643 +#: groupmesh.cpp:706 msgid "zero-length edge!" msgstr "" -#: modify.cpp:237 +#: modify.cpp:254 msgid "Must be sketching in workplane to create tangent arc." msgstr "" -#: modify.cpp:284 +#: modify.cpp:301 msgid "" "To create a tangent arc, select a point where two non-construction lines or circles in this group " "and workplane join." msgstr "" -#: modify.cpp:371 +#: modify.cpp:388 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the desired geometry by hand " "with tangency constraints." msgstr "" -#: modify.cpp:575 +#: modify.cpp:597 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" -#: modify.cpp:601 +#: modify.cpp:624 msgid "Must be sketching in workplane to split." msgstr "" -#: modify.cpp:608 +#: modify.cpp:631 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs or a line/circle/arc " "and a point)." msgstr "" -#: modify.cpp:713 +#: modify.cpp:736 msgid "Can't split; no intersection found." msgstr "" -#: mouse.cpp:522 -msgid "No Style" +#: mouse.cpp:560 +msgid "Assign to Style" msgstr "" -#: mouse.cpp:523 -msgid "Newly Created Custom Style..." +#: mouse.cpp:576 +msgid "No Style" msgstr "" -#: mouse.cpp:571 -msgid "Assign to Style" +#: mouse.cpp:579 +msgid "Newly Created Custom Style..." msgstr "" -#: mouse.cpp:574 +#: mouse.cpp:586 msgid "Group Info" msgstr "" -#: mouse.cpp:577 +#: mouse.cpp:606 msgid "Style Info" msgstr "" -#: mouse.cpp:580 +#: mouse.cpp:626 msgid "Select Edge Chain" msgstr "" -#: mouse.cpp:585 +#: mouse.cpp:632 msgid "Toggle Reference Dimension" msgstr "" -#: mouse.cpp:591 +#: mouse.cpp:638 msgid "Other Supplementary Angle" msgstr "" -#: mouse.cpp:596 +#: mouse.cpp:643 msgid "Snap to Grid" msgstr "" -#: mouse.cpp:604 +#: mouse.cpp:652 msgid "Remove Spline Point" msgstr "" -#: mouse.cpp:615 +#: mouse.cpp:687 msgid "Add Spline Point" msgstr "" -#: mouse.cpp:619 +#: mouse.cpp:691 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "" + +#: mouse.cpp:716 msgid "Toggle Construction" msgstr "" -#: mouse.cpp:633 +#: mouse.cpp:731 msgid "Delete Point-Coincident Constraint" msgstr "" -#: mouse.cpp:639 +#: mouse.cpp:750 msgid "Cut" msgstr "" -#: mouse.cpp:640 +#: mouse.cpp:752 msgid "Copy" msgstr "" -#: mouse.cpp:643 +#: mouse.cpp:756 msgid "Select All" msgstr "" -#: mouse.cpp:647 +#: mouse.cpp:761 msgid "Paste" msgstr "" -#: mouse.cpp:648 +#: mouse.cpp:763 msgid "Paste Transformed..." msgstr "" -#: mouse.cpp:652 +#: mouse.cpp:768 msgid "Delete" msgstr "" -#: mouse.cpp:654 +#: mouse.cpp:771 msgid "Unselect All" msgstr "" -#: mouse.cpp:660 +#: mouse.cpp:778 msgid "Unselect Hovered" msgstr "" -#: mouse.cpp:665 +#: mouse.cpp:787 msgid "Zoom to Fit" msgstr "" -#: mouse.cpp:805 -msgid "Cannot add spline point: maximum number of points reached." -msgstr "" - -#: mouse.cpp:1009 mouse.cpp:1292 +#: mouse.cpp:990 mouse.cpp:1277 msgid "click next point of line, or press Esc" msgstr "" -#: mouse.cpp:1015 +#: mouse.cpp:996 msgid "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1049 +#: mouse.cpp:1030 msgid "click to place other corner of rectangle" msgstr "" -#: mouse.cpp:1069 +#: mouse.cpp:1050 msgid "click to set radius" msgstr "" -#: mouse.cpp:1074 +#: mouse.cpp:1055 msgid "Can't draw arc in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1093 +#: mouse.cpp:1074 msgid "click to place point" msgstr "" -#: mouse.cpp:1109 +#: mouse.cpp:1090 msgid "click next point of cubic, or press Esc" msgstr "" -#: mouse.cpp:1114 +#: mouse.cpp:1095 msgid "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" -#: mouse.cpp:1130 +#: mouse.cpp:1111 msgid "Can't draw text in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1146 -msgid "click to place bottom left of text" +#: mouse.cpp:1128 +msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1152 +#: mouse.cpp:1134 msgid "Can't draw image in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1178 +#: mouse.cpp:1161 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" -#: platform/cocoamain.mm:481 platform/gtkmain.cpp:607 platform/w32main.cpp:451 -#: platform/w32main.cpp:1388 -msgctxt "title" -msgid "(new sketch)" -msgstr "" - -#: platform/cocoamain.mm:710 platform/gtkmain.cpp:912 platform/w32main.cpp:1307 -msgid "(no recent files)" -msgstr "" - -#: platform/cocoamain.mm:828 platform/gtkmain.cpp:1020 -msgid "untitled" +#: platform/gui.cpp:85 +msgctxt "file-type" +msgid "SolveSpace models" msgstr "" -#: platform/cocoamain.mm:860 -msgid "Do you want to save the changes you made to the new sketch?" +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "PNG image" msgstr "" -#: platform/cocoamain.mm:862 -msgid "Your changes will be lost if you don't save them." +#: platform/gui.cpp:93 +msgctxt "file-type" +msgid "STL mesh" msgstr "" -#: platform/cocoamain.mm:863 -msgctxt "button" -msgid "Save" +#: platform/gui.cpp:94 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" msgstr "" -#: platform/cocoamain.mm:864 platform/cocoamain.mm:905 -msgctxt "button" -msgid "Cancel" +#: platform/gui.cpp:95 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" msgstr "" -#: platform/cocoamain.mm:865 -msgctxt "button" -msgid "Don't Save" +#: platform/gui.cpp:96 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" msgstr "" -#: platform/cocoamain.mm:880 -msgid "An autosave file is available for this project." +#: platform/gui.cpp:97 +msgctxt "file-type" +msgid "Q3D Object file" msgstr "" -#: platform/cocoamain.mm:882 -msgid "Do you want to load the autosave file instead?" +#: platform/gui.cpp:98 +msgctxt "file-type" +msgid "VRML text file" msgstr "" -#: platform/cocoamain.mm:883 -msgctxt "button" -msgid "Load" +#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +msgctxt "file-type" +msgid "STEP file" msgstr "" -#: platform/cocoamain.mm:884 -msgctxt "button" -msgid "Don't Load" +#: platform/gui.cpp:106 +msgctxt "file-type" +msgid "PDF file" msgstr "" -#: platform/cocoamain.mm:900 -msgid "" -"Do you want to locate it manually?\n" -"If you select “No”, any geometry that depends on the missing file will be removed." +#: platform/gui.cpp:107 +msgctxt "file-type" +msgid "Encapsulated PostScript" msgstr "" -#: platform/cocoamain.mm:903 -msgctxt "button" -msgid "Yes" +#: platform/gui.cpp:108 +msgctxt "file-type" +msgid "Scalable Vector Graphics" msgstr "" -#: platform/cocoamain.mm:906 -msgctxt "button" -msgid "No" +#: platform/gui.cpp:110 platform/gui.cpp:117 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/cocoamain.mm:1126 platform/w32main.cpp:183 -msgctxt "button" -msgid "OK" +#: platform/gui.cpp:111 +msgctxt "file-type" +msgid "HPGL file" msgstr "" -#: platform/cocoamain.mm:1211 platform/gtkmain.cpp:1382 platform/w32main.cpp:1410 -#: platform/w32main.cpp:1450 -msgctxt "title" -msgid "Property Browser" +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "G Code" msgstr "" -#: platform/gtkmain.cpp:968 -msgctxt "title" -msgid "Open File" +#: platform/gui.cpp:121 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gtkmain.cpp:970 -msgid "_Cancel" +#: platform/gui.cpp:125 +msgctxt "file-type" +msgid "Comma-separated values" msgstr "" -#: platform/gtkmain.cpp:971 -msgid "_Open" +#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +msgid "untitled" msgstr "" -#: platform/gtkmain.cpp:1010 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "" -#: platform/gtkmain.cpp:1013 platform/gtkmain.cpp:1049 platform/gtkmain.cpp:1097 -msgctxt "button" -msgid "_Cancel" -msgstr "" - -#: platform/gtkmain.cpp:1014 platform/gtkmain.cpp:1047 -msgctxt "button" -msgid "_Save" -msgstr "" - -#: platform/gtkmain.cpp:1042 platform/w32main.cpp:1167 -msgid "" -"The file has changed since it was last saved.\n" -"\n" -"Do you want to save the changes?" -msgstr "" - -#: platform/gtkmain.cpp:1046 platform/w32main.cpp:1169 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guiwin.cpp:1557 msgctxt "title" -msgid "Modified File" -msgstr "" - -#: platform/gtkmain.cpp:1048 -msgctxt "button" -msgid "Do_n't Save" -msgstr "" - -#: platform/gtkmain.cpp:1066 platform/w32main.cpp:1193 -msgid "" -"An autosave file is available for this project.\n" -"\n" -"Do you want to load the autosave file instead?" -msgstr "" - -#: platform/gtkmain.cpp:1070 platform/w32main.cpp:1195 -msgctxt "title" -msgid "Autosave Available" -msgstr "" - -#: platform/gtkmain.cpp:1071 -msgctxt "button" -msgid "_Load autosave" +msgid "Open File" msgstr "" -#: platform/gtkmain.cpp:1072 +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 msgctxt "button" -msgid "Do_n't Load" -msgstr "" - -#: platform/gtkmain.cpp:1093 platform/w32main.cpp:1223 -msgctxt "title" -msgid "Missing File" +msgid "_Cancel" msgstr "" -#: platform/gtkmain.cpp:1094 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 msgctxt "button" -msgid "_Yes" +msgid "_Save" msgstr "" -#: platform/gtkmain.cpp:1095 +#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 msgctxt "button" -msgid "_No" -msgstr "" - -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 -msgctxt "title" -msgid "Error" -msgstr "" - -#: platform/gtkmain.cpp:1306 platform/w32main.cpp:179 -msgctxt "title" -msgid "Message" +msgid "_Open" msgstr "" -#: style.cpp:160 +#: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try assigning a style to this " "entity's parent." msgstr "" -#: style.cpp:659 +#: style.cpp:665 msgid "Style name cannot be empty" msgstr "" -#: textscreens.cpp:662 +#: textscreens.cpp:741 msgid "Can't repeat fewer than 1 time." msgstr "" -#: textscreens.cpp:666 +#: textscreens.cpp:745 msgid "Can't repeat more than 999 times." msgstr "" -#: textscreens.cpp:695 +#: textscreens.cpp:770 msgid "Group name cannot be empty" msgstr "" -#: textscreens.cpp:739 +#: textscreens.cpp:813 msgid "Opacity must be between zero and one." msgstr "" -#: textscreens.cpp:778 +#: textscreens.cpp:848 msgid "Radius cannot be zero or negative." msgstr "" @@ -1578,64 +1624,19 @@ msgstr "" msgid "Align view to active workplane" msgstr "" -#: ui.h:69 -msgid "SolveSpace models" -msgstr "" - -#: ui.h:74 -msgid "PNG file" -msgstr "" - -#: ui.h:79 -msgid "STL mesh" -msgstr "" - -#: ui.h:80 -msgid "Wavefront OBJ mesh" -msgstr "" - -#: ui.h:81 -msgid "Three.js-compatible mesh, with viewer" -msgstr "" - -#: ui.h:82 -msgid "Three.js-compatible mesh, mesh only" -msgstr "" - -#: ui.h:87 ui.h:95 ui.h:103 -msgid "STEP file" -msgstr "" - -#: ui.h:92 -msgid "PDF file" -msgstr "" - -#: ui.h:93 -msgid "Encapsulated PostScript" -msgstr "" - -#: ui.h:94 -msgid "Scalable Vector Graphics" -msgstr "" - -#: ui.h:96 ui.h:104 -msgid "DXF file (AutoCAD 2007)" -msgstr "" - -#: ui.h:97 -msgid "HPGL file" -msgstr "" - -#: ui.h:98 -msgid "G Code" +#: util.cpp:165 +msgctxt "title" +msgid "Error" msgstr "" -#: ui.h:109 -msgid "AutoCAD DXF and DWG files" +#: util.cpp:165 +msgctxt "title" +msgid "Message" msgstr "" -#: ui.h:114 -msgid "Comma-separated values" +#: util.cpp:170 +msgctxt "button" +msgid "&OK" msgstr "" #: view.cpp:78 From 2fdb3e3bc0f313e0177f3b69492eb3c6ef76efd5 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 1 Sep 2020 19:36:39 -0400 Subject: [PATCH 121/646] NFC: Performance. For step-and-repeat groups, create the copies first (in parallel) and then combine them using unions of equal size shells to reduce the total time spent on booleans. --- src/groupmesh.cpp | 63 ++++++++++++++++++++++++++++++----------------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/src/groupmesh.cpp b/src/groupmesh.cpp index a46bb2214..2d509aea4 100644 --- a/src/groupmesh.cpp +++ b/src/groupmesh.cpp @@ -106,25 +106,28 @@ void SMesh::RemapFaces(Group *g, int remap) { template void Group::GenerateForStepAndRepeat(T *steps, T *outs, Group::CombineAs forWhat) { - T workA, workB; - workA = {}; - workB = {}; - T *soFar = &workA, *scratch = &workB; int n = (int)valA, a0 = 0; if(subtype == Subtype::ONE_SIDED && skipFirst) { a0++; n++; } + int a; + // create all the transformed copies + std::vector transd(n); + std::vector workA(n); + workA[0] = {}; + // first generate a shell/mesh with each transformed copy +#pragma omp parallel for for(a = a0; a < n; a++) { + transd[a] = {}; + workA[a] = {}; int ap = a*2 - (subtype == Subtype::ONE_SIDED ? 0 : (n-1)); - int remap = (a == (n - 1)) ? REMAP_LAST : a; - T transd = {}; if(type == Type::TRANSLATE) { Vector trans = Vector::From(h.param(0), h.param(1), h.param(2)); trans = trans.ScaledBy(ap); - transd.MakeFromTransformationOf(steps, + transd[a].MakeFromTransformationOf(steps, trans, Quaternion::IDENTITY, 1.0); } else { Vector trans = Vector::From(h.param(0), h.param(1), h.param(2)); @@ -133,29 +136,45 @@ void Group::GenerateForStepAndRepeat(T *steps, T *outs, Group::CombineAs forWhat Vector axis = Vector::From(h.param(4), h.param(5), h.param(6)); Quaternion q = Quaternion::From(c, s*axis.x, s*axis.y, s*axis.z); // Rotation is centered at t; so A(x - t) + t = Ax + (t - At) - transd.MakeFromTransformationOf(steps, + transd[a].MakeFromTransformationOf(steps, trans.Minus(q.Rotate(trans)), q, 1.0); } - + } + for(a = a0; a < n; a++) { // We need to rewrite any plane face entities to the transformed ones. - transd.RemapFaces(this, remap); + int remap = (a == (n - 1)) ? REMAP_LAST : a; + transd[a].RemapFaces(this, remap); + } - // And tack this transformed copy on to the return. - if(soFar->IsEmpty()) { - scratch->MakeFromCopyOf(&transd); - } else if(forWhat == CombineAs::ASSEMBLE) { - scratch->MakeFromAssemblyOf(soFar, &transd); - } else { - scratch->MakeFromUnionOf(soFar, &transd); + std::vector *soFar = &transd; + std::vector *scratch = &workA; + // do the boolean operations on pairs of equal size + while(n > 1) { + for(a = 0; a < n; a+=2) { + scratch->at(a/2).Clear(); + // combine a pair of shells + if((a==0) && (a0==1)) { // if the first was skipped just copy the 2nd + scratch->at(a/2).MakeFromCopyOf(&(soFar->at(a+1))); + (soFar->at(a+1)).Clear(); + a0 = 0; + } else if (a == n-1) { // for an odd number just copy the last one + scratch->at(a/2).MakeFromCopyOf(&(soFar->at(a))); + (soFar->at(a)).Clear(); + } else if(forWhat == CombineAs::ASSEMBLE) { + scratch->at(a/2).MakeFromAssemblyOf(&(soFar->at(a)), &(soFar->at(a+1))); + (soFar->at(a)).Clear(); + (soFar->at(a+1)).Clear(); + } else { + scratch->at(a/2).MakeFromUnionOf(&(soFar->at(a)), &(soFar->at(a+1))); + (soFar->at(a)).Clear(); + (soFar->at(a+1)).Clear(); + } } - swap(scratch, soFar); - scratch->Clear(); - transd.Clear(); + n = (n+1)/2; } - outs->Clear(); - *outs = *soFar; + *outs = soFar->at(0); } template From e62315f2d8aa36f3f752132423b3d21f435c49af Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 24 Sep 2020 12:30:06 -0400 Subject: [PATCH 122/646] IDF file Linking. Can read PCB outlines and cutouts, as well as Pin and Mounting holes. A simple PPCB model sans components is added to the assembly. --- src/CMakeLists.txt | 1 + src/file.cpp | 10 + src/group.cpp | 2 +- src/importidf.cpp | 500 +++++++++++++++++++++++++++++++++++++++++++ src/platform/gui.cpp | 5 + src/platform/gui.h | 2 + src/solvespace.h | 3 + 7 files changed, 522 insertions(+), 1 deletion(-) create mode 100644 src/importidf.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fbebccfc8..1b6d90051 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -175,6 +175,7 @@ set(solvespace_core_SOURCES group.cpp groupmesh.cpp importdxf.cpp + importidf.cpp mesh.cpp modify.cpp mouse.cpp diff --git a/src/file.cpp b/src/file.cpp index 3cfcfbb33..acb931f0e 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -702,6 +702,16 @@ void SolveSpaceUI::UpgradeLegacyData() { bool SolveSpaceUI::LoadEntitiesFromFile(const Platform::Path &filename, EntityList *le, SMesh *m, SShell *sh) +{ + if(strcmp(filename.Extension().c_str(), "emn")==0) { + return LinkIDF(filename, le, m, sh); + } else { + return LoadEntitiesFromSlvs(filename, le, m, sh); + } +} + +bool SolveSpaceUI::LoadEntitiesFromSlvs(const Platform::Path &filename, EntityList *le, + SMesh *m, SShell *sh) { SSurface srf = {}; SCurve crv = {}; diff --git a/src/group.cpp b/src/group.cpp index 7a6161691..1539e68c7 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -287,7 +287,7 @@ void Group::MenuGroup(Command id, Platform::Path linkFile) { g.meshCombine = CombineAs::ASSEMBLE; if(g.linkFile.IsEmpty()) { Platform::FileDialogRef dialog = Platform::CreateOpenFileDialog(SS.GW.window); - dialog->AddFilters(Platform::SolveSpaceModelFileFilters); + dialog->AddFilters(Platform::SolveSpaceLinkFileFilters); dialog->ThawChoices(settings, "LinkSketch"); if(!dialog->RunModal()) return; dialog->FreezeChoices(settings, "LinkSketch"); diff --git a/src/importidf.cpp b/src/importidf.cpp new file mode 100644 index 000000000..c1e2e3312 --- /dev/null +++ b/src/importidf.cpp @@ -0,0 +1,500 @@ +//----------------------------------------------------------------------------- +// Intermediate Data Format (IDF) file reader. Reads an IDF file for PCB outlines and creates +// an equivalent SovleSpace sketch/extrusion. Supports only Linking, not import. +// Part placement is not currently supported. +// +// Copyright 2020 Paul Kahler. +//----------------------------------------------------------------------------- +#include "solvespace.h" +#include "sketch.h" + +// Split a string into substrings separated by spaces. +// Allow quotes to enclose spaces within a string +static std::vector splitString(const std::string line) { + std::vector v = {}; + + if(line.length() == 0) return v; + + std::string s = ""; + bool inString = false; + bool inQuotes = false; + + for (size_t i=0; i 0) + v.push_back(s); + + return v; +} + +////////////////////////////////////////////////////////////////////////////// +// Functions for linking an IDF file - we need to create entites that +// get remapped into a linked group similar to linking .slvs files +////////////////////////////////////////////////////////////////////////////// + +// Make a new point - type doesn't matter since we will make a copy later +static hEntity newPoint(EntityList *el, int *id, Vector p, bool visible = true) { + Entity en = {}; + en.type = Entity::Type::POINT_N_COPY; + en.extraPoints = 0; + en.timesApplied = 0; + en.group.v = 462; + en.actPoint = p; + en.construction = false; + en.style.v = Style::DATUM; + en.actVisible = visible; + 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; + en.point[1] = p1; + en.extraPoints = 0; + en.timesApplied = 0; + en.group.v = 493; + en.construction = false; + en.style.v = Style::ACTIVE_GRP; + 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 newNormal(EntityList *el, int *id, Quaternion normal) { + // 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::ACTIVE_GRP; + // to be visible we need to add a point. + en.point[0] = newPoint(el, id, Vector::From(0,0,3), /*visible=*/ true); + 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 newArc(EntityList *el, int *id, hEntity p0, hEntity p1, hEntity pc, hEntity hnorm) { + Entity en = {}; + en.type = Entity::Type::ARC_OF_CIRCLE; + en.point[0] = pc; + en.point[1] = p0; + en.point[2] = p1; + en.normal = hnorm; + en.extraPoints = 0; + en.timesApplied = 0; + en.group.v = 403; + en.construction = false; + en.style.v = Style::ACTIVE_GRP; + en.actVisible = true; + en.forceHidden = false; *id = *id+1; + + *id = *id + 1; + en.h.v = *id + en.group.v*65536; + el->Add(&en); + return en.h; +} + +static hEntity newDistance(EntityList *el, int *id, double distance) { + // normals have parameters, but we don't need them to make a NORMAL_N_COPY from this + Entity en = {}; + en.type = Entity::Type::DISTANCE; + en.extraPoints = 0; + en.timesApplied = 0; + en.group.v = 472; + en.actDistance = distance; + en.construction = false; + en.style.v = Style::ACTIVE_GRP; + // to be visible we'll need to add a point? + en.actVisible = false; + en.forceHidden = false; + + *id = *id+1; + en.h.v = *id + en.group.v*65536; + el->Add(&en); + return en.h; +} + +static hEntity newCircle(EntityList *el, int *id, hEntity p0, hEntity hdist, hEntity hnorm) { + Entity en = {}; + en.type = Entity::Type::CIRCLE; + en.point[0] = p0; + en.normal = hnorm; + en.distance = hdist; + en.extraPoints = 0; + en.timesApplied = 0; + en.group.v = 399; + en.construction = false; + en.style.v = Style::ACTIVE_GRP; + en.actVisible = true; + en.forceHidden = false; + + *id = *id+1; + en.h.v = *id + en.group.v*65536; + el->Add(&en); + return en.h; +} + +static Vector ArcCenter(Vector p0, Vector p1, double angle) { + // locate the center of an arc + Vector m = p0.Plus(p1).ScaledBy(0.5); + Vector perp = Vector::From(p1.y-p0.y, p0.x-p1.x, 0.0).WithMagnitude(1.0); + double dist = 0; + if (angle != 180) { + dist = (p1.Minus(m).Magnitude())/tan(0.5*angle*3.141592653589793/180.0); + } else { + dist = 0.0; + } + Vector c = m.Minus(perp.ScaledBy(dist)); + return c; +} + +// Add an IDF line or arc to the entity list. According to spec, zero angle indicates a line. +// Positive angles are counter clockwise, negative are clockwise. An angle of 360 +// indicates a circle centered at x1,y1 passing through x2,y2 and is a complete loop. +static void CreateEntity(EntityList *el, int *id, hEntity h0, hEntity h1, hEntity hnorm, + Vector p0, Vector p1, double angle) { + if (angle == 0.0) { + //line + if(p0.Equals(p1)) return; + + newLine(el, id, h0, h1); + + } else if(angle == 360.0) { + // circle + double d = p1.Minus(p0).Magnitude(); + hEntity hd = newDistance(el, id, d); + newCircle(el, id, h1, hd, hnorm); + + } else { + // arc + if(angle < 0.0) { + swap(p0,p1); + swap(h0,h1); + } + // locate the center of the arc + Vector m = p0.Plus(p1).ScaledBy(0.5); + Vector perp = Vector::From(p1.y-p0.y, p0.x-p1.x, 0.0).WithMagnitude(1.0); + double dist = 0; + if (angle != 180) { + dist = (p1.Minus(m).Magnitude())/tan(0.5*angle*3.141592653589793/180.0); + } else { + dist = 0.0; + } + Vector c = m.Minus(perp.ScaledBy(dist)); + hEntity hc = newPoint(el, id, c, /*visible=*/false); + newArc(el, id, h0, h1, hc, hnorm); + } +} + +// borrowed from Entity::GenerateBezierCurves because we don't have parameters. +static void MakeBeziersForArcs(SBezierList *sbl, Vector center, Vector pa, Vector pb, + Quaternion q, double angle) { + + Vector u = q.RotationU(), v = q.RotationV(); + double r = pa.Minus(center).Magnitude(); + double thetaa, thetab, dtheta; + + if(angle == 360.0) { + thetaa = 0; + thetab = 2*PI; + dtheta = 2*PI; + } else { + Point2d c2 = center.Project2d(u, v); + Point2d pa2 = (pa.Project2d(u, v)).Minus(c2); + Point2d pb2 = (pb.Project2d(u, v)).Minus(c2); + + thetaa = atan2(pa2.y, pa2.x); + thetab = atan2(pb2.y, pb2.x); + dtheta = thetab - thetaa; + } + int i, n; + if(dtheta > (3*PI/2 + 0.01)) { + n = 4; + } else if(dtheta > (PI + 0.01)) { + n = 3; + } else if(dtheta > (PI/2 + 0.01)) { + n = 2; + } else { + n = 1; + } + dtheta /= n; + + for(i = 0; i < n; i++) { + double s, c; + + c = cos(thetaa); + s = sin(thetaa); + // The start point of the curve, and the tangent vector at + // that start point. + Vector p0 = center.Plus(u.ScaledBy( r*c)).Plus(v.ScaledBy(r*s)), + t0 = u.ScaledBy(-r*s). Plus(v.ScaledBy(r*c)); + + thetaa += dtheta; + + c = cos(thetaa); + s = sin(thetaa); + Vector p2 = center.Plus(u.ScaledBy( r*c)).Plus(v.ScaledBy(r*s)), + t2 = u.ScaledBy(-r*s). Plus(v.ScaledBy(r*c)); + + // The control point must lie on both tangents. + Vector p1 = Vector::AtIntersectionOfLines(p0, p0.Plus(t0), + p2, p2.Plus(t2), + NULL); + + SBezier sb = SBezier::From(p0, p1, p2); + sb.weight[1] = cos(dtheta/2); + sbl->l.Add(&sb); + } +} + +namespace SolveSpace { + +// Here we read the important section of an IDF file. SolveSpace Entities are directly created by +// the funcions above, which is only OK because of the way linking works. For example points do +// not have handles for solver parameters (coordinates), they only have their actPoint values +// set (or actNormal or actDistance). These are incompete entites and would be a problem if +// they were part of the sketch, but they are not. After making a list of them here, a new group +// gets created from copies of these. Those copies are complete and part of the sketch group. +bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *sh) { + dbp("\nLink IDF board outline."); + el->Clear(); + std::string data; + if(!ReadFile(filename, &data)) { + Error("Couldn't read from '%s'", filename.raw.c_str()); + return false; + } + + enum IDF_SECTION { + none, + header, + board_outline, + other_outline, + routing_outline, + placement_outline, + routing_keepout, + via_keepout, + placement_group, + drilled_holes, + notes, + component_placement + } section; + + section = IDF_SECTION::none; + int record_number = 0; + int curve = -1; + int entityCount = 0; + + hEntity hprev; + hEntity hprevTop; + Vector pprev = Vector::From(0,0,0); + Vector pprevTop = Vector::From(0,0,0); + + double board_thickness = 10.0; + double scale = 1.0; //mm + + Quaternion normal = Quaternion::From(Vector::From(1,0,0), Vector::From(0,1,0)); + hEntity hnorm = newNormal(el, &entityCount, normal); + + // to create the extursion we will need to collect a set of bezier curves defined + // by the perimeter, cutouts, and holes. + SBezierList sbl = {}; + + std::stringstream stream(data); + for(std::string line; getline( stream, line ); ) { + if (line.find(".END_") == 0) { + section = none; + } + switch (section) { + case none: + if(line.find(".HEADER") == 0) { + section = header; + record_number = 1; + } else if (line.find(".BOARD_OUTLINE") == 0) { + section = board_outline; + record_number = 1; + } else if(line.find(".DRILLED_HOLES") == 0) { + section = drilled_holes; + record_number = 1; + } + break; + + case header: + if(record_number == 3) { + if(line.find("MM") != std::string::npos) { + dbp("IDF units are MM"); + scale = 1.0; + } else if(line.find("THOU") != std::string::npos) { + dbp("IDF units are thousandths of an inch"); + scale = 0.0254; + } else { + dbp("IDF import, no units found in file."); + } + } + break; + + case board_outline: + if (record_number == 2) { + board_thickness = std::stod(line) * scale; + dbp("IDF board thickness: %lf", board_thickness); + } else { // records 3+ are lines, arcs, and circles + std::vector values = splitString(line); + if(values.size() != 4) continue; + int c = stoi(values[0]); + double x = stof(values[1]); + double y = stof(values[2]); + double ang = stof(values[3]); + Vector point = Vector::From(x,y,0.0); + Vector pTop = Vector::From(x,y,board_thickness); + if(c != curve) { // start a new curve + curve = c; + hprev = newPoint(el, &entityCount, point, /*visible=*/false); + hprevTop = newPoint(el, &entityCount, pTop, /*visible=*/false); + pprev = point; + pprevTop = pTop; + } else { + // create a bezier for the extrusion + if (ang == 0) { + // straight lines + SBezier sb = SBezier::From(pprev, point); + sbl.l.Add(&sb); + } else if (ang != 360.0) { + // Arcs + Vector c = ArcCenter(pprev, point, ang); + MakeBeziersForArcs(&sbl, c, pprev, point, normal, ang); + } else { + // circles + MakeBeziersForArcs(&sbl, point, pprev, pprev, normal, ang); + } + // next create the entities + // only curves and points at circle centers will be visible + bool vis = (ang == 360.0); + hEntity hp = newPoint(el, &entityCount, point, /*visible=*/vis); + CreateEntity(el, &entityCount, hprev, hp, hnorm, pprev, point, ang); + pprev = point; + hprev = hp; + hp = newPoint(el, &entityCount, pTop, /*visible=*/vis); + CreateEntity(el, &entityCount, hprevTop, hp, hnorm, pprevTop, pTop, ang); + pprevTop = pTop; + hprevTop = hp; + + } + } + break; + + case other_outline: + case routing_outline: + case placement_outline: + case routing_keepout: + case via_keepout: + case placement_group: + break; + + case drilled_holes: { + std::vector values = splitString(line); + if(values.size() < 6) continue; + double d = stof(values[0]); + double x = stof(values[1]); + double y = stof(values[2]); + // Only show holes likely to be useful in MCAD to reduce complexity. + if((d > 1.7) || (values[5].compare(0,3,"PIN") == 0) + || (values[5].compare(0,3,"MTG") == 0)) { + // create the entity + Vector cent = Vector::From(x,y,0.0); + hEntity hcent = newPoint(el, &entityCount, cent); + hEntity hdist = newDistance(el, &entityCount, d/2); + newCircle(el, &entityCount, hcent, hdist, hnorm); + // and again for the top + Vector cTop = Vector::From(x,y,board_thickness); + hcent = newPoint(el, &entityCount, cTop); + hdist = newDistance(el, &entityCount, d/2); + newCircle(el, &entityCount, hcent, hdist, hnorm); + // create the curves for the extrusion + Vector pt = Vector::From(x+d/2, y, 0.0); + MakeBeziersForArcs(&sbl, cent, pt, pt, normal, 360.0); + } + + break; + } + case notes: + case component_placement: + break; + + default: + section = none; + break; + } + record_number++; + } + // now we can create an extrusion from all the Bezier curves. We can skip things + // like checking for a coplanar sketch because everything is at z=0. + SPolygon polyLoops = {}; + bool allClosed; + bool allCoplanar; + Vector errorPointAt = Vector::From(0,0,0); + SEdge errorAt = {}; + + SBezierLoopSetSet sblss = {}; + sblss.FindOuterFacesFrom(&sbl, &polyLoops, NULL, + 100.0, &allClosed, &errorAt, + &allCoplanar, &errorPointAt, NULL); + + //hack for when there is no sketch yet and the first group is a linked IDF + double ctc = SS.chordTolCalculated; + if(ctc == 0.0) SS.chordTolCalculated = 0.1; //mm + // there should only by one sbls in the sblss unless a board has disjointed parts... + sh->MakeFromExtrusionOf(sblss.l.First(), Vector::From(0.0, 0.0, 0.0), + Vector::From(0.0, 0.0, board_thickness), + RgbaColor::From(0, 180, 0) ); + SS.chordTolCalculated = ctc; + sblss.Clear(); + sbl.Clear(); + sh->booleanFailed = false; + + return true; +} + +} diff --git a/src/platform/gui.cpp b/src/platform/gui.cpp index b86d2ecd1..ff9b2cffb 100644 --- a/src/platform/gui.cpp +++ b/src/platform/gui.cpp @@ -85,6 +85,11 @@ std::vector SolveSpaceModelFileFilters = { { CN_("file-type", "SolveSpace models"), { "slvs" } }, }; +std::vector SolveSpaceLinkFileFilters = { + { CN_("file-type", "SolveSpace models"), { "slvs" } }, + { CN_("file-type", "IDF circuit board"), { "emn" } }, +}; + std::vector RasterFileFilters = { { CN_("file-type", "PNG image"), { "png" } }, }; diff --git a/src/platform/gui.h b/src/platform/gui.h index a56028d18..7b2cdf5a4 100644 --- a/src/platform/gui.h +++ b/src/platform/gui.h @@ -329,6 +329,8 @@ struct FileFilter { // SolveSpace's native file format extern std::vector SolveSpaceModelFileFilters; +// SolveSpace's linkable file formats +extern std::vector SolveSpaceLinkFileFilters; // Raster image extern std::vector RasterFileFilters; // Triangle mesh diff --git a/src/solvespace.h b/src/solvespace.h index 795c888f7..1157723a7 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -679,6 +679,8 @@ class SolveSpaceUI { void UpgradeLegacyData(); bool LoadEntitiesFromFile(const Platform::Path &filename, EntityList *le, SMesh *m, SShell *sh); + bool LoadEntitiesFromSlvs(const Platform::Path &filename, EntityList *le, + SMesh *m, SShell *sh); bool ReloadAllLinked(const Platform::Path &filename, bool canCancel = false); // And the various export options void ExportAsPngTo(const Platform::Path &filename); @@ -810,6 +812,7 @@ class SolveSpaceUI { void ImportDxf(const Platform::Path &file); void ImportDwg(const Platform::Path &file); +bool LinkIDF(const Platform::Path &filename, EntityList *le, SMesh *m, SShell *sh); extern SolveSpaceUI SS; extern Sketch SK; From 006985e64b6ab905d29ce302d5e58470e0a5b170 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 30 Sep 2020 17:27:31 -0400 Subject: [PATCH 123/646] Updated changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3845fd23..f3faa4783 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -47,6 +47,7 @@ New constraint features: with a value. New export/import features: + * Link IDF circuit boards in an assembly (.emn files) * Three.js: allow configuring projection for exported model, and initially use the current viewport projection. * Wavefront OBJ: a material file is exported alongside the model, containing @@ -81,6 +82,9 @@ New measurement/analysis features: workplane is displayed. Other new features: + * Added ExportBackgroundColor in configuration for EPS, PDF, and SVG files. + * Improvements to the text window for selected entities and constraints. + * Ambient light source added in text window to allow flat shaded renderings. * New command-line interface, for batch exporting and more. * The graphical interface now supports HiDPI screens on every OS. * New option to lock Z axis to be always vertical, like in SketchUp. @@ -104,8 +108,15 @@ Other new features: * On Linux, native file chooser dialog can be used. * New edit menu items "Line Styles", "View Projection" and "Configuration" that are shortcuts to the respective configuration screens. + * New cmake build options using -DENABLE_OPENMP=yes and -DENABLE_LTO=yes + to enable support for multi-threading and link-time optimization. Bugs fixed: + * Fixed broken --view options for command line thumbnail image creation. + * Some errors in Triangulation of surfaces. + * Some NURNS boolean operations that failed particularly on surfaces + created with Lathe, Revolve, or Helix. + * Segfault in Remove Spline Point context menu. * A point in 3d constrained to any line whose length is free no longer causes the line length to collapse. * Curve-line constraints (in 3d), parallel constraints (in 3d), and From e7942b56e517114461d825ebb434688978e04a21 Mon Sep 17 00:00:00 2001 From: Johannes Rehnman Date: Sat, 6 Jun 2020 18:32:46 +0200 Subject: [PATCH 124/646] Allow DXF import of 3D arcs and circles Extrusion direction (normal) of arcs and circles were not taken into account when importing. - Add method for calculating a quaternion from extrusion direction according to DXF arbitrary axis algorithm - Add required workplanes for arcs not on XY origin plane - Adjust addDimRadial and addDimDiametric to include normal when creating associated circle request --- extlib/libdxfrw | 2 +- src/importdxf.cpp | 101 +++++++++++++++++++++++++++++++++++++++------- 2 files changed, 88 insertions(+), 15 deletions(-) diff --git a/extlib/libdxfrw b/extlib/libdxfrw index 03fa5f30f..0b7b7b709 160000 --- a/extlib/libdxfrw +++ b/extlib/libdxfrw @@ -1 +1 @@ -Subproject commit 03fa5f30f1a1db7231a25653c9dd38044fe06640 +Subproject commit 0b7b7b709d9299565db603f878214656ef5e9ddf diff --git a/src/importdxf.cpp b/src/importdxf.cpp index f5c44086e..ce80280a8 100644 --- a/src/importdxf.cpp +++ b/src/importdxf.cpp @@ -9,6 +9,21 @@ static std::string ToUpper(std::string str) { return str; } +static Quaternion NormalFromExtPoint(Vector extPoint) { + // DXF arbitrary axis algorithm for transforming a Z-vector into a rotated + // coordinate system + Vector ax, ay; + Vector az = extPoint.WithMagnitude(1.0); + + if ((fabs(az.x) < 1/64.) && (fabs(az.y) < 1/64.)) { + ax = Vector::From(0, 1, 0).Cross(az).WithMagnitude(1.0); + } else { + ax = Vector::From(0, 0, 1).Cross(az).WithMagnitude(1.0); + } + ay = az.Cross(ax).WithMagnitude(1.0); + return Quaternion::From(ax, ay); +} + class DxfImport : public DRW_Interface { public: Vector blockX; @@ -516,12 +531,41 @@ class DxfImport : public DRW_Interface { return hr.entity(0); } - hEntity createCircle(const Vector &c, double r, hStyle style) { + hEntity createWorkplane(const Vector &p, const Quaternion &q) { + hRequest hr = SS.GW.AddRequest(Request::Type::WORKPLANE, /*rememberForUndo=*/false); + SK.GetEntity(hr.entity(1))->PointForceTo(p); + processPoint(hr.entity(1)); + SK.GetEntity(hr.entity(32))->NormalForceTo(q); + return hr.entity(0); + } + + hEntity findOrCreateWorkplane(const Vector &p, const Quaternion &q) { + Vector z = q.RotationN(); + for(auto &r : SK.request) { + if((r.type == Request::Type::WORKPLANE) && (r.group == SS.GW.activeGroup)) { + Vector wp = SK.GetEntity(r.h.entity(1))->PointGetNum(); + Vector wz = SK.GetEntity(r.h.entity(32))->NormalN(); + + if ((p.DistanceToPlane(wz, wp) < LENGTH_EPS) && z.Equals(wz)) { + return r.h.entity(0); + } + } + } + + return createWorkplane(p, q); + } + + static void activateWorkplane(hEntity he) { + Group *g = SK.GetGroup(SS.GW.activeGroup); + g->activeWorkplane = he; + } + + hEntity createCircle(const Vector &c, const Quaternion &q, double r, hStyle style) { hRequest hr = SS.GW.AddRequest(Request::Type::CIRCLE, /*rememberForUndo=*/false); SK.GetEntity(hr.entity(1))->PointForceTo(c); processPoint(hr.entity(1)); + SK.GetEntity(hr.entity(32))->NormalForceTo(q); SK.GetEntity(hr.entity(64))->DistanceForceTo(r); - configureRequest(hr, style); return hr.entity(0); } @@ -560,13 +604,25 @@ class DxfImport : public DRW_Interface { if(data.space != DRW::ModelSpace) return; if(addPendingBlockEntity(data)) return; - hRequest hr = SS.GW.AddRequest(Request::Type::ARC_OF_CIRCLE, /*rememberForUndo=*/false); double r = data.radious; double sa = data.staangle; double ea = data.endangle; - Vector c = Vector::From(data.basePoint.x, data.basePoint.y, data.basePoint.z); - Vector rvs = Vector::From(r * cos(sa), r * sin(sa), data.basePoint.z).Plus(c); - Vector rve = Vector::From(r * cos(ea), r * sin(ea), data.basePoint.z).Plus(c); + Vector c = toVector(data.basePoint); + Vector nz = toVector(data.extPoint); + Quaternion q = NormalFromExtPoint(nz); + + bool planar = q.RotationN().Equals(Vector::From(0, 0, 1)); + bool onPlane = c.z < LENGTH_EPS; + + hEntity oldWorkplane = SS.GW.ActiveWorkplane(); + if (!planar || !onPlane) { + activateWorkplane(findOrCreateWorkplane(c, q)); + } + + hRequest hr = SS.GW.AddRequest(Request::Type::ARC_OF_CIRCLE, /*rememberForUndo=*/false); + Vector u = q.RotationU(), v = q.RotationV(); + Vector rvs = c.Plus(u.ScaledBy(r * cos(sa))).Plus(v.ScaledBy(r * sin(sa))); + Vector rve = c.Plus(u.ScaledBy(r * cos(ea))).Plus(v.ScaledBy(r * sin(ea))); if(data.extPoint.z == -1.0) { c.x = -c.x; @@ -584,13 +640,16 @@ class DxfImport : public DRW_Interface { processPoint(hr.entity(2)); processPoint(hr.entity(3)); configureRequest(hr, styleFor(&data)); + activateWorkplane(oldWorkplane); } void addCircle(const DRW_Circle &data) override { if(data.space != DRW::ModelSpace) return; if(addPendingBlockEntity(data)) return; - createCircle(toVector(data.basePoint), data.radious, styleFor(&data)); + Vector nz = toVector(data.extPoint); + Quaternion normal = NormalFromExtPoint(nz); + createCircle(toVector(data.basePoint), normal, data.radious, styleFor(&data)); } void addLWPolyline(const DRW_LWPolyline &data) override { @@ -835,9 +894,9 @@ class DxfImport : public DRW_Interface { } } - hConstraint createDiametric(Vector cp, double r, Vector tp, double actual, - bool asRadius = false) { - hEntity he = createCircle(cp, r, invisibleStyle()); + hConstraint createDiametric(Vector cp, Quaternion q, double r, Vector tp, + double actual, bool asRadius = false) { + hEntity he = createCircle(cp, q, r, invisibleStyle()); hConstraint hc = Constraint::Constrain( Constraint::Type::DIAMETER, @@ -869,7 +928,9 @@ class DxfImport : public DRW_Interface { actual = data->getActualMeasurement(); } - createDiametric(cp, cp.Minus(dp).Magnitude(), tp, actual, /*asRadius=*/true); + Vector nz = toVector(data->getExtrusion()); + Quaternion q = NormalFromExtPoint(nz); + createDiametric(cp, q, cp.Minus(dp).Magnitude(), tp, actual, /*asRadius=*/true); } void addDimDiametric(const DRW_DimDiametric *data) override { @@ -886,7 +947,9 @@ class DxfImport : public DRW_Interface { actual = data->getActualMeasurement(); } - createDiametric(cp, cp.Minus(dp1).Magnitude(), tp, actual, /*asRadius=*/false); + Vector nz = toVector(data->getExtrusion()); + Quaternion q = NormalFromExtPoint(nz); + createDiametric(cp, q, cp.Minus(dp1).Magnitude(), tp, actual, /*asRadius=*/false); } void addDimAngular3P(const DRW_DimAngular3p *data) override { @@ -972,11 +1035,13 @@ class DxfCheck3D : public DRW_Interface { void addArc(const DRW_Arc &data) override { if(data.space != DRW::ModelSpace) return; checkCoord(data.basePoint); + checkExt(data.extPoint); } void addCircle(const DRW_Circle &data) override { if(data.space != DRW::ModelSpace) return; checkCoord(data.basePoint); + checkExt(data.extPoint); } void addPolyline(const DRW_Polyline &data) override { @@ -1041,6 +1106,7 @@ class DxfCheck3D : public DRW_Interface { checkCoord(data->getCenterPoint()); checkCoord(data->getDiameterPoint()); checkCoord(data->getTextPoint()); + checkExt(data->getExtrusion()); } void addDimDiametric(const DRW_DimDiametric *data) override { @@ -1048,6 +1114,7 @@ class DxfCheck3D : public DRW_Interface { checkCoord(data->getDiameter1Point()); checkCoord(data->getDiameter2Point()); checkCoord(data->getTextPoint()); + checkExt(data->getExtrusion()); } void addDimAngular3P(const DRW_DimAngular3p *data) override { @@ -1066,6 +1133,12 @@ class DxfCheck3D : public DRW_Interface { is3d = true; } } + + void checkExt(const DRW_Coord &coord) { + if ((fabs(coord.x) > 1/64.) || (fabs(coord.y) > 1/64.)) { + is3d = true; + } + } }; static void @@ -1112,14 +1185,14 @@ ImportDwgDxf(const Platform::Path &filename, void ImportDxf(const Platform::Path &filename) { ImportDwgDxf(filename, [](const std::string &data, DRW_Interface *intf) { std::stringstream stream(data); - return dxfRW().read(stream, intf, /*ext=*/false); + return dxfRW().read(stream, intf, /*ext=*/true); }); } void ImportDwg(const Platform::Path &filename) { ImportDwgDxf(filename, [](const std::string &data, DRW_Interface *intf) { std::stringstream stream(data); - return dwgR().read(stream, intf, /*ext=*/false); + return dwgR().read(stream, intf, /*ext=*/true); }); } From e9881dfc74e10405305f46b9619371a8b7fdf940 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 1 Oct 2020 13:19:32 -0400 Subject: [PATCH 125/646] Fix issue 684 as whitequark suggested via WM_KEYDOWN->WMCHAR change. --- src/platform/guiwin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index 8e40efccb..43e7a59af 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1058,7 +1058,7 @@ class WindowImplWin32 final : public Window { sscheck(window = (WindowImplWin32 *)GetWindowLongPtr(hWindow, 0)); switch(msg) { - case WM_KEYDOWN: + case WM_CHAR: if(wParam == VK_RETURN) { if(window->onEditingDone) { int length; From e89876bba81ae93ae31c031b496e46f9d60be50f Mon Sep 17 00:00:00 2001 From: julien581 <71768120+julien581@users.noreply.github.com> Date: Wed, 23 Sep 2020 14:30:54 -0300 Subject: [PATCH 126/646] Fix for https://github.com/solvespace/solvespace/issues/248 --- src/platform/guimac.mm | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index 55116ea1b..0f0997c43 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -458,13 +458,25 @@ - (void)mouseMotionEvent:(NSEvent *)nsEvent { } } +- (void)mouseMotionEvent:(NSEvent *)nsEvent withButton:(Platform::MouseEvent::Button)button { + using Platform::MouseEvent; + + MouseEvent event = [self convertMouseEvent:nsEvent]; + event.type = MouseEvent::Type::MOTION; + event.button = button; + + if(receiver->onMouseEvent) { + receiver->onMouseEvent(event); + } +} + - (void)mouseMoved:(NSEvent *)nsEvent { [self mouseMotionEvent:nsEvent]; [super mouseMoved:nsEvent]; } - (void)mouseDragged:(NSEvent *)nsEvent { - [self mouseMotionEvent:nsEvent]; + [self mouseMotionEvent:nsEvent withButton:Platform::MouseEvent::Button::LEFT]; } - (void)otherMouseDragged:(NSEvent *)nsEvent { From 329d8b06598fc2670bc3fb76b1ffc53acf0951c9 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 9 Oct 2020 15:10:22 -0400 Subject: [PATCH 127/646] Create intersection curves from existing ones. When a plane coinsides with a seam we need to copy that trim curve. The existing curve belongs to the original shell surfaces and an intersection is otherwise not found. Fixes #540. --- src/srf/surface.h | 1 + src/srf/surfinter.cpp | 50 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/src/srf/surface.h b/src/srf/surface.h index ba4414a2a..393be4aa3 100644 --- a/src/srf/surface.h +++ b/src/srf/surface.h @@ -342,6 +342,7 @@ class SSurface { void GetAxisAlignedBounding(Vector *ptMax, Vector *ptMin) const; bool CoincidentWithPlane(Vector n, double d) const; bool CoincidentWith(SSurface *ss, bool sameNormal) const; + bool ContainsPlaneCurve(SCurve *sc) const; bool IsExtrusion(SBezier *of, Vector *along) const; bool IsCylinder(Vector *axis, Vector *center, double *r, Vector *start, Vector *finish) const; diff --git a/src/srf/surfinter.cpp b/src/srf/surfinter.cpp index ddcbad23d..1e4fb3967 100644 --- a/src/srf/surfinter.cpp +++ b/src/srf/surfinter.cpp @@ -313,6 +313,38 @@ void SSurface::IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB, inters.Clear(); lv.Clear(); } else { + if((degm == 1 && degn == 1) || (b->degm == 1 && b->degn == 1)) { + // we should only be here if just one surface is a plane because the + // plane-plane case was already handled above. Need to check the other + // nonplanar surface for trim curves that lie in the plane and are not + // already trimming both surfaces. This happens when we cut a Lathe shell + // on one of the seams for example. + // This also seems necessary to merge some coincident surfaces. + SSurface *splane, *sext; + SShell *shext; + if(degm == 1 && degn == 1) { // this and other checks assume coplanar ctrl pts. + splane = this; + sext = b; + shext = agnstB; + } else { + splane = b; + sext = this; + shext = agnstA; + } + SCurve *sc; + for(sc = shext->curve.First(); sc; sc = shext->curve.NextAfter(sc)) { + if(sc->source == SCurve::Source::INTERSECTION) continue; + if(!sc->isExact) continue; + if((sc->surfA != sext->h) && (sc->surfB != sext->h)) continue; + // we have a curve belonging to the curved surface and not the plane. + // does it lie completely in the plane? + if(splane->ContainsPlaneCurve(sc)) { + SBezier bezier = sc->exact; + AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into); + } + } + } + // Try intersecting the surfaces numerically, by a marching algorithm. // First, we find all the intersections between a surface and the // boundary of the other surface. @@ -505,6 +537,24 @@ bool SSurface::CoincidentWithPlane(Vector n, double d) const { return true; } +//----------------------------------------------------------------------------- +// Does a planar surface contain a curve? Does the curve lie completely in plane? +//----------------------------------------------------------------------------- +bool SSurface::ContainsPlaneCurve(SCurve *sc) const { + if(degm != 1 || degn != 1) return false; + if(!sc->isExact) return false; // we don't handle those (yet?) + + Vector p = ctrl[0][0]; + Vector n = NormalAt(0, 0).WithMagnitude(1); + double d = n.Dot(p); + + // check all control points on the curve + for(int i=0; i<= sc->exact.deg; i++) { + if(fabs(n.Dot(sc->exact.ctrl[i]) - d) > LENGTH_EPS) return false; + } + return true; +} + //----------------------------------------------------------------------------- // In our shell, find all surfaces that are coincident with the prototype // surface (with same or opposite normal, as specified), and copy all of From 300b093150dc13bd71486740dd3c18ab9d0a6e60 Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 16 Oct 2020 16:54:21 +0300 Subject: [PATCH 128/646] Win32: Fix "File|Open...", "Save" and "Save As" when a command line argument is used. `GetSaveFileNameA` `OPENFILENAMEA` does not like UNC ( "\\\\?\\C:\\..." ) file prefixes in `lpstrFile`. Work around it by not `Expand`-ing parameters passed on the command line too early. The only user visible change is that "File|Open Recent" will show items as they were passed instead of expanded to full path for example: "..\..\NURBSTests\Intersection2.slvs" Fixes: https://github.com/solvespace/solvespace/issues/622 --- src/platform/entrygui.cpp | 2 +- src/platform/platform.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/entrygui.cpp b/src/platform/entrygui.cpp index 30fd44389..397831acb 100644 --- a/src/platform/entrygui.cpp +++ b/src/platform/entrygui.cpp @@ -21,7 +21,7 @@ int main(int argc, char** argv) { dbp("Only the first file passed on command line will be opened."); } - SS.Load(Platform::Path::From(args.back()).Expand(/*fromCurrentDirectory=*/true)); + SS.Load(Platform::Path::From(args.back())); } Platform::RunGui(); diff --git a/src/platform/platform.cpp b/src/platform/platform.cpp index a0809821d..f025c861b 100644 --- a/src/platform/platform.cpp +++ b/src/platform/platform.cpp @@ -401,7 +401,7 @@ FILE *OpenFile(const Platform::Path &filename, const char *mode) { ssassert(filename.raw.length() == strlen(filename.raw.c_str()), "Unexpected null byte in middle of a path"); #if defined(WIN32) - return _wfopen(Widen(filename.Expand().raw).c_str(), Widen(mode).c_str()); + return _wfopen(Widen(filename.Expand(/*fromCurrentDirectory=*/true).raw).c_str(), Widen(mode).c_str()); #else return fopen(filename.raw.c_str(), mode); #endif From 4f89aeff87b1038c71f125f8827cf67c228bfeb9 Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 16 Oct 2020 23:35:40 +0300 Subject: [PATCH 129/646] Fix crash in solvespace-cli `window` is a `nullptr` with guinone.cpp - avoid dereferencing it. Fixes: https://github.com/solvespace/solvespace/issues/567 --- src/draw.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/draw.cpp b/src/draw.cpp index db2f33e58..1dabd75bb 100644 --- a/src/draw.cpp +++ b/src/draw.cpp @@ -305,9 +305,16 @@ void GraphicsWindow::GroupSelection() { Camera GraphicsWindow::GetCamera() const { Camera camera = {}; - window->GetContentSize(&camera.width, &camera.height); - camera.pixelRatio = window->GetDevicePixelRatio(); - camera.gridFit = (window->GetDevicePixelRatio() == 1); + if(window) { + window->GetContentSize(&camera.width, &camera.height); + camera.pixelRatio = window->GetDevicePixelRatio(); + camera.gridFit = (window->GetDevicePixelRatio() == 1); + } else { // solvespace-cli + camera.width = 297.0; // A4? Whatever... + camera.height = 210.0; + camera.pixelRatio = 1.0; + camera.gridFit = camera.pixelRatio == 1.0; + } camera.offset = offset; camera.projUp = projUp; camera.projRight = projRight; From bdded903fc4a88761618a0dd8b0f4d07512d433d Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Fri, 16 Oct 2020 21:11:42 +0200 Subject: [PATCH 130/646] Travis: add windows target Mimic the appveyor cfg without the artifact deployment. Also upgrade to Visual Studio 2017/v141 toolset. --- .travis.yml | 5 +++++ .travis/build-windows.sh | 16 ++++++++++++++++ .travis/install-windows.sh | 3 +++ 3 files changed, 24 insertions(+) create mode 100755 .travis/build-windows.sh create mode 100755 .travis/install-windows.sh diff --git a/.travis.yml b/.travis.yml index 1c90474b9..76f5ef1a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,11 @@ jobs: dist: bionic install: ./.travis/install-debian.sh script: ./.travis/build-debian.sh + - stage: test + name: "Windows Visual Studio 2017" + os: windows + install: ./.travis/install-windows.sh + script: ./.travis/build-windows.sh - stage: deploy name: "OSX" os: osx diff --git a/.travis/build-windows.sh b/.travis/build-windows.sh new file mode 100755 index 000000000..e7502e6ba --- /dev/null +++ b/.travis/build-windows.sh @@ -0,0 +1,16 @@ +#!/bin/sh -xe + +MSBUILD_PATH="c:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" +export PATH=$MSBUILD_PATH:$PATH + +if echo $TRAVIS_TAG | grep ^v; then BUILD_TYPE=RelWithDebInfo; else BUILD_TYPE=Debug; fi + +mkdir build +cd build +cmake .. -G "Visual Studio 15 2017 Win64" -DCMAKE_BUILD_TYPE=$BUILD_TYPE + +MSBuild.exe "src/solvespace.vcxproj" +MSBuild.exe "src/solvespace-cli.vcxproj" +MSBuild.exe "test/solvespace-testsuite.vcxproj" + +bin/$BUILD_TYPE/solvespace-testsuite.exe diff --git a/.travis/install-windows.sh b/.travis/install-windows.sh new file mode 100755 index 000000000..738d67dd7 --- /dev/null +++ b/.travis/install-windows.sh @@ -0,0 +1,3 @@ +#!/bin/sh -xe + +git submodule update --init From d93d8d2c650e4d8421a41b42f71ec1f43f76a464 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sat, 17 Oct 2020 17:05:10 +0200 Subject: [PATCH 131/646] Add macOS travis config, fix issue in CMakeLists.txt causing macOS build to break --- .travis.yml | 36 +++++++++++++++++++++-- .travis/build-macos.sh | 2 +- .travis/install-macos.sh | 4 +-- .travis/sign-macos.sh | 63 ++++++++++++++++++++++++++++++++++++++++ CMakeLists.txt | 9 +++--- 5 files changed, 102 insertions(+), 12 deletions(-) create mode 100644 .travis/sign-macos.sh diff --git a/.travis.yml b/.travis.yml index 76f5ef1a2..792d7c269 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,6 +6,36 @@ jobs: - stage: deploy name: Snap arm64 include: + - stage: test + name: macOS + os: osx + osx_image: xcode11.2 + install: "./.travis/install-macos.sh" + script: "./.travis/build-macos.sh" + deploy: + provider: releases + api_key: + secure: 3PAqaWQTsHKKuItoZnIm7KJkCE/IHjrGtQMvdjabmVr9F/X3nuRYCdhvlSwU6z1N/UIiUso5jDc/qYOxbBnDfXiu2HihW9USaPLLrQoMQHxqAr62Hks1ESMo/rCrYPdqzFBdEbkuP6GqwxXyUDhnvDwXzmqSzhcotEUwiuRnvcTnlf29WT4D0Gz8gEwIkkiMN9msH8mabvd5SkmaBFd+Z7elXn6DpTxZSHRhX8QCW7681pdq424H4qbArIB+I9ccHbS+Cbh8kKBcd/hNX1tFK4SdaUYyywonrWhgPHZzZ8oj0dRGvY19+ZnTJisQmUjiJQDglUeJ+p5RIcUHOnUjM/Io/jWdA78W9Vn0gpjX5F2iBfm0UcSyXwf9dXDFnm9pOCnFjJ1Cv4wxWlRvUXcQxv9hb00cyHYEhzPJRmNUu/DF45caOHYvLADwd0d3UPrfblXpjTPxpDxHHl3QuXQLeERiGsZOg5N6kg0coUO0p60JDdDHrxjiLXDsD8Oe9FMxIfZd6y+hfsQWLFSDyWqod+F4rmROsRdsJaAC8EliRCxBp/jLY8/ntFLAKCwRP57z46wXWe65yOENOErSDZvbrPZbNOm7whX4GsTozfE1dy+3lcsOq+jth3LbyQHuDRNW2/oKtWfOeQ1H+8W+WP1GRpyIOHzClSgMe/k3n7E60Ls= + skip_cleanup: true + file: build/bin/SolveSpace.dmg + on: + repo: vespakoen/solvespace + tags: true + - stage: deploy + name: macOS + os: osx + osx_image: xcode11.2 + install: "./.travis/install-macos.sh" + script: "./.travis/build-macos.sh && ./.travis/sign-macos.sh" + deploy: + provider: releases + api_key: + secure: 3PAqaWQTsHKKuItoZnIm7KJkCE/IHjrGtQMvdjabmVr9F/X3nuRYCdhvlSwU6z1N/UIiUso5jDc/qYOxbBnDfXiu2HihW9USaPLLrQoMQHxqAr62Hks1ESMo/rCrYPdqzFBdEbkuP6GqwxXyUDhnvDwXzmqSzhcotEUwiuRnvcTnlf29WT4D0Gz8gEwIkkiMN9msH8mabvd5SkmaBFd+Z7elXn6DpTxZSHRhX8QCW7681pdq424H4qbArIB+I9ccHbS+Cbh8kKBcd/hNX1tFK4SdaUYyywonrWhgPHZzZ8oj0dRGvY19+ZnTJisQmUjiJQDglUeJ+p5RIcUHOnUjM/Io/jWdA78W9Vn0gpjX5F2iBfm0UcSyXwf9dXDFnm9pOCnFjJ1Cv4wxWlRvUXcQxv9hb00cyHYEhzPJRmNUu/DF45caOHYvLADwd0d3UPrfblXpjTPxpDxHHl3QuXQLeERiGsZOg5N6kg0coUO0p60JDdDHrxjiLXDsD8Oe9FMxIfZd6y+hfsQWLFSDyWqod+F4rmROsRdsJaAC8EliRCxBp/jLY8/ntFLAKCwRP57z46wXWe65yOENOErSDZvbrPZbNOm7whX4GsTozfE1dy+3lcsOq+jth3LbyQHuDRNW2/oKtWfOeQ1H+8W+WP1GRpyIOHzClSgMe/k3n7E60Ls= + skip_cleanup: true + file: build/bin/SolveSpace.dmg + on: + repo: vespakoen/solvespace + tags: true - stage: test name: "Debian" os: linux @@ -40,9 +70,9 @@ jobs: arch: amd64 dist: bionic addons: - snaps: - - name: snapcraft - confinement: classic + snaps: + - name: snapcraft + confinement: classic script: ./.travis/build-snap.sh deploy: - provider: script diff --git a/.travis/build-macos.sh b/.travis/build-macos.sh index b87e2fdbb..4629442b2 100755 --- a/.travis/build-macos.sh +++ b/.travis/build-macos.sh @@ -5,5 +5,5 @@ if echo $TRAVIS_TAG | grep ^v; then BUILD_TYPE=RelWithDebInfo; else BUILD_TYPE=D mkdir build cd build cmake -DCMAKE_OSX_DEPLOYMENT_TARGET=10.7 -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. -make VERBOSE=1 +make make test_solvespace diff --git a/.travis/install-macos.sh b/.travis/install-macos.sh index 792126cae..0c6a6e7ca 100755 --- a/.travis/install-macos.sh +++ b/.travis/install-macos.sh @@ -1,5 +1,3 @@ #!/bin/sh -xe -brew update -brew install freetype cairo -git submodule update --init +git submodule update --init \ No newline at end of file diff --git a/.travis/sign-macos.sh b/.travis/sign-macos.sh new file mode 100644 index 000000000..cf4ec073b --- /dev/null +++ b/.travis/sign-macos.sh @@ -0,0 +1,63 @@ +#!/bin/sh -xe + +cd build + +app="bin/SolveSpace.app" +dmg="bin/SolveSpace.dmg" +bundle_id="com.solvespace.solvespace" + +# get the signing certificate (this is the Developer ID:Application: Your Name, exported to a p12 file, then converted to base64, e.g.: cat ~/Desktop/certificate.p12 | base64 | pbcopy) +echo $MACOS_CERTIFICATE_P12 | base64 --decode > certificate.p12 + +# create a keychain +security create-keychain -p secret build.keychain +security default-keychain -s build.keychain +security unlock-keychain -p secret build.keychain + +# import the key +security import certificate.p12 -k build.keychain -P $MACOS_CERTIFICATE_PASSWORD -T /usr/bin/codesign + +security set-key-partition-list -S apple-tool:,apple: -s -k secret build.keychain +#security set-keychain-settings -t 3600 -u build.keychain + +# check if all is good +security find-identity -v + +# sign the .app +codesign -s "${MACOS_DEVELOPER_ID}" --timestamp --options runtime -f --deep "${app}" + +# create the .dmg from the signed .app +hdiutil create -srcfolder "${app}" "${dmg}" + +# sign the .dmg +codesign -s "${MACOS_DEVELOPER_ID}" --timestamp --options runtime -f "${dmg}" + +# notarize and store request uuid in variable +notarize_uuid=$(xcrun altool --notarize-app --primary-bundle-id "${bundle_id}" --username "${MACOS_APPSTORE_USERNAME}" --password "${MACOS_APPSTORE_APP_PASSWORD}" --file "${dmg}" 2>&1 | grep RequestUUID | awk '{print $3'}) + +# wait a bit so we don't get errors during checking +sleep 5 + +success=0 +for (( ; ; )) +do + echo "Checking progress..." + progress=$(xcrun altool --notarization-info "${notarize_uuid}" -u "${MACOS_APPSTORE_USERNAME}" -p "${MACOS_APPSTORE_APP_PASSWORD}" 2>&1) + echo "${progress}" + + if [ $? -ne 0 ] || [[ "${progress}" =~ "Invalid" ]] ; then + echo "Error with notarization. Exiting" + break + fi + + if [[ "${progress}" =~ "success" ]]; then + success=1 + break + else + echo "Not completed yet. Sleeping for 10 seconds" + fi + sleep 10 +done + +# staple +xcrun stapler staple $app \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 40071be4f..836c58a00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,6 +22,10 @@ set(CMAKE_USER_MAKE_RULES_OVERRIDE set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX "${CMAKE_SOURCE_DIR}/cmake/cxx_flag_overrides.cmake") +if(APPLE OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") +endif() + # project # NOTE TO PACKAGERS: The embedded git commit hash is critical for rapid bug triage when the builds @@ -69,7 +73,6 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") endif() # common compiler flags - include(CheckCXXCompilerFlag) set(FILE_PREFIX_MAP "-ffile-prefix-map=${CMAKE_CURRENT_SOURCE_DIR}=.") @@ -109,10 +112,6 @@ if(ENABLE_OPENMP) endif() endif() -if(APPLE OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") -endif() - if(CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") set(CMAKE_EXE_LINKER_FLAGS "-Wl,--as-needed ${CMAKE_EXE_LINKER_FLAGS}") endif() From 4abdf21256d0140067dc9ed7aa74d1a614f4c2a3 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 18 Oct 2020 10:50:02 +0200 Subject: [PATCH 132/646] Update .travis.yml for macOS build Update .travis.yml for macOS build Add executable permission on sign-macos.sh script --- .travis.yml | 24 ++++-------------------- .travis/sign-macos.sh | 12 ++++-------- 2 files changed, 8 insertions(+), 28 deletions(-) mode change 100644 => 100755 .travis/sign-macos.sh diff --git a/.travis.yml b/.travis.yml index 792d7c269..b6a5ebf09 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,11 +15,11 @@ jobs: deploy: provider: releases api_key: - secure: 3PAqaWQTsHKKuItoZnIm7KJkCE/IHjrGtQMvdjabmVr9F/X3nuRYCdhvlSwU6z1N/UIiUso5jDc/qYOxbBnDfXiu2HihW9USaPLLrQoMQHxqAr62Hks1ESMo/rCrYPdqzFBdEbkuP6GqwxXyUDhnvDwXzmqSzhcotEUwiuRnvcTnlf29WT4D0Gz8gEwIkkiMN9msH8mabvd5SkmaBFd+Z7elXn6DpTxZSHRhX8QCW7681pdq424H4qbArIB+I9ccHbS+Cbh8kKBcd/hNX1tFK4SdaUYyywonrWhgPHZzZ8oj0dRGvY19+ZnTJisQmUjiJQDglUeJ+p5RIcUHOnUjM/Io/jWdA78W9Vn0gpjX5F2iBfm0UcSyXwf9dXDFnm9pOCnFjJ1Cv4wxWlRvUXcQxv9hb00cyHYEhzPJRmNUu/DF45caOHYvLADwd0d3UPrfblXpjTPxpDxHHl3QuXQLeERiGsZOg5N6kg0coUO0p60JDdDHrxjiLXDsD8Oe9FMxIfZd6y+hfsQWLFSDyWqod+F4rmROsRdsJaAC8EliRCxBp/jLY8/ntFLAKCwRP57z46wXWe65yOENOErSDZvbrPZbNOm7whX4GsTozfE1dy+3lcsOq+jth3LbyQHuDRNW2/oKtWfOeQ1H+8W+WP1GRpyIOHzClSgMe/k3n7E60Ls= + secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= skip_cleanup: true file: build/bin/SolveSpace.dmg on: - repo: vespakoen/solvespace + repo: solvespace/solvespace tags: true - stage: deploy name: macOS @@ -30,11 +30,11 @@ jobs: deploy: provider: releases api_key: - secure: 3PAqaWQTsHKKuItoZnIm7KJkCE/IHjrGtQMvdjabmVr9F/X3nuRYCdhvlSwU6z1N/UIiUso5jDc/qYOxbBnDfXiu2HihW9USaPLLrQoMQHxqAr62Hks1ESMo/rCrYPdqzFBdEbkuP6GqwxXyUDhnvDwXzmqSzhcotEUwiuRnvcTnlf29WT4D0Gz8gEwIkkiMN9msH8mabvd5SkmaBFd+Z7elXn6DpTxZSHRhX8QCW7681pdq424H4qbArIB+I9ccHbS+Cbh8kKBcd/hNX1tFK4SdaUYyywonrWhgPHZzZ8oj0dRGvY19+ZnTJisQmUjiJQDglUeJ+p5RIcUHOnUjM/Io/jWdA78W9Vn0gpjX5F2iBfm0UcSyXwf9dXDFnm9pOCnFjJ1Cv4wxWlRvUXcQxv9hb00cyHYEhzPJRmNUu/DF45caOHYvLADwd0d3UPrfblXpjTPxpDxHHl3QuXQLeERiGsZOg5N6kg0coUO0p60JDdDHrxjiLXDsD8Oe9FMxIfZd6y+hfsQWLFSDyWqod+F4rmROsRdsJaAC8EliRCxBp/jLY8/ntFLAKCwRP57z46wXWe65yOENOErSDZvbrPZbNOm7whX4GsTozfE1dy+3lcsOq+jth3LbyQHuDRNW2/oKtWfOeQ1H+8W+WP1GRpyIOHzClSgMe/k3n7E60Ls= + secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= skip_cleanup: true file: build/bin/SolveSpace.dmg on: - repo: vespakoen/solvespace + repo: solvespace/solvespace tags: true - stage: test name: "Debian" @@ -47,22 +47,6 @@ jobs: os: windows install: ./.travis/install-windows.sh script: ./.travis/build-windows.sh - - stage: deploy - name: "OSX" - os: osx - osx_image: xcode8.3 - install: ./.travis/install-macos.sh - # the awk command is a workaround for https://github.com/travis-ci/travis-ci/issues/4704. - script: ./.travis/build-macos.sh | awk '/.{0,32}/ {print $0}' - deploy: - provider: releases - api_key: - secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= - skip_cleanup: true - file: build/SolveSpace.dmg - on: - repo: solvespace/solvespace - tags: true - &deploy-snap stage: deploy name: Snap amd64 diff --git a/.travis/sign-macos.sh b/.travis/sign-macos.sh old mode 100644 new mode 100755 index cf4ec073b..e5e762323 --- a/.travis/sign-macos.sh +++ b/.travis/sign-macos.sh @@ -2,7 +2,7 @@ cd build -app="bin/SolveSpace.app" +# app="bin/SolveSpace.app" dmg="bin/SolveSpace.dmg" bundle_id="com.solvespace.solvespace" @@ -23,18 +23,14 @@ security set-key-partition-list -S apple-tool:,apple: -s -k secret build.keychai # check if all is good security find-identity -v -# sign the .app -codesign -s "${MACOS_DEVELOPER_ID}" --timestamp --options runtime -f --deep "${app}" - -# create the .dmg from the signed .app -hdiutil create -srcfolder "${app}" "${dmg}" - # sign the .dmg -codesign -s "${MACOS_DEVELOPER_ID}" --timestamp --options runtime -f "${dmg}" +codesign -s "${MACOS_DEVELOPER_ID}" --timestamp --options runtime -f --deep "${dmg}" # notarize and store request uuid in variable notarize_uuid=$(xcrun altool --notarize-app --primary-bundle-id "${bundle_id}" --username "${MACOS_APPSTORE_USERNAME}" --password "${MACOS_APPSTORE_APP_PASSWORD}" --file "${dmg}" 2>&1 | grep RequestUUID | awk '{print $3'}) +echo $notarize_uuid + # wait a bit so we don't get errors during checking sleep 5 From 1bb066cee46544b07e18dcd56b381cf32b90d326 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 17 Oct 2020 14:05:29 -0400 Subject: [PATCH 133/646] Avoid zero tangnet vectors on degenerate NURBS edges. Fixes #652 --- src/srf/ratpoly.cpp | 8 +++++++- src/srf/surface.h | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/srf/ratpoly.cpp b/src/srf/ratpoly.cpp index 8e43367de..05ccd038e 100644 --- a/src/srf/ratpoly.cpp +++ b/src/srf/ratpoly.cpp @@ -332,7 +332,7 @@ Vector SSurface::PointAt(double u, double v) const { return num; } -void SSurface::TangentsAt(double u, double v, Vector *tu, Vector *tv) const { +void SSurface::TangentsAt(double u, double v, Vector *tu, Vector *tv, bool retry) const { Vector num = Vector::From(0, 0, 0), num_u = Vector::From(0, 0, 0), num_v = Vector::From(0, 0, 0); @@ -364,6 +364,12 @@ void SSurface::TangentsAt(double u, double v, Vector *tu, Vector *tv) const { *tv = ((num_v.ScaledBy(den)).Minus(num.ScaledBy(den_v))); *tv = tv->ScaledBy(1.0/(den*den)); + + // Tangent is zero at sungularities like the north pole. Move away a bit and retry. + if(tv->Equals(Vector::From(0,0,0)) && retry) + TangentsAt(u+(0.5-u)*0.00001, v, tu, tv, false); + if(tu->Equals(Vector::From(0,0,0)) && retry) + TangentsAt(u, v+(0.5-v)*0.00001, tu, tv, false); } Vector SSurface::NormalAt(Point2d puv) const { diff --git a/src/srf/surface.h b/src/srf/surface.h index 393be4aa3..ff8aa0f2f 100644 --- a/src/srf/surface.h +++ b/src/srf/surface.h @@ -335,7 +335,7 @@ class SSurface { void PointOnCurve(const SBezier *curve, double *up, double *vp); Vector PointAt(double u, double v) const; Vector PointAt(Point2d puv) const; - void TangentsAt(double u, double v, Vector *tu, Vector *tv) const; + void TangentsAt(double u, double v, Vector *tu, Vector *tv, bool retry=true) const; Vector NormalAt(Point2d puv) const; Vector NormalAt(double u, double v) const; bool LineEntirelyOutsideBbox(Vector a, Vector b, bool asSegment) const; From 089b5670af4756d3189096e3dcec17bd79f52e4a Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 19 Oct 2020 11:24:37 +0200 Subject: [PATCH 134/646] macOS CI fixes --- .travis/build-macos.sh | 4 ++-- .travis/sign-macos.sh | 9 +++++++-- src/CMakeLists.txt | 10 ---------- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/.travis/build-macos.sh b/.travis/build-macos.sh index 4629442b2..3e861deb7 100755 --- a/.travis/build-macos.sh +++ b/.travis/build-macos.sh @@ -4,6 +4,6 @@ if echo $TRAVIS_TAG | grep ^v; then BUILD_TYPE=RelWithDebInfo; else BUILD_TYPE=D mkdir build cd build -cmake -DCMAKE_OSX_DEPLOYMENT_TARGET=10.7 -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. -make +cmake -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. +make -j2 make test_solvespace diff --git a/.travis/sign-macos.sh b/.travis/sign-macos.sh index e5e762323..da90ec21c 100755 --- a/.travis/sign-macos.sh +++ b/.travis/sign-macos.sh @@ -2,7 +2,7 @@ cd build -# app="bin/SolveSpace.app" +app="bin/SolveSpace.app" dmg="bin/SolveSpace.dmg" bundle_id="com.solvespace.solvespace" @@ -18,11 +18,16 @@ security unlock-keychain -p secret build.keychain security import certificate.p12 -k build.keychain -P $MACOS_CERTIFICATE_PASSWORD -T /usr/bin/codesign security set-key-partition-list -S apple-tool:,apple: -s -k secret build.keychain -#security set-keychain-settings -t 3600 -u build.keychain # check if all is good security find-identity -v +# sign the .app +codesign -s "${MACOS_DEVELOPER_ID}" --timestamp --options runtime -f --deep "${app}" + +# create the .dmg from the signed .app +hdiutil create -srcfolder "${app}" "${dmg}" + # sign the .dmg codesign -s "${MACOS_DEVELOPER_ID}" --timestamp --options runtime -f --deep "${dmg}" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1b6d90051..fd8359f69 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -410,14 +410,4 @@ if(APPLE) COMMAND ${CMAKE_COMMAND} -E copy $ ${bundle_bin} COMMENT "Bundling executable solvespace-cli" VERBATIM) - - add_custom_command(OUTPUT ${EXECUTABLE_OUTPUT_PATH}/${bundle}.dmg - COMMAND ${CMAKE_COMMAND} -E remove ${EXECUTABLE_OUTPUT_PATH}/${bundle}.dmg - COMMAND hdiutil create -srcfolder ${EXECUTABLE_OUTPUT_PATH}/${bundle}.app - ${EXECUTABLE_OUTPUT_PATH}/${bundle}.dmg - DEPENDS solvespace - COMMENT "Building ${bundle}.dmg" - VERBATIM) - add_custom_target(${bundle}-dmg ALL - DEPENDS ${EXECUTABLE_OUTPUT_PATH}/${bundle}.dmg) endif() From f32c104ee32c481afb0b4b0ecb6b34b700ed40cb Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 18 Oct 2020 17:05:02 -0400 Subject: [PATCH 135/646] Fix some IDF file curves. --- src/importidf.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/importidf.cpp b/src/importidf.cpp index c1e2e3312..c9ce7ec66 100644 --- a/src/importidf.cpp +++ b/src/importidf.cpp @@ -241,7 +241,6 @@ static void MakeBeziersForArcs(SBezierList *sbl, Vector center, Vector pa, Vecto if(angle == 360.0) { thetaa = 0; thetab = 2*PI; - dtheta = 2*PI; } else { Point2d c2 = center.Project2d(u, v); Point2d pa2 = (pa.Project2d(u, v)).Minus(c2); @@ -249,8 +248,9 @@ static void MakeBeziersForArcs(SBezierList *sbl, Vector center, Vector pa, Vecto thetaa = atan2(pa2.y, pa2.x); thetab = atan2(pb2.y, pb2.x); - dtheta = thetab - thetaa; } + dtheta = angle * PI/180; + int i, n; if(dtheta > (3*PI/2 + 0.01)) { n = 4; From 89d627f46e49b992ff2946e2eef9ebe1ac7eeb6c Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 19 Oct 2020 13:57:37 -0400 Subject: [PATCH 136/646] initial support (disabled) for keepout regions in IDF files. --- src/importidf.cpp | 97 ++++++++++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 38 deletions(-) diff --git a/src/importidf.cpp b/src/importidf.cpp index c9ce7ec66..1789e5cc1 100644 --- a/src/importidf.cpp +++ b/src/importidf.cpp @@ -236,18 +236,15 @@ static void MakeBeziersForArcs(SBezierList *sbl, Vector center, Vector pa, Vecto Vector u = q.RotationU(), v = q.RotationV(); double r = pa.Minus(center).Magnitude(); - double thetaa, thetab, dtheta; + double theta, dtheta; if(angle == 360.0) { - thetaa = 0; - thetab = 2*PI; + theta = 0; } else { Point2d c2 = center.Project2d(u, v); Point2d pa2 = (pa.Project2d(u, v)).Minus(c2); - Point2d pb2 = (pb.Project2d(u, v)).Minus(c2); - thetaa = atan2(pa2.y, pa2.x); - thetab = atan2(pb2.y, pb2.x); + theta = atan2(pa2.y, pa2.x); } dtheta = angle * PI/180; @@ -266,17 +263,17 @@ static void MakeBeziersForArcs(SBezierList *sbl, Vector center, Vector pa, Vecto for(i = 0; i < n; i++) { double s, c; - c = cos(thetaa); - s = sin(thetaa); + c = cos(theta); + s = sin(theta); // The start point of the curve, and the tangent vector at // that start point. Vector p0 = center.Plus(u.ScaledBy( r*c)).Plus(v.ScaledBy(r*s)), t0 = u.ScaledBy(-r*s). Plus(v.ScaledBy(r*c)); - thetaa += dtheta; + theta += dtheta; - c = cos(thetaa); - s = sin(thetaa); + c = cos(theta); + s = sin(theta); Vector p2 = center.Plus(u.ScaledBy( r*c)).Plus(v.ScaledBy(r*s)), t2 = u.ScaledBy(-r*s). Plus(v.ScaledBy(r*c)); @@ -335,6 +332,7 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s double board_thickness = 10.0; double scale = 1.0; //mm + bool topEntities, bottomEntities; Quaternion normal = Quaternion::From(Vector::From(1,0,0), Vector::From(0,1,0)); hEntity hnorm = newNormal(el, &entityCount, normal); @@ -347,6 +345,7 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s for(std::string line; getline( stream, line ); ) { if (line.find(".END_") == 0) { section = none; + curve = -1; } switch (section) { case none: @@ -356,6 +355,10 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s } else if (line.find(".BOARD_OUTLINE") == 0) { section = board_outline; record_number = 1; +// no keepouts for now - they should also be shown as construction? +// } else if (line.find(".ROUTE_KEEPOUT") == 0) { +// section = routing_keepout; +// record_number = 1; } else if(line.find(".DRILLED_HOLES") == 0) { section = drilled_holes; record_number = 1; @@ -375,11 +378,23 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s } } break; - + + case routing_keepout: case board_outline: if (record_number == 2) { - board_thickness = std::stod(line) * scale; - dbp("IDF board thickness: %lf", board_thickness); + if(section == board_outline) { + topEntities = true; + bottomEntities = true; + board_thickness = std::stod(line) * scale; + dbp("IDF board thickness: %lf", board_thickness); + } else if (section == routing_keepout) { + topEntities = false; + bottomEntities = false; + if(line.find("TOP") == 0 || line.find("BOTH") == 0) + topEntities = true; + if(line.find("BOTTOM") == 0 || line.find("BOTH") == 0) + bottomEntities = true; + } } else { // records 3+ are lines, arcs, and circles std::vector values = splitString(line); if(values.size() != 4) continue; @@ -391,36 +406,43 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s Vector pTop = Vector::From(x,y,board_thickness); if(c != curve) { // start a new curve curve = c; - hprev = newPoint(el, &entityCount, point, /*visible=*/false); - hprevTop = newPoint(el, &entityCount, pTop, /*visible=*/false); + if (bottomEntities) + hprev = newPoint(el, &entityCount, point, /*visible=*/false); + if (topEntities) + hprevTop = newPoint(el, &entityCount, pTop, /*visible=*/false); pprev = point; pprevTop = pTop; } else { - // create a bezier for the extrusion - if (ang == 0) { - // straight lines - SBezier sb = SBezier::From(pprev, point); - sbl.l.Add(&sb); - } else if (ang != 360.0) { - // Arcs - Vector c = ArcCenter(pprev, point, ang); - MakeBeziersForArcs(&sbl, c, pprev, point, normal, ang); - } else { - // circles - MakeBeziersForArcs(&sbl, point, pprev, pprev, normal, ang); + if(section == board_outline) { + // create a bezier for the extrusion + if (ang == 0) { + // straight lines + SBezier sb = SBezier::From(pprev, point); + sbl.l.Add(&sb); + } else if (ang != 360.0) { + // Arcs + Vector c = ArcCenter(pprev, point, ang); + MakeBeziersForArcs(&sbl, c, pprev, point, normal, ang); + } else { + // circles + MakeBeziersForArcs(&sbl, point, pprev, pprev, normal, ang); + } } // next create the entities // only curves and points at circle centers will be visible bool vis = (ang == 360.0); - hEntity hp = newPoint(el, &entityCount, point, /*visible=*/vis); - CreateEntity(el, &entityCount, hprev, hp, hnorm, pprev, point, ang); - pprev = point; - hprev = hp; - hp = newPoint(el, &entityCount, pTop, /*visible=*/vis); - CreateEntity(el, &entityCount, hprevTop, hp, hnorm, pprevTop, pTop, ang); - pprevTop = pTop; - hprevTop = hp; - + if (bottomEntities) { + hEntity hp = newPoint(el, &entityCount, point, /*visible=*/vis); + CreateEntity(el, &entityCount, hprev, hp, hnorm, pprev, point, ang); + pprev = point; + hprev = hp; + } + if (topEntities) { + hEntity hp = newPoint(el, &entityCount, pTop, /*visible=*/vis); + CreateEntity(el, &entityCount, hprevTop, hp, hnorm, pprevTop, pTop, ang); + pprevTop = pTop; + hprevTop = hp; + } } } break; @@ -428,7 +450,6 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s case other_outline: case routing_outline: case placement_outline: - case routing_keepout: case via_keepout: case placement_group: break; From 57ebd501ba3d4025371c6675c204dec1bddc1899 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Tue, 20 Oct 2020 09:39:26 +0200 Subject: [PATCH 137/646] Travis: Build improvements and fixes (#751) - Add OpenMP to macOS build - Use as many cores as possible in CI - Update travis osx image to xcode12.2 - Ignore .vscode folder - In `.travis/sign-macos.sh`, only create keychain when `CI` variable is present - Only run macOS deploy stage when a tag is pushed --- .gitignore | 1 + .travis.yml | 14 +++----------- .travis/build-debian.sh | 2 +- .travis/build-macos.sh | 26 +++++++++++++++++++++----- .travis/build-windows.sh | 6 +++--- .travis/install-macos.sh | 1 + .travis/sign-macos.sh | 24 +++++++++++++----------- CMakeLists.txt | 22 ++++++++++++++++++++-- src/drawentity.cpp | 10 +++++++--- src/mouse.cpp | 28 ++++++++++++++-------------- src/solvespace.h | 2 +- 11 files changed, 85 insertions(+), 51 deletions(-) diff --git a/.gitignore b/.gitignore index 5301e1426..4f76b2668 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ /debian/libslvs1-dev/ /obj-*/ /*.slvs +.vscode/ diff --git a/.travis.yml b/.travis.yml index b6a5ebf09..d6ac12095 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,22 +9,14 @@ jobs: - stage: test name: macOS os: osx - osx_image: xcode11.2 + osx_image: xcode12.2 install: "./.travis/install-macos.sh" script: "./.travis/build-macos.sh" - deploy: - provider: releases - api_key: - secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= - skip_cleanup: true - file: build/bin/SolveSpace.dmg - on: - repo: solvespace/solvespace - tags: true - stage: deploy + if: tag IS present name: macOS os: osx - osx_image: xcode11.2 + osx_image: xcode12.2 install: "./.travis/install-macos.sh" script: "./.travis/build-macos.sh && ./.travis/sign-macos.sh" deploy: diff --git a/.travis/build-debian.sh b/.travis/build-debian.sh index bb678daf8..007bf805c 100755 --- a/.travis/build-debian.sh +++ b/.travis/build-debian.sh @@ -7,5 +7,5 @@ cd build cmake .. \ -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ -DENABLE_SANITIZERS=ON -make VERBOSE=1 +make -j$(nproc) VERBOSE=1 make test_solvespace diff --git a/.travis/build-macos.sh b/.travis/build-macos.sh index 3e861deb7..31c182b52 100755 --- a/.travis/build-macos.sh +++ b/.travis/build-macos.sh @@ -1,9 +1,25 @@ #!/bin/sh -xe -if echo $TRAVIS_TAG | grep ^v; then BUILD_TYPE=RelWithDebInfo; else BUILD_TYPE=Debug; fi +if echo $TRAVIS_TAG | grep ^v; then + BUILD_TYPE=RelWithDebInfo +else + BUILD_TYPE=Debug +fi -mkdir build +mkdir build || true cd build -cmake -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. -make -j2 -make test_solvespace + +LLVM_PREFIX=$(brew --prefix llvm@9) +export CC="${LLVM_PREFIX}/bin/clang" +export CXX="${CC}++" +export LDFLAGS="-L${LLVM_PREFIX}/lib -Wl,-rpath,${LLVM_PREFIX}/lib" \ +export CFLAGS="-I${LLVM_PREFIX}/include" +export CPPFLAGS="-I${LLVM_PREFIX}/include" + +cmake \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 \ + -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. \ + -DENABLE_OPENMP=ON + +cmake --build . --config $BUILD_TYPE +make -j$(nproc) test_solvespace diff --git a/.travis/build-windows.sh b/.travis/build-windows.sh index e7502e6ba..9cbc38979 100755 --- a/.travis/build-windows.sh +++ b/.travis/build-windows.sh @@ -9,8 +9,8 @@ mkdir build cd build cmake .. -G "Visual Studio 15 2017 Win64" -DCMAKE_BUILD_TYPE=$BUILD_TYPE -MSBuild.exe "src/solvespace.vcxproj" -MSBuild.exe "src/solvespace-cli.vcxproj" -MSBuild.exe "test/solvespace-testsuite.vcxproj" +MSBuild.exe "src/solvespace.vcxproj" -maxcpucount +MSBuild.exe "src/solvespace-cli.vcxproj" -maxcpucount +MSBuild.exe "test/solvespace-testsuite.vcxproj" -maxcpucount bin/$BUILD_TYPE/solvespace-testsuite.exe diff --git a/.travis/install-macos.sh b/.travis/install-macos.sh index 0c6a6e7ca..d4817455a 100755 --- a/.travis/install-macos.sh +++ b/.travis/install-macos.sh @@ -1,3 +1,4 @@ #!/bin/sh -xe +brew install llvm@9 git submodule update --init \ No newline at end of file diff --git a/.travis/sign-macos.sh b/.travis/sign-macos.sh index da90ec21c..6c0fd1b5a 100755 --- a/.travis/sign-macos.sh +++ b/.travis/sign-macos.sh @@ -6,21 +6,23 @@ app="bin/SolveSpace.app" dmg="bin/SolveSpace.dmg" bundle_id="com.solvespace.solvespace" -# get the signing certificate (this is the Developer ID:Application: Your Name, exported to a p12 file, then converted to base64, e.g.: cat ~/Desktop/certificate.p12 | base64 | pbcopy) -echo $MACOS_CERTIFICATE_P12 | base64 --decode > certificate.p12 +if [ "$CI" = "true" ]; then + # get the signing certificate (this is the Developer ID:Application: Your Name, exported to a p12 file, then converted to base64, e.g.: cat ~/Desktop/certificate.p12 | base64 | pbcopy) + echo $MACOS_CERTIFICATE_P12 | base64 --decode > certificate.p12 -# create a keychain -security create-keychain -p secret build.keychain -security default-keychain -s build.keychain -security unlock-keychain -p secret build.keychain + # create a keychain + security create-keychain -p secret build.keychain + security default-keychain -s build.keychain + security unlock-keychain -p secret build.keychain -# import the key -security import certificate.p12 -k build.keychain -P $MACOS_CERTIFICATE_PASSWORD -T /usr/bin/codesign + # import the key + security import certificate.p12 -k build.keychain -P $MACOS_CERTIFICATE_PASSWORD -T /usr/bin/codesign -security set-key-partition-list -S apple-tool:,apple: -s -k secret build.keychain + security set-key-partition-list -S apple-tool:,apple: -s -k secret build.keychain -# check if all is good -security find-identity -v + # check if all is good + security find-identity -v +fi # sign the .app codesign -s "${MACOS_DEVELOPER_ID}" --timestamp --options runtime -f --deep "${app}" diff --git a/CMakeLists.txt b/CMakeLists.txt index 836c58a00..ed4f673c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,9 +106,27 @@ if(ENABLE_LTO) endif() if(ENABLE_OPENMP) - include(FindOpenMP) - if(OpenMP_FOUND) + if(APPLE) + # OpenMP does not work with the default Apple llvm/clang++ + # Install a more recent version using Homebrew (version 11.0.0 which is the next available tag on homebrew at this time crashed): + # "brew install llvm@9" + # and set the right compiler flags using: + # LLVM_PREFIX=$(brew --prefix llvm@9) + # export CC="${LLVM_PREFIX}/bin/clang" + # export CXX="${CC}++" + # export LDFLAGS="-L${LLVM_PREFIX}/lib -Wl,-rpath,${LLVM_PREFIX}/lib" \ + # export CFLAGS="-I${LLVM_PREFIX}/include" + # export CPPFLAGS="-I${LLVM_PREFIX}/include" + set(OpenMP_CXX_FLAGS "-fopenmp=libomp") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + message(STATUS "found OpenMP, compiling with flags: " ${OpenMP_CXX_FLAGS} ) + else() + find_package( OpenMP REQUIRED ) + include(FindOpenMP) + if(OPENMP_FOUND) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + message(STATUS "found OpenMP, compiling with flags: " ${OpenMP_CXX_FLAGS} ) + endif() endif() endif() diff --git a/src/drawentity.cpp b/src/drawentity.cpp index d67976618..fab407136 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -315,9 +315,13 @@ void Entity::ComputeInterpolatingSpline(SBezierList *sbl, bool periodic) const { } else { // The wrapping would work, except when n = 1 and everything // wraps to zero... - if(i > 0) bm.A[i][i - 1] = eq.x; - /**/ bm.A[i][i] = eq.y; - if(i < (n-1)) bm.A[i][i + 1] = eq.z; + if(i > 0) { + bm.A[i][i - 1] = eq.x; + } + bm.A[i][i] = eq.y; + if(i < (n-1)) { + bm.A[i][i + 1] = eq.z; + } } } bm.Solve(); diff --git a/src/mouse.cpp b/src/mouse.cpp index 7f90a8a3b..699f3e268 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -624,24 +624,24 @@ void GraphicsWindow::MouseRightUp(double x, double y) { } if(gs.withEndpoints > 0) { menu->AddItem(_("Select Edge Chain"), - [this]() { MenuEdit(Command::SELECT_CHAIN); }); + []() { MenuEdit(Command::SELECT_CHAIN); }); } if(gs.constraints == 1 && gs.n == 0) { Constraint *c = SK.GetConstraint(gs.constraint[0]); if(c->HasLabel() && c->type != Constraint::Type::COMMENT) { menu->AddItem(_("Toggle Reference Dimension"), - []() { Constraint::MenuConstrain(Command::REFERENCE); }); + []() { Constraint::MenuConstrain(Command::REFERENCE); }); } if(c->type == Constraint::Type::ANGLE || - c->type == Constraint::Type::EQUAL_ANGLE) + c->type == Constraint::Type::EQUAL_ANGLE) { menu->AddItem(_("Other Supplementary Angle"), - []() { Constraint::MenuConstrain(Command::OTHER_ANGLE); }); + []() { Constraint::MenuConstrain(Command::OTHER_ANGLE); }); } } if(gs.constraintLabels > 0 || gs.points > 0) { menu->AddItem(_("Snap to Grid"), - [this]() { MenuEdit(Command::SNAP_TO_GRID); }); + []() { MenuEdit(Command::SNAP_TO_GRID); }); } if(gs.points == 1 && gs.point[0].isFromRequest()) { @@ -714,7 +714,7 @@ void GraphicsWindow::MouseRightUp(double x, double y) { } if(gs.entities == gs.n) { menu->AddItem(_("Toggle Construction"), - [this]() { MenuRequest(Command::CONSTRUCTION); }); + []() { MenuRequest(Command::CONSTRUCTION); }); } if(gs.points == 1) { @@ -748,28 +748,28 @@ void GraphicsWindow::MouseRightUp(double x, double y) { menu->AddSeparator(); if(LockedInWorkplane()) { menu->AddItem(_("Cut"), - [this]() { MenuClipboard(Command::CUT); }); + []() { MenuClipboard(Command::CUT); }); menu->AddItem(_("Copy"), - [this]() { MenuClipboard(Command::COPY); }); + []() { MenuClipboard(Command::COPY); }); } } else { menu->AddItem(_("Select All"), - [this]() { MenuEdit(Command::SELECT_ALL); }); + []() { MenuEdit(Command::SELECT_ALL); }); } if((!SS.clipboard.r.IsEmpty() || !SS.clipboard.c.IsEmpty()) && LockedInWorkplane()) { menu->AddItem(_("Paste"), - [this]() { MenuClipboard(Command::PASTE); }); + []() { MenuClipboard(Command::PASTE); }); menu->AddItem(_("Paste Transformed..."), - [this]() { MenuClipboard(Command::PASTE_TRANSFORM); }); + []() { MenuClipboard(Command::PASTE_TRANSFORM); }); } if(itemsSelected) { menu->AddItem(_("Delete"), - [this]() { MenuClipboard(Command::DELETE); }); + []() { MenuClipboard(Command::DELETE); }); menu->AddSeparator(); menu->AddItem(_("Unselect All"), - [this]() { MenuEdit(Command::UNSELECT_ALL); }); + []() { MenuEdit(Command::UNSELECT_ALL); }); } // If only one item is selected, then it must be the one that we just // selected from the hovered item; in which case unselect all and hovered @@ -785,7 +785,7 @@ void GraphicsWindow::MouseRightUp(double x, double y) { if(itemsSelected) { menu->AddSeparator(); menu->AddItem(_("Zoom to Fit"), - [this]() { MenuView(Command::ZOOM_TO_FIT); }); + []() { MenuView(Command::ZOOM_TO_FIT); }); } menu->PopUp(); diff --git a/src/solvespace.h b/src/solvespace.h index 1157723a7..d0fde5f57 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -513,7 +513,7 @@ class SolveSpaceUI { GraphicsWindow GW; // The state for undo/redo - typedef struct { + typedef struct UndoState { IdList group; List
groupOrder; IdList request; From 68739495798e616b10b2a54a588f71ad34284b9e Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Tue, 20 Oct 2020 14:38:34 +0200 Subject: [PATCH 138/646] macOS: add NSOpenGLPFADoubleBuffer to NSOpenGLPixelFormatAttribute --- src/platform/guimac.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index 0f0997c43..5aa7f054b 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -371,6 +371,7 @@ @implementation SSView - (id)initWithFrame:(NSRect)frameRect { NSOpenGLPixelFormatAttribute attrs[] = { + NSOpenGLPFADoubleBuffer, NSOpenGLPFAColorSize, 24, NSOpenGLPFADepthSize, 24, 0 From 637cf2a94d9f137022f05e32a7d1c234cd1881a8 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Tue, 20 Oct 2020 14:14:49 +0200 Subject: [PATCH 139/646] Travis: update travis and macos build configs - Fixing warnings in .travis.yml - Enable building on all cores for macOS build - Quote variables --- .travis.yml | 36 +++++++++++++++++++----------------- .travis/build-macos.sh | 2 +- .travis/sign-macos.sh | 2 +- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/.travis.yml b/.travis.yml index d6ac12095..d11a77edb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,5 @@ +os: linux +dist: xenial language: c git: submodules: false @@ -7,23 +9,23 @@ jobs: name: Snap arm64 include: - stage: test - name: macOS + name: macOS test os: osx osx_image: xcode12.2 - install: "./.travis/install-macos.sh" - script: "./.travis/build-macos.sh" + install: ".travis/install-macos.sh" + script: ".travis/build-macos.sh" - stage: deploy if: tag IS present - name: macOS + name: macOS deploy os: osx osx_image: xcode12.2 - install: "./.travis/install-macos.sh" - script: "./.travis/build-macos.sh && ./.travis/sign-macos.sh" + install: ".travis/install-macos.sh" + script: ".travis/build-macos.sh && .travis/sign-macos.sh" deploy: provider: releases - api_key: + token: secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= - skip_cleanup: true + cleanup: false file: build/bin/SolveSpace.dmg on: repo: solvespace/solvespace @@ -32,13 +34,13 @@ jobs: name: "Debian" os: linux dist: bionic - install: ./.travis/install-debian.sh - script: ./.travis/build-debian.sh + install: .travis/install-debian.sh + script: .travis/build-debian.sh - stage: test name: "Windows Visual Studio 2017" os: windows - install: ./.travis/install-windows.sh - script: ./.travis/build-windows.sh + install: .travis/install-windows.sh + script: .travis/build-windows.sh - &deploy-snap stage: deploy name: Snap amd64 @@ -49,17 +51,17 @@ jobs: snaps: - name: snapcraft confinement: classic - script: ./.travis/build-snap.sh + script: .travis/build-snap.sh deploy: - provider: script - script: sudo ./.travis/deploy-snap.sh edge - skip_cleanup: true + script: sudo .travis/deploy-snap.sh edge + cleanup: false on: branch: master tags: false - provider: script - script: sudo ./.travis/deploy-snap.sh edge,beta - skip_cleanup: true + script: sudo .travis/deploy-snap.sh edge,beta + cleanup: false on: branch: master tags: true diff --git a/.travis/build-macos.sh b/.travis/build-macos.sh index 31c182b52..a9f39c4f1 100755 --- a/.travis/build-macos.sh +++ b/.travis/build-macos.sh @@ -21,5 +21,5 @@ cmake \ -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. \ -DENABLE_OPENMP=ON -cmake --build . --config $BUILD_TYPE +cmake --build . --config $BUILD_TYPE -- -j$(nproc) make -j$(nproc) test_solvespace diff --git a/.travis/sign-macos.sh b/.travis/sign-macos.sh index 6c0fd1b5a..6a379b539 100755 --- a/.travis/sign-macos.sh +++ b/.travis/sign-macos.sh @@ -16,7 +16,7 @@ if [ "$CI" = "true" ]; then security unlock-keychain -p secret build.keychain # import the key - security import certificate.p12 -k build.keychain -P $MACOS_CERTIFICATE_PASSWORD -T /usr/bin/codesign + security import certificate.p12 -k build.keychain -P "${MACOS_CERTIFICATE_PASSWORD}" -T /usr/bin/codesign security set-key-partition-list -S apple-tool:,apple: -s -k secret build.keychain From 7b75810b1db9da9e979e6f0ba0941469f93dd5c0 Mon Sep 17 00:00:00 2001 From: ZHOU You Date: Mon, 28 Sep 2020 13:15:34 +0800 Subject: [PATCH 140/646] Chinese translation added. --- res/CMakeLists.txt | 1 + res/locales.txt | 1 + res/locales/zh_CN.mo | Bin 0 -> 30647 bytes res/locales/zh_CN.po | 1773 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1775 insertions(+) create mode 100644 res/locales/zh_CN.mo create mode 100644 res/locales/zh_CN.po diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index 3783f2425..5969039bd 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -256,6 +256,7 @@ add_resources( locales/fr_FR.po locales/uk_UA.po locales/ru_RU.po + locales/zh_CN.po fonts/unifont.hex.gz fonts/private/0-check-false.png fonts/private/1-check-true.png diff --git a/res/locales.txt b/res/locales.txt index 9a3f102d7..0f4fab16b 100644 --- a/res/locales.txt +++ b/res/locales.txt @@ -5,3 +5,4 @@ en-US,0409,English (US) fr-FR,040C,Français ru-RU,0419,Русский uk-UA,0422,Українська +zh-CN,0804,简体中文 diff --git a/res/locales/zh_CN.mo b/res/locales/zh_CN.mo new file mode 100644 index 0000000000000000000000000000000000000000..75f043babf759f10c7b88d0eba88c059a2fb1529 GIT binary patch literal 30647 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, 2020. +# +msgid "" +msgstr "" +"Project-Id-Version: SolveSpace 3.0\n" +"Report-Msgid-Bugs-To: whitequark@whitequark.org\n" +"POT-Creation-Date: 2020-09-21 09:28+0200\n" +"PO-Revision-Date: 2020-09-28 12:42+0800\n" +"Last-Translator: lomatus@163.com\n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.1\n" + +#: clipboard.cpp:274 +msgid "" +"Cut, paste, and copy work only in a workplane.\n" +"\n" +"Activate one with Sketch -> In Workplane." +msgstr "" +"仅在工作平面中剪切、粘贴和复制工作。\n" +"\n" +"使用\"工作平面中的草图 -+\"激活一个。" + +#: clipboard.cpp:291 +msgid "Clipboard is empty; nothing to paste." +msgstr "剪贴板为空;没有要粘贴的内容。" + +#: clipboard.cpp:338 +msgid "Number of copies to paste must be at least one." +msgstr "要粘贴的副本数必须至少为 1 个。" + +#: clipboard.cpp:354 textscreens.cpp:783 +msgid "Scale cannot be zero." +msgstr "缩放不能为零。" + +#: clipboard.cpp:396 +msgid "Select one point to define origin of rotation." +msgstr "选择一个点以定义旋转原点。" + +#: clipboard.cpp:408 +msgid "Select two points to define translation vector." +msgstr "选择两个点来定义转换向量。" + +#: clipboard.cpp:418 +msgid "" +"Transformation is identity. So all copies will be exactly on top of each " +"other." +msgstr "转换就是标识,因此所有的复制在彼此之上。" + +#: clipboard.cpp:422 +msgid "Too many items to paste; split this into smaller pastes." +msgstr "要粘贴的项目太多; 请把他们拆分。" + +#: clipboard.cpp:427 +msgid "No workplane active." +msgstr "没有工作平面处于活动状态。" + +#: confscreen.cpp:410 +msgid "Bad format: specify coordinates as x, y, z" +msgstr "格式错误:将坐标指定为 x、y、z" + +#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 +msgid "Bad format: specify color as r, g, b" +msgstr "格式错误:将颜色指定为 r、g、b" + +#: confscreen.cpp:446 +msgid "" +"The perspective factor will have no effect until you enable View -> Use " +"Perspective Projection." +msgstr "在启用\"视图 -= 使用透视投影\"之前,透视因子将不起作用。" + +#: confscreen.cpp:459 confscreen.cpp:469 +#, c-format +msgid "Specify between 0 and %d digits after the decimal." +msgstr "在十进制之后指定 0 和 %d 数字之间。" + +#: confscreen.cpp:481 +msgid "Export scale must not be zero!" +msgstr "输出比例不能为零!" + +#: confscreen.cpp:493 +msgid "Cutter radius offset must not be negative!" +msgstr "刀具半径偏移不能为负数!" + +#: confscreen.cpp:547 +msgid "Bad value: autosave interval should be positive" +msgstr "坏值:自动保存间隔应为正" + +#: confscreen.cpp:550 +msgid "Bad format: specify interval in integral minutes" +msgstr "格式错误:以整数分钟为单位指定间隔" + +#: constraint.cpp:12 +msgctxt "constr-name" +msgid "pts-coincident" +msgstr "点约束" + +#: constraint.cpp:13 +msgctxt "constr-name" +msgid "pt-pt-distance" +msgstr "点点间距" + +#: constraint.cpp:14 +msgctxt "constr-name" +msgid "pt-line-distance" +msgstr "线长" + +#: constraint.cpp:15 +msgctxt "constr-name" +msgid "pt-plane-distance" +msgstr "平面具体" + +#: constraint.cpp:16 +msgctxt "constr-name" +msgid "pt-face-distance" +msgstr "面间距" + +#: constraint.cpp:17 +msgctxt "constr-name" +msgid "proj-pt-pt-distance" +msgstr "点点距离" + +#: constraint.cpp:18 +msgctxt "constr-name" +msgid "pt-in-plane" +msgstr "点在面" + +#: constraint.cpp:19 +msgctxt "constr-name" +msgid "pt-on-line" +msgstr "点在线" + +#: constraint.cpp:20 +msgctxt "constr-name" +msgid "pt-on-face" +msgstr "点在面" + +#: constraint.cpp:21 +msgctxt "constr-name" +msgid "eq-length" +msgstr "长度相同" + +#: constraint.cpp:22 +msgctxt "constr-name" +msgid "eq-length-and-pt-ln-dist" +msgstr "长度相等且点在距离" + +#: constraint.cpp:23 +msgctxt "constr-name" +msgid "eq-pt-line-distances" +msgstr "点线距离相等" + +#: constraint.cpp:24 +msgctxt "constr-name" +msgid "length-ratio" +msgstr "长度比率" + +#: constraint.cpp:25 +msgctxt "constr-name" +msgid "length-difference" +msgstr "长度不同" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "symmetric" +msgstr "对称的" + +#: constraint.cpp:27 +msgctxt "constr-name" +msgid "symmetric-h" +msgstr "水平对称" + +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "symmetric-v" +msgstr "纵向对称" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "symmetric-line" +msgstr "线对称" + +#: constraint.cpp:30 +msgctxt "constr-name" +msgid "at-midpoint" +msgstr "在中点" + +#: constraint.cpp:31 +msgctxt "constr-name" +msgid "horizontal" +msgstr "水平约束" + +#: constraint.cpp:32 +msgctxt "constr-name" +msgid "vertical" +msgstr "垂直约束" + +#: constraint.cpp:33 +msgctxt "constr-name" +msgid "diameter" +msgstr "直径约束" + +#: constraint.cpp:34 +msgctxt "constr-name" +msgid "pt-on-circle" +msgstr "圆点约束" + +#: constraint.cpp:35 +msgctxt "constr-name" +msgid "same-orientation" +msgstr "相同原点" + +#: constraint.cpp:36 +msgctxt "constr-name" +msgid "angle" +msgstr "角度约束" + +#: constraint.cpp:37 +msgctxt "constr-name" +msgid "parallel" +msgstr "平行约束" + +#: constraint.cpp:38 +msgctxt "constr-name" +msgid "arc-line-tangent" +msgstr "弧切线" + +#: constraint.cpp:39 +msgctxt "constr-name" +msgid "cubic-line-tangent" +msgstr "立方体切线" + +#: constraint.cpp:40 +msgctxt "constr-name" +msgid "curve-curve-tangent" +msgstr "曲线间切线" + +#: constraint.cpp:41 +msgctxt "constr-name" +msgid "perpendicular" +msgstr "垂直约束" + +#: constraint.cpp:42 +msgctxt "constr-name" +msgid "eq-radius" +msgstr "等于半径" + +#: constraint.cpp:43 +msgctxt "constr-name" +msgid "eq-angle" +msgstr "等于角度" + +#: constraint.cpp:44 +msgctxt "constr-name" +msgid "eq-line-len-arc-len" +msgstr "等于线长或弧长" + +#: constraint.cpp:45 +msgctxt "constr-name" +msgid "lock-where-dragged" +msgstr "锁定位置" + +#: constraint.cpp:46 +msgctxt "constr-name" +msgid "comment" +msgstr "备注" + +#: constraint.cpp:171 +msgid "" +"Bad selection for distance / diameter constraint. This constraint can apply " +"to:\n" +"\n" +" * two points (distance between points)\n" +" * a line segment (length)\n" +" * two points and a line segment or normal (projected distance)\n" +" * a workplane and a point (minimum distance)\n" +" * a line segment and a point (minimum distance)\n" +" * a plane face and a point (minimum distance)\n" +" * a circle or an arc (diameter)\n" +msgstr "" +"距离/直径约束的选择错误。此约束可应用于:\n" +"\n" +"* 两点(点之间的距离)\n" +" * 线段(长度)\n" +" * 两个点和线段或法线(投影距离)\n" +" * 工作平面和点(最小距离)\n" +" * 线段和点(最小距离)\n" +" * 平面面和点(最小距离)\n" +" * 圆或弧(直径)\n" + +#: constraint.cpp:224 +msgid "" +"Bad selection for on point / curve / plane constraint. This constraint can " +"apply to:\n" +"\n" +" * two points (points coincident)\n" +" * a point and a workplane (point in plane)\n" +" * a point and a line segment (point on line)\n" +" * a point and a circle or arc (point on curve)\n" +" * a point and a plane face (point on face)\n" +msgstr "" +"点 / 曲线 / 平面约束的选定方法错误。此约束可应用于:\n" +"\n" +"* 两点(点重合)\n" +" * 一个点和一个工作平面(平面中点)\n" +" * 点和线段(点在线)\n" +" * 一个点和一个圆或圆(曲线上的点)\n" +" * 点和平面面(点在脸上)\n" + +#: constraint.cpp:286 +msgid "" +"Bad selection for equal length / radius constraint. This constraint can " +"apply to:\n" +"\n" +" * two line segments (equal length)\n" +" * two line segments and two points (equal point-line distances)\n" +" * a line segment and two points (equal point-line distances)\n" +" * a line segment, and a point and line segment (point-line distance " +"equals length)\n" +" * four line segments or normals (equal angle between A,B and C,D)\n" +" * three line segments or normals (equal angle between A,B and B,C)\n" +" * two circles or arcs (equal radius)\n" +" * a line segment and an arc (line segment length equals arc length)\n" +msgstr "" +"等长度/半径约束的选定方法错误。此约束可应用于:\n" +"\n" +"* 两个线段(相等长度)\n" +" * 两个线段和两个点(相等的点线距离)\n" +" * 线段和两个点(相等的点线距离)\n" +" * 线段和点段和线段(点线距离等于长度)\n" +" * 四条线段或法线(A、B 和 C、D 之间的等角)\n" +" * 三条线段或法线(A、B 和 B、C 之间的等角)\n" +" * 两个圆或圆(相等半径)\n" +" * 线段和圆弧(线段长度等于弧长)\n" + +#: constraint.cpp:325 +msgid "" +"Bad selection for length ratio constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +msgstr "" +"长度比率约束的选择错误。此约束可应用于:\n" +"\n" +"* 两个线段\n" + +#: constraint.cpp:342 +msgid "" +"Bad selection for length difference constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments\n" +msgstr "" +"长度差异约束的选择错误。此约束可应用于:\n" +"\n" +"* 两个线段\n" + +#: constraint.cpp:368 +msgid "" +"Bad selection for at midpoint constraint. This constraint can apply to:\n" +"\n" +" * a line segment and a point (point at midpoint)\n" +" * a line segment and a workplane (line's midpoint on plane)\n" +msgstr "" +"中点约束的选定方法错误。此约束可应用于:\n" +"\n" +"* 线段和点(点在中点)\n" +" * 线段和工作平面(平面上的线中点)\n" + +#: constraint.cpp:426 +msgid "" +"Bad selection for symmetric constraint. This constraint can apply to:\n" +"\n" +" * two points or a line segment (symmetric about workplane's coordinate " +"axis)\n" +" * line segment, and two points or a line segment (symmetric about line " +"segment)\n" +" * workplane, and two points or a line segment (symmetric about " +"workplane)\n" +msgstr "" +"对称约束的选择错误。此约束可应用于:\n" +"\n" +"* 两个点或线段(与工作平面的坐标轴对称)\n" +" * 线段,和两个点或线段(对称的线段)\n" +" * 工作平面和两个点或线段(工作平面对称)\n" + +#: constraint.cpp:440 +msgid "" +"A workplane must be active when constraining symmetric without an explicit " +"symmetry plane." +msgstr "在没有显式对称平面约束对称时,工作平面必须处于活动状态。" + +#: constraint.cpp:470 +msgid "" +"Activate a workplane (with Sketch -> In Workplane) before applying a " +"horizontal or vertical constraint." +msgstr "在应用水平或垂直约束之前,激活工作平面(使用草图 -= 在工作平面中)。" + +#: constraint.cpp:483 +msgid "" +"Bad selection for horizontal / vertical constraint. This constraint can " +"apply to:\n" +"\n" +" * two points\n" +" * a line segment\n" +msgstr "" +"水平/垂直约束的选择错误。此约束可应用于:\n" +"\n" +"• 两点\n" +" • 线段\n" + +#: constraint.cpp:504 +msgid "" +"Bad selection for same orientation constraint. This constraint can apply " +"to:\n" +"\n" +" * two normals\n" +msgstr "" +"同一方向约束的选择错误。此约束可应用于:\n" +"\n" +"• 两个法线\n" + +#: constraint.cpp:554 +msgid "Must select an angle constraint." +msgstr "必须选择角度约束。" + +#: constraint.cpp:567 +msgid "Must select a constraint with associated label." +msgstr "必须选择具有关联标签的约束。" + +#: constraint.cpp:578 +msgid "" +"Bad selection for angle constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"角度约束的选择错误。此约束可应用于:\n" +"\n" +"* 两个线段\n" +" * 线段和法线\n" +" • 两个法线\n" + +#: constraint.cpp:635 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "切线弧和线段必须共享一个端点。在约束切线之前,使用约束 -= 点约束它们。" + +#: constraint.cpp:659 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." +msgstr "" +"切线立方段和线段必须共享终结点。在约束切线之前,使用约束 -= 点约束它们。" + +#: constraint.cpp:669 +msgid "Curve-curve tangency must apply in workplane." +msgstr "曲线曲线切线必须应用于工作平面。" + +#: constraint.cpp:687 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." +msgstr "曲线必须共享一个终结点。在约束切线之前,使用约束 -= 点约束它们。" + +#: constraint.cpp:696 +msgid "" +"Bad selection for parallel / tangent constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments (parallel)\n" +" * a line segment and a normal (parallel)\n" +" * two normals (parallel)\n" +" * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" +msgstr "" +"平行/切线约束的选择错误。此约束可应用于:\n" +"\n" +"* 两条线段(平行)\n" +" * 线段和法线(平行)\n" +" * 两个法线(平行)\n" +" * 共享端点的两条线段、弧线或贝塞尔(切线)\n" + +#: constraint.cpp:714 +msgid "" +"Bad selection for perpendicular constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"垂直约束的选择错误。此约束可应用于:\n" +"\n" +"* 两个线段\n" +" * 线段和法线\n" +" • 两个法线\n" + +#: constraint.cpp:729 +msgid "" +"Bad selection for lock point where dragged constraint. This constraint can " +"apply to:\n" +"\n" +" * a point\n" +msgstr "" +"拖动约束的锁点选择错误。此约束可应用于:\n" +"\n" +"• 一点\n" + +#: constraint.cpp:740 +msgid "click center of comment text" +msgstr "单击注释文本的中心" + +#: export.cpp:19 +msgid "" +"No solid model present; draw one with extrudes and revolves, or use Export " +"2d View to export bare lines and curves." +msgstr "" +"不存在实体模型;使用拉伸和旋转绘制一个,或使用导出 2d 视图导出裸线和曲线。" + +#: export.cpp:61 +msgid "" +"Bad selection for export section. Please select:\n" +"\n" +" * nothing, with an active workplane (workplane is section plane)\n" +" * a face (section plane through face)\n" +" * a point and two line segments (plane through point and parallel to " +"lines)\n" +msgstr "" +"导出部分的选择错误。请选择:\n" +"\n" +"* 无,带活动工作平面(工作平面为剖面平面)\n" +" * 脸(通过面的剖面)\n" +" * 一个点和两个线段(平面穿过点和平行线)\n" + +#: export.cpp:822 +msgid "Active group mesh is empty; nothing to export." +msgstr "活动组网格为空;没有要导出的。" + +#: exportvector.cpp:337 +msgid "freehand lines were replaced with continuous lines" +msgstr "徒手线替换为连续线" + +#: exportvector.cpp:339 +msgid "zigzag lines were replaced with continuous lines" +msgstr "锯齿线替换为连续线" + +#: exportvector.cpp:593 +msgid "" +"Some aspects of the drawing have no DXF equivalent and were not exported:\n" +msgstr "绘图的某些方面没有 DXF 等效项,并且未导出:\n" + +#: exportvector.cpp:839 +msgid "" +"PDF page size exceeds 200 by 200 inches; many viewers may reject this file." +msgstr "PDF 页面大小超过 200 英寸或 200 英寸;许多查看器可能会拒绝此文件。" + +#: file.cpp:44 group.cpp:91 +msgctxt "group-name" +msgid "sketch-in-plane" +msgstr "平面草图" + +#: file.cpp:62 +msgctxt "group-name" +msgid "#references" +msgstr "#参考" + +#: file.cpp:549 +msgid "" +"Unrecognized data in file. This file may be corrupt, or from a newer version " +"of the program." +msgstr "未识别文件内数据。该文件可能损坏,或使用新版本应用程序尝试打开。" + +#: file.cpp:849 +msgctxt "title" +msgid "Missing File" +msgstr "文件丢失" + +#: file.cpp:850 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "连接的文件不存在:\"%s\"。" + +#: file.cpp:852 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." +msgstr "您是否想手工查找?如果是,所有基于该丢失文件的几何对象将会被全部删除." + +#: file.cpp:855 +msgctxt "button" +msgid "&Yes" +msgstr "是(&Y)" + +#: file.cpp:857 +msgctxt "button" +msgid "&No" +msgstr "否(&N)" + +#: file.cpp:859 +msgctxt "button" +msgid "&Cancel" +msgstr "取消(&C)" + +#: graphicswin.cpp:41 +msgid "&File" +msgstr "文件(&F)" + +#: graphicswin.cpp:42 +msgid "&New" +msgstr "新建(&N)" + +#: graphicswin.cpp:43 +msgid "&Open..." +msgstr "打开(&O)" + +#: graphicswin.cpp:44 +msgid "Open &Recent" +msgstr "打开最近使用(&R)" + +#: graphicswin.cpp:45 +msgid "&Save" +msgstr "保存(&S)" + +#: graphicswin.cpp:46 +msgid "Save &As..." +msgstr "另存为(&A)" + +#: graphicswin.cpp:48 +msgid "Export &Image..." +msgstr "导出图片(&I)" + +#: graphicswin.cpp:49 +msgid "Export 2d &View..." +msgstr "导出2D视图(&V)" + +#: graphicswin.cpp:50 +msgid "Export 2d &Section..." +msgstr "导出2D截面(&S)" + +#: graphicswin.cpp:51 +msgid "Export 3d &Wireframe..." +msgstr "导出3D线框模型(&W)" + +#: graphicswin.cpp:52 +msgid "Export Triangle &Mesh..." +msgstr "导出三角面模型(&M)" + +#: graphicswin.cpp:53 +msgid "Export &Surfaces..." +msgstr "导出表面模型(&S)" + +#: graphicswin.cpp:54 +msgid "Im&port..." +msgstr "导入(&P)" + +#: graphicswin.cpp:57 +msgid "E&xit" +msgstr "退出(&E)" + +#: graphicswin.cpp:60 +msgid "&Edit" +msgstr "编辑(&E)" + +#: graphicswin.cpp:61 +msgid "&Undo" +msgstr "回退(&U)" + +#: graphicswin.cpp:62 +msgid "&Redo" +msgstr "重做(&R)" + +#: graphicswin.cpp:63 +msgid "Re&generate All" +msgstr "重新生成所有(&G)" + +#: graphicswin.cpp:65 +msgid "Snap Selection to &Grid" +msgstr "选择到轴线(&G)" + +#: graphicswin.cpp:66 +msgid "Rotate Imported &90°" +msgstr "旋转导入模型90° (&9)" + +#: graphicswin.cpp:68 +msgid "Cu&t" +msgstr "剪切 (&T)" + +#: graphicswin.cpp:69 +msgid "&Copy" +msgstr "复制 (&C)" + +#: graphicswin.cpp:70 +msgid "&Paste" +msgstr "粘贴 (&P)" + +#: graphicswin.cpp:71 +msgid "Paste &Transformed..." +msgstr "粘贴移动(&T)" + +#: graphicswin.cpp:72 +msgid "&Delete" +msgstr "删除(&D)" + +#: graphicswin.cpp:74 +msgid "Select &Edge Chain" +msgstr "选择边缘约束(&E)" + +#: graphicswin.cpp:75 +msgid "Select &All" +msgstr "选择所有(&A)" + +#: graphicswin.cpp:76 +msgid "&Unselect All" +msgstr "取消全选(&U)" + +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "线型(&L)" + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "查看投影...(&V)" + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "配置 (&F)" + +#: graphicswin.cpp:84 +msgid "&View" +msgstr "查看 (&V)" + +#: graphicswin.cpp:85 +msgid "Zoom &In" +msgstr "放大(&I)" + +#: graphicswin.cpp:86 +msgid "Zoom &Out" +msgstr "缩小(&O)" + +#: graphicswin.cpp:87 +msgid "Zoom To &Fit" +msgstr "自动缩放(&F)" + +#: graphicswin.cpp:89 +msgid "Align View to &Workplane" +msgstr "切换视图至平面(&W)" + +#: graphicswin.cpp:90 +msgid "Nearest &Ortho View" +msgstr "Ortho视图 (&O)" + +#: graphicswin.cpp:91 +msgid "Nearest &Isometric View" +msgstr "ISO视图 (&I)" + +#: graphicswin.cpp:92 +msgid "&Center View At Point" +msgstr "以点为中心视图 (&C)" + +#: graphicswin.cpp:94 +msgid "Show Snap &Grid" +msgstr "显示捕捉轴线 (&G)" + +#: graphicswin.cpp:95 +msgid "Use &Perspective Projection" +msgstr "使用远景透视(&P)" + +#: graphicswin.cpp:96 +msgid "Dimension &Units" +msgstr "标注单位(&U)" + +#: graphicswin.cpp:97 +msgid "Dimensions in &Millimeters" +msgstr "标注单位 mm (&M)" + +#: graphicswin.cpp:98 +msgid "Dimensions in M&eters" +msgstr "标注单位m (&E)" + +#: graphicswin.cpp:99 +msgid "Dimensions in &Inches" +msgstr "标准单位英寸 (&I)" + +#: graphicswin.cpp:101 +msgid "Show &Toolbar" +msgstr "显示工具条(&T)" + +#: graphicswin.cpp:102 +msgid "Show Property Bro&wser" +msgstr "显示属性浏览器(&W)" + +#: graphicswin.cpp:104 +msgid "&Full Screen" +msgstr "全屏(&F)" + +#: graphicswin.cpp:106 +msgid "&New Group" +msgstr "新组合(&N)" + +#: graphicswin.cpp:107 +msgid "Sketch In &3d" +msgstr "在三维内绘制(&3)" + +#: graphicswin.cpp:108 +msgid "Sketch In New &Workplane" +msgstr "在新工作面绘制(&W)" + +#: graphicswin.cpp:110 +msgid "Step &Translating" +msgstr "移动(&T)" + +#: graphicswin.cpp:111 +msgid "Step &Rotating" +msgstr "旋转(&R)" + +#: graphicswin.cpp:113 +msgid "E&xtrude" +msgstr "挤出(&E)" + +#: graphicswin.cpp:114 +msgid "&Helix" +msgstr "螺旋(&H)" + +#: graphicswin.cpp:115 +msgid "&Lathe" +msgstr "扫略(&L)" + +#: graphicswin.cpp:116 +msgid "Re&volve" +msgstr "旋转(&V)" + +#: graphicswin.cpp:118 +msgid "Link / Assemble..." +msgstr "链接/装配..." + +#: graphicswin.cpp:119 +msgid "Link Recent" +msgstr "连接最近文件" + +#: graphicswin.cpp:121 +msgid "&Sketch" +msgstr "绘图(&S)" + +#: graphicswin.cpp:122 +msgid "In &Workplane" +msgstr "在工作平面(&W)" + +#: graphicswin.cpp:123 +msgid "Anywhere In &3d" +msgstr "在3D的任何位置(&3)" + +#: graphicswin.cpp:125 +msgid "Datum &Point" +msgstr "基准点(&P)" + +#: graphicswin.cpp:126 +msgid "&Workplane" +msgstr "工作面(&W)" + +#: graphicswin.cpp:128 +msgid "Line &Segment" +msgstr "线段(&S)" + +#: graphicswin.cpp:129 +msgid "C&onstruction Line Segment" +msgstr "构造线段(&C)" + +#: graphicswin.cpp:130 +msgid "&Rectangle" +msgstr "矩形(&R)" + +#: graphicswin.cpp:131 +msgid "&Circle" +msgstr "圆线(&C)" + +#: graphicswin.cpp:132 +msgid "&Arc of a Circle" +msgstr "圆弧(&A)" + +#: graphicswin.cpp:133 +msgid "&Bezier Cubic Spline" +msgstr "立方体线的贝塞尔曲线(&B)" + +#: graphicswin.cpp:135 +msgid "&Text in TrueType Font" +msgstr "TrueTyoe字体文字(&T)" + +#: graphicswin.cpp:136 +msgid "&Image" +msgstr "图片(&I)" + +#: graphicswin.cpp:138 +msgid "To&ggle Construction" +msgstr "切换构造(&G)" + +#: graphicswin.cpp:139 +msgid "Tangent &Arc at Point" +msgstr "弧线切线点(&A)" + +#: graphicswin.cpp:140 +msgid "Split Curves at &Intersection" +msgstr "在交叉处拆分曲线(&I)" + +#: graphicswin.cpp:142 +msgid "&Constrain" +msgstr "约束(&C)" + +#: graphicswin.cpp:143 +msgid "&Distance / Diameter" +msgstr "距离/直径(&D)" + +#: graphicswin.cpp:144 +msgid "Re&ference Dimension" +msgstr "参考标注(&F)" + +#: graphicswin.cpp:145 +msgid "A&ngle" +msgstr "角度(&A)" + +#: graphicswin.cpp:146 +msgid "Reference An&gle" +msgstr "参考角度(&G)" + +#: graphicswin.cpp:147 +msgid "Other S&upplementary Angle" +msgstr "其它增补角度(&U)" + +#: graphicswin.cpp:148 +msgid "Toggle R&eference Dim" +msgstr "切换参考标注(&E)" + +#: graphicswin.cpp:150 +msgid "&Horizontal" +msgstr "水平约束(&H)" + +#: graphicswin.cpp:151 +msgid "&Vertical" +msgstr "垂直约束(&V)" + +#: graphicswin.cpp:153 +msgid "&On Point / Curve / Plane" +msgstr "在点线面(&O)" + +#: graphicswin.cpp:154 +msgid "E&qual Length / Radius / Angle" +msgstr "等于/长度/半径/角度(&Q)" + +#: graphicswin.cpp:155 +msgid "Length Ra&tio" +msgstr "长度比例(&T)" + +#: graphicswin.cpp:156 +msgid "Length Diff&erence" +msgstr "长度偏差(&E)" + +#: graphicswin.cpp:157 +msgid "At &Midpoint" +msgstr "在中点(&M)" + +#: graphicswin.cpp:158 +msgid "S&ymmetric" +msgstr "对称(&Y)" + +#: graphicswin.cpp:159 +msgid "Para&llel / Tangent" +msgstr "水平/切线(&L)" + +#: graphicswin.cpp:160 +msgid "&Perpendicular" +msgstr "垂直的(&P)" + +#: graphicswin.cpp:161 +msgid "Same Orient&ation" +msgstr "相同方向(&A)" + +#: graphicswin.cpp:162 +msgid "Lock Point Where &Dragged" +msgstr "锁定点位置(&D)" + +#: graphicswin.cpp:164 +msgid "Comment" +msgstr "备注" + +#: graphicswin.cpp:166 +msgid "&Analyze" +msgstr "分析(&A)" + +#: graphicswin.cpp:167 +msgid "Measure &Volume" +msgstr "测量体积(&V)" + +#: graphicswin.cpp:168 +msgid "Measure A&rea" +msgstr "测量面积(&R)" + +#: graphicswin.cpp:169 +msgid "Measure &Perimeter" +msgstr "测量周长(&P)" + +#: graphicswin.cpp:170 +msgid "Show &Interfering Parts" +msgstr "显示干涉零件(&I)" + +#: graphicswin.cpp:171 +msgid "Show &Naked Edges" +msgstr "显示孤立边(&N)" + +#: graphicswin.cpp:172 +msgid "Show &Center of Mass" +msgstr "显示中心(&C)" + +#: graphicswin.cpp:174 +msgid "Show &Underconstrained Points" +msgstr "显示无效约束点(&U)" + +#: graphicswin.cpp:176 +msgid "&Trace Point" +msgstr "跟踪点(&T)" + +#: graphicswin.cpp:177 +msgid "&Stop Tracing..." +msgstr "停止跟踪(&S)" + +#: graphicswin.cpp:178 +msgid "Step &Dimension..." +msgstr "逐步标注(&D)" + +#: graphicswin.cpp:180 +msgid "&Help" +msgstr "帮助(&H)" + +#: graphicswin.cpp:181 +msgid "&Language" +msgstr "语言(&L)" + +#: graphicswin.cpp:182 +msgid "&Website / Manual" +msgstr "网页/手册(&W)" + +#: graphicswin.cpp:184 +msgid "&About" +msgstr "关于(&A)" + +#: graphicswin.cpp:352 +msgid "(no recent files)" +msgstr "(无文件)" + +#: graphicswin.cpp:360 +#, c-format +msgid "File '%s' does not exist." +msgstr "文件不存在: \"%s\"。" + +#: graphicswin.cpp:721 +msgid "No workplane is active, so the grid will not appear." +msgstr "没有激活的工作面,因此无法显示轴网。" + +#: graphicswin.cpp:730 +msgid "" +"The perspective factor is set to zero, so the view will always be a parallel " +"projection.\n" +"\n" +"For a perspective projection, modify the perspective factor in the " +"configuration screen. A value around 0.3 is typical." +msgstr "" + +#: graphicswin.cpp:809 +msgid "" +"Select a point; this point will become the center of the view on screen." +msgstr "" + +#: graphicswin.cpp:1103 +msgid "No additional entities share endpoints with the selected entities." +msgstr "" + +#: graphicswin.cpp:1121 +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:1144 +msgid "" +"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " +"to define the plane for the snap grid." +msgstr "" + +#: graphicswin.cpp:1151 +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:1239 +msgid "No workplane selected. Activating default workplane for this group." +msgstr "" + +#: graphicswin.cpp:1242 +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:1263 +msgid "" +"Bad selection for tangent arc at point. Select a single point, or select " +"nothing to set up arc parameters." +msgstr "" + +#: graphicswin.cpp:1274 +msgid "click point on arc (draws anti-clockwise)" +msgstr "点击弧线的点(逆时针方向绘制)" + +#: graphicswin.cpp:1275 +msgid "click to place datum point" +msgstr "点击放置基准点" + +#: graphicswin.cpp:1276 +msgid "click first point of line segment" +msgstr "点击线条的起点" + +#: graphicswin.cpp:1278 +msgid "click first point of construction line segment" +msgstr "点击构造线的起点" + +#: graphicswin.cpp:1279 +msgid "click first point of cubic segment" +msgstr "点击立方体的起点" + +#: graphicswin.cpp:1280 +msgid "click center of circle" +msgstr "点击圆弧的中心" + +#: graphicswin.cpp:1281 +msgid "click origin of workplane" +msgstr "点击工作面的原点" + +#: graphicswin.cpp:1282 +msgid "click one corner of rectangle" +msgstr "点击一个矩形倒角" + +#: graphicswin.cpp:1283 +msgid "click top left of text" +msgstr "点击文字左上角" + +#: graphicswin.cpp:1289 +msgid "click top left of image" +msgstr "点击图片左上角" + +#: graphicswin.cpp:1301 +msgid "" +"No entities are selected. Select entities before trying to toggle their " +"construction state." +msgstr "为选中实体,切换构造状态前请先选中实体对象。" + +#: group.cpp:86 +msgctxt "group-name" +msgid "sketch-in-3d" +msgstr "3D草图" + +#: group.cpp:142 +msgid "" +"Bad selection for new sketch in workplane. This group can be created with:\n" +"\n" +" * a point (through the point, orthogonal to coordinate axes)\n" +" * a point and two line segments (through the point, parallel to the " +"lines)\n" +" * a workplane (copy of the workplane)\n" +msgstr "" +"在新工作面内绘图选择失败,该组可以使用:\n" +"\n" +" * 一个点(通过该点,正交至坐标轴)\n" +" * 一个点和二个线段(通过点,绘制平行线至线段)\n" +" * 一个工作面(复制工作面)\n" + +#: group.cpp:154 +msgid "" +"Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " +"will be extruded normal to the workplane." +msgstr "挤出前先激活工作面(草图->在工作面),该草图将由工作面的法线方向挤出。" + +#: group.cpp:163 +msgctxt "group-name" +msgid "extrude" +msgstr "挤出" + +#: group.cpp:168 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "扫略操作仅可用于二维草图。" + +#: group.cpp:179 +msgid "" +"Bad selection for new lathe group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"创建扫略组失败,该组可由:\n" +"\n" +" * 一个点和一个线段或法线(围绕坐标轴至线或法线的平行线,通过点)\n" +" * 一个线段(围绕线段)\n" + +#: group.cpp:189 +msgctxt "group-name" +msgid "lathe" +msgstr "扫略" + +#: group.cpp:194 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:205 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:217 +msgctxt "group-name" +msgid "revolve" +msgstr "旋转" + +#: group.cpp:222 +msgid "Helix operation can only be applied to planar sketches." +msgstr "" + +#: group.cpp:233 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" + +#: group.cpp:245 +msgctxt "group-name" +msgid "helix" +msgstr "螺旋" + +#: group.cpp:258 +msgid "" +"Bad selection for new rotation. This group can be created with:\n" +"\n" +" * a point, while locked in workplane (rotate in plane, about that " +"point)\n" +" * a point and a line or a normal (rotate about an axis through the " +"point, and parallel to line / normal)\n" +msgstr "" + +#: group.cpp:271 +msgctxt "group-name" +msgid "rotate" +msgstr "旋转" + +#: group.cpp:282 +msgctxt "group-name" +msgid "translate" +msgstr "移动" + +#: group.cpp:400 +msgid "(unnamed)" +msgstr "(未命名)" + +#: groupmesh.cpp:689 +msgid "not closed contour, or not all same style!" +msgstr "未闭合轮廓,或样式不一致!" + +#: groupmesh.cpp:702 +msgid "points not all coplanar!" +msgstr "点不在相同平面!" + +#: groupmesh.cpp:704 +msgid "contour is self-intersecting!" +msgstr "轮廓自相交!" + +#: groupmesh.cpp:706 +msgid "zero-length edge!" +msgstr "边缘长度为零!" + +#: modify.cpp:254 +msgid "Must be sketching in workplane to create tangent arc." +msgstr "" + +#: modify.cpp:301 +msgid "" +"To create a tangent arc, select a point where two non-construction lines or " +"circles in this group and workplane join." +msgstr "" + +#: modify.cpp:388 +msgid "" +"Couldn't round this corner. Try a smaller radius, or try creating the " +"desired geometry by hand with tangency constraints." +msgstr "" + +#: modify.cpp:597 +msgid "Couldn't split this entity; lines, circles, or cubics only." +msgstr "" + +#: modify.cpp:624 +msgid "Must be sketching in workplane to split." +msgstr "" + +#: modify.cpp:631 +msgid "" +"Select two entities that intersect each other (e.g. two lines/circles/arcs " +"or a line/circle/arc and a point)." +msgstr "" + +#: modify.cpp:736 +msgid "Can't split; no intersection found." +msgstr "无法拆分;未发现较差点。" + +#: mouse.cpp:560 +msgid "Assign to Style" +msgstr "指定样式" + +#: mouse.cpp:576 +msgid "No Style" +msgstr "无样式" + +#: mouse.cpp:579 +msgid "Newly Created Custom Style..." +msgstr "新组样式。" + +#: mouse.cpp:586 +msgid "Group Info" +msgstr "组信息" + +#: mouse.cpp:606 +msgid "Style Info" +msgstr "样式信息" + +#: mouse.cpp:626 +msgid "Select Edge Chain" +msgstr "选择边缘链" + +#: mouse.cpp:632 +msgid "Toggle Reference Dimension" +msgstr "切换参考标注" + +#: mouse.cpp:638 +msgid "Other Supplementary Angle" +msgstr "其它补充角度" + +#: mouse.cpp:643 +msgid "Snap to Grid" +msgstr "捕捉至轴网" + +#: mouse.cpp:652 +msgid "Remove Spline Point" +msgstr "删除样条线的点" + +#: mouse.cpp:687 +msgid "Add Spline Point" +msgstr "增加样条线的点" + +#: mouse.cpp:691 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "无法增加样条线点:超过最大限制。" + +#: mouse.cpp:716 +msgid "Toggle Construction" +msgstr "切换构造" + +#: mouse.cpp:731 +msgid "Delete Point-Coincident Constraint" +msgstr "删除点一致约束" + +#: mouse.cpp:750 +msgid "Cut" +msgstr "剪切" + +#: mouse.cpp:752 +msgid "Copy" +msgstr "复制" + +#: mouse.cpp:756 +msgid "Select All" +msgstr "全选" + +#: mouse.cpp:761 +msgid "Paste" +msgstr "粘贴" + +#: mouse.cpp:763 +msgid "Paste Transformed..." +msgstr "粘贴移动的..." + +#: mouse.cpp:768 +msgid "Delete" +msgstr "删除" + +#: mouse.cpp:771 +msgid "Unselect All" +msgstr "取消全选" + +#: mouse.cpp:778 +msgid "Unselect Hovered" +msgstr "取消覆盖区域的全选" + +#: mouse.cpp:787 +msgid "Zoom to Fit" +msgstr "自动缩放" + +#: mouse.cpp:990 mouse.cpp:1277 +msgid "click next point of line, or press Esc" +msgstr "点击下一个点或取消(ESC)" + +#: mouse.cpp:996 +msgid "" +"Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "无法在3D内绘制矩形; 首先,激活工作面,草图->在工作面。" + +#: mouse.cpp:1030 +msgid "click to place other corner of rectangle" +msgstr "点击放置其它矩形倒角" + +#: mouse.cpp:1050 +msgid "click to set radius" +msgstr "点击设置半径" + +#: mouse.cpp:1055 +msgid "" +"Can't draw arc in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "无法在3D空间内绘制弧线,可使用 草图->在工作面 激活工作面。" + +#: mouse.cpp:1074 +msgid "click to place point" +msgstr "点击放置点" + +#: mouse.cpp:1090 +msgid "click next point of cubic, or press Esc" +msgstr "点击下一个点或取消(ESC)" + +#: mouse.cpp:1095 +msgid "" +"Sketching in a workplane already; sketch in 3d before creating new workplane." +msgstr "已经在工作面绘制;在新建工作面前在三维空间绘制。" + +#: mouse.cpp:1111 +msgid "" +"Can't draw text in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "无法在三维空间内绘制文字,可使用 草图->在工作面 激活工作面。" + +#: mouse.cpp:1128 +msgid "click to place bottom right of text" +msgstr "点击文字的右下角放置" + +#: mouse.cpp:1134 +msgid "" +"Can't draw image in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 激活工作面。" + +#: mouse.cpp:1161 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "新备注 - 双击编辑" + +#: platform/gui.cpp:85 +msgctxt "file-type" +msgid "SolveSpace models" +msgstr "SolveSpace模型" + +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "PNG image" +msgstr "PNG图片" + +#: platform/gui.cpp:93 +msgctxt "file-type" +msgid "STL mesh" +msgstr "STL网格" + +#: platform/gui.cpp:94 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" +msgstr "Wavefront OBJ网格" + +#: platform/gui.cpp:95 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" +msgstr "Three.js-网格及查看视图" + +#: platform/gui.cpp:96 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "Three.js-仅网格" + +#: platform/gui.cpp:97 +msgctxt "file-type" +msgid "Q3D Object file" +msgstr "Q3D对象文件" + +#: platform/gui.cpp:98 +msgctxt "file-type" +msgid "VRML text file" +msgstr "VRML文本文件" + +#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +msgctxt "file-type" +msgid "STEP file" +msgstr "STEP文件" + +#: platform/gui.cpp:106 +msgctxt "file-type" +msgid "PDF file" +msgstr "PDF文件" + +#: platform/gui.cpp:107 +msgctxt "file-type" +msgid "Encapsulated PostScript" +msgstr "封装好的PostScript" + +#: platform/gui.cpp:108 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "SVG矢量图" + +#: platform/gui.cpp:110 platform/gui.cpp:117 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" +msgstr "DXF文件(AutoCAD 2007)" + +#: platform/gui.cpp:111 +msgctxt "file-type" +msgid "HPGL file" +msgstr "HPGL文件" + +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "G Code" +msgstr "G Code" + +#: platform/gui.cpp:121 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" +msgstr "AutoCAD DXF/DWG文件" + +#: platform/gui.cpp:125 +msgctxt "file-type" +msgid "Comma-separated values" +msgstr "逗号分隔数据" + +#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +msgid "untitled" +msgstr "未命名" + +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guiwin.cpp:1555 +msgctxt "title" +msgid "Save File" +msgstr "保存文件" + +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guiwin.cpp:1557 +msgctxt "title" +msgid "Open File" +msgstr "打开文件" + +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 +msgctxt "button" +msgid "_Cancel" +msgstr "取消_C" + +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 +msgctxt "button" +msgid "_Save" +msgstr "保存_S" + +#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 +msgctxt "button" +msgid "_Open" +msgstr "打开_O" + +#: style.cpp:166 +msgid "" +"Can't assign style to an entity that's derived from another entity; try " +"assigning a style to this entity's parent." +msgstr "无法将样式分配给派生自其他实体的实体;尝试将样式分配给此实体的父级。" + +#: style.cpp:665 +msgid "Style name cannot be empty" +msgstr "样式名称不能为空" + +#: textscreens.cpp:741 +msgid "Can't repeat fewer than 1 time." +msgstr "不能重复少于 1 次。" + +#: textscreens.cpp:745 +msgid "Can't repeat more than 999 times." +msgstr "重复不超过 999 次。" + +#: textscreens.cpp:770 +msgid "Group name cannot be empty" +msgstr "组名称不能为空" + +#: textscreens.cpp:813 +msgid "Opacity must be between zero and one." +msgstr "不透明度必须在零和 1 之间。" + +#: textscreens.cpp:848 +msgid "Radius cannot be zero or negative." +msgstr "半径偏移不能为负数。" + +#: toolbar.cpp:18 +msgid "Sketch line segment" +msgstr "草图线段" + +#: toolbar.cpp:20 +msgid "Sketch rectangle" +msgstr "草图矩形" + +#: toolbar.cpp:22 +msgid "Sketch circle" +msgstr "草图圆" + +#: toolbar.cpp:24 +msgid "Sketch arc of a circle" +msgstr "圆的草图弧线" + +#: toolbar.cpp:26 +msgid "Sketch curves from text in a TrueType font" +msgstr "从 TrueType 字体中的文本中绘制草图曲线" + +#: toolbar.cpp:28 +msgid "Sketch image from a file" +msgstr "从文件中绘制图像" + +#: toolbar.cpp:30 +msgid "Create tangent arc at selected point" +msgstr "在选定点创建切线弧" + +#: toolbar.cpp:32 +msgid "Sketch cubic Bezier spline" +msgstr "草图立方贝塞尔样条" + +#: toolbar.cpp:34 +msgid "Sketch datum point" +msgstr "草图基准点" + +#: toolbar.cpp:36 +msgid "Toggle construction" +msgstr "切换结构" + +#: toolbar.cpp:38 +msgid "Split lines / curves where they intersect" +msgstr "相交的分割线/曲线" + +#: toolbar.cpp:42 +msgid "Constrain distance / diameter / length" +msgstr "约束距离/直径/长度" + +#: toolbar.cpp:44 +msgid "Constrain angle" +msgstr "约束角度" + +#: toolbar.cpp:46 +msgid "Constrain to be horizontal" +msgstr "约束为水平" + +#: toolbar.cpp:48 +msgid "Constrain to be vertical" +msgstr "约束为垂直" + +#: toolbar.cpp:50 +msgid "Constrain to be parallel or tangent" +msgstr "约束为平行或切线" + +#: toolbar.cpp:52 +msgid "Constrain to be perpendicular" +msgstr "约束至垂直" + +#: toolbar.cpp:54 +msgid "Constrain point on line / curve / plane / point" +msgstr "约束点至线/曲线/平面/点" + +#: toolbar.cpp:56 +msgid "Constrain symmetric" +msgstr "对称约束" + +#: toolbar.cpp:58 +msgid "Constrain equal length / radius / angle" +msgstr "约束长/半径/角度相等" + +#: toolbar.cpp:60 +msgid "Constrain normals in same orientation" +msgstr "约束法线在同原点" + +#: toolbar.cpp:62 +msgid "Other supplementary angle" +msgstr "其它补充角度" + +#: toolbar.cpp:64 +msgid "Toggle reference dimension" +msgstr "切换参考标注" + +#: toolbar.cpp:68 +msgid "New group extruding active sketch" +msgstr "新组中挤出当前草图" + +#: toolbar.cpp:70 +msgid "New group rotating active sketch" +msgstr "新组中旋转体当前草图" + +#: toolbar.cpp:72 +msgid "New group step and repeat rotating" +msgstr "新组中逐步重复旋转体" + +#: toolbar.cpp:74 +msgid "New group step and repeat translating" +msgstr "新组中逐步重复移动体" + +#: toolbar.cpp:76 +msgid "New group in new workplane (thru given entities)" +msgstr "在新工作平面创建组(通过指定对象)" + +#: toolbar.cpp:78 +msgid "New group in 3d" +msgstr "在3D中新建组" + +#: toolbar.cpp:80 +msgid "New group linking / assembling file" +msgstr "新组 连接/装配文件" + +#: toolbar.cpp:84 +msgid "Nearest isometric view" +msgstr "ISO视图" + +#: toolbar.cpp:86 +msgid "Align view to active workplane" +msgstr "切换视图至当前工作面" + +#: util.cpp:165 +msgctxt "title" +msgid "Error" +msgstr "错误" + +#: util.cpp:165 +msgctxt "title" +msgid "Message" +msgstr "消息" + +#: util.cpp:170 +msgctxt "button" +msgid "&OK" +msgstr "&OK" + +#: view.cpp:78 +msgid "Scale cannot be zero or negative." +msgstr "缩放不能为零。" + +#: view.cpp:90 view.cpp:99 +msgid "Bad format: specify x, y, z" +msgstr "格式错误: 需指定 x, y, z" From 9fb286b6b218f33f302adc3b21241a5fe666bf7a Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 20 Oct 2020 11:11:43 -0400 Subject: [PATCH 141/646] remove zh_CN.mo --- res/locales/zh_CN.mo | Bin 30647 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 res/locales/zh_CN.mo diff --git a/res/locales/zh_CN.mo b/res/locales/zh_CN.mo deleted file mode 100644 index 75f043babf759f10c7b88d0eba88c059a2fb1529..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30647 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 Date: Wed, 14 Oct 2020 20:27:56 -0400 Subject: [PATCH 142/646] Add vertexes to curve intersection list in addition to surface intersections. Sometimes a vertex can be used to split a curve where surface intersections can't. Those unsplit curves can cause boolean failures. --- src/srf/boolean.cpp | 50 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index b0b175dae..7789b8de0 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -20,6 +20,32 @@ void SShell::MakeFromIntersectionOf(SShell *a, SShell *b) { MakeFromBoolean(a, b, SSurface::CombineAs::INTERSECTION); } +// We will be inserting existing verticies into curves to split them +// todo: this is only using the ends of exact curves, and it is only +// using them to split existing curves, not new intersections. +// It resolves some issues but we could do better. We will need to +// reorder things so the surface intersection curves exist prior to +// splitting any curves at all in order to have their verticies too. +// Better still would be to get curve/surface intersection to work +// more reliably at the edges - maybe do curve/curve tests as part +// of the curve-surface intersection test. +static void FindVertsOnCurve(List *l, const SCurve *curve, SShell *sh) { + for(auto sc : sh->curve) { + if(!sc.isExact) continue; + for(int i=0; i<2; i++) { + Vector pt = sc.exact.ctrl[ i==0 ? 0 : sc.exact.deg ]; + double t; + curve->exact.ClosestPointTo(pt, &t, /*must converge=*/ false); + double d = pt.Minus(curve->exact.PointAt(t)).Magnitude(); + if((t>LENGTH_EPS) && (t<(1.0-LENGTH_EPS)) && (d < LENGTH_EPS)) { + SInter inter; + inter.p = pt; + l->Add(&inter); + } + } + } +} + //----------------------------------------------------------------------------- // Take our original pwl curve. Wherever an edge intersects a surface within // either agnstA or agnstB, split the piecewise linear element. Then refine @@ -35,12 +61,19 @@ SCurve SCurve::MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB, ret = *this; ret.pts = {}; + // First find any vertex that lies on our curve. + List vertpts = {}; + if(agnstA) + FindVertsOnCurve(&vertpts, this, agnstA); + if(agnstB) + FindVertsOnCurve(&vertpts, this, agnstB); + const SCurvePt *p = pts.First(); ssassert(p != NULL, "Cannot split an empty curve"); SCurvePt prev = *p; ret.pts.Add(p); p = pts.NextAfter(p); - + for(; p; p = pts.NextAfter(p)) { List il = {}; @@ -100,12 +133,22 @@ SCurve SCurve::MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB, pi->p = (pi->srf)->PointAt(puv); } il.RemoveTagged(); + } + // Now add any vertex that is on this segment + const Vector lineStart = prev.p; + const Vector lineDirection = (p->p).Minus(prev.p); + for(auto vtx : vertpts) { + double t = (vtx.p.Minus(lineStart)).DivProjected(lineDirection); + if((0.0 < t) && (t < 1.0)) { + il.Add(&vtx); + } + } + if(!il.IsEmpty()) { + SInter *pi; // And now sort them in order along the line. Note that we must // do that after refining, in case the refining would make two // points switch places. - const Vector lineStart = prev.p; - const Vector lineDirection = (p->p).Minus(prev.p); std::sort(il.begin(), il.end(), [&](const SInter &a, const SInter &b) { double ta = (a.p.Minus(lineStart)).DivProjected(lineDirection); double tb = (b.p.Minus(lineStart)).DivProjected(lineDirection); @@ -133,6 +176,7 @@ SCurve SCurve::MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB, ret.pts.Add(p); prev = *p; } + vertpts.Clear(); return ret; } From 925b60106c91b5a2fc4b673b5c27136bf3c722bf Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Tue, 20 Oct 2020 17:31:26 +0200 Subject: [PATCH 143/646] Travis: optimize macOS deploy build - Turns on the -DENABLE_LTO flag during deploy - Turns off the -DENABLE_OPENMP flag during test --- .travis/build-macos.sh | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/.travis/build-macos.sh b/.travis/build-macos.sh index a9f39c4f1..aca078f12 100755 --- a/.travis/build-macos.sh +++ b/.travis/build-macos.sh @@ -1,14 +1,9 @@ #!/bin/sh -xe -if echo $TRAVIS_TAG | grep ^v; then - BUILD_TYPE=RelWithDebInfo -else - BUILD_TYPE=Debug -fi - mkdir build || true cd build +OSX_TARGET="10.9" LLVM_PREFIX=$(brew --prefix llvm@9) export CC="${LLVM_PREFIX}/bin/clang" export CXX="${CC}++" @@ -16,10 +11,19 @@ export LDFLAGS="-L${LLVM_PREFIX}/lib -Wl,-rpath,${LLVM_PREFIX}/lib" \ export CFLAGS="-I${LLVM_PREFIX}/include" export CPPFLAGS="-I${LLVM_PREFIX}/include" -cmake \ - -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 \ - -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. \ - -DENABLE_OPENMP=ON +if echo $TRAVIS_TAG | grep ^v; then + BUILD_TYPE=RelWithDebInfo + cmake \ + -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_TARGET}" \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" .. \ + -DENABLE_OPENMP=ON \ + -DENABLE_LTO=ON +else + BUILD_TYPE=Debug + cmake \ + -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_TARGET}" \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" .. +fi -cmake --build . --config $BUILD_TYPE -- -j$(nproc) +cmake --build . --config "${BUILD_TYPE}" -- -j$(nproc) make -j$(nproc) test_solvespace From 2f7a3a3c27e628f0e182f98b37ebe0932b2e3be9 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Wed, 21 Oct 2020 00:07:32 +0200 Subject: [PATCH 144/646] CMake: fix LTO on Linux LTO/IPO with non-Intel compilers on Linux requires policy CMP0069 to be set to NEW. Set it explicitly until cmake_minimum_required is raised to >= 3.9 Also explicitly check whether the current environment actually supports IPO. --- CMakeLists.txt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index ed4f673c3..736d87274 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,6 +11,11 @@ cmake_minimum_required(VERSION 3.7.2 FATAL_ERROR) if(NOT CMAKE_VERSION VERSION_LESS 3.11.0) cmake_policy(VERSION 3.11.0) endif() +if(NOT CMAKE_VERSION VERSION_LESS 3.9) + # LTO/IPO with non-Intel compilers on Linux requires policy CMP0069 to be set to NEW. + # Set it explicitly until cmake_minimum_required is raised to >= 3.9. + cmake_policy(SET CMP0069 NEW) +endif() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") set(CMAKE_CXX_STANDARD 11) @@ -102,6 +107,8 @@ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "i686" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "X8 endif() if(ENABLE_LTO) + include(CheckIPOSupported) + check_ipo_supported() set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) endif() From 0536ee37b594b9a285ce107f441d1096312e2655 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Wed, 21 Oct 2020 21:13:49 +0200 Subject: [PATCH 145/646] Travis: release macOS and Windows edge builds - Fixes windows build type - Revert `cleanup: false` back to `skip_cleanup: true` - Waits 10 seconds to get notarize_uuid for macOS since it would sometimes fail --- .travis.yml | 45 +++++++++++++++++++++++++++++++++------- .travis/build-macos.sh | 2 +- .travis/build-windows.sh | 21 +++++++++++++------ .travis/sign-macos.sh | 2 +- 4 files changed, 55 insertions(+), 15 deletions(-) diff --git a/.travis.yml b/.travis.yml index d11a77edb..2d02dd986 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,21 +15,29 @@ jobs: install: ".travis/install-macos.sh" script: ".travis/build-macos.sh" - stage: deploy - if: tag IS present name: macOS deploy + if: (NOT type IN (pull_request)) AND (branch = master) os: osx osx_image: xcode12.2 install: ".travis/install-macos.sh" - script: ".travis/build-macos.sh && .travis/sign-macos.sh" + script: ".travis/build-macos.sh release && .travis/sign-macos.sh" + before_deploy: + - git config --local user.name "solvespace-cd" + - git config --local user.email "no-reply@solvespace.com" + - export TRAVIS_TAG=${TRAVIS_TAG:-edge} + - git tag $TRAVIS_TAG deploy: provider: releases token: secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= - cleanup: false + skip_cleanup: true + prerelease: true + overwrite: true + name: ${TRAVIS_TAG:-edge} + body: $TRAVIS_COMMIT_MESSAGE file: build/bin/SolveSpace.dmg on: repo: solvespace/solvespace - tags: true - stage: test name: "Debian" os: linux @@ -37,10 +45,33 @@ jobs: install: .travis/install-debian.sh script: .travis/build-debian.sh - stage: test - name: "Windows Visual Studio 2017" + name: "Windows Visual Studio 2017 test" os: windows install: .travis/install-windows.sh script: .travis/build-windows.sh + - stage: deploy + name: "Windows Visual Studio 2017 deploy" + os: windows + install: .travis/install-windows.sh + script: .travis/build-windows.sh release + before_deploy: + - git config --local user.name "solvespace-cd" + - git config --local user.email "no-reply@solvespace.com" + - export TRAVIS_TAG=${TRAVIS_TAG:-edge} + - git tag $TRAVIS_TAG + deploy: + provider: releases + token: + secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= + skip_cleanup: true + draft: true + prerelease: true + overwrite: true + name: ${TRAVIS_TAG:-edge} + body: $TRAVIS_COMMIT_MESSAGE + file: build/bin/RelWithDebInfo/solvespace.exe + on: + repo: solvespace/solvespace - &deploy-snap stage: deploy name: Snap amd64 @@ -55,13 +86,13 @@ jobs: deploy: - provider: script script: sudo .travis/deploy-snap.sh edge - cleanup: false + skip_cleanup: true on: branch: master tags: false - provider: script script: sudo .travis/deploy-snap.sh edge,beta - cleanup: false + skip_cleanup: true on: branch: master tags: true diff --git a/.travis/build-macos.sh b/.travis/build-macos.sh index aca078f12..d8868a669 100755 --- a/.travis/build-macos.sh +++ b/.travis/build-macos.sh @@ -11,7 +11,7 @@ export LDFLAGS="-L${LLVM_PREFIX}/lib -Wl,-rpath,${LLVM_PREFIX}/lib" \ export CFLAGS="-I${LLVM_PREFIX}/include" export CPPFLAGS="-I${LLVM_PREFIX}/include" -if echo $TRAVIS_TAG | grep ^v; then +if [ "$1" == "release" ]; then BUILD_TYPE=RelWithDebInfo cmake \ -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_TARGET}" \ diff --git a/.travis/build-windows.sh b/.travis/build-windows.sh index 9cbc38979..f66b6cd45 100755 --- a/.travis/build-windows.sh +++ b/.travis/build-windows.sh @@ -3,14 +3,23 @@ MSBUILD_PATH="c:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" export PATH=$MSBUILD_PATH:$PATH -if echo $TRAVIS_TAG | grep ^v; then BUILD_TYPE=RelWithDebInfo; else BUILD_TYPE=Debug; fi - mkdir build cd build -cmake .. -G "Visual Studio 15 2017 Win64" -DCMAKE_BUILD_TYPE=$BUILD_TYPE -MSBuild.exe "src/solvespace.vcxproj" -maxcpucount -MSBuild.exe "src/solvespace-cli.vcxproj" -maxcpucount -MSBuild.exe "test/solvespace-testsuite.vcxproj" -maxcpucount +if [ "$1" == "release" ]; then + BUILD_TYPE=RelWithDebInfo + cmake \ + -G "Visual Studio 15 2017 Win64" \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" .. \ + -DENABLE_OPENMP=ON \ + -DENABLE_LTO=ON +else + BUILD_TYPE=Debug + cmake \ + -G "Visual Studio 15 2017 Win64" \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" .. +fi + +cmake --build . --config "${BUILD_TYPE}" -- -maxcpucount bin/$BUILD_TYPE/solvespace-testsuite.exe diff --git a/.travis/sign-macos.sh b/.travis/sign-macos.sh index 6a379b539..8399e88a4 100755 --- a/.travis/sign-macos.sh +++ b/.travis/sign-macos.sh @@ -39,7 +39,7 @@ notarize_uuid=$(xcrun altool --notarize-app --primary-bundle-id "${bundle_id}" - echo $notarize_uuid # wait a bit so we don't get errors during checking -sleep 5 +sleep 10 success=0 for (( ; ; )) From b044cd5167763a43772d8f9c733c3c10836717af Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 21 Oct 2020 22:16:37 +0300 Subject: [PATCH 146/646] STEP Export: include colors and alpha The implementation may be sub-optimal, since the colour and alpha is defined for each NURBS surface instead of on group level, but the STEP export currently does not represent group structure at all and I am not familiar with the format in order to change this. Fixes: https://github.com/solvespace/solvespace/issues/452 --- src/exportstep.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/exportstep.cpp b/src/exportstep.cpp index d5c9d406a..ef50e7891 100644 --- a/src/exportstep.cpp +++ b/src/exportstep.cpp @@ -273,9 +273,36 @@ void StepFileWriter::ExportSurface(SSurface *ss, SBezierList *sbl) { } fprintf(f, "),#%d,.T.);\n", srfid); - fprintf(f, "\n"); advancedFaces.Add(&advFaceId); + // Export the surface color and transparency + // https://www.cax-if.org/documents/rec_prac_styling_org_v16.pdf sections 4.4.2 4.2.4 etc. + // https://tracker.dev.opencascade.org/view.php?id=31550 + fprintf(f, "#%d=COLOUR_RGB('',%.2f,%.2f,%.2f);\n", ++id, ss->color.redF(), + ss->color.greenF(), ss->color.blueF()); + + fprintf(f, "#%d=SURFACE_STYLE_TRANSPARENT(%.2f);\n", ++id, 1.0 - ss->color.alphaF()); + fprintf(f, "#%d=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#%d,(#%d));\n", + ++id, id - 2, id - 1); + + fprintf(f, "#%d=SURFACE_SIDE_STYLE('',(#%d));\n", ++id, id - 1); + + /* // This also works but is more verbose. + fprintf(f, "#%d=FILL_AREA_STYLE_COLOUR('',#%d);\n", ++id, id - 1); + fprintf(f, "#%d=FILL_AREA_STYLE('',(#%d));\n", ++id, id - 1); + fprintf(f, "#%d=SURFACE_STYLE_FILL_AREA(#%d);\n", ++id, id - 1); + + fprintf(f, "#%d=SURFACE_STYLE_TRANSPARENT(%.2f);\n", ++id, 1.0 - ss->color.alphaF()); + fprintf(f, "#%d=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#%d,(#%d));\n", ++id, id - 5, id - 1); + + fprintf(f, "#%d=SURFACE_SIDE_STYLE('',(#%d, #%d));\n", ++id, id - 3, id - 1); + */ + + fprintf(f, "#%d=SURFACE_STYLE_USAGE(.BOTH.,#%d);\n", ++id, id - 1); + fprintf(f, "#%d=PRESENTATION_STYLE_ASSIGNMENT((#%d));\n", ++id, id - 1); + fprintf(f, "#%d=STYLED_ITEM('',(#%d),#%d);\n", ++id, id - 1, advFaceId); + fprintf(f, "\n"); + id++; listOfLoops.Clear(); } From bb1dfaf749c45bde3b51f1bf03eae4f1a6db69ba Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Wed, 21 Oct 2020 00:30:03 +0200 Subject: [PATCH 147/646] snap: enable OpenMP and LTO --- pkg/snap/snap/snapcraft.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index 195a50868..400ea19e2 100644 --- a/pkg/snap/snap/snapcraft.yaml +++ b/pkg/snap/snap/snapcraft.yaml @@ -51,6 +51,8 @@ parts: - -DCMAKE_BUILD_TYPE=Release - -DENABLE_TESTS=OFF - -DSNAP=ON + - -DENABLE_OPENMP=ON + - -DENABLE_LTO=ON build-packages: - zlib1g-dev - libpng-dev From de7d11cf4124161aba9eabdcc1d831b8fcb7bc47 Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 21 Oct 2020 12:25:53 +0300 Subject: [PATCH 148/646] CMake: Give ENABLE_LTO a default and a description so it shows up in cmake-gui --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 736d87274..6430e2a95 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,8 @@ 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 + "Whether interprocedural (global) optimizations are enabled") set(OPENGL 3 CACHE STRING "OpenGL version to use (one of: 1 3)") From 20d48ce4e28abad72121d449488ce3ec4c5b4d39 Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 22 Oct 2020 09:59:35 +0300 Subject: [PATCH 149/646] STEP Export: include colors and alpha Make the color export work in KiCAD and Horison EDA which do not support transparency. Fixes: https://github.com/solvespace/solvespace/issues/452 https://github.com/solvespace/solvespace/pull/763 --- src/exportstep.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/exportstep.cpp b/src/exportstep.cpp index ef50e7891..915852266 100644 --- a/src/exportstep.cpp +++ b/src/exportstep.cpp @@ -281,22 +281,21 @@ void StepFileWriter::ExportSurface(SSurface *ss, SBezierList *sbl) { fprintf(f, "#%d=COLOUR_RGB('',%.2f,%.2f,%.2f);\n", ++id, ss->color.redF(), ss->color.greenF(), ss->color.blueF()); +/* // This works in Kisters 3DViewStation but not in KiCAD and Horison EDA, + // it seems they do not support transparency so use the more verbose one below fprintf(f, "#%d=SURFACE_STYLE_TRANSPARENT(%.2f);\n", ++id, 1.0 - ss->color.alphaF()); fprintf(f, "#%d=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#%d,(#%d));\n", ++id, id - 2, id - 1); - fprintf(f, "#%d=SURFACE_SIDE_STYLE('',(#%d));\n", ++id, id - 1); +*/ - /* // This also works but is more verbose. - fprintf(f, "#%d=FILL_AREA_STYLE_COLOUR('',#%d);\n", ++id, id - 1); - fprintf(f, "#%d=FILL_AREA_STYLE('',(#%d));\n", ++id, id - 1); - fprintf(f, "#%d=SURFACE_STYLE_FILL_AREA(#%d);\n", ++id, id - 1); - - fprintf(f, "#%d=SURFACE_STYLE_TRANSPARENT(%.2f);\n", ++id, 1.0 - ss->color.alphaF()); - fprintf(f, "#%d=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#%d,(#%d));\n", ++id, id - 5, id - 1); - - fprintf(f, "#%d=SURFACE_SIDE_STYLE('',(#%d, #%d));\n", ++id, id - 3, id - 1); - */ + // This works in Horison EDA but is more verbose. + fprintf(f, "#%d=FILL_AREA_STYLE_COLOUR('',#%d);\n", ++id, id - 1); + fprintf(f, "#%d=FILL_AREA_STYLE('',(#%d));\n", ++id, id - 1); + fprintf(f, "#%d=SURFACE_STYLE_FILL_AREA(#%d);\n", ++id, id - 1); + fprintf(f, "#%d=SURFACE_STYLE_TRANSPARENT(%.2f);\n", ++id, 1.0 - ss->color.alphaF()); + fprintf(f, "#%d=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#%d,(#%d));\n", ++id, id - 5, id - 1); + fprintf(f, "#%d=SURFACE_SIDE_STYLE('',(#%d, #%d));\n", ++id, id - 3, id - 1); fprintf(f, "#%d=SURFACE_STYLE_USAGE(.BOTH.,#%d);\n", ++id, id - 1); fprintf(f, "#%d=PRESENTATION_STYLE_ASSIGNMENT((#%d));\n", ++id, id - 1); From 44fb8bf85bb9b6e0c78dc690c61bc4540465cfa9 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 21 Oct 2020 16:30:55 -0400 Subject: [PATCH 150/646] Resovle a huge performance regression introduced by commit ab10e38 while still fixing the NURBS issues resolved by that commit with only modest speed penalty. The performance is significantly improved by using bounding box tests on curves prior to doing complex intersection testing. --- src/srf/boolean.cpp | 48 ++++++++++++++++++++++++++++++++------------- src/srf/surface.h | 1 + 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 7789b8de0..7546b0b9a 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -20,18 +20,36 @@ void SShell::MakeFromIntersectionOf(SShell *a, SShell *b) { MakeFromBoolean(a, b, SSurface::CombineAs::INTERSECTION); } -// We will be inserting existing verticies into curves to split them -// todo: this is only using the ends of exact curves, and it is only -// using them to split existing curves, not new intersections. -// It resolves some issues but we could do better. We will need to -// reorder things so the surface intersection curves exist prior to -// splitting any curves at all in order to have their verticies too. -// Better still would be to get curve/surface intersection to work -// more reliably at the edges - maybe do curve/curve tests as part -// of the curve-surface intersection test. +void SCurve::GetAxisAlignedBounding(Vector *ptMax, Vector *ptMin) const { + *ptMax = {VERY_NEGATIVE, VERY_NEGATIVE, VERY_NEGATIVE}; + *ptMin = {VERY_POSITIVE, VERY_POSITIVE, VERY_POSITIVE}; + + for(int i = 0; i <= exact.deg; i++) { + exact.ctrl[i].MakeMaxMin(ptMax, ptMin); + } +} + +// We will be inserting other curve verticies into our curves to split them. +// This is helpful when curved surfaces become tangent along a trim and the +// usual tests for curve-surface intersection don't split the curve at a vertex. +// This is faster than the previous version that split at surface corners and +// handles more buggy cases. It's not clear this is the best way but it works ok. static void FindVertsOnCurve(List *l, const SCurve *curve, SShell *sh) { + + Vector amax, amin; + curve->GetAxisAlignedBounding(&amax, &amin); + for(auto sc : sh->curve) { if(!sc.isExact) continue; + + Vector cmax, cmin; + sc.GetAxisAlignedBounding(&cmax, &cmin); + + if(Vector::BoundingBoxesDisjoint(amax, amin, cmax, cmin)) { + // They cannot possibly intersect, no curves to generate + continue; + } + for(int i=0; i<2; i++) { Vector pt = sc.exact.ctrl[ i==0 ? 0 : sc.exact.deg ]; double t; @@ -63,11 +81,13 @@ SCurve SCurve::MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB, // First find any vertex that lies on our curve. List vertpts = {}; - if(agnstA) - FindVertsOnCurve(&vertpts, this, agnstA); - if(agnstB) - FindVertsOnCurve(&vertpts, this, agnstB); - + if(isExact) { + if(agnstA) + FindVertsOnCurve(&vertpts, this, agnstA); + if(agnstB) + FindVertsOnCurve(&vertpts, this, agnstB); + } + const SCurvePt *p = pts.First(); ssassert(p != NULL, "Cannot split an empty curve"); SCurvePt prev = *p; diff --git a/src/srf/surface.h b/src/srf/surface.h index ff8aa0f2f..549745525 100644 --- a/src/srf/surface.h +++ b/src/srf/surface.h @@ -219,6 +219,7 @@ class SCurve { SSurface *GetSurfaceB(SShell *a, SShell *b) const; void Clear(); + void GetAxisAlignedBounding(Vector *ptMax, Vector *ptMin) const; }; // A segment of a curve by which a surface is trimmed: indicates which curve, From 63b8899c44a80c537aaf299e6f5f7e3ac635f058 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 22 Oct 2020 10:48:27 -0400 Subject: [PATCH 151/646] Add OpenMP parallel for to SShell::CopyCurvesSplitAgainst --- src/srf/boolean.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 7546b0b9a..1edf46ed5 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -201,16 +201,19 @@ SCurve SCurve::MakeCopySplitAgainst(SShell *agnstA, SShell *agnstB, } void SShell::CopyCurvesSplitAgainst(bool opA, SShell *agnst, SShell *into) { - SCurve *sc; - for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) { +#pragma omp parallel for + for(int i=0; iMakeCopySplitAgainst(agnst, NULL, surface.FindById(sc->surfA), surface.FindById(sc->surfB)); scn.source = opA ? SCurve::Source::A : SCurve::Source::B; - - hSCurve hsc = into->curve.AddAndAssignId(&scn); - // And note the new ID so that we can rewrite the trims appropriately - sc->newH = hsc; +#pragma omp critical + { + hSCurve hsc = into->curve.AddAndAssignId(&scn); + // And note the new ID so that we can rewrite the trims appropriately + sc->newH = hsc; + } } } From 48dda8680734e6b4b964df1328acae2fbbaed8a3 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Thu, 22 Oct 2020 23:09:17 +0200 Subject: [PATCH 152/646] CMake: use sanitizer flags for internal targets only Previously sanitizer flags were set unconditionally for all code, including that of external libraries. Set them only for targets in src/, tests/ and exposed/. Unfortunately, the linker equivalent to add_compile_options, add_link_options, is only available for CMake version >= 3.13. So add the sanitizer flags manually to each target's linker options. --- CMakeLists.txt | 10 +++------- exposed/CMakeLists.txt | 5 ++++- src/CMakeLists.txt | 19 ++++++++++++++----- test/CMakeLists.txt | 8 ++++++-- 4 files changed, 27 insertions(+), 15 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6430e2a95..9b46e0122 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,19 +170,15 @@ if(ENABLE_SANITIZERS) endif() string(REPLACE ";" "," SANITIZE_OPTIONS "${SANITIZE_OPTIONS}") - set(SANITIZE_FLAGS "-O1 -fsanitize=${SANITIZE_OPTIONS}") - set(SANITIZE_FLAGS "${SANITIZE_FLAGS} -fno-sanitize-recover=address,undefined") + set(SANITIZE_FLAGS "-O1;-fsanitize=${SANITIZE_OPTIONS};-fno-sanitize-recover=address,undefined") if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(SANITIZE_FLAGS "${SANITIZE_FLAGS} -fno-omit-frame-pointer -fno-optimize-sibling-calls") + list(APPEND SANITIZE_FLAGS -fno-omit-frame-pointer -fno-optimize-sibling-calls) elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") - set(SANITIZE_FLAGS "${SANITIZE_FLAGS} -fuse-ld=gold") + list(APPEND SANITIZE_FLAGS -fuse-ld=gold) else() message(FATAL_ERROR "Sanitizers are only available when using GCC or Clang") endif() - - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZE_FLAGS}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZE_FLAGS}") endif() # common dependencies diff --git a/exposed/CMakeLists.txt b/exposed/CMakeLists.txt index bdc3fc39c..a70b2c5ff 100644 --- a/exposed/CMakeLists.txt +++ b/exposed/CMakeLists.txt @@ -1,3 +1,5 @@ +add_compile_options(${SANITIZE_FLAGS}) + include_directories( ${CMAKE_SOURCE_DIR}/include) @@ -5,4 +7,5 @@ add_executable(CDemo CDemo.c) target_link_libraries(CDemo - slvs) + slvs + ${SANITIZE_FLAGS}) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fd8359f69..f40b2deee 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -26,6 +26,10 @@ if(APPLE) ${APPKIT_LIBRARY}) endif() +# sanitizers for all code in src and below + +add_compile_options(${SANITIZE_FLAGS}) + # libslvs set(libslvs_SOURCES @@ -55,7 +59,8 @@ target_include_directories(slvs target_link_libraries(slvs ${util_LIBRARIES} - mimalloc-static) + mimalloc-static + ${SANITIZE_FLAGS}) add_dependencies(slvs mimalloc-static) @@ -225,7 +230,8 @@ target_link_libraries(solvespace-core ${PNG_LIBRARY} ${FREETYPE_LIBRARY} flatbuffers - mimalloc-static) + mimalloc-static + ${SANITIZE_FLAGS}) if(Backtrace_FOUND) target_link_libraries(solvespace-core @@ -332,7 +338,8 @@ if(ENABLE_GUI) solvespace-core ${OPENGL_LIBRARIES} ${platform_LIBRARIES} - ${COVERAGE_LIBRARY}) + ${COVERAGE_LIBRARY} + ${SANITIZE_FLAGS}) if(MSVC) set_target_properties(solvespace PROPERTIES @@ -361,7 +368,8 @@ target_include_directories(solvespace-headless target_link_libraries(solvespace-headless solvespace-core - ${CAIRO_LIBRARIES}) + ${CAIRO_LIBRARIES} + ${SANITIZE_FLAGS}) target_compile_options(solvespace-headless PRIVATE ${COVERAGE_FLAGS}) @@ -375,7 +383,8 @@ if(ENABLE_CLI) target_link_libraries(solvespace-cli solvespace-core - solvespace-headless) + solvespace-headless + ${SANITIZE_FLAGS}) add_dependencies(solvespace-cli resources) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index db812bfab..2382253eb 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,6 +11,8 @@ if(${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows") add_definitions(-DTEST_BUILD_ON_WINDOWS) endif() +add_compile_options(${SANITIZE_FLAGS}) + # test suite set(testsuite_SOURCES @@ -74,7 +76,8 @@ add_executable(solvespace-testsuite target_link_libraries(solvespace-testsuite solvespace-headless - ${COVERAGE_LIBRARY}) + ${COVERAGE_LIBRARY} + ${SANITIZE_FLAGS}) add_dependencies(solvespace-testsuite resources) @@ -132,7 +135,8 @@ add_executable(solvespace-debugtool target_link_libraries(solvespace-debugtool solvespace-core - solvespace-headless) + solvespace-headless + ${SANITIZE_FLAGS}) add_dependencies(solvespace-debugtool resources) From 2e6131ce9e1ec14b07ef145c72df50cddad635dd Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 21 Oct 2020 16:39:15 +0300 Subject: [PATCH 153/646] Performance optimization of the Vector class Profiling with MSVC 2019 showed that many of the Vector methods are on a critical path (not surprising). They are changed to be inline and unnecessary temporaries are removed. On the example below generate times decreased from 102s. to 64s. At the same time the executable size shrank from 5569536 to 5150208 bytes in release mode (with global optimizations). This should not stop us from working on optimizing inner loops e.g. https://github.com/solvespace/solvespace/issues/759 . [Test model](https://github.com/solvespace/solvespace/files/5414683/PrismConeNURBSNormalsTangents300.zip) --- src/dsc.h | 46 +++++++++++++++++++++++++++++++ src/util.cpp | 78 ---------------------------------------------------- 2 files changed, 46 insertions(+), 78 deletions(-) diff --git a/src/dsc.h b/src/dsc.h index f07d9321d..93403bca0 100644 --- a/src/dsc.h +++ b/src/dsc.h @@ -155,6 +155,52 @@ inline bool Vector::Equals(Vector v, double tol) const { return dv.MagSquared() < tol*tol; } +inline Vector Vector::From(double x, double y, double z) { + return {x, y, z}; +} + +inline Vector Vector::Plus(Vector b) const { + return {x + b.x, y + b.y, z + b.z}; +} + +inline Vector Vector::Minus(Vector b) const { + return {x - b.x, y - b.y, z - b.z}; +} + +inline Vector Vector::Negated() const { + return {-x, -y, -z}; +} + +inline Vector Vector::Cross(Vector b) const { + return {-(z * b.y) + (y * b.z), (z * b.x) - (x * b.z), -(y * b.x) + (x * b.y)}; +} + +inline double Vector::Dot(Vector b) const { + return (x * b.x + y * b.y + z * b.z); +} + +inline double Vector::MagSquared() const { + return x * x + y * y + z * z; +} + +inline double Vector::Magnitude() const { + return sqrt(x * x + y * y + z * z); +} + +inline Vector Vector::ScaledBy(const double v) const { + return {x * v, y * v, z * v}; +} + +inline void Vector::MakeMaxMin(Vector *maxv, Vector *minv) const { + maxv->x = max(maxv->x, x); + maxv->y = max(maxv->y, y); + maxv->z = max(maxv->z, z); + + minv->x = min(minv->x, x); + minv->y = min(minv->y, y); + minv->z = min(minv->z, z); +} + struct VectorHash { size_t operator()(const Vector &v) const; }; diff --git a/src/util.cpp b/src/util.cpp index f2d33c2d4..f14417cc9 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -428,12 +428,6 @@ Quaternion Quaternion::Mirror() const { } -Vector Vector::From(double x, double y, double z) { - Vector v; - v.x = x; v.y = y; v.z = z; - return v; -} - Vector Vector::From(hParam x, hParam y, hParam z) { Vector v; v.x = SK.GetParam(x)->val; @@ -448,50 +442,6 @@ bool Vector::EqualsExactly(Vector v) const { z == v.z); } -Vector Vector::Plus(Vector b) const { - Vector r; - - r.x = x + b.x; - r.y = y + b.y; - r.z = z + b.z; - - return r; -} - -Vector Vector::Minus(Vector b) const { - Vector r; - - r.x = x - b.x; - r.y = y - b.y; - r.z = z - b.z; - - return r; -} - -Vector Vector::Negated() const { - Vector r; - - r.x = -x; - r.y = -y; - r.z = -z; - - return r; -} - -Vector Vector::Cross(Vector b) const { - Vector r; - - r.x = -(z*b.y) + (y*b.z); - r.y = (z*b.x) - (x*b.z); - r.z = -(y*b.x) + (x*b.y); - - return r; -} - -double Vector::Dot(Vector b) const { - return (x*b.x + y*b.y + z*b.z); -} - double Vector::DirectionCosineWith(Vector b) const { Vector a = this->WithMagnitude(1); b = b.WithMagnitude(1); @@ -629,24 +579,6 @@ Vector Vector::ClosestPointOnLine(Vector p0, Vector dp) const { return this->Plus(n.WithMagnitude(d)); } -double Vector::MagSquared() const { - return x*x + y*y + z*z; -} - -double Vector::Magnitude() const { - return sqrt(x*x + y*y + z*z); -} - -Vector Vector::ScaledBy(double v) const { - Vector r; - - r.x = x * v; - r.y = y * v; - r.z = z * v; - - return r; -} - Vector Vector::WithMagnitude(double v) const { double m = Magnitude(); if(EXACT(m == 0)) { @@ -729,16 +661,6 @@ Vector Vector::ClampWithin(double minv, double maxv) const { return ret; } -void Vector::MakeMaxMin(Vector *maxv, Vector *minv) const { - maxv->x = max(maxv->x, x); - maxv->y = max(maxv->y, y); - maxv->z = max(maxv->z, z); - - minv->x = min(minv->x, x); - minv->y = min(minv->y, y); - minv->z = min(minv->z, z); -} - bool Vector::OutsideAndNotOn(Vector maxv, Vector minv) const { return (x > maxv.x + LENGTH_EPS) || (x < minv.x - LENGTH_EPS) || (y > maxv.y + LENGTH_EPS) || (y < minv.y - LENGTH_EPS) || From de89d1c2ce07af9481539c82e413d9be71bab96e Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sat, 24 Oct 2020 11:08:40 +0200 Subject: [PATCH 154/646] Travis: CI improvements and fixing edge builds (#766) - Fix release notes by using edge deploy provider, see: https://github.com/travis-ci/dpl/pull/1069 - Deploy only on master branch - Move to arm64-graviton2 - Rename debian -> ubuntu - Remove appveyor.yml - Remove redundant deploy stage in build step names - Get rid of bash code in files using sh, and explicitly use bash in sign-macos.sh script - Add missing newline to build-windows.sh - Build x86 for Windows - Enable OpenMP in test builds - Disable sanitizers on macOS test build - Disallow failures on snap build --- .travis.yml | 56 ++++++++++++++----- .travis/build-debian.sh | 11 ---- .travis/build-macos.sh | 16 ++++-- .travis/build-ubuntu.sh | 11 ++++ .travis/build-windows.sh | 28 +++++++--- .../{install-debian.sh => install-ubuntu.sh} | 0 .travis/sign-macos.sh | 2 +- CMakeLists.txt | 6 +- appveyor.yml | 29 ---------- 9 files changed, 89 insertions(+), 70 deletions(-) delete mode 100755 .travis/build-debian.sh create mode 100755 .travis/build-ubuntu.sh rename .travis/{install-debian.sh => install-ubuntu.sh} (100%) delete mode 100644 appveyor.yml diff --git a/.travis.yml b/.travis.yml index 2d02dd986..8444246f7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,20 +3,20 @@ dist: xenial language: c git: submodules: false +stages: + - test + - name: deploy + if: (NOT type IN (pull_request)) AND (branch = master) jobs: - allow_failures: - - stage: deploy - name: Snap arm64 include: - stage: test - name: macOS test + name: macOS os: osx osx_image: xcode12.2 install: ".travis/install-macos.sh" script: ".travis/build-macos.sh" - stage: deploy - name: macOS deploy - if: (NOT type IN (pull_request)) AND (branch = master) + name: macOS os: osx osx_image: xcode12.2 install: ".travis/install-macos.sh" @@ -33,24 +33,25 @@ jobs: skip_cleanup: true prerelease: true overwrite: true + edge: true name: ${TRAVIS_TAG:-edge} - body: $TRAVIS_COMMIT_MESSAGE + release_notes: $TRAVIS_COMMIT_MESSAGE file: build/bin/SolveSpace.dmg on: repo: solvespace/solvespace - stage: test - name: "Debian" + name: "Ubuntu" os: linux dist: bionic - install: .travis/install-debian.sh - script: .travis/build-debian.sh + install: .travis/install-ubuntu.sh + script: .travis/build-ubuntu.sh - stage: test - name: "Windows Visual Studio 2017 test" + name: "Windows" os: windows install: .travis/install-windows.sh script: .travis/build-windows.sh - stage: deploy - name: "Windows Visual Studio 2017 deploy" + name: "Windows" os: windows install: .travis/install-windows.sh script: .travis/build-windows.sh release @@ -64,14 +65,37 @@ jobs: token: secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= skip_cleanup: true - draft: true prerelease: true overwrite: true + edge: true name: ${TRAVIS_TAG:-edge} - body: $TRAVIS_COMMIT_MESSAGE + release_notes: $TRAVIS_COMMIT_MESSAGE file: build/bin/RelWithDebInfo/solvespace.exe on: repo: solvespace/solvespace + - stage: deploy + name: "Windows with OpenMP" + os: windows + install: .travis/install-windows.sh + script: .travis/build-windows.sh release openmp + before_deploy: + - git config --local user.name "solvespace-cd" + - git config --local user.email "no-reply@solvespace.com" + - export TRAVIS_TAG=${TRAVIS_TAG:-edge} + - git tag $TRAVIS_TAG + deploy: + provider: releases + token: + secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= + skip_cleanup: true + prerelease: true + overwrite: true + edge: true + name: ${TRAVIS_TAG:-edge} + release_notes: $TRAVIS_COMMIT_MESSAGE + file: build/bin/RelWithDebInfo/solvespace-openmp.exe + on: + repo: solvespace/solvespace - &deploy-snap stage: deploy name: Snap amd64 @@ -98,4 +122,6 @@ jobs: tags: true - <<: *deploy-snap name: Snap arm64 - arch: arm64 + arch: arm64-graviton2 + group: edge + virt: lxd diff --git a/.travis/build-debian.sh b/.travis/build-debian.sh deleted file mode 100755 index 007bf805c..000000000 --- a/.travis/build-debian.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh -xe - -if echo $TRAVIS_TAG | grep ^v; then BUILD_TYPE=RelWithDebInfo; else BUILD_TYPE=Debug; fi - -mkdir build -cd build -cmake .. \ - -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ - -DENABLE_SANITIZERS=ON -make -j$(nproc) VERBOSE=1 -make test_solvespace diff --git a/.travis/build-macos.sh b/.travis/build-macos.sh index d8868a669..48623c11b 100755 --- a/.travis/build-macos.sh +++ b/.travis/build-macos.sh @@ -11,18 +11,22 @@ export LDFLAGS="-L${LLVM_PREFIX}/lib -Wl,-rpath,${LLVM_PREFIX}/lib" \ export CFLAGS="-I${LLVM_PREFIX}/include" export CPPFLAGS="-I${LLVM_PREFIX}/include" -if [ "$1" == "release" ]; then +if [ "$1" = "release" ]; then BUILD_TYPE=RelWithDebInfo cmake \ -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_TARGET}" \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" .. \ - -DENABLE_OPENMP=ON \ - -DENABLE_LTO=ON + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ + -DENABLE_OPENMP="ON" \ + -DENABLE_LTO="ON" \ + .. else BUILD_TYPE=Debug - cmake \ + cmake \ -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_TARGET}" \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" .. + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ + -DENABLE_OPENMP="ON" \ + -DENABLE_SANITIZERS="ON" \ + .. fi cmake --build . --config "${BUILD_TYPE}" -- -j$(nproc) diff --git a/.travis/build-ubuntu.sh b/.travis/build-ubuntu.sh new file mode 100755 index 000000000..4c8f4ea48 --- /dev/null +++ b/.travis/build-ubuntu.sh @@ -0,0 +1,11 @@ +#!/bin/sh -xe + +mkdir build +cd build +cmake \ + -DCMAKE_BUILD_TYPE="Debug" \ + -DENABLE_OPENMP="ON" \ + -DENABLE_SANITIZERS="ON" \ + .. +make -j$(nproc) VERBOSE=1 +make test_solvespace diff --git a/.travis/build-windows.sh b/.travis/build-windows.sh index f66b6cd45..d237d5283 100755 --- a/.travis/build-windows.sh +++ b/.travis/build-windows.sh @@ -6,20 +6,34 @@ export PATH=$MSBUILD_PATH:$PATH mkdir build cd build -if [ "$1" == "release" ]; then +if [ "$1" = "release" ]; then + if [ "$2" = "openmp" ]; then + ENABLE_OPENMP="ON" + else + ENABLE_OPENMP="OFF" + fi BUILD_TYPE=RelWithDebInfo cmake \ - -G "Visual Studio 15 2017 Win64" \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" .. \ - -DENABLE_OPENMP=ON \ - -DENABLE_LTO=ON + -G "Visual Studio 15 2017" \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ + -DENABLE_OPENMP="${ENABLE_OPENMP}" \ + -DENABLE_LTO=ON \ + -DCMAKE_GENERATOR_PLATFORM="Win32" \ + .. else BUILD_TYPE=Debug cmake \ - -G "Visual Studio 15 2017 Win64" \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" .. + -G "Visual Studio 15 2017" \ + -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ + -DENABLE_OPENMP="ON" \ + -DCMAKE_GENERATOR_PLATFORM="Win32" \ + .. fi cmake --build . --config "${BUILD_TYPE}" -- -maxcpucount bin/$BUILD_TYPE/solvespace-testsuite.exe + +if [ "$2" = "openmp" ]; then + mv bin/$BUILD_TYPE/solvespace.exe bin/$BUILD_TYPE/solvespace-openmp.exe +fi diff --git a/.travis/install-debian.sh b/.travis/install-ubuntu.sh similarity index 100% rename from .travis/install-debian.sh rename to .travis/install-ubuntu.sh diff --git a/.travis/sign-macos.sh b/.travis/sign-macos.sh index 8399e88a4..2d50d3191 100755 --- a/.travis/sign-macos.sh +++ b/.travis/sign-macos.sh @@ -1,4 +1,4 @@ -#!/bin/sh -xe +#!/bin/bash -xe cd build diff --git a/CMakeLists.txt b/CMakeLists.txt index 9b46e0122..a141e5395 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,7 +170,11 @@ if(ENABLE_SANITIZERS) endif() string(REPLACE ";" "," SANITIZE_OPTIONS "${SANITIZE_OPTIONS}") - set(SANITIZE_FLAGS "-O1;-fsanitize=${SANITIZE_OPTIONS};-fno-sanitize-recover=address,undefined") + if (NOT APPLE) + set(SANITIZE_FLAGS "-O1;-fsanitize=${SANITIZE_OPTIONS};-fno-sanitize-recover=address,undefined") + else() + set(SANITIZE_FLAGS "-O1;-fsanitize=${SANITIZE_OPTIONS}") + endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") list(APPEND SANITIZE_FLAGS -fno-omit-frame-pointer -fno-optimize-sibling-calls) diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index e2c632a95..000000000 --- a/appveyor.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: '{build}' -clone_depth: 1 -before_build: - - git submodule update --init - - set tag=x%APPVEYOR_REPO_TAG_NAME% - - if %tag:~,2% == xv (set BUILD_TYPE=RelWithDebInfo) else (set BUILD_TYPE=Debug) - - mkdir build - - cmake -G"Visual Studio 14" -Tv140 -Bbuild -H. -build_script: - - msbuild "build\src\solvespace.vcxproj" /verbosity:minimal /property:Configuration=%BUILD_TYPE% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - - msbuild "build\src\solvespace-cli.vcxproj" /verbosity:minimal /property:Configuration=%BUILD_TYPE% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" - - msbuild "build\test\solvespace-testsuite.vcxproj" /verbosity:minimal /property:Configuration=%BUILD_TYPE% /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll" -test_script: - - build\bin\%BUILD_TYPE%\solvespace-testsuite.exe -artifacts: - - path: build\bin\%BUILD_TYPE%\solvespace.exe - name: solvespace.exe - - path: build\bin\%BUILD_TYPE%\solvespace-cli.exe - name: solvespace-cli.exe - - path: build\bin\%BUILD_TYPE%\solvespace.pdb - name: solvespace.pdb -deploy: - - provider: GitHub - auth_token: - secure: P9/pf2nM+jlWKe7pCjMp41HycBNP/+5AsmE/TETrDUoBOa/9WFHelqdVFrbRn9IC - description: "" - artifact: solvespace.exe,solvespace-cli.exe,solvespace.pdb - on: - appveyor_repo_tag: true From 02e42acd647a9d036d71d109c21fbda404abd438 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sat, 24 Oct 2020 12:11:00 +0200 Subject: [PATCH 155/646] Travis: try fixing deploy secret (sorry, has to happen on master) --- .travis.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8444246f7..e1d69df0d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,8 +28,7 @@ jobs: - git tag $TRAVIS_TAG deploy: provider: releases - token: - secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= + token: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= skip_cleanup: true prerelease: true overwrite: true @@ -62,8 +61,7 @@ jobs: - git tag $TRAVIS_TAG deploy: provider: releases - token: - secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= + token: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= skip_cleanup: true prerelease: true overwrite: true @@ -85,8 +83,7 @@ jobs: - git tag $TRAVIS_TAG deploy: provider: releases - token: - secure: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= + token: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= skip_cleanup: true prerelease: true overwrite: true From b89ac971c843eda94c6e5a081be2475185748f7f Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Sat, 24 Oct 2020 13:09:00 +0200 Subject: [PATCH 156/646] Revert "CMake: use sanitizer flags for internal targets only" This reverts commit 68b1abf77f5c8858659a51b8bdbf760effb53b66. The warnings are valuable and shouldn't be cast aside. As of 8f509f1, we special case macOS and don't set -fno-sanitize-recover to allow CI to succeed. In the future, this could be made stricter again by only suppressing known bugs, which ideally should also be fixed or reported upstream. --- CMakeLists.txt | 12 ++++++++---- exposed/CMakeLists.txt | 5 +---- src/CMakeLists.txt | 19 +++++-------------- test/CMakeLists.txt | 8 ++------ 4 files changed, 16 insertions(+), 28 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a141e5395..712c0f232 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -170,19 +170,23 @@ if(ENABLE_SANITIZERS) endif() string(REPLACE ";" "," SANITIZE_OPTIONS "${SANITIZE_OPTIONS}") + if (NOT APPLE) - set(SANITIZE_FLAGS "-O1;-fsanitize=${SANITIZE_OPTIONS};-fno-sanitize-recover=address,undefined") + set(SANITIZE_FLAGS "-O1 -fsanitize=${SANITIZE_OPTIONS} -fno-sanitize-recover=address,undefined") else() - set(SANITIZE_FLAGS "-O1;-fsanitize=${SANITIZE_OPTIONS}") + set(SANITIZE_FLAGS "-O1 -fsanitize=${SANITIZE_OPTIONS}") endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - list(APPEND SANITIZE_FLAGS -fno-omit-frame-pointer -fno-optimize-sibling-calls) + set(SANITIZE_FLAGS "${SANITIZE_FLAGS} -fno-omit-frame-pointer -fno-optimize-sibling-calls") elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU") - list(APPEND SANITIZE_FLAGS -fuse-ld=gold) + set(SANITIZE_FLAGS "${SANITIZE_FLAGS} -fuse-ld=gold") else() message(FATAL_ERROR "Sanitizers are only available when using GCC or Clang") endif() + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${SANITIZE_FLAGS}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZE_FLAGS}") endif() # common dependencies diff --git a/exposed/CMakeLists.txt b/exposed/CMakeLists.txt index a70b2c5ff..bdc3fc39c 100644 --- a/exposed/CMakeLists.txt +++ b/exposed/CMakeLists.txt @@ -1,5 +1,3 @@ -add_compile_options(${SANITIZE_FLAGS}) - include_directories( ${CMAKE_SOURCE_DIR}/include) @@ -7,5 +5,4 @@ add_executable(CDemo CDemo.c) target_link_libraries(CDemo - slvs - ${SANITIZE_FLAGS}) + slvs) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f40b2deee..fd8359f69 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -26,10 +26,6 @@ if(APPLE) ${APPKIT_LIBRARY}) endif() -# sanitizers for all code in src and below - -add_compile_options(${SANITIZE_FLAGS}) - # libslvs set(libslvs_SOURCES @@ -59,8 +55,7 @@ target_include_directories(slvs target_link_libraries(slvs ${util_LIBRARIES} - mimalloc-static - ${SANITIZE_FLAGS}) + mimalloc-static) add_dependencies(slvs mimalloc-static) @@ -230,8 +225,7 @@ target_link_libraries(solvespace-core ${PNG_LIBRARY} ${FREETYPE_LIBRARY} flatbuffers - mimalloc-static - ${SANITIZE_FLAGS}) + mimalloc-static) if(Backtrace_FOUND) target_link_libraries(solvespace-core @@ -338,8 +332,7 @@ if(ENABLE_GUI) solvespace-core ${OPENGL_LIBRARIES} ${platform_LIBRARIES} - ${COVERAGE_LIBRARY} - ${SANITIZE_FLAGS}) + ${COVERAGE_LIBRARY}) if(MSVC) set_target_properties(solvespace PROPERTIES @@ -368,8 +361,7 @@ target_include_directories(solvespace-headless target_link_libraries(solvespace-headless solvespace-core - ${CAIRO_LIBRARIES} - ${SANITIZE_FLAGS}) + ${CAIRO_LIBRARIES}) target_compile_options(solvespace-headless PRIVATE ${COVERAGE_FLAGS}) @@ -383,8 +375,7 @@ if(ENABLE_CLI) target_link_libraries(solvespace-cli solvespace-core - solvespace-headless - ${SANITIZE_FLAGS}) + solvespace-headless) add_dependencies(solvespace-cli resources) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 2382253eb..db812bfab 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,8 +11,6 @@ if(${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows") add_definitions(-DTEST_BUILD_ON_WINDOWS) endif() -add_compile_options(${SANITIZE_FLAGS}) - # test suite set(testsuite_SOURCES @@ -76,8 +74,7 @@ add_executable(solvespace-testsuite target_link_libraries(solvespace-testsuite solvespace-headless - ${COVERAGE_LIBRARY} - ${SANITIZE_FLAGS}) + ${COVERAGE_LIBRARY}) add_dependencies(solvespace-testsuite resources) @@ -135,8 +132,7 @@ add_executable(solvespace-debugtool target_link_libraries(solvespace-debugtool solvespace-core - solvespace-headless - ${SANITIZE_FLAGS}) + solvespace-headless) add_dependencies(solvespace-debugtool resources) From 1a1c9d36b77f7acafc90bd870fb1f2ef69c2cc4b Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 25 Oct 2020 17:59:52 +0100 Subject: [PATCH 157/646] Travis: remove old secrets from .travis.yml --- .travis.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index e1d69df0d..1655b7f50 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,6 @@ jobs: - git tag $TRAVIS_TAG deploy: provider: releases - token: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= skip_cleanup: true prerelease: true overwrite: true @@ -61,7 +60,6 @@ jobs: - git tag $TRAVIS_TAG deploy: provider: releases - token: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= skip_cleanup: true prerelease: true overwrite: true @@ -83,7 +81,6 @@ jobs: - git tag $TRAVIS_TAG deploy: provider: releases - token: dDlkIawHcODlW9B/20/cQCtzeoocvs0hKuNngRKXKqzXLWTRq33oq/B7+39tAixWbmv6exTpijiKrRNFiSCW5Z4iwHLwaRD4XJznxw63e/Hus/dxg2Tvqx7XFpkCz8mT1Z+gZQE5YxAngeZPpI/sZbZtF1UO3yH5eLeeokZ15p26ZskQUPoYuzrTgTzYL3XfpG3F+20rNBawH1ycsCTVD/08/n31d2m3CrKAsbW7er92ek6w4fzKr7NW8WeXjrPJETVpw5fQg1Od3pRGW8dPQaJcvKQEogMp8Mm0ETYd0qigg89/giBz7QwOgmAWQ4dH+DfZH4Ojl//127QztBolMvyDMQBykWrtJoGcij05sT6K2IJr2FHeUBO12MAEdjiVvhQj3DtTzjPiZAHHDBSLWxLKWWhlhHE4pq7g1MQhqXkaAHI2BLNzwLmaowbMT0bECf9yfz6xx18h6XPQFX44oOktraobVALFlyHqeKa8zdcUt22LF6uAL1m5dxL0tny3eXCIPE4UH/RZgua/cHV9G3cUvKQa/QnFSLRhvWVSbGB+7YsHouBJcsUOOW1gmd5442XuC7mpppccRldh+GSxUk6TBJRAx7TeQ0ybDUaoco9MUqp2twv3KreR2+8Q12PDaAhfQVNEGdF3wTm1sShImjCN4VN3eSLlBEbve1QRQXM= skip_cleanup: true prerelease: true overwrite: true From db6f7772771e469d99a38d4b19c111a2926626dc Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 25 Oct 2020 19:44:30 +0100 Subject: [PATCH 158/646] Travis: skip build if tag is edge, staple to the .dmg --- .travis.yml | 1 + .travis/sign-macos.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 1655b7f50..17e5b5692 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ dist: xenial language: c git: submodules: false +if: tag != edge stages: - test - name: deploy diff --git a/.travis/sign-macos.sh b/.travis/sign-macos.sh index 2d50d3191..df111ddb2 100755 --- a/.travis/sign-macos.sh +++ b/.travis/sign-macos.sh @@ -63,4 +63,4 @@ do done # staple -xcrun stapler staple $app \ No newline at end of file +xcrun stapler staple "${dmg}" \ No newline at end of file From 3587d5546890ca84363e8a152283501cde5ee109 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 25 Oct 2020 21:00:40 +0100 Subject: [PATCH 159/646] Travis: use force to overwrite tag --- .travis.yml | 12 +++--------- .travis/sign-macos.sh | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index 17e5b5692..e9f6680ae 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,7 +26,7 @@ jobs: - git config --local user.name "solvespace-cd" - git config --local user.email "no-reply@solvespace.com" - export TRAVIS_TAG=${TRAVIS_TAG:-edge} - - git tag $TRAVIS_TAG + - git tag --force $TRAVIS_TAG deploy: provider: releases skip_cleanup: true @@ -36,8 +36,6 @@ jobs: name: ${TRAVIS_TAG:-edge} release_notes: $TRAVIS_COMMIT_MESSAGE file: build/bin/SolveSpace.dmg - on: - repo: solvespace/solvespace - stage: test name: "Ubuntu" os: linux @@ -58,7 +56,7 @@ jobs: - git config --local user.name "solvespace-cd" - git config --local user.email "no-reply@solvespace.com" - export TRAVIS_TAG=${TRAVIS_TAG:-edge} - - git tag $TRAVIS_TAG + - git tag --force $TRAVIS_TAG deploy: provider: releases skip_cleanup: true @@ -68,8 +66,6 @@ jobs: name: ${TRAVIS_TAG:-edge} release_notes: $TRAVIS_COMMIT_MESSAGE file: build/bin/RelWithDebInfo/solvespace.exe - on: - repo: solvespace/solvespace - stage: deploy name: "Windows with OpenMP" os: windows @@ -79,7 +75,7 @@ jobs: - git config --local user.name "solvespace-cd" - git config --local user.email "no-reply@solvespace.com" - export TRAVIS_TAG=${TRAVIS_TAG:-edge} - - git tag $TRAVIS_TAG + - git tag --force $TRAVIS_TAG deploy: provider: releases skip_cleanup: true @@ -89,8 +85,6 @@ jobs: name: ${TRAVIS_TAG:-edge} release_notes: $TRAVIS_COMMIT_MESSAGE file: build/bin/RelWithDebInfo/solvespace-openmp.exe - on: - repo: solvespace/solvespace - &deploy-snap stage: deploy name: Snap amd64 diff --git a/.travis/sign-macos.sh b/.travis/sign-macos.sh index df111ddb2..3c0477114 100755 --- a/.travis/sign-macos.sh +++ b/.travis/sign-macos.sh @@ -46,7 +46,7 @@ for (( ; ; )) do echo "Checking progress..." progress=$(xcrun altool --notarization-info "${notarize_uuid}" -u "${MACOS_APPSTORE_USERNAME}" -p "${MACOS_APPSTORE_APP_PASSWORD}" 2>&1) - echo "${progress}" + # echo "${progress}" if [ $? -ne 0 ] || [[ "${progress}" =~ "Invalid" ]] ; then echo "Error with notarization. Exiting" From 106764c8d7bc0ad0861fc06308d23f58e409fdd1 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 25 Oct 2020 23:53:42 +0200 Subject: [PATCH 160/646] Performance: inline the Bernstein functions This is another small profiling driven optimization. Moving the initialization of `const double *c` as part of the definition also helps with the generated assembler. --- src/srf/ratpoly.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/srf/ratpoly.cpp b/src/srf/ratpoly.cpp index 05ccd038e..46180a55e 100644 --- a/src/srf/ratpoly.cpp +++ b/src/srf/ratpoly.cpp @@ -13,8 +13,7 @@ // and convergence should be fast by now. #define RATPOLY_EPS (LENGTH_EPS/(1e2)) -static double Bernstein(int k, int deg, double t) -{ +static inline double Bernstein(int k, int deg, double t) { // indexed by [degree][k][exponent] static const double bernstein_coeff[4][4][4] = { { { 1.0,0.0,0.0,0.0 }, { 1.0,0.0,0.0,0.0 }, { 1.0,0.0,0.0,0.0 }, { 1.0,0.0,0.0,0.0 } }, @@ -22,21 +21,18 @@ static double Bernstein(int k, int deg, double t) { { 1.0,-2.0,1.0,0.0 }, { 0.0,2.0,-2.0,0.0 },{ 0.0,0.0,1.0,0.0 }, { 0.0,0.0,0.0,0.0 } }, { { 1.0,-3.0,3.0,-1.0 },{ 0.0,3.0,-6.0,3.0 },{ 0.0,0.0,3.0,-3.0}, { 0.0,0.0,0.0,1.0 } } }; - const double *c; - c = bernstein_coeff[deg][k]; + const double *c = bernstein_coeff[deg][k]; return (((c[3]*t+c[2])*t)+c[1])*t+c[0]; } -static double BernsteinDerivative(int k, int deg, double t) -{ +static inline double BernsteinDerivative(int k, int deg, double t) { static const double bernstein_derivative_coeff[4][4][3] = { { { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 } }, { { -1.0,0.0,0.0 }, { 1.0,0.0,0.0 }, { 0.0,0.0,0.0 }, { 0.0,0.0,0.0 } }, { { -2.0,2.0,0.0 }, { 2.0,-4.0,0.0 },{ 0.0,2.0,0.0 }, { 0.0,0.0,0.0 } }, { { -3.0,6.0,-3.0 },{ 3.0,-12.0,9.0 },{ 0.0,6.0,-9.0}, { 0.0,0.0,3.0 } } }; - const double *c; - c = bernstein_derivative_coeff[deg][k]; + const double *c = bernstein_derivative_coeff[deg][k]; return ((c[2]*t)+c[1])*t+c[0]; } From f3c8a26515b7110432330a10ca02dce14fa624b6 Mon Sep 17 00:00:00 2001 From: ruevs Date: Mon, 26 Oct 2020 00:12:29 +0200 Subject: [PATCH 161/646] Update the year in the About dialog --- src/solvespace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index d68cedf2d..7c30a8f52 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -965,7 +965,7 @@ 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, 2019); +PACKAGE_VERSION, 2020); break; default: ssassert(false, "Unexpected menu ID"); From 8112f4d59f639aadcbd49bf2731eac08314fa931 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 26 Oct 2020 02:25:42 +0100 Subject: [PATCH 162/646] Travis: include libomp in macOS .app --- .travis/build-macos.sh | 6 ------ .travis/install-macos.sh | 2 +- CMakeLists.txt | 22 +++------------------- src/CMakeLists.txt | 7 ++++++- 4 files changed, 10 insertions(+), 27 deletions(-) diff --git a/.travis/build-macos.sh b/.travis/build-macos.sh index 48623c11b..bb4c1e0ce 100755 --- a/.travis/build-macos.sh +++ b/.travis/build-macos.sh @@ -4,12 +4,6 @@ mkdir build || true cd build OSX_TARGET="10.9" -LLVM_PREFIX=$(brew --prefix llvm@9) -export CC="${LLVM_PREFIX}/bin/clang" -export CXX="${CC}++" -export LDFLAGS="-L${LLVM_PREFIX}/lib -Wl,-rpath,${LLVM_PREFIX}/lib" \ -export CFLAGS="-I${LLVM_PREFIX}/include" -export CPPFLAGS="-I${LLVM_PREFIX}/include" if [ "$1" = "release" ]; then BUILD_TYPE=RelWithDebInfo diff --git a/.travis/install-macos.sh b/.travis/install-macos.sh index d4817455a..457dd5d4b 100755 --- a/.travis/install-macos.sh +++ b/.travis/install-macos.sh @@ -1,4 +1,4 @@ #!/bin/sh -xe -brew install llvm@9 +brew install libomp git submodule update --init \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 712c0f232..ad23d9839 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,27 +115,11 @@ if(ENABLE_LTO) endif() if(ENABLE_OPENMP) - if(APPLE) - # OpenMP does not work with the default Apple llvm/clang++ - # Install a more recent version using Homebrew (version 11.0.0 which is the next available tag on homebrew at this time crashed): - # "brew install llvm@9" - # and set the right compiler flags using: - # LLVM_PREFIX=$(brew --prefix llvm@9) - # export CC="${LLVM_PREFIX}/bin/clang" - # export CXX="${CC}++" - # export LDFLAGS="-L${LLVM_PREFIX}/lib -Wl,-rpath,${LLVM_PREFIX}/lib" \ - # export CFLAGS="-I${LLVM_PREFIX}/include" - # export CPPFLAGS="-I${LLVM_PREFIX}/include" - set(OpenMP_CXX_FLAGS "-fopenmp=libomp") + find_package( OpenMP REQUIRED ) + include(FindOpenMP) + if(OPENMP_FOUND) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") message(STATUS "found OpenMP, compiling with flags: " ${OpenMP_CXX_FLAGS} ) - else() - find_package( OpenMP REQUIRED ) - include(FindOpenMP) - if(OPENMP_FOUND) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") - message(STATUS "found OpenMP, compiling with flags: " ${OpenMP_CXX_FLAGS} ) - endif() endif() endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fd8359f69..1a46e246c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -404,10 +404,15 @@ endif() if(APPLE) set(bundle SolveSpace) set(bundle_bin ${EXECUTABLE_OUTPUT_PATH}/${bundle}.app/Contents/MacOS) - + set(bundle_resources ${EXECUTABLE_OUTPUT_PATH}/${bundle}.app/Contents/Resources/lib) + execute_process( + COMMAND mkdir -p ${bundle_resources} + COMMAND cp -p /usr/local/opt/libomp/lib/libomp.dylib ${bundle_resources}/libomp.dylib + ) add_custom_command(TARGET solvespace POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory ${bundle_bin} COMMAND ${CMAKE_COMMAND} -E copy $ ${bundle_bin} + COMMAND install_name_tool -change /usr/local/opt/libomp/lib/libomp.dylib "@executable_path/../Resources/lib/libomp.dylib" ${bundle_bin}/${bundle} COMMENT "Bundling executable solvespace-cli" VERBATIM) endif() From 8da202e82d0ad38c8ef5f6ac08add838df30d560 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 26 Oct 2020 03:38:32 +0100 Subject: [PATCH 163/646] Travis: sign libomp.dylib --- .travis/sign-macos.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.travis/sign-macos.sh b/.travis/sign-macos.sh index 3c0477114..c23dab998 100755 --- a/.travis/sign-macos.sh +++ b/.travis/sign-macos.sh @@ -2,6 +2,7 @@ cd build +openmp="bin/SolveSpace.app/Contents/Resources/lib/libomp.dylib" app="bin/SolveSpace.app" dmg="bin/SolveSpace.dmg" bundle_id="com.solvespace.solvespace" @@ -24,6 +25,9 @@ if [ "$CI" = "true" ]; then security find-identity -v fi +# sign openmp +codesign -s "${MACOS_DEVELOPER_ID}" --timestamp --options runtime -f --deep "${openmp}" + # sign the .app codesign -s "${MACOS_DEVELOPER_ID}" --timestamp --options runtime -f --deep "${app}" From c1a36fe750068918a8044f78dc4f1206d3baac7c Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 28 Oct 2020 00:21:23 +0200 Subject: [PATCH 164/646] UI: Fix the Property Browser window scrollbar - Scrolling with the scrollbar now works properly. - Do not scroll with the mouse wheel while an edit field is active in the property browser. Fixes: https://github.com/solvespace/solvespace/issues/782 --- src/textwin.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/textwin.cpp b/src/textwin.cpp index 131e12e98..900a8242c 100644 --- a/src/textwin.cpp +++ b/src/textwin.cpp @@ -252,8 +252,8 @@ void TextWindow::Init() { MouseLeave(); return true; } else if(event.type == MouseEvent::Type::SCROLL_VERT) { - window->SetScrollbarPosition(window->GetScrollbarPosition() - - LINE_HEIGHT / 2 * event.scrollDelta); + ScrollbarEvent(window->GetScrollbarPosition() - + LINE_HEIGHT / 2 * event.scrollDelta); } return false; }; @@ -1130,7 +1130,7 @@ void TextWindow::MouseLeave() { void TextWindow::ScrollbarEvent(double newPos) { if(window->IsEditorVisible()) { - window->SetScrollbarPosition(scrollPos); + // An edit field is active. Do not move the scrollbar. return; } @@ -1140,6 +1140,7 @@ void TextWindow::ScrollbarEvent(double newPos) { if(newPos != scrollPos) { scrollPos = (int)newPos; + window->SetScrollbarPosition(scrollPos); window->Invalidate(); } } From dd0b027b103b53296a65d92efd0ebb3dfa599a4a Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 27 Oct 2020 19:29:24 -0400 Subject: [PATCH 165/646] Increase MAX_UNDO to 100 --- src/solvespace.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solvespace.h b/src/solvespace.h index d0fde5f57..e8eeddc98 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -530,7 +530,7 @@ class SolveSpaceUI { style.Clear(); } } UndoState; - enum { MAX_UNDO = 16 }; + enum { MAX_UNDO = 100 }; typedef struct { UndoState d[MAX_UNDO]; int cnt; From 9fd946206df37263fa780c08d5986ee2b8658f74 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 27 Oct 2020 19:37:30 -0400 Subject: [PATCH 166/646] use VERY_NEGATIVE and VERY_POSITIVE instead of numeric values which is some cases were 1e-10 instead of -1e10 --- src/srf/surface.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp index 3e97bb21d..815aedad2 100644 --- a/src/srf/surface.cpp +++ b/src/srf/surface.cpp @@ -507,9 +507,9 @@ void SShell::MakeFromExtrusionOf(SBezierLoopSet *sbls, Vector t0, Vector t1, Rgb Vector n = sbls->normal.ScaledBy(-1); Vector u = n.Normal(0), v = n.Normal(1); Vector orig = sbls->point; - double umax = 1e-10, umin = 1e10; + double umax = VERY_NEGATIVE, umin = VERY_POSITIVE; sbls->GetBoundingProjd(u, orig, &umin, &umax); - double vmax = 1e-10, vmin = 1e10; + double vmax = VERY_NEGATIVE, vmin = VERY_POSITIVE; sbls->GetBoundingProjd(v, orig, &vmin, &vmax); // and now fix things up so that all u and v lie between 0 and 1 orig = orig.Plus(u.ScaledBy(umin)); @@ -663,9 +663,9 @@ void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector Vector n = sbls->normal.ScaledBy(-1); Vector u = n.Normal(0), v = n.Normal(1); Vector orig = sbls->point; - double umax = 1e-10, umin = 1e10; + double umax = VERY_NEGATIVE, umin = VERY_POSITIVE; sbls->GetBoundingProjd(u, orig, &umin, &umax); - double vmax = 1e-10, vmin = 1e10; + double vmax = VERY_NEGATIVE, vmin = VERY_POSITIVE; sbls->GetBoundingProjd(v, orig, &vmin, &vmax); // and now fix things up so that all u and v lie between 0 and 1 orig = orig.Plus(u.ScaledBy(umin)); From 91ce3de783aac9a5cfcf97adad4d566d6b031962 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 28 Oct 2020 14:17:48 -0400 Subject: [PATCH 167/646] Don't do numeric surface intersections if an exact curve has been copied. We don't want 2 overlapping but different sets of PWLs. --- src/srf/surfinter.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/srf/surfinter.cpp b/src/srf/surfinter.cpp index 1e4fb3967..0a827761b 100644 --- a/src/srf/surfinter.cpp +++ b/src/srf/surfinter.cpp @@ -331,6 +331,7 @@ void SSurface::IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB, sext = this; shext = agnstA; } + bool foundExact = false; SCurve *sc; for(sc = shext->curve.First(); sc; sc = shext->curve.NextAfter(sc)) { if(sc->source == SCurve::Source::INTERSECTION) continue; @@ -341,8 +342,14 @@ void SSurface::IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB, if(splane->ContainsPlaneCurve(sc)) { SBezier bezier = sc->exact; AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into); + foundExact = true; } } + // if we found at lest one of these we don't want to do the numerical + // intersection as well. Sometimes it will also find the same curve but + // with different PWLs and the polygon will fail to assemble. + if(foundExact) + return; } // Try intersecting the surfaces numerically, by a marching algorithm. From 33a6fcfd5596bfd5822b7197af860ef376d5f70a Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Wed, 28 Oct 2020 18:26:19 +0100 Subject: [PATCH 168/646] README: Add Travis & Snap Store badges --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 295f25fea..b8ffbb6a9 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ SolveSpace ========== +[![Build Status](https://travis-ci.com/solvespace/solvespace.svg?branch=master)](https://travis-ci.com/solvespace/solvespace) +[![solvespace](https://snapcraft.io/solvespace/badge.svg)](https://snapcraft.io/solvespace) +[![solvespace](https://snapcraft.io/solvespace/trending.svg?name=0)](https://snapcraft.io/solvespace) This repository contains the source code of [SolveSpace][], a parametric 2d/3d CAD. From 5658c70eaf4a3a7a4cf48ce577e316067f6a182b Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Wed, 28 Oct 2020 19:51:46 +0100 Subject: [PATCH 169/646] add logo in heading --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index b8ffbb6a9..a7f82bc59 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +SolveSpace Logo + SolveSpace ========== [![Build Status](https://travis-ci.com/solvespace/solvespace.svg?branch=master)](https://travis-ci.com/solvespace/solvespace) From 489e77c1b50227efc030be3c28d3b713b20ba97d Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Wed, 28 Oct 2020 19:53:18 +0100 Subject: [PATCH 170/646] adjust logo size --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a7f82bc59..44e14f20a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -SolveSpace Logo +SolveSpace Logo SolveSpace ========== From bed54e409e059e4d7116f2048327804ca109d04c Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 30 Oct 2020 13:21:26 -0400 Subject: [PATCH 171/646] Use zOrder for selections within the same group --- src/draw.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/draw.cpp b/src/draw.cpp index 1dabd75bb..5370d1ed8 100644 --- a/src/draw.cpp +++ b/src/draw.cpp @@ -352,7 +352,7 @@ GraphicsWindow::Selection GraphicsWindow::ChooseFromHoverToSelect() { Group *g = SK.GetGroup(hg); if(g->order > activeGroup->order) continue; - if(bestOrder != -1 && (bestOrder >= g->order || bestZIndex > hov.zIndex)) continue; + if(bestOrder != -1 && (bestOrder > g->order || bestZIndex > hov.zIndex)) continue; bestOrder = g->order; bestZIndex = hov.zIndex; sel = hov.selection; @@ -382,7 +382,7 @@ GraphicsWindow::Selection GraphicsWindow::ChooseFromHoverToDrag() { Group *g = SK.GetGroup(hg); if(g->order > activeGroup->order) continue; - if(bestOrder != -1 && (bestOrder >= g->order || bestZIndex > hov.zIndex)) continue; + if(bestOrder != -1 && (bestOrder > g->order || bestZIndex > hov.zIndex)) continue; bestOrder = g->order; bestZIndex = hov.zIndex; sel = hov.selection; From 0c35b40f1f2f291e535559a364608d7fcf66b175 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 2 Nov 2020 23:10:16 +0100 Subject: [PATCH 172/646] Travis: add clean edge script --- .travis.yml | 7 +++++++ .travis/remove-edge.sh | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100755 .travis/remove-edge.sh diff --git a/.travis.yml b/.travis.yml index e9f6680ae..4d796af78 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,10 +6,17 @@ git: if: tag != edge stages: - test + - name: clean + if: (NOT type IN (pull_request)) AND (branch = master) - name: deploy if: (NOT type IN (pull_request)) AND (branch = master) jobs: include: + - stage: clean + name: Remove Github Release + os: linux + dist: bionic + script: .travis/remove-edge.sh - stage: test name: macOS os: osx diff --git a/.travis/remove-edge.sh b/.travis/remove-edge.sh new file mode 100755 index 000000000..4321ff586 --- /dev/null +++ b/.travis/remove-edge.sh @@ -0,0 +1,23 @@ +#!/bin/sh -xe + +sudo apt-get update -qq +sudo apt-get -y install jq + +old_release=$(curl \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/solvespace/solvespace/releases/tags/edge \ + | jq -r ".url") + +if [ -z "$old_release" ]; then + curl \ + -X DELETE \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: token $GITHUB_TOKEN" \ + "$old_release" +fi + +curl \ + -X DELETE \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: token $GITHUB_TOKEN" \ + https://api.github.com/repos/solvespace/solvespace/git/refs/tags/edge From 17338db529ea6c09e1fa4b9d5db87661ee7bf4f0 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 6 Nov 2020 19:12:52 -0500 Subject: [PATCH 173/646] Add end marker to text window and increase max rows. --- src/textwin.cpp | 11 +++++++++++ src/ui.h | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/textwin.cpp b/src/textwin.cpp index 900a8242c..e243825cf 100644 --- a/src/textwin.cpp +++ b/src/textwin.cpp @@ -338,11 +338,22 @@ void TextWindow::ClearScreen() { rows = 0; } +// This message was addded when someone had too many fonts for the text window +// Scrolling seemed to be broken, but was actaully at the MAX_ROWS. +static const char* endString = " **** End of Text Screen ****"; + void TextWindow::Printf(bool halfLine, const char *fmt, ...) { if(!canvas) return; if(rows >= MAX_ROWS) return; + if(rows >= MAX_ROWS-2 && (fmt != endString)) { + // twice due to some half-row issues on resizing + Printf(halfLine, endString); + Printf(halfLine, endString); + return; + } + va_list vl; va_start(vl, fmt); diff --git a/src/ui.h b/src/ui.h index b44d566b6..a7984102f 100644 --- a/src/ui.h +++ b/src/ui.h @@ -179,7 +179,7 @@ class TextWindow { enum { MAX_COLS = 100, MIN_COLS = 45, - MAX_ROWS = 2000 + MAX_ROWS = 4000 }; typedef struct { From 9f0604eb7669da7f9f61f00b06b9cf74c8802860 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sat, 7 Nov 2020 21:54:47 +0100 Subject: [PATCH 174/646] Update README.md (by @nii236) --- README.md | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 44e14f20a..394e33dc8 100644 --- a/README.md +++ b/README.md @@ -104,8 +104,9 @@ by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation. ### Building for Windows -You will need the usual build tools, CMake, a Windows cross-compiler, and flatc. -On a Debian derivative (e.g. Ubuntu) these can be installed with: +Ubuntu will require 20.04 or above. Cross-compiling with WSL is also confirmed to work. + +You will need the usual build tools, CMake, a Windows cross-compiler, and flatc. On a Debian derivative (e.g. Ubuntu) these can be installed with: apt-get install git build-essential cmake mingw-w64 libflatbuffers-dev @@ -115,16 +116,7 @@ Before building, check out the project and the necessary submodules: cd solvespace git submodule update --init -After that, build 32-bit SolveSpace as following: - - mkdir build - cd build - cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw32.cmake \ - -DCMAKE_BUILD_TYPE=Release \ - -DFLATC=$(which flatc) - make - -Or, build 64-bit SolveSpace as following: +Build 64-bit SolveSpace with the following: mkdir build cd build From 1588d3a13c451ee14fd3a9f364031cc8c2141b2a Mon Sep 17 00:00:00 2001 From: Jason Lenz Date: Thu, 12 Nov 2020 14:11:28 -0600 Subject: [PATCH 175/646] Use recent flatbuffers commit to solve compiling issue on OpenBSD --- extlib/flatbuffers | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/flatbuffers b/extlib/flatbuffers index f73d205bc..de1f0342c 160000 --- a/extlib/flatbuffers +++ b/extlib/flatbuffers @@ -1 +1 @@ -Subproject commit f73d205bc7536991e620d3027a711e713a789967 +Subproject commit de1f0342c86fc00955f6047937fac05e56b9b54c From 3cd0590247cbbef7b523e432c745888a1ab10f2b Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 16 Nov 2020 20:40:27 -0500 Subject: [PATCH 176/646] Add z distance checking to entity picking. Fixes issue 521 --- src/draw.cpp | 10 ++++++++++ src/render/render.cpp | 17 +++++++++++------ src/render/render.h | 3 ++- src/ui.h | 1 + 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/src/draw.cpp b/src/draw.cpp index 5370d1ed8..0a21c1985 100644 --- a/src/draw.cpp +++ b/src/draw.cpp @@ -342,6 +342,8 @@ GraphicsWindow::Selection GraphicsWindow::ChooseFromHoverToSelect() { Group *activeGroup = SK.GetGroup(SS.GW.activeGroup); int bestOrder = -1; int bestZIndex = 0; + double bestDepth = VERY_POSITIVE; + for(const Hover &hov : hoverList) { hGroup hg = {}; if(hov.selection.entity.v != 0) { @@ -353,8 +355,11 @@ GraphicsWindow::Selection GraphicsWindow::ChooseFromHoverToSelect() { Group *g = SK.GetGroup(hg); if(g->order > activeGroup->order) continue; if(bestOrder != -1 && (bestOrder > g->order || bestZIndex > hov.zIndex)) continue; + // we have hov.zIndex is >= best and hov.group is >= best (but not > active group) + if(hov.depth > bestDepth && bestOrder == g->order && bestZIndex == hov.zIndex) continue; bestOrder = g->order; bestZIndex = hov.zIndex; + bestDepth = hov.depth; sel = hov.selection; } return sel; @@ -370,6 +375,8 @@ GraphicsWindow::Selection GraphicsWindow::ChooseFromHoverToDrag() { Group *activeGroup = SK.GetGroup(SS.GW.activeGroup); int bestOrder = -1; int bestZIndex = 0; + double bestDepth = VERY_POSITIVE; + for(const Hover &hov : hoverList) { hGroup hg = {}; if(hov.selection.entity.v != 0) { @@ -383,6 +390,8 @@ GraphicsWindow::Selection GraphicsWindow::ChooseFromHoverToDrag() { Group *g = SK.GetGroup(hg); if(g->order > activeGroup->order) continue; if(bestOrder != -1 && (bestOrder > g->order || bestZIndex > hov.zIndex)) continue; + // we have hov.zIndex is >= best and hov.group is >= best (but not > active group) + if(hov.depth > bestDepth && bestOrder == g->order && bestZIndex == hov.zIndex) continue; bestOrder = g->order; bestZIndex = hov.zIndex; sel = hov.selection; @@ -439,6 +448,7 @@ void GraphicsWindow::HitTestMakeSelection(Point2d mp) { Hover hov = {}; hov.distance = canvas.minDistance; hov.zIndex = canvas.maxZIndex; + hov.depth = canvas.minDepth; hov.selection.entity = e.h; hoverList.Add(&hov); } diff --git a/src/render/render.cpp b/src/render/render.cpp index ca2a26eb9..89434c2d3 100644 --- a/src/render/render.cpp +++ b/src/render/render.cpp @@ -343,9 +343,10 @@ void UiCanvas::DrawBitmapText(const std::string &str, int x, int y, RgbaColor co // A canvas that performs picking against drawn geometry. //----------------------------------------------------------------------------- -void ObjectPicker::DoCompare(double distance, int zIndex, int comparePosition) { +void ObjectPicker::DoCompare(double depth, double distance, int zIndex, int comparePosition) { if(distance > selRadius) return; if((zIndex == maxZIndex && distance < minDistance) || (zIndex > maxZIndex)) { + minDepth = depth; minDistance = distance; maxZIndex = zIndex; position = comparePosition; @@ -372,10 +373,10 @@ void ObjectPicker::DoQuad(const Vector &a, const Vector &b, const Vector &c, con bool insideQuad = (minNegative == VERY_NEGATIVE || maxPositive == VERY_POSITIVE); if(insideQuad) { - DoCompare(0.0, zIndex, comparePosition); + DoCompare(0, 0.0, zIndex, comparePosition); } else { double distance = std::min(fabs(minNegative), fabs(maxPositive)); - DoCompare(distance, zIndex, comparePosition); + DoCompare(0, distance, zIndex, comparePosition); } } @@ -384,7 +385,8 @@ void ObjectPicker::DrawLine(const Vector &a, const Vector &b, hStroke hcs) { Point2d ap = camera.ProjectPoint(a); Point2d bp = camera.ProjectPoint(b); double distance = point.DistanceToLine(ap, bp.Minus(ap), /*asSegment=*/true); - DoCompare(distance - stroke->width / 2.0, stroke->zIndex); + double depth = 0.5 * (camera.ProjectPoint3(a).z + camera.ProjectPoint3(b).z) ; + DoCompare(depth, distance - stroke->width / 2.0, stroke->zIndex); } void ObjectPicker::DrawEdges(const SEdgeList &el, hStroke hcs) { @@ -393,7 +395,8 @@ void ObjectPicker::DrawEdges(const SEdgeList &el, hStroke hcs) { Point2d ap = camera.ProjectPoint(e.a); Point2d bp = camera.ProjectPoint(e.b); double distance = point.DistanceToLine(ap, bp.Minus(ap), /*asSegment=*/true); - DoCompare(distance - stroke->width / 2.0, stroke->zIndex, e.auxB); + double depth = 0.5 * (camera.ProjectPoint3(e.a).z + camera.ProjectPoint3(e.b).z) ; + DoCompare(depth, distance - stroke->width / 2.0, stroke->zIndex, e.auxB); } } @@ -423,7 +426,8 @@ void ObjectPicker::DrawQuad(const Vector &a, const Vector &b, const Vector &c, c void ObjectPicker::DrawPoint(const Vector &o, Canvas::hStroke hcs) { Stroke *stroke = strokes.FindById(hcs); double distance = point.DistanceTo(camera.ProjectPoint(o)) - stroke->width / 2; - DoCompare(distance, stroke->zIndex); + double depth = camera.ProjectPoint3(o).z; + DoCompare(depth, distance, stroke->zIndex); } void ObjectPicker::DrawPolygon(const SPolygon &p, hFill hcf) { @@ -445,6 +449,7 @@ void ObjectPicker::DrawPixmap(std::shared_ptr pm, } bool ObjectPicker::Pick(const std::function &drawFn) { + minDepth = VERY_POSITIVE; minDistance = VERY_POSITIVE; maxZIndex = INT_MIN; diff --git a/src/render/render.h b/src/render/render.h index b1692f139..9601a5e7d 100644 --- a/src/render/render.h +++ b/src/render/render.h @@ -232,6 +232,7 @@ class ObjectPicker : public Canvas { double selRadius = 0.0; // Picking state. double minDistance = 0.0; + double minDepth = 1e10; int maxZIndex = 0; uint32_t position = 0; @@ -257,7 +258,7 @@ class ObjectPicker : public Canvas { const Point2d &ta, const Point2d &tb, hFill hcf) override; void InvalidatePixmap(std::shared_ptr pm) override {} - void DoCompare(double distance, int zIndex, int comparePosition = 0); + void DoCompare(double depth, double distance, int zIndex, int comparePosition = 0); void DoQuad(const Vector &a, const Vector &b, const Vector &c, const Vector &d, int zIndex, int comparePosition = 0); diff --git a/src/ui.h b/src/ui.h index a7984102f..8bdd701c6 100644 --- a/src/ui.h +++ b/src/ui.h @@ -727,6 +727,7 @@ class GraphicsWindow { public: int zIndex; double distance; + double depth; Selection selection; }; From 06fa108dd58cba6f9916ed85684ba672a29030fc Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 17 Nov 2020 21:17:24 -0500 Subject: [PATCH 177/646] ran make translate_solvespace. cleaned out some obsolete strings in en_US.po --- res/locales/de_DE.po | 94 +++++++-------- res/locales/en_US.po | 266 +++++++------------------------------------ res/locales/fr_FR.po | 85 +++++++------- res/locales/ru_RU.po | 85 +++++++------- res/locales/uk_UA.po | 77 ++++++------- res/locales/zh_CN.po | 67 ++++++----- res/messages.pot | 67 ++++++----- 7 files changed, 283 insertions(+), 458 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index fb4f19b41..bf858b1fa 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-09-21 09:28+0200\n" +"POT-Creation-Date: 2020-11-17 20:50-0500\n" "PO-Revision-Date: 2018-07-19 06:55+0000\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" @@ -597,8 +597,7 @@ msgstr "Zickzacklinien wurden mit durchgehenden Linien ersetzt" #: exportvector.cpp:593 msgid "" -"Some aspects of the drawing have no DXF equivalent and " -"were not exported:\n" +"Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Teile der Zeichnung haben keine Entsprechung in DXF und wurden nicht " "exportiert:\n" @@ -628,18 +627,18 @@ msgstr "" "Nicht erkannte Daten in der Datei. Diese Datei könnte beschädigt sein oder " "von einer neueren Version des Programms stammen." -#: file.cpp:849 +#: file.cpp:859 msgctxt "title" msgid "Missing File" msgstr "Fehlende Datei" -#: file.cpp:850 +#: file.cpp:860 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "Die verlinkte Datei “%s” fehlt." -#: file.cpp:852 +#: file.cpp:862 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -648,20 +647,20 @@ msgid "" "permanently removed." msgstr "" "Möchten Sie sie selber auswählen?\n" -"Falls Sie ablehnen, wird jegliche mit der fehlenden Datei " -"verknüpfte Geometrie verworfen." +"Falls Sie ablehnen, wird jegliche mit der fehlenden Datei verknüpfte " +"Geometrie verworfen." -#: file.cpp:855 +#: file.cpp:865 msgctxt "button" msgid "&Yes" msgstr "&Ja" -#: file.cpp:857 +#: file.cpp:867 msgctxt "button" msgid "&No" msgstr "&Nein" -#: file.cpp:859 +#: file.cpp:869 msgctxt "button" msgid "&Cancel" msgstr "&Abbrechen" @@ -1371,19 +1370,19 @@ msgstr "Versetzen" msgid "(unnamed)" msgstr "unbenannt" -#: groupmesh.cpp:689 +#: groupmesh.cpp:708 msgid "not closed contour, or not all same style!" msgstr "Kontur nicht geschlossen, oder kein einheitlicher Linientyp!" -#: groupmesh.cpp:702 +#: groupmesh.cpp:721 msgid "points not all coplanar!" msgstr "Punkte sind nicht alle koplanar!" -#: groupmesh.cpp:704 +#: groupmesh.cpp:723 msgid "contour is self-intersecting!" msgstr "Kontur überschneidet sich selbst!" -#: groupmesh.cpp:706 +#: groupmesh.cpp:725 msgid "zero-length edge!" msgstr "Kante mit Länge Null!" @@ -1593,102 +1592,107 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEUER KOMMENTAR -- DOPPELKLICKEN ZUM BEARBEITEN" -#: platform/gui.cpp:85 +#: platform/gui.cpp:85 platform/gui.cpp:89 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace-Modelle" -#: platform/gui.cpp:89 +#: platform/gui.cpp:90 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "" + +#: platform/gui.cpp:94 msgctxt "file-type" msgid "PNG image" msgstr "PNG-Datei" -#: platform/gui.cpp:93 +#: platform/gui.cpp:98 msgctxt "file-type" msgid "STL mesh" msgstr "STL-Netz" -#: platform/gui.cpp:94 +#: platform/gui.cpp:99 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ-Netz" -#: platform/gui.cpp:95 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-kompatibles Netz, mit Ansicht" -#: platform/gui.cpp:96 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-kompatibles Netz, nur Netz" -#: platform/gui.cpp:97 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Q3D Object file" msgstr "Q3D Objektdatei" -#: platform/gui.cpp:98 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "VRML text file" msgstr "VRML Textdatei" -#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "STEP file" msgstr "STEP-Datei" -#: platform/gui.cpp:106 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "PDF file" msgstr "PDF-Datei" -#: platform/gui.cpp:107 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Eingebettetes Postscript" -#: platform/gui.cpp:108 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "Skalierbare Vektorgrafik" -#: platform/gui.cpp:110 platform/gui.cpp:117 +#: platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF-Datei (AutoCAD 2007)" -#: platform/gui.cpp:111 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL-Datei" -#: platform/gui.cpp:112 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "G Code" msgstr "G-Code" -#: platform/gui.cpp:121 +#: platform/gui.cpp:126 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF- und DWG-Dateien" -#: platform/gui.cpp:125 +#: platform/gui.cpp:130 msgctxt "file-type" msgid "Comma-separated values" msgstr "Werte durch Komma getrennt (CSV)" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 msgid "untitled" msgstr "unbenannt" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 #: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "Datei speichern" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 #: platform/guiwin.cpp:1557 msgctxt "title" msgid "Open File" @@ -1709,16 +1713,6 @@ msgctxt "button" msgid "_Open" msgstr "" -# solvespace.cpp:557 -msgctxt "title" -msgid "(new sketch)" -msgstr "(Neue Skizze)" - -#: solvespace.cpp:564 -msgctxt "title" -msgid "Property Browser" -msgstr "Attribut-Browser" - #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " @@ -1904,6 +1898,15 @@ msgstr "Der Maßstab kann nicht Null oder negativ sein." msgid "Bad format: specify x, y, z" msgstr "Ungültiges Format: geben Sie x, y, z ein" +# solvespace.cpp:557 +#~ msgctxt "title" +#~ msgid "(new sketch)" +#~ msgstr "(Neue Skizze)" + +#~ msgctxt "title" +#~ msgid "Property Browser" +#~ msgstr "Attribut-Browser" + #~ msgid "Specify between 0 and 8 digits after the decimal." #~ msgstr "Geben Sie 0 bis 8 Ziffern nach dem Dezimalzeichen an." @@ -2016,4 +2019,3 @@ msgstr "Ungültiges Format: geben Sie x, y, z ein" #~ msgctxt "button" #~ msgid "_No" #~ msgstr "_Nein" - diff --git a/res/locales/en_US.po b/res/locales/en_US.po index 45b609950..485950f47 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-09-21 09:28+0200\n" +"POT-Creation-Date: 2020-11-17 20:50-0500\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -607,18 +607,18 @@ msgstr "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." -#: file.cpp:849 +#: file.cpp:859 msgctxt "title" msgid "Missing File" msgstr "Missing File" -#: file.cpp:850 +#: file.cpp:860 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "The linked file “%s” is not present." -#: file.cpp:852 +#: file.cpp:862 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -631,17 +631,17 @@ msgstr "" "If you decline, any geometry that depends on the missing file will be " "permanently removed." -#: file.cpp:855 +#: file.cpp:865 msgctxt "button" msgid "&Yes" msgstr "&Yes" -#: file.cpp:857 +#: file.cpp:867 msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:859 +#: file.cpp:869 msgctxt "button" msgid "&Cancel" msgstr "&Cancel" @@ -1350,19 +1350,19 @@ msgstr "translate" msgid "(unnamed)" msgstr "(unnamed)" -#: groupmesh.cpp:689 +#: groupmesh.cpp:708 msgid "not closed contour, or not all same style!" msgstr "not closed contour, or not all same style!" -#: groupmesh.cpp:702 +#: groupmesh.cpp:721 msgid "points not all coplanar!" msgstr "points not all coplanar!" -#: groupmesh.cpp:704 +#: groupmesh.cpp:723 msgid "contour is self-intersecting!" msgstr "contour is self-intersecting!" -#: groupmesh.cpp:706 +#: groupmesh.cpp:725 msgid "zero-length edge!" msgstr "zero-length edge!" @@ -1564,102 +1564,107 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -#: platform/gui.cpp:85 +#: platform/gui.cpp:85 platform/gui.cpp:89 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace models" -#: platform/gui.cpp:89 +#: platform/gui.cpp:90 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "IDF circuit board" + +#: platform/gui.cpp:94 msgctxt "file-type" msgid "PNG image" msgstr "PNG image" -#: platform/gui.cpp:93 +#: platform/gui.cpp:98 msgctxt "file-type" msgid "STL mesh" msgstr "STL mesh" -#: platform/gui.cpp:94 +#: platform/gui.cpp:99 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ mesh" -#: platform/gui.cpp:95 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-compatible mesh, with viewer" -#: platform/gui.cpp:96 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-compatible mesh, mesh only" -#: platform/gui.cpp:97 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Q3D Object file" msgstr "Q3D Object file" -#: platform/gui.cpp:98 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "VRML text file" msgstr "VRML text file" -#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "STEP file" msgstr "STEP file" -#: platform/gui.cpp:106 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "PDF file" msgstr "PDF file" -#: platform/gui.cpp:107 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Encapsulated PostScript" -#: platform/gui.cpp:108 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "Scalable Vector Graphics" -#: platform/gui.cpp:110 platform/gui.cpp:117 +#: platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF file (AutoCAD 2007)" -#: platform/gui.cpp:111 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL file" -#: platform/gui.cpp:112 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:121 +#: platform/gui.cpp:126 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF and DWG files" -#: platform/gui.cpp:125 +#: platform/gui.cpp:130 msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 msgid "untitled" msgstr "untitled" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 #: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "Save File" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 #: platform/guiwin.cpp:1557 msgctxt "title" msgid "Open File" @@ -1680,16 +1685,6 @@ msgctxt "button" msgid "_Open" msgstr "_Open" -#: solvespace.cpp:557 -msgctxt "title" -msgid "(new sketch)" -msgstr "(new sketch)" - -#: solvespace.cpp:564 -msgctxt "title" -msgid "Property Browser" -msgstr "Property Browser" - #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " @@ -1873,193 +1868,10 @@ msgstr "Scale cannot be zero or negative." msgid "Bad format: specify x, y, z" msgstr "Bad format: specify x, y, z" -#~ msgid "" -#~ "Some aspects of the drawing have no DWG equivalent and were not " -#~ "exported:\n" -#~ msgstr "" -#~ "Some aspects of the drawing have no DWG equivalent and were not " -#~ "exported:\n" - -#~ msgctxt "file-type" -#~ msgid "DWG file (AutoCAD 2000)" -#~ msgstr "DWG file (AutoCAD 2000)" - -#~ msgid "Specify between 0 and 8 digits after the decimal." -#~ msgstr "Specify between 0 and 8 digits after the decimal." - -#~ msgid "Show Degrees of &Freedom" -#~ msgstr "Show Degrees of &Freedom" - -#~ msgid "click to place bottom left of text" -#~ msgstr "click to place bottom left of text" - -#~ 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?" - -#~ msgid "Your changes will be lost if you don't save them." -#~ msgstr "Your changes will be lost if you don't save them." - -#~ msgctxt "button" -#~ msgid "Save" -#~ msgstr "Save" - -#~ msgctxt "button" -#~ msgid "Cancel" -#~ msgstr "Cancel" - -#~ msgctxt "button" -#~ msgid "Don't Save" -#~ msgstr "Don't Save" - -#~ msgid "An autosave file is available for this project." -#~ msgstr "An autosave file is available for this project." - -#~ msgid "Do you want to load the autosave file instead?" -#~ msgstr "Do you want to load the autosave file instead?" - -#~ msgctxt "button" -#~ msgid "Load" -#~ msgstr "Load" - -#~ msgctxt "button" -#~ msgid "Don't Load" -#~ msgstr "Don't Load" - -#~ msgid "" -#~ "Do you want to locate it manually?\n" -#~ "If you select “No”, any geometry that depends on the missing file will be " -#~ "removed." -#~ msgstr "" -#~ "Do you want to locate it manually?\n" -#~ "If you select “No”, any geometry that depends on the missing file will be " -#~ "removed." - -#~ msgctxt "button" -#~ msgid "Yes" -#~ msgstr "Yes" - -#~ msgctxt "button" -#~ msgid "No" -#~ msgstr "No" - -#~ msgctxt "button" -#~ msgid "OK" -#~ msgstr "OK" +#~ msgctxt "title" +#~ msgid "(new sketch)" +#~ msgstr "(new sketch)" #~ msgctxt "title" #~ msgid "Property Browser" #~ msgstr "Property Browser" - -#~ msgid "_Cancel" -#~ msgstr "_Cancel" - -#~ msgid "_Open" -#~ msgstr "_Open" - -#~ msgid "" -#~ "The file has changed since it was last saved.\n" -#~ "\n" -#~ "Do you want to save the changes?" -#~ msgstr "" -#~ "The file has changed since it was last saved.\n" -#~ "\n" -#~ "Do you want to save the changes?" - -#~ msgctxt "title" -#~ msgid "Modified File" -#~ msgstr "Modified File" - -#~ msgctxt "button" -#~ msgid "Do_n't Save" -#~ msgstr "Do_n't Save" - -#~ msgid "" -#~ "An autosave file is available for this project.\n" -#~ "\n" -#~ "Do you want to load the autosave file instead?" -#~ msgstr "" -#~ "An autosave file is available for this project.\n" -#~ "\n" -#~ "Do you want to load the autosave file instead?" - -#~ msgctxt "title" -#~ msgid "Autosave Available" -#~ msgstr "Autosave Available" - -#~ msgctxt "button" -#~ msgid "_Load autosave" -#~ msgstr "_Load autosave" - -#~ msgctxt "button" -#~ msgid "Do_n't Load" -#~ msgstr "Do_n't Load" - -#~ msgctxt "button" -#~ msgid "_Yes" -#~ msgstr "_Yes" - -#~ msgctxt "button" -#~ msgid "_No" -#~ msgstr "_No" - -#~ msgid "SolveSpace models" -#~ msgstr "SolveSpace models" - -#~ msgid "PNG file" -#~ msgstr "PNG file" - -#~ msgid "STL mesh" -#~ msgstr "STL mesh" - -#~ msgid "Wavefront OBJ mesh" -#~ msgstr "Wavefront OBJ mesh" - -#~ msgid "Three.js-compatible mesh, with viewer" -#~ msgstr "Three.js-compatible mesh, with viewer" - -#~ msgid "Three.js-compatible mesh, mesh only" -#~ msgstr "Three.js-compatible mesh, mesh only" - -#~ msgid "STEP file" -#~ msgstr "STEP file" - -#~ msgid "PDF file" -#~ msgstr "PDF file" - -#~ msgid "Encapsulated PostScript" -#~ msgstr "Encapsulated PostScript" - -#~ msgid "Scalable Vector Graphics" -#~ msgstr "Scalable Vector Graphics" - -#~ msgid "DXF file (AutoCAD 2007)" -#~ msgstr "DXF file (AutoCAD 2007)" - -#~ msgid "HPGL file" -#~ msgstr "HPGL file" - -#~ msgid "G Code" -#~ msgstr "G Code" - -#~ msgid "AutoCAD DXF and DWG files" -#~ msgstr "AutoCAD DXF and DWG files" - -#~ msgid "Comma-separated values" -#~ msgstr "Comma-separated values" - -#~ msgid "" -#~ "Select two entities that intersect each other (e.g. two lines or two " -#~ "circles or a circle and a line)." -#~ msgstr "" -#~ "Select two entities that intersect each other (e.g. two lines or two " -#~ "circles or a circle and a line)." - -#~ msgid "Show Menu &Bar" -#~ msgstr "Show Menu &Bar" - -#~ msgctxt "group-name" -#~ msgid "link" -#~ msgstr "link" - -#~ msgid "Scale must not be zero or negative!" -#~ msgstr "Scale must not be zero or negative!" diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index 6b643f265..8bea1a9f8 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-09-21 09:28+0200\n" +"POT-Creation-Date: 2020-11-17 20:50-0500\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" @@ -624,18 +624,18 @@ msgstr "" "Données non reconnues dans le fichier. Ce fichier peut être corrompu ou " "depuis une version plus récente du programme." -#: file.cpp:849 +#: file.cpp:859 msgctxt "title" msgid "Missing File" msgstr "Fichier manquant" -#: file.cpp:850 +#: file.cpp:860 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "" -#: file.cpp:852 +#: file.cpp:862 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -644,17 +644,17 @@ msgid "" "permanently removed." msgstr "" -#: file.cpp:855 +#: file.cpp:865 msgctxt "button" msgid "&Yes" msgstr "" -#: file.cpp:857 +#: file.cpp:867 msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:859 +#: file.cpp:869 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1363,19 +1363,19 @@ msgstr "translation" msgid "(unnamed)" msgstr "(sans nom)" -#: groupmesh.cpp:689 +#: groupmesh.cpp:708 msgid "not closed contour, or not all same style!" msgstr "contour non fermé ou tout n'est pas du même style!" -#: groupmesh.cpp:702 +#: groupmesh.cpp:721 msgid "points not all coplanar!" msgstr "les points ne sont pas tous coplanaires!" -#: groupmesh.cpp:704 +#: groupmesh.cpp:723 msgid "contour is self-intersecting!" msgstr "le contour s'entrecroise!" -#: groupmesh.cpp:706 +#: groupmesh.cpp:725 msgid "zero-length edge!" msgstr "arête de longueur nulle!" @@ -1578,102 +1578,107 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NOUVEAU COMMENTAIRE - DOUBLE-CLIQUE POUR EDITER" -#: platform/gui.cpp:85 +#: platform/gui.cpp:85 platform/gui.cpp:89 msgctxt "file-type" msgid "SolveSpace models" msgstr "" -#: platform/gui.cpp:89 +#: platform/gui.cpp:90 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "" + +#: platform/gui.cpp:94 msgctxt "file-type" msgid "PNG image" msgstr "" -#: platform/gui.cpp:93 +#: platform/gui.cpp:98 msgctxt "file-type" msgid "STL mesh" msgstr "" -#: platform/gui.cpp:94 +#: platform/gui.cpp:99 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "" -#: platform/gui.cpp:95 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "" -#: platform/gui.cpp:96 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "" -#: platform/gui.cpp:97 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Q3D Object file" msgstr "" -#: platform/gui.cpp:98 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "STEP file" msgstr "" -#: platform/gui.cpp:106 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "PDF file" msgstr "" -#: platform/gui.cpp:107 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "" -#: platform/gui.cpp:108 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "" -#: platform/gui.cpp:110 platform/gui.cpp:117 +#: platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/gui.cpp:111 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "HPGL file" msgstr "" -#: platform/gui.cpp:112 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "G Code" msgstr "" -#: platform/gui.cpp:121 +#: platform/gui.cpp:126 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gui.cpp:125 +#: platform/gui.cpp:130 msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 msgid "untitled" msgstr "sans nom" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 #: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "Sauver fichier" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 #: platform/guiwin.cpp:1557 msgctxt "title" msgid "Open File" @@ -1694,16 +1699,6 @@ msgctxt "button" msgid "_Open" msgstr "" -#: solvespace.cpp:557 -msgctxt "title" -msgid "(new sketch)" -msgstr "(nouveau dessin)" - -#: solvespace.cpp:564 -msgctxt "title" -msgid "Property Browser" -msgstr "Navigateur de propriété" - #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " @@ -1888,6 +1883,14 @@ msgstr "L'échelle ne peut pas être zéro ou négative." msgid "Bad format: specify x, y, z" msgstr "Mauvais format: Spécifiez x, y, z" +#~ msgctxt "title" +#~ msgid "(new sketch)" +#~ msgstr "(nouveau dessin)" + +#~ msgctxt "title" +#~ msgid "Property Browser" +#~ msgstr "Navigateur de propriété" + #~ msgid "Specify between 0 and 8 digits after the decimal." #~ msgstr "Spécifiez entre 0 et 8 chiffres après la virgule." diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index 95a3a94e7..aa6078eef 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-09-21 09:28+0200\n" +"POT-Creation-Date: 2020-11-17 20:50-0500\n" "PO-Revision-Date: 2017-04-21 10:29+0700\n" "Last-Translator: evilspirit@evilspirit.org\n" "Language-Team: EvilSpirit\n" @@ -615,18 +615,18 @@ msgstr "" "Некоторые данные из этого файла не распознаны. Возможно, файл поврежден или " "создан в более новой версии программы" -#: file.cpp:849 +#: file.cpp:859 msgctxt "title" msgid "Missing File" msgstr "Файл Отсутствует" -#: file.cpp:850 +#: file.cpp:860 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "" -#: file.cpp:852 +#: file.cpp:862 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -638,17 +638,17 @@ msgstr "" "Если вы ответите \"Нет\", то вся геометрия, которая зависит от " "отсутствующего файла будет удалена." -#: file.cpp:855 +#: file.cpp:865 msgctxt "button" msgid "&Yes" msgstr "Да" -#: file.cpp:857 +#: file.cpp:867 msgctxt "button" msgid "&No" msgstr "Нет" -#: file.cpp:859 +#: file.cpp:869 msgctxt "button" msgid "&Cancel" msgstr "Отменить" @@ -1366,19 +1366,19 @@ msgstr "линейный-массив" msgid "(unnamed)" msgstr "(без имени)" -#: groupmesh.cpp:689 +#: groupmesh.cpp:708 msgid "not closed contour, or not all same style!" msgstr "незамкнутый контур или несовпадение стилей!" -#: groupmesh.cpp:702 +#: groupmesh.cpp:721 msgid "points not all coplanar!" msgstr "не все точки лежат в одной плоскости!" -#: groupmesh.cpp:704 +#: groupmesh.cpp:723 msgid "contour is self-intersecting!" msgstr "контур имеет самопересечения!" -#: groupmesh.cpp:706 +#: groupmesh.cpp:725 msgid "zero-length edge!" msgstr "вырожденный отрезок!" @@ -1581,102 +1581,107 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "КОММЕНТАРИЙ -- ДВОЙНОЙ ЩЕЛЧОК ДЛЯ РЕДАКТИРОВАНИЯ" -#: platform/gui.cpp:85 +#: platform/gui.cpp:85 platform/gui.cpp:89 msgctxt "file-type" msgid "SolveSpace models" msgstr "проекты SolveSpace" -#: platform/gui.cpp:89 +#: platform/gui.cpp:90 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "" + +#: platform/gui.cpp:94 msgctxt "file-type" msgid "PNG image" msgstr "PNG изображение" -#: platform/gui.cpp:93 +#: platform/gui.cpp:98 msgctxt "file-type" msgid "STL mesh" msgstr "STL полигональная сетка" -#: platform/gui.cpp:94 +#: platform/gui.cpp:99 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ полигональная сетка" -#: platform/gui.cpp:95 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-совместимая полигональная сетка с просмторщиком" -#: platform/gui.cpp:96 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-совместимая полигональная сетка" -#: platform/gui.cpp:97 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Q3D Object file" msgstr "" -#: platform/gui.cpp:98 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "STEP file" msgstr "STEP файл" -#: platform/gui.cpp:106 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "PDF file" msgstr "PDF документ" -#: platform/gui.cpp:107 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Encapsulated PostScript" -#: platform/gui.cpp:108 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "SVG изображение" -#: platform/gui.cpp:110 platform/gui.cpp:117 +#: platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF файл (AutoCAD 2007)" -#: platform/gui.cpp:111 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL файл" -#: platform/gui.cpp:112 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:121 +#: platform/gui.cpp:126 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF и DWG файлы" -#: platform/gui.cpp:125 +#: platform/gui.cpp:130 msgctxt "file-type" msgid "Comma-separated values" msgstr "CSV файлы (значения, разделенные запятой)" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 msgid "untitled" msgstr "без имени" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 #: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "Сохранить Файл" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 #: platform/guiwin.cpp:1557 msgctxt "title" msgid "Open File" @@ -1697,16 +1702,6 @@ msgctxt "button" msgid "_Open" msgstr "" -#: solvespace.cpp:557 -msgctxt "title" -msgid "(new sketch)" -msgstr "(новый проект)" - -#: solvespace.cpp:564 -msgctxt "title" -msgid "Property Browser" -msgstr "Браузер" - #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " @@ -1890,6 +1885,14 @@ msgstr "Масштабный коэффициент не может быть н msgid "Bad format: specify x, y, z" msgstr "Неверный формат: введите данные как x, y, z" +#~ msgctxt "title" +#~ msgid "(new sketch)" +#~ msgstr "(новый проект)" + +#~ msgctxt "title" +#~ msgid "Property Browser" +#~ msgstr "Браузер" + #~ msgid "Specify between 0 and 8 digits after the decimal." #~ msgstr "Введите число от 0 до 8." diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index d4c052d1c..e98706644 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-09-21 09:28+0200\n" +"POT-Creation-Date: 2020-11-17 20:50-0500\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: appsoft@ua.fm\n" "Language-Team: OpenOrienteeringUkraine\n" @@ -498,18 +498,18 @@ msgid "" "of the program." msgstr "" -#: file.cpp:849 +#: file.cpp:859 msgctxt "title" msgid "Missing File" msgstr "" -#: file.cpp:850 +#: file.cpp:860 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "" -#: file.cpp:852 +#: file.cpp:862 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -518,17 +518,17 @@ msgid "" "permanently removed." msgstr "" -#: file.cpp:855 +#: file.cpp:865 msgctxt "button" msgid "&Yes" msgstr "" -#: file.cpp:857 +#: file.cpp:867 msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:859 +#: file.cpp:869 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1189,19 +1189,19 @@ msgstr "" msgid "(unnamed)" msgstr "" -#: groupmesh.cpp:689 +#: groupmesh.cpp:708 msgid "not closed contour, or not all same style!" msgstr "" -#: groupmesh.cpp:702 +#: groupmesh.cpp:721 msgid "points not all coplanar!" msgstr "" -#: groupmesh.cpp:704 +#: groupmesh.cpp:723 msgid "contour is self-intersecting!" msgstr "" -#: groupmesh.cpp:706 +#: groupmesh.cpp:725 msgid "zero-length edge!" msgstr "" @@ -1388,102 +1388,107 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" -#: platform/gui.cpp:85 +#: platform/gui.cpp:85 platform/gui.cpp:89 msgctxt "file-type" msgid "SolveSpace models" msgstr "" -#: platform/gui.cpp:89 +#: platform/gui.cpp:90 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "" + +#: platform/gui.cpp:94 msgctxt "file-type" msgid "PNG image" msgstr "" -#: platform/gui.cpp:93 +#: platform/gui.cpp:98 msgctxt "file-type" msgid "STL mesh" msgstr "" -#: platform/gui.cpp:94 +#: platform/gui.cpp:99 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "" -#: platform/gui.cpp:95 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "" -#: platform/gui.cpp:96 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "" -#: platform/gui.cpp:97 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Q3D Object file" msgstr "" -#: platform/gui.cpp:98 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "STEP file" msgstr "" -#: platform/gui.cpp:106 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "PDF file" msgstr "" -#: platform/gui.cpp:107 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "" -#: platform/gui.cpp:108 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "" -#: platform/gui.cpp:110 platform/gui.cpp:117 +#: platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/gui.cpp:111 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "HPGL file" msgstr "" -#: platform/gui.cpp:112 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "G Code" msgstr "" -#: platform/gui.cpp:121 +#: platform/gui.cpp:126 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gui.cpp:125 +#: platform/gui.cpp:130 msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 msgid "untitled" msgstr "" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 #: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 #: platform/guiwin.cpp:1557 msgctxt "title" msgid "Open File" @@ -1504,16 +1509,6 @@ msgctxt "button" msgid "_Open" msgstr "" -#: solvespace.cpp:557 -msgctxt "title" -msgid "(new sketch)" -msgstr "" - -#: solvespace.cpp:564 -msgctxt "title" -msgid "Property Browser" -msgstr "" - #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index 4d2d2d417..a2e1b454f 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-09-21 09:28+0200\n" +"POT-Creation-Date: 2020-11-17 20:50-0500\n" "PO-Revision-Date: 2020-09-28 12:42+0800\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" @@ -576,18 +576,18 @@ msgid "" "of the program." msgstr "未识别文件内数据。该文件可能损坏,或使用新版本应用程序尝试打开。" -#: file.cpp:849 +#: file.cpp:859 msgctxt "title" msgid "Missing File" msgstr "文件丢失" -#: file.cpp:850 +#: file.cpp:860 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "连接的文件不存在:\"%s\"。" -#: file.cpp:852 +#: file.cpp:862 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -596,17 +596,17 @@ msgid "" "permanently removed." msgstr "您是否想手工查找?如果是,所有基于该丢失文件的几何对象将会被全部删除." -#: file.cpp:855 +#: file.cpp:865 msgctxt "button" msgid "&Yes" msgstr "是(&Y)" -#: file.cpp:857 +#: file.cpp:867 msgctxt "button" msgid "&No" msgstr "否(&N)" -#: file.cpp:859 +#: file.cpp:869 msgctxt "button" msgid "&Cancel" msgstr "取消(&C)" @@ -1276,19 +1276,19 @@ msgstr "移动" msgid "(unnamed)" msgstr "(未命名)" -#: groupmesh.cpp:689 +#: groupmesh.cpp:708 msgid "not closed contour, or not all same style!" msgstr "未闭合轮廓,或样式不一致!" -#: groupmesh.cpp:702 +#: groupmesh.cpp:721 msgid "points not all coplanar!" msgstr "点不在相同平面!" -#: groupmesh.cpp:704 +#: groupmesh.cpp:723 msgid "contour is self-intersecting!" msgstr "轮廓自相交!" -#: groupmesh.cpp:706 +#: groupmesh.cpp:725 msgid "zero-length edge!" msgstr "边缘长度为零!" @@ -1475,102 +1475,107 @@ msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "新备注 - 双击编辑" -#: platform/gui.cpp:85 +#: platform/gui.cpp:85 platform/gui.cpp:89 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace模型" -#: platform/gui.cpp:89 +#: platform/gui.cpp:90 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "" + +#: platform/gui.cpp:94 msgctxt "file-type" msgid "PNG image" msgstr "PNG图片" -#: platform/gui.cpp:93 +#: platform/gui.cpp:98 msgctxt "file-type" msgid "STL mesh" msgstr "STL网格" -#: platform/gui.cpp:94 +#: platform/gui.cpp:99 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ网格" -#: platform/gui.cpp:95 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-网格及查看视图" -#: platform/gui.cpp:96 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-仅网格" -#: platform/gui.cpp:97 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Q3D Object file" msgstr "Q3D对象文件" -#: platform/gui.cpp:98 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "VRML text file" msgstr "VRML文本文件" -#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "STEP file" msgstr "STEP文件" -#: platform/gui.cpp:106 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "PDF file" msgstr "PDF文件" -#: platform/gui.cpp:107 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "封装好的PostScript" -#: platform/gui.cpp:108 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "SVG矢量图" -#: platform/gui.cpp:110 platform/gui.cpp:117 +#: platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF文件(AutoCAD 2007)" -#: platform/gui.cpp:111 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL文件" -#: platform/gui.cpp:112 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:121 +#: platform/gui.cpp:126 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF/DWG文件" -#: platform/gui.cpp:125 +#: platform/gui.cpp:130 msgctxt "file-type" msgid "Comma-separated values" msgstr "逗号分隔数据" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 msgid "untitled" msgstr "未命名" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 #: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "保存文件" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 #: platform/guiwin.cpp:1557 msgctxt "title" msgid "Open File" diff --git a/res/messages.pot b/res/messages.pot index 8ea9c85ba..7f025001c 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-09-21 09:28+0200\n" +"POT-Creation-Date: 2020-11-17 20:50-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -477,18 +477,18 @@ msgstr "" msgid "Unrecognized data in file. This file may be corrupt, or from a newer version of the program." msgstr "" -#: file.cpp:849 +#: file.cpp:859 msgctxt "title" msgid "Missing File" msgstr "" -#: file.cpp:850 +#: file.cpp:860 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "" -#: file.cpp:852 +#: file.cpp:862 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -496,17 +496,17 @@ msgid "" "If you decline, any geometry that depends on the missing file will be permanently removed." msgstr "" -#: file.cpp:855 +#: file.cpp:865 msgctxt "button" msgid "&Yes" msgstr "" -#: file.cpp:857 +#: file.cpp:867 msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:859 +#: file.cpp:869 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1160,19 +1160,19 @@ msgstr "" msgid "(unnamed)" msgstr "" -#: groupmesh.cpp:689 +#: groupmesh.cpp:708 msgid "not closed contour, or not all same style!" msgstr "" -#: groupmesh.cpp:702 +#: groupmesh.cpp:721 msgid "points not all coplanar!" msgstr "" -#: groupmesh.cpp:704 +#: groupmesh.cpp:723 msgid "contour is self-intersecting!" msgstr "" -#: groupmesh.cpp:706 +#: groupmesh.cpp:725 msgid "zero-length edge!" msgstr "" @@ -1350,102 +1350,107 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" -#: platform/gui.cpp:85 +#: platform/gui.cpp:85 platform/gui.cpp:89 msgctxt "file-type" msgid "SolveSpace models" msgstr "" -#: platform/gui.cpp:89 +#: platform/gui.cpp:90 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "" + +#: platform/gui.cpp:94 msgctxt "file-type" msgid "PNG image" msgstr "" -#: platform/gui.cpp:93 +#: platform/gui.cpp:98 msgctxt "file-type" msgid "STL mesh" msgstr "" -#: platform/gui.cpp:94 +#: platform/gui.cpp:99 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "" -#: platform/gui.cpp:95 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "" -#: platform/gui.cpp:96 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "" -#: platform/gui.cpp:97 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Q3D Object file" msgstr "" -#: platform/gui.cpp:98 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:102 platform/gui.cpp:109 platform/gui.cpp:116 +#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "STEP file" msgstr "" -#: platform/gui.cpp:106 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "PDF file" msgstr "" -#: platform/gui.cpp:107 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "" -#: platform/gui.cpp:108 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "" -#: platform/gui.cpp:110 platform/gui.cpp:117 +#: platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/gui.cpp:111 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "HPGL file" msgstr "" -#: platform/gui.cpp:112 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "G Code" msgstr "" -#: platform/gui.cpp:121 +#: platform/gui.cpp:126 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gui.cpp:125 +#: platform/gui.cpp:130 msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1347 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 msgid "untitled" msgstr "" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1305 +#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 #: platform/guiwin.cpp:1555 msgctxt "title" msgid "Save File" msgstr "" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1288 +#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 #: platform/guiwin.cpp:1557 msgctxt "title" msgid "Open File" From 7f974a6bed556749c8b375680b1600c7fb3792d6 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Wed, 18 Nov 2020 10:53:14 +0100 Subject: [PATCH 178/646] Travis: deploy tagged commits & edge tagging fixes With the recent Travis changes, we prevented the deploy stage from running for tagged commits as branch=tag for tagged commits. Fix this by also running deploy for tagged commits. Furthermore, clean up .travis.yml by pulling the edge tagging logic into a separate script. A logic change is introduced to prevent git tag --force being run on set tags as this would turn annotated tags into lightweight tags. --- .travis.yml | 20 ++++---------------- .travis/tag-edge.sh | 8 ++++++++ 2 files changed, 12 insertions(+), 16 deletions(-) create mode 100755 .travis/tag-edge.sh diff --git a/.travis.yml b/.travis.yml index 4d796af78..b9f648993 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ stages: - name: clean if: (NOT type IN (pull_request)) AND (branch = master) - name: deploy - if: (NOT type IN (pull_request)) AND (branch = master) + if: (NOT type IN (pull_request)) AND (branch = master OR tag IS present) jobs: include: - stage: clean @@ -29,11 +29,7 @@ jobs: osx_image: xcode12.2 install: ".travis/install-macos.sh" script: ".travis/build-macos.sh release && .travis/sign-macos.sh" - before_deploy: - - git config --local user.name "solvespace-cd" - - git config --local user.email "no-reply@solvespace.com" - - export TRAVIS_TAG=${TRAVIS_TAG:-edge} - - git tag --force $TRAVIS_TAG + before_deploy: source .travis/tag-edge.sh deploy: provider: releases skip_cleanup: true @@ -59,11 +55,7 @@ jobs: os: windows install: .travis/install-windows.sh script: .travis/build-windows.sh release - before_deploy: - - git config --local user.name "solvespace-cd" - - git config --local user.email "no-reply@solvespace.com" - - export TRAVIS_TAG=${TRAVIS_TAG:-edge} - - git tag --force $TRAVIS_TAG + before_deploy: source .travis/tag-edge.sh deploy: provider: releases skip_cleanup: true @@ -78,11 +70,7 @@ jobs: os: windows install: .travis/install-windows.sh script: .travis/build-windows.sh release openmp - before_deploy: - - git config --local user.name "solvespace-cd" - - git config --local user.email "no-reply@solvespace.com" - - export TRAVIS_TAG=${TRAVIS_TAG:-edge} - - git tag --force $TRAVIS_TAG + before_deploy: source .travis/tag-edge.sh deploy: provider: releases skip_cleanup: true diff --git a/.travis/tag-edge.sh b/.travis/tag-edge.sh new file mode 100755 index 000000000..8ce6a194c --- /dev/null +++ b/.travis/tag-edge.sh @@ -0,0 +1,8 @@ +#!/bin/sh -xe + +if [ -z "$TRAVIS_TAG" ]; then + git config --local user.name "solvespace-cd" + git config --local user.email "no-reply@solvespace.com" + export TRAVIS_TAG="edge" + git tag --force $TRAVIS_TAG +fi From 1bc09b8201e17d30c9d8e3baf8d010fe1fc661c0 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Wed, 18 Nov 2020 15:27:35 +0100 Subject: [PATCH 179/646] Travis: deploy tagged & master commits to GitHub Our implicit deploy conditions were previously only met by untagged commits on master. As the stage conditions filter everything except branch = master and tagged commits, we can just use all_branches: true to also deploy tagged builds. Also clean up the snap deploy sections. --- .travis.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index b9f648993..0681bf2ba 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,6 +39,8 @@ jobs: name: ${TRAVIS_TAG:-edge} release_notes: $TRAVIS_COMMIT_MESSAGE file: build/bin/SolveSpace.dmg + on: + all_branches: true - stage: test name: "Ubuntu" os: linux @@ -65,6 +67,8 @@ jobs: name: ${TRAVIS_TAG:-edge} release_notes: $TRAVIS_COMMIT_MESSAGE file: build/bin/RelWithDebInfo/solvespace.exe + on: + all_branches: true - stage: deploy name: "Windows with OpenMP" os: windows @@ -80,6 +84,8 @@ jobs: name: ${TRAVIS_TAG:-edge} release_notes: $TRAVIS_COMMIT_MESSAGE file: build/bin/RelWithDebInfo/solvespace-openmp.exe + on: + all_branches: true - &deploy-snap stage: deploy name: Snap amd64 @@ -95,14 +101,10 @@ jobs: - provider: script script: sudo .travis/deploy-snap.sh edge skip_cleanup: true - on: - branch: master - tags: false - provider: script script: sudo .travis/deploy-snap.sh edge,beta skip_cleanup: true on: - branch: master tags: true - <<: *deploy-snap name: Snap arm64 From 2e67844aaf91db99d622178a9aa022e5602a50d7 Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 18 Nov 2020 17:04:36 +0200 Subject: [PATCH 180/646] Fix unsequenced modification and access warnings. Found by clang 11. They are a potential problem. [ 21%] Building CXX object src/CMakeFiles/solvespace-core.dir/exportstep.cpp.obj .\src\exportstep.cpp:293:61: warning: unsequenced modification and access to 'id' [-Wunsequenced] fprintf(f, "#%d=FILL_AREA_STYLE_COLOUR('',#%d);\n", ++id, id - 1); ^ ~~ .\src\exportstep.cpp:294:56: warning: unsequenced modification and access to 'id' [-Wunsequenced] fprintf(f, "#%d=FILL_AREA_STYLE('',(#%d));\n", ++id, id - 1); ^ ~~ .\src\exportstep.cpp:295:59: warning: unsequenced modification and access to 'id' [-Wunsequenced] fprintf(f, "#%d=SURFACE_STYLE_FILL_AREA(#%d);\n", ++id, id - 1); ^ ~~ .\src\exportstep.cpp:297:98: warning: unsequenced modification and access to 'id' [-Wunsequenced] fprintf(f, "#%d=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#%d,(#%d));\n", ++id, id - 5, id - 1); ^ ~~ .\src\exportstep.cpp:298:64: warning: unsequenced modification and access to 'id' [-Wunsequenced] fprintf(f, "#%d=SURFACE_SIDE_STYLE('',(#%d, #%d));\n", ++id, id - 3, id - 1); ^ ~~ .\src\exportstep.cpp:300:62: warning: unsequenced modification and access to 'id' [-Wunsequenced] fprintf(f, "#%d=SURFACE_STYLE_USAGE(.BOTH.,#%d);\n", ++id, id - 1); ^ ~~ .\src\exportstep.cpp:301:67: warning: unsequenced modification and access to 'id' [-Wunsequenced] fprintf(f, "#%d=PRESENTATION_STYLE_ASSIGNMENT((#%d));\n", ++id, id - 1); ^ ~~ .\src\exportstep.cpp:302:56: warning: unsequenced modification and access to 'id' [-Wunsequenced] fprintf(f, "#%d=STYLED_ITEM('',(#%d),#%d);\n", ++id, id - 1, advFaceId); ^ ~~ 8 warnings generated. --- src/exportstep.cpp | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/exportstep.cpp b/src/exportstep.cpp index 915852266..db42dc085 100644 --- a/src/exportstep.cpp +++ b/src/exportstep.cpp @@ -282,24 +282,34 @@ void StepFileWriter::ExportSurface(SSurface *ss, SBezierList *sbl) { ss->color.greenF(), ss->color.blueF()); /* // This works in Kisters 3DViewStation but not in KiCAD and Horison EDA, - // it seems they do not support transparency so use the more verbose one below + // it seems they do not support transparency so use the more verbose one below fprintf(f, "#%d=SURFACE_STYLE_TRANSPARENT(%.2f);\n", ++id, 1.0 - ss->color.alphaF()); + ++id; fprintf(f, "#%d=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#%d,(#%d));\n", - ++id, id - 2, id - 1); - fprintf(f, "#%d=SURFACE_SIDE_STYLE('',(#%d));\n", ++id, id - 1); + id, id - 2, id - 1); + ++id; + fprintf(f, "#%d=SURFACE_SIDE_STYLE('',(#%d));\n", id, id - 1); */ // This works in Horison EDA but is more verbose. - fprintf(f, "#%d=FILL_AREA_STYLE_COLOUR('',#%d);\n", ++id, id - 1); - fprintf(f, "#%d=FILL_AREA_STYLE('',(#%d));\n", ++id, id - 1); - fprintf(f, "#%d=SURFACE_STYLE_FILL_AREA(#%d);\n", ++id, id - 1); + ++id; + fprintf(f, "#%d=FILL_AREA_STYLE_COLOUR('',#%d);\n", id, id - 1); + ++id; + fprintf(f, "#%d=FILL_AREA_STYLE('',(#%d));\n", id, id - 1); + ++id; + fprintf(f, "#%d=SURFACE_STYLE_FILL_AREA(#%d);\n", id, id - 1); fprintf(f, "#%d=SURFACE_STYLE_TRANSPARENT(%.2f);\n", ++id, 1.0 - ss->color.alphaF()); - fprintf(f, "#%d=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#%d,(#%d));\n", ++id, id - 5, id - 1); - fprintf(f, "#%d=SURFACE_SIDE_STYLE('',(#%d, #%d));\n", ++id, id - 3, id - 1); - - fprintf(f, "#%d=SURFACE_STYLE_USAGE(.BOTH.,#%d);\n", ++id, id - 1); - fprintf(f, "#%d=PRESENTATION_STYLE_ASSIGNMENT((#%d));\n", ++id, id - 1); - fprintf(f, "#%d=STYLED_ITEM('',(#%d),#%d);\n", ++id, id - 1, advFaceId); + ++id; + fprintf(f, "#%d=SURFACE_STYLE_RENDERING_WITH_PROPERTIES(.NORMAL_SHADING.,#%d,(#%d));\n", id, id - 5, id - 1); + ++id; + fprintf(f, "#%d=SURFACE_SIDE_STYLE('',(#%d, #%d));\n", id, id - 3, id - 1); + + ++id; + fprintf(f, "#%d=SURFACE_STYLE_USAGE(.BOTH.,#%d);\n", id, id - 1); + ++id; + fprintf(f, "#%d=PRESENTATION_STYLE_ASSIGNMENT((#%d));\n", id, id - 1); + ++id; + fprintf(f, "#%d=STYLED_ITEM('',(#%d),#%d);\n", id, id - 1, advFaceId); fprintf(f, "\n"); id++; From 7a4f0eb0d92b32cc5ea4d841b46de4e12bbee38b Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Wed, 18 Nov 2020 21:43:08 +0100 Subject: [PATCH 181/646] Travis: build snaps in LXD containers With arm64-graviton2 now providing full VM virtualization, LXD containers can be used to build snaps on all architectures. This is beneficial for us as having snapcraft manage the whole build environment is likely to yield better/more consistent results than running the builds on the Travis images directly. --- .travis.yml | 10 ++++++---- .travis/build-snap.sh | 3 +-- .travis/deploy-snap.sh | 2 +- .travis/install-snap.sh | 6 ++++++ 4 files changed, 14 insertions(+), 7 deletions(-) create mode 100755 .travis/install-snap.sh diff --git a/.travis.yml b/.travis.yml index 0681bf2ba..a692aa774 100644 --- a/.travis.yml +++ b/.travis.yml @@ -91,18 +91,20 @@ jobs: name: Snap amd64 os: linux arch: amd64 - dist: bionic + dist: focal addons: snaps: - name: snapcraft confinement: classic + - name: lxd + install: .travis/install-snap.sh script: .travis/build-snap.sh deploy: - provider: script - script: sudo .travis/deploy-snap.sh edge + script: .travis/deploy-snap.sh edge skip_cleanup: true - provider: script - script: sudo .travis/deploy-snap.sh edge,beta + script: .travis/deploy-snap.sh edge,beta skip_cleanup: true on: tags: true @@ -110,4 +112,4 @@ jobs: name: Snap arm64 arch: arm64-graviton2 group: edge - virt: lxd + virt: vm diff --git a/.travis/build-snap.sh b/.travis/build-snap.sh index 634e01c4c..665e56145 100755 --- a/.travis/build-snap.sh +++ b/.travis/build-snap.sh @@ -1,4 +1,3 @@ #!/bin/sh -xe -sudo apt-get update -sudo ./pkg/snap/build.sh --destructive-mode +./pkg/snap/build.sh --use-lxd diff --git a/.travis/deploy-snap.sh b/.travis/deploy-snap.sh index 91674a7c6..9cbab5b1f 100755 --- a/.travis/deploy-snap.sh +++ b/.travis/deploy-snap.sh @@ -4,5 +4,5 @@ channels="$1" echo "$SNAP_TOKEN" | snapcraft login --with - for snap in ./pkg/snap/*.snap; do - snapcraft push "$snap" --release "$channels" + snapcraft upload "$snap" --release "$channels" done diff --git a/.travis/install-snap.sh b/.travis/install-snap.sh new file mode 100755 index 000000000..e10a91da8 --- /dev/null +++ b/.travis/install-snap.sh @@ -0,0 +1,6 @@ +#!/bin/sh -xe + +sudo /snap/bin/lxd waitready +sudo /snap/bin/lxd init --auto +sudo chgrp travis /var/snap/lxd/common/lxd/unix.socket +mkdir -p "$TRAVIS_BUILD_DIR/snaps-cache" From ccb609b525edd9e4a54f6918217d665cdd4e0170 Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 13 Nov 2020 23:46:33 +0200 Subject: [PATCH 182/646] Remove Q3DO export. It was added in 3a3a2755b as a potential way to export colorful meshes to Horizon EDA but ended up being supported only by SolveSpace. Since no software can consume the exported q3do files the feature is superfluous. See https://github.com/solvespace/solvespace/issues/795 for details. --- .gitmodules | 6 ----- .travis/install-ubuntu.sh | 2 +- CHANGELOG.md | 3 ++- CMakeLists.txt | 11 -------- README.md | 6 ++--- extlib/flatbuffers | 1 - extlib/q3d | 1 - pkg/snap/snap/snapcraft.yaml | 2 +- src/CMakeLists.txt | 3 --- src/export.cpp | 50 ------------------------------------ src/platform/gui.cpp | 1 - src/solvespace.h | 1 - 12 files changed, 7 insertions(+), 80 deletions(-) delete mode 160000 extlib/flatbuffers delete mode 160000 extlib/q3d diff --git a/.gitmodules b/.gitmodules index 51193203e..71384a1a8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -20,12 +20,6 @@ [submodule "extlib/angle"] path = extlib/angle url = https://github.com/solvespace/angle -[submodule "extlib/flatbuffers"] - path = extlib/flatbuffers - url = https://github.com/google/flatbuffers -[submodule "extlib/q3d"] - path = extlib/q3d - url = https://github.com/q3k/q3d [submodule "extlib/mimalloc"] path = extlib/mimalloc url = https://github.com/microsoft/mimalloc diff --git a/.travis/install-ubuntu.sh b/.travis/install-ubuntu.sh index fb20fffaa..53f88b273 100755 --- a/.travis/install-ubuntu.sh +++ b/.travis/install-ubuntu.sh @@ -7,4 +7,4 @@ sudo apt-get install -q -y \ libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev libgl-dev \ libgl-dev libglu-dev libspnav-dev -git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d extlib/mimalloc +git submodule update --init extlib/libdxfrw extlib/mimalloc diff --git a/CHANGELOG.md b/CHANGELOG.md index f3faa4783..a7a40327b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,7 +53,8 @@ New export/import features: * Wavefront OBJ: a material file is exported alongside the model, containing mesh color information. * DXF/DWG: 3D DXF files are imported as construction entities, in 3d. - * Q3D: [Q3D](https://github.com/q3k/q3d/) triangle meshes can now be + * [ADDED 2019-02-25](https://github.com/solvespace/solvespace/pull/384) and [REMOVED 2020-11-13](https://github.com/solvespace/solvespace/issues/795): + Q3D: [Q3D](https://github.com/q3k/q3d/) triangle meshes can now be exported. This format allows to easily hack on triangle mesh data created in SolveSpace, supports colour information and is more space efficient than most other formats. diff --git a/CMakeLists.txt b/CMakeLists.txt index ad23d9839..6cdca35c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -182,17 +182,6 @@ endif() message(STATUS "Using in-tree libdxfrw") add_subdirectory(extlib/libdxfrw) -message(STATUS "Using in-tree flatbuffers") -set(FLATBUFFERS_BUILD_FLATLIB ON CACHE BOOL "") -set(FLATBUFFERS_BUILD_FLATC ON CACHE BOOL "") -set(FLATBUFFERS_BUILD_FLATHASH OFF CACHE BOOL "") -set(FLATBUFFERS_BUILD_TESTS OFF CACHE BOOL "") -add_subdirectory(extlib/flatbuffers EXCLUDE_FROM_ALL) - -message(STATUS "Using in-tree q3d") -add_subdirectory(extlib/q3d) -set(Q3D_INCLUDE_DIR ${CMAKE_BINARY_DIR}/extlib/q3d) - message(STATUS "Using in-tree mimalloc") set(MI_OVERRIDE OFF CACHE BOOL "") set(MI_BUILD_SHARED OFF CACHE BOOL "") diff --git a/README.md b/README.md index 394e33dc8..cbeb89f5c 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ Before building, check out the project and the necessary submodules: git clone https://github.com/solvespace/solvespace cd solvespace - git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d extlib/mimalloc + git submodule update --init extlib/libdxfrw extlib/mimalloc After that, build SolveSpace as following: @@ -108,7 +108,7 @@ Ubuntu will require 20.04 or above. Cross-compiling with WSL is also confirmed t You will need the usual build tools, CMake, a Windows cross-compiler, and flatc. On a Debian derivative (e.g. Ubuntu) these can be installed with: - apt-get install git build-essential cmake mingw-w64 libflatbuffers-dev + apt-get install git build-essential cmake mingw-w64 Before building, check out the project and the necessary submodules: @@ -182,7 +182,7 @@ Before building, check out the project and the necessary submodules: git clone https://github.com/solvespace/solvespace cd solvespace - git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d extlib/mimalloc + git submodule update --init extlib/libdxfrw extlib/mimalloc After that, build SolveSpace as following: diff --git a/extlib/flatbuffers b/extlib/flatbuffers deleted file mode 160000 index de1f0342c..000000000 --- a/extlib/flatbuffers +++ /dev/null @@ -1 +0,0 @@ -Subproject commit de1f0342c86fc00955f6047937fac05e56b9b54c diff --git a/extlib/q3d b/extlib/q3d deleted file mode 160000 index 880db1d34..000000000 --- a/extlib/q3d +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 880db1d34706778f216a2308fd82a9a3adacb314 diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index 400ea19e2..5fe5f7be6 100644 --- a/pkg/snap/snap/snapcraft.yaml +++ b/pkg/snap/snap/snapcraft.yaml @@ -45,7 +45,7 @@ parts: snapcraftctl set-version "$version" git describe --exact-match HEAD && grade="stable" || grade="devel" snapcraftctl set-grade "$grade" - git submodule update --init extlib/libdxfrw extlib/flatbuffers extlib/q3d extlib/mimalloc + git submodule update --init extlib/libdxfrw extlib/mimalloc configflags: - -DCMAKE_INSTALL_PREFIX=/usr - -DCMAKE_BUILD_TYPE=Release diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1a46e246c..d6b13523d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -80,7 +80,6 @@ include_directories( ${PNG_PNG_INCLUDE_DIR} ${FREETYPE_INCLUDE_DIRS} ${CAIRO_INCLUDE_DIRS} - ${Q3D_INCLUDE_DIR} ${MIMALLOC_INCLUDE_DIR}) if(Backtrace_FOUND) @@ -214,7 +213,6 @@ add_library(solvespace-core STATIC ${solvespace_core_SOURCES}) add_dependencies(solvespace-core - q3d_header mimalloc-static) target_link_libraries(solvespace-core @@ -224,7 +222,6 @@ target_link_libraries(solvespace-core ${ZLIB_LIBRARY} ${PNG_LIBRARY} ${FREETYPE_LIBRARY} - flatbuffers mimalloc-static) if(Backtrace_FOUND) diff --git a/src/export.cpp b/src/export.cpp index e0c6182c6..f5649b687 100644 --- a/src/export.cpp +++ b/src/export.cpp @@ -843,8 +843,6 @@ void SolveSpaceUI::ExportMeshTo(const Platform::Path &filename) { ExportMeshAsObjTo(f, fMtl, m); fclose(fMtl); - } else if(filename.HasExtension("q3do")) { - ExportMeshAsQ3doTo(f, m); } else if(filename.HasExtension("js") || filename.HasExtension("html")) { SOutlineList *e = &(SK.GetGroup(SS.GW.activeGroup)->displayOutlines); @@ -898,54 +896,6 @@ void SolveSpaceUI::ExportMeshAsStlTo(FILE *f, SMesh *sm) { } } -//----------------------------------------------------------------------------- -// Export the mesh as a Q3DO (https://github.com/q3k/q3d) file. -//----------------------------------------------------------------------------- - -#include "q3d_object_generated.h" -void SolveSpaceUI::ExportMeshAsQ3doTo(FILE *f, SMesh *sm) { - flatbuffers::FlatBufferBuilder builder(1024); - double s = SS.exportScale; - - // Create a material for every colour used, keep note of triangles belonging to color/material. - std::map, RgbaColorCompare> materials; - std::map>, RgbaColorCompare> materialTriangles; - for (const STriangle &t : sm->l) { - auto color = t.meta.color; - if (materials.find(color) == materials.end()) { - auto name = builder.CreateString(ssprintf("Color #%02x%02x%02x%02x", color.red, color.green, color.blue, color.alpha)); - auto co = q3d::CreateColor(builder, color.red, color.green, color.blue, color.alpha); - auto mo = q3d::CreateMaterial(builder, name, co); - materials.emplace(color, mo); - } - - Vector faceNormal = t.Normal(); - auto a = q3d::Vector3((float)(t.a.x/s), (float)(t.a.y/s), (float)(t.a.z/s)); - auto b = q3d::Vector3((float)(t.b.x/s), (float)(t.b.y/s), (float)(t.b.z/s)); - auto c = q3d::Vector3((float)(t.c.x/s), (float)(t.c.y/s), (float)(t.c.z/s)); - auto fn = q3d::Vector3((float)faceNormal.x, (float)faceNormal.y, (float)faceNormal.x); - auto n1 = q3d::Vector3((float)t.normals[0].x, (float)t.normals[0].y, (float)t.normals[0].z); - auto n2 = q3d::Vector3((float)t.normals[1].x, (float)t.normals[1].y, (float)t.normals[1].z); - auto n3 = q3d::Vector3((float)t.normals[2].x, (float)t.normals[2].y, (float)t.normals[2].z); - auto tri = q3d::CreateTriangle(builder, &a, &b, &c, &fn, &n1, &n2, &n3); - materialTriangles[color].push_back(tri); - } - - // Build all meshes sorted by material. - std::vector> meshes; - for (auto &it : materials) { - auto &mato = it.second; - auto to = builder.CreateVector(materialTriangles[it.first]); - auto mo = q3d::CreateMesh(builder, to, mato); - meshes.push_back(mo); - } - - auto mo = builder.CreateVector(meshes); - auto o = q3d::CreateObject(builder, mo); - q3d::FinishObjectBuffer(builder, o); - fwrite(builder.GetBufferPointer(), builder.GetSize(), 1, f); -} - //----------------------------------------------------------------------------- // Export the mesh as Wavefront OBJ format. This requires us to reduce all the // identical vertices to the same identifier, so do that first. diff --git a/src/platform/gui.cpp b/src/platform/gui.cpp index ff9b2cffb..28fded44c 100644 --- a/src/platform/gui.cpp +++ b/src/platform/gui.cpp @@ -99,7 +99,6 @@ std::vector MeshFileFilters = { { CN_("file-type", "Wavefront OBJ mesh"), { "obj" } }, { CN_("file-type", "Three.js-compatible mesh, with viewer"), { "html" } }, { CN_("file-type", "Three.js-compatible mesh, mesh only"), { "js" } }, - { CN_("file-type", "Q3D Object file"), { "q3do" } }, { CN_("file-type", "VRML text file"), { "wrl" } }, }; diff --git a/src/solvespace.h b/src/solvespace.h index e8eeddc98..e64a1ab86 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -686,7 +686,6 @@ class SolveSpaceUI { void ExportAsPngTo(const Platform::Path &filename); void ExportMeshTo(const Platform::Path &filename); void ExportMeshAsStlTo(FILE *f, SMesh *sm); - void ExportMeshAsQ3doTo(FILE *f, SMesh *sm); void ExportMeshAsObjTo(FILE *fObj, FILE *fMtl, SMesh *sm); void ExportMeshAsThreeJsTo(FILE *f, const Platform::Path &filename, SMesh *sm, SOutlineList *sol); From 41e3298639207d56c5592277f88839ad65e5ad58 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 22 Nov 2020 18:45:50 +0200 Subject: [PATCH 183/646] Translations: Add solvespace.cpp to the translations... ...since it currently contains many relevant strings. --- res/locales/de_DE.po | 285 +++++++++++++++++++++++++++++++----- res/locales/en_US.po | 338 +++++++++++++++++++++++++++++++++++++++---- res/locales/fr_FR.po | 281 ++++++++++++++++++++++++++++++----- res/locales/ru_RU.po | 281 ++++++++++++++++++++++++++++++----- res/locales/uk_UA.po | 265 ++++++++++++++++++++++++++++++--- res/locales/zh_CN.po | 271 +++++++++++++++++++++++++++++++--- res/messages.pot | 262 ++++++++++++++++++++++++++++++--- src/CMakeLists.txt | 3 +- 8 files changed, 1788 insertions(+), 198 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index bf858b1fa..846861fb1 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-17 20:50-0500\n" +"POT-Creation-Date: 2020-11-22 18:09+0200\n" "PO-Revision-Date: 2018-07-19 06:55+0000\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" @@ -660,7 +660,7 @@ msgctxt "button" msgid "&No" msgstr "&Nein" -#: file.cpp:869 +#: file.cpp:869 solvespace.cpp:537 msgctxt "button" msgid "&Cancel" msgstr "&Abbrechen" @@ -1592,7 +1592,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEUER KOMMENTAR -- DOPPELKLICKEN ZUM BEARBEITEN" -#: platform/gui.cpp:85 platform/gui.cpp:89 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace-Modelle" @@ -1629,71 +1629,66 @@ msgstr "Three.js-kompatibles Netz, nur Netz" #: platform/gui.cpp:102 msgctxt "file-type" -msgid "Q3D Object file" -msgstr "Q3D Objektdatei" - -#: platform/gui.cpp:103 -msgctxt "file-type" msgid "VRML text file" msgstr "VRML Textdatei" -#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 msgctxt "file-type" msgid "STEP file" msgstr "STEP-Datei" -#: platform/gui.cpp:111 +#: platform/gui.cpp:110 msgctxt "file-type" msgid "PDF file" msgstr "PDF-Datei" -#: platform/gui.cpp:112 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Eingebettetes Postscript" -#: platform/gui.cpp:113 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "Skalierbare Vektorgrafik" -#: platform/gui.cpp:115 platform/gui.cpp:122 +#: platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF-Datei (AutoCAD 2007)" -#: platform/gui.cpp:116 +#: platform/gui.cpp:115 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL-Datei" -#: platform/gui.cpp:117 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "G Code" msgstr "G-Code" -#: platform/gui.cpp:126 +#: platform/gui.cpp:125 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF- und DWG-Dateien" -#: platform/gui.cpp:130 +#: platform/gui.cpp:129 msgctxt "file-type" msgid "Comma-separated values" msgstr "Werte durch Komma getrennt (CSV)" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 msgid "untitled" msgstr "unbenannt" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1555 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "Datei speichern" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1557 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "Datei öffnen" @@ -1713,6 +1708,237 @@ msgctxt "button" msgid "_Open" msgstr "" +#: solvespace.cpp:169 +msgctxt "title" +msgid "Autosave Available" +msgstr "Automatische Speicherdatei verfügbar" + +#: solvespace.cpp:170 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "" + +#: solvespace.cpp:171 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "" + +#: solvespace.cpp:172 +msgctxt "button" +msgid "&Load autosave" +msgstr "" + +#: solvespace.cpp:174 +msgctxt "button" +msgid "Do&n't Load" +msgstr "" + +#: solvespace.cpp:525 +msgctxt "title" +msgid "Modified File" +msgstr "Geänderte Datei" + +#: solvespace.cpp:527 +#, c-format +msgctxt "dialog" +msgid "Do you want to save the changes you made to the sketch “%s”?" +msgstr "" + +#: solvespace.cpp:530 +msgctxt "dialog" +msgid "Do you want to save the changes you made to the new sketch?" +msgstr "" + +#: solvespace.cpp:533 +msgctxt "dialog" +msgid "Your changes will be lost if you don't save them." +msgstr "" + +#: solvespace.cpp:534 +msgctxt "button" +msgid "&Save" +msgstr "" + +#: solvespace.cpp:536 +msgctxt "button" +msgid "Do&n't Save" +msgstr "" + +# solvespace.cpp:557 +#: solvespace.cpp:557 +msgctxt "title" +msgid "(new sketch)" +msgstr "(Neue Skizze)" + +#: solvespace.cpp:564 +msgctxt "title" +msgid "Property Browser" +msgstr "Attribut-Browser" + +#: solvespace.cpp:624 +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:692 +#, c-format +msgid "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." +msgstr "" + +#: solvespace.cpp:740 +msgid "Constraint must have a label, and must not be a reference dimension." +msgstr "" + +#: solvespace.cpp:744 +msgid "Bad selection for step dimension; select a constraint." +msgstr "" + +#: solvespace.cpp:768 +msgid "The assembly does not interfere, good." +msgstr "" + +#: solvespace.cpp:784 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:793 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:798 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" + +#: solvespace.cpp:813 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:822 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." +msgstr "" + +#: solvespace.cpp:834 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:854 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:860 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "" + +#: solvespace.cpp:876 +msgid "Bad selection for trace; select a single point." +msgstr "" + +#: solvespace.cpp:899 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "" + +#: solvespace.cpp:929 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:930 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "" + +#: solvespace.cpp:932 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:933 +msgid "The mesh is watertight (okay, valid)." +msgstr "" + +#: solvespace.cpp:936 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" + +#: solvespace.cpp:940 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" + +#: solvespace.cpp:943 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" + +#: solvespace.cpp:956 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" + #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " @@ -1898,14 +2124,9 @@ msgstr "Der Maßstab kann nicht Null oder negativ sein." msgid "Bad format: specify x, y, z" msgstr "Ungültiges Format: geben Sie x, y, z ein" -# solvespace.cpp:557 -#~ msgctxt "title" -#~ msgid "(new sketch)" -#~ msgstr "(Neue Skizze)" - -#~ msgctxt "title" -#~ msgid "Property Browser" -#~ msgstr "Attribut-Browser" +#~ msgctxt "file-type" +#~ msgid "Q3D Object file" +#~ msgstr "Q3D Objektdatei" #~ msgid "Specify between 0 and 8 digits after the decimal." #~ msgstr "Geben Sie 0 bis 8 Ziffern nach dem Dezimalzeichen an." @@ -1983,10 +2204,6 @@ msgstr "Ungültiges Format: geben Sie x, y, z ein" #~ "\n" #~ "Möchten Sie die Änderungen speichern?" -#~ msgctxt "title" -#~ msgid "Modified File" -#~ msgstr "Geänderte Datei" - #~ msgctxt "button" #~ msgid "Do_n't Save" #~ msgstr "Nicht speichern" @@ -2000,10 +2217,6 @@ msgstr "Ungültiges Format: geben Sie x, y, z ein" #~ "\n" #~ "Wollen Sie die automatisch gespeicherte Datei öffnen?" -#~ msgctxt "title" -#~ msgid "Autosave Available" -#~ msgstr "Automatische Speicherdatei verfügbar" - #~ msgctxt "button" #~ msgid "_Load autosave" #~ msgstr "AutoDatei öffnen" diff --git a/res/locales/en_US.po b/res/locales/en_US.po index 485950f47..dbee89616 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -2,12 +2,12 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # Automatically generated, 2017. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-17 20:50-0500\n" +"POT-Creation-Date: 2020-11-22 18:09+0200\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -641,7 +641,7 @@ msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:869 +#: file.cpp:869 solvespace.cpp:537 msgctxt "button" msgid "&Cancel" msgstr "&Cancel" @@ -1564,7 +1564,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -#: platform/gui.cpp:85 platform/gui.cpp:89 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace models" @@ -1601,71 +1601,66 @@ msgstr "Three.js-compatible mesh, mesh only" #: platform/gui.cpp:102 msgctxt "file-type" -msgid "Q3D Object file" -msgstr "Q3D Object file" - -#: platform/gui.cpp:103 -msgctxt "file-type" msgid "VRML text file" msgstr "VRML text file" -#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 msgctxt "file-type" msgid "STEP file" msgstr "STEP file" -#: platform/gui.cpp:111 +#: platform/gui.cpp:110 msgctxt "file-type" msgid "PDF file" msgstr "PDF file" -#: platform/gui.cpp:112 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Encapsulated PostScript" -#: platform/gui.cpp:113 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "Scalable Vector Graphics" -#: platform/gui.cpp:115 platform/gui.cpp:122 +#: platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF file (AutoCAD 2007)" -#: platform/gui.cpp:116 +#: platform/gui.cpp:115 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL file" -#: platform/gui.cpp:117 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:126 +#: platform/gui.cpp:125 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF and DWG files" -#: platform/gui.cpp:130 +#: platform/gui.cpp:129 msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 msgid "untitled" msgstr "untitled" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1555 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "Save File" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1557 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "Open File" @@ -1685,6 +1680,297 @@ msgctxt "button" msgid "_Open" msgstr "_Open" +#: solvespace.cpp:169 +msgctxt "title" +msgid "Autosave Available" +msgstr "Autosave Available" + +#: solvespace.cpp:170 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "An autosave file is available for this sketch." + +#: solvespace.cpp:171 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "Do you want to load the autosave file instead?" + +#: solvespace.cpp:172 +msgctxt "button" +msgid "&Load autosave" +msgstr "&Load autosave" + +#: solvespace.cpp:174 +msgctxt "button" +msgid "Do&n't Load" +msgstr "Do&n't Load" + +#: solvespace.cpp:525 +msgctxt "title" +msgid "Modified File" +msgstr "Modified File" + +#: solvespace.cpp:527 +#, 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:530 +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:533 +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:534 +msgctxt "button" +msgid "&Save" +msgstr "&Save" + +#: solvespace.cpp:536 +msgctxt "button" +msgid "Do&n't Save" +msgstr "Do&n't Save" + +#: solvespace.cpp:557 +msgctxt "title" +msgid "(new sketch)" +msgstr "(new sketch)" + +#: solvespace.cpp:564 +msgctxt "title" +msgid "Property Browser" +msgstr "Property Browser" + +#: solvespace.cpp:624 +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 "" +"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." + +#: solvespace.cpp:692 +#, c-format +msgid "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." +msgstr "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." + +#: solvespace.cpp:740 +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:744 +msgid "Bad selection for step dimension; select a constraint." +msgstr "Bad selection for step dimension; select a constraint." + +#: solvespace.cpp:768 +msgid "The assembly does not interfere, good." +msgstr "The assembly does not interfere, good." + +#: solvespace.cpp:784 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" +"The volume of the solid model is:\n" +"\n" +" %s" + +#: solvespace.cpp:793 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" + +#: solvespace.cpp:798 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." + +#: solvespace.cpp:813 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." + +#: solvespace.cpp:822 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." +msgstr "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." + +#: solvespace.cpp:834 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." + +#: solvespace.cpp:854 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." + +#: solvespace.cpp:860 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "Bad selection for perimeter; select line segments, arcs, and curves." + +#: solvespace.cpp:876 +msgid "Bad selection for trace; select a single point." +msgstr "Bad selection for trace; select a single point." + +#: solvespace.cpp:899 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "Couldn't write to '%s'" + +#: solvespace.cpp:929 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "The mesh is self-intersecting (NOT okay, invalid)." + +#: solvespace.cpp:930 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "The mesh is not self-intersecting (okay, valid)." + +#: solvespace.cpp:932 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "The mesh has naked edges (NOT okay, invalid)." + +#: solvespace.cpp:933 +msgid "The mesh is watertight (okay, valid)." +msgstr "The mesh is watertight (okay, valid)." + +#: solvespace.cpp:936 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." + +#: solvespace.cpp:940 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" + +#: solvespace.cpp:943 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" + +#: solvespace.cpp:956 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" + #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " @@ -1868,10 +2154,6 @@ msgstr "Scale cannot be zero or negative." msgid "Bad format: specify x, y, z" msgstr "Bad format: specify x, y, z" -#~ msgctxt "title" -#~ msgid "(new sketch)" -#~ msgstr "(new sketch)" - -#~ msgctxt "title" -#~ msgid "Property Browser" -#~ msgstr "Property Browser" +#~ msgctxt "file-type" +#~ msgid "Q3D Object file" +#~ msgstr "Q3D Object file" diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index 8bea1a9f8..01429138d 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-17 20:50-0500\n" +"POT-Creation-Date: 2020-11-22 18:09+0200\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" @@ -654,7 +654,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 +#: file.cpp:869 solvespace.cpp:537 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1578,7 +1578,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NOUVEAU COMMENTAIRE - DOUBLE-CLIQUE POUR EDITER" -#: platform/gui.cpp:85 platform/gui.cpp:89 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1615,71 +1615,66 @@ msgstr "" #: platform/gui.cpp:102 msgctxt "file-type" -msgid "Q3D Object file" -msgstr "" - -#: platform/gui.cpp:103 -msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 msgctxt "file-type" msgid "STEP file" msgstr "" -#: platform/gui.cpp:111 +#: platform/gui.cpp:110 msgctxt "file-type" msgid "PDF file" msgstr "" -#: platform/gui.cpp:112 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "" -#: platform/gui.cpp:113 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "" -#: platform/gui.cpp:115 platform/gui.cpp:122 +#: platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/gui.cpp:116 +#: platform/gui.cpp:115 msgctxt "file-type" msgid "HPGL file" msgstr "" -#: platform/gui.cpp:117 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "G Code" msgstr "" -#: platform/gui.cpp:126 +#: platform/gui.cpp:125 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gui.cpp:130 +#: platform/gui.cpp:129 msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 msgid "untitled" msgstr "sans nom" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1555 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "Sauver fichier" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1557 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "Ouvrir Fichier" @@ -1699,6 +1694,236 @@ msgctxt "button" msgid "_Open" msgstr "" +#: solvespace.cpp:169 +msgctxt "title" +msgid "Autosave Available" +msgstr "Sauvegarde automatique existante" + +#: solvespace.cpp:170 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "" + +#: solvespace.cpp:171 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "" + +#: solvespace.cpp:172 +msgctxt "button" +msgid "&Load autosave" +msgstr "" + +#: solvespace.cpp:174 +msgctxt "button" +msgid "Do&n't Load" +msgstr "" + +#: solvespace.cpp:525 +msgctxt "title" +msgid "Modified File" +msgstr "Fichier modifié" + +#: solvespace.cpp:527 +#, c-format +msgctxt "dialog" +msgid "Do you want to save the changes you made to the sketch “%s”?" +msgstr "" + +#: solvespace.cpp:530 +msgctxt "dialog" +msgid "Do you want to save the changes you made to the new sketch?" +msgstr "" + +#: solvespace.cpp:533 +msgctxt "dialog" +msgid "Your changes will be lost if you don't save them." +msgstr "" + +#: solvespace.cpp:534 +msgctxt "button" +msgid "&Save" +msgstr "" + +#: solvespace.cpp:536 +msgctxt "button" +msgid "Do&n't Save" +msgstr "" + +#: solvespace.cpp:557 +msgctxt "title" +msgid "(new sketch)" +msgstr "(nouveau dessin)" + +#: solvespace.cpp:564 +msgctxt "title" +msgid "Property Browser" +msgstr "Navigateur de propriété" + +#: solvespace.cpp:624 +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:692 +#, c-format +msgid "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." +msgstr "" + +#: solvespace.cpp:740 +msgid "Constraint must have a label, and must not be a reference dimension." +msgstr "" + +#: solvespace.cpp:744 +msgid "Bad selection for step dimension; select a constraint." +msgstr "" + +#: solvespace.cpp:768 +msgid "The assembly does not interfere, good." +msgstr "" + +#: solvespace.cpp:784 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:793 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:798 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" + +#: solvespace.cpp:813 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:822 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." +msgstr "" + +#: solvespace.cpp:834 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:854 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:860 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "" + +#: solvespace.cpp:876 +msgid "Bad selection for trace; select a single point." +msgstr "" + +#: solvespace.cpp:899 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "" + +#: solvespace.cpp:929 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:930 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "" + +#: solvespace.cpp:932 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:933 +msgid "The mesh is watertight (okay, valid)." +msgstr "" + +#: solvespace.cpp:936 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" + +#: solvespace.cpp:940 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" + +#: solvespace.cpp:943 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" + +#: solvespace.cpp:956 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" + #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " @@ -1883,14 +2108,6 @@ msgstr "L'échelle ne peut pas être zéro ou négative." msgid "Bad format: specify x, y, z" msgstr "Mauvais format: Spécifiez x, y, z" -#~ msgctxt "title" -#~ msgid "(new sketch)" -#~ msgstr "(nouveau dessin)" - -#~ msgctxt "title" -#~ msgid "Property Browser" -#~ msgstr "Navigateur de propriété" - #~ msgid "Specify between 0 and 8 digits after the decimal." #~ msgstr "Spécifiez entre 0 et 8 chiffres après la virgule." @@ -1967,18 +2184,10 @@ msgstr "Mauvais format: Spécifiez x, y, z" #~ "\n" #~ "Voulez-vous enregistrer les modifications?" -#~ msgctxt "title" -#~ msgid "Modified File" -#~ msgstr "Fichier modifié" - #~ msgctxt "button" #~ msgid "Do_n't Save" #~ msgstr "_Ne pas sauver" -#~ msgctxt "title" -#~ msgid "Autosave Available" -#~ msgstr "Sauvegarde automatique existante" - #~ msgctxt "button" #~ msgid "_Load autosave" #~ msgstr "_Charger la sauvegarde automatique" diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index aa6078eef..9f198e432 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-17 20:50-0500\n" +"POT-Creation-Date: 2020-11-22 18:09+0200\n" "PO-Revision-Date: 2017-04-21 10:29+0700\n" "Last-Translator: evilspirit@evilspirit.org\n" "Language-Team: EvilSpirit\n" @@ -648,7 +648,7 @@ msgctxt "button" msgid "&No" msgstr "Нет" -#: file.cpp:869 +#: file.cpp:869 solvespace.cpp:537 msgctxt "button" msgid "&Cancel" msgstr "Отменить" @@ -1581,7 +1581,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "КОММЕНТАРИЙ -- ДВОЙНОЙ ЩЕЛЧОК ДЛЯ РЕДАКТИРОВАНИЯ" -#: platform/gui.cpp:85 platform/gui.cpp:89 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 msgctxt "file-type" msgid "SolveSpace models" msgstr "проекты SolveSpace" @@ -1618,71 +1618,66 @@ msgstr "Three.js-совместимая полигональная сетка" #: platform/gui.cpp:102 msgctxt "file-type" -msgid "Q3D Object file" -msgstr "" - -#: platform/gui.cpp:103 -msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 msgctxt "file-type" msgid "STEP file" msgstr "STEP файл" -#: platform/gui.cpp:111 +#: platform/gui.cpp:110 msgctxt "file-type" msgid "PDF file" msgstr "PDF документ" -#: platform/gui.cpp:112 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Encapsulated PostScript" -#: platform/gui.cpp:113 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "SVG изображение" -#: platform/gui.cpp:115 platform/gui.cpp:122 +#: platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF файл (AutoCAD 2007)" -#: platform/gui.cpp:116 +#: platform/gui.cpp:115 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL файл" -#: platform/gui.cpp:117 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:126 +#: platform/gui.cpp:125 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF и DWG файлы" -#: platform/gui.cpp:130 +#: platform/gui.cpp:129 msgctxt "file-type" msgid "Comma-separated values" msgstr "CSV файлы (значения, разделенные запятой)" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 msgid "untitled" msgstr "без имени" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1555 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "Сохранить Файл" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1557 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "Открыть Файл" @@ -1702,6 +1697,236 @@ msgctxt "button" msgid "_Open" msgstr "" +#: solvespace.cpp:169 +msgctxt "title" +msgid "Autosave Available" +msgstr "Автосохранение Доступно" + +#: solvespace.cpp:170 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "" + +#: solvespace.cpp:171 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "" + +#: solvespace.cpp:172 +msgctxt "button" +msgid "&Load autosave" +msgstr "" + +#: solvespace.cpp:174 +msgctxt "button" +msgid "Do&n't Load" +msgstr "" + +#: solvespace.cpp:525 +msgctxt "title" +msgid "Modified File" +msgstr "Измененный Файл" + +#: solvespace.cpp:527 +#, c-format +msgctxt "dialog" +msgid "Do you want to save the changes you made to the sketch “%s”?" +msgstr "" + +#: solvespace.cpp:530 +msgctxt "dialog" +msgid "Do you want to save the changes you made to the new sketch?" +msgstr "" + +#: solvespace.cpp:533 +msgctxt "dialog" +msgid "Your changes will be lost if you don't save them." +msgstr "" + +#: solvespace.cpp:534 +msgctxt "button" +msgid "&Save" +msgstr "" + +#: solvespace.cpp:536 +msgctxt "button" +msgid "Do&n't Save" +msgstr "" + +#: solvespace.cpp:557 +msgctxt "title" +msgid "(new sketch)" +msgstr "(новый проект)" + +#: solvespace.cpp:564 +msgctxt "title" +msgid "Property Browser" +msgstr "Браузер" + +#: solvespace.cpp:624 +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:692 +#, c-format +msgid "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." +msgstr "" + +#: solvespace.cpp:740 +msgid "Constraint must have a label, and must not be a reference dimension." +msgstr "" + +#: solvespace.cpp:744 +msgid "Bad selection for step dimension; select a constraint." +msgstr "" + +#: solvespace.cpp:768 +msgid "The assembly does not interfere, good." +msgstr "" + +#: solvespace.cpp:784 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:793 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:798 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" + +#: solvespace.cpp:813 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:822 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." +msgstr "" + +#: solvespace.cpp:834 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:854 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:860 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "" + +#: solvespace.cpp:876 +msgid "Bad selection for trace; select a single point." +msgstr "" + +#: solvespace.cpp:899 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "" + +#: solvespace.cpp:929 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:930 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "" + +#: solvespace.cpp:932 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:933 +msgid "The mesh is watertight (okay, valid)." +msgstr "" + +#: solvespace.cpp:936 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" + +#: solvespace.cpp:940 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" + +#: solvespace.cpp:943 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" + +#: solvespace.cpp:956 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" + #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " @@ -1885,14 +2110,6 @@ msgstr "Масштабный коэффициент не может быть н msgid "Bad format: specify x, y, z" msgstr "Неверный формат: введите данные как x, y, z" -#~ msgctxt "title" -#~ msgid "(new sketch)" -#~ msgstr "(новый проект)" - -#~ msgctxt "title" -#~ msgid "Property Browser" -#~ msgstr "Браузер" - #~ msgid "Specify between 0 and 8 digits after the decimal." #~ msgstr "Введите число от 0 до 8." @@ -1970,10 +2187,6 @@ msgstr "Неверный формат: введите данные как x, y, #~ "\n" #~ "Хотите сохранить их?" -#~ msgctxt "title" -#~ msgid "Modified File" -#~ msgstr "Измененный Файл" - #~ msgctxt "button" #~ msgid "Do_n't Save" #~ msgstr "Не Сохранять" @@ -1987,10 +2200,6 @@ msgstr "Неверный формат: введите данные как x, y, #~ "\n" #~ "Хотите загрузить их вместо открываемого файла?" -#~ msgctxt "title" -#~ msgid "Autosave Available" -#~ msgstr "Автосохранение Доступно" - #~ msgctxt "button" #~ msgid "_Load autosave" #~ msgstr "Загрузить Автосохранение" diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index e98706644..cb2cd2df0 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-17 20:50-0500\n" +"POT-Creation-Date: 2020-11-22 18:09+0200\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: appsoft@ua.fm\n" "Language-Team: OpenOrienteeringUkraine\n" @@ -528,7 +528,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 +#: file.cpp:869 solvespace.cpp:537 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1388,7 +1388,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" -#: platform/gui.cpp:85 platform/gui.cpp:89 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1425,71 +1425,66 @@ msgstr "" #: platform/gui.cpp:102 msgctxt "file-type" -msgid "Q3D Object file" -msgstr "" - -#: platform/gui.cpp:103 -msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 msgctxt "file-type" msgid "STEP file" msgstr "" -#: platform/gui.cpp:111 +#: platform/gui.cpp:110 msgctxt "file-type" msgid "PDF file" msgstr "" -#: platform/gui.cpp:112 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "" -#: platform/gui.cpp:113 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "" -#: platform/gui.cpp:115 platform/gui.cpp:122 +#: platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/gui.cpp:116 +#: platform/gui.cpp:115 msgctxt "file-type" msgid "HPGL file" msgstr "" -#: platform/gui.cpp:117 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "G Code" msgstr "" -#: platform/gui.cpp:126 +#: platform/gui.cpp:125 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gui.cpp:130 +#: platform/gui.cpp:129 msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 msgid "untitled" msgstr "" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1555 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1557 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "" @@ -1509,6 +1504,236 @@ msgctxt "button" msgid "_Open" msgstr "" +#: solvespace.cpp:169 +msgctxt "title" +msgid "Autosave Available" +msgstr "" + +#: solvespace.cpp:170 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "" + +#: solvespace.cpp:171 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "" + +#: solvespace.cpp:172 +msgctxt "button" +msgid "&Load autosave" +msgstr "" + +#: solvespace.cpp:174 +msgctxt "button" +msgid "Do&n't Load" +msgstr "" + +#: solvespace.cpp:525 +msgctxt "title" +msgid "Modified File" +msgstr "" + +#: solvespace.cpp:527 +#, c-format +msgctxt "dialog" +msgid "Do you want to save the changes you made to the sketch “%s”?" +msgstr "" + +#: solvespace.cpp:530 +msgctxt "dialog" +msgid "Do you want to save the changes you made to the new sketch?" +msgstr "" + +#: solvespace.cpp:533 +msgctxt "dialog" +msgid "Your changes will be lost if you don't save them." +msgstr "" + +#: solvespace.cpp:534 +msgctxt "button" +msgid "&Save" +msgstr "" + +#: solvespace.cpp:536 +msgctxt "button" +msgid "Do&n't Save" +msgstr "" + +#: solvespace.cpp:557 +msgctxt "title" +msgid "(new sketch)" +msgstr "" + +#: solvespace.cpp:564 +msgctxt "title" +msgid "Property Browser" +msgstr "" + +#: solvespace.cpp:624 +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:692 +#, c-format +msgid "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." +msgstr "" + +#: solvespace.cpp:740 +msgid "Constraint must have a label, and must not be a reference dimension." +msgstr "" + +#: solvespace.cpp:744 +msgid "Bad selection for step dimension; select a constraint." +msgstr "" + +#: solvespace.cpp:768 +msgid "The assembly does not interfere, good." +msgstr "" + +#: solvespace.cpp:784 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:793 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:798 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" + +#: solvespace.cpp:813 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:822 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." +msgstr "" + +#: solvespace.cpp:834 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:854 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:860 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "" + +#: solvespace.cpp:876 +msgid "Bad selection for trace; select a single point." +msgstr "" + +#: solvespace.cpp:899 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "" + +#: solvespace.cpp:929 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:930 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "" + +#: solvespace.cpp:932 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:933 +msgid "The mesh is watertight (okay, valid)." +msgstr "" + +#: solvespace.cpp:936 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" + +#: solvespace.cpp:940 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" + +#: solvespace.cpp:943 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" + +#: solvespace.cpp:956 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" + #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index a2e1b454f..61984ad3d 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -2,12 +2,12 @@ # Copyright (C) 2020 the PACKAGE authors # This file is distributed under the same license as the SolveSpace package. # , 2020. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-17 20:50-0500\n" +"POT-Creation-Date: 2020-11-22 18:09+0200\n" "PO-Revision-Date: 2020-09-28 12:42+0800\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" @@ -606,7 +606,7 @@ msgctxt "button" msgid "&No" msgstr "否(&N)" -#: file.cpp:869 +#: file.cpp:869 solvespace.cpp:537 msgctxt "button" msgid "&Cancel" msgstr "取消(&C)" @@ -1475,7 +1475,7 @@ msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "新备注 - 双击编辑" -#: platform/gui.cpp:85 platform/gui.cpp:89 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace模型" @@ -1512,71 +1512,66 @@ msgstr "Three.js-仅网格" #: platform/gui.cpp:102 msgctxt "file-type" -msgid "Q3D Object file" -msgstr "Q3D对象文件" - -#: platform/gui.cpp:103 -msgctxt "file-type" msgid "VRML text file" msgstr "VRML文本文件" -#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 msgctxt "file-type" msgid "STEP file" msgstr "STEP文件" -#: platform/gui.cpp:111 +#: platform/gui.cpp:110 msgctxt "file-type" msgid "PDF file" msgstr "PDF文件" -#: platform/gui.cpp:112 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "封装好的PostScript" -#: platform/gui.cpp:113 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "SVG矢量图" -#: platform/gui.cpp:115 platform/gui.cpp:122 +#: platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF文件(AutoCAD 2007)" -#: platform/gui.cpp:116 +#: platform/gui.cpp:115 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL文件" -#: platform/gui.cpp:117 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:126 +#: platform/gui.cpp:125 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF/DWG文件" -#: platform/gui.cpp:130 +#: platform/gui.cpp:129 msgctxt "file-type" msgid "Comma-separated values" msgstr "逗号分隔数据" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 msgid "untitled" msgstr "未命名" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1555 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "保存文件" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1557 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "打开文件" @@ -1596,6 +1591,236 @@ msgctxt "button" msgid "_Open" msgstr "打开_O" +#: solvespace.cpp:169 +msgctxt "title" +msgid "Autosave Available" +msgstr "" + +#: solvespace.cpp:170 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "" + +#: solvespace.cpp:171 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "" + +#: solvespace.cpp:172 +msgctxt "button" +msgid "&Load autosave" +msgstr "" + +#: solvespace.cpp:174 +msgctxt "button" +msgid "Do&n't Load" +msgstr "" + +#: solvespace.cpp:525 +msgctxt "title" +msgid "Modified File" +msgstr "" + +#: solvespace.cpp:527 +#, c-format +msgctxt "dialog" +msgid "Do you want to save the changes you made to the sketch “%s”?" +msgstr "" + +#: solvespace.cpp:530 +msgctxt "dialog" +msgid "Do you want to save the changes you made to the new sketch?" +msgstr "" + +#: solvespace.cpp:533 +msgctxt "dialog" +msgid "Your changes will be lost if you don't save them." +msgstr "" + +#: solvespace.cpp:534 +msgctxt "button" +msgid "&Save" +msgstr "" + +#: solvespace.cpp:536 +msgctxt "button" +msgid "Do&n't Save" +msgstr "" + +#: solvespace.cpp:557 +msgctxt "title" +msgid "(new sketch)" +msgstr "" + +#: solvespace.cpp:564 +msgctxt "title" +msgid "Property Browser" +msgstr "" + +#: solvespace.cpp:624 +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:692 +#, c-format +msgid "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." +msgstr "" + +#: solvespace.cpp:740 +msgid "Constraint must have a label, and must not be a reference dimension." +msgstr "" + +#: solvespace.cpp:744 +msgid "Bad selection for step dimension; select a constraint." +msgstr "" + +#: solvespace.cpp:768 +msgid "The assembly does not interfere, good." +msgstr "" + +#: solvespace.cpp:784 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:793 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:798 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" + +#: solvespace.cpp:813 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:822 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." +msgstr "" + +#: solvespace.cpp:834 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:854 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:860 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "" + +#: solvespace.cpp:876 +msgid "Bad selection for trace; select a single point." +msgstr "" + +#: solvespace.cpp:899 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "" + +#: solvespace.cpp:929 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:930 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "" + +#: solvespace.cpp:932 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:933 +msgid "The mesh is watertight (okay, valid)." +msgstr "" + +#: solvespace.cpp:936 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" + +#: solvespace.cpp:940 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" + +#: solvespace.cpp:943 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" + +#: solvespace.cpp:956 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" + #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " @@ -1776,3 +2001,7 @@ msgstr "缩放不能为零。" #: view.cpp:90 view.cpp:99 msgid "Bad format: specify x, y, z" msgstr "格式错误: 需指定 x, y, z" + +#~ msgctxt "file-type" +#~ msgid "Q3D Object file" +#~ msgstr "Q3D对象文件" diff --git a/res/messages.pot b/res/messages.pot index 7f025001c..8bb0e2ade 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-17 20:50-0500\n" +"POT-Creation-Date: 2020-11-22 18:09+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -506,7 +506,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 +#: file.cpp:869 solvespace.cpp:537 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1350,7 +1350,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" -#: platform/gui.cpp:85 platform/gui.cpp:89 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1387,71 +1387,66 @@ msgstr "" #: platform/gui.cpp:102 msgctxt "file-type" -msgid "Q3D Object file" -msgstr "" - -#: platform/gui.cpp:103 -msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:107 platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 msgctxt "file-type" msgid "STEP file" msgstr "" -#: platform/gui.cpp:111 +#: platform/gui.cpp:110 msgctxt "file-type" msgid "PDF file" msgstr "" -#: platform/gui.cpp:112 +#: platform/gui.cpp:111 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "" -#: platform/gui.cpp:113 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "" -#: platform/gui.cpp:115 platform/gui.cpp:122 +#: platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/gui.cpp:116 +#: platform/gui.cpp:115 msgctxt "file-type" msgid "HPGL file" msgstr "" -#: platform/gui.cpp:117 +#: platform/gui.cpp:116 msgctxt "file-type" msgid "G Code" msgstr "" -#: platform/gui.cpp:126 +#: platform/gui.cpp:125 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gui.cpp:130 +#: platform/gui.cpp:129 msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1608 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 msgid "untitled" msgstr "" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1555 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1557 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "" @@ -1471,6 +1466,233 @@ msgctxt "button" msgid "_Open" msgstr "" +#: solvespace.cpp:169 +msgctxt "title" +msgid "Autosave Available" +msgstr "" + +#: solvespace.cpp:170 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "" + +#: solvespace.cpp:171 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "" + +#: solvespace.cpp:172 +msgctxt "button" +msgid "&Load autosave" +msgstr "" + +#: solvespace.cpp:174 +msgctxt "button" +msgid "Do&n't Load" +msgstr "" + +#: solvespace.cpp:525 +msgctxt "title" +msgid "Modified File" +msgstr "" + +#: solvespace.cpp:527 +#, c-format +msgctxt "dialog" +msgid "Do you want to save the changes you made to the sketch “%s”?" +msgstr "" + +#: solvespace.cpp:530 +msgctxt "dialog" +msgid "Do you want to save the changes you made to the new sketch?" +msgstr "" + +#: solvespace.cpp:533 +msgctxt "dialog" +msgid "Your changes will be lost if you don't save them." +msgstr "" + +#: solvespace.cpp:534 +msgctxt "button" +msgid "&Save" +msgstr "" + +#: solvespace.cpp:536 +msgctxt "button" +msgid "Do&n't Save" +msgstr "" + +#: solvespace.cpp:557 +msgctxt "title" +msgid "(new sketch)" +msgstr "" + +#: solvespace.cpp:564 +msgctxt "title" +msgid "Property Browser" +msgstr "" + +#: solvespace.cpp:624 +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:692 +#, c-format +msgid "Can't identify file type from file extension of filename '%s'; try .dxf or .dwg." +msgstr "" + +#: solvespace.cpp:740 +msgid "Constraint must have a label, and must not be a reference dimension." +msgstr "" + +#: solvespace.cpp:744 +msgid "Bad selection for step dimension; select a constraint." +msgstr "" + +#: solvespace.cpp:768 +msgid "The assembly does not interfere, good." +msgstr "" + +#: solvespace.cpp:784 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:793 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" + +#: solvespace.cpp:798 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" + +#: solvespace.cpp:813 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:822 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, not coplanar, or self-" +"intersecting." +msgstr "" + +#: solvespace.cpp:834 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:854 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" + +#: solvespace.cpp:860 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "" + +#: solvespace.cpp:876 +msgid "Bad selection for trace; select a single point." +msgstr "" + +#: solvespace.cpp:899 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "" + +#: solvespace.cpp:929 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:930 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "" + +#: solvespace.cpp:932 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "" + +#: solvespace.cpp:933 +msgid "The mesh is watertight (okay, valid)." +msgstr "" + +#: solvespace.cpp:936 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" + +#: solvespace.cpp:940 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" + +#: solvespace.cpp:943 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" + +#: solvespace.cpp:956 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" + #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try assigning a style to this " diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d6b13523d..4f277f535 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -238,7 +238,8 @@ if(HAVE_GETTEXT) set(inputs ${solvespace_core_SOURCES} ${solvespace_core_HEADERS} - ${every_platform_SOURCES}) + ${every_platform_SOURCES} + ${solvespace_core_gl_SOURCES}) set(templ_po ${CMAKE_CURRENT_BINARY_DIR}/../res/messages.po) From d698d5ee2205411f74ab63bc5aa11e64e2caf0cf Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 22 Nov 2020 19:58:46 +0200 Subject: [PATCH 184/646] Win32: Mouse wheel zooming always remains properly centered On scroll wheel events convert the mouse coordinates from screen to client area so that scroll wheel zooming remains centered irrespective of the window position. Fixes https://github.com/solvespace/solvespace/issues/806 --- src/platform/guiwin.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index 43e7a59af..cfa4b7ea8 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -907,8 +907,8 @@ class WindowImplWin32 final : public Window { // Make the mousewheel work according to which window the mouse is // over, not according to which window is active. POINT pt; - pt.x = LOWORD(lParam); - pt.y = HIWORD(lParam); + pt.x = GET_X_LPARAM(lParam); + pt.y = GET_Y_LPARAM(lParam); HWND hWindowUnderMouse; sscheck(hWindowUnderMouse = WindowFromPoint(pt)); if(hWindowUnderMouse && hWindowUnderMouse != h) { @@ -917,6 +917,13 @@ class WindowImplWin32 final : public Window { break; } + // Convert the mouse coordinates from screen to client area so that + // scroll wheel zooming remains centered irrespective of the window + // position. + ScreenToClient(hWindowUnderMouse, &pt); + event.x = pt.x / pixelRatio; + event.y = pt.y / pixelRatio; + event.type = MouseEvent::Type::SCROLL_VERT; event.scrollDelta = GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? 1 : -1; break; From f4ef943b08f7e8497a882d82b5d6610c6547cc44 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 21 Nov 2020 19:16:45 -0500 Subject: [PATCH 185/646] Make better choices of SI units by considering order. --- src/solvespace.cpp | 46 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 7c30a8f52..9b3ef9b34 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -341,13 +341,39 @@ static const char *DimToString(int dim) { default: ssassert(false, "Unexpected dimension"); } } -static std::pair SelectSIPrefixMm(int deg) { - if(deg >= 3) return { 3, "km" }; - else if(deg >= 0) return { 0, "m" }; - else if(deg >= -2) return { -2, "cm" }; - else if(deg >= -3) return { -3, "mm" }; - else if(deg >= -6) return { -6, "µm" }; - else return { -9, "nm" }; +static std::pair SelectSIPrefixMm(int ord, int dim) { +// decide what units to use depending on the order of magnitude of the +// measure in meters and the dimmension (1,2,3 lenear, area, volume) + switch(dim) { + case 0: + case 1: + if(ord >= 3) return { 3, "km" }; + else if(ord >= 0) return { 0, "m" }; + else if(ord >= -2) return { -2, "cm" }; + else if(ord >= -3) return { -3, "mm" }; + else if(ord >= -6) return { -6, "µm" }; + else return { -9, "nm" }; + break; + case 2: + if(ord >= 5) return { 3, "km" }; + else if(ord >= 0) return { 0, "m" }; + else if(ord >= -2) return { -2, "cm" }; + else if(ord >= -6) return { -3, "mm" }; + else if(ord >= -13) return { -6, "µm" }; + else return { -9, "nm" }; + break; + case 3: + if(ord >= 7) return { 3, "km" }; + else if(ord >= 0) return { 0, "m" }; + else if(ord >= -5) return { -2, "cm" }; + else if(ord >= -11) return { -3, "mm" }; + else return { -6, "µm" }; + break; + default: + dbp ("dimensions over 3 not supported"); + break; + } + return {0, "m"}; } static std::pair SelectSIPrefixInch(int deg) { if(deg >= 0) return { 0, "in" }; @@ -363,14 +389,14 @@ std::string SolveSpaceUI::MmToStringSI(double v, int dim) { } v /= pow((viewUnits == Unit::INCHES) ? 25.4 : 1000, dim); - int vdeg = (int)((log10(fabs(v))) / dim); + int vdeg = (int)(log10(fabs(v))); std::string unit; if(fabs(v) > 0.0) { int sdeg = 0; std::tie(sdeg, unit) = (viewUnits == Unit::INCHES) - ? SelectSIPrefixInch(vdeg) - : SelectSIPrefixMm(vdeg); + ? SelectSIPrefixInch(vdeg/dim) + : SelectSIPrefixMm(vdeg, dim); v /= pow(10.0, sdeg * dim); } int pdeg = (int)ceil(log10(fabs(v) + 1e-10)); From a09c4af802d16474af5e8b33e05790f018b0f329 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 22 Nov 2020 17:30:41 -0500 Subject: [PATCH 186/646] Update contour_area test image to match the change in displayed units. --- test/analysis/contour_area/normal.png | Bin 4787 -> 4818 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/analysis/contour_area/normal.png b/test/analysis/contour_area/normal.png index 486fcdc4102cb485be2fb3f83264897aada4eeae..3b50df9cdc701d6b1986b47b6f2c0fb7f5543e68 100644 GIT binary patch literal 4818 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 literal 4787 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 JMTgLr{tFoz=urRw From 60819995b3f15bee12f9f45a9b6dd4065b797955 Mon Sep 17 00:00:00 2001 From: Reini Urban Date: Mon, 23 Nov 2020 08:02:32 +0100 Subject: [PATCH 187/646] Translations: update de_DE for the solvespace.cpp changes. Run make -C src translate_solvespace for updated line numbers for the rest. --- res/locales/de_DE.po | 200 +++++++++++++++++++++++++++++-------------- res/locales/en_US.po | 76 ++++++++-------- res/locales/fr_FR.po | 74 ++++++++-------- res/locales/ru_RU.po | 74 ++++++++-------- res/locales/uk_UA.po | 74 ++++++++-------- res/locales/zh_CN.po | 76 ++++++++-------- res/messages.pot | 74 ++++++++-------- 7 files changed, 360 insertions(+), 288 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index 846861fb1..795f92202 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-22 18:09+0200\n" +"POT-Creation-Date: 2020-11-23 11:23+0200\n" "PO-Revision-Date: 2018-07-19 06:55+0000\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" @@ -660,7 +660,7 @@ msgctxt "button" msgid "&No" msgstr "&Nein" -#: file.cpp:869 solvespace.cpp:537 +#: file.cpp:869 solvespace.cpp:563 msgctxt "button" msgid "&Cancel" msgstr "&Abbrechen" @@ -1320,7 +1320,7 @@ msgstr "" #: group.cpp:217 msgctxt "group-name" msgid "revolve" -msgstr "" +msgstr "Revolve" #: group.cpp:222 msgid "Helix operation can only be applied to planar sketches." @@ -1334,11 +1334,17 @@ msgid "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" msgstr "" +"Ungültige Auswahl für eine neue Helix Gruppe. Diese Gruppe kann erzeugt " +"werden mit:\n" +"\n" +" * einem Punkt und einem Liniensegment oder Normale (gedreht um eine " +"Achse parallel zu Linie / Normale, durch Punkt)\n" +" * einem Liniensegment (gedreht um Liniensegment)\n" #: group.cpp:245 msgctxt "group-name" msgid "helix" -msgstr "" +msgstr "Helix" #: group.cpp:258 msgid "" @@ -1349,12 +1355,12 @@ msgid "" " * a point and a line or a normal (rotate about an axis through the " "point, and parallel to line / normal)\n" msgstr "" -"Ungültige Auswahl für neue Rotation Diese Gruppe kann erstellt werden mit:\n" +"Ungültige Auswahl für neue Rotation. Diese Gruppe kann erstellt werden mit:\n" "\n" -" * einem Punkt in vorgegebener Arbeitsebene (in der Ebene um den Punkt " -"drehen)\n" -" * einem Punkt und einer Linie oder einer Normale (um eine Achse durch " -"den Punkt drehen, parallel zur Linie / Normale)\n" +" * einem Punkt in vorgegebener Arbeitsebene (gedreht in der Ebene um den " +"Punkt)\n" +" * einem Punkt und einer Linie oder einer Normale (gedreht um eine Achse " +"durch den Punkt, parallel zur Linie / Normale)\n" #: group.cpp:271 msgctxt "group-name" @@ -1592,7 +1598,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEUER KOMMENTAR -- DOPPELKLICKEN ZUM BEARBEITEN" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace-Modelle" @@ -1600,7 +1606,7 @@ msgstr "SolveSpace-Modelle" #: platform/gui.cpp:90 msgctxt "file-type" msgid "IDF circuit board" -msgstr "" +msgstr "IDF Leiterplatte" #: platform/gui.cpp:94 msgctxt "file-type" @@ -1677,18 +1683,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Werte durch Komma getrennt (CSV)" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 msgid "untitled" msgstr "unbenannt" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1562 msgctxt "title" msgid "Save File" msgstr "Datei speichern" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1564 msgctxt "title" msgid "Open File" msgstr "Datei öffnen" @@ -1706,110 +1712,122 @@ msgstr "_Speichern" #: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 msgctxt "button" msgid "_Open" -msgstr "" +msgstr "_Öffnen" #: solvespace.cpp:169 msgctxt "title" msgid "Autosave Available" -msgstr "Automatische Speicherdatei verfügbar" +msgstr "Automatische Sicherungsdatei verfügbar" #: solvespace.cpp:170 msgctxt "dialog" msgid "An autosave file is available for this sketch." -msgstr "" +msgstr "Eine automatische Sicherung ist für diese Skizze verfügbar." #: solvespace.cpp:171 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" -msgstr "" +msgstr "Wollen Sie die automatische Sicherungsdatei stattdessen laden?" #: solvespace.cpp:172 msgctxt "button" msgid "&Load autosave" -msgstr "" +msgstr "AutoDatei &öffnen" #: solvespace.cpp:174 msgctxt "button" msgid "Do&n't Load" -msgstr "" +msgstr "&Nicht laden" -#: solvespace.cpp:525 +#: solvespace.cpp:551 msgctxt "title" msgid "Modified File" msgstr "Geänderte Datei" -#: solvespace.cpp:527 +#: solvespace.cpp:553 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" -msgstr "" +msgstr "Wollen Sie die Änderungen an der Skizze “%s” sichern?" -#: solvespace.cpp:530 +#: solvespace.cpp:556 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" -msgstr "" +msgstr "Wollen Sie die Änderungen an der Skizze sichern?" -#: solvespace.cpp:533 +#: solvespace.cpp:559 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." -msgstr "" +msgstr "Ihre Änderungen werden verworfen, wenn sie nicht abgespeichert werden." -#: solvespace.cpp:534 +#: solvespace.cpp:560 msgctxt "button" msgid "&Save" -msgstr "" +msgstr "&Sichern" -#: solvespace.cpp:536 +#: solvespace.cpp:562 msgctxt "button" msgid "Do&n't Save" -msgstr "" +msgstr "&Verwerfen" # solvespace.cpp:557 -#: solvespace.cpp:557 +#: solvespace.cpp:583 msgctxt "title" msgid "(new sketch)" msgstr "(Neue Skizze)" -#: solvespace.cpp:564 +#: solvespace.cpp:590 msgctxt "title" msgid "Property Browser" msgstr "Attribut-Browser" -#: solvespace.cpp:624 +#: solvespace.cpp:650 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 "" +"Einschränkungen sind momentan sichtbar und werden exportiert. Das wollen Sie " +"wahrscheinlich nicht. Verstecken Sie sie in dem auf den Link oben im " +"Textfenster klicken." -#: solvespace.cpp:692 +#: solvespace.cpp:718 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" +"Kann den Dateityp der Datei '%s' nicht auf Grund der Dateierweiterung " +"erkennen. Versuchen Sie .dxf oder .dwg." -#: solvespace.cpp:740 +#: solvespace.cpp:766 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:744 +#: solvespace.cpp:770 msgid "Bad selection for step dimension; select a constraint." msgstr "" +"Falsche Auswahl für die Schrittdimensionierung. Wählen Sie eine " +"Einschränkung." -#: solvespace.cpp:768 +#: solvespace.cpp:794 msgid "The assembly does not interfere, good." -msgstr "" +msgstr "Der Zusammenbau funktioniert, gut." -#: solvespace.cpp:784 +#: solvespace.cpp:810 #, c-format msgid "" "The volume of the solid model is:\n" "\n" " %s" msgstr "" +"Das Volumen des Modell ist:\n" +"\n" +" %s" -#: solvespace.cpp:793 +#: solvespace.cpp:819 #, c-format msgid "" "\n" @@ -1817,16 +1835,24 @@ msgid "" "\n" " %s" msgstr "" +"\n" +"Das Volumen des Netz der aktiven Gruppe ist:\n" +"\n" +" %s" -#: solvespace.cpp:798 +#: solvespace.cpp:824 msgid "" "\n" "\n" "Curved surfaces have been approximated as triangles.\n" "This introduces error, typically of around 1%." msgstr "" +"\n" +"\n" +"Gekrümmte Flächen wurden als Dreiecksnetz angenähert.\n" +"Das verursacht Fehler, typischerweise um 1%." -#: solvespace.cpp:813 +#: solvespace.cpp:839 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1836,14 +1862,22 @@ msgid "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." msgstr "" +"Die Fläche der ausgewählten Flächen ist:\n" +"\n" +" %s\n" +"\n" +"Kurven wurden als gerade Linienstücke angenähert.\n" +"Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:822 +#: solvespace.cpp:848 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" +"Diese Gruppe beinhaltet keine korrekt geschlossene 2D Fläche. Sie ist offen, " +"nicht koplanar, oder überschneidet sich selbst." -#: solvespace.cpp:834 +#: solvespace.cpp:860 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1853,8 +1887,14 @@ msgid "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." msgstr "" +"Die Summe der Flächen in dieser Gruppe ist:\n" +"\n" +" %s\n" +"\n" +"Kurven wurden als gerade Linienstücke angenähert.\n" +"Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:854 +#: solvespace.cpp:880 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1864,45 +1904,54 @@ msgid "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." msgstr "" +"Die Gesamtlänge der ausgwählten Elemente ist:\n" +"\n" +" %s\n" +"\n" +"Kurven wurden als gerade Linienstücke angenähert.\n" +"Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:860 +#: solvespace.cpp:886 msgid "Bad selection for perimeter; select line segments, arcs, and curves." -msgstr "" +msgstr "Falsche Auswahl für Umfang. Wähle Liniensegmente, Bögen und Kurven." -#: solvespace.cpp:876 +#: solvespace.cpp:902 msgid "Bad selection for trace; select a single point." -msgstr "" +msgstr "Falsche Auswahl für Punkt nachzeichnen. Wähle einen einzelnen Punkt." -#: solvespace.cpp:899 +#: solvespace.cpp:925 #, c-format msgid "Couldn't write to '%s'" -msgstr "" +msgstr "Konnte '%s' nicht schreiben" -#: solvespace.cpp:929 +#: solvespace.cpp:955 msgid "The mesh is self-intersecting (NOT okay, invalid)." -msgstr "" +msgstr "Das Netz schneidet sich selbst: Falsch, ungültig." -#: solvespace.cpp:930 +#: solvespace.cpp:956 msgid "The mesh is not self-intersecting (okay, valid)." -msgstr "" +msgstr "Das Netz schneidet sich nicht: Gut, gültig." -#: solvespace.cpp:932 +#: solvespace.cpp:958 msgid "The mesh has naked edges (NOT okay, invalid)." -msgstr "" +msgstr "Das Netz hat lose Kanten: Falsch, ungültig." -#: solvespace.cpp:933 +#: solvespace.cpp:959 msgid "The mesh is watertight (okay, valid)." -msgstr "" +msgstr "Das Netz hat keine lose Kanten: Gut, gültig." -#: solvespace.cpp:936 +#: solvespace.cpp:962 #, c-format msgid "" "\n" "\n" "The model contains %d triangles, from %d surfaces." msgstr "" +"\n" +"\n" +"Das Modell hat %d Dreiecke, von %d Flächen." -#: solvespace.cpp:940 +#: solvespace.cpp:966 #, c-format msgid "" "%s\n" @@ -1911,8 +1960,13 @@ msgid "" "\n" "Zero problematic edges, good.%s" msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"Keine problematischen Kanten, gut.%s" -#: solvespace.cpp:943 +#: solvespace.cpp:969 #, c-format msgid "" "%s\n" @@ -1921,8 +1975,13 @@ msgid "" "\n" "%d problematic edges, bad.%s" msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematische Kanten, schlecht.%s" -#: solvespace.cpp:956 +#: solvespace.cpp:982 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1938,6 +1997,19 @@ msgid "" "\n" "© 2008-%d Jonathan Westhues and other authors.\n" msgstr "" +"Das ist SolveSpace version %s.\n" +"\n" +"Für mehr Information siehe http://solvespace.com/\n" +"\n" +"SolveSpace ist freie Software: Sie steht Ihnen frei sie zu ändern\n" +"und/oder zu vervielfältigen unter der Auflage der GNU\n" +"General Public License (GPL) Version 3 oder späterer Versionen.\n" +"\n" +"Es besteht keinerlei Gewährleistung und Haftung für das Programm, soweit " +"dies gesetzlich zulässig ist.\n" +"Für Details siehe http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues und andere.\n" #: style.cpp:166 msgid "" diff --git a/res/locales/en_US.po b/res/locales/en_US.po index dbee89616..01c4b432d 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -2,12 +2,12 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # Automatically generated, 2017. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-22 18:09+0200\n" +"POT-Creation-Date: 2020-11-23 07:36+0100\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -641,7 +641,7 @@ msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:869 solvespace.cpp:537 +#: file.cpp:869 solvespace.cpp:563 msgctxt "button" msgid "&Cancel" msgstr "&Cancel" @@ -1564,7 +1564,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace models" @@ -1649,18 +1649,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 msgid "untitled" msgstr "untitled" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1562 msgctxt "title" msgid "Save File" msgstr "Save File" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1564 msgctxt "title" msgid "Open File" msgstr "Open File" @@ -1705,48 +1705,48 @@ msgctxt "button" msgid "Do&n't Load" msgstr "Do&n't Load" -#: solvespace.cpp:525 +#: solvespace.cpp:551 msgctxt "title" msgid "Modified File" msgstr "Modified File" -#: solvespace.cpp:527 +#: solvespace.cpp:553 #, 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:530 +#: solvespace.cpp:556 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:533 +#: solvespace.cpp:559 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:534 +#: solvespace.cpp:560 msgctxt "button" msgid "&Save" msgstr "&Save" -#: solvespace.cpp:536 +#: solvespace.cpp:562 msgctxt "button" msgid "Do&n't Save" msgstr "Do&n't Save" -#: solvespace.cpp:557 +#: solvespace.cpp:583 msgctxt "title" msgid "(new sketch)" msgstr "(new sketch)" -#: solvespace.cpp:564 +#: solvespace.cpp:590 msgctxt "title" msgid "Property Browser" msgstr "Property Browser" -#: solvespace.cpp:624 +#: solvespace.cpp:650 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 " @@ -1756,7 +1756,7 @@ msgstr "" "is probably not what you want; hide them by clicking the link at the top of " "the text window." -#: solvespace.cpp:692 +#: solvespace.cpp:718 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1765,19 +1765,19 @@ msgstr "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." -#: solvespace.cpp:740 +#: solvespace.cpp:766 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:744 +#: solvespace.cpp:770 msgid "Bad selection for step dimension; select a constraint." msgstr "Bad selection for step dimension; select a constraint." -#: solvespace.cpp:768 +#: solvespace.cpp:794 msgid "The assembly does not interfere, good." msgstr "The assembly does not interfere, good." -#: solvespace.cpp:784 +#: solvespace.cpp:810 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1788,7 +1788,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:793 +#: solvespace.cpp:819 #, c-format msgid "" "\n" @@ -1801,7 +1801,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:798 +#: solvespace.cpp:824 msgid "" "\n" "\n" @@ -1813,7 +1813,7 @@ msgstr "" "Curved surfaces have been approximated as triangles.\n" "This introduces error, typically of around 1%." -#: solvespace.cpp:813 +#: solvespace.cpp:839 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1830,7 +1830,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:822 +#: solvespace.cpp:848 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1838,7 +1838,7 @@ msgstr "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." -#: solvespace.cpp:834 +#: solvespace.cpp:860 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1855,7 +1855,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:854 +#: solvespace.cpp:880 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1872,36 +1872,36 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:860 +#: solvespace.cpp:886 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Bad selection for perimeter; select line segments, arcs, and curves." -#: solvespace.cpp:876 +#: solvespace.cpp:902 msgid "Bad selection for trace; select a single point." msgstr "Bad selection for trace; select a single point." -#: solvespace.cpp:899 +#: solvespace.cpp:925 #, c-format msgid "Couldn't write to '%s'" msgstr "Couldn't write to '%s'" -#: solvespace.cpp:929 +#: solvespace.cpp:955 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "The mesh is self-intersecting (NOT okay, invalid)." -#: solvespace.cpp:930 +#: solvespace.cpp:956 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "The mesh is not self-intersecting (okay, valid)." -#: solvespace.cpp:932 +#: solvespace.cpp:958 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "The mesh has naked edges (NOT okay, invalid)." -#: solvespace.cpp:933 +#: solvespace.cpp:959 msgid "The mesh is watertight (okay, valid)." msgstr "The mesh is watertight (okay, valid)." -#: solvespace.cpp:936 +#: solvespace.cpp:962 #, c-format msgid "" "\n" @@ -1912,7 +1912,7 @@ msgstr "" "\n" "The model contains %d triangles, from %d surfaces." -#: solvespace.cpp:940 +#: solvespace.cpp:966 #, c-format msgid "" "%s\n" @@ -1927,7 +1927,7 @@ msgstr "" "\n" "Zero problematic edges, good.%s" -#: solvespace.cpp:943 +#: solvespace.cpp:969 #, c-format msgid "" "%s\n" @@ -1942,7 +1942,7 @@ msgstr "" "\n" "%d problematic edges, bad.%s" -#: solvespace.cpp:956 +#: solvespace.cpp:982 #, c-format msgid "" "This is SolveSpace version %s.\n" diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index 01429138d..2295312b5 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-22 18:09+0200\n" +"POT-Creation-Date: 2020-11-23 07:36+0100\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" @@ -654,7 +654,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 solvespace.cpp:537 +#: file.cpp:869 solvespace.cpp:563 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1578,7 +1578,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NOUVEAU COMMENTAIRE - DOUBLE-CLIQUE POUR EDITER" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1663,18 +1663,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 msgid "untitled" msgstr "sans nom" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1562 msgctxt "title" msgid "Save File" msgstr "Sauver fichier" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1564 msgctxt "title" msgid "Open File" msgstr "Ouvrir Fichier" @@ -1719,74 +1719,74 @@ msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:525 +#: solvespace.cpp:551 msgctxt "title" msgid "Modified File" msgstr "Fichier modifié" -#: solvespace.cpp:527 +#: solvespace.cpp:553 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:530 +#: solvespace.cpp:556 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:533 +#: solvespace.cpp:559 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:534 +#: solvespace.cpp:560 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:536 +#: solvespace.cpp:562 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:557 +#: solvespace.cpp:583 msgctxt "title" msgid "(new sketch)" msgstr "(nouveau dessin)" -#: solvespace.cpp:564 +#: solvespace.cpp:590 msgctxt "title" msgid "Property Browser" msgstr "Navigateur de propriété" -#: solvespace.cpp:624 +#: solvespace.cpp:650 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:692 +#: solvespace.cpp:718 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:740 +#: solvespace.cpp:766 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:744 +#: solvespace.cpp:770 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:768 +#: solvespace.cpp:794 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:784 +#: solvespace.cpp:810 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1794,7 +1794,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:793 +#: solvespace.cpp:819 #, c-format msgid "" "\n" @@ -1803,7 +1803,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:798 +#: solvespace.cpp:824 msgid "" "\n" "\n" @@ -1811,7 +1811,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:813 +#: solvespace.cpp:839 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1822,13 +1822,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:848 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:834 +#: solvespace.cpp:860 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1839,7 +1839,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:854 +#: solvespace.cpp:880 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1850,36 +1850,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:886 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:876 +#: solvespace.cpp:902 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:899 +#: solvespace.cpp:925 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:929 +#: solvespace.cpp:955 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:930 +#: solvespace.cpp:956 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:932 +#: solvespace.cpp:958 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:933 +#: solvespace.cpp:959 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:936 +#: solvespace.cpp:962 #, c-format msgid "" "\n" @@ -1887,7 +1887,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:940 +#: solvespace.cpp:966 #, c-format msgid "" "%s\n" @@ -1897,7 +1897,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:943 +#: solvespace.cpp:969 #, c-format msgid "" "%s\n" @@ -1907,7 +1907,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:956 +#: solvespace.cpp:982 #, c-format msgid "" "This is SolveSpace version %s.\n" diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index 9f198e432..c098caaf8 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-22 18:09+0200\n" +"POT-Creation-Date: 2020-11-23 07:36+0100\n" "PO-Revision-Date: 2017-04-21 10:29+0700\n" "Last-Translator: evilspirit@evilspirit.org\n" "Language-Team: EvilSpirit\n" @@ -648,7 +648,7 @@ msgctxt "button" msgid "&No" msgstr "Нет" -#: file.cpp:869 solvespace.cpp:537 +#: file.cpp:869 solvespace.cpp:563 msgctxt "button" msgid "&Cancel" msgstr "Отменить" @@ -1581,7 +1581,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "КОММЕНТАРИЙ -- ДВОЙНОЙ ЩЕЛЧОК ДЛЯ РЕДАКТИРОВАНИЯ" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 msgctxt "file-type" msgid "SolveSpace models" msgstr "проекты SolveSpace" @@ -1666,18 +1666,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "CSV файлы (значения, разделенные запятой)" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 msgid "untitled" msgstr "без имени" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1562 msgctxt "title" msgid "Save File" msgstr "Сохранить Файл" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1564 msgctxt "title" msgid "Open File" msgstr "Открыть Файл" @@ -1722,74 +1722,74 @@ msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:525 +#: solvespace.cpp:551 msgctxt "title" msgid "Modified File" msgstr "Измененный Файл" -#: solvespace.cpp:527 +#: solvespace.cpp:553 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:530 +#: solvespace.cpp:556 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:533 +#: solvespace.cpp:559 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:534 +#: solvespace.cpp:560 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:536 +#: solvespace.cpp:562 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:557 +#: solvespace.cpp:583 msgctxt "title" msgid "(new sketch)" msgstr "(новый проект)" -#: solvespace.cpp:564 +#: solvespace.cpp:590 msgctxt "title" msgid "Property Browser" msgstr "Браузер" -#: solvespace.cpp:624 +#: solvespace.cpp:650 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:692 +#: solvespace.cpp:718 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:740 +#: solvespace.cpp:766 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:744 +#: solvespace.cpp:770 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:768 +#: solvespace.cpp:794 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:784 +#: solvespace.cpp:810 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1797,7 +1797,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:793 +#: solvespace.cpp:819 #, c-format msgid "" "\n" @@ -1806,7 +1806,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:798 +#: solvespace.cpp:824 msgid "" "\n" "\n" @@ -1814,7 +1814,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:813 +#: solvespace.cpp:839 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1825,13 +1825,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:848 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:834 +#: solvespace.cpp:860 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1842,7 +1842,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:854 +#: solvespace.cpp:880 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1853,36 +1853,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:886 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:876 +#: solvespace.cpp:902 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:899 +#: solvespace.cpp:925 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:929 +#: solvespace.cpp:955 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:930 +#: solvespace.cpp:956 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:932 +#: solvespace.cpp:958 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:933 +#: solvespace.cpp:959 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:936 +#: solvespace.cpp:962 #, c-format msgid "" "\n" @@ -1890,7 +1890,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:940 +#: solvespace.cpp:966 #, c-format msgid "" "%s\n" @@ -1900,7 +1900,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:943 +#: solvespace.cpp:969 #, c-format msgid "" "%s\n" @@ -1910,7 +1910,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:956 +#: solvespace.cpp:982 #, c-format msgid "" "This is SolveSpace version %s.\n" diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index cb2cd2df0..89fd5ac0d 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-22 18:09+0200\n" +"POT-Creation-Date: 2020-11-23 07:36+0100\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: appsoft@ua.fm\n" "Language-Team: OpenOrienteeringUkraine\n" @@ -528,7 +528,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 solvespace.cpp:537 +#: file.cpp:869 solvespace.cpp:563 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1388,7 +1388,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1473,18 +1473,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 msgid "untitled" msgstr "" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1562 msgctxt "title" msgid "Save File" msgstr "" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1564 msgctxt "title" msgid "Open File" msgstr "" @@ -1529,74 +1529,74 @@ msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:525 +#: solvespace.cpp:551 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:527 +#: solvespace.cpp:553 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:530 +#: solvespace.cpp:556 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:533 +#: solvespace.cpp:559 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:534 +#: solvespace.cpp:560 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:536 +#: solvespace.cpp:562 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:557 +#: solvespace.cpp:583 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:564 +#: solvespace.cpp:590 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:624 +#: solvespace.cpp:650 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:692 +#: solvespace.cpp:718 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:740 +#: solvespace.cpp:766 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:744 +#: solvespace.cpp:770 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:768 +#: solvespace.cpp:794 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:784 +#: solvespace.cpp:810 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1604,7 +1604,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:793 +#: solvespace.cpp:819 #, c-format msgid "" "\n" @@ -1613,7 +1613,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:798 +#: solvespace.cpp:824 msgid "" "\n" "\n" @@ -1621,7 +1621,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:813 +#: solvespace.cpp:839 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1632,13 +1632,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:848 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:834 +#: solvespace.cpp:860 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1649,7 +1649,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:854 +#: solvespace.cpp:880 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1660,36 +1660,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:886 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:876 +#: solvespace.cpp:902 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:899 +#: solvespace.cpp:925 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:929 +#: solvespace.cpp:955 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:930 +#: solvespace.cpp:956 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:932 +#: solvespace.cpp:958 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:933 +#: solvespace.cpp:959 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:936 +#: solvespace.cpp:962 #, c-format msgid "" "\n" @@ -1697,7 +1697,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:940 +#: solvespace.cpp:966 #, c-format msgid "" "%s\n" @@ -1707,7 +1707,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:943 +#: solvespace.cpp:969 #, c-format msgid "" "%s\n" @@ -1717,7 +1717,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:956 +#: solvespace.cpp:982 #, c-format msgid "" "This is SolveSpace version %s.\n" diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index 61984ad3d..df48341a4 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -2,12 +2,12 @@ # Copyright (C) 2020 the PACKAGE authors # This file is distributed under the same license as the SolveSpace package. # , 2020. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-22 18:09+0200\n" +"POT-Creation-Date: 2020-11-23 07:36+0100\n" "PO-Revision-Date: 2020-09-28 12:42+0800\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" @@ -606,7 +606,7 @@ msgctxt "button" msgid "&No" msgstr "否(&N)" -#: file.cpp:869 solvespace.cpp:537 +#: file.cpp:869 solvespace.cpp:563 msgctxt "button" msgid "&Cancel" msgstr "取消(&C)" @@ -1475,7 +1475,7 @@ msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "新备注 - 双击编辑" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace模型" @@ -1560,18 +1560,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "逗号分隔数据" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 msgid "untitled" msgstr "未命名" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1562 msgctxt "title" msgid "Save File" msgstr "保存文件" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1564 msgctxt "title" msgid "Open File" msgstr "打开文件" @@ -1616,74 +1616,74 @@ msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:525 +#: solvespace.cpp:551 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:527 +#: solvespace.cpp:553 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:530 +#: solvespace.cpp:556 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:533 +#: solvespace.cpp:559 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:534 +#: solvespace.cpp:560 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:536 +#: solvespace.cpp:562 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:557 +#: solvespace.cpp:583 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:564 +#: solvespace.cpp:590 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:624 +#: solvespace.cpp:650 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:692 +#: solvespace.cpp:718 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:740 +#: solvespace.cpp:766 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:744 +#: solvespace.cpp:770 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:768 +#: solvespace.cpp:794 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:784 +#: solvespace.cpp:810 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1691,7 +1691,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:793 +#: solvespace.cpp:819 #, c-format msgid "" "\n" @@ -1700,7 +1700,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:798 +#: solvespace.cpp:824 msgid "" "\n" "\n" @@ -1708,7 +1708,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:813 +#: solvespace.cpp:839 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1719,13 +1719,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:848 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:834 +#: solvespace.cpp:860 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1736,7 +1736,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:854 +#: solvespace.cpp:880 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1747,36 +1747,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:886 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:876 +#: solvespace.cpp:902 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:899 +#: solvespace.cpp:925 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:929 +#: solvespace.cpp:955 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:930 +#: solvespace.cpp:956 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:932 +#: solvespace.cpp:958 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:933 +#: solvespace.cpp:959 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:936 +#: solvespace.cpp:962 #, c-format msgid "" "\n" @@ -1784,7 +1784,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:940 +#: solvespace.cpp:966 #, c-format msgid "" "%s\n" @@ -1794,7 +1794,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:943 +#: solvespace.cpp:969 #, c-format msgid "" "%s\n" @@ -1804,7 +1804,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:956 +#: solvespace.cpp:982 #, c-format msgid "" "This is SolveSpace version %s.\n" diff --git a/res/messages.pot b/res/messages.pot index 8bb0e2ade..5a6ef3651 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-22 18:09+0200\n" +"POT-Creation-Date: 2020-11-23 07:36+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -506,7 +506,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 solvespace.cpp:537 +#: file.cpp:869 solvespace.cpp:563 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1350,7 +1350,7 @@ msgstr "" msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:479 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1435,18 +1435,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1621 +#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 msgid "untitled" msgstr "" #: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1562 msgctxt "title" msgid "Save File" msgstr "" #: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1564 msgctxt "title" msgid "Open File" msgstr "" @@ -1491,71 +1491,71 @@ msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:525 +#: solvespace.cpp:551 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:527 +#: solvespace.cpp:553 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:530 +#: solvespace.cpp:556 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:533 +#: solvespace.cpp:559 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:534 +#: solvespace.cpp:560 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:536 +#: solvespace.cpp:562 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:557 +#: solvespace.cpp:583 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:564 +#: solvespace.cpp:590 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:624 +#: solvespace.cpp:650 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:692 +#: solvespace.cpp:718 #, c-format msgid "Can't identify file type from file extension of filename '%s'; try .dxf or .dwg." msgstr "" -#: solvespace.cpp:740 +#: solvespace.cpp:766 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:744 +#: solvespace.cpp:770 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:768 +#: solvespace.cpp:794 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:784 +#: solvespace.cpp:810 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1563,7 +1563,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:793 +#: solvespace.cpp:819 #, c-format msgid "" "\n" @@ -1572,7 +1572,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:798 +#: solvespace.cpp:824 msgid "" "\n" "\n" @@ -1580,7 +1580,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:813 +#: solvespace.cpp:839 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1591,13 +1591,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:848 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, not coplanar, or self-" "intersecting." msgstr "" -#: solvespace.cpp:834 +#: solvespace.cpp:860 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1608,7 +1608,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:854 +#: solvespace.cpp:880 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1619,36 +1619,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:886 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:876 +#: solvespace.cpp:902 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:899 +#: solvespace.cpp:925 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:929 +#: solvespace.cpp:955 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:930 +#: solvespace.cpp:956 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:932 +#: solvespace.cpp:958 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:933 +#: solvespace.cpp:959 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:936 +#: solvespace.cpp:962 #, c-format msgid "" "\n" @@ -1656,7 +1656,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:940 +#: solvespace.cpp:966 #, c-format msgid "" "%s\n" @@ -1666,7 +1666,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:943 +#: solvespace.cpp:969 #, c-format msgid "" "%s\n" @@ -1676,7 +1676,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:956 +#: solvespace.cpp:982 #, c-format msgid "" "This is SolveSpace version %s.\n" From cbffce65592503fd81761af9105dc66d7f7c69e9 Mon Sep 17 00:00:00 2001 From: ruevs Date: Mon, 23 Nov 2020 12:23:16 +0200 Subject: [PATCH 188/646] Changelog: Describe the "err" indicator in the property browser. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7a40327b..b302f403c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,8 @@ New sketch features: * "Split Curves at Intersection" can now split curves at point lying on curve, not just at intersection of two curves. * Property browser now shows amount of degrees of freedom in group list. + It also shows a yellow "err" if the sketch has problems (e.g. self + intersecting) that would propagate in subsequent groups. New constraint features: * When dragging an arc or rectangle point, it will be automatically From a5d81a71555e49043a55c03c87ea5523b884e9dc Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sat, 21 Nov 2020 12:42:15 +0100 Subject: [PATCH 189/646] Move z-index of construction segments behind normal segments --- src/drawentity.cpp | 7 +++++-- test/constraint/angle/skew.png | Bin 4869 -> 4867 bytes 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/drawentity.cpp b/src/drawentity.cpp index fab407136..d8763360e 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -472,13 +472,13 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { int zIndex; if(IsPoint()) { - zIndex = 5; + zIndex = 6; } else if(how == DrawAs::HIDDEN) { zIndex = 2; } else if(group != SS.GW.activeGroup) { zIndex = 3; } else { - zIndex = 4; + zIndex = 5; } hStyle hs; @@ -488,6 +488,9 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { hs.v = Style::NORMALS; } else { hs = Style::ForEntity(h); + if (hs.v == Style::CONSTRUCTION) { + zIndex = 4; + } } Canvas::Stroke stroke = Style::Stroke(hs); diff --git a/test/constraint/angle/skew.png b/test/constraint/angle/skew.png index 97fb0dbf53595dac63eef4b79d78fe3bb110b6cf..92d7577a44f841963122399714b2e8daae3d7690 100644 GIT binary patch delta 2296 zcmY*b3sjQX7CvC0`PRx;rj43*Q!Djq4-GJ1Yce(GmXc;_md*|HF=eTUzf9(gQ);Y# z%15OZWobS@LaijwQhJ!=HL>u4lbIPI6$$AdaIv|w?wYmET4%3)&e^YTe|w!%&L^GE zI)y&|KG1)6_C@Jf;!h*NcZvpj-O~>UGg()cch=Q*I+0hg4Eszfz5f~F;fg~($pLT!>(NyPwDX9fV> zODq84#d93aOBWQFvZy)%C>9;wbr}xF@cf&!3DSw0xoO>`oto-d+$@WK@m{_Zp-!>_^-MGDg04$FJHpF+ zDJoHZ8U_EMRvUpAk;hc|A;{D#0mOkLuwf7sbD{3qale(6im8{~QxFP_-8D#@)=&%R4%&r}B0SB}#%G zmWz@1K}u!y{i#WuZ~s)2t9jb0bV*Vhu07UHRXvEDkiBSGSW`@%Rr%)5cL;hZh0{#S z;RIAC&E11J%&gwh?^pv@>Dr^j@Eu(ODjr63H=xeJu6j05v^{(_7qWXPm|=@1+r4U- zQ#Q9EhuqEjSr77wr2(y1c1ksarv0PX#RaN8ratb!0Rq$x+L%gZWn8maSNZ&{8or@ZqN z-Xo9IQcav9J|pdhQDbR%5rHNrHJzV#>SWH-7=PxKA#E?(j>r!2vQ!;aiB)yoU4FfdD;DE7O&02BT)-Br&cxh`nvX5S0+Y9i z#m``zez8GjLseaUwi8fRcG0MgaD$OK1SZ$Tcq}6VkofmNZ6CYH{hVFwGfq#{KBNg*GX@5fq_?%q7C0$PogjNGg-}o5un3u%AC00MFLr``e zY@zU-KLBSQX!%d5;Gu!u|6IcH`UbQKeU`nUCmJp`x3}YUoWJ&(@%LD?&_ObjUkvQl7j(wF+|2%0A4BF zXW(pn;;!_~%**g=bO5l)-+Bb58+r#stt948*#N6uM-tpmKSYC~e{loXwt@nVTj--i ziOx-StBVO>{F0;{c09tL6E7zArtZfduBZ5(D@6mV3Tyb8;R+Zs*M}MfyiYGr0UmYE znuuF%12!{oS_6rWq$9H9Bnq&K;8KS~4BAlDv!5f37R0^``W1PwSgXsRd9(3&=g5O7 z0<>V#C@ebNC{%B1Ewliilg{uCOC4LWNj?T(VYemm(Z)@~1UkXTY zg|)i#?X8CIV6Q?rmAC6_<38}sc^6MalH=_ct(PK}Bc8w$x&h5EU# zxY4!CC|IF;&7}hTX*Vysocu2+0;y@5cjruEC2-o4RH>gmQL}N!Vz;{@_T&NXv>2t)rjUH5^-@;a6V<_ zd$D%5-BuNaNt4zYl#+fQ$pRmI7CBQvqILa)R=a~%YiyxGkz>qu{hMy$rTw0O?}Nev Jo3|(Y{9iQeT3!GE delta 2234 zcmYjS3pCW-7C$o#lkv(cj~FHDyC{7kZ*h~`Ln>WiJVr9gc)#-H5bM{_q@3r@D|8}m~Kg0pg zaCfbER8vE3wFTg^)W;bB;t&!VQqhA7m3BcCRdpy^!^wvBPs8h#7)&uCJCnIFL$)91bY4p!EK)A$q8j+{mT5p1FNar8{aYx}9=ECA6e2N8=C;UkAfzN{@^B)XO3MB!cv0Ivdb5!Fj|TfNhe3Bnxq z6!Jze+@7QZQ0=!RW*&Y0Kzei{YuuA$pC#q8<$5Cu)QzW{Zk-(qkE<|B6>U-_9mp6>=HUmT;xnccWL+mgp0^6NpPo1Ffkp<_jpqhBA)jU z3M+d)&$u`Yd~Pt;h%t=ihqb!2VT>dXhlK)ObI9sx4dJ-hI(_2>>2=o4+2&nrEUdH0 z@^CY|xzc{XL;#g3qG5FCrQ$Id8QN4l1S^FskotrOG*l>(Iz1;3l~)4l-bx^tNw4{3OKJ zjo6$gWx6(I(IR~C4Q6PB&NpJRBts3}B0t~;ZqqFdB|U($DPQrMNn zm9@;4RJ_Hem9UE2se)%}Oc%oU!6uSZzI%ut2JhP1ndeQ%8F1(l`m!|Dmdaw?Ghr@= z?N6F=me5#{k{NbQqzEq(ClYjS&uUs|y5~IR#i{5pP?^!Mlz0UU_=h5Y^8>y=2bjrl z>u4$0xC@=ifQ*%NQGV=6x`&-ts*!&$gBzmUjN|D&<{ zqxEIJ>DoO`C0;@~r^}HI4WqdL=ob9S2YU@}jv`o2C5HL{>n#KSc5w#PtS1@Ow+0NL zX83+6O;rb4`ZXf$mQvJ@aIbj@9N%CBfK`VORnI!E11NPuWm)qZ?)Z%XfV$c5MYd`T z|G~cg|Ki)G89~a}`{9;~Q=TxO+^-D9YwUwcQ8s_Ax20^pvjJ9BTtCJB0lL&~ZR#&liW}O;u zYJ=Tn3pCXQ>1VsBNs&DGG!HO5w@V37>n428gY~6ZPPScx~DOYL2 zZil&wPlqOr6zviR>208dca)-#nR^vX>B^)4O@9Jl9OOA}OW;^JBhpKj#q)6faoM#8 z&JP?~Sb-6ncbiiVMie%_KQQs|8n=VgK%T@btuq(RZSvl+pNqsu5OG)A4-~cpEf=!f(B}(9RJ6Mt^Fs0PTV&p($>)gld1C_ zvvKZa=bqW+dwfEkkTih!Gkk3KB8B*S{o;vx}q196^hi zBkGtKYqL|Fa^r`#UZ+XEQ=2$TFFe=U*~{(12N-5}-%O05V2J6w>=3;nHC+?WlkYQc z$Mc16TLr%)w{fCKF*3i|gc77@BL3-O0`ATHTl{qiEbUwnwyTG#g^3LosWu@%XA!Nb z+kxzF_tkROfC-Q2C>n)7BA_bOw(?xO;ml?5^Y+ua74KF$iNi;QfaGR%TFabnrRn|>@ zrD;`q=a;crDcnte3MZ-}YQ}P>Z_NW|IiOmTQt&OfFcTLLdwPDpd21xzRTIA!yJaG9 zjpylZtnO|mh}*Vi*9>f_AwK?bfz{)Ua>TYhzs=#_+2yK^*!9a56@wPeaukrQlOAV} JH@ahQ{10wbN5B98 From 3dedcd2e33aeefe807589f2a91376565ec418246 Mon Sep 17 00:00:00 2001 From: ruevs Date: Mon, 23 Nov 2020 15:15:37 +0200 Subject: [PATCH 190/646] UI: Display "err" in the property browser only if "check sketch for closed contour" ... is enabled. "err" was first introduced in c2c26e95adb to indicate sketches that may cause problems in the subsequent 3D groups. But is makes sense not to display the error if the "check sketch for closed contour" option is turned off. The user obviously does not want to be warned. Based on a suggestion in https://github.com/solvespace/solvespace/issues/819 --- src/textscreens.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/textscreens.cpp b/src/textscreens.cpp index aac270337..07d5cdeea 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -143,7 +143,7 @@ void TextWindow::ShowListOfGroups() { // Link to the errors, if a problem occurred while solving ok ? (warn ? 'm' : (dof > 0 ? 'i' : 's')) : 'x', g->h.v, (&TextWindow::ScreenHowGroupSolved), - ok ? (warn ? "err" : sdof) : "", + ok ? ((warn && SS.checkClosedContour) ? "err" : sdof) : "", ok ? "" : "ERR", // Link to a screen that gives more details on the group g->h.v, (&TextWindow::ScreenSelectGroup), s.c_str()); From 01f076bc53c6a7b961e0e6e87b7c73e3100ea383 Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 24 Nov 2020 19:36:26 +0200 Subject: [PATCH 191/646] Win32: Remove sscheck on SetScrollInfo - it returns the scrollbar position ...which can be zero. Fixes: https://github.com/solvespace/solvespace/issues/817 --- src/platform/guiwin.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index cfa4b7ea8..5a9f09de3 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1342,7 +1342,7 @@ class WindowImplWin32 final : public Window { si.nMin = (UINT)(min * SCROLLBAR_UNIT); si.nMax = (UINT)(max * SCROLLBAR_UNIT); si.nPage = (UINT)(pageSize * SCROLLBAR_UNIT); - sscheck(SetScrollInfo(hWindow, SB_VERT, &si, /*redraw=*/TRUE)); + SetScrollInfo(hWindow, SB_VERT, &si, /*redraw=*/TRUE); // Returns scrollbar position } double GetScrollbarPosition() override { @@ -1366,7 +1366,7 @@ class WindowImplWin32 final : public Window { return; si.nPos = (int)(pos * SCROLLBAR_UNIT); - sscheck(SetScrollInfo(hWindow, SB_VERT, &si, /*redraw=*/TRUE)); + SetScrollInfo(hWindow, SB_VERT, &si, /*redraw=*/TRUE); // Returns scrollbar position // Windows won't synthesize a WM_VSCROLL for us here. if(onScrollbarAdjusted) { From 3d686806eb7a0ca94fa302600f9317ec5eb2c24e Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Tue, 24 Nov 2020 18:36:35 -0500 Subject: [PATCH 192/646] "Edit newly added dimensions" is now turned on by default. issue826 --- src/solvespace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 9b3ef9b34..acc7162e5 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -77,7 +77,7 @@ void SolveSpaceUI::Init() { // Use turntable mouse navigation turntableNav = settings->ThawBool("TurntableNav", false); // Immediately edit dimension - immediatelyEditDimension = settings->ThawBool("ImmediatelyEditDimension", false); + immediatelyEditDimension = settings->ThawBool("ImmediatelyEditDimension", true); // Check that contours are closed and not self-intersecting checkClosedContour = settings->ThawBool("CheckClosedContour", true); // Enable automatic constrains for lines From fdd2c7019780550bd751bf5a40180915f433cce9 Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 25 Nov 2020 15:51:28 +0200 Subject: [PATCH 193/646] Win32: Remove sscheck on IsWindowVisible and ShowWindow The return value of these functions is not an error code and according to the Win32 API documentation they can not affect `GetLastError`. Calling sscheck on them normally does not fail since it does SetLastError(0) before running the checked expression and only then GetLastError(). However in issue 817 a user discovered that when running "DisplayFusion" software GetLastError does return an error and SolveSpace closes. So while not a strict bug-fix this is a "correctness improvement" for SolveSpace and works around a possible bug in DisplayFusion. Similarly the return value of Reg*** functions is now compared to ERROR_SUCCESS which is zero. Before the sschecks were strictly wrong but did not cause problems for the same reason as above. --- src/platform/guiwin.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index 5a9f09de3..d50d24d47 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -183,7 +183,7 @@ class SettingsImplWin32 final : public Settings { HKEY GetKey() { if(hKey == NULL) { - sscheck(RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\SolveSpace", 0, NULL, 0, + sscheck(ERROR_SUCCESS == RegCreateKeyExW(HKEY_CURRENT_USER, L"Software\\SolveSpace", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hKey, NULL)); } return hKey; @@ -191,12 +191,12 @@ class SettingsImplWin32 final : public Settings { ~SettingsImplWin32() { if(hKey != NULL) { - sscheck(RegCloseKey(hKey)); + sscheck(ERROR_SUCCESS == RegCloseKey(hKey)); } } void FreezeInt(const std::string &key, uint32_t value) { - sscheck(RegSetValueExW(GetKey(), &Widen(key)[0], 0, + sscheck(ERROR_SUCCESS == RegSetValueExW(GetKey(), &Widen(key)[0], 0, REG_DWORD, (const BYTE *)&value, sizeof(value))); } @@ -212,7 +212,7 @@ class SettingsImplWin32 final : public Settings { } void FreezeFloat(const std::string &key, double value) { - sscheck(RegSetValueExW(GetKey(), &Widen(key)[0], 0, + sscheck(ERROR_SUCCESS == RegSetValueExW(GetKey(), &Widen(key)[0], 0, REG_QWORD, (const BYTE *)&value, sizeof(value))); } @@ -231,7 +231,7 @@ class SettingsImplWin32 final : public Settings { ssassert(value.length() == strlen(value.c_str()), "illegal null byte in middle of a string setting"); std::wstring valueW = Widen(value); - sscheck(RegSetValueExW(GetKey(), &Widen(key)[0], 0, + sscheck(ERROR_SUCCESS == RegSetValueExW(GetKey(), &Widen(key)[0], 0, REG_SZ, (const BYTE *)&valueW[0], (valueW.length() + 1) * 2)); } @@ -242,7 +242,7 @@ class SettingsImplWin32 final : public Settings { if(result == ERROR_SUCCESS && type == REG_SZ) { std::wstring valueW; valueW.resize(length / 2 - 1); - sscheck(RegQueryValueExW(GetKey(), &Widen(key)[0], 0, + sscheck(ERROR_SUCCESS == RegQueryValueExW(GetKey(), &Widen(key)[0], 0, &type, (BYTE *)&valueW[0], &length)); return Narrow(valueW); } @@ -1101,12 +1101,12 @@ class WindowImplWin32 final : public Window { bool IsVisible() override { BOOL isVisible; - sscheck(isVisible = IsWindowVisible(hWindow)); + isVisible = IsWindowVisible(hWindow); return isVisible == TRUE; } void SetVisible(bool visible) override { - sscheck(ShowWindow(hWindow, visible ? SW_SHOW : SW_HIDE)); + ShowWindow(hWindow, visible ? SW_SHOW : SW_HIDE); } void Focus() override { @@ -1274,7 +1274,7 @@ class WindowImplWin32 final : public Window { bool IsEditorVisible() override { BOOL visible; - sscheck(visible = IsWindowVisible(hEditor)); + visible = IsWindowVisible(hEditor); return visible == TRUE; } @@ -1316,7 +1316,7 @@ class WindowImplWin32 final : public Window { sscheck(MoveWindow(hEditor, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, /*bRepaint=*/true)); - sscheck(ShowWindow(hEditor, SW_SHOW)); + ShowWindow(hEditor, SW_SHOW); if(!textW.empty()) { sscheck(SendMessageW(hEditor, WM_SETTEXT, 0, (LPARAM)textW.c_str())); sscheck(SendMessageW(hEditor, EM_SETSEL, 0, textW.length())); @@ -1327,7 +1327,7 @@ class WindowImplWin32 final : public Window { void HideEditor() override { if(!IsEditorVisible()) return; - sscheck(ShowWindow(hEditor, SW_HIDE)); + ShowWindow(hEditor, SW_HIDE); } void SetScrollbarVisible(bool visible) override { From e0bd66f95a79047fefab677f0a1c17b307b9cb4c Mon Sep 17 00:00:00 2001 From: ruevs Date: Mon, 23 Nov 2020 13:52:17 +0200 Subject: [PATCH 194/646] Set the default font for text objects correctly. The default font is BitstreamVeraSans-Roman-builtin.ttf since 94b26ddfac0c, but on Win32 it needs to be `res://fonts/...` URI to work. Fixes: https://github.com/solvespace/solvespace/issues/821 --- src/mouse.cpp | 2 +- src/platform/platform.h | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/mouse.cpp b/src/mouse.cpp index 699f3e268..6c22a0cb1 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -1117,7 +1117,7 @@ void GraphicsWindow::MouseLeftDown(double mx, double my, bool shiftDown, bool ct AddToPending(hr); Request *r = SK.GetRequest(hr); r->str = "Abc"; - r->font = "BitstreamVeraSans-Roman-builtin.ttf"; + r->font = Platform::embeddedFont; for(int i = 1; i <= 4; i++) { SK.GetEntity(hr.entity(i))->PointForceTo(v); diff --git a/src/platform/platform.h b/src/platform/platform.h index 5664fa217..21c2b2bfa 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -17,6 +17,12 @@ std::string Narrow(const std::wstring &s); std::wstring Widen(const std::string &s); #endif +#if defined(_WIN32) + const std::string embeddedFont = "res://fonts/BitstreamVeraSans-Roman-builtin.ttf"; +#else // Linux and macOS + const std::string embeddedFont = "BitstreamVeraSans-Roman-builtin.ttf"; +#endif + // A filesystem path, respecting the conventions of the current platform. // Transformation functions return an empty path on error. class Path { From 6a952e8d4916443d18aa6bd29d7c21713189bb77 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Fri, 27 Nov 2020 14:04:53 +0100 Subject: [PATCH 195/646] Swap vertical and horizontal constraints when rotating 90/270 degrees --- src/clipboard.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/clipboard.cpp b/src/clipboard.cpp index 011b658d4..b02808d0d 100644 --- a/src/clipboard.cpp +++ b/src/clipboard.cpp @@ -227,7 +227,6 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { MakeSelected(hr.entity(j)); } } - Constraint *cc; for(cc = SS.clipboard.c.First(); cc; cc = SS.clipboard.c.NextAfter(cc)) { Constraint c = {}; @@ -257,7 +256,17 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { case Constraint::Type::DIAMETER: c.valA *= fabs(scale); break; - + case Constraint::Type::HORIZONTAL: + case Constraint::Type::VERTICAL: + // When rotating 90 or 270 degrees, swap the vertical / horizontal constaints + if (theta == PI/2 || theta == PI*1.5) { + if(c.type == Constraint::Type::HORIZONTAL) { + c.type = Constraint::Type::VERTICAL; + } else { + c.type = Constraint::Type::HORIZONTAL; + } + } + break; default: break; } From 4f8d72231b0abb96252deadb70b656fd51721ddf Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sat, 28 Nov 2020 12:27:26 +0100 Subject: [PATCH 196/646] Better rotating --- src/clipboard.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/clipboard.cpp b/src/clipboard.cpp index b02808d0d..f2d2b9520 100644 --- a/src/clipboard.cpp +++ b/src/clipboard.cpp @@ -245,6 +245,7 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { c.reference = cc->reference; c.disp = cc->disp; c.comment = cc->comment; + bool removeConstraint = false; switch(c.type) { case Constraint::Type::COMMENT: c.disp.offset = c.disp.offset.Plus(trans); @@ -259,21 +260,25 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { case Constraint::Type::HORIZONTAL: case Constraint::Type::VERTICAL: // When rotating 90 or 270 degrees, swap the vertical / horizontal constaints - if (theta == PI/2 || theta == PI*1.5) { + dbp("Remainder: %f", fmod(theta + (PI / 2), PI)); + if (fmod(theta + (PI/2), PI) == 0) { if(c.type == Constraint::Type::HORIZONTAL) { c.type = Constraint::Type::VERTICAL; } else { c.type = Constraint::Type::HORIZONTAL; } + } else if (fmod(theta, PI/2) != 0) { + removeConstraint = true; } break; default: break; } - - hConstraint hc = Constraint::AddConstraint(&c, /*rememberForUndo=*/false); - if(c.type == Constraint::Type::COMMENT) { - MakeSelected(hc); + if (!removeConstraint) { + hConstraint hc = Constraint::AddConstraint(&c, /*rememberForUndo=*/false); + if(c.type == Constraint::Type::COMMENT) { + MakeSelected(hc); + } } } } From cd912171a2e473c858516b6180a8dbcc89f73bbe Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sat, 28 Nov 2020 13:50:38 +0100 Subject: [PATCH 197/646] Use EXACT for checking theta --- src/clipboard.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/clipboard.cpp b/src/clipboard.cpp index f2d2b9520..dbcd1dfa8 100644 --- a/src/clipboard.cpp +++ b/src/clipboard.cpp @@ -260,8 +260,7 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { case Constraint::Type::HORIZONTAL: case Constraint::Type::VERTICAL: // When rotating 90 or 270 degrees, swap the vertical / horizontal constaints - dbp("Remainder: %f", fmod(theta + (PI / 2), PI)); - if (fmod(theta + (PI/2), PI) == 0) { + if (EXACT(fmod(theta + (PI/2), PI) == 0)) { if(c.type == Constraint::Type::HORIZONTAL) { c.type = Constraint::Type::VERTICAL; } else { From 2879ff1ed4b5e53f37d08aeaa61447d38b6d153a Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Tue, 8 Dec 2020 18:19:33 +0100 Subject: [PATCH 198/646] CI: Replace Travis with GitHub Actions (#824) Travis's move away from providing unlimited build time to OSS and its inferior developer experience are the reason for this change. The workflows are simple and straightforward, and the build scripts are mostly 1:1 the same we used on Travis. This avoids vendor lock-in as much as possible in case we need to move somewhere else in the future. We introduce two workflows: 1. CD (cd.yml) Runs on: Commits to master, GitHub releases. Does: Run tests, build release assets, update GitHub edge release or release to developer created GitHub release. Builds & uploads snaps to the Snap Store. 2. Test (test.yml) Runs on: Every commit except those on master and v* tagged ones. I.e. PRs and other branches. Does: Run tests only. Creating a release is now an explicit operation. On the Travis workflow, pushing a tag that begins with "v" will lead to the automatic creation of an associated GitHub release. On GHA, creating a GitHub release by hand will trigger the CD-workflow to build & upload the release assets. Other differences to Travis: - Windows builds on Visual Studio 16 2019 instead of Visual Studio 15 2017. - Snap builds run in docker containers, not directly on the build host. - Snap arm64 builds on amd64 via QEMU user emulation. This is slower than what Travis gave us and should be changed when/if GHA offers ARM64 build runners. - GHA retains build artifacts for 90 days by default. Required secrets: - MACOS_CERTIFICATE_PASSWORD - MACOS_CERTIFICATE_P12 - MACOS_APPSTORE_APP_PASSWORD - MACOS_APPSTORE_USERNAME - MACOS_DEVELOPER_ID - SNAPSTORE_LOGIN Discussion: https://github.com/solvespace/solvespace/issues/807 PR: https://github.com/solvespace/solvespace/pull/824 Fixes #807 --- {.travis => .github/scripts}/build-macos.sh | 0 {.travis => .github/scripts}/build-snap.sh | 0 {.travis => .github/scripts}/build-ubuntu.sh | 0 {.travis => .github/scripts}/build-windows.sh | 7 +- {.travis => .github/scripts}/install-macos.sh | 0 {.travis => .github/scripts}/install-snap.sh | 0 .../scripts}/install-ubuntu.sh | 0 .../scripts}/install-windows.sh | 0 {.travis => .github/scripts}/sign-macos.sh | 0 .github/workflows/cd.yml | 240 ++++++++++++++++++ .github/workflows/test.yml | 41 +++ .travis.yml | 115 --------- .travis/deploy-snap.sh | 8 - .travis/remove-edge.sh | 23 -- .travis/tag-edge.sh | 8 - README.md | 2 +- 16 files changed, 284 insertions(+), 160 deletions(-) rename {.travis => .github/scripts}/build-macos.sh (100%) rename {.travis => .github/scripts}/build-snap.sh (100%) rename {.travis => .github/scripts}/build-ubuntu.sh (100%) rename {.travis => .github/scripts}/build-windows.sh (79%) rename {.travis => .github/scripts}/install-macos.sh (100%) rename {.travis => .github/scripts}/install-snap.sh (100%) rename {.travis => .github/scripts}/install-ubuntu.sh (100%) rename {.travis => .github/scripts}/install-windows.sh (100%) rename {.travis => .github/scripts}/sign-macos.sh (100%) create mode 100644 .github/workflows/cd.yml create mode 100644 .github/workflows/test.yml delete mode 100644 .travis.yml delete mode 100755 .travis/deploy-snap.sh delete mode 100755 .travis/remove-edge.sh delete mode 100755 .travis/tag-edge.sh diff --git a/.travis/build-macos.sh b/.github/scripts/build-macos.sh similarity index 100% rename from .travis/build-macos.sh rename to .github/scripts/build-macos.sh diff --git a/.travis/build-snap.sh b/.github/scripts/build-snap.sh similarity index 100% rename from .travis/build-snap.sh rename to .github/scripts/build-snap.sh diff --git a/.travis/build-ubuntu.sh b/.github/scripts/build-ubuntu.sh similarity index 100% rename from .travis/build-ubuntu.sh rename to .github/scripts/build-ubuntu.sh diff --git a/.travis/build-windows.sh b/.github/scripts/build-windows.sh similarity index 79% rename from .travis/build-windows.sh rename to .github/scripts/build-windows.sh index d237d5283..e81fb2ac8 100755 --- a/.travis/build-windows.sh +++ b/.github/scripts/build-windows.sh @@ -1,8 +1,5 @@ #!/bin/sh -xe -MSBUILD_PATH="c:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" -export PATH=$MSBUILD_PATH:$PATH - mkdir build cd build @@ -14,7 +11,7 @@ if [ "$1" = "release" ]; then fi BUILD_TYPE=RelWithDebInfo cmake \ - -G "Visual Studio 15 2017" \ + -G "Visual Studio 16 2019" \ -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ -DENABLE_OPENMP="${ENABLE_OPENMP}" \ -DENABLE_LTO=ON \ @@ -23,7 +20,7 @@ if [ "$1" = "release" ]; then else BUILD_TYPE=Debug cmake \ - -G "Visual Studio 15 2017" \ + -G "Visual Studio 16 2019" \ -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ -DENABLE_OPENMP="ON" \ -DCMAKE_GENERATOR_PLATFORM="Win32" \ diff --git a/.travis/install-macos.sh b/.github/scripts/install-macos.sh similarity index 100% rename from .travis/install-macos.sh rename to .github/scripts/install-macos.sh diff --git a/.travis/install-snap.sh b/.github/scripts/install-snap.sh similarity index 100% rename from .travis/install-snap.sh rename to .github/scripts/install-snap.sh diff --git a/.travis/install-ubuntu.sh b/.github/scripts/install-ubuntu.sh similarity index 100% rename from .travis/install-ubuntu.sh rename to .github/scripts/install-ubuntu.sh diff --git a/.travis/install-windows.sh b/.github/scripts/install-windows.sh similarity index 100% rename from .travis/install-windows.sh rename to .github/scripts/install-windows.sh diff --git a/.travis/sign-macos.sh b/.github/scripts/sign-macos.sh similarity index 100% rename from .travis/sign-macos.sh rename to .github/scripts/sign-macos.sh diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 000000000..4cf7ab407 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,240 @@ +name: CD + +on: + push: + branches: + - master + release: + types: + - created + +jobs: + test_ubuntu: + runs-on: ubuntu-18.04 + name: Test Ubuntu + steps: + - uses: actions/checkout@v2 + - name: Install Dependencies + run: .github/scripts/install-ubuntu.sh + - name: Build & Test + run: .github/scripts/build-ubuntu.sh + + test_windows: + runs-on: windows-2019 + name: Test Windows + steps: + - uses: actions/checkout@v2 + - name: Install Dependencies + run: .github/scripts/install-windows.sh + shell: bash + - name: Build & Test + run: .github/scripts/build-windows.sh + shell: bash + + test_macos: + runs-on: macos-latest + name: Test macOS + steps: + - uses: actions/checkout@v2 + - name: Install Dependencies + run: .github/scripts/install-macos.sh + - name: Build & Test + run: .github/scripts/build-macos.sh + + build_release_windows: + needs: [test_ubuntu, test_windows, test_macos] + name: Build Release Windows + runs-on: windows-2019 + steps: + - uses: actions/checkout@v2 + - name: Install Dependencies + run: .github/scripts/install-windows.sh + shell: bash + - name: Build & Test + run: .github/scripts/build-windows.sh release + shell: bash + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: windows + path: build/bin/RelWithDebInfo/solvespace.exe + + build_release_windows_openmp: + needs: [test_ubuntu, test_windows, test_macos] + name: Build Release Windows (OpenMP) + runs-on: windows-2019 + steps: + - uses: actions/checkout@v2 + - name: Install Dependencies + run: .github/scripts/install-windows.sh + shell: bash + - name: Build & Test + run: .github/scripts/build-windows.sh release openmp + shell: bash + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: windows-openmp + path: build/bin/RelWithDebInfo/solvespace-openmp.exe + + build_release_macos: + needs: [test_ubuntu, test_windows, test_macos] + name: Build Release macOS + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - name: Install Dependencies + run: .github/scripts/install-macos.sh + - name: Build & Test + run: .github/scripts/build-macos.sh release + - name: Sign Build + run: .github/scripts/sign-macos.sh + env: + MACOS_CERTIFICATE_PASSWORD: ${{ secrets.MACOS_CERTIFICATE_PASSWORD }} + MACOS_CERTIFICATE_P12: ${{ secrets.MACOS_CERTIFICATE_P12 }} + MACOS_APPSTORE_APP_PASSWORD: ${{ secrets.MACOS_APPSTORE_APP_PASSWORD }} + MACOS_APPSTORE_USERNAME: ${{ secrets.MACOS_APPSTORE_USERNAME }} + MACOS_DEVELOPER_ID: ${{ secrets.MACOS_DEVELOPER_ID }} + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: macos + path: build/bin/SolveSpace.dmg + + deploy_snap_amd64: + needs: [test_ubuntu, test_windows, test_macos] + name: Deploy AMD64 Snap + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Set Up Source + run: rsync --filter=":- .gitignore" -r ./ pkg/snap/solvespace-snap-src + - name: Build Snap + id: build + uses: diddlesnaps/snapcraft-multiarch-action@v1 + with: + path: pkg/snap + - name: Upload & Release to Edge + if: github.event_name == 'push' + uses: snapcore/action-publish@v1 + with: + store_login: ${{ secrets.SNAPSTORE_LOGIN }} + snap: ${{ steps.build.outputs.snap }} + release: edge + - name: Upload & Release to Beta + Edge + if: github.event_name == 'release' + uses: snapcore/action-publish@v1 + with: + store_login: ${{ secrets.SNAPSTORE_LOGIN }} + snap: ${{ steps.build.outputs.snap }} + release: edge,beta + + deploy_snap_arm64: + needs: [test_ubuntu, test_windows, test_macos] + name: Deploy ARM64 Snap + runs-on: ubuntu-latest + steps: + - uses: docker/setup-qemu-action@v1 + - uses: actions/checkout@v2 + - name: Set Up Source + run: rsync --filter=":- .gitignore" -r ./ pkg/snap/solvespace-snap-src + - name: Build Snap + id: build + uses: diddlesnaps/snapcraft-multiarch-action@v1 + with: + path: pkg/snap + architecture: arm64 + - name: Upload & Release to Edge + if: github.event_name == 'push' + uses: snapcore/action-publish@v1 + with: + store_login: ${{ secrets.SNAPSTORE_LOGIN }} + snap: ${{ steps.build.outputs.snap }} + release: edge + - name: Upload & Release to Beta + Edge + if: github.event_name == 'release' + uses: snapcore/action-publish@v1 + with: + store_login: ${{ secrets.SNAPSTORE_LOGIN }} + snap: ${{ steps.build.outputs.snap }} + release: edge,beta + + update_edge_release: + name: Update Edge Release + needs: [build_release_windows, build_release_windows_openmp, build_release_macos] + if: always() && github.event_name == 'push' + runs-on: ubuntu-latest + outputs: + upload_url: ${{ steps.create_release.outputs.upload_url }} + steps: + - name: Delete Old Edge Release + uses: dev-drprasad/delete-tag-and-release@v0.1.2 + with: + delete_release: true + tag_name: edge + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Create New Edge Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: edge + release_name: Edge + prerelease: true + draft: false + body: ${{ github.event.head_commit.message }} + + upload_release_assets: + name: Upload Release Assets + needs: [build_release_windows, build_release_windows_openmp, build_release_macos, update_edge_release] + if: always() + runs-on: ubuntu-latest + steps: + - name: Download All Workflow Artifacts + uses: actions/download-artifact@v2 + - name: Get Release Upload URL + id: get_upload_url + env: + event_name: ${{ github.event_name }} + event: ${{ toJson(github.event) }} + edge_upload_url: ${{ needs.update_edge_release.outputs.upload_url }} + run: | + if [ "$event_name" = "release" ]; then + upload_url=$(echo "$event" | jq -r ".release.upload_url") + else + upload_url="$edge_upload_url" + fi + echo "::set-output name=upload_url::$upload_url" + echo "Upload URL: $upload_url" + - name: Upload solvespace.exe + uses: actions/upload-release-asset@v1 + continue-on-error: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.get_upload_url.outputs.upload_url }} + asset_path: windows/solvespace.exe + asset_name: solvespace.exe + asset_content_type: binary/octet-stream + - name: Upload solvespace-openmp.exe + uses: actions/upload-release-asset@v1 + continue-on-error: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.get_upload_url.outputs.upload_url }} + asset_path: windows-openmp/solvespace-openmp.exe + asset_name: solvespace-openmp.exe + asset_content_type: binary/octet-stream + - name: Upload SolveSpace.dmg + uses: actions/upload-release-asset@v1 + continue-on-error: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.get_upload_url.outputs.upload_url }} + asset_path: macos/SolveSpace.dmg + asset_name: SolveSpace.dmg + asset_content_type: binary/octet-stream diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 000000000..71b82886f --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,41 @@ +name: Test + +on: + push: + branches-ignore: + - master + tags-ignore: + - v* + +jobs: + test_ubuntu: + runs-on: ubuntu-18.04 + name: Test Ubuntu + steps: + - uses: actions/checkout@v2 + - name: Install Dependencies + run: .github/scripts/install-ubuntu.sh + - name: Build & Test + run: .github/scripts/build-ubuntu.sh + + test_windows: + runs-on: windows-2019 + name: Test Windows + steps: + - uses: actions/checkout@v2 + - name: Install Dependencies + run: .github/scripts/install-windows.sh + shell: bash + - name: Build & Test + run: .github/scripts/build-windows.sh + shell: bash + + test_macos: + runs-on: macos-latest + name: Test macOS + steps: + - uses: actions/checkout@v2 + - name: Install Dependencies + run: .github/scripts/install-macos.sh + - name: Build & Test + run: .github/scripts/build-macos.sh diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a692aa774..000000000 --- a/.travis.yml +++ /dev/null @@ -1,115 +0,0 @@ -os: linux -dist: xenial -language: c -git: - submodules: false -if: tag != edge -stages: - - test - - name: clean - if: (NOT type IN (pull_request)) AND (branch = master) - - name: deploy - if: (NOT type IN (pull_request)) AND (branch = master OR tag IS present) -jobs: - include: - - stage: clean - name: Remove Github Release - os: linux - dist: bionic - script: .travis/remove-edge.sh - - stage: test - name: macOS - os: osx - osx_image: xcode12.2 - install: ".travis/install-macos.sh" - script: ".travis/build-macos.sh" - - stage: deploy - name: macOS - os: osx - osx_image: xcode12.2 - install: ".travis/install-macos.sh" - script: ".travis/build-macos.sh release && .travis/sign-macos.sh" - before_deploy: source .travis/tag-edge.sh - deploy: - provider: releases - skip_cleanup: true - prerelease: true - overwrite: true - edge: true - name: ${TRAVIS_TAG:-edge} - release_notes: $TRAVIS_COMMIT_MESSAGE - file: build/bin/SolveSpace.dmg - on: - all_branches: true - - stage: test - name: "Ubuntu" - os: linux - dist: bionic - install: .travis/install-ubuntu.sh - script: .travis/build-ubuntu.sh - - stage: test - name: "Windows" - os: windows - install: .travis/install-windows.sh - script: .travis/build-windows.sh - - stage: deploy - name: "Windows" - os: windows - install: .travis/install-windows.sh - script: .travis/build-windows.sh release - before_deploy: source .travis/tag-edge.sh - deploy: - provider: releases - skip_cleanup: true - prerelease: true - overwrite: true - edge: true - name: ${TRAVIS_TAG:-edge} - release_notes: $TRAVIS_COMMIT_MESSAGE - file: build/bin/RelWithDebInfo/solvespace.exe - on: - all_branches: true - - stage: deploy - name: "Windows with OpenMP" - os: windows - install: .travis/install-windows.sh - script: .travis/build-windows.sh release openmp - before_deploy: source .travis/tag-edge.sh - deploy: - provider: releases - skip_cleanup: true - prerelease: true - overwrite: true - edge: true - name: ${TRAVIS_TAG:-edge} - release_notes: $TRAVIS_COMMIT_MESSAGE - file: build/bin/RelWithDebInfo/solvespace-openmp.exe - on: - all_branches: true - - &deploy-snap - stage: deploy - name: Snap amd64 - os: linux - arch: amd64 - dist: focal - addons: - snaps: - - name: snapcraft - confinement: classic - - name: lxd - install: .travis/install-snap.sh - script: .travis/build-snap.sh - deploy: - - provider: script - script: .travis/deploy-snap.sh edge - skip_cleanup: true - - provider: script - script: .travis/deploy-snap.sh edge,beta - skip_cleanup: true - on: - tags: true - - <<: *deploy-snap - name: Snap arm64 - arch: arm64-graviton2 - group: edge - virt: vm diff --git a/.travis/deploy-snap.sh b/.travis/deploy-snap.sh deleted file mode 100755 index 9cbab5b1f..000000000 --- a/.travis/deploy-snap.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -e - -channels="$1" -echo "$SNAP_TOKEN" | snapcraft login --with - - -for snap in ./pkg/snap/*.snap; do - snapcraft upload "$snap" --release "$channels" -done diff --git a/.travis/remove-edge.sh b/.travis/remove-edge.sh deleted file mode 100755 index 4321ff586..000000000 --- a/.travis/remove-edge.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh -xe - -sudo apt-get update -qq -sudo apt-get -y install jq - -old_release=$(curl \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/solvespace/solvespace/releases/tags/edge \ - | jq -r ".url") - -if [ -z "$old_release" ]; then - curl \ - -X DELETE \ - -H "Accept: application/vnd.github.v3+json" \ - -H "Authorization: token $GITHUB_TOKEN" \ - "$old_release" -fi - -curl \ - -X DELETE \ - -H "Accept: application/vnd.github.v3+json" \ - -H "Authorization: token $GITHUB_TOKEN" \ - https://api.github.com/repos/solvespace/solvespace/git/refs/tags/edge diff --git a/.travis/tag-edge.sh b/.travis/tag-edge.sh deleted file mode 100755 index 8ce6a194c..000000000 --- a/.travis/tag-edge.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh -xe - -if [ -z "$TRAVIS_TAG" ]; then - git config --local user.name "solvespace-cd" - git config --local user.email "no-reply@solvespace.com" - export TRAVIS_TAG="edge" - git tag --force $TRAVIS_TAG -fi diff --git a/README.md b/README.md index cbeb89f5c..a367bcb94 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ SolveSpace ========== -[![Build Status](https://travis-ci.com/solvespace/solvespace.svg?branch=master)](https://travis-ci.com/solvespace/solvespace) +[![Build Status](https://github.com/solvespace/solvespace/workflows/CD/badge.svg)](https://github.com/solvespace/solvespace/actions) [![solvespace](https://snapcraft.io/solvespace/badge.svg)](https://snapcraft.io/solvespace) [![solvespace](https://snapcraft.io/solvespace/trending.svg?name=0)](https://snapcraft.io/solvespace) From 22440fd5409bfebec9d626bd6c5fc61dfbc35c86 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Fri, 4 Dec 2020 23:27:16 +0100 Subject: [PATCH 199/646] Analyze | Stop Tracing (Ctrl+Shift+S) saves CSV only if a point is being traced This avoids confusion with "Ctrl+Shift+S" being used as "Save As..." shortcut on some platforms. --- src/solvespace.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index acc7162e5..cc89fed0e 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -904,6 +904,9 @@ void SolveSpaceUI::MenuAnalyze(Command id) { break; case Command::STOP_TRACING: { + if (SS.traced.point == Entity::NO_ENTITY) { + break; + } Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::CsvFileFilters); dialog->ThawChoices(settings, "Trace"); From a8058987bf5e2568cdfaaad6733ec578da128d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Sun, 22 Mar 2020 23:20:54 +0100 Subject: [PATCH 200/646] Make Path::SetExtension("") not include a dot --- src/platform/platform.cpp | 6 ++++-- test/core/path/test.cpp | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/platform/platform.cpp b/src/platform/platform.cpp index f025c861b..008541319 100644 --- a/src/platform/platform.cpp +++ b/src/platform/platform.cpp @@ -185,8 +185,10 @@ Path Path::WithExtension(std::string ext) const { if(dot != std::string::npos) { withExt.raw.erase(dot); } - withExt.raw += "."; - withExt.raw += ext; + if(!ext.empty()) { + withExt.raw += "."; + withExt.raw += ext; + } return withExt; } diff --git a/test/core/path/test.cpp b/test/core/path/test.cpp index 926395649..86accf1f3 100644 --- a/test/core/path/test.cpp +++ b/test/core/path/test.cpp @@ -83,6 +83,7 @@ TEST_CASE(extension) { } TEST_CASE(with_extension) { + CHECK_EQ_STR(Path::From("foo.bar").WithExtension("").raw, "foo"); CHECK_EQ_STR(Path::From("foo.bar").WithExtension("baz").raw, "foo.baz"); CHECK_EQ_STR(Path::From("foo").WithExtension("baz").raw, "foo.baz"); } From ad5199dae2a24a8dc31a58c9577e69ebfadb2b65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Sat, 21 Mar 2020 19:37:14 +0100 Subject: [PATCH 201/646] Suggest sensible defaults in file dialogs Went through first the diff of the referenced commit, then all instances of "Create(Open|Save)FileDialog"; added SuggestFilename() calls where a default exists This has been previously removed in 6b5db5897155ca9bdc5daa3e791c07723a6b7d9c Closes #538 --- src/file.cpp | 5 ++++- src/platform/gui.h | 1 + src/platform/guigtk.cpp | 4 ++++ src/platform/guimac.mm | 4 ++++ src/platform/guiwin.cpp | 4 ++++ src/solvespace.cpp | 7 +++++++ 6 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/file.cpp b/src/file.cpp index acb931f0e..f36e49b34 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -904,11 +904,13 @@ bool SolveSpaceUI::ReloadAllLinked(const Platform::Path &saveFile, bool canCance } else if(linkMap.count(g.linkFile) == 0) { dbp("Missing file for group: %s", g.name.c_str()); // The file was moved; prompt the user for its new location. - switch(LocateImportedFile(g.linkFile.RelativeTo(saveFile), canCancel)) { + const auto linkFileRelative = g.linkFile.RelativeTo(saveFile); + switch(LocateImportedFile(linkFileRelative, canCancel)) { case Platform::MessageDialog::Response::YES: { Platform::FileDialogRef dialog = Platform::CreateOpenFileDialog(SS.GW.window); dialog->AddFilters(Platform::SolveSpaceModelFileFilters); dialog->ThawChoices(settings, "LinkSketch"); + dialog->SuggestFilename(linkFileRelative); if(dialog->RunModal()) { dialog->FreezeChoices(settings, "LinkSketch"); linkMap[g.linkFile] = dialog->GetFilename(); @@ -985,6 +987,7 @@ bool SolveSpaceUI::ReloadLinkedImage(const Platform::Path &saveFile, Platform::FileDialogRef dialog = Platform::CreateOpenFileDialog(SS.GW.window); dialog->AddFilters(Platform::RasterFileFilters); dialog->ThawChoices(settings, "LinkImage"); + dialog->SuggestFilename(filename->RelativeTo(saveFile)); if(dialog->RunModal()) { dialog->FreezeChoices(settings, "LinkImage"); *filename = dialog->GetFilename(); diff --git a/src/platform/gui.h b/src/platform/gui.h index 7b2cdf5a4..1608a6f21 100644 --- a/src/platform/gui.h +++ b/src/platform/gui.h @@ -356,6 +356,7 @@ class FileDialog { virtual Platform::Path GetFilename() = 0; virtual void SetFilename(Platform::Path path) = 0; + virtual void SuggestFilename(Platform::Path path) = 0; virtual void AddFilter(std::string name, std::vector extensions) = 0; void AddFilter(const FileFilter &filter); diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index cd5d0b8df..0c857df76 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -1246,6 +1246,10 @@ class FileDialogImplGtk : public FileDialog { gtkChooser->set_filename(path.raw); } + void SuggestFilename(Platform::Path path) override { + SetFilename(path.WithExtension("")); // TODO + } + void AddFilter(std::string name, std::vector extensions) override { Glib::RefPtr gtkFilter = Gtk::FileFilter::create(); Glib::ustring desc; diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index 5aa7f054b..978973646 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -1274,6 +1274,10 @@ void SetFilename(Platform::Path path) override { nsPanel.nameFieldStringValue = Wrap(path.FileStem()); } + void SuggestFilename(Platform::Path path) override { + SetFilename(path.WithExtension("")); + } + void FreezeChoices(SettingsRef settings, const std::string &key) override { settings->FreezeString("Dialog_" + key + "_Folder", [nsPanel.directoryURL.absoluteString UTF8String]); diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index d50d24d47..cc930775a 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1582,6 +1582,10 @@ class FileDialogImplWin32 final : public FileDialog { wcsncpy(filenameWC, Widen(path.raw).c_str(), sizeof(filenameWC) / sizeof(wchar_t) - 1); } + void SuggestFilename(Platform::Path path) override { + SetFilename(Platform::Path::From(path.FileStem())); + } + void AddFilter(std::string name, std::vector extensions) override { std::string desc, patterns; for(auto extension : extensions) { diff --git a/src/solvespace.cpp b/src/solvespace.cpp index cc89fed0e..55f6dedd8 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -627,6 +627,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::RasterFileFilters); dialog->ThawChoices(settings, "ExportImage"); + dialog->SuggestFilename(SS.saveFile); if(dialog->RunModal()) { dialog->FreezeChoices(settings, "ExportImage"); SS.ExportAsPngTo(dialog->GetFilename()); @@ -638,6 +639,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::VectorFileFilters); dialog->ThawChoices(settings, "ExportView"); + dialog->SuggestFilename(SS.saveFile); if(!dialog->RunModal()) break; dialog->FreezeChoices(settings, "ExportView"); @@ -661,6 +663,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::Vector3dFileFilters); dialog->ThawChoices(settings, "ExportWireframe"); + dialog->SuggestFilename(SS.saveFile); if(!dialog->RunModal()) break; dialog->FreezeChoices(settings, "ExportWireframe"); @@ -672,6 +675,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::VectorFileFilters); dialog->ThawChoices(settings, "ExportSection"); + dialog->SuggestFilename(SS.saveFile); if(!dialog->RunModal()) break; dialog->FreezeChoices(settings, "ExportSection"); @@ -683,6 +687,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::MeshFileFilters); dialog->ThawChoices(settings, "ExportMesh"); + dialog->SuggestFilename(SS.saveFile); if(!dialog->RunModal()) break; dialog->FreezeChoices(settings, "ExportMesh"); @@ -694,6 +699,7 @@ void SolveSpaceUI::MenuFile(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::SurfaceFileFilters); dialog->ThawChoices(settings, "ExportSurfaces"); + dialog->SuggestFilename(SS.saveFile); if(!dialog->RunModal()) break; dialog->FreezeChoices(settings, "ExportSurfaces"); @@ -910,6 +916,7 @@ void SolveSpaceUI::MenuAnalyze(Command id) { Platform::FileDialogRef dialog = Platform::CreateSaveFileDialog(SS.GW.window); dialog->AddFilters(Platform::CsvFileFilters); dialog->ThawChoices(settings, "Trace"); + dialog->SetFilename(SS.saveFile); if(dialog->RunModal()) { dialog->FreezeChoices(settings, "Trace"); From 507fcadf3a4ffd05bc303c63071f9197eb80ba3a Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 9 Dec 2020 20:46:20 -0500 Subject: [PATCH 202/646] Use good default filenames on Linux/GTK --- src/platform/guigtk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index 0c857df76..287515eb4 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -1247,7 +1247,7 @@ class FileDialogImplGtk : public FileDialog { } void SuggestFilename(Platform::Path path) override { - SetFilename(path.WithExtension("")); // TODO + gtkChooser->set_current_name(path.FileStem()+"."+GetExtension()); } void AddFilter(std::string name, std::vector extensions) override { From 42b53e37a70cd79a78f86be25fd042b642bc5d00 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Thu, 10 Dec 2020 11:20:22 +0100 Subject: [PATCH 203/646] Run Test CI for pull requests --- .github/workflows/test.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 71b82886f..27462aeff 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,6 +1,9 @@ name: Test on: + pull_request: + branches: + - master push: branches-ignore: - master From c68d4568e5421a59f766ae71bb85c8e39f5dbfd9 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 23 Nov 2020 22:11:14 +0100 Subject: [PATCH 204/646] Improve zooming with trackpad and scrollwheel On macOS actual scroll delta is used for the zoom amount. On Windows WHEEL_DELTA is used to allow smooth scrolling if supported. Shift+Scroll is added for 10x finer zooming. --- CHANGELOG.md | 1 + src/mouse.cpp | 22 ++++++++++++++-------- src/platform/guigtk.cpp | 4 ++-- src/platform/guimac.mm | 7 +++---- src/platform/guiwin.cpp | 2 +- src/textwin.cpp | 15 ++++++++++++--- src/ui.h | 2 +- 7 files changed, 34 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b302f403c..8447d0ef4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -113,6 +113,7 @@ Other new features: that are shortcuts to the respective configuration screens. * New cmake build options using -DENABLE_OPENMP=yes and -DENABLE_LTO=yes to enable support for multi-threading and link-time optimization. + * "Shift+Scroll" for ten times finer zoom. Bugs fixed: * Fixed broken --view options for command line thumbnail image creation. diff --git a/src/mouse.cpp b/src/mouse.cpp index 6c22a0cb1..729c8ee2c 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -877,7 +877,6 @@ bool GraphicsWindow::ConstrainPointByHovered(hEntity pt, const Point2d *projecte bool GraphicsWindow::MouseEvent(Platform::MouseEvent event) { using Platform::MouseEvent; - double width, height; window->GetContentSize(&width, &height); @@ -918,7 +917,7 @@ bool GraphicsWindow::MouseEvent(Platform::MouseEvent event) { break; case MouseEvent::Type::SCROLL_VERT: - this->MouseScroll(event.x, event.y, (int)event.scrollDelta); + this->MouseScroll(event.x, event.y, event.shiftDown ? event.scrollDelta / 10 : event.scrollDelta); break; case MouseEvent::Type::LEAVE: @@ -1472,18 +1471,25 @@ void GraphicsWindow::EditControlDone(const std::string &s) { } } -void GraphicsWindow::MouseScroll(double x, double y, int delta) { +void GraphicsWindow::MouseScroll(double x, double y, double delta) { double offsetRight = offset.Dot(projRight); double offsetUp = offset.Dot(projUp); double righti = x/scale - offsetRight; double upi = y/scale - offsetUp; - if(delta > 0) { - scale *= 1.2; - } else if(delta < 0) { - scale /= 1.2; - } else return; + // The default zoom factor is 1.2x for one scroll wheel click (delta==1). + // To support smooth scrolling where scroll wheel events come in increments + // smaller (or larger) than 1 we do: + // scale *= exp(ln(1.2) * delta); + // to ensure that the same total scroll delta always results in the same + // total zoom irrespective of in how many increments the zoom was applied. + // For example if we scroll a total delta of a+b in two events vs. one then + // scale * e^a * e^b == scale * e^(a+b) + // while + // scale * a * b != scale * (a+b) + // So this constant is ln(1.2) = 0.1823216 to make the default zoom 1.2x + scale *= exp(0.1823216 * delta); double rightf = x/scale - offsetRight; double upf = y/scale - offsetUp; diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index 287515eb4..e8113ed22 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -472,7 +472,7 @@ class GtkGLWidget : public Gtk::GLArea { } bool process_pointer_event(MouseEvent::Type type, double x, double y, - guint state, guint button = 0, int scroll_delta = 0) { + guint state, guint button = 0, double scroll_delta = 0) { MouseEvent event = {}; event.type = type; event.x = x; @@ -536,7 +536,7 @@ class GtkGLWidget : public Gtk::GLArea { } bool on_scroll_event(GdkEventScroll *gdk_event) override { - int delta; + double delta; if(gdk_event->delta_y < 0 || gdk_event->direction == GDK_SCROLL_UP) { delta = 1; } else if(gdk_event->delta_y > 0 || gdk_event->direction == GDK_SCROLL_DOWN) { diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index 978973646..b2b07a8bf 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -554,7 +554,9 @@ - (void)scrollWheel:(NSEvent *)nsEvent { MouseEvent event = [self convertMouseEvent:nsEvent]; event.type = MouseEvent::Type::SCROLL_VERT; - event.scrollDelta = [nsEvent deltaY]; + + bool isPrecise = [nsEvent hasPreciseScrollingDeltas]; + event.scrollDelta = [nsEvent scrollingDeltaY] / (isPrecise ? 50 : 5); if(receiver->onMouseEvent) { receiver->onMouseEvent(event); @@ -975,9 +977,6 @@ void SetScrollbarPosition(double pos) override { if(GetScrollbarPosition() == pos) return; [nsScroller setDoubleValue:(pos / (ssView.scrollerMax - ssView.scrollerMin))]; - if(onScrollbarAdjusted) { - onScrollbarAdjusted(pos); - } } void Invalidate() override { diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index cc930775a..ebd2667b2 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -925,7 +925,7 @@ class WindowImplWin32 final : public Window { event.y = pt.y / pixelRatio; event.type = MouseEvent::Type::SCROLL_VERT; - event.scrollDelta = GET_WHEEL_DELTA_WPARAM(wParam) > 0 ? 1 : -1; + event.scrollDelta = GET_WHEEL_DELTA_WPARAM(wParam) / WHEEL_DELTA; break; case WM_MOUSELEAVE: diff --git a/src/textwin.cpp b/src/textwin.cpp index e243825cf..3e3392261 100644 --- a/src/textwin.cpp +++ b/src/textwin.cpp @@ -252,8 +252,18 @@ void TextWindow::Init() { MouseLeave(); return true; } else if(event.type == MouseEvent::Type::SCROLL_VERT) { - ScrollbarEvent(window->GetScrollbarPosition() - - LINE_HEIGHT / 2 * event.scrollDelta); + if (event.scrollDelta == 0) { + return true; + } + if (abs(event.scrollDelta) < 0.2) { + if (event.scrollDelta > 0) { + event.scrollDelta = 0.2; + } else { + event.scrollDelta = -0.2; + } + } + double offset = LINE_HEIGHT / 2 * event.scrollDelta; + ScrollbarEvent(window->GetScrollbarPosition() - offset); } return false; }; @@ -1148,7 +1158,6 @@ void TextWindow::ScrollbarEvent(double newPos) { int bottom = top[rows-1] + 2; newPos = min((int)newPos, bottom - halfRows); newPos = max((int)newPos, 0); - if(newPos != scrollPos) { scrollPos = (int)newPos; window->SetScrollbarPosition(scrollPos); diff --git a/src/ui.h b/src/ui.h index 8bdd701c6..6563a144c 100644 --- a/src/ui.h +++ b/src/ui.h @@ -825,7 +825,7 @@ class GraphicsWindow { void MouseLeftDoubleClick(double x, double y); void MouseMiddleOrRightDown(double x, double y); void MouseRightUp(double x, double y); - void MouseScroll(double x, double y, int delta); + void MouseScroll(double x, double y, double delta); void MouseLeave(); bool KeyboardEvent(Platform::KeyboardEvent event); void EditControlDone(const std::string &s); From 2a293f52f2c23bbac75879a440f274aa013d4d7a Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 13 Dec 2020 16:06:26 -0500 Subject: [PATCH 205/646] remove the CLA and commercial licensing text. --- CONTRIBUTING.md | 6 +++--- README.md | 4 +--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4caf715ba..aee8bb592 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,11 +14,11 @@ Bug reports are always welcome! When reporting a bug, please include the followi GitHub does not allow attaching `*.slvs` files, but it does allow attaching `*.zip` files, so any savefiles should first be archived. -Signing the CLA +Licensing --------------- -To contribute code, translations, artwork, or other resources to SolveSpace, it is necessary to -sign a [Contributor License Agreement](https://cla-assistant.io/solvespace/solvespace). +SolveSpace is licensed under the GPLv3 and any contributions must be made available +under the terms of that license. Contributing translations ------------------------- diff --git a/README.md b/README.md index a367bcb94..098f1f076 100644 --- a/README.md +++ b/README.md @@ -254,6 +254,4 @@ and debug SolveSpace. License ------- -SolveSpace is distributed under the terms of the [GPL v3 license](COPYING.txt). It is possible -to license SolveSpace for use in a commercial application; to do so, -[contact](http://solvespace.com/contact.pl) the developers. +SolveSpace is distributed under the terms of the [GPL v3 license](COPYING.txt). From 554ab4df8c3351b2fffcc62c51fd08d21f0a3816 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Wed, 16 Dec 2020 19:04:18 +0100 Subject: [PATCH 206/646] Fix snap to grid not working in some situations --- src/graphicswin.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 5aed9663b..33bb708de 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -1175,10 +1175,7 @@ void GraphicsWindow::MenuEdit(Command id) { } // Regenerate, with these points marked as dragged so that they // get placed as close as possible to our snap grid. - SS.GW.ClearPending(); - SS.GW.ClearSelection(); - SS.GW.Invalidate(); break; } From 2d6a8d66e7f58279012381bc37bb2a170b7d6424 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 21 Dec 2020 16:02:37 +0100 Subject: [PATCH 207/646] Fix marquee selection when the view is rotated away from the working plane --- src/draw.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/draw.cpp b/src/draw.cpp index 0a21c1985..ccaeb961d 100644 --- a/src/draw.cpp +++ b/src/draw.cpp @@ -207,8 +207,8 @@ void GraphicsWindow::MakeSelected(Selection *stog) { //----------------------------------------------------------------------------- void GraphicsWindow::SelectByMarquee() { Point2d marqueePoint = ProjectPoint(orig.marqueePoint); - BBox marqueeBBox = BBox::From(Vector::From(marqueePoint.x, marqueePoint.y, -1), - Vector::From(orig.mouse.x, orig.mouse.y, 1)); + BBox marqueeBBox = BBox::From(Vector::From(marqueePoint.x, marqueePoint.y, VERY_NEGATIVE), + Vector::From(orig.mouse.x, orig.mouse.y, VERY_POSITIVE)); Entity *e; for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { From d409af6914ee03b2a495a80459bd29e42e172e09 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 21 Dec 2020 16:03:18 +0100 Subject: [PATCH 208/646] Fix normal selection with marquee --- src/drawentity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drawentity.cpp b/src/drawentity.cpp index d8763360e..4ccd228b0 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -64,7 +64,7 @@ BBox Entity::GetOrGenerateScreenBBox(bool *hasBBox) { Vector proj = SS.GW.ProjectPoint3(PointGetNum()); screenBBox = BBox::From(proj, proj); } else if(IsNormal()) { - Vector proj = SK.GetEntity(point[0])->PointGetNum(); + Vector proj = SS.GW.ProjectPoint3(SK.GetEntity(point[0])->PointGetNum()); screenBBox = BBox::From(proj, proj); } else if(!sbl->l.IsEmpty()) { Vector first = SS.GW.ProjectPoint3(sbl->l[0].ctrl[0]); From cf12d00d63ad0525dc2fb7a50063463748c66cf6 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 21 Dec 2020 16:03:42 +0100 Subject: [PATCH 209/646] Fix an off-by-one error that missed the last point when generating screen bounding boxes --- src/drawentity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drawentity.cpp b/src/drawentity.cpp index 4ccd228b0..6260f0dcb 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -70,7 +70,7 @@ BBox Entity::GetOrGenerateScreenBBox(bool *hasBBox) { Vector first = SS.GW.ProjectPoint3(sbl->l[0].ctrl[0]); screenBBox = BBox::From(first, first); for(auto &sb : sbl->l) { - for(int i = 0; i < sb.deg; ++i) { screenBBox.Include(SS.GW.ProjectPoint3(sb.ctrl[i])); } + for(int i = 0; i <= sb.deg; ++i) { screenBBox.Include(SS.GW.ProjectPoint3(sb.ctrl[i])); } } } else ssassert(false, "Expected entity to be a point or have beziers"); From 905dee9d61daac4ca9f067b791c3f047af30b37f Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Tue, 22 Dec 2020 14:09:31 +0100 Subject: [PATCH 210/646] Fix paste transformed not correcting tangent arcs when mirrored (#833) --- src/clipboard.cpp | 31 ++++++++++-- src/constraint.cpp | 119 +++++++++++++++++++++++++-------------------- src/sketch.h | 3 ++ 3 files changed, 97 insertions(+), 56 deletions(-) diff --git a/src/clipboard.cpp b/src/clipboard.cpp index dbcd1dfa8..d43ec4582 100644 --- a/src/clipboard.cpp +++ b/src/clipboard.cpp @@ -245,18 +245,41 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { c.reference = cc->reference; c.disp = cc->disp; c.comment = cc->comment; - bool removeConstraint = false; + bool dontAddConstraint = false; switch(c.type) { case Constraint::Type::COMMENT: c.disp.offset = c.disp.offset.Plus(trans); break; - case Constraint::Type::PT_PT_DISTANCE: case Constraint::Type::PT_LINE_DISTANCE: case Constraint::Type::PROJ_PT_DISTANCE: case Constraint::Type::DIAMETER: c.valA *= fabs(scale); break; + case Constraint::Type::ARC_LINE_TANGENT: { + Entity *line = SK.GetEntity(c.entityB), + *arc = SK.GetEntity(c.entityA); + if(line->type == Entity::Type::ARC_OF_CIRCLE) { + swap(line, arc); + } + Constraint::ConstrainArcLineTangent(&c, line, arc); + break; + } + case Constraint::Type::CUBIC_LINE_TANGENT: { + Entity *line = SK.GetEntity(c.entityB), + *cubic = SK.GetEntity(c.entityA); + if(line->type == Entity::Type::CUBIC) { + swap(line, cubic); + } + Constraint::ConstrainCubicLineTangent(&c, line, cubic); + break; + } + case Constraint::Type::CURVE_CURVE_TANGENT: { + Entity *eA = SK.GetEntity(c.entityA), + *eB = SK.GetEntity(c.entityB); + Constraint::ConstrainCurveCurveTangent(&c, eA, eB); + break; + } case Constraint::Type::HORIZONTAL: case Constraint::Type::VERTICAL: // When rotating 90 or 270 degrees, swap the vertical / horizontal constaints @@ -267,13 +290,13 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { c.type = Constraint::Type::HORIZONTAL; } } else if (fmod(theta, PI/2) != 0) { - removeConstraint = true; + dontAddConstraint = true; } break; default: break; } - if (!removeConstraint) { + if (!dontAddConstraint) { hConstraint hc = Constraint::AddConstraint(&c, /*rememberForUndo=*/false); if(c.type == Constraint::Type::COMMENT) { MakeSelected(hc); diff --git a/src/constraint.cpp b/src/constraint.cpp index a66f6d367..2acc21156 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -127,6 +127,66 @@ hConstraint Constraint::ConstrainCoincident(hEntity ptA, hEntity ptB) { Entity::NO_ENTITY, Entity::NO_ENTITY, /*other=*/false, /*other2=*/false); } +void Constraint::ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *arc) { + Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), + l1 = SK.GetEntity(line->point[1])->PointGetNum(); + Vector a1 = SK.GetEntity(arc->point[1])->PointGetNum(), + a2 = SK.GetEntity(arc->point[2])->PointGetNum(); + if(l0.Equals(a1) || l1.Equals(a1)) { + c->other = false; + } else if(l0.Equals(a2) || l1.Equals(a2)) { + c->other = true; + } else { + Error(_("The tangent arc and line segment must share an " + "endpoint. Constrain them with Constrain -> " + "On Point before constraining tangent.")); + return; + } +} + +void Constraint::ConstrainCubicLineTangent(Constraint *c, Entity *line, Entity *cubic) { + Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), + l1 = SK.GetEntity(line->point[1])->PointGetNum(); + Vector as = cubic->CubicGetStartNum(), + af = cubic->CubicGetFinishNum(); + + if(l0.Equals(as) || l1.Equals(as)) { + c->other = false; + } else if(l0.Equals(af) || l1.Equals(af)) { + c->other = true; + } else { + Error(_("The tangent cubic and line segment must share an " + "endpoint. Constrain them with Constrain -> " + "On Point before constraining tangent.")); + return; + } +} + +void Constraint::ConstrainCurveCurveTangent(Constraint *c, Entity *eA, Entity *eB) { + Vector as = eA->EndpointStart(), + af = eA->EndpointFinish(), + bs = eB->EndpointStart(), + bf = eB->EndpointFinish(); + if(as.Equals(bs)) { + c->other = false; + c->other2 = false; + } else if(as.Equals(bf)) { + c->other = false; + c->other2 = true; + } else if(af.Equals(bs)) { + c->other = true; + c->other2 = false; + } else if(af.Equals(bf)) { + c->other = true; + c->other2 = true; + } else { + Error(_("The curves must share an endpoint. Constrain them " + "with Constrain -> On Point before constraining " + "tangent.")); + return; + } +} + void Constraint::MenuConstrain(Command id) { Constraint c = {}; c.group = SS.GW.activeGroup; @@ -617,50 +677,22 @@ void Constraint::MenuConstrain(Command id) { c.entityA = gs.vector[0]; c.entityB = gs.vector[1]; } else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) { - Entity *line = SK.GetEntity(gs.entity[0]); - Entity *arc = SK.GetEntity(gs.entity[1]); + Entity *line = SK.GetEntity(gs.entity[0]), + *arc = SK.GetEntity(gs.entity[1]); if(line->type == Entity::Type::ARC_OF_CIRCLE) { swap(line, arc); } - Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), - l1 = SK.GetEntity(line->point[1])->PointGetNum(); - Vector a1 = SK.GetEntity(arc->point[1])->PointGetNum(), - a2 = SK.GetEntity(arc->point[2])->PointGetNum(); - - if(l0.Equals(a1) || l1.Equals(a1)) { - c.other = false; - } else if(l0.Equals(a2) || l1.Equals(a2)) { - c.other = true; - } else { - Error(_("The tangent arc and line segment must share an " - "endpoint. Constrain them with Constrain -> " - "On Point before constraining tangent.")); - return; - } + ConstrainArcLineTangent(&c, line, arc); c.type = Type::ARC_LINE_TANGENT; c.entityA = arc->h; c.entityB = line->h; } else if(gs.lineSegments == 1 && gs.cubics == 1 && gs.n == 2) { - Entity *line = SK.GetEntity(gs.entity[0]); - Entity *cubic = SK.GetEntity(gs.entity[1]); + Entity *line = SK.GetEntity(gs.entity[0]), + *cubic = SK.GetEntity(gs.entity[1]); if(line->type == Entity::Type::CUBIC) { swap(line, cubic); } - Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), - l1 = SK.GetEntity(line->point[1])->PointGetNum(); - Vector as = cubic->CubicGetStartNum(), - af = cubic->CubicGetFinishNum(); - - if(l0.Equals(as) || l1.Equals(as)) { - c.other = false; - } else if(l0.Equals(af) || l1.Equals(af)) { - c.other = true; - } else { - Error(_("The tangent cubic and line segment must share an " - "endpoint. Constrain them with Constrain -> " - "On Point before constraining tangent.")); - return; - } + ConstrainCubicLineTangent(&c, line, cubic); c.type = Type::CUBIC_LINE_TANGENT; c.entityA = cubic->h; c.entityB = line->h; @@ -671,24 +703,7 @@ void Constraint::MenuConstrain(Command id) { } Entity *eA = SK.GetEntity(gs.entity[0]), *eB = SK.GetEntity(gs.entity[1]); - Vector as = eA->EndpointStart(), - af = eA->EndpointFinish(), - bs = eB->EndpointStart(), - bf = eB->EndpointFinish(); - if(as.Equals(bs)) { - c.other = false; c.other2 = false; - } else if(as.Equals(bf)) { - c.other = false; c.other2 = true; - } else if(af.Equals(bs)) { - c.other = true; c.other2 = false; - } else if(af.Equals(bf)) { - c.other = true; c.other2 = true; - } else { - Error(_("The curves must share an endpoint. Constrain them " - "with Constrain -> On Point before constraining " - "tangent.")); - return; - } + ConstrainCurveCurveTangent(&c, eA, eB); c.type = Type::CURVE_CURVE_TANGENT; c.entityA = eA->h; c.entityB = eB->h; diff --git a/src/sketch.h b/src/sketch.h index 869e0b6f1..83773749d 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -790,6 +790,9 @@ class Constraint : public ConstraintBase { static hConstraint TryConstrain(Constraint::Type type, hEntity ptA, hEntity ptB, hEntity entityA, hEntity entityB = Entity::NO_ENTITY, bool other = false, bool other2 = false); + static void ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *arc); + static void ConstrainCubicLineTangent(Constraint *c, Entity *line, Entity *cubic); + static void ConstrainCurveCurveTangent(Constraint *c, Entity *eA, Entity *eB); }; class hEquation { From 0840109f1820d42cb4f820becf6f1e2efb39905a Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 22 Dec 2020 20:33:58 +0200 Subject: [PATCH 211/646] Clean up paste transformed and constrain operations a bit. --- src/clipboard.cpp | 21 ++++++--------------- src/constraint.cpp | 15 +++++++++------ 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/clipboard.cpp b/src/clipboard.cpp index d43ec4582..6e83aa345 100644 --- a/src/clipboard.cpp +++ b/src/clipboard.cpp @@ -257,27 +257,18 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { c.valA *= fabs(scale); break; case Constraint::Type::ARC_LINE_TANGENT: { - Entity *line = SK.GetEntity(c.entityB), - *arc = SK.GetEntity(c.entityA); - if(line->type == Entity::Type::ARC_OF_CIRCLE) { - swap(line, arc); - } - Constraint::ConstrainArcLineTangent(&c, line, arc); + Constraint::ConstrainArcLineTangent(&c, SK.GetEntity(c.entityB), + SK.GetEntity(c.entityA)); break; } case Constraint::Type::CUBIC_LINE_TANGENT: { - Entity *line = SK.GetEntity(c.entityB), - *cubic = SK.GetEntity(c.entityA); - if(line->type == Entity::Type::CUBIC) { - swap(line, cubic); - } - Constraint::ConstrainCubicLineTangent(&c, line, cubic); + Constraint::ConstrainCubicLineTangent(&c, SK.GetEntity(c.entityB), + SK.GetEntity(c.entityA)); break; } case Constraint::Type::CURVE_CURVE_TANGENT: { - Entity *eA = SK.GetEntity(c.entityA), - *eB = SK.GetEntity(c.entityB); - Constraint::ConstrainCurveCurveTangent(&c, eA, eB); + Constraint::ConstrainCurveCurveTangent(&c, SK.GetEntity(c.entityA), + SK.GetEntity(c.entityB)); break; } case Constraint::Type::HORIZONTAL: diff --git a/src/constraint.cpp b/src/constraint.cpp index 2acc21156..7b3c3eb43 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -128,10 +128,15 @@ hConstraint Constraint::ConstrainCoincident(hEntity ptA, hEntity ptB) { } void Constraint::ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *arc) { + if(line->type == Entity::Type::ARC_OF_CIRCLE) { + swap(line, arc); + } + Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), l1 = SK.GetEntity(line->point[1])->PointGetNum(); Vector a1 = SK.GetEntity(arc->point[1])->PointGetNum(), a2 = SK.GetEntity(arc->point[2])->PointGetNum(); + if(l0.Equals(a1) || l1.Equals(a1)) { c->other = false; } else if(l0.Equals(a2) || l1.Equals(a2)) { @@ -145,6 +150,10 @@ void Constraint::ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *ar } void Constraint::ConstrainCubicLineTangent(Constraint *c, Entity *line, Entity *cubic) { + if(line->type == Entity::Type::CUBIC) { + swap(line, cubic); + } + Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), l1 = SK.GetEntity(line->point[1])->PointGetNum(); Vector as = cubic->CubicGetStartNum(), @@ -679,9 +688,6 @@ void Constraint::MenuConstrain(Command id) { } else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) { Entity *line = SK.GetEntity(gs.entity[0]), *arc = SK.GetEntity(gs.entity[1]); - if(line->type == Entity::Type::ARC_OF_CIRCLE) { - swap(line, arc); - } ConstrainArcLineTangent(&c, line, arc); c.type = Type::ARC_LINE_TANGENT; c.entityA = arc->h; @@ -689,9 +695,6 @@ void Constraint::MenuConstrain(Command id) { } else if(gs.lineSegments == 1 && gs.cubics == 1 && gs.n == 2) { Entity *line = SK.GetEntity(gs.entity[0]), *cubic = SK.GetEntity(gs.entity[1]); - if(line->type == Entity::Type::CUBIC) { - swap(line, cubic); - } ConstrainCubicLineTangent(&c, line, cubic); c.type = Type::CUBIC_LINE_TANGENT; c.entityA = cubic->h; From d9c2f04615754cc756eb2a455a906ebbfb127d1a Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 20 Dec 2020 20:55:00 -0500 Subject: [PATCH 212/646] Add menu checkbox Dim Solid for Sketch Groups. Makes shadowing the solid optional for sketch in 2d/3d groups. Handy for making dimensioned drawings by putting dims in their own group. #834 --- src/graphicswin.cpp | 11 +++++++++++ src/groupmesh.cpp | 3 ++- src/solvespace.cpp | 1 + src/ui.h | 3 +++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 33bb708de..d368c3211 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -92,6 +92,7 @@ const MenuEntry Menu[] = { { 1, N_("&Center View At Point"), Command::CENTER_VIEW, F|4, KN, mView }, { 1, NULL, Command::NONE, 0, KN, NULL }, { 1, N_("Show Snap &Grid"), Command::SHOW_GRID, '>', KC, mView }, +{ 1, N_("Dim Solid for Sketch Groups"), Command::DIM_SOLID_MODEL, 0, KC, mView }, { 1, N_("Use &Perspective Projection"), Command::PERSPECTIVE_PROJ, '`', KC, mView }, { 1, N_("Dimension &Units"), Command::NONE, 0, KN, NULL }, { 2, N_("Dimensions in &Millimeters"), Command::UNITS_MM, 0, KR, mView }, @@ -312,6 +313,8 @@ void GraphicsWindow::PopulateMainMenu() { if(Menu[i].cmd == Command::SHOW_GRID) { showGridMenuItem = menuItem; + } else if(Menu[i].cmd == Command::DIM_SOLID_MODEL) { + dimSolidModelMenuItem = menuItem; } else if(Menu[i].cmd == Command::PERSPECTIVE_PROJ) { perspectiveProjMenuItem = menuItem; } else if(Menu[i].cmd == Command::SHOW_TOOLBAR) { @@ -406,6 +409,7 @@ void GraphicsWindow::Init() { showTextWindow = true; showSnapGrid = false; + dimSolidModel = true; context.active = false; toolbarHovered = Command::NONE; @@ -722,6 +726,12 @@ void GraphicsWindow::MenuView(Command id) { } break; + case Command::DIM_SOLID_MODEL: + SS.GW.dimSolidModel = !SS.GW.dimSolidModel; + SS.GW.EnsureValidActives(); + SS.GW.Invalidate(/*clearPersistent=*/true); + break; + case Command::PERSPECTIVE_PROJ: SS.usePerspectiveProj = !SS.usePerspectiveProj; SS.GW.EnsureValidActives(); @@ -923,6 +933,7 @@ void GraphicsWindow::EnsureValidActives() { showTextWndMenuItem->SetActive(SS.GW.showTextWindow); showGridMenuItem->SetActive(SS.GW.showSnapGrid); + dimSolidModelMenuItem->SetActive(SS.GW.dimSolidModel); perspectiveProjMenuItem->SetActive(SS.usePerspectiveProj); showToolbarMenuItem->SetActive(SS.showToolbar); fullScreenMenuItem->SetActive(SS.GW.window->IsFullScreen()); diff --git a/src/groupmesh.cpp b/src/groupmesh.cpp index 2d509aea4..f1041d632 100644 --- a/src/groupmesh.cpp +++ b/src/groupmesh.cpp @@ -569,7 +569,8 @@ void Group::DrawMesh(DrawMeshAs how, Canvas *canvas) { if(!SS.GW.showShaded) { fillFront.layer = Canvas::Layer::DEPTH_ONLY; } - if(type == Type::DRAWING_3D || type == Type::DRAWING_WORKPLANE) { + if((type == Type::DRAWING_3D || type == Type::DRAWING_WORKPLANE) + && SS.GW.dimSolidModel) { fillFront.color = Style::Color(Style::DIM_SOLID); } Canvas::hFill hcfFront = canvas->GetFill(fillFront); diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 55f6dedd8..0b746f22b 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -1018,6 +1018,7 @@ void SolveSpaceUI::Clear() { GW.openRecentMenu = NULL; GW.linkRecentMenu = NULL; GW.showGridMenuItem = NULL; + GW.dimSolidModelMenuItem = NULL; GW.perspectiveProjMenuItem = NULL; GW.showToolbarMenuItem = NULL; GW.showTextWndMenuItem = NULL; diff --git a/src/ui.h b/src/ui.h index 6563a144c..026d57de7 100644 --- a/src/ui.h +++ b/src/ui.h @@ -80,6 +80,7 @@ enum class Command : uint32_t { ZOOM_OUT, ZOOM_TO_FIT, SHOW_GRID, + DIM_SOLID_MODEL, PERSPECTIVE_PROJ, ONTO_WORKPLANE, NEAREST_ORTHO, @@ -532,6 +533,7 @@ class GraphicsWindow { Platform::MenuRef linkRecentMenu; Platform::MenuItemRef showGridMenuItem; + Platform::MenuItemRef dimSolidModelMenuItem; Platform::MenuItemRef perspectiveProjMenuItem; Platform::MenuItemRef showToolbarMenuItem; Platform::MenuItemRef showTextWndMenuItem; @@ -803,6 +805,7 @@ class GraphicsWindow { DrawOccludedAs drawOccludedAs; bool showSnapGrid; + bool dimSolidModel; void DrawSnapGrid(Canvas *canvas); void AddPointToDraggedList(hEntity hp); From 80097011601f6ee72e4b72ba7232e9f2bcd09d17 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Tue, 29 Dec 2020 20:09:10 +0100 Subject: [PATCH 213/646] Add OpenMP debug information to conf screen (#869) * Add OpenMP debug information to conf screen * Revert casing and whitespace in CMakeLists.txt * Remove unnecessary comment src/CMakeLists.txt --- CMakeLists.txt | 1 - src/CMakeLists.txt | 3 ++- src/confscreen.cpp | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6cdca35c6..12948781f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,7 +116,6 @@ endif() if(ENABLE_OPENMP) find_package( OpenMP REQUIRED ) - include(FindOpenMP) if(OPENMP_FOUND) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") message(STATUS "found OpenMP, compiling with flags: " ${OpenMP_CXX_FLAGS} ) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4f277f535..45dab944f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -80,7 +80,8 @@ include_directories( ${PNG_PNG_INCLUDE_DIR} ${FREETYPE_INCLUDE_DIRS} ${CAIRO_INCLUDE_DIRS} - ${MIMALLOC_INCLUDE_DIR}) + ${MIMALLOC_INCLUDE_DIR} + ${OpenMP_CXX_INCLUDE_DIRS}) if(Backtrace_FOUND) include_directories( diff --git a/src/confscreen.cpp b/src/confscreen.cpp index 07c42b743..c7e2815a0 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -5,6 +5,9 @@ // Copyright 2008-2013 Jonathan Westhues. //----------------------------------------------------------------------------- #include "solvespace.h" +#if defined(_OPENMP) +#include +#endif void TextWindow::ScreenChangeLightDirection(int link, uint32_t v) { SS.TW.ShowEditControl(8, ssprintf("%.2f, %.2f, %.2f", CO(SS.lightDir[v]))); @@ -389,6 +392,11 @@ void TextWindow::ShowConfiguration() { Printf(false, " %Ft renderer %E%s", gl_renderer); Printf(false, " %Ft version %E%s", gl_version); } + + #if defined(_OPENMP) + Printf(false, " %FtOpenMP enabled"); + Printf(false, " %Ft threads %E%d", omp_get_max_threads()); + #endif } bool TextWindow::EditControlDoneForConfiguration(const std::string &s) { From 085e35de041f238056d70d8b155a53d46ca24578 Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 8 Jan 2021 21:30:31 +0200 Subject: [PATCH 214/646] Revert "Clean up paste transformed and constrain operations a bit." This reverts commit 14e837a45f599b9b2a8a28d8628f96490b593c24. Fixes a regression described here: https://github.com/solvespace/solvespace/issues/875 --- src/clipboard.cpp | 21 +++++++++++++++------ src/constraint.cpp | 15 ++++++--------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/clipboard.cpp b/src/clipboard.cpp index 6e83aa345..d43ec4582 100644 --- a/src/clipboard.cpp +++ b/src/clipboard.cpp @@ -257,18 +257,27 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { c.valA *= fabs(scale); break; case Constraint::Type::ARC_LINE_TANGENT: { - Constraint::ConstrainArcLineTangent(&c, SK.GetEntity(c.entityB), - SK.GetEntity(c.entityA)); + Entity *line = SK.GetEntity(c.entityB), + *arc = SK.GetEntity(c.entityA); + if(line->type == Entity::Type::ARC_OF_CIRCLE) { + swap(line, arc); + } + Constraint::ConstrainArcLineTangent(&c, line, arc); break; } case Constraint::Type::CUBIC_LINE_TANGENT: { - Constraint::ConstrainCubicLineTangent(&c, SK.GetEntity(c.entityB), - SK.GetEntity(c.entityA)); + Entity *line = SK.GetEntity(c.entityB), + *cubic = SK.GetEntity(c.entityA); + if(line->type == Entity::Type::CUBIC) { + swap(line, cubic); + } + Constraint::ConstrainCubicLineTangent(&c, line, cubic); break; } case Constraint::Type::CURVE_CURVE_TANGENT: { - Constraint::ConstrainCurveCurveTangent(&c, SK.GetEntity(c.entityA), - SK.GetEntity(c.entityB)); + Entity *eA = SK.GetEntity(c.entityA), + *eB = SK.GetEntity(c.entityB); + Constraint::ConstrainCurveCurveTangent(&c, eA, eB); break; } case Constraint::Type::HORIZONTAL: diff --git a/src/constraint.cpp b/src/constraint.cpp index 7b3c3eb43..2acc21156 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -128,15 +128,10 @@ hConstraint Constraint::ConstrainCoincident(hEntity ptA, hEntity ptB) { } void Constraint::ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *arc) { - if(line->type == Entity::Type::ARC_OF_CIRCLE) { - swap(line, arc); - } - Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), l1 = SK.GetEntity(line->point[1])->PointGetNum(); Vector a1 = SK.GetEntity(arc->point[1])->PointGetNum(), a2 = SK.GetEntity(arc->point[2])->PointGetNum(); - if(l0.Equals(a1) || l1.Equals(a1)) { c->other = false; } else if(l0.Equals(a2) || l1.Equals(a2)) { @@ -150,10 +145,6 @@ void Constraint::ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *ar } void Constraint::ConstrainCubicLineTangent(Constraint *c, Entity *line, Entity *cubic) { - if(line->type == Entity::Type::CUBIC) { - swap(line, cubic); - } - Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), l1 = SK.GetEntity(line->point[1])->PointGetNum(); Vector as = cubic->CubicGetStartNum(), @@ -688,6 +679,9 @@ void Constraint::MenuConstrain(Command id) { } else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) { Entity *line = SK.GetEntity(gs.entity[0]), *arc = SK.GetEntity(gs.entity[1]); + if(line->type == Entity::Type::ARC_OF_CIRCLE) { + swap(line, arc); + } ConstrainArcLineTangent(&c, line, arc); c.type = Type::ARC_LINE_TANGENT; c.entityA = arc->h; @@ -695,6 +689,9 @@ void Constraint::MenuConstrain(Command id) { } else if(gs.lineSegments == 1 && gs.cubics == 1 && gs.n == 2) { Entity *line = SK.GetEntity(gs.entity[0]), *cubic = SK.GetEntity(gs.entity[1]); + if(line->type == Entity::Type::CUBIC) { + swap(line, cubic); + } ConstrainCubicLineTangent(&c, line, cubic); c.type = Type::CUBIC_LINE_TANGENT; c.entityA = cubic->h; From 652efaed46cae64c61ae25b609a9259da263fbc8 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 9 Jan 2021 12:27:27 -0500 Subject: [PATCH 215/646] Add toolbar icons for Revolve and Helix created by jkrei0 in issue #857. (#878) --- res/CMakeLists.txt | 2 ++ res/icons/graphics-window/helix.png | Bin 0 -> 664 bytes res/icons/graphics-window/revolve.png | Bin 0 -> 680 bytes src/toolbar.cpp | 6 +++++- 4 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 res/icons/graphics-window/helix.png create mode 100644 res/icons/graphics-window/revolve.png diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index 5969039bd..e261ba213 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -213,6 +213,7 @@ add_resources( icons/graphics-window/construction.png icons/graphics-window/equal.png icons/graphics-window/extrude.png + icons/graphics-window/helix.png icons/graphics-window/horiz.png icons/graphics-window/image.png icons/graphics-window/in3d.png @@ -227,6 +228,7 @@ add_resources( icons/graphics-window/point.png icons/graphics-window/rectangle.png icons/graphics-window/ref.png + icons/graphics-window/revolve.png icons/graphics-window/same-orientation.png icons/graphics-window/sketch-in-3d.png icons/graphics-window/sketch-in-plane.png diff --git a/res/icons/graphics-window/helix.png b/res/icons/graphics-window/helix.png new file mode 100644 index 0000000000000000000000000000000000000000..4b2cda68d5138d636ffe3af605bf3ad5fbb696a0 GIT binary patch literal 664 zcmV;J0%!e+P)EX>4Tx04R}tkv&MmKpe$iQ>7wRK|6>zWT@g`K~%(1s#pXIrLEAagUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwCr2km7b)?7NufoI2gm(*ckglc4iM^PrkWiSfT~$W zG8Ppx*;O&{iXi&Yi!p>HX6o_OVj7;~>mEM7-bHwp_qjhukCHPP;1h}Gm~L3a8^kl4 zmd<&fIK+yQLVQjM*<>bR8c}179zB2q?kz3e$>N1AO zrG<}xzHQ**x~0i`z~v4w_@qmQWaB3Q005LpL_t(Y$L*6*4uBvGLutZU z$DMZB`lXpfWWe~+eSs3O!PpGn{IcX{QyhP~ugQ;!)um^_oVGC%|pl9#5G ya?@dzKS=_BHM9GWm%Ozso~J#cO)Q?jTy+59P=<`q9VLJO0000EX>4Tx04R}tkv&MmKpe$iQ>7wRK|6>zWT@g`K~%(1s#pXIrLEAagUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwCr2km7b)?7NufoI2gm(*ckglc4iM^PrkWiSfT~$W zG8Ppx*;O&{iXi&Yi!p>HX6o_OVj7;~>mEM7-bHwp_qjhukCHPP;1h}Gm~L3a8^kl4 zmd<&fIK+yQLVQjM*<>bR8c}179zB2q?kz3e$>N1AO zrG<}xzHQ**x~0i`z~v4w_@qmQ5(6O!TO8k- zKj~-bp{3(EP{?}f%;u;NP(rTj-yvB50R448=M=iYN}3Tcv89fWa!<%3j>aUbD&0V< zyh1;)`{oG+o$zP|ckmQQ(b>g2T1HC-pp1&v z-AGjgKue~z=|9?m#@a7y-JS6u5&3p`yAdPM1yS7YOJxB>L#`HjK;Z=v_ne2gg`(&H O0000 Date: Sat, 9 Jan 2021 19:41:23 +0200 Subject: [PATCH 216/646] Update ISSUE_TEMPLATE.md (#859) Improve formatting. --- .github/ISSUE_TEMPLATE.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index e3747b22b..e9d7df97b 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,8 +1,7 @@ ### System information -SolveSpace version: - -Operating system: +- **SolveSpace version:** +- **Operating system:** ### Expected behavior From 4329562ec3f2f8c64bab6a19d7a80476398d758a Mon Sep 17 00:00:00 2001 From: ruevs Date: Sat, 9 Jan 2021 23:11:19 +0200 Subject: [PATCH 217/646] Update the year in the About dialog --- src/solvespace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 0b746f22b..054c4908b 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -1001,7 +1001,7 @@ 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, 2020); +PACKAGE_VERSION, 2021); break; default: ssassert(false, "Unexpected menu ID"); From fd6498b8cd9f983f7ee7863b28ed77e592978b95 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sat, 9 Jan 2021 23:18:32 +0200 Subject: [PATCH 218/646] Win32: Update the year in the Windows version resource Visible in right-click on solvespace.exe | Properties | Details | Copyright --- res/win32/versioninfo.rc.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/win32/versioninfo.rc.in b/res/win32/versioninfo.rc.in index 0772a39dd..e6e90056a 100644 --- a/res/win32/versioninfo.rc.in +++ b/res/win32/versioninfo.rc.in @@ -18,7 +18,7 @@ BEGIN VALUE "FileVersion", "${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}~${solvespace_GIT_HASH}" VALUE "OriginalFilename", "solvespace.exe" VALUE "InternalName", "solvespace" - VALUE "LegalCopyright", "(c) 2008-2016 Jonathan Westhues and other authors" + VALUE "LegalCopyright", "(c) 2008-2021 Jonathan Westhues and other authors" END END From 8cf347a2b1ee036a1d66b698ef75ee8752069680 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 10 Jan 2021 00:30:13 +0200 Subject: [PATCH 219/646] README.md: Use the SVG icon with a relative path. (#883) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 098f1f076..6e575a5d1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -SolveSpace Logo +SolveSpace Logo SolveSpace ========== From 4831450d76b31a5f69932b16f3b58a2f57e72a11 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 10 Jan 2021 00:31:25 +0200 Subject: [PATCH 220/646] =?UTF-8?q?Win32:=20Avoid=20the=20"Default=20Beep"?= =?UTF-8?q?=20sound=20in=20"=D0=95rror"=20and=20"Message"=20dialogs=20(#88?= =?UTF-8?q?1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On Windows SolveSpace 2.3 uses a plain dialog for `SolveSpace::Error` and `SolveSpace::Message` with no icon and no system beep. After the GUI abstraction was reworked this changed to the default system message boxes (using MessageBoxIndirectW) that play the "Default Beep" sound and show red "X" and blue "i" icons respectively. The beep is annoying since the error and message dialogs are used often to show required conditions for constraints, new groups and other behaviors. This disables the beep and uses the SolveSpace icon. Fixes: 719 --- src/platform/guiwin.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index ebd2667b2..745720a46 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1450,7 +1450,10 @@ class MessageDialogImplWin32 final : public MessageDialog { void SetType(Type type) override { switch(type) { case Type::INFORMATION: - style = MB_ICONINFORMATION; + style = MB_USERICON; // Avoid beep + mbp.hInstance = GetModuleHandle(NULL); + mbp.lpszIcon = MAKEINTRESOURCE(4000); // Use SolveSpace icon + // mbp.lpszIcon = IDI_INFORMATION; break; case Type::QUESTION: @@ -1462,7 +1465,10 @@ class MessageDialogImplWin32 final : public MessageDialog { break; case Type::ERROR: - style = MB_ICONERROR; + style = MB_USERICON; // Avoid beep + mbp.hInstance = GetModuleHandle(NULL); + mbp.lpszIcon = MAKEINTRESOURCE(4000); // Use SolveSpace icon + // mbp.lpszIcon = IDI_ERROR; break; } } From 5db71c9b3d6481d4d14688ee7c87c190b3034816 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 10 Jan 2021 17:33:26 +0200 Subject: [PATCH 221/646] Correct toolbar height calculation (#885) The toolbar height is `int fudge = 8;` `int h = 32*18 + 3*16 + fudge;` It means 18 icons 32 pixels each and 3 separators 16 pixels each. `32*18 + 3*16 + 8 = 632` `36*16 + 3*16 + 8 = 632` See these correct increases of the toolbar height: https://github.com/ruevs/solvespace/blame/bf4de993cbc752cd063bd7dbaa8ef44b36ec13e4/toolbar.cpp#L97 https://github.com/ruevs/solvespace/blame/fe2ea5d5e1c0a361c78248521fc3cff06ab322a9/toolbar.cpp#L103 https://github.com/ruevs/solvespace/blame/ef5db2132e871e12c667bc2147e94c2cabf37729/src/toolbar.cpp#L112 https://github.com/ruevs/solvespace/blame/ca2aad7fea14b09cd4df39b9a4628781f76624c7/src/toolbar.cpp#L145 And then these incorrect ones: https://github.com/ruevs/solvespace/blame/3e3ccdca8d6c66080078c46c274cbde645f43cf4/src/toolbar.cpp#L156 https://github.com/ruevs/solvespace/blame/master/src/toolbar.cpp#L160 In addition https://github.com/ruevs/solvespace/blob/master/src/drawentity.cpp#L618 the point at which the XYZ axis are shifted right so that they do not overlap with the toolbar is corrected. The original discussion is here: https://github.com/ruevs/solvespace/commit/d45e2c4c2e814146a11d261f75a5c091162f77f9 --- src/drawentity.cpp | 2 +- src/toolbar.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/drawentity.cpp b/src/drawentity.cpp index 6260f0dcb..b8e3cbd5e 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -615,7 +615,7 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { double w = 60 - camera.width / 2.0; // Shift the axis to the right if they would overlap with the toolbar. if(SS.showToolbar) { - if(h + 30 > -(34*16 + 3*16 + 8) / 2) + if(h + 30 > -(32*18 + 3*16 + 8) / 2) w += 60; } tail = camera.projRight.ScaledBy(w/s).Plus( diff --git a/src/toolbar.cpp b/src/toolbar.cpp index e6f76732d..bf6b59c59 100644 --- a/src/toolbar.cpp +++ b/src/toolbar.cpp @@ -157,7 +157,7 @@ bool GraphicsWindow::ToolbarDrawOrHitTest(int mx, int my, UiCanvas *canvas, // When changing these values, also change the asReference drawing code in drawentity.cpp. int fudge = 8; - int h = 36*16 + 3*16 + fudge; + int h = 32*18 + 3*16 + fudge; int aleft = 0, aright = 66, atop = y+16+fudge/2, abot = y+16-h; bool withinToolbar = From 0e2fd2ef7716124caf633b06b61174ccea2eb7c4 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 9 Jan 2021 16:57:38 -0500 Subject: [PATCH 222/646] Override minimum displayed digits as needed to avoid showing zero. --- src/solvespace.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 054c4908b..4e458cf48 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -331,7 +331,13 @@ const char *SolveSpaceUI::UnitName() { std::string SolveSpaceUI::MmToString(double v) { v /= MmPerUnit(); - return ssprintf("%.*f", UnitDigitsAfterDecimal(), v); + int digits = UnitDigitsAfterDecimal(); + double minimum = 0.5 * pow(10,-digits); + while ((v < minimum) && (v > LENGTH_EPS)) { + digits++; + minimum *= 0.1; + } + return ssprintf("%.*f", digits, v); } static const char *DimToString(int dim) { switch(dim) { From 0ef585c448df1ee509149c1ce3b91b7e6f2c278d Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 15 Jan 2021 14:53:31 -0600 Subject: [PATCH 223/646] Update messages --- res/locales/de_DE.po | 448 +++++++++++++++++++++--------------------- res/locales/en_US.po | 444 +++++++++++++++++++++--------------------- res/locales/fr_FR.po | 448 +++++++++++++++++++++--------------------- res/locales/ru_RU.po | 450 ++++++++++++++++++++++--------------------- res/locales/uk_UA.po | 432 +++++++++++++++++++++-------------------- res/locales/zh_CN.po | 434 +++++++++++++++++++++-------------------- res/messages.pot | 432 +++++++++++++++++++++-------------------- 7 files changed, 1586 insertions(+), 1502 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index 795f92202..82807643f 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-23 11:23+0200\n" +"POT-Creation-Date: 2021-01-15 14:51-0600\n" "PO-Revision-Date: 2018-07-19 06:55+0000\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" @@ -17,7 +17,7 @@ msgstr "" "X-Generator: Zanata 4.5.0\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: clipboard.cpp:274 +#: clipboard.cpp:310 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -28,27 +28,27 @@ msgstr "" "\n" "Aktivieren Sie eine mit Skizze -> In Arbeitsebene" -#: clipboard.cpp:291 +#: clipboard.cpp:327 msgid "Clipboard is empty; nothing to paste." msgstr "Zwischenablage ist leer; es gibt nichts einzufügen." -#: clipboard.cpp:338 +#: clipboard.cpp:374 msgid "Number of copies to paste must be at least one." msgstr "Die Anzahl der einzufügenden Kopien muss mind. 1 sein." -#: clipboard.cpp:354 textscreens.cpp:783 +#: clipboard.cpp:390 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "Maßstab kann nicht Null sein." -#: clipboard.cpp:396 +#: clipboard.cpp:432 msgid "Select one point to define origin of rotation." msgstr "Wählen Sie einen Punkt, um den Drehmittelpunkt zu definieren." -#: clipboard.cpp:408 +#: clipboard.cpp:444 msgid "Select two points to define translation vector." msgstr "Wählen Sie zwei Punkte, um den Verschiebungsvektor zu definieren." -#: clipboard.cpp:418 +#: clipboard.cpp:454 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -56,25 +56,25 @@ msgstr "" "Die Transformation ist die Identität. Alle Kopien werden deckungsgleich " "übereinanderliegen." -#: clipboard.cpp:422 +#: clipboard.cpp:458 msgid "Too many items to paste; split this into smaller pastes." msgstr "" "Zuviele Objekte zum Einfügen; teilen Sie diese in kleinere " "Einfügeoperationen auf." -#: clipboard.cpp:427 +#: clipboard.cpp:463 msgid "No workplane active." msgstr "Es ist keine Arbeitsebene aktiv." -#: confscreen.cpp:410 +#: confscreen.cpp:418 msgid "Bad format: specify coordinates as x, y, z" msgstr "Ungültiges Format: geben Sie Koordinaten als x, y, z an" -#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "Ungültiges Format: geben Sie Farben als r, g, b an" -#: confscreen.cpp:446 +#: confscreen.cpp:454 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:459 confscreen.cpp:469 +#: confscreen.cpp:467 confscreen.cpp:477 #, 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:481 +#: confscreen.cpp:489 msgid "Export scale must not be zero!" msgstr "Der Exportmaßstab darf nicht Null sein!" -#: confscreen.cpp:493 +#: confscreen.cpp:501 msgid "Cutter radius offset must not be negative!" msgstr "Der Werkzeugradialabstand darf nicht negativ sein!" -#: confscreen.cpp:547 +#: confscreen.cpp:555 msgid "Bad value: autosave interval should be positive" msgstr "" "Ungültiger Wert: Interval für automatisches Speichern muss positiv sein" -#: confscreen.cpp:550 +#: confscreen.cpp:558 msgid "Bad format: specify interval in integral minutes" msgstr "Ungültiges Format: geben Sie das Interval in ganzen Minuten an" @@ -279,7 +279,33 @@ msgctxt "constr-name" msgid "comment" msgstr "Kommentar" -#: constraint.cpp:171 +#: constraint.cpp:140 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "" +"Die Bogentangente und das Liniensegment müssen einen gemeinsamen Endpunkt " +"haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " +"Tangente einschränken. -> Sc" + +#: constraint.cpp:158 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." +msgstr "" +"Die Kurventangente und das Liniensegment müssen einen gemeinsamen Endpunkt " +"haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " +"Tangente einschränken. -> Sc" + +#: constraint.cpp:183 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." +msgstr "" +"Die Kurven müssen einen gemeinsamen Endpunkt haben. Schränken Sie mit " +"\"Einschränkung / Auf Punkt\" ein, bevor Sie die Tangente einschränken. -> Sc" + +#: constraint.cpp:231 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -303,7 +329,7 @@ msgstr "" " * eine Seitenfläche und ein Punkt [minimaler Abstand]\n" " * ein Kreis oder ein Bogen [Durchmesser]\n" -#: constraint.cpp:224 +#: constraint.cpp:284 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -323,7 +349,7 @@ msgstr "" " * einen Punkt und einen Kreis oder Bogen [Punkt auf Kurve]\n" " * einen Punkt und eine Seitenfläche [Punkt auf Fläche]\n" -#: constraint.cpp:286 +#: constraint.cpp:346 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -354,7 +380,7 @@ msgstr "" " * ein Liniensegment und ein Bogen [Länge des Liniensegments gleich " "Bogenlänge]\n" -#: constraint.cpp:325 +#: constraint.cpp:385 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" @@ -365,7 +391,7 @@ msgstr "" "\n" " * zwei Liniensegmente\n" -#: constraint.cpp:342 +#: constraint.cpp:402 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" @@ -377,7 +403,7 @@ msgstr "" "\n" " * zwei Liniensegmente\n" -#: constraint.cpp:368 +#: constraint.cpp:428 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -391,7 +417,7 @@ msgstr "" " * ein Liniensegment und eine Arbeitsebene [Mittelpunkt der Linie auf " "Ebene]\n" -#: constraint.cpp:426 +#: constraint.cpp:486 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -412,7 +438,7 @@ msgstr "" " * eine Arbeitsebene und zwei Punkte oder ein Liniensegment [symmetrisch " "zu Arbeitsebene]\n" -#: constraint.cpp:440 +#: constraint.cpp:500 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -420,7 +446,7 @@ msgstr "" "Eine Arbeitsebene muss aktiv sein, um die Symmetrie ohne explizite " "Symmetrieebene einzuschränken." -#: constraint.cpp:470 +#: constraint.cpp:530 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -428,7 +454,7 @@ msgstr "" "Aktivieren Sie eine Arbeitsebene (mit Skizze -> In Arbeitsebene), bevor Sie " "horizontal oder vertikal einschränken." -#: constraint.cpp:483 +#: constraint.cpp:543 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -442,7 +468,7 @@ msgstr "" " * zwei Punkte\n" " * ein Liniensegment\n" -#: constraint.cpp:504 +#: constraint.cpp:564 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -454,15 +480,15 @@ msgstr "" "\n" " * zwei Normale\n" -#: constraint.cpp:554 +#: constraint.cpp:614 msgid "Must select an angle constraint." msgstr "Sie müssen einen eingeschränkten Winkel auswählen." -#: constraint.cpp:567 +#: constraint.cpp:627 msgid "Must select a constraint with associated label." msgstr "Sie müssen eine Einschränkung mit zugeordneter Kennzeichnung angeben." -#: constraint.cpp:578 +#: constraint.cpp:638 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -477,38 +503,12 @@ msgstr "" " * ein Liniensegment und eine Normale\n" " * zwei Normale\n" -#: constraint.cpp:635 -msgid "" -"The tangent arc and line segment must share an endpoint. Constrain them with " -"Constrain -> On Point before constraining tangent." -msgstr "" -"Die Bogentangente und das Liniensegment müssen einen gemeinsamen Endpunkt " -"haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " -"Tangente einschränken. -> Sc" - -#: constraint.cpp:659 -msgid "" -"The tangent cubic and line segment must share an endpoint. Constrain them " -"with Constrain -> On Point before constraining tangent." -msgstr "" -"Die Kurventangente und das Liniensegment müssen einen gemeinsamen Endpunkt " -"haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " -"Tangente einschränken. -> Sc" - -#: constraint.cpp:669 +#: constraint.cpp:701 msgid "Curve-curve tangency must apply in workplane." msgstr "" "Die Kurven-Kurven-Tangente muss in der Arbeitsebene eingeschränkt werden." -#: constraint.cpp:687 -msgid "" -"The curves must share an endpoint. Constrain them with Constrain -> On Point " -"before constraining tangent." -msgstr "" -"Die Kurven müssen einen gemeinsamen Endpunkt haben. Schränken Sie mit " -"\"Einschränkung / Auf Punkt\" ein, bevor Sie die Tangente einschränken. -> Sc" - -#: constraint.cpp:696 +#: constraint.cpp:711 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -527,7 +527,7 @@ msgstr "" " * zwei Liniensegmente, Bögen oder Beziers mit gemeinsamem Endpunkt " "[Tangente]\n" -#: constraint.cpp:714 +#: constraint.cpp:729 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -542,7 +542,7 @@ msgstr "" " * ein Liniensegment und eine Normale\n" " * zwei Normale\n" -#: constraint.cpp:729 +#: constraint.cpp:744 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -554,7 +554,7 @@ msgstr "" "\n" " * einen Punkt\n" -#: constraint.cpp:740 +#: constraint.cpp:755 msgid "click center of comment text" msgstr "Klicken Sie auf die Mitte des Kommentartextes" @@ -660,7 +660,7 @@ msgctxt "button" msgid "&No" msgstr "&Nein" -#: file.cpp:869 solvespace.cpp:563 +#: file.cpp:869 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "&Abbrechen" @@ -826,300 +826,304 @@ msgid "Show Snap &Grid" msgstr "Arbeitsraster anzeigen" #: graphicswin.cpp:95 +msgid "Dim Solid for Sketch Groups" +msgstr "" + +#: graphicswin.cpp:96 msgid "Use &Perspective Projection" msgstr "Perspektivische Projektion" -#: graphicswin.cpp:96 +#: graphicswin.cpp:97 msgid "Dimension &Units" msgstr "Maßeinheit" -#: graphicswin.cpp:97 +#: graphicswin.cpp:98 msgid "Dimensions in &Millimeters" msgstr "Maße in Millimeter" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in M&eters" msgstr "Masse in M&etern" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in &Inches" msgstr "Maße in Zoll" -#: graphicswin.cpp:101 +#: graphicswin.cpp:102 msgid "Show &Toolbar" msgstr "Werkzeugleiste anzeigen" -#: graphicswin.cpp:102 +#: graphicswin.cpp:103 msgid "Show Property Bro&wser" msgstr "Attributbrowser anzeigen" -#: graphicswin.cpp:104 +#: graphicswin.cpp:105 msgid "&Full Screen" msgstr "Vollbildschirm" -#: graphicswin.cpp:106 +#: graphicswin.cpp:107 msgid "&New Group" msgstr "Neue Gruppe" -#: graphicswin.cpp:107 +#: graphicswin.cpp:108 msgid "Sketch In &3d" msgstr "In 3D skizzieren" -#: graphicswin.cpp:108 +#: graphicswin.cpp:109 msgid "Sketch In New &Workplane" msgstr "In neuer Arbeitsebene skizzieren" -#: graphicswin.cpp:110 +#: graphicswin.cpp:111 msgid "Step &Translating" msgstr "Kopieren und verschieben" -#: graphicswin.cpp:111 +#: graphicswin.cpp:112 msgid "Step &Rotating" msgstr "Kopieren und drehen" -#: graphicswin.cpp:113 +#: graphicswin.cpp:114 msgid "E&xtrude" msgstr "E&xtrudieren" -#: graphicswin.cpp:114 +#: graphicswin.cpp:115 msgid "&Helix" msgstr "&Helix" -#: graphicswin.cpp:115 +#: graphicswin.cpp:116 msgid "&Lathe" msgstr "R&otieren" -#: graphicswin.cpp:116 +#: graphicswin.cpp:117 msgid "Re&volve" msgstr "D&rehen" -#: graphicswin.cpp:118 +#: graphicswin.cpp:119 msgid "Link / Assemble..." msgstr "Verknüpfen / Zusammensetzen" -#: graphicswin.cpp:119 +#: graphicswin.cpp:120 msgid "Link Recent" msgstr "Letzte verknüpfen" -#: graphicswin.cpp:121 +#: graphicswin.cpp:122 msgid "&Sketch" msgstr "&Skizze" -#: graphicswin.cpp:122 +#: graphicswin.cpp:123 msgid "In &Workplane" msgstr "In Arbeitsebene" -#: graphicswin.cpp:123 +#: graphicswin.cpp:124 msgid "Anywhere In &3d" msgstr "Im 3D-Raum" -#: graphicswin.cpp:125 +#: graphicswin.cpp:126 msgid "Datum &Point" msgstr "Bezugspunkt" -#: graphicswin.cpp:126 +#: graphicswin.cpp:127 msgid "&Workplane" msgstr "Arbeits&ebene" -#: graphicswin.cpp:128 +#: graphicswin.cpp:129 msgid "Line &Segment" msgstr "&Linie" -#: graphicswin.cpp:129 +#: graphicswin.cpp:130 msgid "C&onstruction Line Segment" msgstr "K&onstruktionslinie" -#: graphicswin.cpp:130 +#: graphicswin.cpp:131 msgid "&Rectangle" msgstr "&Rechteck" -#: graphicswin.cpp:131 +#: graphicswin.cpp:132 msgid "&Circle" msgstr "&Kreis" -#: graphicswin.cpp:132 +#: graphicswin.cpp:133 msgid "&Arc of a Circle" msgstr "Kreisbogen" -#: graphicswin.cpp:133 +#: graphicswin.cpp:134 msgid "&Bezier Cubic Spline" msgstr "Kubischer &Bezier-Spline" -#: graphicswin.cpp:135 +#: graphicswin.cpp:136 msgid "&Text in TrueType Font" msgstr "&Text in Truetype-Font" -#: graphicswin.cpp:136 +#: graphicswin.cpp:137 msgid "&Image" msgstr "B&ild" -#: graphicswin.cpp:138 +#: graphicswin.cpp:139 msgid "To&ggle Construction" msgstr "Konstruktionselement an/aus" -#: graphicswin.cpp:139 +#: graphicswin.cpp:140 msgid "Tangent &Arc at Point" msgstr "Bogentangente an Punkt" -#: graphicswin.cpp:140 +#: graphicswin.cpp:141 msgid "Split Curves at &Intersection" msgstr "Kurven im Schnittpunkt trennen" -#: graphicswin.cpp:142 +#: graphicswin.cpp:143 msgid "&Constrain" msgstr "&Einschränkung" -#: graphicswin.cpp:143 +#: graphicswin.cpp:144 msgid "&Distance / Diameter" msgstr "Abstand / Durchmesser" -#: graphicswin.cpp:144 +#: graphicswin.cpp:145 msgid "Re&ference Dimension" msgstr "Referenzangabe" -#: graphicswin.cpp:145 +#: graphicswin.cpp:146 msgid "A&ngle" msgstr "Winkel" -#: graphicswin.cpp:146 +#: graphicswin.cpp:147 msgid "Reference An&gle" msgstr "Referenzwinkel" -#: graphicswin.cpp:147 +#: graphicswin.cpp:148 msgid "Other S&upplementary Angle" msgstr "Komplementärwinkel" -#: graphicswin.cpp:148 +#: graphicswin.cpp:149 msgid "Toggle R&eference Dim" msgstr "Referenzangabe ein/aus" -#: graphicswin.cpp:150 +#: graphicswin.cpp:151 msgid "&Horizontal" msgstr "Horizontal" -#: graphicswin.cpp:151 +#: graphicswin.cpp:152 msgid "&Vertical" msgstr "&Vertikal" -#: graphicswin.cpp:153 +#: graphicswin.cpp:154 msgid "&On Point / Curve / Plane" msgstr "Auf Punkt / Kurve / Ebene" -#: graphicswin.cpp:154 +#: graphicswin.cpp:155 msgid "E&qual Length / Radius / Angle" msgstr "Gleicher Abstand / Radius / Winkel" -#: graphicswin.cpp:155 +#: graphicswin.cpp:156 msgid "Length Ra&tio" msgstr "Längenverhältnis" -#: graphicswin.cpp:156 +#: graphicswin.cpp:157 msgid "Length Diff&erence" msgstr "Längendifferenz" -#: graphicswin.cpp:157 +#: graphicswin.cpp:158 msgid "At &Midpoint" msgstr "Auf &Mittelpunkt" -#: graphicswin.cpp:158 +#: graphicswin.cpp:159 msgid "S&ymmetric" msgstr "Symmetrisch" -#: graphicswin.cpp:159 +#: graphicswin.cpp:160 msgid "Para&llel / Tangent" msgstr "Paral&llel / Tangente" -#: graphicswin.cpp:160 +#: graphicswin.cpp:161 msgid "&Perpendicular" msgstr "Rechtwinklig" -#: graphicswin.cpp:161 +#: graphicswin.cpp:162 msgid "Same Orient&ation" msgstr "Gleiche Orientierung" -#: graphicswin.cpp:162 +#: graphicswin.cpp:163 msgid "Lock Point Where &Dragged" msgstr "Punkt an Position fixieren" -#: graphicswin.cpp:164 +#: graphicswin.cpp:165 msgid "Comment" msgstr "Kommentar" -#: graphicswin.cpp:166 +#: graphicswin.cpp:167 msgid "&Analyze" msgstr "&Analyse" -#: graphicswin.cpp:167 +#: graphicswin.cpp:168 msgid "Measure &Volume" msgstr "&Volumen bestimmen" -#: graphicswin.cpp:168 +#: graphicswin.cpp:169 msgid "Measure A&rea" msgstr "Fläche bestimmen" -#: graphicswin.cpp:169 +#: graphicswin.cpp:170 msgid "Measure &Perimeter" msgstr "Umfang bestimmen" -#: graphicswin.cpp:170 +#: graphicswin.cpp:171 msgid "Show &Interfering Parts" msgstr "Überlagernde Teile anzeigen" -#: graphicswin.cpp:171 +#: graphicswin.cpp:172 msgid "Show &Naked Edges" msgstr "Freiliegende Kanten anzeigen" -#: graphicswin.cpp:172 +#: graphicswin.cpp:173 msgid "Show &Center of Mass" msgstr "Massenmittelpunkt anzeigen" -#: graphicswin.cpp:174 +#: graphicswin.cpp:175 msgid "Show &Underconstrained Points" msgstr "&Unterbeschränkte Punkte anzeigen" -#: graphicswin.cpp:176 +#: graphicswin.cpp:177 msgid "&Trace Point" msgstr "Punkt nachzeichnen" -#: graphicswin.cpp:177 +#: graphicswin.cpp:178 msgid "&Stop Tracing..." msgstr "Nachzeichnen beenden" -#: graphicswin.cpp:178 +#: graphicswin.cpp:179 msgid "Step &Dimension..." msgstr "Schrittgröße…" -#: graphicswin.cpp:180 +#: graphicswin.cpp:181 msgid "&Help" msgstr "&Hilfe" -#: graphicswin.cpp:181 +#: graphicswin.cpp:182 msgid "&Language" msgstr "Sprache" -#: graphicswin.cpp:182 +#: graphicswin.cpp:183 msgid "&Website / Manual" msgstr "&Website / Anleitung" -#: graphicswin.cpp:184 +#: graphicswin.cpp:185 msgid "&About" msgstr "Über" -#: graphicswin.cpp:352 +#: graphicswin.cpp:355 msgid "(no recent files)" msgstr "(keine vorhergehenden Dateien)" -#: graphicswin.cpp:360 +#: graphicswin.cpp:363 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:721 +#: graphicswin.cpp:725 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:730 +#: graphicswin.cpp:740 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1133,20 +1137,20 @@ msgstr "" "Ändern Sie den Faktor für die Perspektivprojektion in der " "Konfigurationsmaske. Ein typischer Wert ist ca. 0,3." -#: graphicswin.cpp:809 +#: graphicswin.cpp:819 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:1103 +#: graphicswin.cpp:1114 msgid "No additional entities share endpoints with the selected entities." msgstr "" "Die ausgewählten Objekte teilen keine gemeinsamen Endpunkte mit anderen " "Objekten." -#: graphicswin.cpp:1121 +#: graphicswin.cpp:1132 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1154,7 +1158,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:1144 +#: graphicswin.cpp:1155 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1163,7 +1167,7 @@ msgstr "" "(mit Skizze -> In Arbeitsebene), um die Ebene für das Gitterraster zu " "definieren." -#: graphicswin.cpp:1151 +#: graphicswin.cpp:1162 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1172,13 +1176,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:1239 +#: graphicswin.cpp:1247 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:1242 +#: graphicswin.cpp:1250 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-" @@ -1188,7 +1192,7 @@ msgstr "" "standardmäßige Arbeitsebene. Wählen Sie eine Arbeitsebene aus, oder " "erstellen Sie eine Gruppe in einer neuen Arbeitsebene." -#: graphicswin.cpp:1263 +#: graphicswin.cpp:1271 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1196,48 +1200,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:1274 +#: graphicswin.cpp:1282 msgid "click point on arc (draws anti-clockwise)" msgstr "" "Erstellen Sie einen Punkt auf dem Bogen (zeichnet im Gegenuhrzeigersinn)" -#: graphicswin.cpp:1275 +#: graphicswin.cpp:1283 msgid "click to place datum point" msgstr "Klicken Sie, um einen Bezugspunkt zu platzieren" -#: graphicswin.cpp:1276 +#: graphicswin.cpp:1284 msgid "click first point of line segment" msgstr "Klicken Sie auf den ersten Punkt des Liniensegments" -#: graphicswin.cpp:1278 +#: graphicswin.cpp:1286 msgid "click first point of construction line segment" msgstr "Klicken Sie auf den ersten Punkt der Konstruktionslinie" -#: graphicswin.cpp:1279 +#: graphicswin.cpp:1287 msgid "click first point of cubic segment" msgstr "Klicken Sie auf den ersten Punkt der kubischen Linie" -#: graphicswin.cpp:1280 +#: graphicswin.cpp:1288 msgid "click center of circle" msgstr "Klicken Sie auf den Kreismittelpunkt" -#: graphicswin.cpp:1281 +#: graphicswin.cpp:1289 msgid "click origin of workplane" msgstr "Klicken Sie auf den Ursprungspunkt der Arbeitsebene" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1290 msgid "click one corner of rectangle" msgstr "Klicken Sie auf eine Ecke des Rechtecks" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1291 msgid "click top left of text" msgstr "Klicken Sie auf die obere linke Ecke des Texts" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1297 msgid "click top left of image" msgstr "Klicken Sie auf die obere linke Ecke des Bilds" -#: graphicswin.cpp:1301 +#: graphicswin.cpp:1309 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1376,19 +1380,19 @@ msgstr "Versetzen" msgid "(unnamed)" msgstr "unbenannt" -#: groupmesh.cpp:708 +#: groupmesh.cpp:709 msgid "not closed contour, or not all same style!" msgstr "Kontur nicht geschlossen, oder kein einheitlicher Linientyp!" -#: groupmesh.cpp:721 +#: groupmesh.cpp:722 msgid "points not all coplanar!" msgstr "Punkte sind nicht alle koplanar!" -#: groupmesh.cpp:723 +#: groupmesh.cpp:724 msgid "contour is self-intersecting!" msgstr "Kontur überschneidet sich selbst!" -#: groupmesh.cpp:725 +#: groupmesh.cpp:726 msgid "zero-length edge!" msgstr "Kante mit Länge Null!" @@ -1530,11 +1534,11 @@ msgstr "Aktive deselektieren" msgid "Zoom to Fit" msgstr "Zoom an Bildschirm anpassen" -#: mouse.cpp:990 mouse.cpp:1277 +#: mouse.cpp:989 mouse.cpp:1276 msgid "click next point of line, or press Esc" msgstr "Klicken Sie auf den nächsten Punkt der Linie, oder drücken Sie Esc" -#: mouse.cpp:996 +#: mouse.cpp:995 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1542,15 +1546,15 @@ msgstr "" "Ein Rechteck kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1030 +#: mouse.cpp:1029 msgid "click to place other corner of rectangle" msgstr "Klicken Sie auf die gegenüberliegende Ecke des Rechtecks" -#: mouse.cpp:1050 +#: mouse.cpp:1049 msgid "click to set radius" msgstr "Klicken Sie, um den Radius festzulegen" -#: mouse.cpp:1055 +#: mouse.cpp:1054 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1558,23 +1562,23 @@ msgstr "" "Ein Kreisbogen kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1074 +#: mouse.cpp:1073 msgid "click to place point" msgstr "Klicken Sie, um einen Punkt zu platzieren" -#: mouse.cpp:1090 +#: mouse.cpp:1089 msgid "click next point of cubic, or press Esc" msgstr "" "Klicken Sie auf den nächsten Punkt der kubischen Linie, oder drücken Sie Esc" -#: mouse.cpp:1095 +#: mouse.cpp:1094 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Eine Arbeitsebene ist bereits aktiv. Skizzieren Sie in 3D, bevor Sie eine " "neue Arbeitsebene erstellen." -#: mouse.cpp:1111 +#: mouse.cpp:1110 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1582,11 +1586,11 @@ msgstr "" "Text kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1128 +#: mouse.cpp:1127 msgid "click to place bottom right of text" msgstr "Klicken Sie auf die untere rechte Ecke des Texts" -#: mouse.cpp:1134 +#: mouse.cpp:1133 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1594,11 +1598,11 @@ msgstr "" "Das Bild kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1161 +#: mouse.cpp:1160 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEUER KOMMENTAR -- DOPPELKLICKEN ZUM BEARBEITEN" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace-Modelle" @@ -1683,33 +1687,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Werte durch Komma getrennt (CSV)" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 msgid "untitled" msgstr "unbenannt" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1562 +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "Datei speichern" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1564 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "Datei öffnen" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 msgctxt "button" msgid "_Cancel" msgstr "_Abbrechen" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 +#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 msgctxt "button" msgid "_Save" msgstr "_Speichern" -#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 +#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 msgctxt "button" msgid "_Open" msgstr "_Öffnen" @@ -1739,49 +1743,49 @@ msgctxt "button" msgid "Do&n't Load" msgstr "&Nicht laden" -#: solvespace.cpp:551 +#: solvespace.cpp:557 msgctxt "title" msgid "Modified File" msgstr "Geänderte Datei" -#: solvespace.cpp:553 +#: solvespace.cpp:559 #, 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:556 +#: solvespace.cpp:562 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:559 +#: solvespace.cpp:565 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:560 +#: solvespace.cpp:566 msgctxt "button" msgid "&Save" msgstr "&Sichern" -#: solvespace.cpp:562 +#: solvespace.cpp:568 msgctxt "button" msgid "Do&n't Save" msgstr "&Verwerfen" # solvespace.cpp:557 -#: solvespace.cpp:583 +#: solvespace.cpp:589 msgctxt "title" msgid "(new sketch)" msgstr "(Neue Skizze)" -#: solvespace.cpp:590 +#: solvespace.cpp:596 msgctxt "title" msgid "Property Browser" msgstr "Attribut-Browser" -#: solvespace.cpp:650 +#: solvespace.cpp:658 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 " @@ -1791,7 +1795,7 @@ msgstr "" "wahrscheinlich nicht. Verstecken Sie sie in dem auf den Link oben im " "Textfenster klicken." -#: solvespace.cpp:718 +#: solvespace.cpp:730 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1800,23 +1804,23 @@ msgstr "" "Kann den Dateityp der Datei '%s' nicht auf Grund der Dateierweiterung " "erkennen. Versuchen Sie .dxf oder .dwg." -#: solvespace.cpp:766 +#: solvespace.cpp:778 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:770 +#: solvespace.cpp:782 msgid "Bad selection for step dimension; select a constraint." msgstr "" "Falsche Auswahl für die Schrittdimensionierung. Wählen Sie eine " "Einschränkung." -#: solvespace.cpp:794 +#: solvespace.cpp:806 msgid "The assembly does not interfere, good." msgstr "Der Zusammenbau funktioniert, gut." -#: solvespace.cpp:810 +#: solvespace.cpp:822 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1827,7 +1831,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:819 +#: solvespace.cpp:831 #, c-format msgid "" "\n" @@ -1840,7 +1844,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:824 +#: solvespace.cpp:836 msgid "" "\n" "\n" @@ -1852,7 +1856,7 @@ msgstr "" "Gekrümmte Flächen wurden als Dreiecksnetz angenähert.\n" "Das verursacht Fehler, typischerweise um 1%." -#: solvespace.cpp:839 +#: solvespace.cpp:851 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1869,7 +1873,7 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:848 +#: solvespace.cpp:860 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1877,7 +1881,7 @@ msgstr "" "Diese Gruppe beinhaltet keine korrekt geschlossene 2D Fläche. Sie ist offen, " "nicht koplanar, oder überschneidet sich selbst." -#: solvespace.cpp:860 +#: solvespace.cpp:872 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1894,7 +1898,7 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:880 +#: solvespace.cpp:892 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1911,36 +1915,36 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:886 +#: solvespace.cpp:898 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:902 +#: solvespace.cpp:914 msgid "Bad selection for trace; select a single point." msgstr "Falsche Auswahl für Punkt nachzeichnen. Wähle einen einzelnen Punkt." -#: solvespace.cpp:925 +#: solvespace.cpp:941 #, c-format msgid "Couldn't write to '%s'" msgstr "Konnte '%s' nicht schreiben" -#: solvespace.cpp:955 +#: solvespace.cpp:971 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Das Netz schneidet sich selbst: Falsch, ungültig." -#: solvespace.cpp:956 +#: solvespace.cpp:972 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Das Netz schneidet sich nicht: Gut, gültig." -#: solvespace.cpp:958 +#: solvespace.cpp:974 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Das Netz hat lose Kanten: Falsch, ungültig." -#: solvespace.cpp:959 +#: solvespace.cpp:975 msgid "The mesh is watertight (okay, valid)." msgstr "Das Netz hat keine lose Kanten: Gut, gültig." -#: solvespace.cpp:962 +#: solvespace.cpp:978 #, c-format msgid "" "\n" @@ -1951,7 +1955,7 @@ msgstr "" "\n" "Das Modell hat %d Dreiecke, von %d Flächen." -#: solvespace.cpp:966 +#: solvespace.cpp:982 #, c-format msgid "" "%s\n" @@ -1966,7 +1970,7 @@ msgstr "" "\n" "Keine problematischen Kanten, gut.%s" -#: solvespace.cpp:969 +#: solvespace.cpp:985 #, c-format msgid "" "%s\n" @@ -1981,7 +1985,7 @@ msgstr "" "\n" "%d problematische Kanten, schlecht.%s" -#: solvespace.cpp:982 +#: solvespace.cpp:998 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2145,31 +2149,39 @@ msgid "New group rotating active sketch" msgstr "Neue Gruppe mit rotierter aktiver Skizze" #: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "" + +#: toolbar.cpp:76 msgid "New group step and repeat rotating" msgstr "Neue Gruppe mit kopierter gedrehter Skizze" -#: toolbar.cpp:74 +#: toolbar.cpp:78 msgid "New group step and repeat translating" msgstr "Neue Gruppe mit kopierter versetzter Skizze" -#: toolbar.cpp:76 +#: toolbar.cpp:80 msgid "New group in new workplane (thru given entities)" msgstr "" "Neue Gruppe in neuer Arbeitsebene (definiert durch ausgewählte Objekte)" -#: toolbar.cpp:78 +#: toolbar.cpp:82 msgid "New group in 3d" msgstr "Neue Gruppe in 3D" -#: toolbar.cpp:80 +#: toolbar.cpp:84 msgid "New group linking / assembling file" msgstr "Neue Gruppe mit verknüpfter Datei" -#: toolbar.cpp:84 +#: toolbar.cpp:88 msgid "Nearest isometric view" msgstr "Nächste isometrische Ansicht" -#: toolbar.cpp:86 +#: toolbar.cpp:90 msgid "Align view to active workplane" msgstr "Ansicht auf Arbeitsebene ausrichten" diff --git a/res/locales/en_US.po b/res/locales/en_US.po index 01c4b432d..9772d5741 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-23 07:36+0100\n" +"POT-Creation-Date: 2021-01-15 14:51-0600\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: clipboard.cpp:274 +#: clipboard.cpp:310 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,27 +27,27 @@ msgstr "" "\n" "Activate one with Sketch -> In Workplane." -#: clipboard.cpp:291 +#: clipboard.cpp:327 msgid "Clipboard is empty; nothing to paste." msgstr "Clipboard is empty; nothing to paste." -#: clipboard.cpp:338 +#: clipboard.cpp:374 msgid "Number of copies to paste must be at least one." msgstr "Number of copies to paste must be at least one." -#: clipboard.cpp:354 textscreens.cpp:783 +#: clipboard.cpp:390 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "Scale cannot be zero." -#: clipboard.cpp:396 +#: clipboard.cpp:432 msgid "Select one point to define origin of rotation." msgstr "Select one point to define origin of rotation." -#: clipboard.cpp:408 +#: clipboard.cpp:444 msgid "Select two points to define translation vector." msgstr "Select two points to define translation vector." -#: clipboard.cpp:418 +#: clipboard.cpp:454 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -55,23 +55,23 @@ msgstr "" "Transformation is identity. So all copies will be exactly on top of each " "other." -#: clipboard.cpp:422 +#: clipboard.cpp:458 msgid "Too many items to paste; split this into smaller pastes." msgstr "Too many items to paste; split this into smaller pastes." -#: clipboard.cpp:427 +#: clipboard.cpp:463 msgid "No workplane active." msgstr "No workplane active." -#: confscreen.cpp:410 +#: confscreen.cpp:418 msgid "Bad format: specify coordinates as x, y, z" msgstr "Bad format: specify coordinates as x, y, z" -#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "Bad format: specify color as r, g, b" -#: confscreen.cpp:446 +#: confscreen.cpp:454 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:459 confscreen.cpp:469 +#: confscreen.cpp:467 confscreen.cpp:477 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Specify between 0 and %d digits after the decimal." -#: confscreen.cpp:481 +#: confscreen.cpp:489 msgid "Export scale must not be zero!" msgstr "Export scale must not be zero!" -#: confscreen.cpp:493 +#: confscreen.cpp:501 msgid "Cutter radius offset must not be negative!" msgstr "Cutter radius offset must not be negative!" -#: confscreen.cpp:547 +#: confscreen.cpp:555 msgid "Bad value: autosave interval should be positive" msgstr "Bad value: autosave interval should be positive" -#: confscreen.cpp:550 +#: confscreen.cpp:558 msgid "Bad format: specify interval in integral minutes" msgstr "Bad format: specify interval in integral minutes" @@ -275,7 +275,31 @@ msgctxt "constr-name" msgid "comment" msgstr "comment" -#: constraint.cpp:171 +#: constraint.cpp:140 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." + +#: constraint.cpp:158 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." +msgstr "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." + +#: constraint.cpp:183 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." +msgstr "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." + +#: constraint.cpp:231 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -299,7 +323,7 @@ msgstr "" " * a plane face and a point (minimum distance)\n" " * a circle or an arc (diameter)\n" -#: constraint.cpp:224 +#: constraint.cpp:284 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -319,7 +343,7 @@ msgstr "" " * a point and a circle or arc (point on curve)\n" " * a point and a plane face (point on face)\n" -#: constraint.cpp:286 +#: constraint.cpp:346 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -347,7 +371,7 @@ msgstr "" " * two circles or arcs (equal radius)\n" " * a line segment and an arc (line segment length equals arc length)\n" -#: constraint.cpp:325 +#: constraint.cpp:385 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" @@ -357,7 +381,7 @@ msgstr "" "\n" " * two line segments\n" -#: constraint.cpp:342 +#: constraint.cpp:402 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" @@ -369,7 +393,7 @@ msgstr "" "\n" " * two line segments\n" -#: constraint.cpp:368 +#: constraint.cpp:428 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -381,7 +405,7 @@ msgstr "" " * a line segment and a point (point at midpoint)\n" " * a line segment and a workplane (line's midpoint on plane)\n" -#: constraint.cpp:426 +#: constraint.cpp:486 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -401,7 +425,7 @@ msgstr "" " * workplane, and two points or a line segment (symmetric about " "workplane)\n" -#: constraint.cpp:440 +#: constraint.cpp:500 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -409,7 +433,7 @@ msgstr "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." -#: constraint.cpp:470 +#: constraint.cpp:530 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -417,7 +441,7 @@ msgstr "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." -#: constraint.cpp:483 +#: constraint.cpp:543 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -431,7 +455,7 @@ msgstr "" " * two points\n" " * a line segment\n" -#: constraint.cpp:504 +#: constraint.cpp:564 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -443,15 +467,15 @@ msgstr "" "\n" " * two normals\n" -#: constraint.cpp:554 +#: constraint.cpp:614 msgid "Must select an angle constraint." msgstr "Must select an angle constraint." -#: constraint.cpp:567 +#: constraint.cpp:627 msgid "Must select a constraint with associated label." msgstr "Must select a constraint with associated label." -#: constraint.cpp:578 +#: constraint.cpp:638 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -465,35 +489,11 @@ msgstr "" " * a line segment and a normal\n" " * two normals\n" -#: constraint.cpp:635 -msgid "" -"The tangent arc and line segment must share an endpoint. Constrain them with " -"Constrain -> On Point before constraining tangent." -msgstr "" -"The tangent arc and line segment must share an endpoint. Constrain them with " -"Constrain -> On Point before constraining tangent." - -#: constraint.cpp:659 -msgid "" -"The tangent cubic and line segment must share an endpoint. Constrain them " -"with Constrain -> On Point before constraining tangent." -msgstr "" -"The tangent cubic and line segment must share an endpoint. Constrain them " -"with Constrain -> On Point before constraining tangent." - -#: constraint.cpp:669 +#: constraint.cpp:701 msgid "Curve-curve tangency must apply in workplane." msgstr "Curve-curve tangency must apply in workplane." -#: constraint.cpp:687 -msgid "" -"The curves must share an endpoint. Constrain them with Constrain -> On Point " -"before constraining tangent." -msgstr "" -"The curves must share an endpoint. Constrain them with Constrain -> On Point " -"before constraining tangent." - -#: constraint.cpp:696 +#: constraint.cpp:711 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -511,7 +511,7 @@ msgstr "" " * two normals (parallel)\n" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" -#: constraint.cpp:714 +#: constraint.cpp:729 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -525,7 +525,7 @@ msgstr "" " * a line segment and a normal\n" " * two normals\n" -#: constraint.cpp:729 +#: constraint.cpp:744 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -537,7 +537,7 @@ msgstr "" "\n" " * a point\n" -#: constraint.cpp:740 +#: constraint.cpp:755 msgid "click center of comment text" msgstr "click center of comment text" @@ -641,7 +641,7 @@ msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:869 solvespace.cpp:563 +#: file.cpp:869 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "&Cancel" @@ -807,299 +807,303 @@ msgid "Show Snap &Grid" msgstr "Show Snap &Grid" #: graphicswin.cpp:95 +msgid "Dim Solid for Sketch Groups" +msgstr "Dim Solid for Sketch Groups" + +#: graphicswin.cpp:96 msgid "Use &Perspective Projection" msgstr "Use &Perspective Projection" -#: graphicswin.cpp:96 +#: graphicswin.cpp:97 msgid "Dimension &Units" msgstr "Dimension &Units" -#: graphicswin.cpp:97 +#: graphicswin.cpp:98 msgid "Dimensions in &Millimeters" msgstr "Dimensions in &Millimeters" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in M&eters" msgstr "Dimensions in M&eters" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in &Inches" msgstr "Dimensions in &Inches" -#: graphicswin.cpp:101 +#: graphicswin.cpp:102 msgid "Show &Toolbar" msgstr "Show &Toolbar" -#: graphicswin.cpp:102 +#: graphicswin.cpp:103 msgid "Show Property Bro&wser" msgstr "Show Property Bro&wser" -#: graphicswin.cpp:104 +#: graphicswin.cpp:105 msgid "&Full Screen" msgstr "&Full Screen" -#: graphicswin.cpp:106 +#: graphicswin.cpp:107 msgid "&New Group" msgstr "&New Group" -#: graphicswin.cpp:107 +#: graphicswin.cpp:108 msgid "Sketch In &3d" msgstr "Sketch In &3d" -#: graphicswin.cpp:108 +#: graphicswin.cpp:109 msgid "Sketch In New &Workplane" msgstr "Sketch In New &Workplane" -#: graphicswin.cpp:110 +#: graphicswin.cpp:111 msgid "Step &Translating" msgstr "Step &Translating" -#: graphicswin.cpp:111 +#: graphicswin.cpp:112 msgid "Step &Rotating" msgstr "Step &Rotating" -#: graphicswin.cpp:113 +#: graphicswin.cpp:114 msgid "E&xtrude" msgstr "E&xtrude" -#: graphicswin.cpp:114 +#: graphicswin.cpp:115 msgid "&Helix" msgstr "&Helix" -#: graphicswin.cpp:115 +#: graphicswin.cpp:116 msgid "&Lathe" msgstr "&Lathe" -#: graphicswin.cpp:116 +#: graphicswin.cpp:117 msgid "Re&volve" msgstr "Re&volve" -#: graphicswin.cpp:118 +#: graphicswin.cpp:119 msgid "Link / Assemble..." msgstr "Link / Assemble..." -#: graphicswin.cpp:119 +#: graphicswin.cpp:120 msgid "Link Recent" msgstr "Link Recent" -#: graphicswin.cpp:121 +#: graphicswin.cpp:122 msgid "&Sketch" msgstr "&Sketch" -#: graphicswin.cpp:122 +#: graphicswin.cpp:123 msgid "In &Workplane" msgstr "In &Workplane" -#: graphicswin.cpp:123 +#: graphicswin.cpp:124 msgid "Anywhere In &3d" msgstr "Anywhere In &3d" -#: graphicswin.cpp:125 +#: graphicswin.cpp:126 msgid "Datum &Point" msgstr "Datum &Point" -#: graphicswin.cpp:126 +#: graphicswin.cpp:127 msgid "&Workplane" msgstr "&Workplane" -#: graphicswin.cpp:128 +#: graphicswin.cpp:129 msgid "Line &Segment" msgstr "Line &Segment" -#: graphicswin.cpp:129 +#: graphicswin.cpp:130 msgid "C&onstruction Line Segment" msgstr "C&onstruction Line Segment" -#: graphicswin.cpp:130 +#: graphicswin.cpp:131 msgid "&Rectangle" msgstr "&Rectangle" -#: graphicswin.cpp:131 +#: graphicswin.cpp:132 msgid "&Circle" msgstr "&Circle" -#: graphicswin.cpp:132 +#: graphicswin.cpp:133 msgid "&Arc of a Circle" msgstr "&Arc of a Circle" -#: graphicswin.cpp:133 +#: graphicswin.cpp:134 msgid "&Bezier Cubic Spline" msgstr "&Bezier Cubic Spline" -#: graphicswin.cpp:135 +#: graphicswin.cpp:136 msgid "&Text in TrueType Font" msgstr "&Text in TrueType Font" -#: graphicswin.cpp:136 +#: graphicswin.cpp:137 msgid "&Image" msgstr "&Image" -#: graphicswin.cpp:138 +#: graphicswin.cpp:139 msgid "To&ggle Construction" msgstr "To&ggle Construction" -#: graphicswin.cpp:139 +#: graphicswin.cpp:140 msgid "Tangent &Arc at Point" msgstr "Tangent &Arc at Point" -#: graphicswin.cpp:140 +#: graphicswin.cpp:141 msgid "Split Curves at &Intersection" msgstr "Split Curves at &Intersection" -#: graphicswin.cpp:142 +#: graphicswin.cpp:143 msgid "&Constrain" msgstr "&Constrain" -#: graphicswin.cpp:143 +#: graphicswin.cpp:144 msgid "&Distance / Diameter" msgstr "&Distance / Diameter" -#: graphicswin.cpp:144 +#: graphicswin.cpp:145 msgid "Re&ference Dimension" msgstr "Re&ference Dimension" -#: graphicswin.cpp:145 +#: graphicswin.cpp:146 msgid "A&ngle" msgstr "A&ngle" -#: graphicswin.cpp:146 +#: graphicswin.cpp:147 msgid "Reference An&gle" msgstr "Reference An&gle" -#: graphicswin.cpp:147 +#: graphicswin.cpp:148 msgid "Other S&upplementary Angle" msgstr "Other S&upplementary Angle" -#: graphicswin.cpp:148 +#: graphicswin.cpp:149 msgid "Toggle R&eference Dim" msgstr "Toggle R&eference Dim" -#: graphicswin.cpp:150 +#: graphicswin.cpp:151 msgid "&Horizontal" msgstr "&Horizontal" -#: graphicswin.cpp:151 +#: graphicswin.cpp:152 msgid "&Vertical" msgstr "&Vertical" -#: graphicswin.cpp:153 +#: graphicswin.cpp:154 msgid "&On Point / Curve / Plane" msgstr "&On Point / Curve / Plane" -#: graphicswin.cpp:154 +#: graphicswin.cpp:155 msgid "E&qual Length / Radius / Angle" msgstr "E&qual Length / Radius / Angle" -#: graphicswin.cpp:155 +#: graphicswin.cpp:156 msgid "Length Ra&tio" msgstr "Length Ra&tio" -#: graphicswin.cpp:156 +#: graphicswin.cpp:157 msgid "Length Diff&erence" msgstr "Length Diff&erence" -#: graphicswin.cpp:157 +#: graphicswin.cpp:158 msgid "At &Midpoint" msgstr "At &Midpoint" -#: graphicswin.cpp:158 +#: graphicswin.cpp:159 msgid "S&ymmetric" msgstr "S&ymmetric" -#: graphicswin.cpp:159 +#: graphicswin.cpp:160 msgid "Para&llel / Tangent" msgstr "Para&llel / Tangent" -#: graphicswin.cpp:160 +#: graphicswin.cpp:161 msgid "&Perpendicular" msgstr "&Perpendicular" -#: graphicswin.cpp:161 +#: graphicswin.cpp:162 msgid "Same Orient&ation" msgstr "Same Orient&ation" -#: graphicswin.cpp:162 +#: graphicswin.cpp:163 msgid "Lock Point Where &Dragged" msgstr "Lock Point Where &Dragged" -#: graphicswin.cpp:164 +#: graphicswin.cpp:165 msgid "Comment" msgstr "Comment" -#: graphicswin.cpp:166 +#: graphicswin.cpp:167 msgid "&Analyze" msgstr "&Analyze" -#: graphicswin.cpp:167 +#: graphicswin.cpp:168 msgid "Measure &Volume" msgstr "Measure &Volume" -#: graphicswin.cpp:168 +#: graphicswin.cpp:169 msgid "Measure A&rea" msgstr "Measure A&rea" -#: graphicswin.cpp:169 +#: graphicswin.cpp:170 msgid "Measure &Perimeter" msgstr "Measure &Perimeter" -#: graphicswin.cpp:170 +#: graphicswin.cpp:171 msgid "Show &Interfering Parts" msgstr "Show &Interfering Parts" -#: graphicswin.cpp:171 +#: graphicswin.cpp:172 msgid "Show &Naked Edges" msgstr "Show &Naked Edges" -#: graphicswin.cpp:172 +#: graphicswin.cpp:173 msgid "Show &Center of Mass" msgstr "Show &Center of Mass" -#: graphicswin.cpp:174 +#: graphicswin.cpp:175 msgid "Show &Underconstrained Points" msgstr "Show &Underconstrained Points" -#: graphicswin.cpp:176 +#: graphicswin.cpp:177 msgid "&Trace Point" msgstr "&Trace Point" -#: graphicswin.cpp:177 +#: graphicswin.cpp:178 msgid "&Stop Tracing..." msgstr "&Stop Tracing..." -#: graphicswin.cpp:178 +#: graphicswin.cpp:179 msgid "Step &Dimension..." msgstr "Step &Dimension..." -#: graphicswin.cpp:180 +#: graphicswin.cpp:181 msgid "&Help" msgstr "&Help" -#: graphicswin.cpp:181 +#: graphicswin.cpp:182 msgid "&Language" msgstr "&Language" -#: graphicswin.cpp:182 +#: graphicswin.cpp:183 msgid "&Website / Manual" msgstr "&Website / Manual" -#: graphicswin.cpp:184 +#: graphicswin.cpp:185 msgid "&About" msgstr "&About" -#: graphicswin.cpp:352 +#: graphicswin.cpp:355 msgid "(no recent files)" msgstr "(no recent files)" -#: graphicswin.cpp:360 +#: graphicswin.cpp:363 #, c-format msgid "File '%s' does not exist." msgstr "File '%s' does not exist." -#: graphicswin.cpp:721 +#: graphicswin.cpp:725 msgid "No workplane is active, so the grid will not appear." msgstr "No workplane is active, so the grid will not appear." -#: graphicswin.cpp:730 +#: graphicswin.cpp:740 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1113,17 +1117,17 @@ msgstr "" "For a perspective projection, modify the perspective factor in the " "configuration screen. A value around 0.3 is typical." -#: graphicswin.cpp:809 +#: graphicswin.cpp:819 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:1103 +#: graphicswin.cpp:1114 msgid "No additional entities share endpoints with the selected entities." msgstr "No additional entities share endpoints with the selected entities." -#: graphicswin.cpp:1121 +#: graphicswin.cpp:1132 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1131,7 +1135,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:1144 +#: graphicswin.cpp:1155 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1139,7 +1143,7 @@ msgstr "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." -#: graphicswin.cpp:1151 +#: graphicswin.cpp:1162 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1147,11 +1151,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:1239 +#: graphicswin.cpp:1247 msgid "No workplane selected. Activating default workplane for this group." msgstr "No workplane selected. Activating default workplane for this group." -#: graphicswin.cpp:1242 +#: graphicswin.cpp:1250 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-" @@ -1161,7 +1165,7 @@ msgstr "" "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." -#: graphicswin.cpp:1263 +#: graphicswin.cpp:1271 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1169,47 +1173,47 @@ msgstr "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." -#: graphicswin.cpp:1274 +#: graphicswin.cpp:1282 msgid "click point on arc (draws anti-clockwise)" msgstr "click point on arc (draws anti-clockwise)" -#: graphicswin.cpp:1275 +#: graphicswin.cpp:1283 msgid "click to place datum point" msgstr "click to place datum point" -#: graphicswin.cpp:1276 +#: graphicswin.cpp:1284 msgid "click first point of line segment" msgstr "click first point of line segment" -#: graphicswin.cpp:1278 +#: graphicswin.cpp:1286 msgid "click first point of construction line segment" msgstr "click first point of construction line segment" -#: graphicswin.cpp:1279 +#: graphicswin.cpp:1287 msgid "click first point of cubic segment" msgstr "click first point of cubic segment" -#: graphicswin.cpp:1280 +#: graphicswin.cpp:1288 msgid "click center of circle" msgstr "click center of circle" -#: graphicswin.cpp:1281 +#: graphicswin.cpp:1289 msgid "click origin of workplane" msgstr "click origin of workplane" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1290 msgid "click one corner of rectangle" msgstr "click one corner of rectangle" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1291 msgid "click top left of text" msgstr "click top left of text" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1297 msgid "click top left of image" msgstr "click top left of image" -#: graphicswin.cpp:1301 +#: graphicswin.cpp:1309 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1350,19 +1354,19 @@ msgstr "translate" msgid "(unnamed)" msgstr "(unnamed)" -#: groupmesh.cpp:708 +#: groupmesh.cpp:709 msgid "not closed contour, or not all same style!" msgstr "not closed contour, or not all same style!" -#: groupmesh.cpp:721 +#: groupmesh.cpp:722 msgid "points not all coplanar!" msgstr "points not all coplanar!" -#: groupmesh.cpp:723 +#: groupmesh.cpp:724 msgid "contour is self-intersecting!" msgstr "contour is self-intersecting!" -#: groupmesh.cpp:725 +#: groupmesh.cpp:726 msgid "zero-length edge!" msgstr "zero-length edge!" @@ -1498,11 +1502,11 @@ msgstr "Unselect Hovered" msgid "Zoom to Fit" msgstr "Zoom to Fit" -#: mouse.cpp:990 mouse.cpp:1277 +#: mouse.cpp:989 mouse.cpp:1276 msgid "click next point of line, or press Esc" msgstr "click next point of line, or press Esc" -#: mouse.cpp:996 +#: mouse.cpp:995 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1510,15 +1514,15 @@ msgstr "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1030 +#: mouse.cpp:1029 msgid "click to place other corner of rectangle" msgstr "click to place other corner of rectangle" -#: mouse.cpp:1050 +#: mouse.cpp:1049 msgid "click to set radius" msgstr "click to set radius" -#: mouse.cpp:1055 +#: mouse.cpp:1054 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1526,21 +1530,21 @@ msgstr "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1074 +#: mouse.cpp:1073 msgid "click to place point" msgstr "click to place point" -#: mouse.cpp:1090 +#: mouse.cpp:1089 msgid "click next point of cubic, or press Esc" msgstr "click next point of cubic, or press Esc" -#: mouse.cpp:1095 +#: mouse.cpp:1094 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Sketching in a workplane already; sketch in 3d before creating new workplane." -#: mouse.cpp:1111 +#: mouse.cpp:1110 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1548,11 +1552,11 @@ msgstr "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1128 +#: mouse.cpp:1127 msgid "click to place bottom right of text" msgstr "click to place bottom right of text" -#: mouse.cpp:1134 +#: mouse.cpp:1133 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1560,11 +1564,11 @@ msgstr "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1161 +#: mouse.cpp:1160 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace models" @@ -1649,33 +1653,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 msgid "untitled" msgstr "untitled" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1562 +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "Save File" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1564 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "Open File" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 msgctxt "button" msgid "_Cancel" msgstr "_Cancel" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 +#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 msgctxt "button" msgid "_Save" msgstr "_Save" -#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 +#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 msgctxt "button" msgid "_Open" msgstr "_Open" @@ -1705,48 +1709,48 @@ msgctxt "button" msgid "Do&n't Load" msgstr "Do&n't Load" -#: solvespace.cpp:551 +#: solvespace.cpp:557 msgctxt "title" msgid "Modified File" msgstr "Modified File" -#: solvespace.cpp:553 +#: solvespace.cpp:559 #, 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:556 +#: solvespace.cpp:562 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:559 +#: solvespace.cpp:565 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:560 +#: solvespace.cpp:566 msgctxt "button" msgid "&Save" msgstr "&Save" -#: solvespace.cpp:562 +#: solvespace.cpp:568 msgctxt "button" msgid "Do&n't Save" msgstr "Do&n't Save" -#: solvespace.cpp:583 +#: solvespace.cpp:589 msgctxt "title" msgid "(new sketch)" msgstr "(new sketch)" -#: solvespace.cpp:590 +#: solvespace.cpp:596 msgctxt "title" msgid "Property Browser" msgstr "Property Browser" -#: solvespace.cpp:650 +#: solvespace.cpp:658 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 " @@ -1756,7 +1760,7 @@ msgstr "" "is probably not what you want; hide them by clicking the link at the top of " "the text window." -#: solvespace.cpp:718 +#: solvespace.cpp:730 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1765,19 +1769,19 @@ msgstr "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." -#: solvespace.cpp:766 +#: solvespace.cpp:778 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:770 +#: solvespace.cpp:782 msgid "Bad selection for step dimension; select a constraint." msgstr "Bad selection for step dimension; select a constraint." -#: solvespace.cpp:794 +#: solvespace.cpp:806 msgid "The assembly does not interfere, good." msgstr "The assembly does not interfere, good." -#: solvespace.cpp:810 +#: solvespace.cpp:822 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1788,7 +1792,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:819 +#: solvespace.cpp:831 #, c-format msgid "" "\n" @@ -1801,7 +1805,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:824 +#: solvespace.cpp:836 msgid "" "\n" "\n" @@ -1813,7 +1817,7 @@ msgstr "" "Curved surfaces have been approximated as triangles.\n" "This introduces error, typically of around 1%." -#: solvespace.cpp:839 +#: solvespace.cpp:851 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1830,7 +1834,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:848 +#: solvespace.cpp:860 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1838,7 +1842,7 @@ msgstr "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." -#: solvespace.cpp:860 +#: solvespace.cpp:872 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1855,7 +1859,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:880 +#: solvespace.cpp:892 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1872,36 +1876,36 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:886 +#: solvespace.cpp:898 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Bad selection for perimeter; select line segments, arcs, and curves." -#: solvespace.cpp:902 +#: solvespace.cpp:914 msgid "Bad selection for trace; select a single point." msgstr "Bad selection for trace; select a single point." -#: solvespace.cpp:925 +#: solvespace.cpp:941 #, c-format msgid "Couldn't write to '%s'" msgstr "Couldn't write to '%s'" -#: solvespace.cpp:955 +#: solvespace.cpp:971 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "The mesh is self-intersecting (NOT okay, invalid)." -#: solvespace.cpp:956 +#: solvespace.cpp:972 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "The mesh is not self-intersecting (okay, valid)." -#: solvespace.cpp:958 +#: solvespace.cpp:974 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "The mesh has naked edges (NOT okay, invalid)." -#: solvespace.cpp:959 +#: solvespace.cpp:975 msgid "The mesh is watertight (okay, valid)." msgstr "The mesh is watertight (okay, valid)." -#: solvespace.cpp:962 +#: solvespace.cpp:978 #, c-format msgid "" "\n" @@ -1912,7 +1916,7 @@ msgstr "" "\n" "The model contains %d triangles, from %d surfaces." -#: solvespace.cpp:966 +#: solvespace.cpp:982 #, c-format msgid "" "%s\n" @@ -1927,7 +1931,7 @@ msgstr "" "\n" "Zero problematic edges, good.%s" -#: solvespace.cpp:969 +#: solvespace.cpp:985 #, c-format msgid "" "%s\n" @@ -1942,7 +1946,7 @@ msgstr "" "\n" "%d problematic edges, bad.%s" -#: solvespace.cpp:982 +#: solvespace.cpp:998 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2104,30 +2108,38 @@ msgid "New group rotating active sketch" msgstr "New group rotating active sketch" #: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "New group helix from active sketch" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "New group revolve active sketch" + +#: toolbar.cpp:76 msgid "New group step and repeat rotating" msgstr "New group step and repeat rotating" -#: toolbar.cpp:74 +#: toolbar.cpp:78 msgid "New group step and repeat translating" msgstr "New group step and repeat translating" -#: toolbar.cpp:76 +#: toolbar.cpp:80 msgid "New group in new workplane (thru given entities)" msgstr "New group in new workplane (thru given entities)" -#: toolbar.cpp:78 +#: toolbar.cpp:82 msgid "New group in 3d" msgstr "New group in 3d" -#: toolbar.cpp:80 +#: toolbar.cpp:84 msgid "New group linking / assembling file" msgstr "New group linking / assembling file" -#: toolbar.cpp:84 +#: toolbar.cpp:88 msgid "Nearest isometric view" msgstr "Nearest isometric view" -#: toolbar.cpp:86 +#: toolbar.cpp:90 msgid "Align view to active workplane" msgstr "Align view to active workplane" diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index 2295312b5..a6f4c1e8a 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-23 07:36+0100\n" +"POT-Creation-Date: 2021-01-15 14:51-0600\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" @@ -17,7 +17,7 @@ msgstr "" "X-Generator: Zanata 4.4.5\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: clipboard.cpp:274 +#: clipboard.cpp:310 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,27 +27,27 @@ msgstr "" "\n" "Activez un plan avec \"Dessin -> Dans plan de travail\"." -#: clipboard.cpp:291 +#: clipboard.cpp:327 msgid "Clipboard is empty; nothing to paste." msgstr "Presse papier vide; rien à coller." -#: clipboard.cpp:338 +#: clipboard.cpp:374 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:354 textscreens.cpp:783 +#: clipboard.cpp:390 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "L'échelle ne peut pas être zéro." -#: clipboard.cpp:396 +#: clipboard.cpp:432 msgid "Select one point to define origin of rotation." msgstr "Sélectionnez un point pour définir l'origine de la rotation." -#: clipboard.cpp:408 +#: clipboard.cpp:444 msgid "Select two points to define translation vector." msgstr "Sélectionnez deux points pour définir le vecteur de translation." -#: clipboard.cpp:418 +#: clipboard.cpp:454 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -55,23 +55,23 @@ msgstr "" "Transformation identique. Donc, toutes les copies seront exactement les unes " "au-dessus des autres." -#: clipboard.cpp:422 +#: clipboard.cpp:458 msgid "Too many items to paste; split this into smaller pastes." msgstr "Trop d'éléments à coller; Divisez-les en plus petits groupes." -#: clipboard.cpp:427 +#: clipboard.cpp:463 msgid "No workplane active." msgstr "Pas d'espace de travail actif." -#: confscreen.cpp:410 +#: confscreen.cpp:418 msgid "Bad format: specify coordinates as x, y, z" msgstr "Mauvais format: spécifiez les coordonnées comme x, y, z" -#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "Mauvais format; spécifiez la couleur comme r, v, b" -#: confscreen.cpp:446 +#: confscreen.cpp:454 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:459 confscreen.cpp:469 +#: confscreen.cpp:467 confscreen.cpp:477 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:481 +#: confscreen.cpp:489 msgid "Export scale must not be zero!" msgstr "L'échelle d'export ne doit pas être zéro!" -#: confscreen.cpp:493 +#: confscreen.cpp:501 msgid "Cutter radius offset must not be negative!" msgstr "Le décalage du rayon de coupe ne doit pas être négatif!" -#: confscreen.cpp:547 +#: confscreen.cpp:555 msgid "Bad value: autosave interval should be positive" msgstr "" "Mauvaise valeur: l'intervalle d'enregistrement automatique devrait être " "positif" -#: confscreen.cpp:550 +#: confscreen.cpp:558 msgid "Bad format: specify interval in integral minutes" msgstr "Mauvais format: spécifiez un nombre entier de minutes" @@ -277,7 +277,33 @@ msgctxt "constr-name" msgid "comment" msgstr "commentaire" -#: constraint.cpp:171 +#: constraint.cpp:140 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "" +"L'arc tangent et le segment de ligne doivent partager un point final. " +"Contraignez-les avec \"Contrainte -> Sur point avant de contraindre la " +"tangente\"." + +#: constraint.cpp:158 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." +msgstr "" +"La tangente cubique et le segment de ligne doivent partager un point final. " +"Contraignez-les avec \"Contrainte -> Sur point avant de contraindre la " +"tangente\"." + +#: constraint.cpp:183 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." +msgstr "" +"Les courbes doivent partager un point final. Contraignez-les avec " +"\"Contrainte -> Sur point avant de contraindre la tangente\"." + +#: constraint.cpp:231 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -301,7 +327,7 @@ msgstr "" "    * Une face plane et un point (distance minimale)\n" "    * Un cercle ou un arc (diamètre)\n" -#: constraint.cpp:224 +#: constraint.cpp:284 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -321,7 +347,7 @@ msgstr "" "    * Un point et un cercle ou un arc (point sur courbe)\n" "    * Un point et une face plane (point sur une face)\n" -#: constraint.cpp:286 +#: constraint.cpp:346 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -352,7 +378,7 @@ msgstr "" "    * Un segment de ligne et un arc (la longueur de segment de ligne est " "égale à la longueur d'arc)\n" -#: constraint.cpp:325 +#: constraint.cpp:385 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" @@ -363,7 +389,7 @@ msgstr "" "\n" "    * Deux segments de ligne\n" -#: constraint.cpp:342 +#: constraint.cpp:402 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" @@ -375,7 +401,7 @@ msgstr "" "\n" "    * Deux segments de ligne\n" -#: constraint.cpp:368 +#: constraint.cpp:428 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -388,7 +414,7 @@ msgstr "" "    * Un segment de ligne et un point (point au milieu)\n" "    * Un segment de ligne et un plan de travail (point médian dans le plan)\n" -#: constraint.cpp:426 +#: constraint.cpp:486 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -409,7 +435,7 @@ msgstr "" "    * Plan de travail, et deux points ou un segment de ligne (symétrique au " "plan de travail)\n" -#: constraint.cpp:440 +#: constraint.cpp:500 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -417,7 +443,7 @@ msgstr "" "Un plan de travail doit être actif lors d'une contrainte de symétrie sans " "plan de symétrie explicite." -#: constraint.cpp:470 +#: constraint.cpp:530 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -425,7 +451,7 @@ msgstr "" "Activez un plan de travail (avec Dessin -> Dans plan de travail) avant " "d'appliquer une contrainte horizontale ou verticale." -#: constraint.cpp:483 +#: constraint.cpp:543 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -439,7 +465,7 @@ msgstr "" "    * deux points\n" "    * Un segment de ligne\n" -#: constraint.cpp:504 +#: constraint.cpp:564 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -451,15 +477,15 @@ msgstr "" "\n" " * Deux normales\n" -#: constraint.cpp:554 +#: constraint.cpp:614 msgid "Must select an angle constraint." msgstr "Vous devez sélectionner une contrainte d'angle." -#: constraint.cpp:567 +#: constraint.cpp:627 msgid "Must select a constraint with associated label." msgstr "Vous devez sélectionner une contrainte avec une étiquette associée." -#: constraint.cpp:578 +#: constraint.cpp:638 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -474,37 +500,11 @@ msgstr "" "    * Un segment de ligne et une normale\n" "    * Deux normales\n" -#: constraint.cpp:635 -msgid "" -"The tangent arc and line segment must share an endpoint. Constrain them with " -"Constrain -> On Point before constraining tangent." -msgstr "" -"L'arc tangent et le segment de ligne doivent partager un point final. " -"Contraignez-les avec \"Contrainte -> Sur point avant de contraindre la " -"tangente\"." - -#: constraint.cpp:659 -msgid "" -"The tangent cubic and line segment must share an endpoint. Constrain them " -"with Constrain -> On Point before constraining tangent." -msgstr "" -"La tangente cubique et le segment de ligne doivent partager un point final. " -"Contraignez-les avec \"Contrainte -> Sur point avant de contraindre la " -"tangente\"." - -#: constraint.cpp:669 +#: constraint.cpp:701 msgid "Curve-curve tangency must apply in workplane." msgstr "Courbe-Courbe tangence doit s'appliquer dans le plan de travail." -#: constraint.cpp:687 -msgid "" -"The curves must share an endpoint. Constrain them with Constrain -> On Point " -"before constraining tangent." -msgstr "" -"Les courbes doivent partager un point final. Contraignez-les avec " -"\"Contrainte -> Sur point avant de contraindre la tangente\"." - -#: constraint.cpp:696 +#: constraint.cpp:711 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -523,7 +523,7 @@ msgstr "" "    * Deux segments de ligne, des arcs ou des Béziers, qui partagent un " "point final (tangent)\n" -#: constraint.cpp:714 +#: constraint.cpp:729 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -538,7 +538,7 @@ msgstr "" "    * Un segment de ligne et une normale\n" "    * Deux normales\n" -#: constraint.cpp:729 +#: constraint.cpp:744 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -550,7 +550,7 @@ msgstr "" "\n" "    * un point\n" -#: constraint.cpp:740 +#: constraint.cpp:755 msgid "click center of comment text" msgstr "cliquez le centre du texte de commentaire" @@ -654,7 +654,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 solvespace.cpp:563 +#: file.cpp:869 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "" @@ -820,299 +820,303 @@ msgid "Show Snap &Grid" msgstr "Afficher la &grille d'accrochage" #: graphicswin.cpp:95 +msgid "Dim Solid for Sketch Groups" +msgstr "" + +#: graphicswin.cpp:96 msgid "Use &Perspective Projection" msgstr "Utiliser la vue en &Perspective" -#: graphicswin.cpp:96 +#: graphicswin.cpp:97 msgid "Dimension &Units" msgstr "&Unités de dimensions" -#: graphicswin.cpp:97 +#: graphicswin.cpp:98 msgid "Dimensions in &Millimeters" msgstr "Dimensions en &Millimètres" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in M&eters" msgstr "Dimensions en &Mètres" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in &Inches" msgstr "Dimensions en &Pouces" -#: graphicswin.cpp:101 +#: graphicswin.cpp:102 msgid "Show &Toolbar" msgstr "Affichage &Barre d'outils" -#: graphicswin.cpp:102 +#: graphicswin.cpp:103 msgid "Show Property Bro&wser" msgstr "Affichage du &Navigateur de Propriété" -#: graphicswin.cpp:104 +#: graphicswin.cpp:105 msgid "&Full Screen" msgstr "&Plein Ecran" -#: graphicswin.cpp:106 +#: graphicswin.cpp:107 msgid "&New Group" msgstr "&Nouveau Groupe" -#: graphicswin.cpp:107 +#: graphicswin.cpp:108 msgid "Sketch In &3d" msgstr "Dessin en &3d" -#: graphicswin.cpp:108 +#: graphicswin.cpp:109 msgid "Sketch In New &Workplane" msgstr "Dessin dans un nouveau &Plan de travail" -#: graphicswin.cpp:110 +#: graphicswin.cpp:111 msgid "Step &Translating" msgstr "Espacement &Linéaire" -#: graphicswin.cpp:111 +#: graphicswin.cpp:112 msgid "Step &Rotating" msgstr "Espacement &Circulaire" -#: graphicswin.cpp:113 +#: graphicswin.cpp:114 msgid "E&xtrude" msgstr "E&xtruder" -#: graphicswin.cpp:114 +#: graphicswin.cpp:115 msgid "&Helix" msgstr "&Helix" -#: graphicswin.cpp:115 +#: graphicswin.cpp:116 msgid "&Lathe" msgstr "&Lathe" -#: graphicswin.cpp:116 +#: graphicswin.cpp:117 msgid "Re&volve" msgstr "Ré&volution" -#: graphicswin.cpp:118 +#: graphicswin.cpp:119 msgid "Link / Assemble..." msgstr "Lié / Assembler..." -#: graphicswin.cpp:119 +#: graphicswin.cpp:120 msgid "Link Recent" msgstr "Lié Récent" -#: graphicswin.cpp:121 +#: graphicswin.cpp:122 msgid "&Sketch" msgstr "&Dessin" -#: graphicswin.cpp:122 +#: graphicswin.cpp:123 msgid "In &Workplane" msgstr "Dans le &Plan de travail" -#: graphicswin.cpp:123 +#: graphicswin.cpp:124 msgid "Anywhere In &3d" msgstr "N'importe où dans la &3d" -#: graphicswin.cpp:125 +#: graphicswin.cpp:126 msgid "Datum &Point" msgstr "&Point" -#: graphicswin.cpp:126 +#: graphicswin.cpp:127 msgid "&Workplane" msgstr "&Plan de travail" -#: graphicswin.cpp:128 +#: graphicswin.cpp:129 msgid "Line &Segment" msgstr "Ligne - &Polyligne" -#: graphicswin.cpp:129 +#: graphicswin.cpp:130 msgid "C&onstruction Line Segment" msgstr "Ligne de C&onstruction" -#: graphicswin.cpp:130 +#: graphicswin.cpp:131 msgid "&Rectangle" msgstr "&Rectangle" -#: graphicswin.cpp:131 +#: graphicswin.cpp:132 msgid "&Circle" msgstr "&Cercle" -#: graphicswin.cpp:132 +#: graphicswin.cpp:133 msgid "&Arc of a Circle" msgstr "&Arc de Cercle" -#: graphicswin.cpp:133 +#: graphicswin.cpp:134 msgid "&Bezier Cubic Spline" msgstr "Spline Cubique de &Beziers" -#: graphicswin.cpp:135 +#: graphicswin.cpp:136 msgid "&Text in TrueType Font" msgstr "&Texte en Police TrueType" -#: graphicswin.cpp:136 +#: graphicswin.cpp:137 msgid "&Image" msgstr "&Image" -#: graphicswin.cpp:138 +#: graphicswin.cpp:139 msgid "To&ggle Construction" msgstr "&Basculer en mode \"Construction\"" -#: graphicswin.cpp:139 +#: graphicswin.cpp:140 msgid "Tangent &Arc at Point" msgstr "&Arc Tangent au Point" -#: graphicswin.cpp:140 +#: graphicswin.cpp:141 msgid "Split Curves at &Intersection" msgstr "Diviser les Courbes à l'&Intersection" -#: graphicswin.cpp:142 +#: graphicswin.cpp:143 msgid "&Constrain" msgstr "&Constraintes" -#: graphicswin.cpp:143 +#: graphicswin.cpp:144 msgid "&Distance / Diameter" msgstr "&Distance / Diamètre" -#: graphicswin.cpp:144 +#: graphicswin.cpp:145 msgid "Re&ference Dimension" msgstr "Dimension Maîtresse / Indicative" -#: graphicswin.cpp:145 +#: graphicswin.cpp:146 msgid "A&ngle" msgstr "A&ngle" -#: graphicswin.cpp:146 +#: graphicswin.cpp:147 msgid "Reference An&gle" msgstr "An&gle Maître / Indicatif" -#: graphicswin.cpp:147 +#: graphicswin.cpp:148 msgid "Other S&upplementary Angle" msgstr "Autre angle S&upplémentaire" -#: graphicswin.cpp:148 +#: graphicswin.cpp:149 msgid "Toggle R&eference Dim" msgstr "Basculer cote Maîtresse / cote Indicative" -#: graphicswin.cpp:150 +#: graphicswin.cpp:151 msgid "&Horizontal" msgstr "&Horizontal" -#: graphicswin.cpp:151 +#: graphicswin.cpp:152 msgid "&Vertical" msgstr "&Vertical" -#: graphicswin.cpp:153 +#: graphicswin.cpp:154 msgid "&On Point / Curve / Plane" msgstr "&Sur Point / Courbe / Plan" -#: graphicswin.cpp:154 +#: graphicswin.cpp:155 msgid "E&qual Length / Radius / Angle" msgstr "&Egale Longueur / Rayon / Angle" -#: graphicswin.cpp:155 +#: graphicswin.cpp:156 msgid "Length Ra&tio" msgstr "R&apport de Longueur" -#: graphicswin.cpp:156 +#: graphicswin.cpp:157 msgid "Length Diff&erence" msgstr "D&ifférence de Longueur" -#: graphicswin.cpp:157 +#: graphicswin.cpp:158 msgid "At &Midpoint" msgstr "Au &Milieu" -#: graphicswin.cpp:158 +#: graphicswin.cpp:159 msgid "S&ymmetric" msgstr "&Symétrique" -#: graphicswin.cpp:159 +#: graphicswin.cpp:160 msgid "Para&llel / Tangent" msgstr "Para&llèle / Tangent" -#: graphicswin.cpp:160 +#: graphicswin.cpp:161 msgid "&Perpendicular" msgstr "&Perpendiculaire" -#: graphicswin.cpp:161 +#: graphicswin.cpp:162 msgid "Same Orient&ation" msgstr "Même Orient&ation" -#: graphicswin.cpp:162 +#: graphicswin.cpp:163 msgid "Lock Point Where &Dragged" msgstr "Accrocher le point à l'&Emplacement" -#: graphicswin.cpp:164 +#: graphicswin.cpp:165 msgid "Comment" msgstr "Commentaire" -#: graphicswin.cpp:166 +#: graphicswin.cpp:167 msgid "&Analyze" msgstr "&Analyse" -#: graphicswin.cpp:167 +#: graphicswin.cpp:168 msgid "Measure &Volume" msgstr "Mesure &Volume" -#: graphicswin.cpp:168 +#: graphicswin.cpp:169 msgid "Measure A&rea" msgstr "Mesure &Aire" -#: graphicswin.cpp:169 +#: graphicswin.cpp:170 msgid "Measure &Perimeter" msgstr "Mesure &Périmètre" -#: graphicswin.cpp:170 +#: graphicswin.cpp:171 msgid "Show &Interfering Parts" msgstr "Montrer les Pièces &Interférentes" -#: graphicswin.cpp:171 +#: graphicswin.cpp:172 msgid "Show &Naked Edges" msgstr "Montrer les Arêtes &Nues" -#: graphicswin.cpp:172 +#: graphicswin.cpp:173 msgid "Show &Center of Mass" msgstr "Montrer le &Centre de Gravité" -#: graphicswin.cpp:174 +#: graphicswin.cpp:175 msgid "Show &Underconstrained Points" msgstr "Montrer les &sous-contraintes Points" -#: graphicswin.cpp:176 +#: graphicswin.cpp:177 msgid "&Trace Point" msgstr "&Tracer Point" -#: graphicswin.cpp:177 +#: graphicswin.cpp:178 msgid "&Stop Tracing..." msgstr "&Arrêt Tracé..." -#: graphicswin.cpp:178 +#: graphicswin.cpp:179 msgid "Step &Dimension..." msgstr "Espacement &Dimension..." -#: graphicswin.cpp:180 +#: graphicswin.cpp:181 msgid "&Help" msgstr "&Aide" -#: graphicswin.cpp:181 +#: graphicswin.cpp:182 msgid "&Language" msgstr "&Langue" -#: graphicswin.cpp:182 +#: graphicswin.cpp:183 msgid "&Website / Manual" msgstr "&Site web / Manuel" -#: graphicswin.cpp:184 +#: graphicswin.cpp:185 msgid "&About" msgstr "&A propos" -#: graphicswin.cpp:352 +#: graphicswin.cpp:355 msgid "(no recent files)" msgstr "(pas de fichier récent)" -#: graphicswin.cpp:360 +#: graphicswin.cpp:363 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:721 +#: graphicswin.cpp:725 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:730 +#: graphicswin.cpp:740 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1126,19 +1130,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:809 +#: graphicswin.cpp:819 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:1103 +#: graphicswin.cpp:1114 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:1121 +#: graphicswin.cpp:1132 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1146,7 +1150,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:1144 +#: graphicswin.cpp:1155 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1154,7 +1158,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:1151 +#: graphicswin.cpp:1162 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1163,13 +1167,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:1239 +#: graphicswin.cpp:1247 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:1242 +#: graphicswin.cpp:1250 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-" @@ -1179,7 +1183,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:1263 +#: graphicswin.cpp:1271 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1187,49 +1191,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:1274 +#: graphicswin.cpp:1282 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:1275 +#: graphicswin.cpp:1283 msgid "click to place datum point" msgstr "cliquez pour placer un point" -#: graphicswin.cpp:1276 +#: graphicswin.cpp:1284 msgid "click first point of line segment" msgstr "cliquez le premier point du segment de ligne" -#: graphicswin.cpp:1278 +#: graphicswin.cpp:1286 msgid "click first point of construction line segment" msgstr "cliquez le premier point de la ligne de construction" -#: graphicswin.cpp:1279 +#: graphicswin.cpp:1287 msgid "click first point of cubic segment" msgstr "cliquez le premier point du segment cubique" -#: graphicswin.cpp:1280 +#: graphicswin.cpp:1288 msgid "click center of circle" msgstr "cliquez pour placer le centre du cercle" -#: graphicswin.cpp:1281 +#: graphicswin.cpp:1289 msgid "click origin of workplane" msgstr "cliquez pour placer l'origine du plan de travail" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1290 msgid "click one corner of rectangle" msgstr "cliquez un coin du rectangle" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1291 msgid "click top left of text" msgstr "cliquez le haut à gauche du texte" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1297 msgid "click top left of image" msgstr "cliquez le haut à gauche de l'image" -#: graphicswin.cpp:1301 +#: graphicswin.cpp:1309 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1363,19 +1367,19 @@ msgstr "translation" msgid "(unnamed)" msgstr "(sans nom)" -#: groupmesh.cpp:708 +#: groupmesh.cpp:709 msgid "not closed contour, or not all same style!" msgstr "contour non fermé ou tout n'est pas du même style!" -#: groupmesh.cpp:721 +#: groupmesh.cpp:722 msgid "points not all coplanar!" msgstr "les points ne sont pas tous coplanaires!" -#: groupmesh.cpp:723 +#: groupmesh.cpp:724 msgid "contour is self-intersecting!" msgstr "le contour s'entrecroise!" -#: groupmesh.cpp:725 +#: groupmesh.cpp:726 msgid "zero-length edge!" msgstr "arête de longueur nulle!" @@ -1511,11 +1515,11 @@ msgstr "Désélectionner survolé" msgid "Zoom to Fit" msgstr "Zoom pour ajuster" -#: mouse.cpp:990 mouse.cpp:1277 +#: mouse.cpp:989 mouse.cpp:1276 msgid "click next point of line, or press Esc" msgstr "cliquez pou le prochain point de ligne or appuyez sur Esc" -#: mouse.cpp:996 +#: mouse.cpp:995 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1523,15 +1527,15 @@ msgstr "" "Impossible de dessiner un rectangle en 3d; D'abord, activez un plan de " "travail avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1030 +#: mouse.cpp:1029 msgid "click to place other corner of rectangle" msgstr "cliquez pour placer un autre coin de rectangle" -#: mouse.cpp:1050 +#: mouse.cpp:1049 msgid "click to set radius" msgstr "cliquez pour ajuster le rayon" -#: mouse.cpp:1055 +#: mouse.cpp:1054 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1539,22 +1543,22 @@ msgstr "" "Ne peut pas dessiner l'arc en 3d; D'abord, activez un plan de travail avec " "\"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1074 +#: mouse.cpp:1073 msgid "click to place point" msgstr "cliquez pour placer un point" -#: mouse.cpp:1090 +#: mouse.cpp:1089 msgid "click next point of cubic, or press Esc" msgstr "cliquez le prochain point cubique ou appuyez sur Esc" -#: mouse.cpp:1095 +#: mouse.cpp:1094 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Vous dessinez déjà dans un plan de travail; Sélectionner \"Dessiner en 3d\" " "avant de créer un nouveau plan de travail." -#: mouse.cpp:1111 +#: mouse.cpp:1110 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1562,11 +1566,11 @@ msgstr "" "Impossible de dessiner du texte en 3d; D'abord, activer un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1128 +#: mouse.cpp:1127 msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1134 +#: mouse.cpp:1133 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1574,11 +1578,11 @@ msgstr "" "Impossible de dessiner l'image en 3d; D'abord, activez un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1161 +#: mouse.cpp:1160 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NOUVEAU COMMENTAIRE - DOUBLE-CLIQUE POUR EDITER" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1663,33 +1667,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 msgid "untitled" msgstr "sans nom" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1562 +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "Sauver fichier" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1564 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "Ouvrir Fichier" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 msgctxt "button" msgid "_Cancel" msgstr "_Annuler" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 +#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 msgctxt "button" msgid "_Save" msgstr "_Sauver" -#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 +#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 msgctxt "button" msgid "_Open" msgstr "" @@ -1719,74 +1723,74 @@ msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:551 +#: solvespace.cpp:557 msgctxt "title" msgid "Modified File" msgstr "Fichier modifié" -#: solvespace.cpp:553 +#: solvespace.cpp:559 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:556 +#: solvespace.cpp:562 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:559 +#: solvespace.cpp:565 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:560 +#: solvespace.cpp:566 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:562 +#: solvespace.cpp:568 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:583 +#: solvespace.cpp:589 msgctxt "title" msgid "(new sketch)" msgstr "(nouveau dessin)" -#: solvespace.cpp:590 +#: solvespace.cpp:596 msgctxt "title" msgid "Property Browser" msgstr "Navigateur de propriété" -#: solvespace.cpp:650 +#: solvespace.cpp:658 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:718 +#: solvespace.cpp:730 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:766 +#: solvespace.cpp:778 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:770 +#: solvespace.cpp:782 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:794 +#: solvespace.cpp:806 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:810 +#: solvespace.cpp:822 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1794,7 +1798,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:819 +#: solvespace.cpp:831 #, c-format msgid "" "\n" @@ -1803,7 +1807,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:824 +#: solvespace.cpp:836 msgid "" "\n" "\n" @@ -1811,7 +1815,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:839 +#: solvespace.cpp:851 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1822,13 +1826,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:848 +#: solvespace.cpp:860 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:872 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1839,7 +1843,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:880 +#: solvespace.cpp:892 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1850,36 +1854,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:886 +#: solvespace.cpp:898 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:902 +#: solvespace.cpp:914 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:925 +#: solvespace.cpp:941 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:955 +#: solvespace.cpp:971 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:956 +#: solvespace.cpp:972 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:958 +#: solvespace.cpp:974 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:959 +#: solvespace.cpp:975 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:962 +#: solvespace.cpp:978 #, c-format msgid "" "\n" @@ -1887,7 +1891,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:966 +#: solvespace.cpp:982 #, c-format msgid "" "%s\n" @@ -1897,7 +1901,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:969 +#: solvespace.cpp:985 #, c-format msgid "" "%s\n" @@ -1907,7 +1911,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:998 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2057,31 +2061,39 @@ msgid "New group rotating active sketch" msgstr "Nouveau groupe de révolution du dessin actif" #: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "" + +#: toolbar.cpp:76 msgid "New group step and repeat rotating" msgstr "Nouveau groupe de répétition circulaire" -#: toolbar.cpp:74 +#: toolbar.cpp:78 msgid "New group step and repeat translating" msgstr "Nouveau groupe de répétition linéaire" -#: toolbar.cpp:76 +#: toolbar.cpp:80 msgid "New group in new workplane (thru given entities)" msgstr "" "Nouveau groupe dans un nouveau plan de travail (Par des entités données)" -#: toolbar.cpp:78 +#: toolbar.cpp:82 msgid "New group in 3d" msgstr "Nouveau groupe en 3d" -#: toolbar.cpp:80 +#: toolbar.cpp:84 msgid "New group linking / assembling file" msgstr "Nouveau groupe lié / assemblage" -#: toolbar.cpp:84 +#: toolbar.cpp:88 msgid "Nearest isometric view" msgstr "Vue isométrique la plus proche" -#: toolbar.cpp:86 +#: toolbar.cpp:90 msgid "Align view to active workplane" msgstr "Aligner la vue sur le plan de travail actif" diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index c098caaf8..07bab48f6 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-23 07:36+0100\n" +"POT-Creation-Date: 2021-01-15 14:51-0600\n" "PO-Revision-Date: 2017-04-21 10:29+0700\n" "Last-Translator: evilspirit@evilspirit.org\n" "Language-Team: EvilSpirit\n" @@ -17,7 +17,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.0.1\n" -#: clipboard.cpp:274 +#: clipboard.cpp:310 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,50 +27,50 @@ msgstr "" "можно только находясь в рабочей плоскости.\n" "Активируйте рабочую плоскость через Эскиз->В Рабочей Плоскости" -#: clipboard.cpp:291 +#: clipboard.cpp:327 msgid "Clipboard is empty; nothing to paste." msgstr "Буфер обмена пуст; нечего вставлять." -#: clipboard.cpp:338 +#: clipboard.cpp:374 msgid "Number of copies to paste must be at least one." msgstr "Укажите в поле 'количество' хотя бы одну копию для вставки." -#: clipboard.cpp:354 textscreens.cpp:783 +#: clipboard.cpp:390 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "Масштабный коэффициент не может быть нулевым." -#: clipboard.cpp:396 +#: clipboard.cpp:432 msgid "Select one point to define origin of rotation." msgstr "Выберите одну точку в качестве центра вращения." -#: clipboard.cpp:408 +#: clipboard.cpp:444 msgid "Select two points to define translation vector." msgstr "Выберите две точки, чтобы задать вектор смещения." -#: clipboard.cpp:418 +#: clipboard.cpp:454 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "" "Трансформация не задана. Все копии будут расположены в одном и том же месте." -#: clipboard.cpp:422 +#: clipboard.cpp:458 msgid "Too many items to paste; split this into smaller pastes." msgstr "Слишком много элементов для вставки; разбейте на несколько частей." -#: clipboard.cpp:427 +#: clipboard.cpp:463 msgid "No workplane active." msgstr "Рабочая плоскость не активна" -#: confscreen.cpp:410 +#: confscreen.cpp:418 msgid "Bad format: specify coordinates as x, y, z" msgstr "Неверный формат: введите координаты как x, y, z" -#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "Неверный формат: введите цвет как r, g, b" -#: confscreen.cpp:446 +#: confscreen.cpp:454 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -78,25 +78,25 @@ msgstr "" "Коэффициент перспективы не будет иметь эффект, пока вы не включите Вид-" ">Перспективная Проекция." -#: confscreen.cpp:459 confscreen.cpp:469 +#: confscreen.cpp:467 confscreen.cpp:477 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Введите число от 0 до %d." -#: confscreen.cpp:481 +#: confscreen.cpp:489 msgid "Export scale must not be zero!" msgstr "Масштабный коэффициент не может быть нулевым!" -#: confscreen.cpp:493 +#: confscreen.cpp:501 msgid "Cutter radius offset must not be negative!" msgstr "Радиус режущего инструмента не может быть отрицательным!" -#: confscreen.cpp:547 +#: confscreen.cpp:555 msgid "Bad value: autosave interval should be positive" msgstr "" "Неверное значение: интервал автосохранения должен быть положительным числом" -#: confscreen.cpp:550 +#: confscreen.cpp:558 msgid "Bad format: specify interval in integral minutes" msgstr "" "Неверный формат: введите целое число, чтобы задать интервал автосохранения" @@ -276,7 +276,34 @@ msgctxt "constr-name" msgid "comment" msgstr "комментарий" -#: constraint.cpp:171 +#: constraint.cpp:140 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "" +"Дуга и отрезок должны быть соединены. Соедините их крайние точки с помощью " +"'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " +"касательности." + +#: constraint.cpp:158 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." +msgstr "" +"Сплайн и отрезок должны быть соединены. Соедините их крайние точки с помощью " +"'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " +"касательности." + +#: constraint.cpp:183 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." +msgstr "" +"Кривые должны быть соединены. Соедините их крайние точки с помощью " +"'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " +"касательности." + +#: constraint.cpp:231 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -301,7 +328,7 @@ msgstr "" " * грань и точку (расстояние от точки до плоскости грани)\n" " * окружность или дугу (диаметр / радиус)\n" -#: constraint.cpp:224 +#: constraint.cpp:284 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -321,7 +348,7 @@ msgstr "" " * точку и окружность / дугу / сплайн (точка на кривой)\n" " * точку и грань (точка на грани)\n" -#: constraint.cpp:286 +#: constraint.cpp:346 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -349,7 +376,7 @@ msgstr "" " * две окружности / дуги (равенство радиусов)\n" " * отрезок и дугу (равенство длины отрезка и длины дуги)\n" -#: constraint.cpp:325 +#: constraint.cpp:385 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" @@ -360,7 +387,7 @@ msgstr "" "\n" " * два отрезка\n" -#: constraint.cpp:342 +#: constraint.cpp:402 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" @@ -372,7 +399,7 @@ msgstr "" "\n" " * два отрезка\n" -#: constraint.cpp:368 +#: constraint.cpp:428 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -385,7 +412,7 @@ msgstr "" " * точку и отрезок (точка на середине отрезка)\n" " * отрезок и рабочую плоскость (середина отрезка на плоскости)\n" -#: constraint.cpp:426 +#: constraint.cpp:486 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -405,7 +432,7 @@ msgstr "" " * рабочую плоскость и две точки / отрезок (симметричность относительно " "рабочей плоскости\n" -#: constraint.cpp:440 +#: constraint.cpp:500 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -413,7 +440,7 @@ msgstr "" "Рабочая плоскость должна быть активна для того, чтобы создать\n" "ограничение симметричности без явного указания плоскости симметрии." -#: constraint.cpp:470 +#: constraint.cpp:530 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -421,7 +448,7 @@ msgstr "" "Рабочая плоскость должна быть активирована (Эскиз -> В рабочей плоскости)\n" "перед тем, как накладывать ограничения горизонтальности / вертикальности." -#: constraint.cpp:483 +#: constraint.cpp:543 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -435,7 +462,7 @@ msgstr "" " * две точки\n" " * отрезок\n" -#: constraint.cpp:504 +#: constraint.cpp:564 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -447,18 +474,18 @@ msgstr "" "\n" " * два координатных базиса('нормали')\n" -#: constraint.cpp:554 +#: constraint.cpp:614 msgid "Must select an angle constraint." msgstr "" "Переключатся между смежными углами можно только выбрав ограничение угла." -#: constraint.cpp:567 +#: constraint.cpp:627 msgid "Must select a constraint with associated label." msgstr "" "Переключать режим 'размера для справок' возможно только для ограничений, " "имеющих размерное значение." -#: constraint.cpp:578 +#: constraint.cpp:638 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -473,39 +500,12 @@ msgstr "" " * отрезок и координатный базис (нормаль)\n" " * два координатных базиса (нормали)\n" -#: constraint.cpp:635 -msgid "" -"The tangent arc and line segment must share an endpoint. Constrain them with " -"Constrain -> On Point before constraining tangent." -msgstr "" -"Дуга и отрезок должны быть соединены. Соедините их крайние точки с помощью " -"'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " -"касательности." - -#: constraint.cpp:659 -msgid "" -"The tangent cubic and line segment must share an endpoint. Constrain them " -"with Constrain -> On Point before constraining tangent." -msgstr "" -"Сплайн и отрезок должны быть соединены. Соедините их крайние точки с помощью " -"'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " -"касательности." - -#: constraint.cpp:669 +#: constraint.cpp:701 msgid "Curve-curve tangency must apply in workplane." msgstr "" "Ограничение касательности может быть наложено только в рабочей плоскости." -#: constraint.cpp:687 -msgid "" -"The curves must share an endpoint. Constrain them with Constrain -> On Point " -"before constraining tangent." -msgstr "" -"Кривые должны быть соединены. Соедините их крайние точки с помощью " -"'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " -"касательности." - -#: constraint.cpp:696 +#: constraint.cpp:711 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -524,7 +524,7 @@ msgstr "" " * два отрезка, две дуги или два сплайна, соединенных крайними точками " "(касательность)\n" -#: constraint.cpp:714 +#: constraint.cpp:729 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -539,7 +539,7 @@ msgstr "" " * отрезок и координатный базис (нормаль)\n" " * два координатных базиса (нормали)\n" -#: constraint.cpp:729 +#: constraint.cpp:744 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -551,7 +551,7 @@ msgstr "" "\n" " * точку\n" -#: constraint.cpp:740 +#: constraint.cpp:755 msgid "click center of comment text" msgstr "кликните мышью там, где будет расположен текстовый комментарий" @@ -648,7 +648,7 @@ msgctxt "button" msgid "&No" msgstr "Нет" -#: file.cpp:869 solvespace.cpp:563 +#: file.cpp:869 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "Отменить" @@ -814,299 +814,303 @@ msgid "Show Snap &Grid" msgstr "Показать &Сетку" #: graphicswin.cpp:95 +msgid "Dim Solid for Sketch Groups" +msgstr "" + +#: graphicswin.cpp:96 msgid "Use &Perspective Projection" msgstr "Перспективная Прое&кция" -#: graphicswin.cpp:96 +#: graphicswin.cpp:97 msgid "Dimension &Units" msgstr "" -#: graphicswin.cpp:97 +#: graphicswin.cpp:98 msgid "Dimensions in &Millimeters" msgstr "Размеры в Ми&ллиметрах" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in M&eters" msgstr "" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in &Inches" msgstr "Размеры в Дю&ймах" -#: graphicswin.cpp:101 +#: graphicswin.cpp:102 msgid "Show &Toolbar" msgstr "Показывать Па&нель Инструментов" -#: graphicswin.cpp:102 +#: graphicswin.cpp:103 msgid "Show Property Bro&wser" msgstr "Показывать Брау&зер" -#: graphicswin.cpp:104 +#: graphicswin.cpp:105 msgid "&Full Screen" msgstr "Полно&экранный Режим" -#: graphicswin.cpp:106 +#: graphicswin.cpp:107 msgid "&New Group" msgstr "&Группа" -#: graphicswin.cpp:107 +#: graphicswin.cpp:108 msgid "Sketch In &3d" msgstr "Создать Эскиз в &3d" -#: graphicswin.cpp:108 +#: graphicswin.cpp:109 msgid "Sketch In New &Workplane" msgstr "Создать Эскиз в Новой &Рабочей Плоскости" -#: graphicswin.cpp:110 +#: graphicswin.cpp:111 msgid "Step &Translating" msgstr "&Линейный Массив" -#: graphicswin.cpp:111 +#: graphicswin.cpp:112 msgid "Step &Rotating" msgstr "&Круговой Массив" -#: graphicswin.cpp:113 +#: graphicswin.cpp:114 msgid "E&xtrude" msgstr "Тело &Выдавливания" -#: graphicswin.cpp:114 +#: graphicswin.cpp:115 msgid "&Helix" msgstr "" -#: graphicswin.cpp:115 +#: graphicswin.cpp:116 msgid "&Lathe" msgstr "Тело В&ращения" -#: graphicswin.cpp:116 +#: graphicswin.cpp:117 msgid "Re&volve" msgstr "" -#: graphicswin.cpp:118 +#: graphicswin.cpp:119 msgid "Link / Assemble..." msgstr "&Импорт Детали / Сборка..." -#: graphicswin.cpp:119 +#: graphicswin.cpp:120 msgid "Link Recent" msgstr "Последние &Детали" -#: graphicswin.cpp:121 +#: graphicswin.cpp:122 msgid "&Sketch" msgstr "&Эскиз" -#: graphicswin.cpp:122 +#: graphicswin.cpp:123 msgid "In &Workplane" msgstr "В &Рабочей Плоскости" -#: graphicswin.cpp:123 +#: graphicswin.cpp:124 msgid "Anywhere In &3d" msgstr "Режим &3d" -#: graphicswin.cpp:125 +#: graphicswin.cpp:126 msgid "Datum &Point" msgstr "Опорная &Точка" -#: graphicswin.cpp:126 +#: graphicswin.cpp:127 msgid "&Workplane" msgstr "Рабочая &Плоскость" -#: graphicswin.cpp:128 +#: graphicswin.cpp:129 msgid "Line &Segment" msgstr "&Отрезок" -#: graphicswin.cpp:129 +#: graphicswin.cpp:130 msgid "C&onstruction Line Segment" msgstr "&Вспомогательный Отрезок" -#: graphicswin.cpp:130 +#: graphicswin.cpp:131 msgid "&Rectangle" msgstr "Прямоу&гольник" -#: graphicswin.cpp:131 +#: graphicswin.cpp:132 msgid "&Circle" msgstr "О&кружность" -#: graphicswin.cpp:132 +#: graphicswin.cpp:133 msgid "&Arc of a Circle" msgstr "Д&уга Окружности" -#: graphicswin.cpp:133 +#: graphicswin.cpp:134 msgid "&Bezier Cubic Spline" msgstr "Кубический &Сплайн Безье" -#: graphicswin.cpp:135 +#: graphicswin.cpp:136 msgid "&Text in TrueType Font" msgstr "Т&екст TrueType" -#: graphicswin.cpp:136 +#: graphicswin.cpp:137 msgid "&Image" msgstr "И&зображение" -#: graphicswin.cpp:138 +#: graphicswin.cpp:139 msgid "To&ggle Construction" msgstr "Переключить Режим Вс&помогательных Построений" -#: graphicswin.cpp:139 +#: graphicswin.cpp:140 msgid "Tangent &Arc at Point" msgstr "Кас&ательная в Точке" -#: graphicswin.cpp:140 +#: graphicswin.cpp:141 msgid "Split Curves at &Intersection" msgstr "Ра&збить Кривые Пересечением" -#: graphicswin.cpp:142 +#: graphicswin.cpp:143 msgid "&Constrain" msgstr "&Ограничения" -#: graphicswin.cpp:143 +#: graphicswin.cpp:144 msgid "&Distance / Diameter" msgstr "&Расстояние / Диаметр" -#: graphicswin.cpp:144 +#: graphicswin.cpp:145 msgid "Re&ference Dimension" msgstr "&Справочный Размер" -#: graphicswin.cpp:145 +#: graphicswin.cpp:146 msgid "A&ngle" msgstr "&Угол" -#: graphicswin.cpp:146 +#: graphicswin.cpp:147 msgid "Reference An&gle" msgstr "С&правочный Угол" -#: graphicswin.cpp:147 +#: graphicswin.cpp:148 msgid "Other S&upplementary Angle" msgstr "Переключить Сме&жный Угол" -#: graphicswin.cpp:148 +#: graphicswin.cpp:149 msgid "Toggle R&eference Dim" msgstr "Переключить Режим Размера Для Спра&вок" -#: graphicswin.cpp:150 +#: graphicswin.cpp:151 msgid "&Horizontal" msgstr "&Горизонтальность" -#: graphicswin.cpp:151 +#: graphicswin.cpp:152 msgid "&Vertical" msgstr "&Вертикальность" -#: graphicswin.cpp:153 +#: graphicswin.cpp:154 msgid "&On Point / Curve / Plane" msgstr "&Точка на Примитиве" -#: graphicswin.cpp:154 +#: graphicswin.cpp:155 msgid "E&qual Length / Radius / Angle" msgstr "&Равенство Длин / Радиусов / Углов" -#: graphicswin.cpp:155 +#: graphicswin.cpp:156 msgid "Length Ra&tio" msgstr "Отно&шение Длин" -#: graphicswin.cpp:156 +#: graphicswin.cpp:157 msgid "Length Diff&erence" msgstr "Ра&зница Длин" -#: graphicswin.cpp:157 +#: graphicswin.cpp:158 msgid "At &Midpoint" msgstr "&На Середине" -#: graphicswin.cpp:158 +#: graphicswin.cpp:159 msgid "S&ymmetric" msgstr "С&имметричность" -#: graphicswin.cpp:159 +#: graphicswin.cpp:160 msgid "Para&llel / Tangent" msgstr "Пара&ллельность / Касательность" -#: graphicswin.cpp:160 +#: graphicswin.cpp:161 msgid "&Perpendicular" msgstr "Перпендикул&ярность" -#: graphicswin.cpp:161 +#: graphicswin.cpp:162 msgid "Same Orient&ation" msgstr "Идентичная &Ориентация" -#: graphicswin.cpp:162 +#: graphicswin.cpp:163 msgid "Lock Point Where &Dragged" msgstr "За&фиксировать" -#: graphicswin.cpp:164 +#: graphicswin.cpp:165 msgid "Comment" msgstr "Текстовый &Комментарий" -#: graphicswin.cpp:166 +#: graphicswin.cpp:167 msgid "&Analyze" msgstr "&Анализ" -#: graphicswin.cpp:167 +#: graphicswin.cpp:168 msgid "Measure &Volume" msgstr "Измерить &Объем" -#: graphicswin.cpp:168 +#: graphicswin.cpp:169 msgid "Measure A&rea" msgstr "Измерить П&лощадь" -#: graphicswin.cpp:169 +#: graphicswin.cpp:170 msgid "Measure &Perimeter" msgstr "Измерить П&ериметр" -#: graphicswin.cpp:170 +#: graphicswin.cpp:171 msgid "Show &Interfering Parts" msgstr "Показать Пе&ресекающиеся Детали" -#: graphicswin.cpp:171 +#: graphicswin.cpp:172 msgid "Show &Naked Edges" msgstr "Показать Про&блемные Ребра" -#: graphicswin.cpp:172 +#: graphicswin.cpp:173 msgid "Show &Center of Mass" msgstr "" -#: graphicswin.cpp:174 +#: graphicswin.cpp:175 msgid "Show &Underconstrained Points" msgstr "" -#: graphicswin.cpp:176 +#: graphicswin.cpp:177 msgid "&Trace Point" msgstr "Включить &Трассировку Точки" -#: graphicswin.cpp:177 +#: graphicswin.cpp:178 msgid "&Stop Tracing..." msgstr "Остановить Тра&ссировку..." -#: graphicswin.cpp:178 +#: graphicswin.cpp:179 msgid "Step &Dimension..." msgstr "Плавное Из&менение Размера..." -#: graphicswin.cpp:180 +#: graphicswin.cpp:181 msgid "&Help" msgstr "&Помощь" -#: graphicswin.cpp:181 +#: graphicswin.cpp:182 msgid "&Language" msgstr "&Язык" -#: graphicswin.cpp:182 +#: graphicswin.cpp:183 msgid "&Website / Manual" msgstr "Вебсайт / &Справка" -#: graphicswin.cpp:184 +#: graphicswin.cpp:185 msgid "&About" msgstr "О &Программе" -#: graphicswin.cpp:352 +#: graphicswin.cpp:355 msgid "(no recent files)" msgstr "(пусто)" -#: graphicswin.cpp:360 +#: graphicswin.cpp:363 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:721 +#: graphicswin.cpp:725 msgid "No workplane is active, so the grid will not appear." msgstr "Сетку не будет видно, пока рабочая плоскость не активирована." -#: graphicswin.cpp:730 +#: graphicswin.cpp:740 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1120,16 +1124,16 @@ msgstr "" "перспективы на конфигурационной странице браузера.\n" "Значение по умолчанию 0.3." -#: graphicswin.cpp:809 +#: graphicswin.cpp:819 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "Выделите точку. Вид будет отцентрован по этой точке." -#: graphicswin.cpp:1103 +#: graphicswin.cpp:1114 msgid "No additional entities share endpoints with the selected entities." msgstr "Нет дополнительных объектов, соединенных с выбранными примитивами." -#: graphicswin.cpp:1121 +#: graphicswin.cpp:1132 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1138,7 +1142,7 @@ msgstr "" "принадлежащий импортированной детали или активируйте группу импортированной " "детали." -#: graphicswin.cpp:1144 +#: graphicswin.cpp:1155 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1146,7 +1150,7 @@ msgstr "" "Рабочая плоскость не активна. Активируйте ее через Эскиз -> В Рабочей " "Плоскости чтобы определить плоскость для сетки." -#: graphicswin.cpp:1151 +#: graphicswin.cpp:1162 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1155,13 +1159,13 @@ msgstr "" "текстовые комментарии или ограничения с размерными значениями. Чтобы " "привязать отрезок или другой примитив, выбирайте его точки." -#: graphicswin.cpp:1239 +#: graphicswin.cpp:1247 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Рабочая плоскость не активна. Активирована рабочая плоскость по умолчанию " "для данной группы." -#: graphicswin.cpp:1242 +#: graphicswin.cpp:1250 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-" @@ -1171,7 +1175,7 @@ msgstr "" "по умолчанию. Попробуйте выделить рабочую плоскость или создать новую с " "помощью Группа -> Создать Эскиз в Новой Рабочей Плоскости." -#: graphicswin.cpp:1263 +#: graphicswin.cpp:1271 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1180,53 +1184,53 @@ msgstr "" "точку, либо запустите команду без выделения, чтобы перейти к окну настроек " "этой команды." -#: graphicswin.cpp:1274 +#: graphicswin.cpp:1282 msgid "click point on arc (draws anti-clockwise)" msgstr "" "кликните мышью там, где хотите создать дугу окружности (дуга будет " "нарисована против часовой стрелки)" -#: graphicswin.cpp:1275 +#: graphicswin.cpp:1283 msgid "click to place datum point" msgstr "кликните мышью там, где хотите создать опорную точку" -#: graphicswin.cpp:1276 +#: graphicswin.cpp:1284 msgid "click first point of line segment" msgstr "кликните мышью там, где хотите создать первую точку отрезка" -#: graphicswin.cpp:1278 +#: graphicswin.cpp:1286 msgid "click first point of construction line segment" msgstr "" "кликните мышью там, где хотите создать первую точку вспомогательного отрезка" -#: graphicswin.cpp:1279 +#: graphicswin.cpp:1287 msgid "click first point of cubic segment" msgstr "" "кликните мышью там, где хотите создать первую точку кубического сплайна Безье" -#: graphicswin.cpp:1280 +#: graphicswin.cpp:1288 msgid "click center of circle" msgstr "кликните мышью там, где будет находиться центр окружности" -#: graphicswin.cpp:1281 +#: graphicswin.cpp:1289 msgid "click origin of workplane" msgstr "" "кликните мышью там, где будет находиться точка, через которую будет " "построена рабочая плоскость" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1290 msgid "click one corner of rectangle" msgstr "кликните мышью там, где будет находиться один из углов прямоугольника" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1291 msgid "click top left of text" msgstr "кликните мышью там, где хотите создать текст" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1297 msgid "click top left of image" msgstr "" -#: graphicswin.cpp:1301 +#: graphicswin.cpp:1309 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1366,19 +1370,19 @@ msgstr "линейный-массив" msgid "(unnamed)" msgstr "(без имени)" -#: groupmesh.cpp:708 +#: groupmesh.cpp:709 msgid "not closed contour, or not all same style!" msgstr "незамкнутый контур или несовпадение стилей!" -#: groupmesh.cpp:721 +#: groupmesh.cpp:722 msgid "points not all coplanar!" msgstr "не все точки лежат в одной плоскости!" -#: groupmesh.cpp:723 +#: groupmesh.cpp:724 msgid "contour is self-intersecting!" msgstr "контур имеет самопересечения!" -#: groupmesh.cpp:725 +#: groupmesh.cpp:726 msgid "zero-length edge!" msgstr "вырожденный отрезок!" @@ -1519,69 +1523,69 @@ msgstr "Снять Выделение с Выбранного" msgid "Zoom to Fit" msgstr "Показать Все" -#: mouse.cpp:990 mouse.cpp:1277 +#: mouse.cpp:989 mouse.cpp:1276 msgid "click next point of line, or press Esc" msgstr "кликните мышью там, где хотите расположить следующую точку" -#: mouse.cpp:996 +#: mouse.cpp:995 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" "Невозможно начертить прямоугольник, когда рабочая плоскость не активна." -#: mouse.cpp:1030 +#: mouse.cpp:1029 msgid "click to place other corner of rectangle" msgstr "кликните мышью там, где хотите расположить другой угол прямоугольника" -#: mouse.cpp:1050 +#: mouse.cpp:1049 msgid "click to set radius" msgstr "кликните, чтобы задать радиус" -#: mouse.cpp:1055 +#: mouse.cpp:1054 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать дугу, когда нет активной рабочей плоскости." -#: mouse.cpp:1074 +#: mouse.cpp:1073 msgid "click to place point" msgstr "кликните мышью там, где хотите создать точку" -#: mouse.cpp:1090 +#: mouse.cpp:1089 msgid "click next point of cubic, or press Esc" msgstr "" "кликните мышью там, где хотите создать следующую точку сплайна или нажмите " "Esc для завершения операции." -#: mouse.cpp:1095 +#: mouse.cpp:1094 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Рабочая плоскость уже активна. Перейдите в режим 3d перед созданием новой " "рабочей плоскости." -#: mouse.cpp:1111 +#: mouse.cpp:1110 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать текст, когда нет активной рабочей плоскости." -#: mouse.cpp:1128 +#: mouse.cpp:1127 msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1134 +#: mouse.cpp:1133 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1161 +#: mouse.cpp:1160 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "КОММЕНТАРИЙ -- ДВОЙНОЙ ЩЕЛЧОК ДЛЯ РЕДАКТИРОВАНИЯ" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 msgctxt "file-type" msgid "SolveSpace models" msgstr "проекты SolveSpace" @@ -1666,33 +1670,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "CSV файлы (значения, разделенные запятой)" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 msgid "untitled" msgstr "без имени" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1562 +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "Сохранить Файл" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1564 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "Открыть Файл" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 msgctxt "button" msgid "_Cancel" msgstr "Отменить" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 +#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 msgctxt "button" msgid "_Save" msgstr "Сохранить" -#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 +#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 msgctxt "button" msgid "_Open" msgstr "" @@ -1722,74 +1726,74 @@ msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:551 +#: solvespace.cpp:557 msgctxt "title" msgid "Modified File" msgstr "Измененный Файл" -#: solvespace.cpp:553 +#: solvespace.cpp:559 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:556 +#: solvespace.cpp:562 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:559 +#: solvespace.cpp:565 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:560 +#: solvespace.cpp:566 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:562 +#: solvespace.cpp:568 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:583 +#: solvespace.cpp:589 msgctxt "title" msgid "(new sketch)" msgstr "(новый проект)" -#: solvespace.cpp:590 +#: solvespace.cpp:596 msgctxt "title" msgid "Property Browser" msgstr "Браузер" -#: solvespace.cpp:650 +#: solvespace.cpp:658 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:718 +#: solvespace.cpp:730 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:766 +#: solvespace.cpp:778 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:770 +#: solvespace.cpp:782 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:794 +#: solvespace.cpp:806 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:810 +#: solvespace.cpp:822 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1797,7 +1801,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:819 +#: solvespace.cpp:831 #, c-format msgid "" "\n" @@ -1806,7 +1810,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:824 +#: solvespace.cpp:836 msgid "" "\n" "\n" @@ -1814,7 +1818,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:839 +#: solvespace.cpp:851 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1825,13 +1829,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:848 +#: solvespace.cpp:860 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:872 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1842,7 +1846,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:880 +#: solvespace.cpp:892 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1853,36 +1857,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:886 +#: solvespace.cpp:898 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:902 +#: solvespace.cpp:914 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:925 +#: solvespace.cpp:941 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:955 +#: solvespace.cpp:971 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:956 +#: solvespace.cpp:972 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:958 +#: solvespace.cpp:974 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:959 +#: solvespace.cpp:975 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:962 +#: solvespace.cpp:978 #, c-format msgid "" "\n" @@ -1890,7 +1894,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:966 +#: solvespace.cpp:982 #, c-format msgid "" "%s\n" @@ -1900,7 +1904,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:969 +#: solvespace.cpp:985 #, c-format msgid "" "%s\n" @@ -1910,7 +1914,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:998 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2060,30 +2064,38 @@ msgid "New group rotating active sketch" msgstr "Создать группу вращения текущего эскиза" #: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "" + +#: toolbar.cpp:76 msgid "New group step and repeat rotating" msgstr "Создать группу кругового массива" -#: toolbar.cpp:74 +#: toolbar.cpp:78 msgid "New group step and repeat translating" msgstr "Создать группу линейного массива" -#: toolbar.cpp:76 +#: toolbar.cpp:80 msgid "New group in new workplane (thru given entities)" msgstr "Создать группу в новой рабочей плоскости (через выбранные примитивы)" -#: toolbar.cpp:78 +#: toolbar.cpp:82 msgid "New group in 3d" msgstr "Новая группа в 3d" -#: toolbar.cpp:80 +#: toolbar.cpp:84 msgid "New group linking / assembling file" msgstr "Новая группа импорта детали / сборки" -#: toolbar.cpp:84 +#: toolbar.cpp:88 msgid "Nearest isometric view" msgstr "Ближайший изометрический вид" -#: toolbar.cpp:86 +#: toolbar.cpp:90 msgid "Align view to active workplane" msgstr "Выровнять вид на рабочую плоскость" diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index 89fd5ac0d..3922b16be 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-23 07:36+0100\n" +"POT-Creation-Date: 2021-01-15 14:51-0600\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: appsoft@ua.fm\n" "Language-Team: OpenOrienteeringUkraine\n" @@ -16,79 +16,79 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: clipboard.cpp:274 +#: clipboard.cpp:310 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" "Activate one with Sketch -> In Workplane." msgstr "" -#: clipboard.cpp:291 +#: clipboard.cpp:327 msgid "Clipboard is empty; nothing to paste." msgstr "" -#: clipboard.cpp:338 +#: clipboard.cpp:374 msgid "Number of copies to paste must be at least one." msgstr "" -#: clipboard.cpp:354 textscreens.cpp:783 +#: clipboard.cpp:390 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "" -#: clipboard.cpp:396 +#: clipboard.cpp:432 msgid "Select one point to define origin of rotation." msgstr "" -#: clipboard.cpp:408 +#: clipboard.cpp:444 msgid "Select two points to define translation vector." msgstr "" -#: clipboard.cpp:418 +#: clipboard.cpp:454 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "" -#: clipboard.cpp:422 +#: clipboard.cpp:458 msgid "Too many items to paste; split this into smaller pastes." msgstr "" -#: clipboard.cpp:427 +#: clipboard.cpp:463 msgid "No workplane active." msgstr "" -#: confscreen.cpp:410 +#: confscreen.cpp:418 msgid "Bad format: specify coordinates as x, y, z" msgstr "" -#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "" -#: confscreen.cpp:446 +#: confscreen.cpp:454 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." msgstr "" -#: confscreen.cpp:459 confscreen.cpp:469 +#: confscreen.cpp:467 confscreen.cpp:477 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:481 +#: confscreen.cpp:489 msgid "Export scale must not be zero!" msgstr "" -#: confscreen.cpp:493 +#: confscreen.cpp:501 msgid "Cutter radius offset must not be negative!" msgstr "" -#: confscreen.cpp:547 +#: confscreen.cpp:555 msgid "Bad value: autosave interval should be positive" msgstr "" -#: confscreen.cpp:550 +#: confscreen.cpp:558 msgid "Bad format: specify interval in integral minutes" msgstr "" @@ -267,7 +267,25 @@ msgctxt "constr-name" msgid "comment" msgstr "" -#: constraint.cpp:171 +#: constraint.cpp:140 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "" + +#: constraint.cpp:158 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." +msgstr "" + +#: constraint.cpp:183 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." +msgstr "" + +#: constraint.cpp:231 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -281,7 +299,7 @@ msgid "" " * a circle or an arc (diameter)\n" msgstr "" -#: constraint.cpp:224 +#: constraint.cpp:284 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -293,7 +311,7 @@ msgid "" " * a point and a plane face (point on face)\n" msgstr "" -#: constraint.cpp:286 +#: constraint.cpp:346 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -309,14 +327,14 @@ msgid "" " * a line segment and an arc (line segment length equals arc length)\n" msgstr "" -#: constraint.cpp:325 +#: constraint.cpp:385 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" msgstr "" -#: constraint.cpp:342 +#: constraint.cpp:402 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" @@ -324,7 +342,7 @@ msgid "" " * two line segments\n" msgstr "" -#: constraint.cpp:368 +#: constraint.cpp:428 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -332,7 +350,7 @@ msgid "" " * a line segment and a workplane (line's midpoint on plane)\n" msgstr "" -#: constraint.cpp:426 +#: constraint.cpp:486 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -344,19 +362,19 @@ msgid "" "workplane)\n" msgstr "" -#: constraint.cpp:440 +#: constraint.cpp:500 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." msgstr "" -#: constraint.cpp:470 +#: constraint.cpp:530 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." msgstr "" -#: constraint.cpp:483 +#: constraint.cpp:543 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -365,7 +383,7 @@ msgid "" " * a line segment\n" msgstr "" -#: constraint.cpp:504 +#: constraint.cpp:564 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -373,15 +391,15 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:554 +#: constraint.cpp:614 msgid "Must select an angle constraint." msgstr "" -#: constraint.cpp:567 +#: constraint.cpp:627 msgid "Must select a constraint with associated label." msgstr "" -#: constraint.cpp:578 +#: constraint.cpp:638 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -390,29 +408,11 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:635 -msgid "" -"The tangent arc and line segment must share an endpoint. Constrain them with " -"Constrain -> On Point before constraining tangent." -msgstr "" - -#: constraint.cpp:659 -msgid "" -"The tangent cubic and line segment must share an endpoint. Constrain them " -"with Constrain -> On Point before constraining tangent." -msgstr "" - -#: constraint.cpp:669 +#: constraint.cpp:701 msgid "Curve-curve tangency must apply in workplane." msgstr "" -#: constraint.cpp:687 -msgid "" -"The curves must share an endpoint. Constrain them with Constrain -> On Point " -"before constraining tangent." -msgstr "" - -#: constraint.cpp:696 +#: constraint.cpp:711 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -423,7 +423,7 @@ msgid "" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" -#: constraint.cpp:714 +#: constraint.cpp:729 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -432,7 +432,7 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:729 +#: constraint.cpp:744 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -440,7 +440,7 @@ msgid "" " * a point\n" msgstr "" -#: constraint.cpp:740 +#: constraint.cpp:755 msgid "click center of comment text" msgstr "" @@ -528,7 +528,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 solvespace.cpp:563 +#: file.cpp:869 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "" @@ -694,299 +694,303 @@ msgid "Show Snap &Grid" msgstr "Показати &Сітку Прикріплення" #: graphicswin.cpp:95 +msgid "Dim Solid for Sketch Groups" +msgstr "" + +#: graphicswin.cpp:96 msgid "Use &Perspective Projection" msgstr "Використовувати &Перспективну Проекцію" -#: graphicswin.cpp:96 +#: graphicswin.cpp:97 msgid "Dimension &Units" msgstr "" -#: graphicswin.cpp:97 +#: graphicswin.cpp:98 msgid "Dimensions in &Millimeters" msgstr "Розміри в &Міліметрах" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in M&eters" msgstr "" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in &Inches" msgstr "Розміри в &Дюймах" -#: graphicswin.cpp:101 +#: graphicswin.cpp:102 msgid "Show &Toolbar" msgstr "Показати Панель &Інструментів" -#: graphicswin.cpp:102 +#: graphicswin.cpp:103 msgid "Show Property Bro&wser" msgstr "Показати Вікно Власти&востей" -#: graphicswin.cpp:104 +#: graphicswin.cpp:105 msgid "&Full Screen" msgstr "&Повний Екран" -#: graphicswin.cpp:106 +#: graphicswin.cpp:107 msgid "&New Group" msgstr "&Нова Група" -#: graphicswin.cpp:107 +#: graphicswin.cpp:108 msgid "Sketch In &3d" msgstr "Креслення В &3d" -#: graphicswin.cpp:108 +#: graphicswin.cpp:109 msgid "Sketch In New &Workplane" msgstr "Креслення В Новій Робочій &Площині" -#: graphicswin.cpp:110 +#: graphicswin.cpp:111 msgid "Step &Translating" msgstr "Покрокове &Переміщення" -#: graphicswin.cpp:111 +#: graphicswin.cpp:112 msgid "Step &Rotating" msgstr "Покрокове &Обертання" -#: graphicswin.cpp:113 +#: graphicswin.cpp:114 msgid "E&xtrude" msgstr "Ви&давити" -#: graphicswin.cpp:114 +#: graphicswin.cpp:115 msgid "&Helix" msgstr "" -#: graphicswin.cpp:115 +#: graphicswin.cpp:116 msgid "&Lathe" msgstr "&Виточити" -#: graphicswin.cpp:116 +#: graphicswin.cpp:117 msgid "Re&volve" msgstr "" -#: graphicswin.cpp:118 +#: graphicswin.cpp:119 msgid "Link / Assemble..." msgstr "Приєднати / Монтувати..." -#: graphicswin.cpp:119 +#: graphicswin.cpp:120 msgid "Link Recent" msgstr "Приєднати Недавні" -#: graphicswin.cpp:121 +#: graphicswin.cpp:122 msgid "&Sketch" msgstr "&Креслення" -#: graphicswin.cpp:122 +#: graphicswin.cpp:123 msgid "In &Workplane" msgstr "В Робочій &Площині" -#: graphicswin.cpp:123 +#: graphicswin.cpp:124 msgid "Anywhere In &3d" msgstr "Будь-де В &3d" -#: graphicswin.cpp:125 +#: graphicswin.cpp:126 msgid "Datum &Point" msgstr "Опорна &Точка" -#: graphicswin.cpp:126 +#: graphicswin.cpp:127 msgid "&Workplane" msgstr "Робоча &Площина" -#: graphicswin.cpp:128 +#: graphicswin.cpp:129 msgid "Line &Segment" msgstr "&Відрізок Прямої" -#: graphicswin.cpp:129 +#: graphicswin.cpp:130 msgid "C&onstruction Line Segment" msgstr "Контсрук&ційний Відрізок Прямої" -#: graphicswin.cpp:130 +#: graphicswin.cpp:131 msgid "&Rectangle" msgstr "&Прямокутник" -#: graphicswin.cpp:131 +#: graphicswin.cpp:132 msgid "&Circle" msgstr "&Коло" -#: graphicswin.cpp:132 +#: graphicswin.cpp:133 msgid "&Arc of a Circle" msgstr "&Дуга Кола" -#: graphicswin.cpp:133 +#: graphicswin.cpp:134 msgid "&Bezier Cubic Spline" msgstr "Кубічний Сплайн &Без'є" -#: graphicswin.cpp:135 +#: graphicswin.cpp:136 msgid "&Text in TrueType Font" msgstr "&Текст з TrueType Шрифтом" -#: graphicswin.cpp:136 +#: graphicswin.cpp:137 msgid "&Image" msgstr "" -#: graphicswin.cpp:138 +#: graphicswin.cpp:139 msgid "To&ggle Construction" msgstr "Пере&мкнути Конструктивність" -#: graphicswin.cpp:139 +#: graphicswin.cpp:140 msgid "Tangent &Arc at Point" msgstr "Дотична &Дуга на Точці" -#: graphicswin.cpp:140 +#: graphicswin.cpp:141 msgid "Split Curves at &Intersection" msgstr "Розрізати Криві на &Перетині" -#: graphicswin.cpp:142 +#: graphicswin.cpp:143 msgid "&Constrain" msgstr "&Обмежити" -#: graphicswin.cpp:143 +#: graphicswin.cpp:144 msgid "&Distance / Diameter" msgstr "&Відстань / Діаметр" -#: graphicswin.cpp:144 +#: graphicswin.cpp:145 msgid "Re&ference Dimension" msgstr "Від&носний Розмір" -#: graphicswin.cpp:145 +#: graphicswin.cpp:146 msgid "A&ngle" msgstr "К&ут" -#: graphicswin.cpp:146 +#: graphicswin.cpp:147 msgid "Reference An&gle" msgstr "Відносний К&ут" -#: graphicswin.cpp:147 +#: graphicswin.cpp:148 msgid "Other S&upplementary Angle" msgstr "Інший Су&міжний Кут" -#: graphicswin.cpp:148 +#: graphicswin.cpp:149 msgid "Toggle R&eference Dim" msgstr "Перемкнути Від&носність Розмірів" -#: graphicswin.cpp:150 +#: graphicswin.cpp:151 msgid "&Horizontal" msgstr "&Горизонтально" -#: graphicswin.cpp:151 +#: graphicswin.cpp:152 msgid "&Vertical" msgstr "&Вертикально" -#: graphicswin.cpp:153 +#: graphicswin.cpp:154 msgid "&On Point / Curve / Plane" msgstr "&На точці / Кривій / Площині" -#: graphicswin.cpp:154 +#: graphicswin.cpp:155 msgid "E&qual Length / Radius / Angle" msgstr "Рі&вні Довжина / Радіус / Кут" -#: graphicswin.cpp:155 +#: graphicswin.cpp:156 msgid "Length Ra&tio" msgstr "Про&порція Довжин" -#: graphicswin.cpp:156 +#: graphicswin.cpp:157 msgid "Length Diff&erence" msgstr "Рі&зниця Довжин" -#: graphicswin.cpp:157 +#: graphicswin.cpp:158 msgid "At &Midpoint" msgstr "До &Середини" -#: graphicswin.cpp:158 +#: graphicswin.cpp:159 msgid "S&ymmetric" msgstr "Си&метрично" -#: graphicswin.cpp:159 +#: graphicswin.cpp:160 msgid "Para&llel / Tangent" msgstr "Пара&лельно / Дотична" -#: graphicswin.cpp:160 +#: graphicswin.cpp:161 msgid "&Perpendicular" msgstr "&Препендикулярно" -#: graphicswin.cpp:161 +#: graphicswin.cpp:162 msgid "Same Orient&ation" msgstr "Однакова Орієн&тація" -#: graphicswin.cpp:162 +#: graphicswin.cpp:163 msgid "Lock Point Where &Dragged" msgstr "Фіксувати Точку Після &Переміщення" -#: graphicswin.cpp:164 +#: graphicswin.cpp:165 msgid "Comment" msgstr "Коментар" -#: graphicswin.cpp:166 +#: graphicswin.cpp:167 msgid "&Analyze" msgstr "&Аналізувати" -#: graphicswin.cpp:167 +#: graphicswin.cpp:168 msgid "Measure &Volume" msgstr "Обрахувати &Об'єм" -#: graphicswin.cpp:168 +#: graphicswin.cpp:169 msgid "Measure A&rea" msgstr "Обрахувати Пл&ощу" -#: graphicswin.cpp:169 +#: graphicswin.cpp:170 msgid "Measure &Perimeter" msgstr "Обрахувати &Периметр" -#: graphicswin.cpp:170 +#: graphicswin.cpp:171 msgid "Show &Interfering Parts" msgstr "Показати &Дотичні Частини" -#: graphicswin.cpp:171 +#: graphicswin.cpp:172 msgid "Show &Naked Edges" msgstr "Показати &Приховані Ребра" -#: graphicswin.cpp:172 +#: graphicswin.cpp:173 msgid "Show &Center of Mass" msgstr "" -#: graphicswin.cpp:174 +#: graphicswin.cpp:175 msgid "Show &Underconstrained Points" msgstr "" -#: graphicswin.cpp:176 +#: graphicswin.cpp:177 msgid "&Trace Point" msgstr "&Трасувати Точку" -#: graphicswin.cpp:177 +#: graphicswin.cpp:178 msgid "&Stop Tracing..." msgstr "&Зупити Трасування..." -#: graphicswin.cpp:178 +#: graphicswin.cpp:179 msgid "Step &Dimension..." msgstr "Прорахувати &Розмір..." -#: graphicswin.cpp:180 +#: graphicswin.cpp:181 msgid "&Help" msgstr "&Довідка" -#: graphicswin.cpp:181 +#: graphicswin.cpp:182 msgid "&Language" msgstr "&Мова" -#: graphicswin.cpp:182 +#: graphicswin.cpp:183 msgid "&Website / Manual" msgstr "&Вебсайт / Посібник" -#: graphicswin.cpp:184 +#: graphicswin.cpp:185 msgid "&About" msgstr "&Про програму" -#: graphicswin.cpp:352 +#: graphicswin.cpp:355 msgid "(no recent files)" msgstr "" -#: graphicswin.cpp:360 +#: graphicswin.cpp:363 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:721 +#: graphicswin.cpp:725 msgid "No workplane is active, so the grid will not appear." msgstr "" -#: graphicswin.cpp:730 +#: graphicswin.cpp:740 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -995,91 +999,91 @@ msgid "" "configuration screen. A value around 0.3 is typical." msgstr "" -#: graphicswin.cpp:809 +#: graphicswin.cpp:819 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1103 +#: graphicswin.cpp:1114 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1121 +#: graphicswin.cpp:1132 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:1144 +#: graphicswin.cpp:1155 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -#: graphicswin.cpp:1151 +#: graphicswin.cpp:1162 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:1239 +#: graphicswin.cpp:1247 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1242 +#: graphicswin.cpp:1250 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:1263 +#: graphicswin.cpp:1271 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -#: graphicswin.cpp:1274 +#: graphicswin.cpp:1282 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1275 +#: graphicswin.cpp:1283 msgid "click to place datum point" msgstr "" -#: graphicswin.cpp:1276 +#: graphicswin.cpp:1284 msgid "click first point of line segment" msgstr "" -#: graphicswin.cpp:1278 +#: graphicswin.cpp:1286 msgid "click first point of construction line segment" msgstr "" -#: graphicswin.cpp:1279 +#: graphicswin.cpp:1287 msgid "click first point of cubic segment" msgstr "" -#: graphicswin.cpp:1280 +#: graphicswin.cpp:1288 msgid "click center of circle" msgstr "" -#: graphicswin.cpp:1281 +#: graphicswin.cpp:1289 msgid "click origin of workplane" msgstr "" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1290 msgid "click one corner of rectangle" msgstr "" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1291 msgid "click top left of text" msgstr "" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1297 msgid "click top left of image" msgstr "" -#: graphicswin.cpp:1301 +#: graphicswin.cpp:1309 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1189,19 +1193,19 @@ msgstr "" msgid "(unnamed)" msgstr "" -#: groupmesh.cpp:708 +#: groupmesh.cpp:709 msgid "not closed contour, or not all same style!" msgstr "" -#: groupmesh.cpp:721 +#: groupmesh.cpp:722 msgid "points not all coplanar!" msgstr "" -#: groupmesh.cpp:723 +#: groupmesh.cpp:724 msgid "contour is self-intersecting!" msgstr "" -#: groupmesh.cpp:725 +#: groupmesh.cpp:726 msgid "zero-length edge!" msgstr "" @@ -1331,64 +1335,64 @@ msgstr "Зняти Виділення з Наведеного" msgid "Zoom to Fit" msgstr "Умістити на Екрані" -#: mouse.cpp:990 mouse.cpp:1277 +#: mouse.cpp:989 mouse.cpp:1276 msgid "click next point of line, or press Esc" msgstr "" -#: mouse.cpp:996 +#: mouse.cpp:995 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1030 +#: mouse.cpp:1029 msgid "click to place other corner of rectangle" msgstr "" -#: mouse.cpp:1050 +#: mouse.cpp:1049 msgid "click to set radius" msgstr "" -#: mouse.cpp:1055 +#: mouse.cpp:1054 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1074 +#: mouse.cpp:1073 msgid "click to place point" msgstr "" -#: mouse.cpp:1090 +#: mouse.cpp:1089 msgid "click next point of cubic, or press Esc" msgstr "" -#: mouse.cpp:1095 +#: mouse.cpp:1094 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" -#: mouse.cpp:1111 +#: mouse.cpp:1110 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1128 +#: mouse.cpp:1127 msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1134 +#: mouse.cpp:1133 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1161 +#: mouse.cpp:1160 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1473,33 +1477,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 msgid "untitled" msgstr "" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1562 +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1564 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 msgctxt "button" msgid "_Cancel" msgstr "" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 +#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 msgctxt "button" msgid "_Save" msgstr "" -#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 +#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 msgctxt "button" msgid "_Open" msgstr "" @@ -1529,74 +1533,74 @@ msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:551 +#: solvespace.cpp:557 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:553 +#: solvespace.cpp:559 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:556 +#: solvespace.cpp:562 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:559 +#: solvespace.cpp:565 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:560 +#: solvespace.cpp:566 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:562 +#: solvespace.cpp:568 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:583 +#: solvespace.cpp:589 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:590 +#: solvespace.cpp:596 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:650 +#: solvespace.cpp:658 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:718 +#: solvespace.cpp:730 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:766 +#: solvespace.cpp:778 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:770 +#: solvespace.cpp:782 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:794 +#: solvespace.cpp:806 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:810 +#: solvespace.cpp:822 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1604,7 +1608,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:819 +#: solvespace.cpp:831 #, c-format msgid "" "\n" @@ -1613,7 +1617,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:824 +#: solvespace.cpp:836 msgid "" "\n" "\n" @@ -1621,7 +1625,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:839 +#: solvespace.cpp:851 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1632,13 +1636,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:848 +#: solvespace.cpp:860 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:872 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1649,7 +1653,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:880 +#: solvespace.cpp:892 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1660,36 +1664,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:886 +#: solvespace.cpp:898 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:902 +#: solvespace.cpp:914 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:925 +#: solvespace.cpp:941 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:955 +#: solvespace.cpp:971 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:956 +#: solvespace.cpp:972 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:958 +#: solvespace.cpp:974 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:959 +#: solvespace.cpp:975 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:962 +#: solvespace.cpp:978 #, c-format msgid "" "\n" @@ -1697,7 +1701,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:966 +#: solvespace.cpp:982 #, c-format msgid "" "%s\n" @@ -1707,7 +1711,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:969 +#: solvespace.cpp:985 #, c-format msgid "" "%s\n" @@ -1717,7 +1721,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:998 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1865,30 +1869,38 @@ msgid "New group rotating active sketch" msgstr "Нова група обертання актиного креслення" #: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "" + +#: toolbar.cpp:76 msgid "New group step and repeat rotating" msgstr "Нова група крокування і повторення обертання" -#: toolbar.cpp:74 +#: toolbar.cpp:78 msgid "New group step and repeat translating" msgstr "Нова група крокування і повторення зміщення" -#: toolbar.cpp:76 +#: toolbar.cpp:80 msgid "New group in new workplane (thru given entities)" msgstr "Нова група в новій площині (через обрані об'екти)" -#: toolbar.cpp:78 +#: toolbar.cpp:82 msgid "New group in 3d" msgstr "Нова група в 3d" -#: toolbar.cpp:80 +#: toolbar.cpp:84 msgid "New group linking / assembling file" msgstr "Нова група приєднання / монтування файлу" -#: toolbar.cpp:84 +#: toolbar.cpp:88 msgid "Nearest isometric view" msgstr "Найближчий ізометричний вигляд" -#: toolbar.cpp:86 +#: toolbar.cpp:90 msgid "Align view to active workplane" msgstr "Вирівняти вигляд до активної робочої площини" diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index df48341a4..346171194 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-23 07:36+0100\n" +"POT-Creation-Date: 2021-01-15 14:51-0600\n" "PO-Revision-Date: 2020-09-28 12:42+0800\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.1\n" -#: clipboard.cpp:274 +#: clipboard.cpp:310 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,72 +27,72 @@ msgstr "" "\n" "使用\"工作平面中的草图 -+\"激活一个。" -#: clipboard.cpp:291 +#: clipboard.cpp:327 msgid "Clipboard is empty; nothing to paste." msgstr "剪贴板为空;没有要粘贴的内容。" -#: clipboard.cpp:338 +#: clipboard.cpp:374 msgid "Number of copies to paste must be at least one." msgstr "要粘贴的副本数必须至少为 1 个。" -#: clipboard.cpp:354 textscreens.cpp:783 +#: clipboard.cpp:390 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "缩放不能为零。" -#: clipboard.cpp:396 +#: clipboard.cpp:432 msgid "Select one point to define origin of rotation." msgstr "选择一个点以定义旋转原点。" -#: clipboard.cpp:408 +#: clipboard.cpp:444 msgid "Select two points to define translation vector." msgstr "选择两个点来定义转换向量。" -#: clipboard.cpp:418 +#: clipboard.cpp:454 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "转换就是标识,因此所有的复制在彼此之上。" -#: clipboard.cpp:422 +#: clipboard.cpp:458 msgid "Too many items to paste; split this into smaller pastes." msgstr "要粘贴的项目太多; 请把他们拆分。" -#: clipboard.cpp:427 +#: clipboard.cpp:463 msgid "No workplane active." msgstr "没有工作平面处于活动状态。" -#: confscreen.cpp:410 +#: confscreen.cpp:418 msgid "Bad format: specify coordinates as x, y, z" msgstr "格式错误:将坐标指定为 x、y、z" -#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "格式错误:将颜色指定为 r、g、b" -#: confscreen.cpp:446 +#: confscreen.cpp:454 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." msgstr "在启用\"视图 -= 使用透视投影\"之前,透视因子将不起作用。" -#: confscreen.cpp:459 confscreen.cpp:469 +#: confscreen.cpp:467 confscreen.cpp:477 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "在十进制之后指定 0 和 %d 数字之间。" -#: confscreen.cpp:481 +#: confscreen.cpp:489 msgid "Export scale must not be zero!" msgstr "输出比例不能为零!" -#: confscreen.cpp:493 +#: confscreen.cpp:501 msgid "Cutter radius offset must not be negative!" msgstr "刀具半径偏移不能为负数!" -#: confscreen.cpp:547 +#: confscreen.cpp:555 msgid "Bad value: autosave interval should be positive" msgstr "坏值:自动保存间隔应为正" -#: confscreen.cpp:550 +#: confscreen.cpp:558 msgid "Bad format: specify interval in integral minutes" msgstr "格式错误:以整数分钟为单位指定间隔" @@ -271,7 +271,26 @@ msgctxt "constr-name" msgid "comment" msgstr "备注" -#: constraint.cpp:171 +#: constraint.cpp:140 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "切线弧和线段必须共享一个端点。在约束切线之前,使用约束 -= 点约束它们。" + +#: constraint.cpp:158 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." +msgstr "" +"切线立方段和线段必须共享终结点。在约束切线之前,使用约束 -= 点约束它们。" + +#: constraint.cpp:183 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." +msgstr "曲线必须共享一个终结点。在约束切线之前,使用约束 -= 点约束它们。" + +#: constraint.cpp:231 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -294,7 +313,7 @@ msgstr "" " * 平面面和点(最小距离)\n" " * 圆或弧(直径)\n" -#: constraint.cpp:224 +#: constraint.cpp:284 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -313,7 +332,7 @@ msgstr "" " * 一个点和一个圆或圆(曲线上的点)\n" " * 点和平面面(点在脸上)\n" -#: constraint.cpp:286 +#: constraint.cpp:346 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -339,7 +358,7 @@ msgstr "" " * 两个圆或圆(相等半径)\n" " * 线段和圆弧(线段长度等于弧长)\n" -#: constraint.cpp:325 +#: constraint.cpp:385 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" @@ -349,7 +368,7 @@ msgstr "" "\n" "* 两个线段\n" -#: constraint.cpp:342 +#: constraint.cpp:402 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" @@ -360,7 +379,7 @@ msgstr "" "\n" "* 两个线段\n" -#: constraint.cpp:368 +#: constraint.cpp:428 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -372,7 +391,7 @@ msgstr "" "* 线段和点(点在中点)\n" " * 线段和工作平面(平面上的线中点)\n" -#: constraint.cpp:426 +#: constraint.cpp:486 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -389,19 +408,19 @@ msgstr "" " * 线段,和两个点或线段(对称的线段)\n" " * 工作平面和两个点或线段(工作平面对称)\n" -#: constraint.cpp:440 +#: constraint.cpp:500 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." msgstr "在没有显式对称平面约束对称时,工作平面必须处于活动状态。" -#: constraint.cpp:470 +#: constraint.cpp:530 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." msgstr "在应用水平或垂直约束之前,激活工作平面(使用草图 -= 在工作平面中)。" -#: constraint.cpp:483 +#: constraint.cpp:543 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -414,7 +433,7 @@ msgstr "" "• 两点\n" " • 线段\n" -#: constraint.cpp:504 +#: constraint.cpp:564 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -425,15 +444,15 @@ msgstr "" "\n" "• 两个法线\n" -#: constraint.cpp:554 +#: constraint.cpp:614 msgid "Must select an angle constraint." msgstr "必须选择角度约束。" -#: constraint.cpp:567 +#: constraint.cpp:627 msgid "Must select a constraint with associated label." msgstr "必须选择具有关联标签的约束。" -#: constraint.cpp:578 +#: constraint.cpp:638 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -447,30 +466,11 @@ msgstr "" " * 线段和法线\n" " • 两个法线\n" -#: constraint.cpp:635 -msgid "" -"The tangent arc and line segment must share an endpoint. Constrain them with " -"Constrain -> On Point before constraining tangent." -msgstr "切线弧和线段必须共享一个端点。在约束切线之前,使用约束 -= 点约束它们。" - -#: constraint.cpp:659 -msgid "" -"The tangent cubic and line segment must share an endpoint. Constrain them " -"with Constrain -> On Point before constraining tangent." -msgstr "" -"切线立方段和线段必须共享终结点。在约束切线之前,使用约束 -= 点约束它们。" - -#: constraint.cpp:669 +#: constraint.cpp:701 msgid "Curve-curve tangency must apply in workplane." msgstr "曲线曲线切线必须应用于工作平面。" -#: constraint.cpp:687 -msgid "" -"The curves must share an endpoint. Constrain them with Constrain -> On Point " -"before constraining tangent." -msgstr "曲线必须共享一个终结点。在约束切线之前,使用约束 -= 点约束它们。" - -#: constraint.cpp:696 +#: constraint.cpp:711 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -487,7 +487,7 @@ msgstr "" " * 两个法线(平行)\n" " * 共享端点的两条线段、弧线或贝塞尔(切线)\n" -#: constraint.cpp:714 +#: constraint.cpp:729 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -501,7 +501,7 @@ msgstr "" " * 线段和法线\n" " • 两个法线\n" -#: constraint.cpp:729 +#: constraint.cpp:744 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -512,7 +512,7 @@ msgstr "" "\n" "• 一点\n" -#: constraint.cpp:740 +#: constraint.cpp:755 msgid "click center of comment text" msgstr "单击注释文本的中心" @@ -606,7 +606,7 @@ msgctxt "button" msgid "&No" msgstr "否(&N)" -#: file.cpp:869 solvespace.cpp:563 +#: file.cpp:869 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "取消(&C)" @@ -772,299 +772,303 @@ msgid "Show Snap &Grid" msgstr "显示捕捉轴线 (&G)" #: graphicswin.cpp:95 +msgid "Dim Solid for Sketch Groups" +msgstr "" + +#: graphicswin.cpp:96 msgid "Use &Perspective Projection" msgstr "使用远景透视(&P)" -#: graphicswin.cpp:96 +#: graphicswin.cpp:97 msgid "Dimension &Units" msgstr "标注单位(&U)" -#: graphicswin.cpp:97 +#: graphicswin.cpp:98 msgid "Dimensions in &Millimeters" msgstr "标注单位 mm (&M)" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in M&eters" msgstr "标注单位m (&E)" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in &Inches" msgstr "标准单位英寸 (&I)" -#: graphicswin.cpp:101 +#: graphicswin.cpp:102 msgid "Show &Toolbar" msgstr "显示工具条(&T)" -#: graphicswin.cpp:102 +#: graphicswin.cpp:103 msgid "Show Property Bro&wser" msgstr "显示属性浏览器(&W)" -#: graphicswin.cpp:104 +#: graphicswin.cpp:105 msgid "&Full Screen" msgstr "全屏(&F)" -#: graphicswin.cpp:106 +#: graphicswin.cpp:107 msgid "&New Group" msgstr "新组合(&N)" -#: graphicswin.cpp:107 +#: graphicswin.cpp:108 msgid "Sketch In &3d" msgstr "在三维内绘制(&3)" -#: graphicswin.cpp:108 +#: graphicswin.cpp:109 msgid "Sketch In New &Workplane" msgstr "在新工作面绘制(&W)" -#: graphicswin.cpp:110 +#: graphicswin.cpp:111 msgid "Step &Translating" msgstr "移动(&T)" -#: graphicswin.cpp:111 +#: graphicswin.cpp:112 msgid "Step &Rotating" msgstr "旋转(&R)" -#: graphicswin.cpp:113 +#: graphicswin.cpp:114 msgid "E&xtrude" msgstr "挤出(&E)" -#: graphicswin.cpp:114 +#: graphicswin.cpp:115 msgid "&Helix" msgstr "螺旋(&H)" -#: graphicswin.cpp:115 +#: graphicswin.cpp:116 msgid "&Lathe" msgstr "扫略(&L)" -#: graphicswin.cpp:116 +#: graphicswin.cpp:117 msgid "Re&volve" msgstr "旋转(&V)" -#: graphicswin.cpp:118 +#: graphicswin.cpp:119 msgid "Link / Assemble..." msgstr "链接/装配..." -#: graphicswin.cpp:119 +#: graphicswin.cpp:120 msgid "Link Recent" msgstr "连接最近文件" -#: graphicswin.cpp:121 +#: graphicswin.cpp:122 msgid "&Sketch" msgstr "绘图(&S)" -#: graphicswin.cpp:122 +#: graphicswin.cpp:123 msgid "In &Workplane" msgstr "在工作平面(&W)" -#: graphicswin.cpp:123 +#: graphicswin.cpp:124 msgid "Anywhere In &3d" msgstr "在3D的任何位置(&3)" -#: graphicswin.cpp:125 +#: graphicswin.cpp:126 msgid "Datum &Point" msgstr "基准点(&P)" -#: graphicswin.cpp:126 +#: graphicswin.cpp:127 msgid "&Workplane" msgstr "工作面(&W)" -#: graphicswin.cpp:128 +#: graphicswin.cpp:129 msgid "Line &Segment" msgstr "线段(&S)" -#: graphicswin.cpp:129 +#: graphicswin.cpp:130 msgid "C&onstruction Line Segment" msgstr "构造线段(&C)" -#: graphicswin.cpp:130 +#: graphicswin.cpp:131 msgid "&Rectangle" msgstr "矩形(&R)" -#: graphicswin.cpp:131 +#: graphicswin.cpp:132 msgid "&Circle" msgstr "圆线(&C)" -#: graphicswin.cpp:132 +#: graphicswin.cpp:133 msgid "&Arc of a Circle" msgstr "圆弧(&A)" -#: graphicswin.cpp:133 +#: graphicswin.cpp:134 msgid "&Bezier Cubic Spline" msgstr "立方体线的贝塞尔曲线(&B)" -#: graphicswin.cpp:135 +#: graphicswin.cpp:136 msgid "&Text in TrueType Font" msgstr "TrueTyoe字体文字(&T)" -#: graphicswin.cpp:136 +#: graphicswin.cpp:137 msgid "&Image" msgstr "图片(&I)" -#: graphicswin.cpp:138 +#: graphicswin.cpp:139 msgid "To&ggle Construction" msgstr "切换构造(&G)" -#: graphicswin.cpp:139 +#: graphicswin.cpp:140 msgid "Tangent &Arc at Point" msgstr "弧线切线点(&A)" -#: graphicswin.cpp:140 +#: graphicswin.cpp:141 msgid "Split Curves at &Intersection" msgstr "在交叉处拆分曲线(&I)" -#: graphicswin.cpp:142 +#: graphicswin.cpp:143 msgid "&Constrain" msgstr "约束(&C)" -#: graphicswin.cpp:143 +#: graphicswin.cpp:144 msgid "&Distance / Diameter" msgstr "距离/直径(&D)" -#: graphicswin.cpp:144 +#: graphicswin.cpp:145 msgid "Re&ference Dimension" msgstr "参考标注(&F)" -#: graphicswin.cpp:145 +#: graphicswin.cpp:146 msgid "A&ngle" msgstr "角度(&A)" -#: graphicswin.cpp:146 +#: graphicswin.cpp:147 msgid "Reference An&gle" msgstr "参考角度(&G)" -#: graphicswin.cpp:147 +#: graphicswin.cpp:148 msgid "Other S&upplementary Angle" msgstr "其它增补角度(&U)" -#: graphicswin.cpp:148 +#: graphicswin.cpp:149 msgid "Toggle R&eference Dim" msgstr "切换参考标注(&E)" -#: graphicswin.cpp:150 +#: graphicswin.cpp:151 msgid "&Horizontal" msgstr "水平约束(&H)" -#: graphicswin.cpp:151 +#: graphicswin.cpp:152 msgid "&Vertical" msgstr "垂直约束(&V)" -#: graphicswin.cpp:153 +#: graphicswin.cpp:154 msgid "&On Point / Curve / Plane" msgstr "在点线面(&O)" -#: graphicswin.cpp:154 +#: graphicswin.cpp:155 msgid "E&qual Length / Radius / Angle" msgstr "等于/长度/半径/角度(&Q)" -#: graphicswin.cpp:155 +#: graphicswin.cpp:156 msgid "Length Ra&tio" msgstr "长度比例(&T)" -#: graphicswin.cpp:156 +#: graphicswin.cpp:157 msgid "Length Diff&erence" msgstr "长度偏差(&E)" -#: graphicswin.cpp:157 +#: graphicswin.cpp:158 msgid "At &Midpoint" msgstr "在中点(&M)" -#: graphicswin.cpp:158 +#: graphicswin.cpp:159 msgid "S&ymmetric" msgstr "对称(&Y)" -#: graphicswin.cpp:159 +#: graphicswin.cpp:160 msgid "Para&llel / Tangent" msgstr "水平/切线(&L)" -#: graphicswin.cpp:160 +#: graphicswin.cpp:161 msgid "&Perpendicular" msgstr "垂直的(&P)" -#: graphicswin.cpp:161 +#: graphicswin.cpp:162 msgid "Same Orient&ation" msgstr "相同方向(&A)" -#: graphicswin.cpp:162 +#: graphicswin.cpp:163 msgid "Lock Point Where &Dragged" msgstr "锁定点位置(&D)" -#: graphicswin.cpp:164 +#: graphicswin.cpp:165 msgid "Comment" msgstr "备注" -#: graphicswin.cpp:166 +#: graphicswin.cpp:167 msgid "&Analyze" msgstr "分析(&A)" -#: graphicswin.cpp:167 +#: graphicswin.cpp:168 msgid "Measure &Volume" msgstr "测量体积(&V)" -#: graphicswin.cpp:168 +#: graphicswin.cpp:169 msgid "Measure A&rea" msgstr "测量面积(&R)" -#: graphicswin.cpp:169 +#: graphicswin.cpp:170 msgid "Measure &Perimeter" msgstr "测量周长(&P)" -#: graphicswin.cpp:170 +#: graphicswin.cpp:171 msgid "Show &Interfering Parts" msgstr "显示干涉零件(&I)" -#: graphicswin.cpp:171 +#: graphicswin.cpp:172 msgid "Show &Naked Edges" msgstr "显示孤立边(&N)" -#: graphicswin.cpp:172 +#: graphicswin.cpp:173 msgid "Show &Center of Mass" msgstr "显示中心(&C)" -#: graphicswin.cpp:174 +#: graphicswin.cpp:175 msgid "Show &Underconstrained Points" msgstr "显示无效约束点(&U)" -#: graphicswin.cpp:176 +#: graphicswin.cpp:177 msgid "&Trace Point" msgstr "跟踪点(&T)" -#: graphicswin.cpp:177 +#: graphicswin.cpp:178 msgid "&Stop Tracing..." msgstr "停止跟踪(&S)" -#: graphicswin.cpp:178 +#: graphicswin.cpp:179 msgid "Step &Dimension..." msgstr "逐步标注(&D)" -#: graphicswin.cpp:180 +#: graphicswin.cpp:181 msgid "&Help" msgstr "帮助(&H)" -#: graphicswin.cpp:181 +#: graphicswin.cpp:182 msgid "&Language" msgstr "语言(&L)" -#: graphicswin.cpp:182 +#: graphicswin.cpp:183 msgid "&Website / Manual" msgstr "网页/手册(&W)" -#: graphicswin.cpp:184 +#: graphicswin.cpp:185 msgid "&About" msgstr "关于(&A)" -#: graphicswin.cpp:352 +#: graphicswin.cpp:355 msgid "(no recent files)" msgstr "(无文件)" -#: graphicswin.cpp:360 +#: graphicswin.cpp:363 #, c-format msgid "File '%s' does not exist." msgstr "文件不存在: \"%s\"。" -#: graphicswin.cpp:721 +#: graphicswin.cpp:725 msgid "No workplane is active, so the grid will not appear." msgstr "没有激活的工作面,因此无法显示轴网。" -#: graphicswin.cpp:730 +#: graphicswin.cpp:740 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1073,91 +1077,91 @@ msgid "" "configuration screen. A value around 0.3 is typical." msgstr "" -#: graphicswin.cpp:809 +#: graphicswin.cpp:819 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1103 +#: graphicswin.cpp:1114 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1121 +#: graphicswin.cpp:1132 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:1144 +#: graphicswin.cpp:1155 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -#: graphicswin.cpp:1151 +#: graphicswin.cpp:1162 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:1239 +#: graphicswin.cpp:1247 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1242 +#: graphicswin.cpp:1250 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:1263 +#: graphicswin.cpp:1271 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -#: graphicswin.cpp:1274 +#: graphicswin.cpp:1282 msgid "click point on arc (draws anti-clockwise)" msgstr "点击弧线的点(逆时针方向绘制)" -#: graphicswin.cpp:1275 +#: graphicswin.cpp:1283 msgid "click to place datum point" msgstr "点击放置基准点" -#: graphicswin.cpp:1276 +#: graphicswin.cpp:1284 msgid "click first point of line segment" msgstr "点击线条的起点" -#: graphicswin.cpp:1278 +#: graphicswin.cpp:1286 msgid "click first point of construction line segment" msgstr "点击构造线的起点" -#: graphicswin.cpp:1279 +#: graphicswin.cpp:1287 msgid "click first point of cubic segment" msgstr "点击立方体的起点" -#: graphicswin.cpp:1280 +#: graphicswin.cpp:1288 msgid "click center of circle" msgstr "点击圆弧的中心" -#: graphicswin.cpp:1281 +#: graphicswin.cpp:1289 msgid "click origin of workplane" msgstr "点击工作面的原点" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1290 msgid "click one corner of rectangle" msgstr "点击一个矩形倒角" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1291 msgid "click top left of text" msgstr "点击文字左上角" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1297 msgid "click top left of image" msgstr "点击图片左上角" -#: graphicswin.cpp:1301 +#: graphicswin.cpp:1309 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1276,19 +1280,19 @@ msgstr "移动" msgid "(unnamed)" msgstr "(未命名)" -#: groupmesh.cpp:708 +#: groupmesh.cpp:709 msgid "not closed contour, or not all same style!" msgstr "未闭合轮廓,或样式不一致!" -#: groupmesh.cpp:721 +#: groupmesh.cpp:722 msgid "points not all coplanar!" msgstr "点不在相同平面!" -#: groupmesh.cpp:723 +#: groupmesh.cpp:724 msgid "contour is self-intersecting!" msgstr "轮廓自相交!" -#: groupmesh.cpp:725 +#: groupmesh.cpp:726 msgid "zero-length edge!" msgstr "边缘长度为零!" @@ -1418,64 +1422,64 @@ msgstr "取消覆盖区域的全选" msgid "Zoom to Fit" msgstr "自动缩放" -#: mouse.cpp:990 mouse.cpp:1277 +#: mouse.cpp:989 mouse.cpp:1276 msgid "click next point of line, or press Esc" msgstr "点击下一个点或取消(ESC)" -#: mouse.cpp:996 +#: mouse.cpp:995 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在3D内绘制矩形; 首先,激活工作面,草图->在工作面。" -#: mouse.cpp:1030 +#: mouse.cpp:1029 msgid "click to place other corner of rectangle" msgstr "点击放置其它矩形倒角" -#: mouse.cpp:1050 +#: mouse.cpp:1049 msgid "click to set radius" msgstr "点击设置半径" -#: mouse.cpp:1055 +#: mouse.cpp:1054 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在3D空间内绘制弧线,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1074 +#: mouse.cpp:1073 msgid "click to place point" msgstr "点击放置点" -#: mouse.cpp:1090 +#: mouse.cpp:1089 msgid "click next point of cubic, or press Esc" msgstr "点击下一个点或取消(ESC)" -#: mouse.cpp:1095 +#: mouse.cpp:1094 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "已经在工作面绘制;在新建工作面前在三维空间绘制。" -#: mouse.cpp:1111 +#: mouse.cpp:1110 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在三维空间内绘制文字,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1128 +#: mouse.cpp:1127 msgid "click to place bottom right of text" msgstr "点击文字的右下角放置" -#: mouse.cpp:1134 +#: mouse.cpp:1133 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1161 +#: mouse.cpp:1160 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "新备注 - 双击编辑" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace模型" @@ -1560,33 +1564,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "逗号分隔数据" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 msgid "untitled" msgstr "未命名" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1562 +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "保存文件" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1564 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "打开文件" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 msgctxt "button" msgid "_Cancel" msgstr "取消_C" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 +#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 msgctxt "button" msgid "_Save" msgstr "保存_S" -#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 +#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 msgctxt "button" msgid "_Open" msgstr "打开_O" @@ -1616,74 +1620,74 @@ msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:551 +#: solvespace.cpp:557 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:553 +#: solvespace.cpp:559 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:556 +#: solvespace.cpp:562 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:559 +#: solvespace.cpp:565 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:560 +#: solvespace.cpp:566 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:562 +#: solvespace.cpp:568 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:583 +#: solvespace.cpp:589 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:590 +#: solvespace.cpp:596 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:650 +#: solvespace.cpp:658 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:718 +#: solvespace.cpp:730 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:766 +#: solvespace.cpp:778 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:770 +#: solvespace.cpp:782 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:794 +#: solvespace.cpp:806 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:810 +#: solvespace.cpp:822 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1691,7 +1695,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:819 +#: solvespace.cpp:831 #, c-format msgid "" "\n" @@ -1700,7 +1704,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:824 +#: solvespace.cpp:836 msgid "" "\n" "\n" @@ -1708,7 +1712,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:839 +#: solvespace.cpp:851 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1719,13 +1723,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:848 +#: solvespace.cpp:860 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:872 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1736,7 +1740,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:880 +#: solvespace.cpp:892 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1747,36 +1751,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:886 +#: solvespace.cpp:898 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:902 +#: solvespace.cpp:914 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:925 +#: solvespace.cpp:941 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:955 +#: solvespace.cpp:971 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:956 +#: solvespace.cpp:972 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:958 +#: solvespace.cpp:974 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:959 +#: solvespace.cpp:975 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:962 +#: solvespace.cpp:978 #, c-format msgid "" "\n" @@ -1784,7 +1788,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:966 +#: solvespace.cpp:982 #, c-format msgid "" "%s\n" @@ -1794,7 +1798,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:969 +#: solvespace.cpp:985 #, c-format msgid "" "%s\n" @@ -1804,7 +1808,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:998 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1952,30 +1956,38 @@ msgid "New group rotating active sketch" msgstr "新组中旋转体当前草图" #: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "" + +#: toolbar.cpp:76 msgid "New group step and repeat rotating" msgstr "新组中逐步重复旋转体" -#: toolbar.cpp:74 +#: toolbar.cpp:78 msgid "New group step and repeat translating" msgstr "新组中逐步重复移动体" -#: toolbar.cpp:76 +#: toolbar.cpp:80 msgid "New group in new workplane (thru given entities)" msgstr "在新工作平面创建组(通过指定对象)" -#: toolbar.cpp:78 +#: toolbar.cpp:82 msgid "New group in 3d" msgstr "在3D中新建组" -#: toolbar.cpp:80 +#: toolbar.cpp:84 msgid "New group linking / assembling file" msgstr "新组 连接/装配文件" -#: toolbar.cpp:84 +#: toolbar.cpp:88 msgid "Nearest isometric view" msgstr "ISO视图" -#: toolbar.cpp:86 +#: toolbar.cpp:90 msgid "Align view to active workplane" msgstr "切换视图至当前工作面" diff --git a/res/messages.pot b/res/messages.pot index 5a6ef3651..33af7b262 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2020-11-23 07:36+0100\n" +"POT-Creation-Date: 2021-01-15 14:51-0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,76 +17,76 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: clipboard.cpp:274 +#: clipboard.cpp:310 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" "Activate one with Sketch -> In Workplane." msgstr "" -#: clipboard.cpp:291 +#: clipboard.cpp:327 msgid "Clipboard is empty; nothing to paste." msgstr "" -#: clipboard.cpp:338 +#: clipboard.cpp:374 msgid "Number of copies to paste must be at least one." msgstr "" -#: clipboard.cpp:354 textscreens.cpp:783 +#: clipboard.cpp:390 textscreens.cpp:783 msgid "Scale cannot be zero." msgstr "" -#: clipboard.cpp:396 +#: clipboard.cpp:432 msgid "Select one point to define origin of rotation." msgstr "" -#: clipboard.cpp:408 +#: clipboard.cpp:444 msgid "Select two points to define translation vector." msgstr "" -#: clipboard.cpp:418 +#: clipboard.cpp:454 msgid "Transformation is identity. So all copies will be exactly on top of each other." msgstr "" -#: clipboard.cpp:422 +#: clipboard.cpp:458 msgid "Too many items to paste; split this into smaller pastes." msgstr "" -#: clipboard.cpp:427 +#: clipboard.cpp:463 msgid "No workplane active." msgstr "" -#: confscreen.cpp:410 +#: confscreen.cpp:418 msgid "Bad format: specify coordinates as x, y, z" msgstr "" -#: confscreen.cpp:420 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" msgstr "" -#: confscreen.cpp:446 +#: confscreen.cpp:454 msgid "" "The perspective factor will have no effect until you enable View -> Use Perspective Projection." msgstr "" -#: confscreen.cpp:459 confscreen.cpp:469 +#: confscreen.cpp:467 confscreen.cpp:477 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:481 +#: confscreen.cpp:489 msgid "Export scale must not be zero!" msgstr "" -#: confscreen.cpp:493 +#: confscreen.cpp:501 msgid "Cutter radius offset must not be negative!" msgstr "" -#: confscreen.cpp:547 +#: confscreen.cpp:555 msgid "Bad value: autosave interval should be positive" msgstr "" -#: confscreen.cpp:550 +#: confscreen.cpp:558 msgid "Bad format: specify interval in integral minutes" msgstr "" @@ -265,7 +265,25 @@ msgctxt "constr-name" msgid "comment" msgstr "" -#: constraint.cpp:171 +#: constraint.cpp:140 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with Constrain -> On " +"Point before constraining tangent." +msgstr "" + +#: constraint.cpp:158 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them with Constrain -> On " +"Point before constraining tangent." +msgstr "" + +#: constraint.cpp:183 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point before constraining " +"tangent." +msgstr "" + +#: constraint.cpp:231 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply to:\n" "\n" @@ -278,7 +296,7 @@ msgid "" " * a circle or an arc (diameter)\n" msgstr "" -#: constraint.cpp:224 +#: constraint.cpp:284 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can apply to:\n" "\n" @@ -289,7 +307,7 @@ msgid "" " * a point and a plane face (point on face)\n" msgstr "" -#: constraint.cpp:286 +#: constraint.cpp:346 msgid "" "Bad selection for equal length / radius constraint. This constraint can apply to:\n" "\n" @@ -303,21 +321,21 @@ msgid "" " * a line segment and an arc (line segment length equals arc length)\n" msgstr "" -#: constraint.cpp:325 +#: constraint.cpp:385 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" msgstr "" -#: constraint.cpp:342 +#: constraint.cpp:402 msgid "" "Bad selection for length difference constraint. This constraint can apply to:\n" "\n" " * two line segments\n" msgstr "" -#: constraint.cpp:368 +#: constraint.cpp:428 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -325,7 +343,7 @@ msgid "" " * a line segment and a workplane (line's midpoint on plane)\n" msgstr "" -#: constraint.cpp:426 +#: constraint.cpp:486 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -334,17 +352,17 @@ msgid "" " * workplane, and two points or a line segment (symmetric about workplane)\n" msgstr "" -#: constraint.cpp:440 +#: constraint.cpp:500 msgid "A workplane must be active when constraining symmetric without an explicit symmetry plane." msgstr "" -#: constraint.cpp:470 +#: constraint.cpp:530 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a horizontal or vertical " "constraint." msgstr "" -#: constraint.cpp:483 +#: constraint.cpp:543 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can apply to:\n" "\n" @@ -352,22 +370,22 @@ msgid "" " * a line segment\n" msgstr "" -#: constraint.cpp:504 +#: constraint.cpp:564 msgid "" "Bad selection for same orientation constraint. This constraint can apply to:\n" "\n" " * two normals\n" msgstr "" -#: constraint.cpp:554 +#: constraint.cpp:614 msgid "Must select an angle constraint." msgstr "" -#: constraint.cpp:567 +#: constraint.cpp:627 msgid "Must select a constraint with associated label." msgstr "" -#: constraint.cpp:578 +#: constraint.cpp:638 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -376,29 +394,11 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:635 -msgid "" -"The tangent arc and line segment must share an endpoint. Constrain them with Constrain -> On " -"Point before constraining tangent." -msgstr "" - -#: constraint.cpp:659 -msgid "" -"The tangent cubic and line segment must share an endpoint. Constrain them with Constrain -> On " -"Point before constraining tangent." -msgstr "" - -#: constraint.cpp:669 +#: constraint.cpp:701 msgid "Curve-curve tangency must apply in workplane." msgstr "" -#: constraint.cpp:687 -msgid "" -"The curves must share an endpoint. Constrain them with Constrain -> On Point before constraining " -"tangent." -msgstr "" - -#: constraint.cpp:696 +#: constraint.cpp:711 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply to:\n" "\n" @@ -408,7 +408,7 @@ msgid "" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" -#: constraint.cpp:714 +#: constraint.cpp:729 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -417,14 +417,14 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:729 +#: constraint.cpp:744 msgid "" "Bad selection for lock point where dragged constraint. This constraint can apply to:\n" "\n" " * a point\n" msgstr "" -#: constraint.cpp:740 +#: constraint.cpp:755 msgid "click center of comment text" msgstr "" @@ -506,7 +506,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 solvespace.cpp:563 +#: file.cpp:869 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "" @@ -672,299 +672,303 @@ msgid "Show Snap &Grid" msgstr "" #: graphicswin.cpp:95 -msgid "Use &Perspective Projection" +msgid "Dim Solid for Sketch Groups" msgstr "" #: graphicswin.cpp:96 -msgid "Dimension &Units" +msgid "Use &Perspective Projection" msgstr "" #: graphicswin.cpp:97 -msgid "Dimensions in &Millimeters" +msgid "Dimension &Units" msgstr "" #: graphicswin.cpp:98 -msgid "Dimensions in M&eters" +msgid "Dimensions in &Millimeters" msgstr "" #: graphicswin.cpp:99 +msgid "Dimensions in M&eters" +msgstr "" + +#: graphicswin.cpp:100 msgid "Dimensions in &Inches" msgstr "" -#: graphicswin.cpp:101 +#: graphicswin.cpp:102 msgid "Show &Toolbar" msgstr "" -#: graphicswin.cpp:102 +#: graphicswin.cpp:103 msgid "Show Property Bro&wser" msgstr "" -#: graphicswin.cpp:104 +#: graphicswin.cpp:105 msgid "&Full Screen" msgstr "" -#: graphicswin.cpp:106 +#: graphicswin.cpp:107 msgid "&New Group" msgstr "" -#: graphicswin.cpp:107 +#: graphicswin.cpp:108 msgid "Sketch In &3d" msgstr "" -#: graphicswin.cpp:108 +#: graphicswin.cpp:109 msgid "Sketch In New &Workplane" msgstr "" -#: graphicswin.cpp:110 +#: graphicswin.cpp:111 msgid "Step &Translating" msgstr "" -#: graphicswin.cpp:111 +#: graphicswin.cpp:112 msgid "Step &Rotating" msgstr "" -#: graphicswin.cpp:113 +#: graphicswin.cpp:114 msgid "E&xtrude" msgstr "" -#: graphicswin.cpp:114 +#: graphicswin.cpp:115 msgid "&Helix" msgstr "" -#: graphicswin.cpp:115 +#: graphicswin.cpp:116 msgid "&Lathe" msgstr "" -#: graphicswin.cpp:116 +#: graphicswin.cpp:117 msgid "Re&volve" msgstr "" -#: graphicswin.cpp:118 +#: graphicswin.cpp:119 msgid "Link / Assemble..." msgstr "" -#: graphicswin.cpp:119 +#: graphicswin.cpp:120 msgid "Link Recent" msgstr "" -#: graphicswin.cpp:121 +#: graphicswin.cpp:122 msgid "&Sketch" msgstr "" -#: graphicswin.cpp:122 +#: graphicswin.cpp:123 msgid "In &Workplane" msgstr "" -#: graphicswin.cpp:123 +#: graphicswin.cpp:124 msgid "Anywhere In &3d" msgstr "" -#: graphicswin.cpp:125 +#: graphicswin.cpp:126 msgid "Datum &Point" msgstr "" -#: graphicswin.cpp:126 +#: graphicswin.cpp:127 msgid "&Workplane" msgstr "" -#: graphicswin.cpp:128 +#: graphicswin.cpp:129 msgid "Line &Segment" msgstr "" -#: graphicswin.cpp:129 +#: graphicswin.cpp:130 msgid "C&onstruction Line Segment" msgstr "" -#: graphicswin.cpp:130 +#: graphicswin.cpp:131 msgid "&Rectangle" msgstr "" -#: graphicswin.cpp:131 +#: graphicswin.cpp:132 msgid "&Circle" msgstr "" -#: graphicswin.cpp:132 +#: graphicswin.cpp:133 msgid "&Arc of a Circle" msgstr "" -#: graphicswin.cpp:133 +#: graphicswin.cpp:134 msgid "&Bezier Cubic Spline" msgstr "" -#: graphicswin.cpp:135 +#: graphicswin.cpp:136 msgid "&Text in TrueType Font" msgstr "" -#: graphicswin.cpp:136 +#: graphicswin.cpp:137 msgid "&Image" msgstr "" -#: graphicswin.cpp:138 +#: graphicswin.cpp:139 msgid "To&ggle Construction" msgstr "" -#: graphicswin.cpp:139 +#: graphicswin.cpp:140 msgid "Tangent &Arc at Point" msgstr "" -#: graphicswin.cpp:140 +#: graphicswin.cpp:141 msgid "Split Curves at &Intersection" msgstr "" -#: graphicswin.cpp:142 +#: graphicswin.cpp:143 msgid "&Constrain" msgstr "" -#: graphicswin.cpp:143 +#: graphicswin.cpp:144 msgid "&Distance / Diameter" msgstr "" -#: graphicswin.cpp:144 +#: graphicswin.cpp:145 msgid "Re&ference Dimension" msgstr "" -#: graphicswin.cpp:145 +#: graphicswin.cpp:146 msgid "A&ngle" msgstr "" -#: graphicswin.cpp:146 +#: graphicswin.cpp:147 msgid "Reference An&gle" msgstr "" -#: graphicswin.cpp:147 +#: graphicswin.cpp:148 msgid "Other S&upplementary Angle" msgstr "" -#: graphicswin.cpp:148 +#: graphicswin.cpp:149 msgid "Toggle R&eference Dim" msgstr "" -#: graphicswin.cpp:150 +#: graphicswin.cpp:151 msgid "&Horizontal" msgstr "" -#: graphicswin.cpp:151 +#: graphicswin.cpp:152 msgid "&Vertical" msgstr "" -#: graphicswin.cpp:153 +#: graphicswin.cpp:154 msgid "&On Point / Curve / Plane" msgstr "" -#: graphicswin.cpp:154 +#: graphicswin.cpp:155 msgid "E&qual Length / Radius / Angle" msgstr "" -#: graphicswin.cpp:155 +#: graphicswin.cpp:156 msgid "Length Ra&tio" msgstr "" -#: graphicswin.cpp:156 +#: graphicswin.cpp:157 msgid "Length Diff&erence" msgstr "" -#: graphicswin.cpp:157 +#: graphicswin.cpp:158 msgid "At &Midpoint" msgstr "" -#: graphicswin.cpp:158 +#: graphicswin.cpp:159 msgid "S&ymmetric" msgstr "" -#: graphicswin.cpp:159 +#: graphicswin.cpp:160 msgid "Para&llel / Tangent" msgstr "" -#: graphicswin.cpp:160 +#: graphicswin.cpp:161 msgid "&Perpendicular" msgstr "" -#: graphicswin.cpp:161 +#: graphicswin.cpp:162 msgid "Same Orient&ation" msgstr "" -#: graphicswin.cpp:162 +#: graphicswin.cpp:163 msgid "Lock Point Where &Dragged" msgstr "" -#: graphicswin.cpp:164 +#: graphicswin.cpp:165 msgid "Comment" msgstr "" -#: graphicswin.cpp:166 +#: graphicswin.cpp:167 msgid "&Analyze" msgstr "" -#: graphicswin.cpp:167 +#: graphicswin.cpp:168 msgid "Measure &Volume" msgstr "" -#: graphicswin.cpp:168 +#: graphicswin.cpp:169 msgid "Measure A&rea" msgstr "" -#: graphicswin.cpp:169 +#: graphicswin.cpp:170 msgid "Measure &Perimeter" msgstr "" -#: graphicswin.cpp:170 +#: graphicswin.cpp:171 msgid "Show &Interfering Parts" msgstr "" -#: graphicswin.cpp:171 +#: graphicswin.cpp:172 msgid "Show &Naked Edges" msgstr "" -#: graphicswin.cpp:172 +#: graphicswin.cpp:173 msgid "Show &Center of Mass" msgstr "" -#: graphicswin.cpp:174 +#: graphicswin.cpp:175 msgid "Show &Underconstrained Points" msgstr "" -#: graphicswin.cpp:176 +#: graphicswin.cpp:177 msgid "&Trace Point" msgstr "" -#: graphicswin.cpp:177 +#: graphicswin.cpp:178 msgid "&Stop Tracing..." msgstr "" -#: graphicswin.cpp:178 +#: graphicswin.cpp:179 msgid "Step &Dimension..." msgstr "" -#: graphicswin.cpp:180 +#: graphicswin.cpp:181 msgid "&Help" msgstr "" -#: graphicswin.cpp:181 +#: graphicswin.cpp:182 msgid "&Language" msgstr "" -#: graphicswin.cpp:182 +#: graphicswin.cpp:183 msgid "&Website / Manual" msgstr "" -#: graphicswin.cpp:184 +#: graphicswin.cpp:185 msgid "&About" msgstr "" -#: graphicswin.cpp:352 +#: graphicswin.cpp:355 msgid "(no recent files)" msgstr "" -#: graphicswin.cpp:360 +#: graphicswin.cpp:363 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:721 +#: graphicswin.cpp:725 msgid "No workplane is active, so the grid will not appear." msgstr "" -#: graphicswin.cpp:730 +#: graphicswin.cpp:740 msgid "" "The perspective factor is set to zero, so the view will always be a parallel projection.\n" "\n" @@ -972,89 +976,89 @@ msgid "" "around 0.3 is typical." msgstr "" -#: graphicswin.cpp:809 +#: graphicswin.cpp:819 msgid "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1103 +#: graphicswin.cpp:1114 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1121 +#: graphicswin.cpp:1132 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:1144 +#: graphicswin.cpp:1155 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) to define the plane " "for the snap grid." msgstr "" -#: graphicswin.cpp:1151 +#: graphicswin.cpp:1162 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:1239 +#: graphicswin.cpp:1247 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1242 +#: graphicswin.cpp:1250 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:1263 +#: graphicswin.cpp:1271 msgid "" "Bad selection for tangent arc at point. Select a single point, or select nothing to set up arc " "parameters." msgstr "" -#: graphicswin.cpp:1274 +#: graphicswin.cpp:1282 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1275 +#: graphicswin.cpp:1283 msgid "click to place datum point" msgstr "" -#: graphicswin.cpp:1276 +#: graphicswin.cpp:1284 msgid "click first point of line segment" msgstr "" -#: graphicswin.cpp:1278 +#: graphicswin.cpp:1286 msgid "click first point of construction line segment" msgstr "" -#: graphicswin.cpp:1279 +#: graphicswin.cpp:1287 msgid "click first point of cubic segment" msgstr "" -#: graphicswin.cpp:1280 +#: graphicswin.cpp:1288 msgid "click center of circle" msgstr "" -#: graphicswin.cpp:1281 +#: graphicswin.cpp:1289 msgid "click origin of workplane" msgstr "" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1290 msgid "click one corner of rectangle" msgstr "" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1291 msgid "click top left of text" msgstr "" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1297 msgid "click top left of image" msgstr "" -#: graphicswin.cpp:1301 +#: graphicswin.cpp:1309 msgid "No entities are selected. Select entities before trying to toggle their construction state." msgstr "" @@ -1160,19 +1164,19 @@ msgstr "" msgid "(unnamed)" msgstr "" -#: groupmesh.cpp:708 +#: groupmesh.cpp:709 msgid "not closed contour, or not all same style!" msgstr "" -#: groupmesh.cpp:721 +#: groupmesh.cpp:722 msgid "points not all coplanar!" msgstr "" -#: groupmesh.cpp:723 +#: groupmesh.cpp:724 msgid "contour is self-intersecting!" msgstr "" -#: groupmesh.cpp:725 +#: groupmesh.cpp:726 msgid "zero-length edge!" msgstr "" @@ -1302,55 +1306,55 @@ msgstr "" msgid "Zoom to Fit" msgstr "" -#: mouse.cpp:990 mouse.cpp:1277 +#: mouse.cpp:989 mouse.cpp:1276 msgid "click next point of line, or press Esc" msgstr "" -#: mouse.cpp:996 +#: mouse.cpp:995 msgid "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1030 +#: mouse.cpp:1029 msgid "click to place other corner of rectangle" msgstr "" -#: mouse.cpp:1050 +#: mouse.cpp:1049 msgid "click to set radius" msgstr "" -#: mouse.cpp:1055 +#: mouse.cpp:1054 msgid "Can't draw arc in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1074 +#: mouse.cpp:1073 msgid "click to place point" msgstr "" -#: mouse.cpp:1090 +#: mouse.cpp:1089 msgid "click next point of cubic, or press Esc" msgstr "" -#: mouse.cpp:1095 +#: mouse.cpp:1094 msgid "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" -#: mouse.cpp:1111 +#: mouse.cpp:1110 msgid "Can't draw text in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1128 +#: mouse.cpp:1127 msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1134 +#: mouse.cpp:1133 msgid "Can't draw image in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1161 +#: mouse.cpp:1160 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:505 +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1435,33 +1439,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1317 platform/guimac.mm:1360 platform/guiwin.cpp:1615 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 msgid "untitled" msgstr "" -#: platform/guigtk.cpp:1328 platform/guigtk.cpp:1361 platform/guimac.mm:1318 -#: platform/guiwin.cpp:1562 +#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1568 msgctxt "title" msgid "Save File" msgstr "" -#: platform/guigtk.cpp:1329 platform/guigtk.cpp:1362 platform/guimac.mm:1301 -#: platform/guiwin.cpp:1564 +#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1570 msgctxt "title" msgid "Open File" msgstr "" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1368 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 msgctxt "button" msgid "_Cancel" msgstr "" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 +#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 msgctxt "button" msgid "_Save" msgstr "" -#: platform/guigtk.cpp:1334 platform/guigtk.cpp:1367 +#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 msgctxt "button" msgid "_Open" msgstr "" @@ -1491,71 +1495,71 @@ msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:551 +#: solvespace.cpp:557 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:553 +#: solvespace.cpp:559 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:556 +#: solvespace.cpp:562 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:559 +#: solvespace.cpp:565 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:560 +#: solvespace.cpp:566 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:562 +#: solvespace.cpp:568 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:583 +#: solvespace.cpp:589 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:590 +#: solvespace.cpp:596 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:650 +#: solvespace.cpp:658 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:718 +#: solvespace.cpp:730 #, c-format msgid "Can't identify file type from file extension of filename '%s'; try .dxf or .dwg." msgstr "" -#: solvespace.cpp:766 +#: solvespace.cpp:778 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:770 +#: solvespace.cpp:782 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:794 +#: solvespace.cpp:806 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:810 +#: solvespace.cpp:822 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1563,7 +1567,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:819 +#: solvespace.cpp:831 #, c-format msgid "" "\n" @@ -1572,7 +1576,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:824 +#: solvespace.cpp:836 msgid "" "\n" "\n" @@ -1580,7 +1584,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:839 +#: solvespace.cpp:851 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1591,13 +1595,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:848 +#: solvespace.cpp:860 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, not coplanar, or self-" "intersecting." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:872 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1608,7 +1612,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:880 +#: solvespace.cpp:892 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1619,36 +1623,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:886 +#: solvespace.cpp:898 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:902 +#: solvespace.cpp:914 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:925 +#: solvespace.cpp:941 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:955 +#: solvespace.cpp:971 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:956 +#: solvespace.cpp:972 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:958 +#: solvespace.cpp:974 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:959 +#: solvespace.cpp:975 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:962 +#: solvespace.cpp:978 #, c-format msgid "" "\n" @@ -1656,7 +1660,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:966 +#: solvespace.cpp:982 #, c-format msgid "" "%s\n" @@ -1666,7 +1670,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:969 +#: solvespace.cpp:985 #, c-format msgid "" "%s\n" @@ -1676,7 +1680,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:998 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1824,30 +1828,38 @@ msgid "New group rotating active sketch" msgstr "" #: toolbar.cpp:72 -msgid "New group step and repeat rotating" +msgid "New group helix from active sketch" msgstr "" #: toolbar.cpp:74 -msgid "New group step and repeat translating" +msgid "New group revolve active sketch" msgstr "" #: toolbar.cpp:76 -msgid "New group in new workplane (thru given entities)" +msgid "New group step and repeat rotating" msgstr "" #: toolbar.cpp:78 -msgid "New group in 3d" +msgid "New group step and repeat translating" msgstr "" #: toolbar.cpp:80 -msgid "New group linking / assembling file" +msgid "New group in new workplane (thru given entities)" +msgstr "" + +#: toolbar.cpp:82 +msgid "New group in 3d" msgstr "" #: toolbar.cpp:84 +msgid "New group linking / assembling file" +msgstr "" + +#: toolbar.cpp:88 msgid "Nearest isometric view" msgstr "" -#: toolbar.cpp:86 +#: toolbar.cpp:90 msgid "Align view to active workplane" msgstr "" From 94bad320356455cdeea6f74ac94c847c2499db5e Mon Sep 17 00:00:00 2001 From: Jonathan Westhues Date: Fri, 15 Jan 2021 16:50:38 -0800 Subject: [PATCH 224/646] Fix SpaceNavigator type 6DOF controllers on Windows. We were creating the event but never dispatching it. --- src/platform/guiwin.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index 745720a46..d88519589 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -734,6 +734,11 @@ class WindowImplWin32 final : public Window { event.type = SixDofEvent::Type::RELEASE; event.button = SixDofEvent::Button::FIT; } + } else { + return 0; + } + if(window->onSixDofEvent) { + window->onSixDofEvent(event); } return 0; } From e1276579a3d41c492db0cafef24286dff9f74860 Mon Sep 17 00:00:00 2001 From: Reini Urban Date: Sun, 17 Jan 2021 15:37:34 +0100 Subject: [PATCH 225/646] Translations: update de_DE for 3.0 See #890 make -C src translate_solvespace to update all line numbers --- res/locales/de_DE.po | 24 ++++++++++++------------ res/locales/en_US.po | 8 ++++---- res/locales/fr_FR.po | 8 ++++---- res/locales/ru_RU.po | 8 ++++---- res/locales/uk_UA.po | 8 ++++---- res/locales/zh_CN.po | 8 ++++---- res/messages.pot | 8 ++++---- 7 files changed, 36 insertions(+), 36 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index 82807643f..64ef5d4d4 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-15 14:51-0600\n" +"POT-Creation-Date: 2021-01-17 15:23+0100\n" "PO-Revision-Date: 2018-07-19 06:55+0000\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" @@ -827,7 +827,7 @@ msgstr "Arbeitsraster anzeigen" #: graphicswin.cpp:95 msgid "Dim Solid for Sketch Groups" -msgstr "" +msgstr "Feste Farbe für Festkörper in Skizzen Gruppen" #: graphicswin.cpp:96 msgid "Use &Perspective Projection" @@ -1263,7 +1263,7 @@ msgid "" "lines)\n" " * a workplane (copy of the workplane)\n" msgstr "" -"Ungültige Auswahl für Skizze in neuer Arbeitsebene Diese Gruppe kann " +"Ungültige Auswahl für Skizze in neuer Arbeitsebene. Diese Gruppe kann " "erstellt werden mit:\n" "\n" " * einem Punkt (durch den Punkt, orthogonal zu den Koordinatenachsen)\n" @@ -1286,7 +1286,7 @@ msgstr "Extrusion" #: group.cpp:168 msgid "Lathe operation can only be applied to planar sketches." -msgstr "" +msgstr "Rotieren kann nur mit planaren Skizzen ausgeführt werden." #: group.cpp:179 msgid "" @@ -1296,7 +1296,7 @@ msgid "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" msgstr "" -"Ungültige Auswahl für neue Gruppe mit Drehquerschnitt Diese Gruppe kann " +"Ungültige Auswahl für neue Gruppe mit Drehquerschnitt. Diese Gruppe kann " "erstellt werden mit:\n" "\n" " * einem Punkt und einem Liniensegment oder einer Normale (Drehung um " @@ -1310,7 +1310,7 @@ msgstr "Drehung" #: group.cpp:194 msgid "Revolve operation can only be applied to planar sketches." -msgstr "" +msgstr "Revolve kann nur mit planaren Skizzen ausgeführt werden." #: group.cpp:205 msgid "" @@ -1328,7 +1328,7 @@ msgstr "Revolve" #: group.cpp:222 msgid "Helix operation can only be applied to planar sketches." -msgstr "" +msgstr "Helix kann nur mit planaren Skizzen ausgeführt werden." #: group.cpp:233 msgid "" @@ -1687,18 +1687,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Werte durch Komma getrennt (CSV)" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 msgid "untitled" msgstr "unbenannt" #: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1573 msgctxt "title" msgid "Save File" msgstr "Datei speichern" #: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1575 msgctxt "title" msgid "Open File" msgstr "Datei öffnen" @@ -2150,11 +2150,11 @@ msgstr "Neue Gruppe mit rotierter aktiver Skizze" #: toolbar.cpp:72 msgid "New group helix from active sketch" -msgstr "" +msgstr "Neue Gruppe Helix von aktiver Skizze" #: toolbar.cpp:74 msgid "New group revolve active sketch" -msgstr "" +msgstr "Neue Gruppe mit gedrehter aktiver Skizze" #: toolbar.cpp:76 msgid "New group step and repeat rotating" diff --git a/res/locales/en_US.po b/res/locales/en_US.po index 9772d5741..bc3c30b28 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-15 14:51-0600\n" +"POT-Creation-Date: 2021-01-17 15:23+0100\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -1653,18 +1653,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 msgid "untitled" msgstr "untitled" #: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1573 msgctxt "title" msgid "Save File" msgstr "Save File" #: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1575 msgctxt "title" msgid "Open File" msgstr "Open File" diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index a6f4c1e8a..a86196e05 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-15 14:51-0600\n" +"POT-Creation-Date: 2021-01-17 15:23+0100\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" @@ -1667,18 +1667,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 msgid "untitled" msgstr "sans nom" #: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1573 msgctxt "title" msgid "Save File" msgstr "Sauver fichier" #: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1575 msgctxt "title" msgid "Open File" msgstr "Ouvrir Fichier" diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index 07bab48f6..83311537e 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-15 14:51-0600\n" +"POT-Creation-Date: 2021-01-17 15:23+0100\n" "PO-Revision-Date: 2017-04-21 10:29+0700\n" "Last-Translator: evilspirit@evilspirit.org\n" "Language-Team: EvilSpirit\n" @@ -1670,18 +1670,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "CSV файлы (значения, разделенные запятой)" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 msgid "untitled" msgstr "без имени" #: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1573 msgctxt "title" msgid "Save File" msgstr "Сохранить Файл" #: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1575 msgctxt "title" msgid "Open File" msgstr "Открыть Файл" diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index 3922b16be..de049298f 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-15 14:51-0600\n" +"POT-Creation-Date: 2021-01-17 15:23+0100\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: appsoft@ua.fm\n" "Language-Team: OpenOrienteeringUkraine\n" @@ -1477,18 +1477,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 msgid "untitled" msgstr "" #: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1573 msgctxt "title" msgid "Save File" msgstr "" #: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1575 msgctxt "title" msgid "Open File" msgstr "" diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index 346171194..67728ec10 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-15 14:51-0600\n" +"POT-Creation-Date: 2021-01-17 15:23+0100\n" "PO-Revision-Date: 2020-09-28 12:42+0800\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" @@ -1564,18 +1564,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "逗号分隔数据" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 msgid "untitled" msgstr "未命名" #: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1573 msgctxt "title" msgid "Save File" msgstr "保存文件" #: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1575 msgctxt "title" msgid "Open File" msgstr "打开文件" diff --git a/res/messages.pot b/res/messages.pot index 33af7b262..d2af1d372 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-15 14:51-0600\n" +"POT-Creation-Date: 2021-01-17 15:23+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1439,18 +1439,18 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1625 +#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 msgid "untitled" msgstr "" #: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1568 +#: platform/guiwin.cpp:1573 msgctxt "title" msgid "Save File" msgstr "" #: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1570 +#: platform/guiwin.cpp:1575 msgctxt "title" msgid "Open File" msgstr "" From 2a476fdba8ddcc622b8bede63a0173fc6e9b562d Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 17 Jan 2021 20:07:41 +0200 Subject: [PATCH 226/646] Change "Dim Solid for Sketch Groups" to "Darken Inactive Solids" Discussion here: https://github.com/solvespace/solvespace/issues/890 --- src/graphicswin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index d368c3211..32b4b082e 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -92,7 +92,7 @@ const MenuEntry Menu[] = { { 1, N_("&Center View At Point"), Command::CENTER_VIEW, F|4, KN, mView }, { 1, NULL, Command::NONE, 0, KN, NULL }, { 1, N_("Show Snap &Grid"), Command::SHOW_GRID, '>', KC, mView }, -{ 1, N_("Dim Solid for Sketch Groups"), Command::DIM_SOLID_MODEL, 0, KC, mView }, +{ 1, N_("Darken Inactive Solids"), Command::DIM_SOLID_MODEL, 0, KC, mView }, { 1, N_("Use &Perspective Projection"), Command::PERSPECTIVE_PROJ, '`', KC, mView }, { 1, N_("Dimension &Units"), Command::NONE, 0, KN, NULL }, { 2, N_("Dimensions in &Millimeters"), Command::UNITS_MM, 0, KR, mView }, From 643dc225eab04694ddf0f68660ef510ab2f074dc Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 17 Jan 2021 20:21:24 +0200 Subject: [PATCH 227/646] Update translations --- res/locales/de_DE.po | 4 ++-- res/locales/en_US.po | 8 ++++---- res/locales/fr_FR.po | 4 ++-- res/locales/ru_RU.po | 4 ++-- res/locales/uk_UA.po | 4 ++-- res/locales/zh_CN.po | 6 +++--- res/messages.pot | 4 ++-- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index 64ef5d4d4..24a2f1906 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 15:23+0100\n" +"POT-Creation-Date: 2021-01-17 19:54+0200\n" "PO-Revision-Date: 2018-07-19 06:55+0000\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" @@ -826,7 +826,7 @@ msgid "Show Snap &Grid" msgstr "Arbeitsraster anzeigen" #: graphicswin.cpp:95 -msgid "Dim Solid for Sketch Groups" +msgid "Darken Inactive Solids" msgstr "Feste Farbe für Festkörper in Skizzen Gruppen" #: graphicswin.cpp:96 diff --git a/res/locales/en_US.po b/res/locales/en_US.po index bc3c30b28..e7acd7e15 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -2,12 +2,12 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # Automatically generated, 2017. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 15:23+0100\n" +"POT-Creation-Date: 2021-01-17 19:54+0200\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -807,8 +807,8 @@ msgid "Show Snap &Grid" msgstr "Show Snap &Grid" #: graphicswin.cpp:95 -msgid "Dim Solid for Sketch Groups" -msgstr "Dim Solid for Sketch Groups" +msgid "Darken Inactive Solids" +msgstr "Darken Inactive Solids" #: graphicswin.cpp:96 msgid "Use &Perspective Projection" diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index a86196e05..784b96102 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 15:23+0100\n" +"POT-Creation-Date: 2021-01-17 19:54+0200\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" @@ -820,7 +820,7 @@ msgid "Show Snap &Grid" msgstr "Afficher la &grille d'accrochage" #: graphicswin.cpp:95 -msgid "Dim Solid for Sketch Groups" +msgid "Darken Inactive Solids" msgstr "" #: graphicswin.cpp:96 diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index 83311537e..8cc4e6076 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 15:23+0100\n" +"POT-Creation-Date: 2021-01-17 19:54+0200\n" "PO-Revision-Date: 2017-04-21 10:29+0700\n" "Last-Translator: evilspirit@evilspirit.org\n" "Language-Team: EvilSpirit\n" @@ -814,7 +814,7 @@ msgid "Show Snap &Grid" msgstr "Показать &Сетку" #: graphicswin.cpp:95 -msgid "Dim Solid for Sketch Groups" +msgid "Darken Inactive Solids" msgstr "" #: graphicswin.cpp:96 diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index de049298f..1f2a2101e 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 15:23+0100\n" +"POT-Creation-Date: 2021-01-17 19:54+0200\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: appsoft@ua.fm\n" "Language-Team: OpenOrienteeringUkraine\n" @@ -694,7 +694,7 @@ msgid "Show Snap &Grid" msgstr "Показати &Сітку Прикріплення" #: graphicswin.cpp:95 -msgid "Dim Solid for Sketch Groups" +msgid "Darken Inactive Solids" msgstr "" #: graphicswin.cpp:96 diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index 67728ec10..245b452a0 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -2,12 +2,12 @@ # Copyright (C) 2020 the PACKAGE authors # This file is distributed under the same license as the SolveSpace package. # , 2020. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 15:23+0100\n" +"POT-Creation-Date: 2021-01-17 19:54+0200\n" "PO-Revision-Date: 2020-09-28 12:42+0800\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" @@ -772,7 +772,7 @@ msgid "Show Snap &Grid" msgstr "显示捕捉轴线 (&G)" #: graphicswin.cpp:95 -msgid "Dim Solid for Sketch Groups" +msgid "Darken Inactive Solids" msgstr "" #: graphicswin.cpp:96 diff --git a/res/messages.pot b/res/messages.pot index d2af1d372..c5ce2b775 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 15:23+0100\n" +"POT-Creation-Date: 2021-01-17 19:54+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -672,7 +672,7 @@ msgid "Show Snap &Grid" msgstr "" #: graphicswin.cpp:95 -msgid "Dim Solid for Sketch Groups" +msgid "Darken Inactive Solids" msgstr "" #: graphicswin.cpp:96 From 5c9d86ffd1b6f3615e9d6b2dae1fb9f5f58d5413 Mon Sep 17 00:00:00 2001 From: Reini Urban Date: Sun, 17 Jan 2021 20:04:03 +0100 Subject: [PATCH 228/646] Improved de_DE See #890 and its changed menu item --- res/locales/de_DE.po | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index 24a2f1906..9222a1dc3 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -827,7 +827,7 @@ msgstr "Arbeitsraster anzeigen" #: graphicswin.cpp:95 msgid "Darken Inactive Solids" -msgstr "Feste Farbe für Festkörper in Skizzen Gruppen" +msgstr "Dunklere inaktive Festkörper" #: graphicswin.cpp:96 msgid "Use &Perspective Projection" @@ -1116,7 +1116,7 @@ msgstr "(keine vorhergehenden Dateien)" #: graphicswin.cpp:363 #, c-format msgid "File '%s' does not exist." -msgstr "" +msgstr "Datei '%s' existiert nicht." #: graphicswin.cpp:725 msgid "No workplane is active, so the grid will not appear." @@ -1320,6 +1320,12 @@ msgid "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" msgstr "" +"Ungültige Auswahl für eine neue Revolve Gruppe. Diese Gruppe kann erzeugt " +"werden mit:\n" +"\n" +" * einem Punkt und einem Liniensegment oder Normale (gedreht um eine " +"Achse parallel zu Linie / Normale, durch Punkt)\n" +" * einem Liniensegment (gedreht um Liniensegment)\n" #: group.cpp:217 msgctxt "group-name" From 0cc3001d957f89469ec9fa280b90cdf6044eaab1 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 17 Jan 2021 17:38:04 -0500 Subject: [PATCH 229/646] GTK: Fix a warning for file->open dialogs. SetCurrentName only applies to save dialogs, so call it conditionally. --- src/platform/guigtk.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index e8113ed22..1f0cc55dd 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -1295,13 +1295,16 @@ class FileDialogImplGtk : public FileDialog { } } +//TODO: This is not getting called when the extension selection is changed. void FilterChanged() { std::string extension = GetExtension(); if(extension.empty()) return; Platform::Path path = GetFilename(); - SetCurrentName(path.WithExtension(extension).FileName()); + if(gtkChooser->get_action() != GTK_FILE_CHOOSER_ACTION_OPEN) { + SetCurrentName(path.WithExtension(extension).FileName()); + } } void FreezeChoices(SettingsRef settings, const std::string &key) override { From d092c0ce23bedaa285fa70d268bcce208e2c74bc Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 18 Jan 2021 14:57:15 -0500 Subject: [PATCH 230/646] Update build instructons Add use of OPEN_MP to linux and macOS build instructions, and a mention of ENABLE_LTO. --- README.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6e575a5d1..a5bb470e9 100644 --- a/README.md +++ b/README.md @@ -94,13 +94,15 @@ After that, build SolveSpace as following: mkdir build cd build - cmake .. -DCMAKE_BUILD_TYPE=Release + cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON make sudo make install +Link Time Optimization is supported by adding -DENABLE_LTO=ON to cmake at the +expense of longer build time. + The graphical interface is built as `build/bin/solvespace`, and the command-line interface -is built as `build/bin/solvespace-cli`. It is possible to build only the command-line interface -by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation. +is built as `build/bin/solvespace-cli`. It is possible to build only the command-line interface by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation. ### Building for Windows @@ -154,9 +156,12 @@ After that, build SolveSpace as following: mkdir build cd build - cmake .. -DCMAKE_BUILD_TYPE=Release + cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON make +Link Time Optimization is supported by adding -DENABLE_LTO=ON to cmake at the +expense of longer build time. + Alternatively, generate an XCode project, open it, and build the "Release" scheme: mkdir build From 090ec6e1dd230f8c997ebf6dac5e86f1c69e9abc Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 21 Jan 2021 15:25:09 -0600 Subject: [PATCH 231/646] Update to THREE.js revision 111 as found in Debian Testing Required some small JavaScript changes to replace deprecated usage. --- res/CMakeLists.txt | 2 +- res/threejs/SolveSpaceControls.js | 8 ++++---- res/threejs/three-r111.min.js.gz | Bin 0 -> 150121 bytes res/threejs/three-r76.js.gz | Bin 189743 -> 0 bytes src/export.cpp | 9 ++++++--- 5 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 res/threejs/three-r111.min.js.gz delete mode 100644 res/threejs/three-r76.js.gz diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index e261ba213..9152488d3 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -284,7 +284,7 @@ add_resources( shaders/edge.frag shaders/edge.vert shaders/outline.vert - threejs/three-r76.js.gz + threejs/three-r111.min.js.gz threejs/hammer-2.0.8.js.gz threejs/SolveSpaceControls.js) diff --git a/res/threejs/SolveSpaceControls.js b/res/threejs/SolveSpaceControls.js index e141aceec..ca74fd520 100644 --- a/res/threejs/SolveSpaceControls.js +++ b/res/threejs/SolveSpaceControls.js @@ -470,9 +470,9 @@ solvespace = function(obj, params) { changeBasis.makeBasis(camera.right, camera.up, n); for (var i = 0; i < 2; i++) { - var newLightPos = changeBasis.applyToVector3Array( - [obj.lights.d[i].direction[0], obj.lights.d[i].direction[1], - obj.lights.d[i].direction[2]]); + var newLightPos = new THREE.Vector3(obj.lights.d[i].direction[0], + obj.lights.d[i].direction[1], + obj.lights.d[i].direction[2]).applyMatrix4(changeBasis); directionalLightArray[i].position.set(newLightPos[0], newLightPos[1], newLightPos[2]); } @@ -515,7 +515,7 @@ solvespace = function(obj, params) { } geometry.computeBoundingSphere(); - return new THREE.Mesh(geometry, new THREE.MultiMaterial(materialList)); + return new THREE.Mesh(geometry, materialList); } function createEdges(meshObj) { diff --git a/res/threejs/three-r111.min.js.gz b/res/threejs/three-r111.min.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..7e6f57f193dbe4f9463bd9e1f232d6d3e37832dc GIT binary patch literal 150121 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

wF@RB5oZrwJD zYRKBt=w)m!R>5IK>F(%Y@9t$&`;BWfln3)pw{5Pa{xw9aF7m0 z&-1X0qjSgy1Gg^pb*AlTO|S3j(58zs?F51MkWUHRoWEYUoeOMl7sc&uA@J@8KX26d zr4B^MUg4(e{H+=Iwl2OoE9QdkmF|zb#y#acJ=L9q5q#{Pt% z7OT4FWg#y3I7wAzBR4Ep3Inx^VG~9^xuRs2+9ecIY9WNw1DW9ad(I;HWJc!iUyjgXO0k z7%;*N2HD$+9*LrwF|it~u$nMo#@q>lEPeY>xeR^m6h9iW$kWEB36_No!HU78*VF%9 z*93}4$>>?!u<=xf@7~wQ7qM>1_FAQ97w$<)7h6N_(t{EC7zXud`21WUh zt+zaOSk!d?Y&{AOL7*PQ*sjZ1ofcvq1cns>1QjC#Oa3p4dBx$u^t1Df5acDy`F*cW zgu=h@0kYqPDkQdQtB7RATaSVl{5B4$BZHgaXaf|zkpF$b|L)2qJ@ANJydht-iyzCsRZk4ur7cB)Q6&FbvEVG`6!>xNBML<%BNwt4QCIFp!>l*G%-}Fu@lslyZTo2tB8A{{V}DVqcu2i)&v(>~=*`>H z=-tWwUbJ(nc)1_Fe*1d=%_+CFpd(Zd%Hx9@Bp{hh1bt6UL%(Bsb%RKcg84(yhh7hq(K2OL=#(#2E1 z$62Ua17r78w|&b}$7#?4# zE`)WBJMbjHkKns-{mGB5V!mUvps)JG(JT`drT(-v`@!J0*WR33+GYqD*$tVjRLKWD z^w5OP^?>PL@0T9q{gU&1Nz7K)R1=u23$CFiy~Eq3lBY}L=W@4~ON-Vs>A}y7*39#w z#l?FtB*2gAS3l09A3GhY-pz<`R%K6T?%*X*yjpcG z{sCN{52QIY1k*7vtpJSf>D_H1W(nn!yFpW8+z41npo%b(I49p~MfgyurE?_uoj;=> z=zXk$u3{P*GA+mO`iL^qj3BWuMD)g>-5AG12lu9mh(rCamwr+UN(SLXq~Rupy*p2I zfO3A4lq+Q!Vtzot=muiQ?forgz%d%K^CHiJ8DgmqS1E-|rP>Kb=i^y5H-9BN~# z&OoDdq}n>5Y8@Rct1pAg#D=oQXd~>NuRE#WFu|;XGy8{PGR%-sD6x~9^)Hb0uO^c%Q?f1^0C(+o(*KFnzz(d;i?wDm0seCn z0Y+av6W~|R+BY+4ADko1z@Tb^dZLk{W@BBg!!>VoRt00Yno#$tPHtUPX6L1tmD+;U z?2p{fLT)e-Ro~yf%aSMK%de|cPS6zv@U+mOr*`6)Z62IoWHu&1v~2e7%q$QXij@nE zmTKc_ZkKS@4YpYp*Pm*l=QL(wQk3|S`z6TKkJ|6oSHwO>Tz(y4A8AZoNiew`K2}K8 zVgsMQfe0O<6u zfw~sR+`&4zjw%A$$6i2tj)7lMqkZQZ-9QaVC1*H#)HeM<{r9F)NZ3C!^=BcYrx9-* zlg_pK1>?oRf!oP`qZBVv3o%-Tj*$^7YT`?o*D>dp{-~)Yai1J@WkMY{4uKn$qpPM^ zs#*tnfUfz`?_G78GO&5*_b7ZX4RvfoH#Vrp8m^^cY*-KPYL?lSQB7K`F?aV6T|Z9<^Nd?tx1V}z2tQP!Pw?d6>Q(n#}5=u;ybU9Ob`KK6_kP$D7Q zSJ@;VtMju#u8wM>xRGXL-*^P`#)GXJ4>E4dwrxDvwDBmGjmNTS+`*dhA8E&!BV9>g zGR@BrqqtOM8*!)JgYFzlP?fI|bFU9a@VMjt$$jiS9TyK{bwIyPAvohkw{e+emudsd zx(QauuLo<2+`%Wc#%%B}APW{4r{Wr2cIRuuQQA)-aV=BYh;y0B#G&4m?VGd?wK}9wgu;sDc9S zz|JS&vu*N!elf2yPTyPD?_#44Q1Krx_;6ssn&*(jQMHYKz*8-KM~t;}DQ9wDi_D$- ze;&;QrPIdWx;>*zzh5(c!3{IWYo}#i%A#!rp*^(w=Hko(jvYJ#yZyp0)VSs?)Mp{m$zK`=J$aEC%7O!l}Gd$mLC_@DJDQ ziBZ`wj*`ozRVfX^V2PMHb7gwVn15~JA70K%wE5i%)HFD&LI~+}WbbadcW~ag-3k`z zGt6p4vE%F^#sJWHg)Lm@maBR6fhe-#;gxIT;NVvSwy=n3JEMJru^}EUwcta`F#^d^ z3f)w|D@*S>T(z}MpPR3`;vDrOzd5D?Z;j z(&Cv1EAD`}0qbsm|8zvwZ)Bqa7tO92iH&qZlPW}Lr>sDt=3$*9iWKyw$2TZcqAk~? z?r2arR%hGCba5a`idbC*Cmjru(J`ivtV3*7`v;|jbk1w$k9qQd-bDi{Qdyw@36eJ* z`c;|e!KTxlMV+J5XgzNK_%LirWp@`Jkl$0#2dkd=OX)H#*p>yA3PS#+AfB%iA4~%5 zZJ7<*cZ3v0o4Do6vDtP;Dp-}vHhqTzhgF7zGIva@+>h1TwBbn+hPC*fog6GW`Byoz zrXz!hs`)tH2QH1;1)=6Nx8ht}3r7UE@>8eMe-B>-SEK!N`Zwedwe#*y4y=nZQKP^# zc8X5M$q*%~=FH<&XWlPIYpx(anx6wahb{ASsM|X@l>ssX5yl1>rV2q;yOWeRD6ji~beP-0_@jnf301w}Nf~{*)7Im$^U*`aSRfJ{2w& zx|wC)0m6kvUyUN{1DqXbIK-L6$Fq+AzbUFX{t+Tq<(eaHw0^B|qy+Yw5ZNoMp&#Nt zA?~&vC~cabaM)_T4)QKB8DeEyOeX6hT<(Y=JS<8@4`zpynnMi41AZ1y!|VT6NMPrb zSBRZhXspV4!>%&+e5BE>6sdELNab)X=X7M@{*=xfA;*flIdj~d%Kz-n9QL%uEBjnt zANI5qIB-0|VW|ph@T^pX7vBaW84Bqta-2HT4fe|LkMX{0E@_YDb?ru1<<$ z|M){u6#B=xSqWn*74f-+`(y~oJMMp_V&A1Yh+KIeF-t2iG=i73k16#og%xr?VzC|> ziGJ7}$KCF}zxFI3Hu&XVXNbJlyRNJ~?D=j9uJHR^2YAjoG21%UP6lz@jr+N6s`KqTS~rR2|ecVEnKExv*M9Ypi;H5?w@Zg)OS}{xIgInCwK3Z9x}xF!(mNv z9*1GjIgW5%yJjSD zwKyyqgRqr(tA7sLk{*djYd?ZRra}v$i6J8K=a6HunJ2!jNmi52zCIi`Wq(c0FI_WW zLZTQr*CyV#6(N2tOhUYDu2kKZIM&ie&{71=+iTaR?&meJ5?(3bAwiufr`H$?(0Cq9 zqYr1%t?(B|m{tfzly7+DSlxqpRtCduE$SEqQ(UmuVILCm^CLc1*VYYYWm7F1YCBW7 zm$$t7-jWNil{7+F-G4CqP5~((+|Wp?Z?0`rZFqCyUUATx#TOlVg*2JD`O3q5U%vZ& zx7{`#*Tg~)ZPguk#zNYdvkudzP=EooxbtEWQq&*cT2qa;LUq5R#pYCfs#4sA=ettb zZ*FcHy}14C5;Au;2FV!x-`Co`?9%bD?HZ-+?D@+?Eqk#(5JMGcU-e*P4}X=# zu8N|IY@l?|A2=LBrsGz@XRd^aU=_#(Y|>PUsbO_~Q9>U@+AU84j!m5Pai$|y+Zy+b znx*NIfudFIc9!+HRfrY@k#GUPf|{W3E{#`eRqZCp5VG`TNF0Z)zs#_$$Od#b6?MIf zm^1xhwQMq`+@rZ|`ineONuh90Q&7Jy$A=bNXTZcCYF+xfaax42a*7-91@Gcval_(t zKv`TBOYKlQ!Lx9E_woua70KQte5NtzEM)ME2d0h4X{514D=i0cvMYc&_&ZygiQxs! z*w~i%waBIhNTTy05CRA!g0svfl8I`xy^u!H&e4Ix^#+G+ceu+gfQ1uE0b-NSW{Lm> z7EgNPTn~x>_EX7wL8B@lqb8hUg7_#2{R~u`ss8&iBsvKDEIbCzM(PPijIxLLx(O#H zWxjB*my);S><`ZRI&)v}2?=ZrVT8dAL4wZS2;k+>rM!~55Y(l5X?Iz82v;nAA;ouJc zsE^O!o7-aKx@dcaWI!QAk_NAqUrII;RSo#Qjoc50HMy62Pk~5lR`BUCc7>v!kB8%F zq3+zyJ`eTi3H$QQFhb1XeO^|l%=5fpnBcCnjSz3TYR)#`t#f%cSUBGdBV>f_Ml%>jg@}6s!wpA&L9IM`-BB)=X&a39bpB zr$$TG_-xpSTLtIBR=o%!o|&p9e-t8!vG z3v3&K_Z~%{lBXXbK<5=m*h?u~G59_t1Q>iO5(0egk>W_Jv8eho`JFG5p6k-T-kFrY zGYK7H9>Ew_i8g%nD%P0q1XgwS%Cfwl-KO~L_5m+>@zpLp;6<3>T6_~vH@a(iHW_u2 zwe~2x$rFCXdogUTukAqj-eEdU@KrB?_uxekcKHx+muX)8%oTOiECdPma4yi+>+v<3}@2EaGEUHLk*{-R{MmPs8|TfUsb{ z%h!f~U^tdF5qiCZm@1hrjD$Z_!+P|`!)zKwf*v5`^N8^5i7?z${Zjw_u^IhwAKS)# z%oNY=YZHODAwzukrT+Ls{qYCa|mX>QQClQIO!;oPJ zETxQ%dys*1qzcs;@+yhD4a0;y(HE4?Q%oIuEFUHv2q6EYqgKgoI)JbFP@S8e)T5iL zv~z`*XNek?JXU*MfqfVpvNP5~Y;N!IrcOg1@z=M5T_C*%-Y2m0)y;N!#DN1UszAWJ z#(J|*Q)a0)q-Ba18P6J}1E)yOsbgU|YT0JrI6(kq$qS_iWqEGOPU}jXxsF@%qOPXF zvK?YJ*TDBT4OP^M;kGwQFI5poH~Y-CSFS+FKVf13VROgK zxbDDTQV!#=3(5AmrdWHK z8W}X)1wJZi#C3GQlc>ymyFA0n3bWmxd-rv>^K79eZg$x8X~JjwR?Y`M{JcxtY-!;v zY^>ELPJj8C%feZzA6vs?jZBte^0uq0ehgOW%&Ov>H|HR%(#rX-xZD5LpK6+mBXj6C z3r=3Sj*HE6QREiBgOX%03fJ$>B-$?CLZO$EDUtVeQ1Zv*tzym*o^{tyN1f=Rj+^U1 zL(*bnHb3VItQJAktxk>;WxeqnQV$?L13oPU&nHyJ0WWdRHniv}Uf|*~ThU|LfU8iK zo4Sg%<~MrX!5+L;;KHMsr_6gPC8^1M4X~1;KcjsLg44@xe&e~5X{W=Rcr>s+hknmC z9UNCN_*g1cubT|j8A(Z8w-LQl`*b6Ra+z=)+!Eo`wj}sBhgrBNT=z9Vnx(HQ#BWhB zA8s}dqpO}z^Uoy3gQ`jNOOlTdwGG8|6a`)lapQ_~z&i+3O`e za#@84+^T)>3WqS`s&+^1oQkG&05yc2y^}X!|BeT7Bk4}ohLiT%IO$xC5-bsg zd1KhUaMm+1gzi!XS&?PzYAyJ_gzGFAV~9n2pY=;nP!-)f#ut<^J)X?X@{@Z@le@gl zUaW}xP2CMx1fe6F)SqG|GxJkg#eLIz$XM=uVDmT!VBgk}*wtrtpd~usJdOXVg5roZ z-ejjxs;!6+0W#7rflx{5WXNUow_U`}4b&+GpP7={tcfe{h`UQDin1rR65hO z5&`_(0r#0{om30do=R+-0D{I^_*X56A8~gOk@W%bbqqRS8~)RQ|8$LOJBhx;?6Baa z(gu_9ON1&)EwgpGZu^d&~9T!3aLHX|OGM~$5Zk=7PiUZ`#US6h4d_!^K+H4m>svY7|1C3hR#l!Dsn^&|QT zn;?V5zuARxlRhFZK2nvB1}fxP2L>9K3tMPLc>45d^yckp^k#o||Kw!n_~7uj=;(0g z&CYT34HQD%wyitVl~E%6??W!=dW{YBlS#GQ2CuW640QF7bn6GN?Qng|q&e|)?t;fM zw-jG@o_0uL+oZmPeShMo7R zocRnI6nW2PWJMDP7r7rl?939x6h5v9&@d&e9Jy-kgl9N!m(B8yoTP(Eo~7NmHye#z zitW|O#CQb3DJp|Zm%vF_-Ls2`)E3qz>gr?w_8HC-XVensrq=2Om>GzU4Koy?YL(tB zZht3TOKhnjEzVV;&OW$W6a6if7x)5puOu|bSugCzW2aEDZ&hC38a7dejX15beN-oxb7tw&BbeN0~#%SNMBv%VUqSLB{SD+jF)t0&25L}?cLlU|In z*-b|2H7r7!KDJt8?u>vOCBr=JfxR3BZ}xaNcZ1{B9obZZ^A5}_km*%++p8uIGD9apfrZbO}1|CYyFX*5MJaGBja?XNwr_FoWO>erY7ON?&Uremjn(n>{ zH!C+`X;*M<5U>@0(E2vA$hAWFW{Dzv)nG7u-L;2E(S+LMK3juiIXqwXk4_E_-@dWN z3k6kp^M*Q=nF45~FlyPAA~Eg{1GF@{*|_G@Q-?DBItCU?tc~2q_!%%v!*PUBCUPO6 ztc}FOVQ;FH!ANO|jeh(oInKs0EJHiDDSDT5ICh|pi$=2Svb%zlQoK@MywVHn9wf6p zD=l)YP9`17m6;g1%H@Izl83v4Cw%dURz84RIDeY@jHU?p|3=0H$nOH-e`-xJpB3hi%@OhaLhqDR7y6GaHS@y#&aU1)}UJ zy1CL(`(cu#&)E71SdmsR>rJnc?kF2nU8gBQ>3q7$MxQQ|yT_7)9Fj5t{RE7caPhoVw)9rN}7O8OUj~gu-PG_aYkrO=K(oA?o3*5b4T? zqeS&E7-36(meJx)kh2y^y>B zgUk)jbTyh;AG9kChL>|o=_#v)*a$$h2m;od7(agW^iHKjSIqU@I%Tbnw%$0>$l|mHAQdnf5VVpW*b=4uRtK@(?h$F5il-%Kd zR=ZRW+&jU)7<^{Yl`U6`Q&)XwGgA`x%V;SxL{?B|Ux$=bw)Zp`k#Jo>PBh+IJ+QY; z{kiFUZt2f0`pn<^u{j=KDBD{_|E<~*Z(G)9tFKNv8V1aGE{xt60h8Lx8h?$x{T8eI zp#EsejS0%q98>Syz|4+E?Nl)oeeD>D>J(Ii7q+%*Fa_uqfnb_0Ofv-2a$#Bm#=ADz zfz6N?rOMH)SZP+Qh9UrIW9(0Q<5V>Pjydtj1iEmf?KOD5*xVBoyQh$J12 zvXAt*0uRU;1b@pB!IB!n$q2+#9=**9%N4v3vG~Y{ill07ReR$Gt{*MI;_u(pGA45? ziv}E}GE7GB8YCNaNsCPWn55Tn51ryOC744ltV@@F*pX2e?PLSM3!oRH*c|0!%t_y) zCjt7YP5e3St8HKOa!twBnz3xJXpchugdiPsdhoJEA$2MhD^TxCo>KWSQ`xjmm9|`I z9%Z*_pI$Yfg5IUI3m*iG67?xhuM;KmYBgM?<**wmRSOxCH{_UtRw!bEs%;4HD$w2m z1!%Qnj7|JAwhE5|(%O}z$ZH}bh8U%{62ADo24{P`UcKE^xZy@QJ(!2M_jmdQ#ISOde%I}o7sJvBHzCq<1T&{|}liAK7?oHK{ zQF8i*$qZPw>zozxHk)f zGojBAZzHDjfOWF3gls zSdQ;=78m?&B;pqfz%)NjljjmbjQc2i7wfs8ww{qX;;N%P+;QLt=;IhN(5cm)vlfJ1 zh=?@EOh-gm`knV)3e@ujp#AnE20>hhtv|(|+zP{RC$&Nuf22khzC;N`*9=41?tk=p z(*DTT=0LeNZ}3T({`;kB^k}IFj1q0>NV+#jA$FiEOU>|&cO{QIP~}tPJ_rAZn}(*E z`S)+?6Y{5n1^avCh z9Jk-1_!dHAVqEBCv`Pp1RBPypxu3vthW@B=JG)K+jUaO0oF%QebxYSUGAWJYK}!QP zK7)0Lf8YA6ERqIoAZ5S)Ey8z(PJ`jCzpPQy)RdD+et zpeU;ap%&3gwC!y&w3R&k_{z)RsW}<|H8k&vwy>HRYO5z$usqT-}89=)dvz zUl5uh0Y8@hm4A!BvAw_O=>jclX#D$`Z7broqQA26l&*;~HufCG@q+O?v|!!oHCV`~ zZFhy>3OjROsN74;4pEIexJQJl%-kgoI$1u)CULLp60>mx8hNCBBd|~C_1><5&R@LH zJEf~){an}UJgv$+`|V$%zA0Vh72PbFG(&Y8O={OIwInpl*U-4K>x3A}B9eK_;adzT7H|tlEvGA(<7j6Mp3|yoBYUca~|7w}PTBhCx|N7qi zMJpGtQexd{@w!1h(rYL6;d{nH{rf9pX@2cBBOt4fxMYN;+as+Qm8gRYMxe&b_2O-3 z{MDC>VjFX=7T!A0)cMnS*6TmCtB^CL&0kb#ey>){PgShs^_hlNKQ{Dl^}|fs=XIVY zP5kj(|9-CFoA~3I{;htrzP6YbdHje{9uSg867nj{K^ZSrm?`3?>ff&}MCk->JlVN2L~k@>1AIiIwDc*`8M#g3@)>_cX_)&h&>BB+`59n zoD1>WkcSViMNNz~;0xco4ZVk4c%@?AR2!azo>l*U?LB#OT(|9i%b(&^Gp$$lYPE-a zM2eG%oyN_KoypYBq^auhJZYb#C-2ogEGvz_dx?W2$cK0AuI1!+Xl!Yh1VQiuNdN?j z4Ed$RZLCs$-Vr)Ig=lH@zezVa&t8&-l*UzNUQ^qtxkLsS2T(Z3F? zC|&w;u~<5I%@|@Sd9Qd?TN+h1>pV~dcV{(^5!ZT$7~)&!%^^SJ1&1$&Kek}WTGvnG z^uqAs)75AMZv4Rw9{3K+&(H1BE*Ol&*zV4=@f0iq?zXXDJGtx65Qbp`f_!pux6an2 z@#{xrFWOF6UV%>+mKO@t?w>#B^9-LJR&AfvzVF@6Q@|B&Jl5IRI&QdO(6iwMbl(X* znRwF%e?JhTn}QyCE&g=Aw3{W(`A7kknzP@jw7h$l-QdYDxtp3Pa`zN|o!zA^0#z}N z;zGp4=V4po^QkQ;x2#~#asYPUBJabi@n2127YREp#>Y3K(G*-7fyr487UU4+kl`~1 zh7~G2Nw<=RX7HqeVBpnYT|+`?^5QKC%Qff8Al3^5o%UT1U^v09C)GE-PiK%`0Ytu{ zAB5l?81Ysx?oQ9l!)uTs1{;H4C6A#Q_x97dHr@EGLT0K77r?;d20Nu><$Kz`b}eRPe-VriimqMeHa0l-9=- z7Dzz%vB~<bYegJ;g|;J0I!dB)ca%EWJ6G+eV-%=F91eg?lP z2#u>ZFT4S0%$q~*99YO-IgS;u=Kv<+&l0|hKi6~UHF$J$F1;R~uHe)fueKA^{T0l6 zL&m)c=WfWl>lm@m?{n8I0)}oIUCyv^pPPxkX_p4^bxMl4!z)W{&;9L5I{?Daffh^ax@w=nUbo^|G3k>AL9*L%zp>LE?M z2m)Sre4$Lu>N$5}3%_YJ-5mJ+q`XMKtVrLlgkZr)vRe_CESu5;t&)BzO@}&oRWlxx z74gluwKa1mawA;4d42*1!WBr>8*>3(zc7;_;o<;Zi~fy_3YBZ}!ffJaml;IwaaU!Z z)|t*P4mP+|`#QtxG@N;OSuH4bJN}`Uh7E!wvmTFigHV>g1nK6#&5F}G>yEX`XFK`n zyu3cIi-b>|haN2}A~CHO)W-T4$_XmF@M4B|DmqCztTlPY{1ibM%kW|2>(&MIk60Jd zK0j#33v*5{^Nop0g@vpDfDT{N5bk+Se-$jhq4Xu4@{C!k|pMO?V=27 zQI@2JOI?c|ux1g?=hN%*Rk+R*WnD#7?P>V*a=Kb9%@TCLXQOnUcJgWL@OP4=Kq|hQ zc%Ls;@C*#hlARNk1(*2I=}V5_D*z<>3BOmv6b{W1Ch|#OpFKNZ8cr~iM1M_@OT+jv z+6!hw$f6fYF-ZS8ABM@E1^FIFA-v~8UONj;$ewEpGFXZds)29PuJx1BF3BawCzAh^ zQ1R?$1e=}k-;F%wL7VLn$gh(u-a)6!Bb@1I4uR0@W`#wHt|LSbwP5(#JYsDgq&5vm zTMR&3bh`K5149qNSr&`cm;(2l+Sn?F*Mb99Ufi@62j3P%rtC`s$3MO?aca{2aBhAu zE+B!6%ejQN$)tjz3z?rmF|^FW_o(+6K~R`ltd->)F6yxzI}wdLCes5qUKMzrvLG5o5gNA;@I5jkHO~;ikGMz?xZB}Y(oS&=R*Y= zzMD_Sa6Z7dNG*OEWig2h#&M%r=cjUbq^_CP*xqfJ;FdhlGa!s>;l{>0H0ZYdp+FF_ zXZJUcfx@JdTb$sveTdzWRI%1Y$siJqYqrlX)cUc0pq}xbCB}(3AB{)Am61huFq`OS z$bg7SxH2C-_VD?1`l0;j+3-f^aD=UzBF_^BZ((p*5gfKf%Fte$4J-R-MmcD+E#?FK z_YnU*!heT0t7nZeA0qrCel?74U2H^2_4fAI3x_tkdilsw6}Ka271yh|X*IjKxfY50 zR^yvdvm=5%NZDaYhu(S6~j1TegBP^ZPfu1bK+7k?ekmN&3-Bt+-2 z)wYs97yvS#oRb)IB!h`5Kc2s5ekI9+x8~;%BpnClL-*h}^YORj;oG;ry?tap_91lu zUOacYM}P%<-NT<7`tvK4Jc2rvjK0q>e?-Q>qY5()3w4-$$aqkwgEJl$>fnq=g*rF` zeUb(Y#2V<-DHZWZg|V)mB(eP4WaFokgoV3U`Eg>MX8iFsB zCiJ^1f__hFLcgye7)S(nM7%l(WxH@!8q&sDhUz98+i5)wJOlC5X4u}7J^WI+#Z%GB zt$sZz(*ahP+W6(*UFdRpjkd(s)A?w)4+q+Pb4E)c>UtNQ}H30Q;7&^uDLK#o(y|m3>IZvk}NicXpWe?0q`9?ucdW3m%yImWu;dymPr6kK`#|_EdCz!5pzN z)zfrvj$Thq5FAdy@Kw_rfR$^gHK0x0Tr*y#V9rAJm1tBuBGOjDF2 za^5qNZ$U=4D>HtYVRE;drswBA`E@$K$d*ndDYKq|lU2+a;15$X$#-3UAWHv=L#yKC7FQuOES6KA7z#>_(_$d&_v|AbY-J`_T%_Mg^m@J@ zHdFAj5RA5;C%g|G2g!T}VTYKerwbxN(k{5-{QYM*#vTVCngYT;5c9i?{pj*oG!h== zf@8>3gD#)B7CJ~D&j>W39d2+b0ORhm5YIsia#QSBv&JwttCRb)_vz<6|Ybc=w z!Jx2GI3*ba{Ap$wfSIfL672uEE0t1IxmoQ9+Fi=cODX@0E8qd z03ktw96UitP~86wsJWVSJC9)6+)H|$p59PAQS3Jb9_+GTA$qG0zlUl8$4J*<~7!L5vb>Tv3g;nYHn>Ff;i1%?VO5y<*E=G6~e#J?LC zKyGXcK)!D)FbNNKVBAc#SUF8^KN)M(tm*D^%8d_M>b0gL1M$<}Q7tngQ%p1%M|x~d8(=bB=v zn$~DdPWBofknpk5r!(G0Pcv4t?^QU-^(CxZ$MmoB(Fm?tt3@^xNWQNz#C$%<$Ez`i(rD$AWSCvdvut7Z0`L!%Ew8g|;#{t~fXxtGV|bOqg^XU$ zBRB?oGUp^0oM1UMpTR&GlzsRjGWmw=wgE%0n~bv*?Zs_Al%7r?mVtsX@73ms{dvrT79G^kkC=W&Gx2V8#gg9|e5aGHiZ zkAzs!GLgn;4z$*hiKt7I>jX|h?%WA%t*pvV4R-n%7(eMAEl)r!GHaOkpOC;7>s zl#iMM1Z^ZfONX7iUJma1sG&ikZtBP+v%#Y`AatF<-xm!p)f@ zo@9=PuZkmlky~ud(<)G^oUH)ggt$8M#O=e+V zC;%Z-7CHmU+TeZr58``Z`VpUQosptXeNqN51pVt+@1bnb7H!6h;uoosy~s$CfuE!T z4{{Ls@Pp-tx8T>vk2YuWI|k0}In_fkz!R!2IM|jF(WyN9%x4z@baAOTlx;NXa3vzb zT##;2WY7vHaPT%mznqY)kEylSBX5vru3!K71>7zSA<$W`L%(nEw+)iMLjwiB*@u2 z|Dq|bqRHJGcU*v;v)W@|&fbi^PGoN$iEsT-!4Q}j@E)%G*;dc*_i-_wx8A@tTu;mx!mV03s}I`bXoUseNk9A^(<*a|#st zS=Bv`)u{FBY8!-l^*=y)l&rwLM8S6kIh_w58_gj$eD)7u zH8ysZi(#jmGd$K!7(y?P96FwPhiK&q7Ctm=qziXHYKwJJsd9eRJi6M*Q#F_l2U>}u zORtmHP`NOU8V!NIY_?Jm)Sy%um0G4Lk&Uzi)E#x|0fwrP>etazE!3|xGAb9%2h+6c zM9y1CwTLvV6n>u_ zB(A#I=CR@KupNV5j~zzruKhW5ttBsCD$Oz7W~ooYCOalPJ|y?pB;8XzpeR9a@bQiB zTU-2P<346-)Fp2_vX2Y*WQp$SEEz!E(5;3ENo1O z;ahH!f+Oy%cCr0#&JNvK#=X7aLoo?{HH>kV=p_1XfiWo8}KvhbJC-}oQ{_}SN zZQFJ2gyzHImLWVN-m>u{sB%mtp*utH1{Brpspb1<&E8p2W%Z-0PtPOVVhxx4XPQ{P zM4TOVio7LoF^$t}OC0Kf6q` zQSyA1&F9&C>Wi7FJ2IU+&PL1O^m@XvTh~=-WY)9J*= zC%MR$PtEriri;Uu=#6ARg?k6xH+(fh&MD%M;Cp;D`SFlm$jPtY!EFa}VeQrZBy-Zz zwI5b&Q=2EoG3DoZzRX-w z>CU*#tB?6~swhCW(|)TrJaw&XFMTS*r*1tV@NpeYa&-o>sDewDQxA3G<3yBut?=u| zmgLD9IsVYsHxJ6$Wj-33*`O}+056IATaL_jDf4ki=`Dqiqi%147Dcd)mUdvHr!U3V z7I$Jr)%TMyq`6gg>_Hn$rrBTYvu2pkMa`ETq*5i_p}&b-Sq0MX&s;sp?j(UV-awDH5cTvtOE%h=NKE7qmej3&LUGFg;R75Bh-; zx*fPh#}@Sx3UGFij4;5Nl|A2sRlqQPgt^jTgi=(f&=3Tj?9I^02E~)kC-yrwOG5P{ zDE!{D3b0@uHgU^UG^^44a&7kzLAZA-6t;(orebXG60=->9W#inB-f?L^rKA(T~AWo zof>`Om0zqwmwEc_y1ec!WYPkp)GDXKq@0}rJ6DX#Rom)qqtv6MN1iJj66=&vAmpWI zN(6U(GQJhE=-8p6L)VT!T3?N%W!^|!ee6nZZWNx5Px z_}Oh+6&lvIZvCAsRmn}u|4K_$u-OzcvHCjnuv{fI3Bx!tq@wsucmCfpb!*Gis=ZfR z?psS2Dv_%Duu`HKiGO?(RSwNn8XNQfunp__Y^t%@YXiI2g5m3?makQ&uW=kFb5n6f zub~Qkpr>l_~=t&6WZbd91{Zwu)LX}XF8kPZEo4<2*>$aC zbtE!==ysc+T_xryS-uYji_4aP(W~1!OQtvY_kh4k`FJ+UL3i9v@(WWUd{}|6F}5Jsg9Uhrh437PUo}Br{>f$L<^Ts zFkm6ZKy|1I8^w^VXCszQ@-aHEU3k~5aZaF?G`%pJXP}=+3?oSmvril(=C(}L3C{RM zG8?5g_ypZ-DVG^W4eKR~%=G$j&tB|T@qd?1R2OaTMG`}Qrbk)c4s?wJup5Wtl#Xq=8H^yArT4yr|;WYSX8jQ7q; z0`H-@E8t@49g#xg8i(?T$#J<)4NJRD=fj0Vv$HeK=W}zU9KM)NXPnHUM`iJy(5wbm zo-SQqi>&DPecEg`bqp(-J_|>25e{QGXtNZoreMepS|{oLuW#<}z5TlNui^c@gWN5h ze7^A0yiE)L@9Bg>3zMVgI!(R)@}ZIssE;D>S`WZwrTH$(;`htd>fAXdupobyo49Y_Y-qq!z&7| zl6{wueDt@QITVM{EaDOrK(`@e$F3Cl%^Zx61?X3t2}^5Fd`2+Ys9+92d%}b#NJpS= z_d|{(=96IJi1Dm!)=njh7AK&67Ca(p0!-Qt5OR{_CCh5EB9GF6pS(fm|a<JYam*;;xQa@a<5N;5`f>9XT717l6Zac6Qofd0uZ`dR_)6R5%6GQynntG( z^E+x3Z*q8x^U1W|`R{(`3ovdty1vdr^Bq06GQ7TG`|()mq;)&OOrsl)H@8Cdk}8Bh%_+X9rC89)H8>^UwzM<8unBf|umT@STC*wT zi%2v_On7l2*|t#vYw04ejT6ZY8VEPKiaWqLAdG3GM}(m7VjZ&K71XoWw#FGX5d8$@f^D!lyxVKd(;n}Bo8ESc Three.js Solvespace Mesh - + @@ -1019,7 +1021,10 @@ void SolveSpaceUI::ExportMeshAsThreeJsTo(FILE *f, const Platform::Path &filename fprintf(f, htmlbegin, THREE_FN.c_str(), LoadStringFromGzip("threejs/" + THREE_FN + ".gz").c_str(), - LoadString("threejs/SolveSpaceControls.js").c_str()); + HAMMER_FN.c_str(), + LoadStringFromGzip("threejs/" + HAMMER_FN + ".gz").c_str(), + CONTROLS_FN.c_str(), + LoadString("threejs/" + CONTROLS_FN).c_str()); } fprintf(f, "var solvespace_model_%s = {\n" From af4f24added441437f57ba4492257fe85d3bd1e9 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 23 Jan 2021 11:45:33 -0500 Subject: [PATCH 233/646] Update ru_RU translation --- res/locales/ru_RU.po | 182 +++++++++++++++++++++++++++++++++---------- 1 file changed, 141 insertions(+), 41 deletions(-) diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index 8cc4e6076..d43772461 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" "POT-Creation-Date: 2021-01-17 19:54+0200\n" -"PO-Revision-Date: 2017-04-21 10:29+0700\n" +"PO-Revision-Date: 2021-01-22 18:50+0700\n" "Last-Translator: evilspirit@evilspirit.org\n" "Language-Team: EvilSpirit\n" "Language: ru_RU\n" @@ -15,7 +15,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.0.1\n" +"X-Generator: Poedit 2.4.2\n" #: clipboard.cpp:310 msgid "" @@ -560,6 +560,7 @@ msgid "" "No solid model present; draw one with extrudes and revolves, or use Export " "2d View to export bare lines and curves." msgstr "" +"Тела не найдены; создайте их или используйте экспорт двумерных объектов." #: export.cpp:61 msgid "" @@ -570,10 +571,17 @@ msgid "" " * a point and two line segments (plane through point and parallel to " "lines)\n" msgstr "" +"Неправильное выделение для экспорта сечения. Необходимо выделить:\n" +"\n" +" * Ничего, но с активированной рабочей плоскостью (рабочая плоскость " +"будет плоскостью сечения)\n" +" * грань (сечение через грань)\n" +" * точку и два отрезка (сечение плоскостью, заданной двумя отрезками, " +"построенной через указанную точку)\n" #: export.cpp:822 msgid "Active group mesh is empty; nothing to export." -msgstr "" +msgstr "Активная группа не содержит тел; нечего экспортировать." #: exportvector.cpp:337 msgid "freehand lines were replaced with continuous lines" @@ -624,7 +632,7 @@ msgstr "Файл Отсутствует" #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." -msgstr "" +msgstr "Связанный файл “%s” отсутствует." #: file.cpp:862 msgctxt "dialog" @@ -767,7 +775,7 @@ msgstr "С&бросить Выделение" #: graphicswin.cpp:78 msgid "&Line Styles..." -msgstr "" +msgstr "Стили Линий..." #: graphicswin.cpp:79 msgid "&View Projection..." @@ -775,7 +783,7 @@ msgstr "&View Прое&кция..." #: graphicswin.cpp:81 msgid "Con&figuration..." -msgstr "" +msgstr "Настройки..." #: graphicswin.cpp:84 msgid "&View" @@ -815,7 +823,7 @@ msgstr "Показать &Сетку" #: graphicswin.cpp:95 msgid "Darken Inactive Solids" -msgstr "" +msgstr "Затемнять Неактивные Тела" #: graphicswin.cpp:96 msgid "Use &Perspective Projection" @@ -823,7 +831,7 @@ msgstr "Перспективная Прое&кция" #: graphicswin.cpp:97 msgid "Dimension &Units" -msgstr "" +msgstr "Единицы Измерения" #: graphicswin.cpp:98 msgid "Dimensions in &Millimeters" @@ -831,7 +839,7 @@ msgstr "Размеры в Ми&ллиметрах" #: graphicswin.cpp:99 msgid "Dimensions in M&eters" -msgstr "" +msgstr "Размеры в Метрах" #: graphicswin.cpp:100 msgid "Dimensions in &Inches" @@ -875,7 +883,7 @@ msgstr "Тело &Выдавливания" #: graphicswin.cpp:115 msgid "&Helix" -msgstr "" +msgstr "Тело Винтовое" #: graphicswin.cpp:116 msgid "&Lathe" @@ -883,7 +891,7 @@ msgstr "Тело В&ращения" #: graphicswin.cpp:117 msgid "Re&volve" -msgstr "" +msgstr "Тело В&ращения" #: graphicswin.cpp:119 msgid "Link / Assemble..." @@ -1063,11 +1071,11 @@ msgstr "Показать Про&блемные Ребра" #: graphicswin.cpp:173 msgid "Show &Center of Mass" -msgstr "" +msgstr "Показать Центр Масс" #: graphicswin.cpp:175 msgid "Show &Underconstrained Points" -msgstr "" +msgstr "Показать Свободные Точки" #: graphicswin.cpp:177 msgid "&Trace Point" @@ -1104,7 +1112,7 @@ msgstr "(пусто)" #: graphicswin.cpp:363 #, c-format msgid "File '%s' does not exist." -msgstr "" +msgstr "Файл '%s' не существует." #: graphicswin.cpp:725 msgid "No workplane is active, so the grid will not appear." @@ -1229,6 +1237,7 @@ msgstr "кликните мышью там, где хотите создать #: graphicswin.cpp:1297 msgid "click top left of image" msgstr "" +"кликните мышью там, где будет расположен левый верхний угол изображения" #: graphicswin.cpp:1309 msgid "" @@ -1278,6 +1287,8 @@ msgstr "тело-выдавливания" #: group.cpp:168 msgid "Lathe operation can only be applied to planar sketches." msgstr "" +"Операция создания тела вращения может быть применена только к плоским " +"эскизам." #: group.cpp:179 msgid "" @@ -1304,6 +1315,8 @@ msgstr "тело-вращения" #: group.cpp:194 msgid "Revolve operation can only be applied to planar sketches." msgstr "" +"Операция создания тела вращения может быть применена только к плоским " +"эскизам." #: group.cpp:205 msgid "" @@ -1313,15 +1326,25 @@ msgid "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" msgstr "" +"Неправильное выделение для создания группы тела вращения. \n" +"Группа может быть создана, используя в качестве выделения следующие " +"примитивы:\n" +"\n" +" * точку и отрезок / координатных базис (нормаль) (тело вращения вокруг " +"оси, проходящей через точку и параллельной отрезку / нормали)\n" +" * отрезок (тело вращения вокруг оси, проходящей через отрезок)\n" +"\n" #: group.cpp:217 msgctxt "group-name" msgid "revolve" -msgstr "" +msgstr "тело-вращения" #: group.cpp:222 msgid "Helix operation can only be applied to planar sketches." msgstr "" +"Операция создания винтового тела может быть применена только к плоским " +"эскизам." #: group.cpp:233 msgid "" @@ -1331,11 +1354,19 @@ msgid "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" msgstr "" +"Неправильное выделение для создания винтового тела.\n" +"Группа может быть создана, используя в качестве выделения следующие " +"примитивы:\n" +"\n" +" * точку и отрезок или координатный базис (нормаль) (вращение вокруг " +"направления, параллельного линии / нормали, построенное через выбранную " +"точку)\n" +" * отрезок (вращение вокруг отрезка)\n" #: group.cpp:245 msgctxt "group-name" msgid "helix" -msgstr "" +msgstr "тело-винтовое" #: group.cpp:258 msgid "" @@ -1424,6 +1455,8 @@ msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" +"Выберите два пересекающихся примитива (два отрезка/окружности/дуги или " +"отрезок/окружность/дугу и точку)" #: modify.cpp:736 msgid "Can't split; no intersection found." @@ -1573,13 +1606,13 @@ msgstr "Невозможно создать текст, когда нет акт #: mouse.cpp:1127 msgid "click to place bottom right of text" -msgstr "" +msgstr "кликните, чтобы расположить правый нижний угол текста" #: mouse.cpp:1133 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." -msgstr "" +msgstr "Невозможно создать изображение. Активируйте рабочую плоскость." #: mouse.cpp:1160 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" @@ -1593,7 +1626,7 @@ msgstr "проекты SolveSpace" #: platform/gui.cpp:90 msgctxt "file-type" msgid "IDF circuit board" -msgstr "" +msgstr "IDF печатная плата" #: platform/gui.cpp:94 msgctxt "file-type" @@ -1623,7 +1656,7 @@ msgstr "Three.js-совместимая полигональная сетка" #: platform/gui.cpp:102 msgctxt "file-type" msgid "VRML text file" -msgstr "" +msgstr "VRML файл" #: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 msgctxt "file-type" @@ -1699,7 +1732,7 @@ msgstr "Сохранить" #: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 msgctxt "button" msgid "_Open" -msgstr "" +msgstr "_Открыть" #: solvespace.cpp:169 msgctxt "title" @@ -1709,22 +1742,22 @@ msgstr "Автосохранение Доступно" #: solvespace.cpp:170 msgctxt "dialog" msgid "An autosave file is available for this sketch." -msgstr "" +msgstr "Автоматически сохраненный файл доступен для данного проекта." #: solvespace.cpp:171 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" -msgstr "" +msgstr "Хотите загрузить автосохраненный файл вместо исходного?" #: solvespace.cpp:172 msgctxt "button" msgid "&Load autosave" -msgstr "" +msgstr "&Загрузить Автосохранение" #: solvespace.cpp:174 msgctxt "button" msgid "Do&n't Load" -msgstr "" +msgstr "&Не Загружать" #: solvespace.cpp:557 msgctxt "title" @@ -1735,27 +1768,27 @@ msgstr "Измененный Файл" #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" -msgstr "" +msgstr "Сохранить изменения, сделанные в файле “%s”?" #: solvespace.cpp:562 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" -msgstr "" +msgstr "Сохранить изменения, сделанные в новом проекте?" #: solvespace.cpp:565 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." -msgstr "" +msgstr "Изменения будут утеряны, если их не сохранить." #: solvespace.cpp:566 msgctxt "button" msgid "&Save" -msgstr "" +msgstr "&Сохранить" #: solvespace.cpp:568 msgctxt "button" msgid "Do&n't Save" -msgstr "" +msgstr "&Не Сохранять" #: solvespace.cpp:589 msgctxt "title" @@ -1773,6 +1806,9 @@ msgid "" "is probably not what you want; hide them by clicking the link at the top of " "the text window." msgstr "" +"Ограничения отображаются, и будут экспортированы в файл. Предположительно, " +"это не то, что требуется, если так, необходимо спрятать их, нажав ссылку " +"вверху окна Браузера." #: solvespace.cpp:730 #, c-format @@ -1780,18 +1816,22 @@ msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" +"Неподдерживаемый тип файла '%s'; Поддерживаются файлы с расширением .dxf и ." +"dwg." #: solvespace.cpp:778 msgid "Constraint must have a label, and must not be a reference dimension." -msgstr "" +msgstr "У ограничения должно быть значение и оно не должно быть справочным." #: solvespace.cpp:782 msgid "Bad selection for step dimension; select a constraint." msgstr "" +"Неправильное выделение для операции изменения значения с заданным шагом; " +"необходимо выбрать ограничение со значением." #: solvespace.cpp:806 msgid "The assembly does not interfere, good." -msgstr "" +msgstr "Сборка не содержит пересечения деталей - это хорошо." #: solvespace.cpp:822 #, c-format @@ -1800,6 +1840,9 @@ msgid "" "\n" " %s" msgstr "" +"Объем тел:\n" +"\n" +" %s" #: solvespace.cpp:831 #, c-format @@ -1809,6 +1852,10 @@ msgid "" "\n" " %s" msgstr "" +"\n" +"Объем тел текущей группы:\n" +"\n" +" %s" #: solvespace.cpp:836 msgid "" @@ -1817,6 +1864,10 @@ msgid "" "Curved surfaces have been approximated as triangles.\n" "This introduces error, typically of around 1%." msgstr "" +"\n" +"\n" +"Кривые аппроксимированы кусочно-линейными функциями.\n" +"Это приводит к ошибке в расчетах, обычно в пределах 1%." #: solvespace.cpp:851 #, c-format @@ -1828,12 +1879,20 @@ msgid "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." msgstr "" +"Площадь поверхности выбранных граней:\n" +"\n" +" %s\n" +"\n" +"Кривые аппроксимированы кусочно-линейными функциями.\n" +"Это приводит к ошибке в расчетах, обычно в пределах 1%%." #: solvespace.cpp:860 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" +"Эта группа не содержит замкнутых областей. В ней нет замкнутых контуров, " +"примитивы не лежат в одной плоскости или самопересекаются." #: solvespace.cpp:872 #, c-format @@ -1845,6 +1904,12 @@ msgid "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." msgstr "" +"Площадь замкнутой области текущей группы:\n" +"\n" +" %s\n" +"\n" +"Кривые аппроксимированы кусочно-линейными функциями.\n" +"Это приводит к ошибке в расчетах, обычно в пределах 1%%." #: solvespace.cpp:892 #, c-format @@ -1856,35 +1921,43 @@ msgid "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." msgstr "" +"Длина выбранных примитивов:\n" +"\n" +" %s\n" +"\n" +"Кривые аппроксимированы кусочно-линейными функциями.\n" +"Это приводит к ошибке в расчетах, обычно в пределах 1%%." #: solvespace.cpp:898 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" +"Неправильное выделение для расчета периметра; необходимо выбирать только " +"отрезки, дуги и кривые в качестве исходных данных" #: solvespace.cpp:914 msgid "Bad selection for trace; select a single point." -msgstr "" +msgstr "Неправильное выделение для трассировки; необходимо выбрать одну точку." #: solvespace.cpp:941 #, c-format msgid "Couldn't write to '%s'" -msgstr "" +msgstr "Невозможно записать в '%s'" #: solvespace.cpp:971 msgid "The mesh is self-intersecting (NOT okay, invalid)." -msgstr "" +msgstr "Полигональная стека содержит самопересечения (это плохо)" #: solvespace.cpp:972 msgid "The mesh is not self-intersecting (okay, valid)." -msgstr "" +msgstr "Полигональная стека не содержит самопересечений (это хорошо)" #: solvespace.cpp:974 msgid "The mesh has naked edges (NOT okay, invalid)." -msgstr "" +msgstr "Полигональная сетка содержит \"оголенные\" ребра (это плохо)" #: solvespace.cpp:975 msgid "The mesh is watertight (okay, valid)." -msgstr "" +msgstr "Полигональная сетка герметична (это хорошо)" #: solvespace.cpp:978 #, c-format @@ -1893,6 +1966,9 @@ msgid "" "\n" "The model contains %d triangles, from %d surfaces." msgstr "" +"\n" +"\n" +"Модель содержит %d треугольников, содержащихся в %d поверхностях." #: solvespace.cpp:982 #, c-format @@ -1903,6 +1979,11 @@ msgid "" "\n" "Zero problematic edges, good.%s" msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"Нет проблемных ребер - это хорошо.%s" #: solvespace.cpp:985 #, c-format @@ -1913,6 +1994,11 @@ msgid "" "\n" "%d problematic edges, bad.%s" msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d найдены проблемные ребра - это плохо.%s" #: solvespace.cpp:998 #, c-format @@ -1930,6 +2016,20 @@ msgid "" "\n" "© 2008-%d Jonathan Westhues and other authors.\n" msgstr "" +"Это SolveSpace версии %s.\n" +"\n" +"Для дополнительной информации посетите сайт: http://solvespace.com/\n" +"\n" +"SolveSpace - это свободное программное обеспечение: поощряется изменение, " +"улучшение\n" +"распространение программы по условиям лицензии GNU\n" +"General Public License (GPL) версии 3 или новее.\n" +"\n" +"НИКАКИХ ГАРАНТИЙ за пределами прав, \n" +"предусмотренных законом. Дополнительная информация на сайте: http://gnu.org/" +"licenses/\n" +"\n" +"© 2008-%d Джонатан Вэстью и другие авторы.\n" #: style.cpp:166 msgid "" @@ -1985,7 +2085,7 @@ msgstr "Начертить текст TrueType" #: toolbar.cpp:28 msgid "Sketch image from a file" -msgstr "" +msgstr "Импортировать изображение из файла" #: toolbar.cpp:30 msgid "Create tangent arc at selected point" @@ -2065,11 +2165,11 @@ msgstr "Создать группу вращения текущего эскиз #: toolbar.cpp:72 msgid "New group helix from active sketch" -msgstr "" +msgstr "Создать группу тела выдавливания по винтовой линии из текущего эскиза" #: toolbar.cpp:74 msgid "New group revolve active sketch" -msgstr "" +msgstr "Создать группу тела вращения из текущего эскиза" #: toolbar.cpp:76 msgid "New group step and repeat rotating" From b3e45433da69761d6df6721ec51d659d156f6e2d Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 25 Jan 2021 20:41:28 -0500 Subject: [PATCH 234/646] Add version command to solvespace-cli --- src/platform/entrycli.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/platform/entrycli.cpp b/src/platform/entrycli.cpp index 61b20db18..70b6919b0 100644 --- a/src/platform/entrycli.cpp +++ b/src/platform/entrycli.cpp @@ -4,6 +4,7 @@ // Copyright 2016 whitequark //----------------------------------------------------------------------------- #include "solvespace.h" +#include "config.h" static void ShowUsage(const std::string &cmd) { fprintf(stderr, "Usage: %s [filename...]", cmd.c_str()); @@ -29,6 +30,8 @@ Common options: Whether to export the background colour in vector formats. Defaults to off. Commands: + version + Prints the current solvespace version. thumbnail --output --size --view [--chord-tol ] Outputs a rendered view of the sketch, like the SolveSpace GUI would. @@ -174,7 +177,10 @@ static bool RunCommand(const std::vector args) { }; unsigned width = 0, height = 0; - if(args[1] == "thumbnail") { + if(args[1] == "version") { + fprintf(stderr, "SolveSpace version %s \n\n", PACKAGE_VERSION); + return false; + } else if(args[1] == "thumbnail") { auto ParseSize = [&](size_t &argn) { if(argn + 1 < args.size() && args[argn] == "--size") { argn++; From 0d447bab914c91a7843d80bfb5324aedf171a61d Mon Sep 17 00:00:00 2001 From: robnee Date: Fri, 29 Jan 2021 08:52:10 -0500 Subject: [PATCH 235/646] do not Invalidate() when dragging new points to prevent refresh bugs on Windows --- src/mouse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/mouse.cpp b/src/mouse.cpp index 729c8ee2c..263211da4 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -305,7 +305,6 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, HitTestMakeSelection(mp); SS.MarkGroupDirtyByEntity(pending.point); orig.mouse = mp; - Invalidate(); break; case Pending::DRAGGING_POINTS: From d553083c7980ae2efb8a89bc035d267cdaee4885 Mon Sep 17 00:00:00 2001 From: ruevs Date: Mon, 1 Feb 2021 15:43:19 +0200 Subject: [PATCH 236/646] Fix a crash when opening an empty file. Fixes: https://github.com/solvespace/solvespace/issues/918 The problem was that here: https://github.com/solvespace/solvespace/blob/11a8a0abd5e21a0da6c818674f8b4b657a401a6c/src/file.cpp#L480 we cleared all groups. Then we tried to read an empty file and therefore this `while` exited immediately: https://github.com/solvespace/solvespace/blob/11a8a0abd5e21a0da6c818674f8b4b657a401a6c/src/file.cpp#L487 and we came to here: https://github.com/solvespace/solvespace/blob/11a8a0abd5e21a0da6c818674f8b4b657a401a6c/src/file.cpp#L548 where there was no `fileLoadError` and thus we were left with no groups, and so this assert failed: https://github.com/solvespace/solvespace/blob/11a8a0abd5e21a0da6c818674f8b4b657a401a6c/src/graphicswin.cpp#L394 since is is not allowed to have no groups :-) --- src/file.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/file.cpp b/src/file.cpp index f36e49b34..160b5ec7b 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -468,6 +468,7 @@ void SolveSpaceUI::LoadUsingTable(const Platform::Path &filename, char *key, cha } bool SolveSpaceUI::LoadFromFile(const Platform::Path &filename, bool canCancel) { + bool fileIsEmpty = true; allConsistent = false; fileLoadError = false; @@ -485,6 +486,8 @@ bool SolveSpaceUI::LoadFromFile(const Platform::Path &filename, bool canCancel) char line[1024]; while(fgets(line, (int)sizeof(line), fh)) { + fileIsEmpty = false; + char *s = strchr(line, '\n'); if(s) *s = '\0'; // We should never get files with \r characters in them, but mailers @@ -545,6 +548,11 @@ bool SolveSpaceUI::LoadFromFile(const Platform::Path &filename, bool canCancel) fclose(fh); + if(fileIsEmpty) { + Error(_("The file is empty. It may be corrupt.")); + NewFile(); + } + if(fileLoadError) { Error(_("Unrecognized data in file. This file may be corrupt, or " "from a newer version of the program.")); From 167a58e8771cabe139ebcf7c8695539274a866ea Mon Sep 17 00:00:00 2001 From: ruevs Date: Mon, 1 Feb 2021 15:56:14 +0200 Subject: [PATCH 237/646] Update translations Including de_DE and ru_RU strings. --- res/locales/de_DE.po | 106 ++++++++++++++++++++++--------------------- res/locales/en_US.po | 106 ++++++++++++++++++++++--------------------- res/locales/fr_FR.po | 106 ++++++++++++++++++++++--------------------- res/locales/ru_RU.po | 106 ++++++++++++++++++++++--------------------- res/locales/uk_UA.po | 106 ++++++++++++++++++++++--------------------- res/locales/zh_CN.po | 106 ++++++++++++++++++++++--------------------- res/messages.pot | 106 ++++++++++++++++++++++--------------------- 7 files changed, 385 insertions(+), 357 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index 9222a1dc3..bbd3fcda6 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 19:54+0200\n" +"POT-Creation-Date: 2021-02-01 15:45+0200\n" "PO-Revision-Date: 2018-07-19 06:55+0000\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" @@ -619,7 +619,11 @@ msgctxt "group-name" msgid "#references" msgstr "#Referenzen" -#: file.cpp:549 +#: file.cpp:552 +msgid "The file is empty. It may be corrupt." +msgstr "Die Datei ist leer. Es kann beschädigt sein." + +#: file.cpp:557 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -627,18 +631,18 @@ msgstr "" "Nicht erkannte Daten in der Datei. Diese Datei könnte beschädigt sein oder " "von einer neueren Version des Programms stammen." -#: file.cpp:859 +#: file.cpp:867 msgctxt "title" msgid "Missing File" msgstr "Fehlende Datei" -#: file.cpp:860 +#: file.cpp:868 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "Die verlinkte Datei “%s” fehlt." -#: file.cpp:862 +#: file.cpp:870 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -650,17 +654,17 @@ msgstr "" "Falls Sie ablehnen, wird jegliche mit der fehlenden Datei verknüpfte " "Geometrie verworfen." -#: file.cpp:865 +#: file.cpp:873 msgctxt "button" msgid "&Yes" msgstr "&Ja" -#: file.cpp:867 +#: file.cpp:875 msgctxt "button" msgid "&No" msgstr "&Nein" -#: file.cpp:869 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "&Abbrechen" @@ -1446,105 +1450,105 @@ msgstr "" msgid "Can't split; no intersection found." msgstr "Trennen nicht möglich; keine Überschneidung gefunden." -#: mouse.cpp:560 +#: mouse.cpp:559 msgid "Assign to Style" msgstr "Linientyp zuordnen" -#: mouse.cpp:576 +#: mouse.cpp:575 msgid "No Style" msgstr "Kein Linientyp" -#: mouse.cpp:579 +#: mouse.cpp:578 msgid "Newly Created Custom Style..." msgstr "Neu erstellter benutzerdefinierter Linientyp…" -#: mouse.cpp:586 +#: mouse.cpp:585 msgid "Group Info" msgstr "Info zu Gruppe" -#: mouse.cpp:606 +#: mouse.cpp:605 msgid "Style Info" msgstr "Info zu Linientyp" -#: mouse.cpp:626 +#: mouse.cpp:625 msgid "Select Edge Chain" msgstr "Kantenverlauf auswählen" -#: mouse.cpp:632 +#: mouse.cpp:631 msgid "Toggle Reference Dimension" msgstr "Von/zu Referenzangabe wechseln" -#: mouse.cpp:638 +#: mouse.cpp:637 msgid "Other Supplementary Angle" msgstr "Anderer Komplementärwinkel" -#: mouse.cpp:643 +#: mouse.cpp:642 msgid "Snap to Grid" msgstr "Auf Raster ausrichten" -#: mouse.cpp:652 +#: mouse.cpp:651 msgid "Remove Spline Point" msgstr "Spline-Punkt löschen" -#: mouse.cpp:687 +#: mouse.cpp:686 msgid "Add Spline Point" msgstr "Spline-Punkt hinzufügen" -#: mouse.cpp:691 +#: mouse.cpp:690 msgid "Cannot add spline point: maximum number of points reached." msgstr "" "Spline-Punkt kann nicht hinzugefügt werden: maximale Anzahl der Punkte " "erreicht." -#: mouse.cpp:716 +#: mouse.cpp:715 msgid "Toggle Construction" msgstr "Konstruktionselement an/aus" -#: mouse.cpp:731 +#: mouse.cpp:730 msgid "Delete Point-Coincident Constraint" msgstr "Einschränkung \"Punkte deckungsgleich\" löschen" -#: mouse.cpp:750 +#: mouse.cpp:749 msgid "Cut" msgstr "Ausschneiden" -#: mouse.cpp:752 +#: mouse.cpp:751 msgid "Copy" msgstr "Kopieren" -#: mouse.cpp:756 +#: mouse.cpp:755 msgid "Select All" msgstr "Alle auswählen" -#: mouse.cpp:761 +#: mouse.cpp:760 msgid "Paste" msgstr "Einfügen" -#: mouse.cpp:763 +#: mouse.cpp:762 msgid "Paste Transformed..." msgstr "Einfügen und transformieren…" -#: mouse.cpp:768 +#: mouse.cpp:767 msgid "Delete" msgstr "Löschen" -#: mouse.cpp:771 +#: mouse.cpp:770 msgid "Unselect All" msgstr "Alle deselektieren" -#: mouse.cpp:778 +#: mouse.cpp:777 msgid "Unselect Hovered" msgstr "Aktive deselektieren" -#: mouse.cpp:787 +#: mouse.cpp:786 msgid "Zoom to Fit" msgstr "Zoom an Bildschirm anpassen" -#: mouse.cpp:989 mouse.cpp:1276 +#: mouse.cpp:988 mouse.cpp:1275 msgid "click next point of line, or press Esc" msgstr "Klicken Sie auf den nächsten Punkt der Linie, oder drücken Sie Esc" -#: mouse.cpp:995 +#: mouse.cpp:994 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1552,15 +1556,15 @@ msgstr "" "Ein Rechteck kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1029 +#: mouse.cpp:1028 msgid "click to place other corner of rectangle" msgstr "Klicken Sie auf die gegenüberliegende Ecke des Rechtecks" -#: mouse.cpp:1049 +#: mouse.cpp:1048 msgid "click to set radius" msgstr "Klicken Sie, um den Radius festzulegen" -#: mouse.cpp:1054 +#: mouse.cpp:1053 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1568,23 +1572,23 @@ msgstr "" "Ein Kreisbogen kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1073 +#: mouse.cpp:1072 msgid "click to place point" msgstr "Klicken Sie, um einen Punkt zu platzieren" -#: mouse.cpp:1089 +#: mouse.cpp:1088 msgid "click next point of cubic, or press Esc" msgstr "" "Klicken Sie auf den nächsten Punkt der kubischen Linie, oder drücken Sie Esc" -#: mouse.cpp:1094 +#: mouse.cpp:1093 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Eine Arbeitsebene ist bereits aktiv. Skizzieren Sie in 3D, bevor Sie eine " "neue Arbeitsebene erstellen." -#: mouse.cpp:1110 +#: mouse.cpp:1109 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1592,11 +1596,11 @@ msgstr "" "Text kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1127 +#: mouse.cpp:1126 msgid "click to place bottom right of text" msgstr "Klicken Sie auf die untere rechte Ecke des Texts" -#: mouse.cpp:1133 +#: mouse.cpp:1132 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1604,7 +1608,7 @@ msgstr "" "Das Bild kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1160 +#: mouse.cpp:1159 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEUER KOMMENTAR -- DOPPELKLICKEN ZUM BEARBEITEN" @@ -1693,33 +1697,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Werte durch Komma getrennt (CSV)" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 +#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 msgid "untitled" msgstr "unbenannt" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1573 +#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1582 msgctxt "title" msgid "Save File" msgstr "Datei speichern" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1575 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1584 msgctxt "title" msgid "Open File" msgstr "Datei öffnen" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 +#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 msgctxt "button" msgid "_Cancel" msgstr "_Abbrechen" -#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 +#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 msgctxt "button" msgid "_Save" msgstr "_Speichern" -#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 +#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 msgctxt "button" msgid "_Open" msgstr "_Öffnen" diff --git a/res/locales/en_US.po b/res/locales/en_US.po index e7acd7e15..27f024442 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 19:54+0200\n" +"POT-Creation-Date: 2021-02-01 15:45+0200\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -599,7 +599,11 @@ msgctxt "group-name" msgid "#references" msgstr "#references" -#: file.cpp:549 +#: file.cpp:552 +msgid "The file is empty. It may be corrupt." +msgstr "The file is empty. It may be corrupt." + +#: file.cpp:557 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -607,18 +611,18 @@ msgstr "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." -#: file.cpp:859 +#: file.cpp:867 msgctxt "title" msgid "Missing File" msgstr "Missing File" -#: file.cpp:860 +#: file.cpp:868 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "The linked file “%s” is not present." -#: file.cpp:862 +#: file.cpp:870 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -631,17 +635,17 @@ msgstr "" "If you decline, any geometry that depends on the missing file will be " "permanently removed." -#: file.cpp:865 +#: file.cpp:873 msgctxt "button" msgid "&Yes" msgstr "&Yes" -#: file.cpp:867 +#: file.cpp:875 msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:869 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "&Cancel" @@ -1410,103 +1414,103 @@ msgstr "" msgid "Can't split; no intersection found." msgstr "Can't split; no intersection found." -#: mouse.cpp:560 +#: mouse.cpp:559 msgid "Assign to Style" msgstr "Assign to Style" -#: mouse.cpp:576 +#: mouse.cpp:575 msgid "No Style" msgstr "No Style" -#: mouse.cpp:579 +#: mouse.cpp:578 msgid "Newly Created Custom Style..." msgstr "Newly Created Custom Style..." -#: mouse.cpp:586 +#: mouse.cpp:585 msgid "Group Info" msgstr "Group Info" -#: mouse.cpp:606 +#: mouse.cpp:605 msgid "Style Info" msgstr "Style Info" -#: mouse.cpp:626 +#: mouse.cpp:625 msgid "Select Edge Chain" msgstr "Select Edge Chain" -#: mouse.cpp:632 +#: mouse.cpp:631 msgid "Toggle Reference Dimension" msgstr "Toggle Reference Dimension" -#: mouse.cpp:638 +#: mouse.cpp:637 msgid "Other Supplementary Angle" msgstr "Other Supplementary Angle" -#: mouse.cpp:643 +#: mouse.cpp:642 msgid "Snap to Grid" msgstr "Snap to Grid" -#: mouse.cpp:652 +#: mouse.cpp:651 msgid "Remove Spline Point" msgstr "Remove Spline Point" -#: mouse.cpp:687 +#: mouse.cpp:686 msgid "Add Spline Point" msgstr "Add Spline Point" -#: mouse.cpp:691 +#: mouse.cpp:690 msgid "Cannot add spline point: maximum number of points reached." msgstr "Cannot add spline point: maximum number of points reached." -#: mouse.cpp:716 +#: mouse.cpp:715 msgid "Toggle Construction" msgstr "Toggle Construction" -#: mouse.cpp:731 +#: mouse.cpp:730 msgid "Delete Point-Coincident Constraint" msgstr "Delete Point-Coincident Constraint" -#: mouse.cpp:750 +#: mouse.cpp:749 msgid "Cut" msgstr "Cut" -#: mouse.cpp:752 +#: mouse.cpp:751 msgid "Copy" msgstr "Copy" -#: mouse.cpp:756 +#: mouse.cpp:755 msgid "Select All" msgstr "Select All" -#: mouse.cpp:761 +#: mouse.cpp:760 msgid "Paste" msgstr "Paste" -#: mouse.cpp:763 +#: mouse.cpp:762 msgid "Paste Transformed..." msgstr "Paste Transformed..." -#: mouse.cpp:768 +#: mouse.cpp:767 msgid "Delete" msgstr "Delete" -#: mouse.cpp:771 +#: mouse.cpp:770 msgid "Unselect All" msgstr "Unselect All" -#: mouse.cpp:778 +#: mouse.cpp:777 msgid "Unselect Hovered" msgstr "Unselect Hovered" -#: mouse.cpp:787 +#: mouse.cpp:786 msgid "Zoom to Fit" msgstr "Zoom to Fit" -#: mouse.cpp:989 mouse.cpp:1276 +#: mouse.cpp:988 mouse.cpp:1275 msgid "click next point of line, or press Esc" msgstr "click next point of line, or press Esc" -#: mouse.cpp:995 +#: mouse.cpp:994 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1514,15 +1518,15 @@ msgstr "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1029 +#: mouse.cpp:1028 msgid "click to place other corner of rectangle" msgstr "click to place other corner of rectangle" -#: mouse.cpp:1049 +#: mouse.cpp:1048 msgid "click to set radius" msgstr "click to set radius" -#: mouse.cpp:1054 +#: mouse.cpp:1053 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1530,21 +1534,21 @@ msgstr "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1073 +#: mouse.cpp:1072 msgid "click to place point" msgstr "click to place point" -#: mouse.cpp:1089 +#: mouse.cpp:1088 msgid "click next point of cubic, or press Esc" msgstr "click next point of cubic, or press Esc" -#: mouse.cpp:1094 +#: mouse.cpp:1093 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Sketching in a workplane already; sketch in 3d before creating new workplane." -#: mouse.cpp:1110 +#: mouse.cpp:1109 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1552,11 +1556,11 @@ msgstr "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1127 +#: mouse.cpp:1126 msgid "click to place bottom right of text" msgstr "click to place bottom right of text" -#: mouse.cpp:1133 +#: mouse.cpp:1132 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1564,7 +1568,7 @@ msgstr "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1160 +#: mouse.cpp:1159 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NEW COMMENT -- DOUBLE-CLICK TO EDIT" @@ -1653,33 +1657,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 +#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 msgid "untitled" msgstr "untitled" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1573 +#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1582 msgctxt "title" msgid "Save File" msgstr "Save File" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1575 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1584 msgctxt "title" msgid "Open File" msgstr "Open File" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 +#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 msgctxt "button" msgid "_Cancel" msgstr "_Cancel" -#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 +#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 msgctxt "button" msgid "_Save" msgstr "_Save" -#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 +#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 msgctxt "button" msgid "_Open" msgstr "_Open" diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index 784b96102..50c302012 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 19:54+0200\n" +"POT-Creation-Date: 2021-02-01 15:45+0200\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" @@ -616,7 +616,11 @@ msgctxt "group-name" msgid "#references" msgstr "#références" -#: file.cpp:549 +#: file.cpp:552 +msgid "The file is empty. It may be corrupt." +msgstr "" + +#: file.cpp:557 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -624,18 +628,18 @@ msgstr "" "Données non reconnues dans le fichier. Ce fichier peut être corrompu ou " "depuis une version plus récente du programme." -#: file.cpp:859 +#: file.cpp:867 msgctxt "title" msgid "Missing File" msgstr "Fichier manquant" -#: file.cpp:860 +#: file.cpp:868 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "" -#: file.cpp:862 +#: file.cpp:870 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -644,17 +648,17 @@ msgid "" "permanently removed." msgstr "" -#: file.cpp:865 +#: file.cpp:873 msgctxt "button" msgid "&Yes" msgstr "" -#: file.cpp:867 +#: file.cpp:875 msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1422,104 +1426,104 @@ msgstr "" msgid "Can't split; no intersection found." msgstr "Impossible de diviser; pas d'intersection trouvée." -#: mouse.cpp:560 +#: mouse.cpp:559 msgid "Assign to Style" msgstr "Appliquer au style" -#: mouse.cpp:576 +#: mouse.cpp:575 msgid "No Style" msgstr "Pas de style" -#: mouse.cpp:579 +#: mouse.cpp:578 msgid "Newly Created Custom Style..." msgstr "Style personnalisé nouvellement créé ..." -#: mouse.cpp:586 +#: mouse.cpp:585 msgid "Group Info" msgstr "Info Groupe" -#: mouse.cpp:606 +#: mouse.cpp:605 msgid "Style Info" msgstr "Info Style" -#: mouse.cpp:626 +#: mouse.cpp:625 msgid "Select Edge Chain" msgstr "Sélection Chaîne d'arêtes" -#: mouse.cpp:632 +#: mouse.cpp:631 msgid "Toggle Reference Dimension" msgstr "Basculer cote maîtresse / cote indicative" -#: mouse.cpp:638 +#: mouse.cpp:637 msgid "Other Supplementary Angle" msgstr "Autre angle supplémentaire" -#: mouse.cpp:643 +#: mouse.cpp:642 msgid "Snap to Grid" msgstr "Accrocher à la grille" -#: mouse.cpp:652 +#: mouse.cpp:651 msgid "Remove Spline Point" msgstr "Effacer le point de la Spline" -#: mouse.cpp:687 +#: mouse.cpp:686 msgid "Add Spline Point" msgstr "Ajouter un point à la Spline" -#: mouse.cpp:691 +#: mouse.cpp:690 msgid "Cannot add spline point: maximum number of points reached." msgstr "" "Impossible d'ajouter le point spline: nombre maximum de points atteints." -#: mouse.cpp:716 +#: mouse.cpp:715 msgid "Toggle Construction" msgstr "Basculer en mode \"construction\"." -#: mouse.cpp:731 +#: mouse.cpp:730 msgid "Delete Point-Coincident Constraint" msgstr "Effacer la contraint Point-Coïncident" -#: mouse.cpp:750 +#: mouse.cpp:749 msgid "Cut" msgstr "Couper" -#: mouse.cpp:752 +#: mouse.cpp:751 msgid "Copy" msgstr "Copier" -#: mouse.cpp:756 +#: mouse.cpp:755 msgid "Select All" msgstr "Sélectionner tout" -#: mouse.cpp:761 +#: mouse.cpp:760 msgid "Paste" msgstr "Coller" -#: mouse.cpp:763 +#: mouse.cpp:762 msgid "Paste Transformed..." msgstr "Coller transformé..." -#: mouse.cpp:768 +#: mouse.cpp:767 msgid "Delete" msgstr "Effacer" -#: mouse.cpp:771 +#: mouse.cpp:770 msgid "Unselect All" msgstr "Désélectionner tout" -#: mouse.cpp:778 +#: mouse.cpp:777 msgid "Unselect Hovered" msgstr "Désélectionner survolé" -#: mouse.cpp:787 +#: mouse.cpp:786 msgid "Zoom to Fit" msgstr "Zoom pour ajuster" -#: mouse.cpp:989 mouse.cpp:1276 +#: mouse.cpp:988 mouse.cpp:1275 msgid "click next point of line, or press Esc" msgstr "cliquez pou le prochain point de ligne or appuyez sur Esc" -#: mouse.cpp:995 +#: mouse.cpp:994 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1527,15 +1531,15 @@ msgstr "" "Impossible de dessiner un rectangle en 3d; D'abord, activez un plan de " "travail avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1029 +#: mouse.cpp:1028 msgid "click to place other corner of rectangle" msgstr "cliquez pour placer un autre coin de rectangle" -#: mouse.cpp:1049 +#: mouse.cpp:1048 msgid "click to set radius" msgstr "cliquez pour ajuster le rayon" -#: mouse.cpp:1054 +#: mouse.cpp:1053 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1543,22 +1547,22 @@ msgstr "" "Ne peut pas dessiner l'arc en 3d; D'abord, activez un plan de travail avec " "\"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1073 +#: mouse.cpp:1072 msgid "click to place point" msgstr "cliquez pour placer un point" -#: mouse.cpp:1089 +#: mouse.cpp:1088 msgid "click next point of cubic, or press Esc" msgstr "cliquez le prochain point cubique ou appuyez sur Esc" -#: mouse.cpp:1094 +#: mouse.cpp:1093 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Vous dessinez déjà dans un plan de travail; Sélectionner \"Dessiner en 3d\" " "avant de créer un nouveau plan de travail." -#: mouse.cpp:1110 +#: mouse.cpp:1109 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1566,11 +1570,11 @@ msgstr "" "Impossible de dessiner du texte en 3d; D'abord, activer un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1127 +#: mouse.cpp:1126 msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1133 +#: mouse.cpp:1132 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1578,7 +1582,7 @@ msgstr "" "Impossible de dessiner l'image en 3d; D'abord, activez un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1160 +#: mouse.cpp:1159 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "NOUVEAU COMMENTAIRE - DOUBLE-CLIQUE POUR EDITER" @@ -1667,33 +1671,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 +#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 msgid "untitled" msgstr "sans nom" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1573 +#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1582 msgctxt "title" msgid "Save File" msgstr "Sauver fichier" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1575 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1584 msgctxt "title" msgid "Open File" msgstr "Ouvrir Fichier" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 +#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 msgctxt "button" msgid "_Cancel" msgstr "_Annuler" -#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 +#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 msgctxt "button" msgid "_Save" msgstr "_Sauver" -#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 +#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 msgctxt "button" msgid "_Open" msgstr "" diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index d43772461..42a3fa3a6 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 19:54+0200\n" +"POT-Creation-Date: 2021-02-01 15:45+0200\n" "PO-Revision-Date: 2021-01-22 18:50+0700\n" "Last-Translator: evilspirit@evilspirit.org\n" "Language-Team: EvilSpirit\n" @@ -615,7 +615,11 @@ msgctxt "group-name" msgid "#references" msgstr "система-координат" -#: file.cpp:549 +#: file.cpp:552 +msgid "The file is empty. It may be corrupt." +msgstr "Файл пуст. Возможно он поврежден." + +#: file.cpp:557 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -623,18 +627,18 @@ msgstr "" "Некоторые данные из этого файла не распознаны. Возможно, файл поврежден или " "создан в более новой версии программы" -#: file.cpp:859 +#: file.cpp:867 msgctxt "title" msgid "Missing File" msgstr "Файл Отсутствует" -#: file.cpp:860 +#: file.cpp:868 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "Связанный файл “%s” отсутствует." -#: file.cpp:862 +#: file.cpp:870 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -646,17 +650,17 @@ msgstr "" "Если вы ответите \"Нет\", то вся геометрия, которая зависит от " "отсутствующего файла будет удалена." -#: file.cpp:865 +#: file.cpp:873 msgctxt "button" msgid "&Yes" msgstr "Да" -#: file.cpp:867 +#: file.cpp:875 msgctxt "button" msgid "&No" msgstr "Нет" -#: file.cpp:869 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "Отменить" @@ -1462,159 +1466,159 @@ msgstr "" msgid "Can't split; no intersection found." msgstr "Невозможно разделить пересекаемые примитивы: пересечений нет." -#: mouse.cpp:560 +#: mouse.cpp:559 msgid "Assign to Style" msgstr "Применить Стиль" -#: mouse.cpp:576 +#: mouse.cpp:575 msgid "No Style" msgstr "Стиль по Умолчанию" -#: mouse.cpp:579 +#: mouse.cpp:578 msgid "Newly Created Custom Style..." msgstr "Создать Новый Стиль..." -#: mouse.cpp:586 +#: mouse.cpp:585 msgid "Group Info" msgstr "Настройки Группы" -#: mouse.cpp:606 +#: mouse.cpp:605 msgid "Style Info" msgstr "Настройки Стиля" -#: mouse.cpp:626 +#: mouse.cpp:625 msgid "Select Edge Chain" msgstr "Выделить Последовательность Примитивов" -#: mouse.cpp:632 +#: mouse.cpp:631 msgid "Toggle Reference Dimension" msgstr "Переключить Режим Размера Для Справок" -#: mouse.cpp:638 +#: mouse.cpp:637 msgid "Other Supplementary Angle" msgstr "Переключить Смежный Угол" -#: mouse.cpp:643 +#: mouse.cpp:642 msgid "Snap to Grid" msgstr "Привязать к Сетке" -#: mouse.cpp:652 +#: mouse.cpp:651 msgid "Remove Spline Point" msgstr "Удалить Точку Сплайна" -#: mouse.cpp:687 +#: mouse.cpp:686 msgid "Add Spline Point" msgstr "Добавить Точку Сплайна" -#: mouse.cpp:691 +#: mouse.cpp:690 msgid "Cannot add spline point: maximum number of points reached." msgstr "" "Невозможно добавить точку сплайна: достигнуто ограничение максимального " "количества точек для сплайна." -#: mouse.cpp:716 +#: mouse.cpp:715 msgid "Toggle Construction" msgstr "Переключить Режим 'Дополнительные Построения'." -#: mouse.cpp:731 +#: mouse.cpp:730 msgid "Delete Point-Coincident Constraint" msgstr "Удалить Ограничение Совпадения Точек" -#: mouse.cpp:750 +#: mouse.cpp:749 msgid "Cut" msgstr "Вырезать" -#: mouse.cpp:752 +#: mouse.cpp:751 msgid "Copy" msgstr "Копировать" -#: mouse.cpp:756 +#: mouse.cpp:755 msgid "Select All" msgstr "Выделить Все" -#: mouse.cpp:761 +#: mouse.cpp:760 msgid "Paste" msgstr "Вставить" -#: mouse.cpp:763 +#: mouse.cpp:762 msgid "Paste Transformed..." msgstr "Вставить с Трансформацией..." -#: mouse.cpp:768 +#: mouse.cpp:767 msgid "Delete" msgstr "Удалить" -#: mouse.cpp:771 +#: mouse.cpp:770 msgid "Unselect All" msgstr "Сбросить Выделение" -#: mouse.cpp:778 +#: mouse.cpp:777 msgid "Unselect Hovered" msgstr "Снять Выделение с Выбранного" -#: mouse.cpp:787 +#: mouse.cpp:786 msgid "Zoom to Fit" msgstr "Показать Все" -#: mouse.cpp:989 mouse.cpp:1276 +#: mouse.cpp:988 mouse.cpp:1275 msgid "click next point of line, or press Esc" msgstr "кликните мышью там, где хотите расположить следующую точку" -#: mouse.cpp:995 +#: mouse.cpp:994 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" "Невозможно начертить прямоугольник, когда рабочая плоскость не активна." -#: mouse.cpp:1029 +#: mouse.cpp:1028 msgid "click to place other corner of rectangle" msgstr "кликните мышью там, где хотите расположить другой угол прямоугольника" -#: mouse.cpp:1049 +#: mouse.cpp:1048 msgid "click to set radius" msgstr "кликните, чтобы задать радиус" -#: mouse.cpp:1054 +#: mouse.cpp:1053 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать дугу, когда нет активной рабочей плоскости." -#: mouse.cpp:1073 +#: mouse.cpp:1072 msgid "click to place point" msgstr "кликните мышью там, где хотите создать точку" -#: mouse.cpp:1089 +#: mouse.cpp:1088 msgid "click next point of cubic, or press Esc" msgstr "" "кликните мышью там, где хотите создать следующую точку сплайна или нажмите " "Esc для завершения операции." -#: mouse.cpp:1094 +#: mouse.cpp:1093 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Рабочая плоскость уже активна. Перейдите в режим 3d перед созданием новой " "рабочей плоскости." -#: mouse.cpp:1110 +#: mouse.cpp:1109 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать текст, когда нет активной рабочей плоскости." -#: mouse.cpp:1127 +#: mouse.cpp:1126 msgid "click to place bottom right of text" msgstr "кликните, чтобы расположить правый нижний угол текста" -#: mouse.cpp:1133 +#: mouse.cpp:1132 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать изображение. Активируйте рабочую плоскость." -#: mouse.cpp:1160 +#: mouse.cpp:1159 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "КОММЕНТАРИЙ -- ДВОЙНОЙ ЩЕЛЧОК ДЛЯ РЕДАКТИРОВАНИЯ" @@ -1703,33 +1707,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "CSV файлы (значения, разделенные запятой)" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 +#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 msgid "untitled" msgstr "без имени" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1573 +#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1582 msgctxt "title" msgid "Save File" msgstr "Сохранить Файл" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1575 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1584 msgctxt "title" msgid "Open File" msgstr "Открыть Файл" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 +#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 msgctxt "button" msgid "_Cancel" msgstr "Отменить" -#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 +#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 msgctxt "button" msgid "_Save" msgstr "Сохранить" -#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 +#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 msgctxt "button" msgid "_Open" msgstr "_Открыть" diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index 1f2a2101e..86ce77b46 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 19:54+0200\n" +"POT-Creation-Date: 2021-02-01 15:45+0200\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: appsoft@ua.fm\n" "Language-Team: OpenOrienteeringUkraine\n" @@ -492,24 +492,28 @@ msgctxt "group-name" msgid "#references" msgstr "" -#: file.cpp:549 +#: file.cpp:552 +msgid "The file is empty. It may be corrupt." +msgstr "" + +#: file.cpp:557 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." msgstr "" -#: file.cpp:859 +#: file.cpp:867 msgctxt "title" msgid "Missing File" msgstr "" -#: file.cpp:860 +#: file.cpp:868 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "" -#: file.cpp:862 +#: file.cpp:870 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -518,17 +522,17 @@ msgid "" "permanently removed." msgstr "" -#: file.cpp:865 +#: file.cpp:873 msgctxt "button" msgid "&Yes" msgstr "" -#: file.cpp:867 +#: file.cpp:875 msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1243,152 +1247,152 @@ msgstr "" msgid "Can't split; no intersection found." msgstr "" -#: mouse.cpp:560 +#: mouse.cpp:559 msgid "Assign to Style" msgstr "Встановити Стиль" -#: mouse.cpp:576 +#: mouse.cpp:575 msgid "No Style" msgstr "Без Стилю" -#: mouse.cpp:579 +#: mouse.cpp:578 msgid "Newly Created Custom Style..." msgstr "Створити Користувацький Стиль..." -#: mouse.cpp:586 +#: mouse.cpp:585 msgid "Group Info" msgstr "Параметри Групи" -#: mouse.cpp:606 +#: mouse.cpp:605 msgid "Style Info" msgstr "Параметри Стилю" -#: mouse.cpp:626 +#: mouse.cpp:625 msgid "Select Edge Chain" msgstr "Виділити Ланцюг Ребер" -#: mouse.cpp:632 +#: mouse.cpp:631 msgid "Toggle Reference Dimension" msgstr "Перемкнути Відносність Розміру" -#: mouse.cpp:638 +#: mouse.cpp:637 msgid "Other Supplementary Angle" msgstr "Інший Суміжний Кут" -#: mouse.cpp:643 +#: mouse.cpp:642 msgid "Snap to Grid" msgstr "Прикріпити до Сітки" -#: mouse.cpp:652 +#: mouse.cpp:651 msgid "Remove Spline Point" msgstr "Видалити Точку Сплайну" -#: mouse.cpp:687 +#: mouse.cpp:686 msgid "Add Spline Point" msgstr "Додати Точку Сплайну" -#: mouse.cpp:691 +#: mouse.cpp:690 msgid "Cannot add spline point: maximum number of points reached." msgstr "" -#: mouse.cpp:716 +#: mouse.cpp:715 msgid "Toggle Construction" msgstr "Пермкнути Конструктивність" -#: mouse.cpp:731 +#: mouse.cpp:730 msgid "Delete Point-Coincident Constraint" msgstr "Роз'єднати З'єднання Точок" -#: mouse.cpp:750 +#: mouse.cpp:749 msgid "Cut" msgstr "Вирізати" -#: mouse.cpp:752 +#: mouse.cpp:751 msgid "Copy" msgstr "Копіювати" -#: mouse.cpp:756 +#: mouse.cpp:755 msgid "Select All" msgstr "Виділити Усе" -#: mouse.cpp:761 +#: mouse.cpp:760 msgid "Paste" msgstr "Вставити" -#: mouse.cpp:763 +#: mouse.cpp:762 msgid "Paste Transformed..." msgstr "Вставити Трансформованим..." -#: mouse.cpp:768 +#: mouse.cpp:767 msgid "Delete" msgstr "Видалити" -#: mouse.cpp:771 +#: mouse.cpp:770 msgid "Unselect All" msgstr "Зняти Виділення з Усього" -#: mouse.cpp:778 +#: mouse.cpp:777 msgid "Unselect Hovered" msgstr "Зняти Виділення з Наведеного" -#: mouse.cpp:787 +#: mouse.cpp:786 msgid "Zoom to Fit" msgstr "Умістити на Екрані" -#: mouse.cpp:989 mouse.cpp:1276 +#: mouse.cpp:988 mouse.cpp:1275 msgid "click next point of line, or press Esc" msgstr "" -#: mouse.cpp:995 +#: mouse.cpp:994 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1029 +#: mouse.cpp:1028 msgid "click to place other corner of rectangle" msgstr "" -#: mouse.cpp:1049 +#: mouse.cpp:1048 msgid "click to set radius" msgstr "" -#: mouse.cpp:1054 +#: mouse.cpp:1053 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1073 +#: mouse.cpp:1072 msgid "click to place point" msgstr "" -#: mouse.cpp:1089 +#: mouse.cpp:1088 msgid "click next point of cubic, or press Esc" msgstr "" -#: mouse.cpp:1094 +#: mouse.cpp:1093 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" -#: mouse.cpp:1110 +#: mouse.cpp:1109 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1127 +#: mouse.cpp:1126 msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1133 +#: mouse.cpp:1132 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1160 +#: mouse.cpp:1159 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" @@ -1477,33 +1481,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 +#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 msgid "untitled" msgstr "" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1573 +#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1582 msgctxt "title" msgid "Save File" msgstr "" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1575 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1584 msgctxt "title" msgid "Open File" msgstr "" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 +#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 msgctxt "button" msgid "_Cancel" msgstr "" -#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 +#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 msgctxt "button" msgid "_Save" msgstr "" -#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 +#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 msgctxt "button" msgid "_Open" msgstr "" diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index 245b452a0..1c2ce7f68 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 19:54+0200\n" +"POT-Creation-Date: 2021-02-01 15:45+0200\n" "PO-Revision-Date: 2020-09-28 12:42+0800\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" @@ -570,24 +570,28 @@ msgctxt "group-name" msgid "#references" msgstr "#参考" -#: file.cpp:549 +#: file.cpp:552 +msgid "The file is empty. It may be corrupt." +msgstr "" + +#: file.cpp:557 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." msgstr "未识别文件内数据。该文件可能损坏,或使用新版本应用程序尝试打开。" -#: file.cpp:859 +#: file.cpp:867 msgctxt "title" msgid "Missing File" msgstr "文件丢失" -#: file.cpp:860 +#: file.cpp:868 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "连接的文件不存在:\"%s\"。" -#: file.cpp:862 +#: file.cpp:870 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -596,17 +600,17 @@ msgid "" "permanently removed." msgstr "您是否想手工查找?如果是,所有基于该丢失文件的几何对象将会被全部删除." -#: file.cpp:865 +#: file.cpp:873 msgctxt "button" msgid "&Yes" msgstr "是(&Y)" -#: file.cpp:867 +#: file.cpp:875 msgctxt "button" msgid "&No" msgstr "否(&N)" -#: file.cpp:869 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "取消(&C)" @@ -1330,152 +1334,152 @@ msgstr "" msgid "Can't split; no intersection found." msgstr "无法拆分;未发现较差点。" -#: mouse.cpp:560 +#: mouse.cpp:559 msgid "Assign to Style" msgstr "指定样式" -#: mouse.cpp:576 +#: mouse.cpp:575 msgid "No Style" msgstr "无样式" -#: mouse.cpp:579 +#: mouse.cpp:578 msgid "Newly Created Custom Style..." msgstr "新组样式。" -#: mouse.cpp:586 +#: mouse.cpp:585 msgid "Group Info" msgstr "组信息" -#: mouse.cpp:606 +#: mouse.cpp:605 msgid "Style Info" msgstr "样式信息" -#: mouse.cpp:626 +#: mouse.cpp:625 msgid "Select Edge Chain" msgstr "选择边缘链" -#: mouse.cpp:632 +#: mouse.cpp:631 msgid "Toggle Reference Dimension" msgstr "切换参考标注" -#: mouse.cpp:638 +#: mouse.cpp:637 msgid "Other Supplementary Angle" msgstr "其它补充角度" -#: mouse.cpp:643 +#: mouse.cpp:642 msgid "Snap to Grid" msgstr "捕捉至轴网" -#: mouse.cpp:652 +#: mouse.cpp:651 msgid "Remove Spline Point" msgstr "删除样条线的点" -#: mouse.cpp:687 +#: mouse.cpp:686 msgid "Add Spline Point" msgstr "增加样条线的点" -#: mouse.cpp:691 +#: mouse.cpp:690 msgid "Cannot add spline point: maximum number of points reached." msgstr "无法增加样条线点:超过最大限制。" -#: mouse.cpp:716 +#: mouse.cpp:715 msgid "Toggle Construction" msgstr "切换构造" -#: mouse.cpp:731 +#: mouse.cpp:730 msgid "Delete Point-Coincident Constraint" msgstr "删除点一致约束" -#: mouse.cpp:750 +#: mouse.cpp:749 msgid "Cut" msgstr "剪切" -#: mouse.cpp:752 +#: mouse.cpp:751 msgid "Copy" msgstr "复制" -#: mouse.cpp:756 +#: mouse.cpp:755 msgid "Select All" msgstr "全选" -#: mouse.cpp:761 +#: mouse.cpp:760 msgid "Paste" msgstr "粘贴" -#: mouse.cpp:763 +#: mouse.cpp:762 msgid "Paste Transformed..." msgstr "粘贴移动的..." -#: mouse.cpp:768 +#: mouse.cpp:767 msgid "Delete" msgstr "删除" -#: mouse.cpp:771 +#: mouse.cpp:770 msgid "Unselect All" msgstr "取消全选" -#: mouse.cpp:778 +#: mouse.cpp:777 msgid "Unselect Hovered" msgstr "取消覆盖区域的全选" -#: mouse.cpp:787 +#: mouse.cpp:786 msgid "Zoom to Fit" msgstr "自动缩放" -#: mouse.cpp:989 mouse.cpp:1276 +#: mouse.cpp:988 mouse.cpp:1275 msgid "click next point of line, or press Esc" msgstr "点击下一个点或取消(ESC)" -#: mouse.cpp:995 +#: mouse.cpp:994 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在3D内绘制矩形; 首先,激活工作面,草图->在工作面。" -#: mouse.cpp:1029 +#: mouse.cpp:1028 msgid "click to place other corner of rectangle" msgstr "点击放置其它矩形倒角" -#: mouse.cpp:1049 +#: mouse.cpp:1048 msgid "click to set radius" msgstr "点击设置半径" -#: mouse.cpp:1054 +#: mouse.cpp:1053 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在3D空间内绘制弧线,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1073 +#: mouse.cpp:1072 msgid "click to place point" msgstr "点击放置点" -#: mouse.cpp:1089 +#: mouse.cpp:1088 msgid "click next point of cubic, or press Esc" msgstr "点击下一个点或取消(ESC)" -#: mouse.cpp:1094 +#: mouse.cpp:1093 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "已经在工作面绘制;在新建工作面前在三维空间绘制。" -#: mouse.cpp:1110 +#: mouse.cpp:1109 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在三维空间内绘制文字,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1127 +#: mouse.cpp:1126 msgid "click to place bottom right of text" msgstr "点击文字的右下角放置" -#: mouse.cpp:1133 +#: mouse.cpp:1132 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1160 +#: mouse.cpp:1159 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "新备注 - 双击编辑" @@ -1564,33 +1568,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "逗号分隔数据" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 +#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 msgid "untitled" msgstr "未命名" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1573 +#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1582 msgctxt "title" msgid "Save File" msgstr "保存文件" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1575 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1584 msgctxt "title" msgid "Open File" msgstr "打开文件" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 +#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 msgctxt "button" msgid "_Cancel" msgstr "取消_C" -#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 +#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 msgctxt "button" msgid "_Save" msgstr "保存_S" -#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 +#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 msgctxt "button" msgid "_Open" msgstr "打开_O" diff --git a/res/messages.pot b/res/messages.pot index c5ce2b775..534faa40f 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-01-17 19:54+0200\n" +"POT-Creation-Date: 2021-02-01 15:45+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -473,22 +473,26 @@ msgctxt "group-name" msgid "#references" msgstr "" -#: file.cpp:549 +#: file.cpp:552 +msgid "The file is empty. It may be corrupt." +msgstr "" + +#: file.cpp:557 msgid "Unrecognized data in file. This file may be corrupt, or from a newer version of the program." msgstr "" -#: file.cpp:859 +#: file.cpp:867 msgctxt "title" msgid "Missing File" msgstr "" -#: file.cpp:860 +#: file.cpp:868 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." msgstr "" -#: file.cpp:862 +#: file.cpp:870 msgctxt "dialog" msgid "" "Do you want to locate it manually?\n" @@ -496,17 +500,17 @@ msgid "" "If you decline, any geometry that depends on the missing file will be permanently removed." msgstr "" -#: file.cpp:865 +#: file.cpp:873 msgctxt "button" msgid "&Yes" msgstr "" -#: file.cpp:867 +#: file.cpp:875 msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:869 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1214,143 +1218,143 @@ msgstr "" msgid "Can't split; no intersection found." msgstr "" -#: mouse.cpp:560 +#: mouse.cpp:559 msgid "Assign to Style" msgstr "" -#: mouse.cpp:576 +#: mouse.cpp:575 msgid "No Style" msgstr "" -#: mouse.cpp:579 +#: mouse.cpp:578 msgid "Newly Created Custom Style..." msgstr "" -#: mouse.cpp:586 +#: mouse.cpp:585 msgid "Group Info" msgstr "" -#: mouse.cpp:606 +#: mouse.cpp:605 msgid "Style Info" msgstr "" -#: mouse.cpp:626 +#: mouse.cpp:625 msgid "Select Edge Chain" msgstr "" -#: mouse.cpp:632 +#: mouse.cpp:631 msgid "Toggle Reference Dimension" msgstr "" -#: mouse.cpp:638 +#: mouse.cpp:637 msgid "Other Supplementary Angle" msgstr "" -#: mouse.cpp:643 +#: mouse.cpp:642 msgid "Snap to Grid" msgstr "" -#: mouse.cpp:652 +#: mouse.cpp:651 msgid "Remove Spline Point" msgstr "" -#: mouse.cpp:687 +#: mouse.cpp:686 msgid "Add Spline Point" msgstr "" -#: mouse.cpp:691 +#: mouse.cpp:690 msgid "Cannot add spline point: maximum number of points reached." msgstr "" -#: mouse.cpp:716 +#: mouse.cpp:715 msgid "Toggle Construction" msgstr "" -#: mouse.cpp:731 +#: mouse.cpp:730 msgid "Delete Point-Coincident Constraint" msgstr "" -#: mouse.cpp:750 +#: mouse.cpp:749 msgid "Cut" msgstr "" -#: mouse.cpp:752 +#: mouse.cpp:751 msgid "Copy" msgstr "" -#: mouse.cpp:756 +#: mouse.cpp:755 msgid "Select All" msgstr "" -#: mouse.cpp:761 +#: mouse.cpp:760 msgid "Paste" msgstr "" -#: mouse.cpp:763 +#: mouse.cpp:762 msgid "Paste Transformed..." msgstr "" -#: mouse.cpp:768 +#: mouse.cpp:767 msgid "Delete" msgstr "" -#: mouse.cpp:771 +#: mouse.cpp:770 msgid "Unselect All" msgstr "" -#: mouse.cpp:778 +#: mouse.cpp:777 msgid "Unselect Hovered" msgstr "" -#: mouse.cpp:787 +#: mouse.cpp:786 msgid "Zoom to Fit" msgstr "" -#: mouse.cpp:989 mouse.cpp:1276 +#: mouse.cpp:988 mouse.cpp:1275 msgid "click next point of line, or press Esc" msgstr "" -#: mouse.cpp:995 +#: mouse.cpp:994 msgid "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1029 +#: mouse.cpp:1028 msgid "click to place other corner of rectangle" msgstr "" -#: mouse.cpp:1049 +#: mouse.cpp:1048 msgid "click to set radius" msgstr "" -#: mouse.cpp:1054 +#: mouse.cpp:1053 msgid "Can't draw arc in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1073 +#: mouse.cpp:1072 msgid "click to place point" msgstr "" -#: mouse.cpp:1089 +#: mouse.cpp:1088 msgid "click next point of cubic, or press Esc" msgstr "" -#: mouse.cpp:1094 +#: mouse.cpp:1093 msgid "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" -#: mouse.cpp:1110 +#: mouse.cpp:1109 msgid "Can't draw text in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1127 +#: mouse.cpp:1126 msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1133 +#: mouse.cpp:1132 msgid "Can't draw image in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1160 +#: mouse.cpp:1159 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" msgstr "" @@ -1439,33 +1443,33 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1321 platform/guimac.mm:1363 platform/guiwin.cpp:1630 +#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 msgid "untitled" msgstr "" -#: platform/guigtk.cpp:1332 platform/guigtk.cpp:1365 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1573 +#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1582 msgctxt "title" msgid "Save File" msgstr "" -#: platform/guigtk.cpp:1333 platform/guigtk.cpp:1366 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1575 +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1584 msgctxt "title" msgid "Open File" msgstr "" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1372 +#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 msgctxt "button" msgid "_Cancel" msgstr "" -#: platform/guigtk.cpp:1337 platform/guigtk.cpp:1370 +#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 msgctxt "button" msgid "_Save" msgstr "" -#: platform/guigtk.cpp:1338 platform/guigtk.cpp:1371 +#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 msgctxt "button" msgid "_Open" msgstr "" From 20df2645d06736b55dd8f48c576036aab4a9f1ef Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Sat, 6 Feb 2021 14:42:27 -0600 Subject: [PATCH 238/646] Update mimalloc to 2.0.0 release. --- extlib/mimalloc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/mimalloc b/extlib/mimalloc index a9686d6ec..276278436 160000 --- a/extlib/mimalloc +++ b/extlib/mimalloc @@ -1 +1 @@ -Subproject commit a9686d6ecf00e4467e772f7c0b4ef76a15f325f6 +Subproject commit 27627843648ef84aee1621976f25bee5946e6bda From 4f2b321fd6113978e6731d81798fb80108d45491 Mon Sep 17 00:00:00 2001 From: robnee Date: Sun, 7 Feb 2021 09:20:57 -0500 Subject: [PATCH 239/646] mark group dirty when toggling reference dimension --- src/describescreen.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/describescreen.cpp b/src/describescreen.cpp index 17f736127..03fafee19 100644 --- a/src/describescreen.cpp +++ b/src/describescreen.cpp @@ -47,6 +47,7 @@ void TextWindow::ScreenConstraintToggleReference(int link, uint32_t v) { SS.UndoRemember(); c->reference = !c->reference; + SS.MarkGroupDirty(c->group); SS.ScheduleShowTW(); } From d0eaebe1fe097cd7f3fd183e663301f176494bd6 Mon Sep 17 00:00:00 2001 From: robnee Date: Sun, 7 Feb 2021 11:54:24 -0500 Subject: [PATCH 240/646] remember auto-removed constraints for undo --- src/constraint.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/constraint.cpp b/src/constraint.cpp index 2acc21156..938317318 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -417,8 +417,11 @@ void Constraint::MenuConstrain(Command id) { c.ptA = gs.point[0]; // If a point is at-midpoint, then no reason to also constrain - // it on-line; so auto-remove that. + // it on-line; so auto-remove that. Handle as one undo group. + SS.UndoRemember(); DeleteAllConstraintsFor(Type::PT_ON_LINE, c.entityA, c.ptA); + AddConstraint(&c, /*rememberForUndo=*/false); + break; } else if(gs.lineSegments == 1 && gs.workplanes == 1 && gs.n == 2) { c.type = Type::AT_MIDPOINT; int i = SK.GetEntity(gs.entity[0])->IsWorkplane() ? 1 : 0; @@ -493,6 +496,7 @@ void Constraint::MenuConstrain(Command id) { "(symmetric about workplane)\n")); return; } + // We may remove constraints so remember manually if(c.entityA == Entity::NO_ENTITY) { // Horizontal / vertical symmetry, implicit symmetry plane // normal to the workplane @@ -514,10 +518,14 @@ void Constraint::MenuConstrain(Command id) { if(gs.lineSegments == 1) { // If this line segment is already constrained horiz or // vert, then auto-remove that redundant constraint. + // Handle as one undo group. + SS.UndoRemember(); DeleteAllConstraintsFor(Type::HORIZONTAL, (gs.entity[0]), Entity::NO_ENTITY); DeleteAllConstraintsFor(Type::VERTICAL, (gs.entity[0]), Entity::NO_ENTITY); + AddConstraint(&c, /*rememberForUndo=*/false); + break; } } AddConstraint(&c); From e0f535eda1bcf8936a54b965dbea9ffea17ce9cd Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 17 Feb 2021 16:21:22 +0200 Subject: [PATCH 241/646] Win32: If the main or text window is off-screen make it visible... ...by 1/40th of the scrreen width so that the user can notice it. This can happen if the window was on a second monitor, which is disconnected, or if the user knows about `Alt-Space | Move` and then moving the window with the arrow keys. Before this, if for example the left edge was off-screen it was moved to 1920, which is just off-screen, so the window remained invisible. Fixes: #938 --- src/platform/guiwin.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index d88519589..ec588e62f 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -142,7 +142,18 @@ static std::string NegateMnemonics(const std::string &label) { return newLabel; } -static int Clamp(int x, int a, int b) { +static int Clamp(int x, int a, int b, int brda, int brdb) { + // If we are outside of an edge of the monitor + // and a "border" is requested "move in" from that edge + // by "b/brdX" (the "b" parameter is the resolution) + if((x <= a) && (brda)) { + a += b / brda; // yes "b/brda" since b is the size + } + + if(((x >= b) && brdb)) { + b -= b / brdb; + } + return max(a, min(x, b)); } @@ -1218,11 +1229,14 @@ class WindowImplWin32 final : public Window { sscheck(GetMonitorInfo(MonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST), &mi)); // If it somehow ended up off-screen, then put it back. + // and make it visible by at least this portion of the scrren + const LONG movein = 40; + RECT mrc = mi.rcMonitor; - rc.left = Clamp(rc.left, mrc.left, mrc.right); - rc.right = Clamp(rc.right, mrc.left, mrc.right); - rc.top = Clamp(rc.top, mrc.top, mrc.bottom); - rc.bottom = Clamp(rc.bottom, mrc.top, mrc.bottom); + rc.left = Clamp(rc.left, mrc.left, mrc.right, 0, movein); + rc.right = Clamp(rc.right, mrc.left, mrc.right, movein, 0); + rc.top = Clamp(rc.top, mrc.top, mrc.bottom, 0, movein); + rc.bottom = Clamp(rc.bottom, mrc.top, mrc.bottom, movein, 0); // And make sure the minimum size is respected. (We can freeze a size smaller // than minimum size if the DPI changed between runs.) From 21ab2f27c3b30baf3d6ec695aaf7c51e85f7ab8e Mon Sep 17 00:00:00 2001 From: robnee Date: Sat, 6 Feb 2021 12:37:48 -0500 Subject: [PATCH 242/646] permit construction geometry toggle while drawing --- src/graphicswin.cpp | 14 ++++++++++++++ src/mouse.cpp | 1 + 2 files changed, 15 insertions(+) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 32b4b082e..a7d44f12f 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -1304,6 +1304,20 @@ void GraphicsWindow::MenuRequest(Command id) { break; case Command::CONSTRUCTION: { + // if we are drawing + if(SS.GW.pending.operation == Pending::DRAGGING_NEW_POINT || + SS.GW.pending.operation == Pending::DRAGGING_NEW_LINE_POINT || + SS.GW.pending.operation == Pending::DRAGGING_NEW_ARC_POINT || + SS.GW.pending.operation == Pending::DRAGGING_NEW_CUBIC_POINT || + SS.GW.pending.operation == Pending::DRAGGING_NEW_RADIUS) { + for(auto &hr : SS.GW.pending.requests) { + Request* r = SK.GetRequest(hr); + r->construction = !(r->construction); + SS.MarkGroupDirty(r->group); + } + SS.GW.Invalidate(); + break; + } SS.GW.GroupSelection(); if(SS.GW.gs.entities == 0) { Error(_("No entities are selected. Select entities before " diff --git a/src/mouse.cpp b/src/mouse.cpp index 263211da4..9c0f56ee1 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -1042,6 +1042,7 @@ void GraphicsWindow::MouseLeftDown(double mx, double my, bool shiftDown, bool ct ConstrainPointByHovered(hr.entity(1), &mouse); ClearSuper(); + AddToPending(hr); pending.operation = Pending::DRAGGING_NEW_RADIUS; pending.circle = hr.entity(0); From 4bb2c637da3ea46868a7912851215677fbdc65be Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 25 Feb 2021 16:26:50 +0200 Subject: [PATCH 243/646] Update Changelog --- CHANGELOG.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8447d0ef4..f70812eca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,8 @@ New sketch features: * Property browser now shows amount of degrees of freedom in group list. It also shows a yellow "err" if the sketch has problems (e.g. self intersecting) that would propagate in subsequent groups. + * It is now possible to press "g" to toggle construction on new objects while + they are still being drawn. New constraint features: * When dragging an arc or rectangle point, it will be automatically @@ -47,6 +49,10 @@ New constraint features: would have been redundant with other ones. * New option to open the constraint editor for newly created constraints with a value. + * New "redundant constraint timeout (in ms)" option to prevent UI freeze + when looking for redundant constraints. + * Swap vertical and horizontal constraints when pasting rotated by 90/270 + degrees. New export/import features: * Link IDF circuit boards in an assembly (.emn files) @@ -63,12 +69,17 @@ New export/import features: * VRML (WRL) triangle meshes can now be exported, useful for e.g. [KiCAD](http://kicad.org). * Export 2d section: custom styled entities that lie in the same plane as the exported section are included. + * Added ExportBackgroundColor in configuration for EPS, PDF, and SVG files. + * STEP export includes object colors and transparency. New rendering features: * The "Show/hide hidden lines" button is now a tri-state button that allows showing all lines (on top of shaded mesh), stippling occluded lines or not drawing them at all. * The "Show/hide outlines" button is now independent from "Show/hide edges". + * "View | Darken Inactive Solids" added. When turned off and a "sketch in plane" + group is active solids form previous groups will not be "darkened" (have the + s000d-#def-dim-solid style applied to them). New measurement/analysis features: * New choice for base unit, meters. @@ -85,7 +96,6 @@ New measurement/analysis features: workplane is displayed. Other new features: - * Added ExportBackgroundColor in configuration for EPS, PDF, and SVG files. * Improvements to the text window for selected entities and constraints. * Ambient light source added in text window to allow flat shaded renderings. * New command-line interface, for batch exporting and more. @@ -114,6 +124,7 @@ Other new features: * New cmake build options using -DENABLE_OPENMP=yes and -DENABLE_LTO=yes to enable support for multi-threading and link-time optimization. * "Shift+Scroll" for ten times finer zoom. + * Chinese translation Bugs fixed: * Fixed broken --view options for command line thumbnail image creation. From fb64b93f26e64517a94efee18391b281c2db496f Mon Sep 17 00:00:00 2001 From: Jonathan Westhues Date: Thu, 25 Feb 2021 20:37:18 -0800 Subject: [PATCH 244/646] Clarify ambiguous license terms. The about box has always said "GPLv3 or later", but other references failed to distinguish between "or later" and "only". --- CONTRIBUTING.md | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aee8bb592..5636b39be 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,8 +17,8 @@ so any savefiles should first be archived. Licensing --------------- -SolveSpace is licensed under the GPLv3 and any contributions must be made available -under the terms of that license. +SolveSpace is licensed under the GPLv3 or later and any contributions +must be made available under the terms of that license. Contributing translations ------------------------- diff --git a/README.md b/README.md index a5bb470e9..9b6cb2253 100644 --- a/README.md +++ b/README.md @@ -259,4 +259,4 @@ and debug SolveSpace. License ------- -SolveSpace is distributed under the terms of the [GPL v3 license](COPYING.txt). +SolveSpace is distributed under the terms of the [GPL v3](COPYING.txt) or later. From 558d87c62b4f7ff4244e3677dbe0a66355e82e39 Mon Sep 17 00:00:00 2001 From: robnee Date: Sat, 27 Feb 2021 19:57:58 -0500 Subject: [PATCH 245/646] Fix incorrect styling on svg export export Style::NO_STYLE which was missing styles should be set on export at the SBezierLoop-level vs the SBezierLoopSet-level --- src/export.cpp | 27 ++++++++++++--------------- src/exportvector.cpp | 19 ++++++++++++------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/export.cpp b/src/export.cpp index 970552c60..0bf166f5c 100644 --- a/src/export.cpp +++ b/src/export.cpp @@ -735,25 +735,22 @@ void VectorFileWriter::OutputLinesAndMesh(SBezierLoopSetSet *sblss, SMesh *sm) { if(sblss) { SBezierLoopSet *sbls; for(sbls = sblss->l.First(); sbls; sbls = sblss->l.NextAfter(sbls)) { - SBezierLoop *sbl; - sbl = sbls->l.First(); - if(!sbl) continue; - b = sbl->l.First(); - if(!b || !Style::Exportable(b->auxA)) continue; - - hStyle hs = { (uint32_t)b->auxA }; - Style *stl = Style::Get(hs); - double lineWidth = Style::WidthMm(b->auxA)*s; - RgbaColor strokeRgb = Style::Color(hs, /*forExport=*/true); - RgbaColor fillRgb = Style::FillColor(hs, /*forExport=*/true); - - StartPath(strokeRgb, lineWidth, stl->filled, fillRgb, hs); - for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { + for(SBezierLoop *sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { + b = sbl->l.First(); + if(!b || !Style::Exportable(b->auxA)) continue; + + hStyle hs = { (uint32_t)b->auxA }; + Style *stl = Style::Get(hs); + double lineWidth = Style::WidthMm(b->auxA)*s; + RgbaColor strokeRgb = Style::Color(hs, /*forExport=*/true); + RgbaColor fillRgb = Style::FillColor(hs, /*forExport=*/true); + + StartPath(strokeRgb, lineWidth, stl->filled, fillRgb, hs); for(b = sbl->l.First(); b; b = sbl->l.NextAfter(b)) { Bezier(b); } + FinishPath(strokeRgb, lineWidth, stl->filled, fillRgb, hs); } - FinishPath(strokeRgb, lineWidth, stl->filled, fillRgb, hs); } } FinishAndCloseFile(); diff --git a/src/exportvector.cpp b/src/exportvector.cpp index 4a184abbc..198502c13 100644 --- a/src/exportvector.cpp +++ b/src/exportvector.cpp @@ -1083,17 +1083,16 @@ void SvgFileWriter::StartFile() { double sw = max(ptMax.x - ptMin.x, ptMax.y - ptMin.y) / 1000; fprintf(f, "stroke-width:%f;\r\n", sw); fprintf(f, "}\r\n"); - for(auto &style : SK.style) { - Style *s = &style; - RgbaColor strokeRgb = Style::Color(s->h, /*forExport=*/true); - StipplePattern pattern = Style::PatternType(s->h); - double stippleScale = Style::StippleScaleMm(s->h); + auto export_style = [&](hStyle hs) { + RgbaColor strokeRgb = Style::Color(hs, /*forExport=*/true); + StipplePattern pattern = Style::PatternType(hs); + double stippleScale = Style::StippleScaleMm(hs); - fprintf(f, ".s%x {\r\n", s->h.v); + fprintf(f, ".s%x {\r\n", hs.v); fprintf(f, "stroke:#%02x%02x%02x;\r\n", strokeRgb.red, strokeRgb.green, strokeRgb.blue); // don't know why we have to take a half of the width - fprintf(f, "stroke-width:%f;\r\n", Style::WidthMm(s->h.v) / 2.0); + fprintf(f, "stroke-width:%f;\r\n", Style::WidthMm(hs.v) / 2.0); fprintf(f, "stroke-linecap:round;\r\n"); fprintf(f, "stroke-linejoin:round;\r\n"); std::string patternStr = MakeStipplePattern(pattern, stippleScale, ',', @@ -1103,6 +1102,12 @@ void SvgFileWriter::StartFile() { } fprintf(f, "fill:none;\r\n"); fprintf(f, "}\r\n"); + }; + + export_style({Style::NO_STYLE}); + for(auto &style : SK.style) { + Style *s = &style; + export_style(s->h); } fprintf(f, "]]>\r\n"); } From f9aeb22a5c7239bdc9a144b8c9449adbbc849dd6 Mon Sep 17 00:00:00 2001 From: robnee Date: Sat, 27 Feb 2021 12:52:50 -0500 Subject: [PATCH 246/646] fix problems with ctrl/shift key drag modifiers When dragging points we must always update position and mark them dirty through all code paths. Ensure the ctrl and shift modifier rotation quarternion is always set to something reasonable. separate extraLine tracking code from drag tracking code --- src/mouse.cpp | 56 ++++++++++++++++++++++++--------------------------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/src/mouse.cpp b/src/mouse.cpp index 9c0f56ee1..77b52342d 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -270,15 +270,16 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, return; } + if(pending.operation == Pending::DRAGGING_POINTS && ctrlDown) { + SS.extraLine.ptA = UnProjectPoint(orig.mouseOnButtonDown); + SS.extraLine.ptB = UnProjectPoint(mp); + SS.extraLine.draw = true; + } + // We're currently dragging something; so do that. But if we haven't // painted since the last time we solved, do nothing, because there's // no sense solving a frame and not displaying it. if(!havePainted) { - if(pending.operation == Pending::DRAGGING_POINTS && ctrlDown) { - SS.extraLine.ptA = UnProjectPoint(orig.mouseOnButtonDown); - SS.extraLine.ptB = UnProjectPoint(mp); - SS.extraLine.draw = true; - } return; } @@ -319,20 +320,16 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, // Don't start dragging the position about the normal // until we're a little ways out, to get a reasonable // reference pos - orig.mouse = mp; - break; + qt = Quaternion::IDENTITY; + } else { + double theta = atan2(orig.mouse.y-orig.mouseOnButtonDown.y, + orig.mouse.x-orig.mouseOnButtonDown.x); + theta -= atan2(y-orig.mouseOnButtonDown.y, + x-orig.mouseOnButtonDown.x); + + Vector gn = projRight.Cross(projUp); + qt = Quaternion::From(gn, -theta); } - double theta = atan2(orig.mouse.y-orig.mouseOnButtonDown.y, - orig.mouse.x-orig.mouseOnButtonDown.x); - theta -= atan2(y-orig.mouseOnButtonDown.y, - x-orig.mouseOnButtonDown.x); - - Vector gn = projRight.Cross(projUp); - qt = Quaternion::From(gn, -theta); - - SS.extraLine.draw = true; - SS.extraLine.ptA = UnProjectPoint(orig.mouseOnButtonDown); - SS.extraLine.ptB = UnProjectPoint(mp); } else { double dx = -(x - orig.mouse.x); double dy = -(y - orig.mouse.y); @@ -340,7 +337,6 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, qt = Quaternion::From(projUp, -s*dx).Times( Quaternion::From(projRight, s*dy)); } - orig.mouse = mp; // Now apply this rotation to the points being dragged. List *lhe = &(pending.points); @@ -353,18 +349,18 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, p = qt.Rotate(p); p = p.Plus(SS.extraLine.ptA); e->PointForceTo(p); - SS.MarkGroupDirtyByEntity(e->h); + } else { + UpdateDraggedPoint(*he, x, y); } - continue; + } else { + Quaternion q = e->PointGetQuaternion(); + Vector p = e->PointGetNum(); + q = qt.Times(q); + e->PointForceQuaternionTo(q); + // Let's rotate about the selected point; so fix up the + // translation so that that point didn't move. + e->PointForceTo(p); } - - Quaternion q = e->PointGetQuaternion(); - Vector p = e->PointGetNum(); - q = qt.Times(q); - e->PointForceQuaternionTo(q); - // Let's rotate about the selected point; so fix up the - // translation so that that point didn't move. - e->PointForceTo(p); SS.MarkGroupDirtyByEntity(e->h); } } else { @@ -373,8 +369,8 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, UpdateDraggedPoint(*he, x, y); SS.MarkGroupDirtyByEntity(*he); } - orig.mouse = mp; } + orig.mouse = mp; break; case Pending::DRAGGING_NEW_CUBIC_POINT: { From 5991f5f046a3720ce9d1697a4f052de4f545d27c Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 3 Mar 2021 21:15:12 +0200 Subject: [PATCH 247/646] UI: Show XYZ distance components in the text window for two points When two points are selected in addition to their distance show the X, Y and Z components of it in the text window. Implements #936 --- src/describescreen.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/describescreen.cpp b/src/describescreen.cpp index 03fafee19..2c36d9881 100644 --- a/src/describescreen.cpp +++ b/src/describescreen.cpp @@ -318,8 +318,9 @@ void TextWindow::DescribeSelection() { Printf(true, " at " PT_AS_STR, COSTR(p0)); Vector p1 = SK.GetEntity(gs.point[1])->PointGetNum(); Printf(false, " " PT_AS_STR, COSTR(p1)); - double d = (p1.Minus(p0)).Magnitude(); - Printf(true, " d = %Fi%s", SS.MmToString(d).c_str()); + 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)); } else if(gs.n == 2 && gs.points == 1 && gs.circlesOrArcs == 1) { Entity *ec = SK.GetEntity(gs.entity[0]); if(ec->type == Entity::Type::CIRCLE) { From 5b1206c266e0f3a506f27088221a12e644840752 Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 3 Mar 2021 20:51:56 +0200 Subject: [PATCH 248/646] Fix tangent constraints of curves. This fixes a regression introduced in 96958f466395148ee7f0a252222a2a27e7345c22 (https://github.com/solvespace/solvespace/pull/833.) Three `return` statements got "swallowed" by the newly created functions. (e.g .https://github.com/solvespace/solvespace/commit/96958f466395148ee7f0a252222a2a27e7345c22#diff-49abc03ed071148c0ebae0c64aafb625fa6223135f77aeecdb47dab4cf8b940cL638 ) Because of this it was possible to constrain arcs and cubics tangent to each other or line segments, without them sharing an endpoint. This kind of worked, but always chose the "starting" points of the curves and lines. In the future this can be turned into a feature. See the discussion in #937. --- src/constraint.cpp | 27 ++++++++++++++++++--------- src/sketch.h | 6 +++--- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/constraint.cpp b/src/constraint.cpp index 938317318..435fc3acb 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -127,7 +127,7 @@ hConstraint Constraint::ConstrainCoincident(hEntity ptA, hEntity ptB) { Entity::NO_ENTITY, Entity::NO_ENTITY, /*other=*/false, /*other2=*/false); } -void Constraint::ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *arc) { +bool Constraint::ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *arc) { Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), l1 = SK.GetEntity(line->point[1])->PointGetNum(); Vector a1 = SK.GetEntity(arc->point[1])->PointGetNum(), @@ -140,11 +140,12 @@ void Constraint::ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *ar Error(_("The tangent arc and line segment must share an " "endpoint. Constrain them with Constrain -> " "On Point before constraining tangent.")); - return; + return false; } + return true; } -void Constraint::ConstrainCubicLineTangent(Constraint *c, Entity *line, Entity *cubic) { +bool Constraint::ConstrainCubicLineTangent(Constraint *c, Entity *line, Entity *cubic) { Vector l0 = SK.GetEntity(line->point[0])->PointGetNum(), l1 = SK.GetEntity(line->point[1])->PointGetNum(); Vector as = cubic->CubicGetStartNum(), @@ -158,11 +159,12 @@ void Constraint::ConstrainCubicLineTangent(Constraint *c, Entity *line, Entity * Error(_("The tangent cubic and line segment must share an " "endpoint. Constrain them with Constrain -> " "On Point before constraining tangent.")); - return; + return false; } + return true; } -void Constraint::ConstrainCurveCurveTangent(Constraint *c, Entity *eA, Entity *eB) { +bool Constraint::ConstrainCurveCurveTangent(Constraint *c, Entity *eA, Entity *eB) { Vector as = eA->EndpointStart(), af = eA->EndpointFinish(), bs = eB->EndpointStart(), @@ -183,8 +185,9 @@ void Constraint::ConstrainCurveCurveTangent(Constraint *c, Entity *eA, Entity *e Error(_("The curves must share an endpoint. Constrain them " "with Constrain -> On Point before constraining " "tangent.")); - return; + return false; } + return true; } void Constraint::MenuConstrain(Command id) { @@ -690,7 +693,9 @@ void Constraint::MenuConstrain(Command id) { if(line->type == Entity::Type::ARC_OF_CIRCLE) { swap(line, arc); } - ConstrainArcLineTangent(&c, line, arc); + if(!ConstrainArcLineTangent(&c, line, arc)) { + return; + } c.type = Type::ARC_LINE_TANGENT; c.entityA = arc->h; c.entityB = line->h; @@ -700,7 +705,9 @@ void Constraint::MenuConstrain(Command id) { if(line->type == Entity::Type::CUBIC) { swap(line, cubic); } - ConstrainCubicLineTangent(&c, line, cubic); + if(!ConstrainCubicLineTangent(&c, line, cubic)) { + return; + } c.type = Type::CUBIC_LINE_TANGENT; c.entityA = cubic->h; c.entityB = line->h; @@ -711,7 +718,9 @@ void Constraint::MenuConstrain(Command id) { } Entity *eA = SK.GetEntity(gs.entity[0]), *eB = SK.GetEntity(gs.entity[1]); - ConstrainCurveCurveTangent(&c, eA, eB); + if(!ConstrainCurveCurveTangent(&c, eA, eB)) { + return; + } c.type = Type::CURVE_CURVE_TANGENT; c.entityA = eA->h; c.entityB = eB->h; diff --git a/src/sketch.h b/src/sketch.h index 83773749d..903e638f5 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -790,9 +790,9 @@ class Constraint : public ConstraintBase { static hConstraint TryConstrain(Constraint::Type type, hEntity ptA, hEntity ptB, hEntity entityA, hEntity entityB = Entity::NO_ENTITY, bool other = false, bool other2 = false); - static void ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *arc); - static void ConstrainCubicLineTangent(Constraint *c, Entity *line, Entity *cubic); - static void ConstrainCurveCurveTangent(Constraint *c, Entity *eA, Entity *eB); + static bool ConstrainArcLineTangent(Constraint *c, Entity *line, Entity *arc); + static bool ConstrainCubicLineTangent(Constraint *c, Entity *line, Entity *cubic); + static bool ConstrainCurveCurveTangent(Constraint *c, Entity *eA, Entity *eB); }; class hEquation { From 9281d2638ce50d17340e9b2967c88c6280fb88c7 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 17 Jan 2021 21:56:59 +0200 Subject: [PATCH 249/646] UI: Non anti aliased icons for the graphics and text windows Created by jkrei0 here https://github.com/jkrei0/solvespace Optimized for size. Merged all but `shaded.png` since in my opinion the current one is better. Discussion here https://github.com/solvespace/solvespace/issues/857 --- res/icons/graphics-window/angle.png | Bin 819 -> 258 bytes res/icons/graphics-window/arc.png | Bin 686 -> 221 bytes res/icons/graphics-window/assemble.png | Bin 454 -> 214 bytes res/icons/graphics-window/bezier.png | Bin 710 -> 189 bytes res/icons/graphics-window/circle.png | Bin 801 -> 190 bytes res/icons/graphics-window/construction.png | Bin 739 -> 203 bytes res/icons/graphics-window/equal.png | Bin 920 -> 249 bytes res/icons/graphics-window/extrude.png | Bin 620 -> 207 bytes res/icons/graphics-window/helix.png | Bin 664 -> 243 bytes res/icons/graphics-window/horiz.png | Bin 418 -> 161 bytes res/icons/graphics-window/image.png | Bin 1025 -> 227 bytes res/icons/graphics-window/in3d.png | Bin 512 -> 220 bytes res/icons/graphics-window/lathe.png | Bin 401 -> 245 bytes res/icons/graphics-window/length.png | Bin 480 -> 223 bytes res/icons/graphics-window/line.png | Bin 511 -> 158 bytes res/icons/graphics-window/ontoworkplane.png | Bin 412 -> 160 bytes res/icons/graphics-window/other-supp.png | Bin 916 -> 223 bytes res/icons/graphics-window/parallel.png | Bin 531 -> 165 bytes res/icons/graphics-window/perpendicular.png | Bin 427 -> 214 bytes res/icons/graphics-window/point.png | Bin 394 -> 132 bytes res/icons/graphics-window/pointonx.png | Bin 596 -> 254 bytes res/icons/graphics-window/rectangle.png | Bin 418 -> 159 bytes res/icons/graphics-window/ref.png | Bin 413 -> 176 bytes res/icons/graphics-window/revolve.png | Bin 680 -> 226 bytes res/icons/graphics-window/same-orientation.png | Bin 673 -> 194 bytes res/icons/graphics-window/sketch-in-3d.png | Bin 597 -> 196 bytes res/icons/graphics-window/sketch-in-plane.png | Bin 507 -> 214 bytes res/icons/graphics-window/step-rotate.png | Bin 871 -> 207 bytes res/icons/graphics-window/step-translate.png | Bin 411 -> 171 bytes res/icons/graphics-window/symmetric.png | Bin 515 -> 149 bytes res/icons/graphics-window/tangent-arc.png | Bin 666 -> 211 bytes res/icons/graphics-window/text.png | Bin 784 -> 198 bytes res/icons/graphics-window/trim.png | Bin 575 -> 224 bytes res/icons/graphics-window/vert.png | Bin 515 -> 172 bytes res/icons/text-window/constraint.png | Bin 557 -> 194 bytes res/icons/text-window/construction.png | Bin 739 -> 203 bytes res/icons/text-window/edges.png | Bin 703 -> 285 bytes res/icons/text-window/faces.png | Bin 683 -> 352 bytes res/icons/text-window/mesh.png | Bin 1169 -> 335 bytes res/icons/text-window/normal.png | Bin 639 -> 170 bytes res/icons/text-window/occluded-invisible.png | Bin 345 -> 196 bytes res/icons/text-window/occluded-stippled.png | Bin 539 -> 218 bytes res/icons/text-window/occluded-visible.png | Bin 365 -> 208 bytes res/icons/text-window/outlines.png | Bin 733 -> 289 bytes res/icons/text-window/point.png | Bin 394 -> 132 bytes res/icons/text-window/workplane.png | Bin 462 -> 193 bytes 46 files changed, 0 insertions(+), 0 deletions(-) diff --git a/res/icons/graphics-window/angle.png b/res/icons/graphics-window/angle.png index f70252a937e1bac714ac402019680cd90484b7b6..8b82ba3da047060117606a1b535682569d037374 100644 GIT binary patch delta 241 zcmdnY*2FYHvYv^7fgxXX)p{VsRubeF45Wb|ZyEbUAjMhW5n0T@z%2~Ij105pNB{*F zdAc};Se)J(a$E3#0*CPViM#%@-0iGeva~Do;NqG_eh&_JFGn}u61#H`{iZAyn0k>_ zJ#S)gZL2`O$HiUphUX_2CAAcBr2G25(!TGNl{-(cCo5}7h2TY&b1Sm#T#B0#Kdo22 zJx4k7h=;7X%*^Q$ao=JpS57eupOJOb$WAOE)#S3;>TluqCbK?!FSvhxqwKY{xAG3J m$`ZTww0Mfyuh2bH>$h_^-Hqm}(h2zj@{6adpUXO@geCyU*j-cr literal 819 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpv3@#yNKc?$D7 zr8{%Qay|JyC0HdSB_$8;IcUXW6)G57B3?2_e$H~mE7O|k9pa~Nuq>H8>*EpV&le12FT}w+#TwI(1m%&P<;y!eJAHk9_4W1n`1t0}pWo2XU|?V%ARuu3 z(ma1)P%xGR`2{mLJiCzw;v{*yyD)UH%6b4foCO|{#S9GGLLkg|>2BR0pdfpRr>`sf z0~RqJX^t;bm*xV64tTmahG?8mPB_2}433i%6POqU`Z15?5XQ#h^@Z!mnH%t>5CaueRCpRzdp54Bvx_^u(K8j1ENXt0Y z^gL!@*nW*aFXL6=YoK4mN?apKoQqNuOEUBG6hbm{QyB~m^bJk)4J`83UDO7uPz9+- zNi0dVN(L!QWiT=@G}ARO(KRv(F*LF=FtReX)HX1%GB5}@TWyJ=AvZrIGp!P;!BE%G zBE-Pd%E;Wx&;X*raC^lhpaw;d4Z-3T~N2spa`a*~JPb WdIqo5)JuVi89ZJ6T-G@yGywo*dLy&| diff --git a/res/icons/graphics-window/arc.png b/res/icons/graphics-window/arc.png index 807b7366dfa57d8af5a994b28430fb41a7f74360..98dde3ca8b2d50117fa8ad09a791d69e9ac02436 100644 GIT binary patch delta 204 zcmZ3-dY5s6WIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK$T zdb&7qlzvnBQcj*?JYQ>SFs_ib%(IKB;>ipElB}?j}c$~{E zjZ=0R literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpv1HQpAgso|Nk2p81(n| z@87@w-@ktf3JUx7?fd-s^Ww#egM)*Gg@r{#L}FuOH*enj_3PL8`1ohfo=u-VU0hsz z_Uzd&Uc5+1Nci&QOGrpaTwL6zPoLhrc~ekOFlEY=)vH(Q>+8$P%F4^jzkdC?x3_ow z`t^JF?v0F$Oi4-k^XCu48HTX1uoWv-=;`UbeED+u^5xmt+3(-KPft(({rfjx%-e3D z3mHp-{DK)Ap4~_Tagw~{XE)7O>#0gD)q zG{={zOLKujOFUg1Lp08}UbrdLWWd9E;dGd&i-_Y!t%S8f;xYgJKd)KIqnmanc-G~e zlQ};um%0AA_I|N!vCM{x6+%k0jv0%6d3Lg9;w!V*G*9#M;jizlPnuj`T#@)BZ>L|f zb@oJCW`-$|sgAW8j1DsFyN@$5JjrB8=Vb6*GT%${YQ9u}fRKVdONVyh_1m_pEn8Wx z{BiX7R3jMlVcV-Rqsupbn=`1gDjZzL@BE&h>)_+zl?+mr%3x$*Xr^mmqHAOnVrXP#U}R-%scm3j zWnd6+w%QU!LvDUbW?CgwgQ2dWMTmi^m65rXp#emL;r5D2Kn;o@8-nxGO3D+9QW<;` qlZ*0mQ&Tb%72Gn5Qp@v;vWpc=^bB69sh0v3GkCiCxvXK|KsnWrs%DleAeeKm|a^j*VRMIZG)S= slI%k+5vR6!jS?myn>Zw0-#%bwFq2kSpZ|ErSCIQWUHx3vIVCg!04aJu-~a#s literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8Uop6XN;3=**-JcqUD+S7 zi1A2se3`m57bxWB>Eal|aXmS~fpN`32Y~|zwsCQ&Jy3gGRgj95#FA92WRS8{1|tJQGhG7{T_d9qLnA8# zBP(M|Z36=<1A~CG)s`q4a`RI%(<-4F40R1HLJUl;jLfYJ4Iml}w^vL8YET5(5S*V@ xQl40p%HW%rT$G=inv$8Q;FejGTAp8&U94cDXYfi*y%eaJ!PC{xWt~$(6954MfK>nh diff --git a/res/icons/graphics-window/bezier.png b/res/icons/graphics-window/bezier.png index 9d2c240a471ac4f5277ad1c66291734fdc207a8b..7f4eff1c06d82fd97a7d3fbf5fdb0acad3b6b81c 100644 GIT binary patch delta 172 zcmX@cx|eZ+WIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK$D zdb&7oh+VD4V0D{B)VuDZoK8M>LYoq>Ga1Xq74~r6IabtV_PuADhhlYj<2ng8Q+pk@_cInckxw*OW z^71V$Ez6cI3kV1Z4-enDbElAy(1ZySe0+R*dU_HQ6D=$(wr$%cCMFge8~fzR6JK9n zBO{~h*RNMsSI?h6f60<15)u+TJUlfuHOrSTS5Z-kiHX_0d-vwen@vniPMT4)YM!mEo6b7 zVk`;r3ubV5b|VeMN%D4gVd!9$^#F1>3p^r=85p>QK$!8;-MT+OLG}_)Usv`AEMh#; z9ABm`%>@c|db&7|No1j#zvFU{s38qz6X`hIm`<>l-047cXpE6D|Tzoa|f>+ zGWl@M@$v~Lhli3X+c@o7Lq6YnVBC?_Xq%yS`Qm~z*;jPjG&FBy#9ZN1VPII<9(8b1 S{*2imcX+z`xvX-hQk8yXs3zI=J)$dQ7A0wpCSV`Jm0s;cwn&%b%|roO&j zK|$f{*|QffUNkW=v9Yl^bLPysbLU>YdNpUx9ARPM*|TR)o;-Qs!iA?!oe~idxq0(u zU0t1ngM+81=ZhCF^78UZN=jNlqyzJ2TDodF+}5hYtT)xg9ai#&1PjQBa)VDWZmz+_4B{~ zr4aASGRJFolp9T+J+qzR!*Ue~E_bC(Osaiu7b9#YvM5YFmvB`*)l={NL#K&p_BAVG zKCTVlxLP6T@!wZp{?59U!8U1&i8_BCyK>pC9M&L1n~QIkeQ{Z6zhSmviNEshm>bjH znz1cvP_u8*6z-X+aptM~Gww9L;zb)$3I*d>f0lA?TzHZ9{NlB*d?vrKsHX zgZqswsw^8_dnUJ^_s*)-pPBWhXs_q@bB{YsC!4o)ov~}~J21bB@e!BM#*Nz?-GP1- zD{+k|aV|jD!649rIzOxWfv=$=o!3HQ!fQ7X7F_Nb6Mw< G&;$S&`#8t| diff --git a/res/icons/graphics-window/construction.png b/res/icons/graphics-window/construction.png index 35ddcb274ff9113bfaca088234a5e6c7ac76b1d5..6f48aedefec91ee1c151344e7bdd01d63c000c6a 100644 GIT binary patch delta 186 zcmaFNdYW;9WIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK#2 zd%8G=Se!l^?8tXOfulLq|IvT_7mLfx4l4xQ-O+gILXgWpu~*X#mxVbT<4z6Z30SrM zI@`_*zlx9BW_w*;ak1gqm7Mwaj$glDZ1(or6ywKa8z1`5 iHrj4=hSNR!Q>_hifw;%**e7WqM|ryXxvXMoOIk literal 739 zcmY+BT}abm6vls%VRPw)lud20qSc09|NpkkjR?)nTsoO<(X5NMbk@qXG5@A3FqQQs zVi^>M85Ct?CVfDOP#IX*7k%7h7eQAM(N%P#751*W>EgVHbKd89-simMgu7;QdRk5z zknXIs*NLo2#^QzIe0S~TGm%num$}N|)=Blxz#>uW8Y=5taBvNDCSXpqIzL0J1Yi7M z8-V4}^Aoij#KnDgwbwB}KaU9xixPz51L%Nz5C=gjgf@5tBajO@Fbvrs^e5o}904=D z0HOFCmVq9sgabGY(~u8O;VKy6228;**a)T23lXru9vFh-uuWKmW;g}iQ1fSEyYLT3 z#Uvm;VGCS_N~pk5+Wt!nvOuY;@lg6{rYTwMs@iPl_#&-9po&)3w}3h`84KQi==dp` zsfyF(Nd1_SwIp}(_cK?*qIKJ8FY_8+HTZRC&JEQ2&S~VS_cPX#?D6sV!0X5H*-6Vo za!0IRyWM9`Nj;(FRncKXPgawxTUl6`v0Crz*RQ_vG4pNybmnMpRF%C{+k87ZyrM_j z`%T(rG+dhNcRF*b^RC~#_`|)`HMFzb)1Pi0o$=}G-)mF}!&H~1)1w|t-0d5?u<>Z3 z>tg?{6UK?{<`#8TUWZb|>k!-M;~LF~@8G diff --git a/res/icons/graphics-window/equal.png b/res/icons/graphics-window/equal.png index 6037aed0f7c5cf33748e6540cd399a340777ae7a..ba9053aad7bc5a68b1f2b43109f4e1cad9e4d17b 100644 GIT binary patch delta 232 zcmbQi{*!TnWIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK$L z^mK6yu{eEpiZ@?_0*{MzuluKe>KBZAxs}Cq;(0f6J1^Mdb3AC`epavc+gl@EEBy7E zcur$>%8xpRs?%P2;gME{=XSY0RM03|>#*=cqK)2d$4$Q71_H&LbKgFG7^UJJe%j`8 z$-Q`a&u_PvC+s=dewXz@(*)`0w1k&4nA2~ZRc+X){98)kYB~3Pp$m`ef|QT0zt#7E d<4L-IA9LBJ;_zry&$l2ic)I$ztaD0e0s!d#S^oe4 literal 920 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZk1_nm=0G|-o|Ns9poM8|V z5fKs+`uOolWeRu8JrJ|yutE>Cu$&;9vm}%3d)zs9? zpFf|6hiAiv4Q6I$%a$$6$;k;848Ejw$=lm|?%cVnR;@BJGOCcMIHG<;l2y`y*Wrxj znL5cjBQ7I%clXqw)EB8QX3Ni(W0NZuFWzsl|8eZ&45>RJLV`W}ZHM+Re>PLqp^7g&R)ED@tHGc zczJo(tXY$ro7>XT^56KsxVZSun>R&8MOUm?abEMh0hd8iQc_=E-+JZs(bCZh3JMMm z4xyo;d3kxWX3a7%FbD_;NJvPiudiRfe*OOa`|sbs|9#^3O`A4#b#+x&SI5T2oYh7ML)4U=mE9R)O1bei-Owb+&&QI(KTSvuj!(o_YL z^=szrX;KOa@Qic~4dXo(c>O|1i}v+P*DhYY%x=uf)5|h3*TBrs)R^5+M@Mqa8o@_q z+jw}&4Epx2VU9U;k@M*4a|U9|yR|p9bj-G%qWXj}wZch5KVRD5?c;3bsUJSOcQ!US z%usYZsJJlkp_8Bhr-G!UsO(`WY4Q0J1mvgBm@l;{JKKy$gP=zW; zMM`2xs#P*bSt^5(fuWhMfr+k>QHY_Dm4T6!v8A?wffX>?&Q@EZXvob^$xN$+YB1C_ zv#EgCMt&=_8V(1q zJKt-=_qbzH{$o`yMpu#Mrmm+lecw;#X1QE3pZi6+Xt~*3`CnX9zE5jDReQR!(}=V5 kmV98>I@79<+UV{6OgnzZCo9aIvKQnqPgg&ebxsLQ0EM$fP5=M^ literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1LNlky{9a886+f`vVkYFY)wsWq-gT#v{$~W$Myg1_nj}PZ!4!i_>?f*y_7DinPsF z-X6hgHnAhqu`}p>qqWKRV-%6PB*}tC zujidE7H`kj_v&kJEfhQU_N+QExWr0aBTAf$QWHxu^Yau!GILWI3=Q;+O!N&bH2GHl z2C7g6sYppINwrD_DNAKAGB7mLH89aNG72#?vNABTGPcwWp< zoYuBfNq5_&sw9RKe%YinH?uC;YtMhbb@}@&T4Bq z4-h9uCq)-2@qbC7MT`f>{djlparX`o>Sd;y9TR}6Sw=Dz6@N3?RWb02Ao|gZF@z;% z>haWK8lL0p9zMR_MR=C?xj#pbk~10L6N%@TZdk+{#50?g&Uv3W#EOzad`>)W&;^Mf zxh}i>#<}3Iz%xTeIyp}qA{Gm6EVnT$8Y=NLaad6`$`>*&E1b7DtK}+d-jlyDnA28L zT&FpV7?u!60)HZ8R8c}179zB2q?kz3e$>N1AOrG<}xzHQ**x~0i`z~v4w z_@qmQCt*%ftWx00v@9M??Tn08ju>#)k{=00009a7bBm000XT000XT0n*)m`~Uy| z2XskIMF->z6#^z7u4LmU0001#NklwJZjK7UgpLJ{HUxjZ6PRag^MMW{jDbkwYiXa_>K!Km(a%DPGY&93uq{&^PDa;QBl z-VD$S$UEtIwyB><-}85Q<+_Hw$rj&BiVU<5g0)REM`;eEs lwJe^eJ)%u4p1)jm0O3%EjL;n=fB*mh07*qoL5_*M}K=a+l&>d+E;m!6i=2b8~3ouC!{1KBv>#%o;hKKw5PI{ q#9wv62Ru1$LI*Q6jjk{!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8Uop6XNRWe9f zDua=Mp_#6MiLQ}Rh@p{{fsvK5rM7{Am4QLP*=kD^4Y~O#nQ4_!4Tidg79j?vRz~Jl zh6WG~hTAJ90W~OsYzWRzD=AMbN@eg(OfJgLO-;#6RB+2IN-fVX$}Uzg(KC3Zrd|qE O%;4$j=d#Wzp$P!j<8{aY diff --git a/res/icons/graphics-window/image.png b/res/icons/graphics-window/image.png index d652d8e77c4297cc57816378acc0b9fa50ac3429..5df953a7c09d2c0a8ea29250747fadbf72e7b89f 100644 GIT binary patch delta 210 zcmZqVc+5CKvYv^7fgxXX)p{VsRubeF45Wb|ZyEbUAjMhW5n0T@z%2~Ij105pNB{+! zJzX3_EKc7IImvrKfv0#)-<7#DI_K^R{%NzDy=gjO z^iIj^o%+Pi3@_$8ch9VHf3|OitqVhYR+iUGZ_6ih+LxAc+B=2@s-`@;=u!VbFq~H< zxm;^G)8iH2vZr)kPTTq?PtR+!u*;5;-{EUc9J_zw*bYVp-l>_N4^9aIIo8wF&t;uc GLK6T)ol#f- delta 1014 zcmVI1qKEN2L}fT2nY!Y2?`1d3kwSj3=9no4Gs z6ciK{6%`g178e&67#J8C85tTH8XFrM92^`S9UUGX9v>ecARr(iAt53nA|oRsBqSsy zB_$>%CMPE+C@3f?DJd!{Dl021EG#T7EiEoCE-x=HFfcGNF)=bSGBYzXG&D3dH8nOi zHa9mnI5;>tIe$4iIyyT$J3Kr*Jv}`>K0ZG`KR`f0K|w)6LPA4BLqtSGMMXtMMn*?R zM@UFWNl8gcN=i#hOH52mO-)TsPEJoxPf$=$QBhG+Qc_b>Q&dz`RaI41R#sP6S6EnB zSy@?HT3TCMTU=aRU0q#XUS3~cUtnNhVPRonVq#-sV}E31WMyS#W@ct*XJ=?=XlZF_ zYHDh0Yin$5Y;A3AZfQa&mHWb8~cbbai!gc6N4mcXxPrczJnwdU|?$ zdwYC*e0_a=etv#`e}900fPsO5f`WpBgM);GgoTBLhK7cRhlhxWh>3}bii(Phi;Ikm zjE#+rj(?7hkB^U#kdTp)k&=>Cc=sHmx_sj8}~tE;Q5tgNlAt*)-F zudlDLu&}YQv9hwVv$M0bw6wLgwYIjlx3{;rxPQ30xw*Q!y1To(yu7@dCU$jHda$;ryf%FD~k%*@Qq&CSlv&d<-!(9qD) z(b3Y<($mw^)YR0~)z#M4*4Nk9*x1lq(=H}<;=jiC@>FMd}>gwz3>+J08?d|RE?(XmJ@9^;O@$vEU^78ZZ z^Yrxe_4W1k_V)Mp_xSku`T6XLo80eow8BrfC7i}!s-A2r&{gU(z-yToiFv%hfgjYT{&E-(rIGcCes=e<(Q5w z4Xrq6I`e_S+NQgz3>%rn1-EzYS$0iiV)FGLuKU@YLIuA0g$7Jprz6h>Wf0VxJ>iXqhZtv|BF8mXy5q4z7ZjdWIUHx3vIVCg!07nx` APXGV_ literal 512 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5l;AAzh%9Dc;1&X5#!GkW z{s0BpOFVsD*&nco@kn!gnYuI=D5M_X6XN>+|9?I{J|Q6?4GoQ?q@_2pFf*}tJl&vJI3t`}!9tRer{LVjlLqG<-#D@|82f8aPdh*R zA<#mx64!_l=c3falFa-(g^eM1v{1B<+M7qx*ZR6#0I5=&C8l0nK+8H@}J z&2$Y+bd8Kc42`S|jI4|;wG9lc3=9I!R$HQI$jwj5Osj-yFw`})2r)3VGBUR^G=OL@ z++HyWs6i2ALvVgtNqJ&XDuZuga#4P6YD#9Jf?H-$YI%N9cCmtqp1~_M^-`c>22WQ% Jmvv4FO#prsoTUH& diff --git a/res/icons/graphics-window/lathe.png b/res/icons/graphics-window/lathe.png index 8cee0583c28f0637c4a6c75a0847e021bb7ee696..02625401d3d75fe219d7f2da0752ed9a367649fb 100644 GIT binary patch delta 209 zcmV;?051QL1N8xr7#j!z0001Q6{@cQ000JbQchC<000000B)uSk&#^(f0ao@K~y-) zLO)E;BJ1pVBs19z?qZTL}^AzUQ2Wgi3zP@v}FaRmcQ# zT&0T-j|2cCy1{V)fThyb9@>tGh)OUsGq>MSmC9@`L7D>)W3;|d@-GSz9aF!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z%2~Ij105p zfJ|pE@$_|Nf50NfBhB$;>e5`G5Kn+lh^w5O-2eaoQ&Us_{P`1m>&*(FI8#ZGUoZnh z+2pepKpta~x4R4DeO=K1)orKarasJCedtPZ zX~ERzoQio8_m8}P!yEh9UUL4`J^z4Ksg}4#l%yn}$cBcl*Q vBP$~_DgTe~DWM4fT-A0G diff --git a/res/icons/graphics-window/length.png b/res/icons/graphics-window/length.png index b48715e094ccd65dd166f3fa9a61237624c5f752..552c87c6243f2cb62c39fdf7ecae150caad119ed 100644 GIT binary patch delta 207 zcmaFBe4lZGL_G%+0|P_8=&JQVimfEbFBnJzLEbXk-x2Imb)Xei?>1i7Fl!ogLiv)o_(%vBGs)osD~YvLj1bFVdQ&MBb@ E01hxte*gdg literal 480 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5ln@H=332@o1PuQ_FnkbT z5MVgN0OWmJYUKlzWh@Eu3ubV5b|VeMN%D4gVd!9$^#F1>3p^r=85p>QK$!8;-MT+O zLG}_)Usv`AEMh#;9ABm`%>@cYdAc};NL-$KY9nuh0gubYdLiaJ8yS5LaA&=SqCWC<(x*5oAN@BIr`zuJ2ydwWiNetEF% z@~9cF?p^()V=r_497oo422B~DEn+3E5hcz=sfi_-`FRQ{XE)7O># z0gD)qG{={zOLKujL7py-AsXkmPW0qEV8FrL96U+y=KudU>JHesWYx+n7HkqQOG^9Z z%NVH8R8>&$&hx{YIrI0K_IrQ${czr)?<;$&f33JP-|A^`=kFt$>-y{ESAJrOi(~Ya zF<2-LG+nI3HKN41C^fMpGe1uuBr`Xa!O%e8&_v(BB5&PAZJ-KOkcyPVl2of?kg`+; zBLhP-T>}$cBcl*QBP#^HVa@Dxn$-bqy^-3{0(z%&iO! zAQ}v}S4;wGPz2c!oS#-wo>-L1;G39Sl%JcLl9{OBmRXcqo?nz*tYD&N@Jda+6sVZN M)78&qol`;+0PIO$gn{8}pQz+*^M~Rfi#R-8{an^LB{Ts5FQ+X1 literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5lweBoc6VX;-`;;_Kaj^+ z;1LNlky{9a886+f`vVkYFY)wsWq-gT#v{$~W$Mygppb*7i(`nz>Eu7>9i$SJ0&QPP zMLf{)*>3pgdc!(~_U9Sz+XYuPvi8el`4|XYYEYJ9U$~roA={G#Rjq1czI{$W1IpOV z{urq$0?iUDag8W(E=o--$;{7F2+7P%WiT|*H#E^Vu*h3?Q5&d26{I31u_V) zMJa-7miwe!E}wmQZ#DQ1XtSzrYu^28b=jSF?u&$hW}S*GeAKk))LQNX2kM@ur;E7y zvosv_y?aXM+`6L*=f3ALY`?V6F8k*3ZzuSF`n{g zXWQ7=tX#R0hll6fxpTa{yo(ksa&~rhaBwIqD{F0SJ%0T7#EBC%G&IhiJRdC-T`O7J zF5O-wQROe-FT^6m&(Gh|(z1E;W(y08=Qp2EGM$tpk`yi&o+gquSAOmcxfv?#Djpsl zM~)mREiIirdvsOoHFdh=fJKZ)n&ZpVrMW<%%bqTdArg|U2Q$r? z5*ZpUwx@M?a835ms{U5%?YeY=O4J*X$VdO{O%7X{ygy@k*V|Zk?TpPHGbZ1@Wtjff z;lfG&Xz`{z>sfN{>n~ruZht`jsO<|!Q|KaZIWfq>iV%f4xh4U?GGiSSR z-r%u#>C*?Nv}SEBEwPcF9esO6*&mKKyYoUG+PX~4;JIP%AmZOLsePr1oBMI~nU{6k z(k;(@-f6)mK0QEV+Nq8w+N|sHjkb5ZdnYe9Un}(GPu9J+Uf;G}P~%Zr@=CR?R_wy> zMLY9jXGtCXXi$9-=smF#*N775qSVBa%=|oskj&gv215gVLlb=ii@bFgwSg*BK`K%b zOH!?pLCR7Yj0_CTbPY^&jf_GJjjRlefk@lHz{IaWiC>nC}Q!>*kp&ATz4J|?p zOs$N}tqcty8Vt8rOaf|91lbUrpH@~KsF=ai)z4*}Q$iB}3gla7 diff --git a/res/icons/graphics-window/parallel.png b/res/icons/graphics-window/parallel.png index fe89e2f100c33ae3ed352d0e318d0e502cfb2226..5f76105d102810e94ba955120677b3e076c75a3d 100644 GIT binary patch delta 148 zcmbQtvXpUxWIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK$1 zdb&7hsEcduNz^5n^r*REaLy?ghhNs|&166)*g*RNlH{`~n5 zA3i*K^yui(qsx~s@9gZ%$;t8c_0`wc=i}p>KYxBhLxX{Vfq;NORJ5ud&@RT3AirP+ zhi5m^K%69RcNc~ZR#^`qhqJ&VvY3H^TL^?1FWs&C0~BO0@$_|Nf50NfBhB$;>e5`G zkiDmiV~EE2#-gQ0=Gp^3hM zMc%rL+CUYmAQdTzC8<`)AZ4ixMh1pvx&|h?Mn)lqMpgz!R>qdv1_o9J1_5WQEm1V& z=BH$)RYElw>Ka;v7?@fanOhkeKr|R`ub2eXpa`-dI6tkVJh3R1!8b9vC_gtfB{NaM gEwd=KJijQrSiwZk;FX$sDNr$kr>mdKI;Vst0KtQ(xBvhE diff --git a/res/icons/graphics-window/perpendicular.png b/res/icons/graphics-window/perpendicular.png index e9bf5d5f7493358a181cfa1c82c66970aced3094..2127714370015ab1d9379f767aef3e86e0a4641b 100644 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wg8-ipS0MfW|9^%v4F5s&e;^k> za5Gq`08}AR666<*uEUJ=@L`}FXMsm#F#`j)FbFd;%$ftT*}&7qF+}2Wa>4=;1ISgeB^>bP0 Hl+XkKzd10y literal 427 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8Uop6XN>+|9^%v4F4H` z^#Aw2Zc72h8B2ovf*Bm1-ADs*lDyqr7&=&GJ%Aj}0*}aI1_o{+5N5n|x9$&6kiEpy z*OmPNix`hI$Cs%~bAdwIo-U3d9M_W*6nI=DB}5D~RHZZU6j6w{JtPG5-j4ibd z46FyW>IQ+eo=O@f{C8ND>d~}pkfA3S3j3^P6RtCxifOHCmUXUpxyC)TV?m~_h0 zFkE5twjjv`YyI!t+CD?~#Jr0__kK6auhTpwd-Tb_54xw{>E*6{)3qM_^>bP0l+XkKGv{3R literal 596 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkphSLvPl)UP|Nj}zF#Kou z@8smPZ{I#cL&KFTSGv2q@7lGCo0~f=EiE7*VA`~478VvumMmGjcCCzz%#9m2#Kpze ztXXsI+BH8vzx4Fi9 zH9tT9$B9nYfmSn?1o;IsI6S+N2I3@nySp%Su*!M>Ih+L^k;M!Q+(IDCcQ}ahbkkL_5O(dMVyW`N@ZY4#w=bhdUKB#YABGSh& zVcJ2#Et`ryS)_<8DRgb`P~ziMO%;tgsvszoz`&5I#O#!G`iBD0a6j6w{JtPG5- zj4ibd46FyW>IQ+eo=O@f{C8ND>d~}pkfA3S3j3^P66=-ua5)S!{O=b=d#Wzp$Pz92PM$} literal 418 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaP3?%1DUd;wlEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8U)v6XN>+|9^%v4FCT9 zv%T`L6e!48666=m;PC858i21s zKVT8#k>>a^b!je8NY&HDF@)oKa>4=T2w4dU31*3i&0%Y!BpDtXHl|2vEZrd0%g(@{ zy^rTBYeb22QEFmIW`3SRNM>#-gQ0=Gp^3hMMc%rL+8`rADpC?lQmv9f z%2FAO3=GY54NP>6j6w{JtPG5-j4ibd46FyW>IQ+eo=O@f{C8ND>Zdc P7%_Od`njxgN@xNAk3Di5 diff --git a/res/icons/graphics-window/ref.png b/res/icons/graphics-window/ref.png index 19f3b88a7c512fb185d6b3f224ef7a596617ad9d..f57d61e3976820ab3f5fc0841b3ea9d19c2eb36b 100644 GIT binary patch delta 160 zcmbQsyn%6oL_G%+0|P_8=&JQVimfEbFBnJzLEbX&*Y+970k|lx?J$ValW3v zQ(dXl|3@b{F5RoExhU9pXkpjlPwNCTl^a`TN$#1rEYioZT7_|gO;J0@W=~f?mvv4F FO#m66H}U`g literal 413 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaT3?y&uT)!Jgv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffhPl)S(AYk}^EP_K0 zD8g70rMq>1fP(BLp1!W^4_L%_ zq&dD!U78CNQucIl4B@z*oS?vv_3D+x92uDhJC?0$JIL&@+u>(lDc_GR%nbb!98Cvj zU5f-N7b|g%C~+=IO)SaG&r=A=%uQu5G|)FR(KoQjTX#_#s6rK_A|Er L^>bP0l+XkK^DcEc diff --git a/res/icons/graphics-window/revolve.png b/res/icons/graphics-window/revolve.png index 0cef0fa669102188757aabc5750b5c0fe9b5b5f1..110a012346743d8268a8d41f3c6b7ec647225f18 100644 GIT binary patch delta 209 zcmZ3%`iOCYWIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK!d zdAc};Se$+v9L;w?fn##(=0`KXY`WXteenVFq}rU$8ZS+ST#k6|S*k86Kjsyi32yzm zD{b!Eg3XRH9@eJ?&fjKYFg&K)Q#yZ_O~co6uPwr{zm$}Kt`HQQSQvcmx~@o^Y-~Q~ zCxO2cJ9@W$65RT4g_vR2 delta 667 zcmV;M0%ZN-0jLF#8Gi-<007{3J@^0s0flKpLr_UWLm+T+Z)Rz1WdHyuk$sUpNW(xJ z#a~mUB2_^ z4-h9uCq)-2@qbC7MT`f>{djlparX`o>Sd;y9TR}6Sw=Dz6@N3?RWb02Ao|gZF@z;% z>haWK8lL0p9zMR_MR=C?xj#pbk~10L6N%@TZdk+{#50?g&Uv3W#EOzad`>)W&;^Mf zxh}i>#<}3Iz%xTeIyp}qA{Gm6EVnT$8Y=NLaad6`$`>*&E1b7DtK}+d-jlyDnA28L zT&FpV7?u!60)HZ8R8c}179zB2q?kz3e$>N1AOrG<}xzHQ**x~0i`z~v4w z_@qmQCt*%ftWx00v@9M??Tn08ju>#)k{=00009a7bBm000XT000XT0n*)m`~Uy| z2XskIMF->z6#*#?*aI;60001_Nkl7k|LI8exX>dfY- z5Kuy{>wn)NSpWe2bwB46y1+`B5iqf(j*oIr$Rm!%B&#ajK&!k$Kd}4grQUh>RAGT* zjJFa*#0uFUJ+d`7{Xg$JytAF~Xa;xi6iCt8#XDL?O9r5fiq_poRRlmwrnTum+JVN} zFKgYM@gNcTc6qxIBhUp=-0n+d0YpQt7J5M81r!qZoQJrDqUZns002ovPDHLkV1jf% BC{q9c diff --git a/res/icons/graphics-window/same-orientation.png b/res/icons/graphics-window/same-orientation.png index 850d2da8996482586e1c086848a01e947a6ddbb6..4ed6851bca59b55e16d6c26963073c65a490edf8 100644 GIT binary patch delta 177 zcmZ3;dWdm?WIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK!N zdAc};Se#BykVv?2t4r;G%buV=K|W7rH?3;xtXLW_@l{rk&HYSFASGOc(w`rYGo^!Q2*Zu6MV>B^2l##%k!Oa;n1KGCV=TneT? z63Lh#5`k1gQYZv{5~V>Ag8ryKhGAJqUqm`7!QP|(1oz&72&0ms00>P+ zT{(whz9U1q`TFLo7aWAukrooTb4jpGg>zg|Z7jC{ol?Np2mInB-zT7r0M?y=CIBQf zkKa3<&n?Ev%y#|G&JMI%6cr&o9sT`iY{bwIy1KwHa5_;{h166G4#H|hULFhv7>$rh zQCEkS7Kp`2OG85gQc_S~kN9{L6u@kT!vVD#G8sf7#Kyw!hf0OYO3*ZNb1^&&p%8L8 zSQZr(AW0-9A}I-8FKjkY6uP@nT51_|@K1)YDIDg@uzIXGnq4Rs^#%Bh4 zgFWi(&(WtpkipH3p1`S;VPy05CFSNXTeB$foZ1QeH)cn$z{|7U<+)so`dhUp!cERK@Rtyh}BoHMGQ@`E>Dxh?sC&06xoC-n>e!c z^!Ehk$lx6{6iaKWc^eHSp*WO9<&dzi%3G`NB YVBk>E@3VTT{siP2Pgg&ebxsLQ0DbyBLjV8( literal 597 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkphSLvPl)UP|Nj}zFaSvh z2Zyw@w3L*T;3=**-JcqUD+S7 zi1A2se3`m57bsNZ>EaloaenJWPre2N4%d}YM=R$YU-jL7v2V`;ZS!A~^5imq1~inn z2*isXXqeBvOqEx2>D!DP?vsmOU*xstxan?aJ9UTJPm|L--2*qR&&s>Ep?%ZSkXZW- z@|N#RmOnY{I(LoN!?x{=dS$gA?yJ`Q+{(}QQHkZ^!b!$DK-PsvQHglaIyW>IQ+eo=O@f{C8ND>d~}pkfA3S3j3^P6~m2GxL-ZL zpJ_q5=iJH9IcD)!rJU8^{gRbi;v(d5sFz`a-I>g@M}yK*(qA4n+vF3ydBd95;gNmi sU(T+w>t@#G|9e1b)htGl-?z72XHC{r)J?G6um$8kPgg&ebxsLQ09cMm*Z=?k literal 507 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpoD#ZPl)UP|Nqm{(iqM# zY~H-t%*@Qs&u{J8wfXt^0s;bZa&ptBPd{|%kh!_Jo15F&vu8UyJ4Hl9YHDiMuU~I( zZ@+KfzLkPgM1V#ymIV0)GdMiEkp|)%y{W;-5;PJ zdx@v7EBgZ$F&=4-FH@K10);$0T^vI+&L<}<&`LPMV8F>URm8)<&~T#O!81*V`NGV~ z_})w_E-L)|pg>e#em_Imb1n`p&c`3xH*lP2jIj0C#nRf?p}lAY3q$)4#^^KF2ikyU zij}xVlsFfqCYEI8=P86_=B6?j8t5CD=o?sQ@~!?2RG|t|k&;-FYLyI9mdapcU}&am zV4`be6k=#(Wnc_M+6D$z1_o09nN|taV5nT$ zP=g}KhT#0PlJdl&R0iL~|zBIJ%d+j>ZL%%44$rjF6*2U FngEJJn;!rG diff --git a/res/icons/graphics-window/step-rotate.png b/res/icons/graphics-window/step-rotate.png index 22969f65fbc41248dac0cc9cea78066c32e7a7cb..a64eae44c50606cf5e78db2df0d5516f3fb60066 100644 GIT binary patch delta 190 zcmaFPcAjy9WIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK$j zd%8G=Se!mOzaBwNT??-2L?j&A`a3G7^}vfQVNw%Un9sIqsP8{{IcNUf6nViPryTlp9+|8y m?wzviaov`+QMW&BKgvA)qdAN9^%X}!4)b*Nb6Mw<&;$Tg%}fgb delta 859 zcmX@l_?&HmWIZzj1H<)|XHNksmUKs7M+SzC{oH>NS%G|oWRD45bDP46hOx7_4S6Fo+k-*%fF5l=u+f6XN>+|Ns8}etUa+0Re&e^XJRU%g>uP z@5`4j=gyt``t|F{lP6_mWw&qNe)jCyEnBu+ym;}(jT`l9YHBN2u6+CUt)8BqzP|p9 z88hzOxpU#d1#WKcH*em&diAQkyf{LGm%8X6i47A%-PeR_R;y_}rfq)C%%YiqxM z|IW|PzkB!Y<;#~ZTD0is(W88PeDB`9V>rWLU|_In)v8&uX1#p*^2Li66DLmGw{PG1 z^XI>P`_|gp`ug?j^73-sdR<*@ZS85(ruFpnn3|g2zJ2@Y)2GeN%|%5;s;a8@@87?A z^{TP4@$=`;uV24@{XE)7O>#0gD)qbUnwHsY`Q#nwULZ977}| zTMxDe9Wr2OcqlLI6uKx$c;YUBiB<}Mfd%hv@BhzTW4SK;oy}jnf5Ed91UC6hT; z<7Kq=6x-V)21$>7uhm=WD)esKChUAp#d>$(be~n#)0m`RPf^&)a?Y}DhTh{j#eYs& z9+!A1`Ixow!p7wXjz>)ptjhm?VAAKmhZi?8L>-no-kE-6{+yy~nG*w>i}i%OA58XM zw@$QiSLDO8laoLGwSFfrqWtONr8kuy3TH1*_w?I4Xa6gaUAumLTc}U+9nN|tZ z5CYO+sB35uVqj`zWNu|>0MTK%yzopr0GQiwd;kCd diff --git a/res/icons/graphics-window/step-translate.png b/res/icons/graphics-window/step-translate.png index 2901f9e52b4239d3d0adddb1500e484f38453212..493f85335b241e1ddd9835a475418d12dc88fd33 100644 GIT binary patch delta 155 zcmbQuyqa->L_G%+0|P_8=&JQVimfEbFBnJzLEbXkTG=u%@439i!rIWOpsF33_(S3j3^P6!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z%2yAjF;}# z{Q(NHmw5WRvOi!E3hMC&cyt|Np;#|Ni&yACNKa%!_A0amJD$zhDN3 zXE)M7oFs2|7iK{opHD!Jw5N+>2*>s0ga+o-q0$ah7@C=cSVdhJnHLH$%s1gv%sDyb z0#KP)iEBiOb5UwyNoIbYLP%zADuaQczJam6f#v1Hzvlr}sDf0aB$lLFC4-cuG8h>c zn&}#t=o%S?7#dj_7z2^Efq|8Q!PE~Pt57uL=BH$)RYElw>Ka;v7?@fanOhkeKr|R` zub2eXpa`-dI6tkVJh3R1!8b9vC_gtfB{NaMEwd=KJijQrSiwZk;FX$sDNr$kr>mdK II;Vst0Jtl5rvLx| diff --git a/res/icons/graphics-window/symmetric.png b/res/icons/graphics-window/symmetric.png index e6e80ebe4b71647854ce2802c6e8e6b9ad2b58d4..41926842b541e64e58bf9f8a03bc4a39be0ce39b 100644 GIT binary patch delta 131 zcmZo>naVgpvWAI)fgxXX)p{VsRubeF45Wb|ZyEbUAjMhW5n0T@z%2~Ij105pNB{** zJzX3_EKVmUNU$zWC}{rA^ItQ>VM>sY&%wov{hB>LLJbay2&`=5(p!`&5omnP?VyGN bF9XA#R_Rw}ESskT4Pfwe^>bP0l+XkKRG1`^ literal 515 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpoB+&Pl)UP|NjFR0_+*= z-5K0H7(C81oHu1Kb!Kor#&FDn!QukL1vdt_TMW0<8Pqp1Y%*Xluwk%S$FRluMA)RGyIolkY9OjaWBwJ#*!evUYh7ML)4jyNk9#XARB`7(@M${i&7bU6O)Vbb5m0?6BXPti&D$;i?WLqO!N$1si~I& P6*G9c`njxgN@xNAxfGbJ diff --git a/res/icons/graphics-window/tangent-arc.png b/res/icons/graphics-window/tangent-arc.png index d9dc40ac631cd3beedfed2da1ebe7fd5989a002f..4c2c6bc673317e0962a91ccd7fcfc278cf3b6a61 100644 GIT binary patch delta 194 zcmbQmdYN&8WIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK!7 zd%8G=Se#BykjQBebo!hAqhITk$HbKx$0o8wa7g@>Pc%_hR<>kw>~Xl(quInW<3p?b zD!D&;hveK&*d2Ntsk5<->D&PcH5CuTKy6uT!;1#Jk2n=DMH pp&t{zNqPP|bj9hkj?n=IhV(3b=JKghDnR=gJYD@<);T3K0Ra1!KxzO0 literal 666 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpv3$DpAgsoK)~?d!NFn4 zk|jrv9^Jluds0$TUtizxySqEX8HUZ9H!obc(8Y zpf&%|H=vWmN?apKoQqNuOEUBG6hbm{QyB~m^bJk)4J`83UDO7uPz9+-Ni0dVN(L!Q zWiT=@G}ARO(KRv(F*LF=Fa{!R0|P4qgQ*`pR-tIf%}>cptAuJW)HSpSF)+0UNH%%K@ns_aDG}zd16s2gKuJTQGRY}N@k*hTV_#ed45rLv4V-7!7DX&P%JQb My85}Sb4q9e00j)-U;qFB diff --git a/res/icons/graphics-window/text.png b/res/icons/graphics-window/text.png index 8923573ab0cbfc1e44c44f7bf6a95aaca7415f59..307c70d4f354c36daa027ac9558f2f47c3bd0d9e 100644 GIT binary patch delta 181 zcmbQhc8qa?WIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK#& zdAc};Se(8Z;>dNtfG2Cx-~Y!C%Cgz^n0j1Gi}ed~30boC?|TM@84HS-*M~^xu3gbq zlOj7YH9K$}!WlJ4m1$iT3%pZiZDE0C{{>=ES4z)+>ez|hdb!0-zw z)bN6Vq11qZ;Z*_ygVhWM2JwP9y8>;15==?n?k)`f+xyS#2l6-zJR*T6atnbl{w5r|8jz%^8`lF;cxr3pQRod98!>=pxrCN)h6* zD*euvBPPd7Ri7_AUu${3`ki!2vHG@?-vgTxpT`y)jBHg~pB+_74iDakA35yGvlj`N%_9XQJ1(st!Zo1-qvt@wKDTFY_Cr!sHfIV&&-arm%T9J+a{VZ*EC zw+*Y9VoVP|*UD@)d-NrkFZ*t($Mn7HJT4xwPcWAWe6n%nD_f=LIbRnDZ4Y>^{Io~u zc{X1%!`?s7DjT>(>R(U#tP|3~9jtOQFL&+UDXT8d&grOc>^`vE;P{98^%cHt`g*^b zidKmGY?$7!SKSf+di$6E&-p!1@b~0MTH$yzopr0Grt~D*ylh diff --git a/res/icons/graphics-window/trim.png b/res/icons/graphics-window/trim.png index 248e448ce7ef3c1584f872da0554d748607f6db7..de11e17aa429a0ef73fea5132b127642e7fd05ad 100644 GIT binary patch delta 207 zcmdnb@_=!IWIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK!d zc)B=-Se(8)*^#e7frlmX(c~Zhxj*>6W;AWPa4GC@W1K=j+otHCC^G?@@b#XS$Nz-7 z-WHH&wQN?okUeQP&m_jK8CnmQU7t~4<$7g>$5nqJ>v`HiK5w?4diYAYTl7|DSZrMSo^i?PqvV_WAa@;+K#9WM9p#yzpgTe~DWM4f D=A}jD$;rtpSFW5fV@7#-xq^a%fPg?&R@SOjt72ng4<9}}Yt}3c z4Glj(zY`};tX{oZOG|6Xk|l0#ZWAX?(7@~1LIpF}OL}SA>As!x|GddP25jSrX&Nz6m^K^k;UW*0)CYD1|adveg z&kw8-6c7<|D`mJLB^YQ}xaQx)2`UE{2SunZ*_oPRsN%p>^oi@mzDAFZWNwob6OmvNmLJWS;II%vYv^7fgxXX)p{VsRubeF45Wb|ZyEbUAjMhW5n0T@z%2~Ij105pNB{+W zJY5_^EKVmUED%aKqEyCq%s}y=f?C$jjx4rB_W%F?%NvOEx;Fna{&W14oMoa*h*c8{ y?>q*njw!wOEtv&x^h9vanK-e}Ehf;Lje$Yr8=I&|$Qs2QkgcAselF{r5}E*xhAm|P literal 515 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpoC?BPl)UP|Nj}zFaXI5 z3>OL*3KSR=J}`U`U=WzVFku731_K6z{|x^hFg!?LNN8YaSirC#fFa-j!vO~dhgB=K zF9I6ESQ6wH%;50sMjD8d?NMQuIvw3 z#CW7RzD!-33ls|Tba4#PIKOwIqfmna53@L9cdqEy|NUPXOKcYIe3vpy?Zdh$mvjys zvR4pau+FGqTH~f(K2z5F&C>S*CNs$Ry$)QJ^(tM$JU;u6`$jqDolkeKOY^gS!MN9& zv3tq?s6e0%VkNE-CC){ui6xo&c?uz!xv30>2Kt63`UVzx>n>^oRj7hgq$HN4S|x*& zr7{>97@FxCnCKcAg%}!H85mg^TWT8^SQ!`uoUOJ*(U6;;l9^Ts)nKS=Xc1yyYGq_@ zWoQ7=V7R?v5>SI8$cEtjw370~qErUo#N?v<+|-oJLS?6Fq}hYU-sx O#SEUVelF{r5}E)JT%iU4 diff --git a/res/icons/text-window/constraint.png b/res/icons/text-window/constraint.png index bc1a7178a23da7acf244a22f5b9a4a0a94562a5f..e48e8a1341f35825d3e879f1d2d943562590ae6f 100644 GIT binary patch delta 177 zcmZ3>a)@z)WIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK!N zdAc};Se$+vbefAnfus2EfBV~x0^Dm@CU%s~;x`NIoX5I{Nw~jugDU4z_I)S3rgW-a zSu&w)(V}_N+6^uJT`Zj*S44N`rq9i}{(oYmmRym{8`q*ItF~sXFEa|clztAr?vs1=V@s9iiC zX!>!D_!@hljQC0 z!qCAg>jC6&7I;J!Gca%qfiUBxyLEqng6t)pzOL*KSj2b~1lRaHnhF$(_jGX#(Kw%+ zus}Y6h0%cdh}(1)Z3geeF5`sh2}jaIlsEal5aM~U?7`FnEIwy+*5tg2P_eMsxude; z=Z}rq!U7^f#}XHHXz1-e5>e>U;r(Dkn`01Hd&?Fcz37xo;p+@jw=urhrD*jAXq8xr zYeb22QEFmIW`3SRNM>#-gQ0=Gp^3hMMc%rL+CUYmAQdTzC8<`)AZ4ixMh1pvx&|h? zMn)lqhE}F#RwgFe1_o9J2LDzTi=k-9%}>cptAuJW)HSpSF)+0UNH%% zK@ns_aDG}zd16s2gKuJTQGRY}N@k*hTV_#ed45rLv4V-7!7DZOQlMf6Pgg&ebxsLQ E00-Qur~m)} diff --git a/res/icons/text-window/construction.png b/res/icons/text-window/construction.png index 35ddcb274ff9113bfaca088234a5e6c7ac76b1d5..6f48aedefec91ee1c151344e7bdd01d63c000c6a 100644 GIT binary patch delta 186 zcmaFNdYW;9WIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK#2 zd%8G=Se!l^?8tXOfulLq|IvT_7mLfx4l4xQ-O+gILXgWpu~*X#mxVbT<4z6Z30SrM zI@`_*zlx9BW_w*;ak1gqm7Mwaj$glDZ1(or6ywKa8z1`5 iHrj4=hSNR!Q>_hifw;%**e7WqM|ryXxvXMoOIk literal 739 zcmY+BT}abm6vls%VRPw)lud20qSc09|NpkkjR?)nTsoO<(X5NMbk@qXG5@A3FqQQs zVi^>M85Ct?CVfDOP#IX*7k%7h7eQAM(N%P#751*W>EgVHbKd89-simMgu7;QdRk5z zknXIs*NLo2#^QzIe0S~TGm%num$}N|)=Blxz#>uW8Y=5taBvNDCSXpqIzL0J1Yi7M z8-V4}^Aoij#KnDgwbwB}KaU9xixPz51L%Nz5C=gjgf@5tBajO@Fbvrs^e5o}904=D z0HOFCmVq9sgabGY(~u8O;VKy6228;**a)T23lXru9vFh-uuWKmW;g}iQ1fSEyYLT3 z#Uvm;VGCS_N~pk5+Wt!nvOuY;@lg6{rYTwMs@iPl_#&-9po&)3w}3h`84KQi==dp` zsfyF(Nd1_SwIp}(_cK?*qIKJ8FY_8+HTZRC&JEQ2&S~VS_cPX#?D6sV!0X5H*-6Vo za!0IRyWM9`Nj;(FRncKXPgawxTUl6`v0Crz*RQ_vG4pNybmnMpRF%C{+k87ZyrM_j z`%T(rG+dhNcRF*b^RC~#_`|)`HMFzb)1Pi0o$=}G-)mF}!&H~1)1w|t-0d5?u<>Z3 z>tg?{6UK?{<`#8TUWZb|>k!-M;~LF~@8G diff --git a/res/icons/text-window/edges.png b/res/icons/text-window/edges.png index fcfd009ffde0fa487f4a55546c2a176e10c6dce8..f428de17b4d6dbc7e51dd26e5a7e83d04a118753 100644 GIT binary patch delta 269 zcmdnbI+tmJWIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK$r z^>lFzu{iy9>OtNk3Op>=C;ncWlJ4m1$iT3%pZiZDE0C{{>=ES4z)+>ez|hdb!0-zw z)bN6Vq11qZ;Z*_ygVhWM2JwP9y8>;15==?n?k)`f+xyS#2l6-zJR*T6a(w_{MyE9< zK&1@qC7!;n>dZe7^l>qQ(1VieGjvdNkK?esKSkNa-Dkmn_0oX=UwLw%e$B z?q}!7o7(|I&f)xiAnkO__9<2W+SsR?Y-jwx>_5+wprV;2*>REQGS45jdFHda zI>GD}(--YoMpCDFtg?<=|FB5-MfjD16}r}WSGYF6+rlhbA8&PLPT(Zd#B=j3Hrz=J zPW!S_oiBJ=>HXQ~yyF8lT(r9VbVI|gS%2lK#iA8fwK;v(EzN5GdE`&an@6P;FCDb? zR#vRPwU*EG>#etIz4hE~yZkJ;-DI;bvm*Ca`?QS@rg;9Y2`b+9b9b_DLimlW?yp-u ztZu6{Pd2#6n)Xd7nMBBi?%D~{?%3?7T4Y~O#nQ4_!4Tidg79j?vRz~Jlh6WG~ zhTAJ90W~OsYzWRzD=AOZE=pzaO-wGz&rMCqOjK~oEJ`iUFUl@fFwrx3rKVmARL$V& L>gTe~DWM4fZc-eP diff --git a/res/icons/text-window/faces.png b/res/icons/text-window/faces.png index e92cd5dceda3f3ffba76b27ff11bb682b8c24a01..57345dff48ba9b1a5453960c9a5a27e2a463ee11 100644 GIT binary patch delta 336 zcmZ3@`haPIWIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5Hkzin8 zWbkxx46!(!oUnk|!y5#YgAA4Rlqc-moOV_zL%?{M;IU)JGMet(xx+7ScO+kcTQA(< zK(DlU#}_H#7ORpD$EaT%vjmUKZu&5*si}V2;>TOJ=kNdh`+daLuHR>8n`gY@sN#L4 z%srP`+R!z?~*xTRY2blAuQ9l9ew_@95P3mz}VON!`AFnzI>G zHk*^@$?OyFoYW?sy}R9C?s6l@#X@dBJWZ7OWUX4_oRpR`*r?d}J#>4Zon?5LrAW)! cIB5eD17G#y)Vx_n6F@=b>FVdQ&MBb@0Nb5`o&W#< literal 683 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;YH=O_6ICtJPJaluAB9NLU%n~978nDZ=H0ztjR#Y z)zIf`hD@o8r>dy#7SRv){{Oe&Wb>LBuI_JH{dVe;H5Kz_H-6YVPw<1;6pKTCHf$kY zz7v++tym_aaCYXcN>P0k)-(SbB9y#5wV&}d1hl_@-7&vWuQTzTX^DPCr{G#UfrQ6i zzm1u?rsgiw;oZLb7>CEIs-#(UR>^)hjyU@)D*0ouZ(sd^qsBhp&WJ@QpYCop?D+V^ zW2NnSvpc6geYkQ*x}^KXqAcU3o8Qm9U76wNrEsb|X5BHFE}PZ8wLwSwKOSXU@Mt@O z-ud{YPyXfa-O0Q;O(yEknme38kE)iqMwFx^mZVxG7o`Fz1|tJQGhG7{T_d9qLqjW5 zGbY500wkYPE!B?00000Zl(v300009a7bBm000XU z000XU0RWnu7ytkO?@2^KR5;7Em9Z7WAPhv$c^-+{GiVA1NKNV5126?MP%~5th)jfx zahzP`XRQAYp~FB&2}l^!e24(7w*Y+d<)yg_)>>=x!}3;sKJ{CA6kMQ{0C?xKi>rF{m*W-(xexqE1w<!+LY?eLd!TcN zQXgVo3NDEIfH;XVv~95}t}jIM>8M|<50|O8X7(F$#F0QWSM9+s;Od=wS1;Jrek`$# R7K#7>002ovPDHLkV1o8DgRuYr delta 1160 zcmY+DX;6~~5QdjS2#3QJ0t&%EQZ6~Zgj{@yOKoe#RvM=L(;qwUygU2s{@C3q(*~>h z9heya%(hS7GKzVQKrR62JZbZndYjRcGNrL{fO2nuqg4PK#?;Xl0L2J^Asqlc2jEiJ z*cZbEFu5HasT6N+Zo(OWD*z<`Jb-bq8?z&0V(nm(EM}#-JiL0=P7$f_K5mK;0eT2L?jvs9Sbe{L@#|vE^asgdEm8ffq!UE=pbMi z7IZf#X;6?nAPl+hB&lR66beo`=g`MxycMUix*}S?hv1SAVUmzA%2AH9X>Goo?+N9# zC7ku`hib}b4M^y$V???nX;4VRj?;J@WKlh}O&io^4uFnj%Kd z>+%vd28c8w@>R0KoCEcZDe~5wV{ne1LNcyI-H2iP-R+P?ANhjJtXF`HF^&p z)=R>K=K~}dJ2F|Sh*DV1faMfGE69>$pn_@rfnMXzP4uyfIN&eMWp9~`h;R|qZX-&K z#;Q=NDgvgvGM>Ya+m-0G23lVgpsPtx3@ z+ZkUrFWA5AA@Hl}QF=hi%KZc~-sH{17yIp|mzzCWT%EPG$Ln5KRo$TAPIVsbq;5N8 zdiK0TijJ|#A-CPWDZ)AUEiS3G6TyET8@ZUV%hxY36N|o3cVtKzBO6YM|Jjn!jW-0G z6Ab#$>5g}Q%(^+}EwwkD&Yv|@G+*kL=d&{M7l_2q^>pdW7lySKzOMZ3#-zo*>ggep z+2TUAr^P6_HIwT`-r3Y#V}Ta9BIi!G`PGC~{&6{{-UH29X1U&(47NX;8*^HNJKOgB zO#JP6tnbY5n76vSd$6nDN4>H!|IRS{#6e!cJ*+EFD6IJKVDXV>j){%Q9{ZQ=U#{)) zXu6QL??H$~7k43Xq_aFGZ7YQyxox_NW2ZWkb%_@QxL|HVao8v6QgH(6d(Nz3}A z@n7LRy*N>yrPgcEOr6FkKtrg^K!lD3(r8L56=g6{I(;{Spa}A=y@>EXqClIKn|<&< zf*MF=D-i}tW1&>!Ux3Exz4n5RZ x<~XHk#hXP3(*;VIGFaLLFEW~Jx-9sYkwHySh`)?IuAl~Fr>Co*%Q~loCIDnFF;@Tp literal 639 zcmY*TT}V@L96gq1IY%jD%`cpw%aG;&&Q0wa>OQX9$W7gbE|A)tyPI>_^m@(AQ8qIC zc*uIPsGz6^k%Te|>}mK^Q1tOoJp}b)wGbpIqAdGg>ZOO@?{LoV9L{g5-ECLq6y^X> zIvq9-MU6b$x6=J;{>ftsnGv(g4BR=d*x<7$*Y-F(F5sjN7(WaApwjq9V3+{u0Km=x zy9cf;cO0OHOYN;bZgX=J77MIal$T>-0XQ5Q0 zstS?>zaM5Z3JOqIh|y7az2JEy5@>64O?SypW=I~l7tO1$!!ijTwA(P5RpOvz$AII| z5TMAHC*#H2QyWywmYgmw`(36wSDSC*ma3^FI&Eg3rr=h}u1+?qxYW#%+{x=)2NT)F zteqZw`l)Wcc;UP2S@YfSWbpR!?9{SZ^>y8U^jB)YcD1PJQRuSgL-CSoRgrj;-x*81 z-*&$tF?MeyZ%t}>*nQ#4mbK0s6(cv(XF407A3pc3WubB7vtlZgmD;&?v5mH?CC)Ed zMS+*1@nc$Fv|j*Ws!2^X+5d9o=QZl6kR2gj64)NuCcr?LT0Jr94F(^>u%=qpXsjZH zCFJ+~kovzse>@ZokNyiVdZyk-Ost`fWys$E^Welq8Yq(+yz#I!!ixf2e2*CK7eY~9 d+Y%Lpk+>Ke(i-=Xv~JHZHN(ldZHtyb@(=1@xS;?5 diff --git a/res/icons/text-window/occluded-invisible.png b/res/icons/text-window/occluded-invisible.png index 5ab4f82fbdf14b1145951f7597361a8157fbc840..ed353012d914379c6715829aab23081a899dd006 100644 GIT binary patch delta 179 zcmcb~bcAt&WIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK#& zc)B=-Se$-)B8Th6u7CfhzkjoAMbGpd83}h>%REGacj;~_WnAH6CK$?CHgne| zZ@Zu~e}Ys09$EP1xR$8Smla;IB6YEg*gm!I(_vzKe_@KiQGVVo;aQ^mTS9KF>Wy4e aew6wD6R(d~f2Y3(xyIAg&t;ucLK6U*??c4^ delta 329 zcmV-P0k;0c0oekO8Gi%-002sU^>Y9K00Lr5M??Sss*NKu00009a7bBm000XT000XT z0n*)m`~Uy|2XskIMF-#r4G1I;cg~No0002$NklBfu0dpRhuqUiu>IM)p;W3vVhS}5$Kz&L= z=Ozy?1M#3#QIp@=?5=AyWX>41aKg1f$FcnQv7M$#Z~)a5@U6G|A6tXQ2*3#%ecX7# z3>q4`?v$n&3qni9Ou2M{BNpPfolq8lFEm?*&ywf3VkPcQ3?-RiE!acQ2%iOLKE<(R b`0=wJ(SA7wi6w6)h^yK;Cb&X4YIlNn?@j3PO+Ow)Z{1ogn wW@HvFIkiaRzl2WWylpAIs=@t>e_fL6k?sg<-ptdwGXmsBPgg&ebxsLQ01K&0%m4rY literal 539 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+SzC{oH>NS%G|oWRDEak-aeC_%Loa4Wk+%OQ zquh8{4jyu1;+mvX&7A+hR>!uff?tr^``{_=8}F_)P2g5pxg}`w`K0ta+l@DSbe+jA zlYc+E()xX}?5#ZBZEO4+tA9}$cBcl*QLn~7=D-#oK z0|P4qgMTZF#ZWZl=BH$)Rl+qGnuZtwH5gkNSU@!VFn#0&)WG2B>gTe~DWM4fTt2`@ diff --git a/res/icons/text-window/occluded-visible.png b/res/icons/text-window/occluded-visible.png index 2ccd73e6c878d72326c415f20f7bb17ca3415603..23415c300565dc98e5e1b14c6587b8c7827edaac 100644 GIT binary patch delta 191 zcmaFMbb)b#WIYoD14F*(s`WsMtt7}V7)S#_-ZJ)yK#H@#BeIx*fm;}a85w5HkpK!7 zc)B=-Se$-43&hmR}* zmS=LSl!aciu}!>T!Kxs%yH_bdxv29$OrC2WzK6`D@s`%5lBVzkD mt(#UW`!4krTT;CD?u~xx+xn;GeVhLsY9K00Lr5M??Sss*NKu00009a7bBm000XT000XT z0n*)m`~Uy|2XskIMF-#r4G1DKdHiH10002~Nklb;@5Jmsuh?Yo^BFYFU zq=Yl%0NjNmpxgsR6iB3qLW4kD!{z@zZ4JzhIS6n~JIspfm0y*u+|hyE4~ z{TF!Uw@`K%Oy2SibU|^B*aXJ5ulVqCIbYb)i-8AH=Aam8Gi6OLf8ymnUre~G0T!gR zGOYmmY#I8-9|LqqS%r2FI3x*l^ixW7Ff&Uemlwz>0I^(KA$N|&T|Ka?C^w}l;VBF* zi>Bnqn9sLZ306X*!-j#~HHG;G#u}7NrWmk#kRRJ`)6aF>E->bkvBpd--RoK3F1jPj vSodGBCNt)%>O%YE2<&TfTzQGR_+R4$^WY500wkYPE!B?00000Zl(v300009a7bBm000XU z000XU0RWnu7ytkO!AV3xR5;7s)xinGFbo7hZBSpX!Bw~>SD_kQneQPG7ugXqx!3I{ z5W*0WT@2b~&bi(MK+i!ywAP5I_nxs35Eionh%-bfWsE^#*ngBKf^uQK)LKPExl`f> zsYOI0a!P0}`ceKE;-janD{C`T(AviD4lBwT!gbXRP*FZ5+zd?QQ)0WJF$TxaaUp|ERkRK(3){=Up`5g0)PQ%5msyay<9)7;)qX<=-9Zg1es-J&ZQ6e X+HBZ|@t8dT015yANkvXXu0mjfZ<%h? delta 720 zcmZ3;beDC4WIYQ51A|xH*J2>WlJ4m1$iT3%pZiZDE0C{{>=ES4z)+>iz|hdl!0_`w zkbc3y5X8a2C>p`QU^ShAK|KF@l>7vsTBam#cNd2L?fqx=19_YU9+5y3xjuj}qthCb z89+hy5>H=O_6ICtJPJaluAB847#J^j*1I@{Se)*?Z0m6~P=f8l{fW|6F5eVOxbrW4 zO;f!X5R!6Xii@|i-o*>Y9|<^mPgV@s5+cB&sK}D2$Lh$^_~3$uilvL1lc(FE*pd#7 zqn}Lf{QtYp<$TG#{^zy#pW8lfSsy#Y!2Osf`dU3y;EP>D@bn5^L{+7>Hms2B^`5)HJ1WPf-NI@MSES%f2wc0 z5nf!na?^pVKP-~U%aZQRvHYA?!?W_(RQV&%|4mu5rGAT?foSlD-Do8FBUA{sn5 z#Lu4=(SO&Gym9lp`h3IJwJngNoK8$sJw1>6QSnNqH=a=K!?{;Pc3;oaAGAp3h z|5lDpWVf3QZ_D0~JJ#-6;$8Y`ft7*5zm>&e qC^~ZUQ!>*k;W`XWLyUkrjI9hTAR2y{KJo%;VDNPHb6Mw<&;$V8DJhfy diff --git a/res/icons/text-window/point.png b/res/icons/text-window/point.png index 421688105dbb6739e62266c82ae3c4894d3a29a2..a1a56660c3454a37e47343c6aba8a54a5f65f02b 100644 GIT binary patch delta 115 zcmeBTZeg4tk;B2nz`&3%x@tX;Vk-&q3kK3akhhF|B9P)N@Q5sCVBi)8VMc~ob0mO* zDxNNmAr_~T6C_v{CkQaQ)l5n^aPcWvmAYtJw;Qh%P_ToMA^0^TPo{t+NIiq6tDnm{ Hr-UW|othgy literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaT3?y&uT)!Jgv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpaffhPl)UP|Nj}zFc|fE zgG3lhg8YIR9G=}s196hP-CYt=nRkbtL)V+hCf5XRI6l=vQ!2m14A=i0~1{%qYy(QD+4ntBMWT< z11kdqsCm701fP%(q2tDnm{r-UW|*wAW- diff --git a/res/icons/text-window/workplane.png b/res/icons/text-window/workplane.png index 7df689757b247f538a10c5b203b22311c61a3d74..8e293cd504e1917b1e8c760a6601090956275819 100644 GIT binary patch delta 177 zcmX@de2{U1L_G%+0|P_8=&JQVimfEbFBnJzLEbXkCx4`Zk$@CHD{jwin->0FWl)Cukx4_a6`QJLj7vy XX?xs1-pZ2Q2y%+2tDnm{r-UW|ZFN4E literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wmUKs7M+S!VC(K#9UIO_F$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8XLh>Fdh=fJKZ)LCDl~ zvp!HrCBP@d_5c6>f`WodN=nAY#x5={p`oE^X=&x<<*lu)9UUDjR;<{uV~1HT?{T1d z#*!evUYh7ML)4(zT=OljGHCHLX-zdYp6Jwcky&>R!;}c2TXQUv`hgBm zEpd$~Nl7e8wMs5Z1yT$~28L$31}3^jMj?iVR;FfFCMMbj237_J|5g@@p=ij>PsvQH zglaI3VtQ&&YGO)d T;mK4`ATxNn`njxgN@xNAcv6Wz From 3b5c4f63a6951e371d9459e4bed8b3c0506fa6ac Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 3 Mar 2021 19:29:10 +0200 Subject: [PATCH 250/646] UI: Update non anti aliased icons to match original ones better Discussion here #857 --- res/icons/graphics-window/Clipboard01.png | Bin 0 -> 256 bytes res/icons/graphics-window/arc.png | Bin 221 -> 218 bytes res/icons/graphics-window/bezier.png | Bin 189 -> 202 bytes res/icons/graphics-window/in3d.png | Bin 220 -> 229 bytes res/icons/graphics-window/line.png | Bin 158 -> 158 bytes res/icons/graphics-window/other-supp.png | Bin 223 -> 235 bytes res/icons/graphics-window/pointonx.png | Bin 254 -> 255 bytes res/icons/graphics-window/ref.png | Bin 176 -> 178 bytes res/icons/graphics-window/same-orientation.png | Bin 194 -> 202 bytes res/icons/graphics-window/tangent-arc.png | Bin 211 -> 232 bytes res/icons/graphics-window/text.png | Bin 198 -> 217 bytes res/icons/graphics-window/vert.png | Bin 172 -> 177 bytes res/icons/text-window/constraint.png | Bin 194 -> 199 bytes res/icons/text-window/construction.png | Bin 203 -> 203 bytes res/icons/text-window/normal.png | Bin 170 -> 177 bytes 15 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 res/icons/graphics-window/Clipboard01.png diff --git a/res/icons/graphics-window/Clipboard01.png b/res/icons/graphics-window/Clipboard01.png new file mode 100644 index 0000000000000000000000000000000000000000..bce210f38a6e722bc58d2a2c54445280d501a83c GIT binary patch literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9Y$ZW{!9W@a@|Lkr1X7#@9+AZi z4BWyX%*Zfn4oJ@ePZ!4!i_?3jT;y#~;Bl!wGVxA5)7+PT43ZjyM5KQw^2q3457H76 z`CzvFb-HYG(3Hgn6U0?Mn=^cw8Y(Nd>5}|a$qEs_rmj_%B3$Ql_sgivuM|v6^8c`@ zR_BiJ>BrgE?u1RdwYGW$V zY70h9L~1nPqZg5u#W<&T&^~5#+7r0s+wPLnwv_+nRE=8)$hZA&0b^HV!T}wY=Fu`{ z=W~@QnGz8-N0BdaMiNrFt~}(x%LV|zrOxt5>AwC&PA6zdO%UmzGzkCz002ovPDHLk FV1lSEMm+!k delta 154 zcmV;L0A>H$0o?(ROMiVyL_t(I%gvNQ5`Z8GMS<}IoW=W}AkRdL7L_^(WF;#{9|(va zU^PSKOhjrL(HCAs+9=9C#LzKgy{!k+{I_J#o;+WOHqlI586>#Kg5jxMs?P1JQ3H2FN6xkG- zs%AD#Q0=m36f-Ldw7$AtfDm1bwr6?{@;YO|en(IwbUPv5mt37334d3L*{!>xldKQyX`OyZ%(ow~D-`))bLr*Z98&LRApY{g00000NkvXX Hu0mjfs(3@0 diff --git a/res/icons/graphics-window/line.png b/res/icons/graphics-window/line.png index 0d67788851eb5c32937fedae57b59fbbbce6bb72..5cc01bd3c7559ed358344704a0bd72735292f96d 100644 GIT binary patch delta 81 zcmbQoIFE5ch}Qz4ge4x|B_$5GG+>rn`vF=K|?;nW{94>g5( k85&KByuv%Xske=RVa_D&onIshH5h=v)78&qol`;+0AxZT0ssI2 diff --git a/res/icons/graphics-window/other-supp.png b/res/icons/graphics-window/other-supp.png index c577c9f607fda1b97c776e8c607352bedc816e35..a5577760f672e5021f77e0bd25ee7ccdb5fcff7b 100644 GIT binary patch delta 168 zcmV;Z09XIt0qX&fOMi<=L_t(I%gvR+4!|G?L+Qf*|8jRQ*_<*a1e1C4AdgZ7MRqTe zq4P&o;xZ77qJ-BDK-L;z&Zc9aK#~%)Wj0FyK(Z%0Y4i@T9eV_~!oO9M9DFft>U|90 zX4Wcbz%7c>*9Qh98YS-Cq-eE8+RZuwHPB6cu_&4UwOJ{Yz3Q# zRQ~okQN>3HR|u(;lp_Q((UP8IBYcWJ&vu@C+L0000< KMNUMnLSTX>Oi4cg diff --git a/res/icons/graphics-window/pointonx.png b/res/icons/graphics-window/pointonx.png index 3ba3c7c7b995a83888eb2cf52621c6de15306f7d..d6c945e0aa4a41c75e14c89d2ce520b6c89054ad 100644 GIT binary patch delta 188 zcmV;t07L)&0sjGzOMjn9L_t(I%f*wy4TLZZ1a|}9RCDxS0J@skd!RtXnZ$r4`~rlR z@x%Z@#Yf%Waxo!A5#0}xC^HbBxo)3{n4pYAAv23i)jwoXz!nRPC&=e>E)(>LsEE)O$o{P`({Y qz*61LWs>RYXiMLRFKB4y#?}uCnnN!=8itYp0000pzTN_`v`@WN7EtLgoM?P zN_p5$THuBSZUqFgmYwH6<0ZfqNtm9ABO*<14aJdD9s)v(NzN4w))IwEI79?|aSREB z+oQ;=sbG@IIWbotv$j$hpsi2d+P9c3$ez&>-ur_et|`hL#Wdvp@GZ;kE^V#sjlU}{UaFc*AWCG1(ii40WTqu Q_y7O^07*qoM6N<$f@b(GI{*Lx delta 108 zcmV-y0F(c+0k8p(OJz_=L_t(I%k7Y{3IHGo1)tLY|FR8%pqYa;GZZn-hO=15rM*?ilg$b5osfVgqpmOrddoudn5s{JaUHs O0000>{je>>)s;Qe37JYa(9FOoTm4Y@kq_f*8nDibIx(ewm1_{-UYZ o2G(D+^V)#>i$-1}!SS>N02!n)dop+ir~m)}07*qoM6N<$f?>BeCIA2c delta 126 zcmX@bc!+U=cX^Vhi(`nz>Er~7gbTO2)DF1p3HlS{^JI3@shWzb0tKgT!}W2T2^B@vlk*Ns|q67fP08{A zAi*|{>s-Ge@Ui6(s0>9K_Zc=ft(=xTO`2Qs6_|8oC0~}-p&o0nPzSAfwUIagK!iah T$?st|00000NkvXXu0mjfQ%FX0 delta 144 zcmV;B0B`^30n-7HOMi1oL_t(I%VS^|Y=99${b%@(D#}Qasc6QL1Xu_d{U2d8BO@a@ z20@HK){H5F44CkRAF3YwF2Wv0$Ueg3SuC-J0?xn~CL~BPQ7auW(J+nT2_QTQ2EW$` y`U{t`LGCpo{e@NWVD=hG{=(Ek%Pca$003udF9Ua#8YBP!00{s|MNUMnLSTZK+Bl>D diff --git a/res/icons/graphics-window/text.png b/res/icons/graphics-window/text.png index 307c70d4f354c36daa027ac9558f2f47c3bd0d9e..886a80aa376d9134a60665f02743d895f62e0a3e 100644 GIT binary patch delta 150 zcmV;H0BQfm0oehNOMiJuL_t(I%gvL)4!|G?LxuSNzsznspw^b?GEPRD2SsS@Z(-mq zBC^`7k|cpfZiTXC`KcZ`Q(DnfvXDS4sNWrmH!V2GzQE;I)>bYwcfbO6*9-GK4FoE# zsJfO(+*K%5Ci5?Q4YN>`j31M!^4MhC$Y$E9>V1x)9}SD+r{pXXT|%sySa|0#NOerH1Zc%vtRd(Om(eQq&<-fRpE X-`GS&Le?neFaUw4tDnm{r-UW|8tN7M diff --git a/res/icons/text-window/constraint.png b/res/icons/text-window/constraint.png index e48e8a1341f35825d3e879f1d2d943562590ae6f..431ed754bba53411d5a12ba1c6f2a49e52ef2456 100644 GIT binary patch delta 131 zcmV-}0DS+#0mlK5OMGWZL_t(I%k5H03IH((GxPsH+k+r>8!eR9LvwN?hA7d42MnuB zTo1vvB$XLV7#vb2mQ;%xd@hUbwDB_f%{H)N5tlP_ZOxtkqVLhYKdNoR9`5EG`RIa^ l2d@?sb@q=UqVj!qJ`~_KHRy;)uKoZ3002ovPDHLkV1jE9Ikf-) delta 126 zcmV-^0D=F<0m1>0OLt;PL_t(I%k5Ij3IHGobN&B6+d&WutOSvWcA5`1QHh=fyaE%C zeXu17r3b#qN|cEu)TEGhqN1LbhcP)%L^(p^cw38YXPs=<|B+c9avbbMa^$MDYOi)O gRN6%MJ>F#iApigX diff --git a/res/icons/text-window/construction.png b/res/icons/text-window/construction.png index 6f48aedefec91ee1c151344e7bdd01d63c000c6a..0ecc9a130513126f01c970193aa6bc9418aa7b87 100644 GIT binary patch delta 127 zcmV-_0D%9?0m}i9Q+QO{4FDks1H(w{KLJDe>z(H#rDyD)Xq!-|A|&W{Ii5!cl%rD_ z6&EV#Z4o{q^~TnmJ*R1{(S*jW`G0;NAAfGMb6IOv#8^%nYb*-#9TVD!izfL~p+GEG h(#QImnqQE98Y+Vo6}Clp-3$N#002ovPDHLkV1oF3Hc0>g delta 127 zcmV-_0D%9?0m}i9Q+QKB4!|G?gJnw{ub(&F{V~P#tUUu z3{a}C*9N)J`g6xUYf96o(SYXEY@go8*WYtC?bejzVe4pw#r22HHl&)RP|^rlvEfgf hGPgR+2}f)4eLMqj7f9P(002ovPDHLkV1h4UKNJ7} diff --git a/res/icons/text-window/normal.png b/res/icons/text-window/normal.png index affd4b43e29d4b718441acf869cb9b496a2f888c..95a83391523c31ad18a202ee23a694169270356f 100644 GIT binary patch delta 109 zcmZ3*xRG&!cUqvQi(`nz>Er|nh6}g4+$VKvEi(XuNjYAnrm1#LY9~KNWoxtg9eAZ| zF*_h(VxH1f<#|V5EHAZMvafpv+w}cy^R9b%Ry&`}R(ZB^;dF(U{0z~N!t2)ldaA_$ N1fH&bF6*2UngFKhEtmiR delta 102 zcmV-s0Ga=>0jdFzOJ7P!L_t(I%VS^|vY@pUzdRFFOkrSPU?k0y>S}Ub)Y^(iGwI=i z$so-|RB#KPV8Y=jra_c~sO+M_XApG)Xat85(E&8F(-Hjv045<1b_ZT?d;kCd07*qo IM6N<$g0}=H_5c6? From 7147a612fb7d1e375210423ecb7c4d5e102e0844 Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 3 Mar 2021 19:48:40 +0200 Subject: [PATCH 251/646] UI: Update the "Nearest isometric view" icon to a more typical view --- res/icons/graphics-window/in3d.png | Bin 229 -> 229 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/res/icons/graphics-window/in3d.png b/res/icons/graphics-window/in3d.png index b30426c5551088a67c6bc5fa8a33f2e49d96fb56..bf395f62876a4a7a76b8c450dd76da2782907f17 100644 GIT binary patch delta 155 zcmV;M0A&B=0p$UZQh&9SQ4YW$2t)0{{jcmkmf$iK3NpSF@g=lMYkx=Yy#Vo0bdg86 z$rvJ3aE0V>D)rcH%>c=J13;?*=;Fv}J~=chi87Fc+Bbv~9%+># z=UBf|=35#g;d__F?UG{Xcl3@9ajeYqHaYW*frH$HDC>HT8x#+IyqMDh+He2>002ov JPDHLkV1nhdN>Km+ delta 155 zcmV;M0A&B=0p$UZQh(i)!3w}I2t#$`|9{yX22NHhX6<3jQwjAMR2111nyO|tO;GK! zXB0Cl3bekuUVso?jJ9Wb4)Qu9>A|l7G@qZ5lHX&`Cs)9m1W)h+3yNHyi zTyL<5)Eeig-qH$0ZRw8}auwtg#0nw~1nY?V_)~X>yZ Date: Sat, 6 Mar 2021 22:52:04 +0200 Subject: [PATCH 252/646] Icons: Fix non transparent pixels in line.png and pointonx.png --- res/icons/graphics-window/line.png | Bin 158 -> 153 bytes res/icons/graphics-window/pointonx.png | Bin 255 -> 267 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/res/icons/graphics-window/line.png b/res/icons/graphics-window/line.png index 5cc01bd3c7559ed358344704a0bd72735292f96d..356130f98bb798eefc0b3e254ee20d0a95648835 100644 GIT binary patch delta 55 zcmbQoIFoULH>2f5A0_QmD>N4`3%DpE_C#p%#EE|2G|A0-2>&SeIMhP`d4S7=%=au;=;JmFDy(t1u;lnDca>;=QkFBi&~ PGXR07tDnm{r-UW|f+Q5{ diff --git a/res/icons/graphics-window/pointonx.png b/res/icons/graphics-window/pointonx.png index d6c945e0aa4a41c75e14c89d2ce520b6c89054ad..0fa950659253f0c27bb6e3684b10a7e17b4298d9 100644 GIT binary patch delta 233 zcmVIn5TQs{Z5o)lY=D-(LjQ0HJlK_qh(n`5)q0R^Do7D$vTl$ zCJGvU5HsI88fX4qguoC0gyfb-T2`VBF>JQkxxe-n;@YFqg<=k(smSU9&@z&vQ~gY= z0a5grqH1?}amw{1yS}n3QM2j)Q?db6Q4VVnKd3M2q3-X9dhR`HiSj(P>7BF(%K%PM j$8do@LBEJ>CoOdV4{%4hoV-K~00000NkvXXu0mjfQh#CY delta 221 zcmeBX`p-B)tDXS_@|Lkr1X7#@9+AZi4BWyX%*Zfnjs#F}zNd?0h{frnlMnK?81S%^ zGv5y>{u0lyYu1hG1rA4M9%)eh!_+eU;}HhOqwaU_7a1zL3f|?P^hC;cf@)JV%gf83 zhBL9 zMPL2f_iWDDuhk)M*KDZQ<$0yLi0w+XOM1XQS?>cuch99xdig5D`+mEAM#i&a*Z8?+ VIqTa>wM_zf#M9N!Wt~$(69AzFUt9nH From db5817ec79571c74a7b3607a108cf9f4946daf11 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sat, 6 Mar 2021 23:26:18 +0200 Subject: [PATCH 253/646] Remove res/icons/graphics-window/Clipboard01.png added by mistake --- res/icons/graphics-window/Clipboard01.png | Bin 256 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 res/icons/graphics-window/Clipboard01.png diff --git a/res/icons/graphics-window/Clipboard01.png b/res/icons/graphics-window/Clipboard01.png deleted file mode 100644 index bce210f38a6e722bc58d2a2c54445280d501a83c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1SIoCSFHz9Y$ZW{!9W@a@|Lkr1X7#@9+AZi z4BWyX%*Zfn4oJ@ePZ!4!i_?3jT;y#~;Bl!wGVxA5)7+PT43ZjyM5KQw^2q3457H76 z`CzvFb-HYG(3Hgn6U0?Mn=^cw8Y(Nd>5}|a$qEs_rmj_%B3$Ql_sgivuM|v6^8c`@ zR_BiJ>BrgE?u1Rdw Date: Sat, 6 Mar 2021 20:26:01 -0500 Subject: [PATCH 254/646] Use better pointer cursor for link text in GTK Gdk::Cursor::create(Gdk::HAND1) yields a hand cursor more appropriate for "grabbing" vs. pointing. Use the recommended create by name API to get a "pointing hand" cursor. --- src/platform/guigtk.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index 1f0cc55dd..94247b458 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -963,16 +963,17 @@ class WindowImplGtk final : public Window { } void SetCursor(Cursor cursor) override { - Gdk::CursorType gdkCursorType; + std::string cursor_name; switch(cursor) { - case Cursor::POINTER: gdkCursorType = Gdk::ARROW; break; - case Cursor::HAND: gdkCursorType = Gdk::HAND1; break; + case Cursor::POINTER: cursor_name = "default"; break; + case Cursor::HAND: cursor_name = "pointer"; break; default: ssassert(false, "Unexpected cursor"); } auto gdkWindow = gtkWindow.get_gl_widget().get_window(); if(gdkWindow) { - gdkWindow->set_cursor(Gdk::Cursor::create(gdkCursorType)); + gdkWindow->set_cursor(Gdk::Cursor::create(gdkWindow->get_display(), cursor_name.c_str())); +// gdkWindow->get_display() } } From 105bf7731da96730d49ae874694248b491901fa3 Mon Sep 17 00:00:00 2001 From: robnee Date: Mon, 8 Mar 2021 21:24:51 -0500 Subject: [PATCH 255/646] Hide editor window when user hits Esc --- src/platform/guiwin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index ec588e62f..b93b87b4a 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1095,7 +1095,7 @@ class WindowImplWin32 final : public Window { return 0; } } else if(wParam == VK_ESCAPE) { - sscheck(SendMessageW(hWindow, msg, wParam, lParam)); + window->HideEditor(); return 0; } } From 30f4abac39a440be30c22e7605adedbdc42be40c Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 13 Mar 2021 18:11:32 -0500 Subject: [PATCH 256/646] Add new symbols to the vector font. unicode 2334, 2335, 21A7 counterbore, countersink, depth --- res/fonts/unicode.lff.gz | Bin 475974 -> 482562 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/res/fonts/unicode.lff.gz b/res/fonts/unicode.lff.gz index ec0501dd9569e287ba85ad055a799b9d28296807..6b1b04daf484b2d5e5d5281a74cb354bc1834f0d 100644 GIT binary patch literal 482562 zcmXV1cQhN``>v|h8XZ<`tq!}WJ!`gArPWf@9x+0!+7VmTEUi7NimIBiM`Dj6u{Bm~ zMF>KItl#H*&hO8A?(;tP-gDn`?tSk2T){*}#v?r=yGyhmyxbf?PR>$57ne&IvRktP z%I97jSQGvo7@YRoYA$%|MM2Zz^%+Skcf)%95m~3XzfroEJ<}yCHtmalMQC$qd0#T{ zcD*?kEbzo(!17WZ>51*t3nrlph>|0g|1%Pdwu%+=c5SS(tXu}5hm>*5K6e6iN!O61 zB{ndXpiYRU{*hCpk~`VdsAOp{l1MrATVQ}3=Hydi0kCbNZO8$G<_Vel=dNmj6}2P_ zMrF`AEM{BwBEz=BR~T$BD1HlY@*<)0WMu=Xh7$}wq?Hc)*PkVTJ_BhG*b0d&hMIO( zR0IQZN#n2^4uK9r&ICzI0D|8XI&_BtIYlK>S6aCoLe=}JNAWOfKSK|o@HPRuKqGjz zVmN;sSQJW=dJ}m%nb=G)Y058JN&#GBRTW&%!Kz}{HrdW>>c~pXaI7F@1wuJ&RKsD_ z37u%-B7``Kz6d8#nju6i1nnnywoK&GH~~|4<)~`}4MOyPHeq-$b#lF&s7gJ=!cV%h3eN+>S7-%E-GV_o@Q^JK_#eZI!)DDBu;!sH z?4(n=V7rq_fdmy^gi%#D)4M(%=8BC*8y?Ho!Kn>uw-Gvt7@mjgfT z8G*pZY?|O?TI#=kB3tKKH<1nIPqigQbk0z0TVRK4ARECRG3RmR`^L4D#D5&WAdi$xHd@<4%v z8LuX^#!lFO93u=hHzvvdO(StTuYH8K54l#1LnIIWx40|>Kq+=RxhQlI7;^9*pawx` z3Jh&Ls|ss1IMqZlDdA@TRTQ?Ilp{NHaHarDZ&{?U#2E1&8=goT*E!&v(!(ogVzcqeSQS0{i((x7bXyF z7!z@%cT;b0q5T|x!-M5jln|j$ZgtV4m#$ub*=k(o6Z}VX-YI3;c^4Is8iRMT%H`KM zSa;h}ZAZuuM$As`XgHwLBRrn0rl|SN*|G9v%(IYpG=KV zIr7rUUyc3wZHyF^Ud7j-W($s8Q@%Lm17uyG`<<1NPxdUyZL=rfU>c3=F4G6t#U$6!l|zjqH889p3bp>Ubg0Zc=Zx z_O8zeaEnX;nxfM+kab0ao^3-Y3I*)%^!Q$${$N5%80<%D5#*)mgQmM7V(>N5MyYnw zI=ki_KnaO0U6axc`=+{OxC_7$*~oNI(2?~9F)wQd*+dY$2btkTKW@&KJkU%@aC58~ zR7?|#Eqe4FI7h+d~;9%mz@Os5p;} z`Q@E!#}QC_h!%sLOr7J;SLNJ*Xo~c-*P1@aD~(6eDkYOw2?N}rI)_nA+y*=0OQxG3 z!kgyP$%>B9RkC6x*?ex)~*4@F? z_ecCqne&ZnP@j-5baVjM{z1{4yK-oXTIe*Jer0$Y9TGZ7(zzkZ;|6w??Icu0qVo^h3V$tre$064KF|_1+;F`G`O04 z;<8%^prt_Gwa*@6EN^7WENMl{_ESzfsR!{A=iV@ zs5Kbg_>rXMUh)Os>SQRW9jnT_Jr`~e!$Z!nnJjMK|h4= zo2SdKZjE(5lT5pQAsZ)XRcMv5J=hGtK=D2v`Q~_rehYB~wIloh;?(&XZ7vnN^c`RU zSpZT|^}ICX0Jv>Sl+mSYSM$BD@>s#qjZMoR za~|O0oa0vLwebDs^d+o4$PQil#wc3G+P4s~dD*3J<6Tm!0?NNgHFS3_+{zH1jO|}; zS>i7$bAR%Uj6|F@q9@GV2ozH=4kZc4x6evfSh-X+F9!zH)sUAL;MZ*8T{^a?ZAY|h z#@%C2$t2~}uzfbC_pLxc)|2GW0&AQH#5K7_jq05gvfQ>QxO%Oya)$W6l(cUer#j}K zk$ot%7YP~N;p}Cd;aCP_PnH4SUhsvLG_CUBt3MENvn*5*&V%A~4bajSG+-O*F$|Ag zJMZ|Ap*izsH{ss%SxeC}vQ9{EV;XolWTL1TK=4q;bu{iE@9lUY-C^O&xkuY>MF|Ee zdCjwDbS$(B$<}-L65YIY;n_9VKU0ZDEf4G3nz~|~_}iN1$a5v2raNja> zd=n1*CFNf4`Fb=CH!A`s4KX3&AI=6LrP1D-V0W?au%4+4i{CU5IzR<_$ur-5at@Z; zQ{U`I-=ZG^omo`ms~vfhVJ}rcyj8~2ImCrvJv?P|JWr63gl25~7KeE&kZa(+&?QMj zcOB_`{*}ENch#+=(bR!kr+IP(Rg}G&{=&f4m8LwJ_Ews2!}YIiMt@xE+NsAqD#QYh zZK*>U=JXH4%G=DZdJmy^VU$<=4uXh)oPcq5-ClT8ALC&U>Me|Nk$gMB!z`enT2F#= zXFEPWKTGQFn=m*RLJD`9x=Js$L>mBKerBW8j+jGt&88^!>4$Z8LvMk}V|n{?m0NhI zAeg*9e}J?lsWlg^VbpD@eYaG1)o1p2mpfXZ)G%_qfLL)(FX_W1G%<{vVT|!xq9G`& zcFjS~iVdCH&%KQ`4pED6%H7lh*p5q0);BBg1kXw8F1NWw$lomb!MU^#RN^d6I5Tz^D*{W$S@SQu<2)-RzgSg{DOQ;onQTK@aiaNHY}sBh2!=?UeHBg$ zNIl~VNtU*pq9*+9we^GiBEVc(C=VLfZTrWp6wfLiNR7hs=f_r7&^@_C<0);ug_1ns znJSwGPO6*>e$CF?Vonz0{yyYsU#HR*a^&Ul_tQ_tI&v5gPP@vMgxMD`?ljrEuE`bJ z(R-~iH&5-37fd+)y(`ZMu(Wm%zF!*Sz63?9_f@mf6NPa1#fb# zzp)-u`O;eb*?k~EdZrHjXFj=N4m}kB9S`74c*OU6jSc*W-oXKgk7JTq1Ht_~Z{ zlBfv^rox%9wF{X*sK(*QJjcfx4*`xCUyC;$cqUP4h;-(zS2|i^4TN4Y?Sl`*B&n4M@48{+4kwR{T{OUS-h?Z{sqQB2<1O zE%Q>}P0HKWFQ4qSbn`emybzGKFuz~{?x%t|_wK=iJ;RTo@3_t-J;URX4&;qy!2>*A zdivrIwl5|^e*cyNBI`GVbkJ*EIBsWKFLfNM=%N9Rp5C3D0NWE z&6960s#RU)HykK=QK@pQ`u;u$;79Q@-%J;mnk0Vg$!mt*Be#0Y=~U+f ziuFDmcsCVmQh&x7+TPaqy9yM5P}=;L23?jq3Ov`4nw+%rw?OwmXg@DXu~H;Eg0dl! z+YBKuVlz~d2V#5$vG-pR0uf8$+~pqFpf-5u0pYGvfsbH{g9p*2T#Ql(RVN~?dsi0T z%M>M_AtCzic*mNDMJ%UC%_^K)TQ3p8AC6!Bv{Dy}pw73q3Hzl$*1xh}^FHr)s@swM ziy)y&bD*XD+ z={d%mcdl+_lIS&7!hVZqCm!;`*&hTg5M_#16*WqxI>_Ygj04{PuF|RjbbbS1TCs_+ z_G&v=HHZ|)z6K{Adna-fZCuzf{O|zt>^W z8GU}KVb^g+Ve5%1PdeIsSk0pD9tuK`d+&lgX!h^iZYuD^RGE7X{4g>U za;wQhY_}JA?pLLXi~|tVBK5D8P-Wnqto-_3s#an4Y6%_j~t`I6%I7bM`!@wL4b72R)v3M`$c8O9o(?F3#%xxf*; z7({Hs|7~kD)IP*p5)-*Csyv!vN#k%jQQt`_dP&&Cv=LAbV(K*q9DLXJSV{+5{R60F zMhYdJnQx@~Q_YpF&{mp$pE;#yc@>Mucu8Iml7Fg{YM|(Pj%fmsF*-GYb9)+Jt=9j} z2Kd3Cyzo;$*}c;-eebbNPgd1;#%InDa~+94K?ecG$nLu}y8Ht_{{#H#EqftbhBf5uZb7K_^u{P_ zfxdL?gbT8oLcI3g!b5b_+n7)P0uv60$g zu*U=s-dDz+vw5xavqC9HRtF(%n8I%Me^~@`&)J}95E-AL_C4|H@Mm0tl>OpvbNIF@ ze~fw+j#OZs#H-0E@L1V&o&k4M{)!{vM}+wpN(sL zyeFqB4d^7N-UOrf7s<6Y&P(ot=2DKzo#*Xv(wO7ncZDdDjE0|__2cbZ1$WzTJ7AFO ze8(;bYWYzOrGn%KkmG}3_SEHb$+=P8IuVe5GGq^Gne)VM zeXywP8?$Hkc7^#PrnXP5`-rdDZ?sKsDG7dmTaE!c;d_C*l>vT@i~i7EApRh+-RBhO zs0!r2rIuoNK3}y9^Ax$rZ*XG-cD2gr)Z=0EpO9wnCo+5bhOVR`r^B$ z%VC69K<&i3AzOuGlh$~ROBJ_E@(E=&tHuMJzi%&OAh%1jvYptyet8dRJM(Mu%78g_ zE8h82M!T{_D~Ly8K|t~RYv zws=9k5;#$p#bsqSRo*{}V}`+n5y^z^#TaYE!0}kBtv~c=L*h+M(=TZN@DLP!2XIN$VUb8ot*=8&e z-7_U58fF*bHLSK3AtDkwY-lr5~)2?4?;%|UMZMX!B1ChpT8Cv?1UakO$I%=wAQRa%K1-zD=~%t``ybLp}JGH z^l;^ufojf0=s%EZ!&)3gXyQw3OU{-12~nqQ8MTYUeWDN4L*chAJXZso^}&2jJNa%QO7&3b`fu1l zEZz|ngR5eL+<24YSPK%oYrnRfOYSU!KXbn$dKsUd2X~I}3*}Awr}+7u(7lQ3FN*DT zsU2l(yfw#^zycKEfUu8ybb!5dbO_mCDqNbQO0V`^5TZIbD*jz)IC)T4*`4qCQ+}hd^X(%k zR$^2Qj~cBL0F!Z7eKvDR&adw-wj zeFjx3pSQ`VTpOz#)AnfZ=MXOAjCNGGJNyV$VUemd9rCH^JBRfkQM96T@G~X`r@Op+ zRb_~`=7=ev{I#b>$0Bz$0^Gh&oZyv0t|t4&3@(2Cpb1a@2I^o%45J!l6bh`Z;L|gm zdxDNWilH~H+8XMT;DI(Z_ZYUhvUBd_qg{R|E+2O773j2e;FD^?|CYG_{Bw?1s4{>b zF--kT=!K``M<+Ir7 z{3!429gyN~^tkB4zN(Ad6qBT`K#_ROMiQ!MclS(SFy9Iy@N|tD6j_u(CaJ z0_g5m_g`VpSOu8#*bAFiF9CkG{JK>A3TrSaebCcp<|`!7X8ksTf~76wA#UP0+mp4z zq&EeY?+VZN-CtjRfR@BF_JJbg=<2aCl{;DJ`g#t=qrCMd+B)aICCYZh3Lu^KG6Ips z{`BHhdDVebzd8adHmbQ&z7eL}JJ7FHE@A$dnL%M?p0fEgG84tfJi|T|6}7LTT&^_& z+dNNT%X=658~fK)%`@n_iZcg3b)zfH;ucM&Xqu5CEv@6#zIeWSJ9GHqk8oeRo6J3& zwo*>vQo4Tk83Gs>Bxxee9PMHY^1BMRSJGMG19zHgu9?Y1jFssd7aYo5|J(^Q8t6XH zOx)M>G~ud$ws7a&){97`&HQck*WdhBMspVvQJwJ90ZobrFEE80m_qfbJ>L$iRd%RV zrtmQEHuiDW$fTXRb`ELHvYm_ZXN&#Fy8Z9V`5v=wDE>U=LY;~y{I5-9)?Gglk)OTD zf+MxcN6`QwX#I-&h5YF&tX!JgKuA&Ki{VwGf2~W$|96`k{=kj?Lq!IaAwmxe)jI*I zE7rw{SJsvSm!k=o3RsyfjP7JmE6nO&b7ado!*wfVGrmTM7~hkiRv`3wN_ES;wL63oymc zvuDVu;U!c~*IKx<)gE}f^|n*%aWuT_jx_nHD*_J2|EpTc@d{sFmXR71 zHGLC4zDrS3H_Wr%4W>N6&(h7`3SIDf(~yF^Z{yW_!X#7@@nhdC1b@dAc>jX&Gf-7Z zkZoi8OhXiz;xy+I94s^lw%Y+nz=e z`+1e3CT?5;Iu-s&L<4UiLRb}c(F?)N1(ow2_^k_OW>%uUZW2H+W*`>sQj zxy!eOFl+~Zj&FtSt;2H_*yuVN9Tx;Rnid2v4nyl)%|P*dOD~&Mc`>6uZ85bvns(0c8-oA0k;Y+L={=NeWECRKH=Z({_&^Sja2qYYZ>bF z96O65Hu}z^^SLCrEcLiWIZXTnrah?N%0gNXno~ak^%cgB{i?SRJ#L5AJv@q_yoNp6 zA7-cBmYdH$G%X57B3%b9N2$%>yQ#}13AY{jrmMQY~bO!!5ae7>Su#rQZyFdFIlkZ!H>SZFa6GX}sc zGUy0+J^zS}8~h+vH=h^i-nL;3K389^;CGW*LSO96nTkA3vb%_X{v=U}sIET`ggJSR z5)58m$g5Mm(JQN=FAUMY(3|m=xl_BL*^c*jvMjDC)89JeNXj{BCz)u(vp8sy>#)1Z z-W^5^n&boq+`4HvgJ61FtT$w@9CBujQ4b4Ydd37hik5=`0i@4?J_9?V&$QF6L7~Rx z`>Czr$>TuI13X7Sml=l!C2?+ENehrX@4ArD_=x##le^Q_4>jI_?W! zQ@s6!uHIzexdA{ZG(h4H@cd365nz%@o>%8ve2`|b_VuGun#^;an%f^0!iFwOE-5Y~ zC+le9E;P;e2M!i~`l2sR;-d@SRN=l>SAYYGcH_UFclM@)R!4nb=Po(0Dhi)@u!P@W zU#y02B%prtzin?-E6y%h{{hJP^X}@5p=(yeF=+?g)}r{MeP-cJ;CWn_3k1on@MKS7 zFxkl*o`~C1af2s_Fn$FsT4RH^}*OtmJ*v{sr%L@G=6I&0kHiZa}}VHd&1)kXr2s@dssQ(7(IF&xrABNT(ut6 zu5+1`K93EZu{wl%ziaLde~oN?E5P+p7E?uk0GaO|h@d2zO8~iZV&l)hF>I;k9ToUF z^g)4}G%Fv}Wka)BI6MP=L*#m0YK9=Gk-dy`FXAANQ=UD%V)8kkC~XrgUw{NJGio=L z75BzD2iLN^X_CROXmfqY=|}{oociTAX*^w%iW<51nM)SN88_xWyuFzixwtq!s- z`r57J&*{JUF$LMrf+rK+^u5tQ4vVw2Pws6;#&5QJ1nKT_B0) z#b8Ujpu)!6k(yUyD4#c?w^zLFh`VfFf7p;O+^8$n!24mFV^^Xds<>v|@gU2o{FD#O z%fjPM#(28z>D0Ao`*a)8IdqIE-`sbFY-{vp7XiGbEus0tvetJJb5RGXFeLw4401Dg zZBTnrL3)t>cj7n*wFd=g8XOD6aO}AFi(}5RLle4#`WTSVctqM2(MnGJsN!g zWc_O#Kk>TOKB~qQ`Hj4;OJR%`9a?}XY?Ih5xIPGD`<2u=r8pQC7dv+tYQiq7^P3lL z?7dT=51G@f9~~NaK!Ne0-hIcVC-Z_vV0+aT^S{E#9a2e^Z0IpPQP!Sw_j|}C#L^#=EBM?=jFl6 ztG0pfzKn5iJmDI7(NJd;FuI`Wa;+#y`1O@RoZKu@`T#tVfhsB?Yln)j0-GD+13sm+=$|J<&M+ z*WuKUnCz$pvG0e*&ciS2TP!N`KXZ%JWBMZsBkY%`lRgTt51L<#bSA!Y(1}sjz7_>% zNpFMJ;vNwoDix0VlPv)V_pkjLDZ;Eu&x3Ose>49R85|EqtPi~ZqnQbsB@&|7`?7XX zGJ#Y~dzd&C2;#VPid-7i%V((Hk9}7dY{&gwc;aO8)1HpJjqA!Gt(iwm}r}{A{hJj+>MMM2nEmx0l z=E@)8t{pXHm!w4?=xTGtM{d+~qxq%#`?!PwRSgN&o-gFvi;Vhx)x5)RCQ=VH52Od~ zL^Wx=p8+YEZtFy={}zryinyM^4Q zMdC7T28fd6S5tO&Wr>a@P1&WAf4CCO(5zB4SGhW-Bw+CaVwIz@2-(ra4*_f*Qw_iS zWPG|!HL4d@oUtanuL8eY*-_i7*$MVW9}9x*VicoX)rUHOO`~P>G`7NC2xh6b{+It+ zqhHb{ll`Oeq*8oHf!>P^^H#3sPc`hvrfu3LB7gBa*YD>aiW|M&y3`JJiPux({BpaS z-{5PHT%*`_rmBd*X$jDKn@4ip^qa%>+9?JvhWv<)_iQpLwfD5sZT?beloB^9(&$Rinex@8UDM~pe24GqUTdWJ!SIitS+toSped~Le;Yf-wtN)!?Bptg8oQ}V z+^_Aowy&eQlJ2YhGaQ%y?d%t?9WvJ zH$IeWeg^Jxs5UK`G*-w%>-KcI5Q`A_h;vhkDhTP+%_{l%h)yj?JYS)HQ%QK6Y!n7QtK*hcG5D=9Qe)l2VHvEL2EC=xg z$2itj@wV}(Zq&s;OoSAGuI}Q^M~AHKyYp|~|2iV0cw=SyTEUKk6foodiUjf2&6oVq z&B2hv^ zeGOA#9HcxJ5pB{_5P~0Nj_k%RbJsZ*X*boXicBv_^9m??z&M-9=Sr> zTh$X%+B(1N1lEL4hjb~sGT&XxF8%BimIIW?{bk2?$hZCNhzlZdX@1YQQ~fK#{&;vf zcerxp_Q5h>gJwCtBB%ydDCXw6`R$d9VQW4&n)OV#(`XUeRmSKCmTiP#SKsbpWe@Uy|AYr&{B^fcKZ z&I$i{;WKGfi>jIbBvi2xH>0@3;obB;w^9KM&v?nwr^8)&4a1Sgr|zr0Kev2q7Pr_N zLh{+?d~n$P{3OnCIfjuLG2iyDR2N(J2j)J_p`b@ffmXaU!Ud#%qSJfz_rTTN4D2xO zH5w1V#o=vWgfXDQpZ&@ryWF9d;g{0G`HukIKR~qfqfMuzOLl`?p}oEOy~Sfo8l7sD zXF8{;7>7D|BSY?y7|Wk_x11Wv_}#5uQUm!B{2J|@fh&fBeoeVoN2;xZ6=^#p?UMtO z-j!cgX_HKKH;z=>?bHWxX9EUl+Z`hN7ZIFXYcKply{ribV3-!l$Rg}C1AE~KZ#Per z%kw?mWqaT)tQ>{E8i#!xc#qLubrLfdFB`$mJ7!ID|NYG=UshIQjlrbE7-c=f)P0{v zEHy3CrfD|h8(Ye1>?uSqU@y$R81s)&JmXcc^1#E~3MFFk>)40$ucRXfZ4~{rz!wwc z@=Y}J{1PI!Z}~u^e|_vfFElLXH5$;5T2d4BF0j93&UlGC?vTkBI!vs}X-ki>F#HtS zS{H6CcAeo(r6BYbo|W!;U{je6^b|2W{p0zg-JDN`G8`3AQn9z!y=@#m3-$~2|KfQU zFYn37fD>WdFe%fZGzKvM6T^2)#TRsyh#!PC$^6_t*<#ImuLIT)^k6M3;+uLGwTY2O zRhX^G;n}eG+(bLMY&>++{+hQ8if0WF4VUVXrIrg#viAM z*ty)5`(AIrS5TBE{Aj^JTKf)dlhhj(zz=~yoau{S=X1d%lMKK2YLDKLE}xC}z8Qkb zbd~iEuG;dFtf!Pq_2L~K*Dk)xpo!x5cNTf*hIrI7-;j#kA|Z?S!Eu1~FYlCF%b#bS zPht_pu{5GLelT`wg}zr9+ddqoCe&D(19A>~Z64IOppYHqOtbsSWw8Bd71KxcJ_=#& zwp-=3GprmjV}mLiPuKXDI#Yd2x1Wq>Kw=qgMMO>!VBayP-tMod9lJ}5L63LCOCe?s@*Bh%G?M?@sANK%tqZZ%a5LfgV z-2RqGQ8{5vnRAi$_x)mOq&7Ux|!a}+1vmf6Fo4e}6zbYBWi0dU;GlOw0>gW^U$d`S?!CPA~ zCXwN)>T3l|{$onXSD~d1U3x=JJvDqPj%Oq0Q@OwPzgZt>4G(-RJ|`h`u5D9Z>Q2Fz zi3>#?nn_ylyq^Ri9$i>qnKgZ>mE&FQ>XDUx)@^RJ_{e_**oa(5=m^%&L@r$Oe63f> zI$Kc}xzuHbp7FVH5;Uc^JHuTVA9BcmJ)VS|kJt;5b$k@c#!A&S-pK0*9WblMNYs-Q z3PM_7+@ZFHAGc-lDHH9GFYpW1uIr@1yfq#w=0`!ez9+!$@j6~3LwW!=${nCPfPm1B-& zDb5+tTL5L&{}`V7+13h+d1#8y+m`tSIk1Ku!23Qtx)!!0-Q=8FL42tAp7zI`eu1t^?Zoh zsdNu>y>48Z((M{W^QLAW$-6eS-IT^uk-ehKsL|O4RY}ntntaCa1pZ4VxGSADX}B_sjW=CLAguHiu7Mb%6uMHMP=K% zXfBR0ry&4UG=NY4D}JAhv6Es{pyIZk01w0WZ?VnsyEydc{)i||AOji0_v0Nrb5PHv zBqQ&B$(D^(7obHg5f`EMrzX_3Mq`cli7ag`HG`#&w7z9+X54&0X5p4lTP1}Vqwbe6 z`F}F*^`9rsg)5Oep3BwtN@ zUo|$?{OHV0rU(3Kb|SemJ`=Mv;x&_(JMnaK^7c&3t9wvW*hl-_LG%aPixF#PoxjHa z{hU}{5D#w7>eC`*gGg=`ovVp4x05V*SmM%rwc~wwmz*v*V`?X@dd+ zuDE}#GP2~+z?DNg~HD( zqIH^is8}Y~;slz%!LY|Aqd~bd+qlgudzX?X&}MO+M)tKZ%jBay`B8y|jx}c)6}^vh zhTPf~_}R&krJT2~i2;Qk8D&oN-YTzs6Zcm6xaBo*eP7nYSu!J1K4jQ(>8xpXyN-jc zV}Z%>vS+ngZ?_y)hTb#tefJ!v^&biVZ!Gk88FJr;Ck}4~|=m@}(c0 zQKKDz*?vyxFgJguZy5RFhJ9ngWol;8twBd2;*6D_BdjEkskK`TrAu1MM(dalj^jPp z0O2hUK5z55Ta#F7DkajT?N2T~=wF~hIN9%8nW}#KA#?9bngNqn0R!i99aP%ef!P`! zX*WWQ7WhlNyORYex^VQ3;2ygk@maR!L`&K}h&XoTK}N8`^pbw<-t`}Ta!FAw7aF*Z z^&n;d{OfOyd}%L~^cVa0mAm0B0gu^&%Mk6>kily6nh>Uv9J(IN#?So%n{s;i$)7jh z@#dF|?o0QolQSQpE`#^9L-<@!(;I1s0EmEYcv45ObGSTE!dw%&x zz_0o+=wR<@YM9KR^{dd3+r3CZ4U{duf+G9Z_NsO{#=Oi`AvD5QC7#O&J}rI=O(NHJZS+8xxkL1=ThL*|;`M`PYW4U!7LFbFRXUHvYYPc9o{N(m%bX z@w(usMN5^^M*TD_Dcp00nd83gUFFNquYEa-ZZAQGiwb|fKJ_lZcjY9Iol}*dH%Ru~ z9ks}k)8U{O^`*r8`)nH=$T||JWEwjB`VNHXCm2`EqZgBw&mj61k&IG+Y2z;%I7Ej$ zOow@SPjmI32%{p8*?nI-HpY)T$o?xi7MrO)w(MzCT#jmO^_Oul^By zPpI^+oL=U2=jRtM6t9;#XflB!1LgOtHRxkq6`RR%f(OcyH@O&PE8jZbx0#ezeJICx zU25yzmV(CyimA&=`{(hej5@u*ZN@#jY*TN!_N7tYpC6m+0?LiLSd(Ht5geKyG<@Ow z85}O;_s{G{WHal729qji@$$`XZ9^;u&w}0PP!DH|DkT*!yomgb|?@dmBI39_sRTFUO2+*Vjce%*ui&sBB}D`nmHV~-|e`1xV?X9d|35XLhbox zvPGTZd++rbhY@Z4d4x!$!+VYE{$EO6+l~f0>Yh?W`V8T&SriciqohiO8$v4jt`+r9 z>HNWH z7RPQjX0d;qZ5+k`v|Tf%9*VL)-7mtkUY5Kv`*LfK!;<;hpa(-dLrE1|br4t@wMSfi zQ*hg2xTzXMYCKqxE8}K(k0XUeW50 zF9vQPy0s~)FwM&zeDV5EqUiRl2fK7?-&{s$h<1xj0`cr0*VWi@(Td8!ptAvO4_O9P zC+%|J^SBF+Tfrj5e;YRJ>}i~CGK>y++$3JfBpxjk5fgL=sy@H|#x=WP7n$^usk^7+ z=M(4m>3^OFX@7AOyZQY^M#}i*CAxa87jBFeLg6YymtVzsTsbyo)-Jm4%y;BB+SR|k zv8HpiXsSDR8!+9P^TmJf}2_n%ljdYg>S6^_%P1~g!>=iptMC- z^3=WgfhnE1H+=;p72%6NqtgYKb6#t@@-jM!>wX#1Q}Di%kuw2%7k#UKCgJis6HvzO zcdSBtC9(A{-G>YL{wmo&&I3R*q zeG8D@TDyNG_FSbH;Pl%2Oa~NIHP*C5{m-L%Ro9|KOjtMPgBb&JchB{kt{;NSFndfE z*RacTDl7rX4L=8_nUbSD^I+*qEf+JkWfw|^U!|mkHauL;%437fhAtnqB~Qg(f9uLG zzI>n4ddADYS#K#$^7U%v)}mIJ%5V&42U$iD@Kd|!1PfYO<9fWAaDaMX%DGLN}Ba&E$ug~-K=K{Dq~RXYQ^OI z%TN{W$O7EbvNrfZgKR0=w&5`iFH#N1Jyd)0eB$jM%?2^FQA==*9sr5dRkJI*N+H7x+j~Fuj^3lz7rdXOZ$<=Ab z>);p^%V|!6)+ICt@RD7~(1zZGSDhu%nnx}Bsr}H5s(n(dc8vd^f-hg}9k13KeHuzP z%d1UjHL_krFS%yCD%sbY`5BvBQvLqvq8aw{Yu#dn|>4B_nV8^b+3n5Of4!_nJ2PWOHemP5(P#Q4@MG8 z&W^Pi152L?i||zQkGD;{@kw{J(4OHHX9Vc_dqSq7=~P**&b*ZAe2uDo?wQ#SJi3M{ z>zBR!qPPY0cI(?qKa+Ky>jXwsT7pc%a$1c%58!r-Qbu_9Mf23Zz`FFV)k1CN`@BdG zoo?&mKV`{EqtnkkpS_xo@)>^pk~N24GM3b=Nu7xKf}4(zeFMC#%G&tBuIzz>&|X6- z?@$Wx3!TIAaW^|jI}zzxw|O~nFC;hG2`~g3)gB0a_v5VEXHa^9pZe4xMaIAL?oqt- zeYv@U>*V+27VIGw*v6;RYc2AM&Q~SrHAOjBb)}h3yYs<}8WP}=7^~H{EgMY1Y_t~r4 z6Dj{?JN>j>9;YQm?EK|UpsrZ3NjD9q;11*TR!DJw$ju>ThieV9T>G>5*kY4Ana>u0 zFSE$n3&67*w%ymRmCSiKJK`;X){q4lTUqIdNgzY z%h#3d)j(fp%Hrb_9rlN%$g^Luw{ZB%P*scL5I=44XIgSea38=!tN7PGK7k@-4oP$@l93 zSVLc}z(=hTS3F+Z59OOk{O5?*q+Ux9`P%bmQhC_kpGm>|nd@9vHm}O?J@M+u4U^~E z(-mKo2t^X2_Bqo%z#{d(y3d~#zjg=&1|P%7=bA5aoWC7rxKTL2Gw+LDcmB%yM%cYI zovBJYS8kAusTa7fDExmcoCQ}~UDvg7m*6hJ-MxiE2=4CgE~Pjv6avBB-CYV4heENS z#f!T`p;&S5H_tb|G3FmQ$=PSGHP3PTEUonm5*Gimy0dX-qz=%M@Brziwe`ib#F|?462!y&ZMm|z ze{92loKc}*cb~JWnna1i5eW5aGLqP`lbXe`GDGQ;d_{DWn`Px?D_^rN%=m*pYL);L zQ1*u=iaXAH0cV5Cir*QyDJ?B4jZ7erjd2GtrhUKnQcUMuN`^HBL0N8lwxGt$q57?b zffM%*m^px&@yH~H`Ff|~fC&mf%2q`Y89j>Ey*bFFtIN7yEyduS>g1N^Akf?SSgm1fb z56+>14x>BV&Hk}mJvmDsfynHk)n?|5zARDd5-0fe_0!}Oc7DJwo8D&DHpoU zV2iD{7XwG=GQ$-(k&7sw^i{PzWu{~>KOLA|xqM70chilF8-He5M$JBF5qJ5W^;N(x ze3ngz-b85aCu#;d!m7yMJ7g=~;9&IkWPKs@=81vO5!j7*XORC+EiSfb>4YZZpEoUy}mlc;*_$$Pn&f8$*4XXL+XRS1G2j)ml7a->DBX7JBK z@yiM_OGSTf{tm{)XW zM+Fk&c)X%y>SddOgHX(L=;6{>ObDo~Gy1v(^@w#1A@q%PNcdOUW3(g59J?FN*ziX4 zC@%8+b$rM(cA;h6vDG|t(y3hNoubKA!uPM=TNo^Eiv*^JasIqR(S3Fj1Qvm@g^EcW z6#wB`-F{Ueo;dF)`l;Xlfo-_jore*=6$H!h46lon3$oJws?@$i3B1E^oH*_?7P32YixOzw`e97EpjMjWtHxlR{@iwJpIS7o5e;gY|8nrV>)x|L+)a8MxDADx(gnh;tr%o&d znNoS+6t`7#`{Q^wc&J;l>TTYJ;WG`b`4weV)9t~0*SS* zIn>{^alws0gam=p+3-uUV}Acr2`imug9(t%3~mlQG!=g{M(g(YvLm?P8=B~Vnlg2$ z*rdrg`FmG#X*ZoZR9Ymev#Q&6&5Wr`?@lTOE8A#MNkmBBvbAGrh)yv4lh4l@B93MR z1?&w^G2V(weaJJME@v>)>{fKF_6^TSe)lky>&(R9jpGwV;DZiKxuC}$VrH=Qugx0$ z48e2mBuTzcZA40`=0i9m@wF{S){|jLXXrsD@{&QkYj1J(c3I#!*H|fLAI6pLeQ^u) zEmqrA^M>cHb~>Xkx5PU>{TI8D5=wZ3ST3DLqE8ICHnb(jg-l9#YLa58JJNIs`pan< z-o_DH9cX3GXNT5=lt*&dhUDdsBjOGU1YmKysM0pev?t})UGX3pWv-gBv~IKgM%I1U z$UqozfVUg$3Lu_$ram*haubXL&ZcFCsgtzy^BZ<5+k_nj5Vk={6mKIa$FFJB0AJd- zvYVN(5Ao&q6c>QeX0+8rz>oSoPmn9Jb1x`ujGcbJnO~cJJPByM)$8YPfw8YX$k-D( zqiq%`pFr{A=RS>WyJEh&lV7L$g?h&3UwPeiviWC$k_2~sB;`2e3(LoyC6BDuj}BU! zA#mUXM;@Uh9K-|p%oefCp^(I7xq|ZJ6|!|;5Skh{klfj2;a_^>&j`_F-@7AIM13$D zNBY2wh*>&kDFK$?Hf|-yqpN6}&E3dZgvLAf}zT~_g3p%nlUN&-vAO1R$s6;LZS z(~TiAnX3Qu!|3{%o~!+Be2zccp?G?lhlhS?3vK?w0rVeY3N|1@nlMltvJAN&jG7`p8C zJ2xs}CB9tV%t!i$SZ#wX-q?*sMoL44L1O|HP%qq!a#}552Lz0!)@lGhryT#zIJsD} zXj1iS&JDxfnCu4H8VC$i&i4UmlBhS&7yG;P#f~n}>q+|LydDWzKWMLYs<#r`Z@uku ziiG+F?#vFm_OhZ_Fq~?O8E#|y22w*v2OpCN!lh4er}fgqhg}bv+FMfWZKnT}StKZ8 z*bO#v-@18CcJCpe>J45%LcPeknVm6)tZ-y`(O%lhiiHgHTp8d8_n^N|o!pH}ZL$5w zgO_mtx0~1tGxu90?ZRbxO5e>iqALH8qGc@~!bQvQ7A@u%^WlX|-p>rPV+Gk85iX_- zb;tGiXJm{GNb@kaT+4Fy_pqcW%CHlzeJ!wX=dAI(u;DsLD0a}C`q&=Nrul6oArc!a zfL{HQ9l+>T5=}995&I!UGvAsM8{#kx3I9x%->aaGm+^AzFhO8gW*^5WZg^OStv8ZR zwcFFz9n#R2Ql}C28PMy@&rmQ>=L^4gF1HFa&_riMU{gXyG6h-5UImYBfcbZ|LHSrf1G-tiTpAR9>vQJx1;dH9X z@B+7ezd?KNTYmCKRw9}CFuE*A3BK-lK1sdUAF@90 z{_59>+c1h?Mm6?X&k{e)HNiWpyS!-5`*4d$d^Y~pFmjT20-c4;jr;NX`mq|d{T z?A*h}0xEm5eGU5z{;N?n=^BM2dIJ^CoHR_AaaC)@mlajFlb9gbhkhfHNdQU74UEx) z!;xF`BsOyIdg^{-b2oks-3BncFAT2FApEmt@gnq_ugW#`6&XYPdk|T8cH#E&9VQCt zJA^D&ox&o&5Tr1>%N*y?>F*+6Q^%8$wCsswvB23}WX4*2I*;n*mEYub7(Luz{AmAd>lmR=AB`@B?FE=CqB!iHd zNUM#RFx*UXu~cO3(7ST3=Oy^NK7q66kY`abts<>&SB@wTUrx{eko3 zvuKP)YQtPs)tqYy&a*XdZ_~Zl*jRYCvG5nm??~KU{g^Qsp?aUPT{e^%_4yy!7f9*) zqlP_*_hofU+p&7OElAvNam+ijGYw%6zuGL$9oAem{{!EGs;6jt131JCW)angZkY)H zGikU{uOG=6BLH@$Y<{dsmwKY0?Z}*_c~ucRu7rEaiPQ};?d~{6D4O_?UapUV=Ra#o zgP{-oWA6r-nu%iI60X0aHxdblI%9|U?)+FpMLcz~ExZe-hNv^_xBNfpu{npyYni;BspY3<9fUpA9nyl=FwQ&0n5-G9jSswM%yv8n~6Tc~qJVt=jW zRwaayqB}b7pp?W;oydDH?69?VVKrM&SwIa(7`a0Xo6XW+F0u{yTZH}vH)g|g*uBI0x81LF4uf2(4QKMB zssP7Ibz@cBS|?o2$(@oxH$L}XTw;oTdo1G1prL2lG(Db*2)2p)Rc^+@$+{;P%8Pm$ zz!VqJyo?LEPhpriQ%ptz5KhaS+b$qCiXGs&zpO()ZhMnsCDH)B1-)^V=qYIxO~t~L zaBrIemp5^!>HyrA*-NfK+S9%yKV4`L+mIyjF6EzJVuBVgrIiZ+2p6A^RjEk%z8D6_ zPcmZTIL69}^Aza&z#wX)7LUrEo;b)!q4#lX`Qsku|NvR<5B`A!G|6G>5pZkTeT*Yc2z>Jf4Q$9*HOFgjJuk20;co*A6x zsp`3;!tS&B;qoi&KWOOk8nr9@(W0>xrLi?iH1B68MOm?;ob2Y3bjnBEw9(sjG{RoW zLGhlz4I{qH8rYC}P&}jEo#LwLLhk>!aWvd#PGD!l@+g^wh*{jr8{DpQ+4}?_u`f=4CWF$TZhFZq-x!E)C#1;}maeP@bcY^jTGHiYf*_Sx}nb~f(0 zYFNa%dxt_>Cqr8&GR2ZEre_!RT*j6Vf^IueYwUny^0;MCk09w$mY+Gly1Z-gLHh3? ztfAaAg6D&&xMhpx@d^m9)TNcn%EnU4#sa9HBr=V^c=%xF@23(cxf#i|Wa>IN*2b1T zpB67R=KgLZjg%cfb<_5H40`fsvd% z&Y?BWO|PCrCyMeoz`ucb;ybI<;xuCMH2Y)Lo^Q-O>}KT_2Ytq0aO@n#6c^54LqM!V z3VJ&gg0ifinqoLBFY~Ny10$2!$1Git2V1;4w&1g5H4OAD+z*_St zAGOP=Wtx|ri`f}MfZ590uMHN%-F@j~v%wMN*OpIpF@!zKStpr$;kEBK_Vi&GEm)Q$7C%PN8?0KSAIBC4EKZOmft>o@p z{O)4ID=Pp7Ke}oyHWnL6pA1rwB7JZxLNU1xH~%@ik+<>3a)3u(TURz(`EGv7Ftz3! z8M_;R4tqCHyT{DGKJt$pBNch!z0tp{R-Jrn&mG+~&I>y=SiiIdR&oA5p4hmkU9|$e z$8+hErbX8>#sbSWH?D{aYRs8&TJ*Z;h@9`zV9iQ*aaxfO*l6<`#m)@{eOwxvK)v~U z*_}Aan^gU_Y``@;ANhDTJosp?}*M|dNYI9}1$NnpQWsR`)%ir)3 zr9eUvN}^$pmt3`@5!#DXW2q2~AxG*6Ue1rg>x&Az%p|HVAd$B@{RTrjo(1cA8=n9% z9Sl-842cJ-;xzO1m`-_Im48smR$@yY)Vb-H8P8J_OV%hHW1MDte*gL5f9iYwpDxOV zC%=<3+!F{f40V9OFjVcbAW~LsL~mMjLRfv)V0>118CoHuP0H;8S=i(^l66;&Wd88Q zFB4t1lumZwG-LF3u~d;y24~GI-FtIqUpEfIjKXbJ8*tR7S@4G&B6q6j_{HJ+m6cbi zF&(h^m+RvvlMl^7*l=3|BYZ}O;hrc|CEj`q z1QuOh230iwu}wj-7CT9ERshd;2P?ZTxaDz+@@FR1Hu0ApA$k)eqw7uV({l!TX()S* zRq+t+?&3B}r$w`{gDKXZ!Wtlj$U!I_QUb%3pxA(Z7kI&0$P$C_L4IsMjtR zw0{55RH1NJp-feyurc|I$W@tJ6#Yqa^J?8rCotLq@nwG307f3IkST|)XGWyCfN=aB z2~_PBH_Idi8w_8O&4A*TLoM(LouMETu&4}{paP~K{T9ZyR!mJegQ<#76ei62lt-O) z^ZvcMC#~LT7CCW*DcVE|9C0w9YW-hh>^5!E`rdn~W8ZKgxWpRjVI%(snoi50hCN6$Y*TJPM? zV-cAA*nE$5jon^|sF*%_S(nSY$%ob0;!4BJ1?spQ*}yZ8cGZ*LazI!@OX>8xp4wT# z>W;BF1^YZx-7=vo%0v1XL)!p@& z8ktc`CR2m$@e^{V!uRaU!Z%C%r)aASUu{OWD4`+bhcw5(-{e2c@&2lo>QwkIcNWp1 zJAibotw!ATzJ?Hm3CqzNnVwl1o3#+dUKI)Cvvq+(2e2+`OIx$Y-s1go?OhmuYGDRr zMF_s59e10Q-Vy&Nlor-Q)5?gd{jSPg-JWZgBn1OC;+C30%HbeK8a7EEbq4vX!gfaP zie^q&)uGJ@R-ctoCvc{DV4SgA&R`XHW(Ta)1cou2(`yqa9S>wNH6z`1mzXAwzrg1G z|E5#v?M-~hOM9bZ@?4<|T>k&c;Z4IlPd8{6#?Z>uMX66pt~&TrErgR~Q6onm*H)Fl zV*9SB0EqMhnubz6juY$ZpjT^-r0mGbL_eWWfdi~8rsGB}85~8MeWfkDPRQ=-dN7jM zs^I$1xBk`K!#ZLN0gnXd8N?}w6)w9S2h?=^;=pK7J~5Z-Z^e+ilk%CuxvAwmmh9t{ za?bo$RWA~a0E%eqA1{oFS*UcP??2cVeIBA$ZSndcO!a|}`+fpfb1bi}=5)l-E*;i+ z_nj>$K+pN3EUnA(`z5|{CpAJd@*~0bsAq>>Qpsr~WB3^!VIe>G70FDtku)V)T$4in zxlOgC0cKE?$6%*s0WtsDyBdXB?t&gdk45?%vV>t@~;wehjZgw!@+sZJw2C zlT@4`nYW~j;_tNp;YF1Xhc%_T^%5~E2`pn*Lp8EFA`}V9-(;ZnYGV=@l+Q*5BNC@C^I!)HpseXvI}{?i4fga$RCl#LFmv5rUL z=fI0X6ClY^5IJPBk5p2nG|VNMm0OXI0fIW4^&11upsw zw4fWC>(1DM`0?^CF(#8Z&Z0}~A^KL5ID8O@=U~*AjBqRK?tfUVy8jV8&O%)CvC`|9 z770*_s~-i0GUJ+*F*girX3|^<-VO@Cl$;pg&)zjGDpEL4YWbJ3l`7As`zvzz5h&dx zqnTc`2#vm4)yf;M^Zs{5L@7YZEcyOO(x-^FMjKmiETC~Nu9K_!8yEXGt}FJy-!=Py z_^(g%x*gnil`^jnjuB__iiBICGm!@F_&aq8Rio5l)I=nz}NiXP+R+;?AwVl3OzTAiHMu{VdxlcSDpM?Vhl{59wQAeI7Y{iQ9Oj=)Mt@XL`<$@#wV468%h(UA5l| zx}6|f+D4?mT4*+aGd_$AbQ(o^4EXj%dWtg6%&5E1E=-Tu{6z6cGmgJjoJ2S1u&rHR zYKJYL**M@847gKd+{}um?NZ<}O2aKIFT?B}vW2xSwxsv^iq8$8so-hVR*5dGNZ zg0SOmy`cPA^P3B}HKWDOQc}l>9H+Vf50xa`>@`?wC@vk%7Pg>#-zm< zTqHfJ7)JYDgYmMy(gkOQ^zk@i8EiZ1Yh+`m3yXM==(WG_4D#zNCc3moc^hY?BeXj# zpoX&9RJ)+q{_A*Z+X!(8&ikdQrnE)PWv`a6>=a=dAoPXUJCv0%@XrzE^A`t@64)KH zeuQBZ!;GveFdQc#+zl+L=g6)=rm|p)ldqH+Q#YB)lqzpu3&35d_+2i&d7GWV^0VKU z0*0KdzwMP7Q^6w&G&E7=hkchOTlyOus~}9PEFOI z+lLjZTv89w^3+TXPHpM|x<9gZePlgdNGbZpbLllosTMWYKfn=B%d_9`0loyU*YMD= zkj)6Aek!mG5UtOHWFAk5l-iGrg-kT7?S>Xd4T_`J$q_E7 z+40!qJyg=8 z8_}aSO`sJx^1J^O#v^e_tjvpoRb6s|S;wj%F0COpE+M1Y9W6G&#+?I5#}iUNAONts z-V#HBn;Sy;(kej1PZiSB#t;K_7#i&~5#B?nvSvq6flbS7Ng7pHy=c;t+7BP5aTOta z16|P?Dm>Sam5a0(UFfv9`tw#jBOi4LLr1zK+;aFa1Fk95JKn zdxfgsv*!Q3EjZQM#PGC7(E|@`WS1;hoJ%YdmPeJFPnlb7fzP1}N=xpP?O*m$#!%E; zOLmLx|KWCz0@gqim*i6QqT-68>*en@RS7K%iNy_F2D}^LIcQg&}t7%DadGw`tmlIS64nofJ|aqNRC-X?nH!R?X7n2bNpmD53w7z z?miX0H^ue+xD?3KU+r7C+(_$kUEfk%`I%f^5C_SMO{Y70yg2lpVl-Zr#u=PQ8MUTA zxE$CK_QoOR?HS`EeNk@M0IG-|R$0?MsfyAQNSc82G@WrMk*vC%ob1{`3VIDQDlG4| zg;=$U^yJ2yvSlzD$KsQ`E}tpE-M0iGF61>8SMoF5d0ytFH(K@vBBbaDWSW2$zU#)D!wQxo zvv4EON)`<_(Buv)NhwqH_|pvSIpc;a1#{_1xh3Huth+61db8FcsmjJ+C-z3Bqu5v+ z17lPabZy961Ns&5^zBMzcesEJUni0Fagx2cSsU(92x%|g3_-Na`nvcX8*!B6N)Zn) zDVScv>)^SPd#-tCs#a|%bZCV}NcC&EE{RDcjmKYX_Znk5=ma->Axz_`nRbyO@ZONY zFH>CBJq7q%&yg9RXRk*^(7Z&frxdZywuoJwpkOuUxUNKh#y)8G*)R1FWvMUVG2mlp z@Gv#~Zj`0cMKRunEY0~1{X&?foR0&F-{xpU)gz$%AK=(?T@u4b+DMkraPrmcem~UL z$KIQ@D2Sn!M;3FFKFfIwQMmo5Kn#fX7_T-3@Jk=&O4J-FWkyHHa9O7L?P{F;_M?G* zH!s(B-Q;)7;@hiAew;&kTx4x16=W;jZEY(3j)-SpvJs{1Fed?O_5PID3fP^lzu1$y zx0F0sOZu31y8t&N(xfmuy9((vcE5zA3FR(j>l#N+);Q`bT!kS~YJx3KF~(l-i(7Q` z_XR4{C(QD|q0eEaA|_a1inL2<9v3*K1EF?#58Rw!YM;KZEpSL2-4!ou{GEYxwVV&} zj_|K@Df(s8)^+#Pk;t?j-`f=nc9e@oMZXXN)~7)we>;_LIF%2Q`HkaPp;q+=u@<@g zH2sRFC=27tWU-xy-*74cVXx3?)(a*HOCB=XC9y9djMA9lp@^`rU}m{QLWRI(>exd* z43P8>5VqReePk}VS`B=Ys3l*Rg>jyWGciWK5qi$Y%2>dIU%iU_-BD+GgA`pr=$IN>@Z|yKYTr#?DuR*$l4$KJz9nO^c8_%>U>~EkGA^>-WU4 z+@}lf5WoMnG5*_jy#CZGDQ-9&eXQDFl9&3@0WL5v{sRYZR>hgC%Vf{TI3o3;x$lBH zg^E68ao5eYYr!qW!sK;o5UoMzTeIJ=A7dR#bumP&eQ!p(wTn}9C@zg-X-@1EUa-@R zK-r0NQUpk9W-PMZKM{HV0K2mTcvTvdYQN!7nZ~0SbM?Wr*>+@oMhOWlxHRvM;4q8FI2XP~S^nuq{ zo2|Ygf<nrvIn77c;#tV93=8~@!RaDuetk_1 zlu8ztakuyz23jG-ZGcv0%H_Fl=D(;6&#R<=T$8^qTDa74;ZYYJ)Gy)x zY?rGcF%?iL$>CsTy3n9_BCT?sk^R4!NbKJi!$iG{<6YnqF%+yarmXvKl_Y@Hu{xB8 zGgMBmsh0X5sns{;^9SaRUy{2&Az$mm_1$H@S-gsUMQxXx$fOuSUFtRPx?;g%7#Ia#0Jdss#c zvxr$ybAbIfe59*ctuD!=4~J#nVManV8?=t>kPw~EcsSz10;s6oqfWS^CwkX!p2-Qs zv!&>>Ht$T^Aoq^2dqSv(0d~Z;zJB+MZu#i6c6ysMdt50+OtsjHG*AS;o-5)Z1CC6M zhyB)NPVpT${8arNh5X)KVt-v+a;gY9GgN~EOwmIYX6oA~C-LH#KxdUe=bpej|K|#X za|tQMW&zy>9@xN9q|#uA3<{tK1LdjcFM;3(=a|rVkIFGqsG1Svv&aFYzRaY*gRM2K z$Dgg`8`+bS)Yl#{H&^cZaZn~R|y7f zGw{iTRbJE^nsauNcT7JonR};6;FSDQzx*@;bQb5p^^P6sS5Xw=id{qoh8>KDaetxt zWU_gzMcctW*{tG}r$Qx5{XOoA;8IZmrUQC9xSY+YhUp00f-wj%PP7Ag2wBxOiKQz! zU+XIPN-`NmmlkSHQFiR`Zj2x=BaO`Agz<9w@hG2U03%rp}#9yIZO7FN7JqX zEj}=kC?HMaUlZ-$sG9;L@fNi3HUQa#eVpHRXNpxveoyEel=|NaB*T!mw_I9Gcb1w) zjV<*|uX=qS`ZsIX4%F7QLlC?mkA?=gk;iNI{N;6{yiE%Ds-OgIXUzuu_Kq0Ae|dt$=DT)FO=IkcOn(MkA6OK6g+=S{#} zc;oCpK$p=Ha9lYW;@U&=IvfxhnnIlui{UESE!d*qM{PiFZaY^vKgbTr_<%%`hfXj+ zARIUOF=pWo_F%*tudG5Gl81t8S;`PP$B;iB72{%oC|mXU@8VX_*LnyF11JupgG2!Q z_I+Ftk0Dx3Jxt%;DipclUCG2hOwNv!+4=9_P#7td+?`4gi6F$Xb(I6XX?(Q~l=f+9 zoS?)tP#KK!(TDwT43XxIp$V(Lw#d8NNL|JPtz7Z={lDO>h%dh_;UW70JMrjQSaOXT zl=PCPu!u0#kHxJ;hiExOL`t1L5i45|)w>-;fEk-12JRhT!vL^529_0tSobJ1|hd#A$p-TjWO;y z!>A{yjzr?O82Ds1O&j1>uLEr+C`8a#D3-LXyQUC7?xpvO|GE|CKhbQMQLFipiKj8S zqet{82b+7r{I5nSah#q3?oia7z_!)pz3NlEJ*>@mnGqTC#4r0gBRZdRYIno@<*o%k z#H4HwjY_mb55&1EMho`oUly^)0$*m_c;#DtS2)p~uFnwsPCJJ9$1l53!7-qLV)+(& zep3YIG$u}7vjBwA6NA@k|B_*SXv;%NKB^$p1=-?tY~1|Kn0g|ly!tDUQ_%~rem)D! zobT}ngwGeW1bF4&w5slTB{{8yJH~!?-}1j#XO9pf8z-xdNb7E#YhbGkEU#GEaR1PC zA5YLwpS!S=LT@vU7KKfaxM1x*w2Q?x&N0y*xL-B!wPusivs1nfTUEnT zB{~uKOU8R}n6@p8_BQ>9Qos)k{7WuZY)tCEAuxx%!g}-Bdr<(2m8t+MNgE(aHL7O^ zunLYvh-I5yDnx4)p&J-L?+}{&P=1PbD#AS3CO14}VMpVoa3kbDvyVm0gD~(J%j0M(c+pPw!?2$<^SuVwg5e08cWN>ms=z=7(#@rp2 zk_P=GW-?VN`4%;QpNKfnuI=?nYS543JrSr7iGKs?H+71|LRct0KrG-kp`HTg>D$&n zMBE26MJ}uf>?b2&-~o2K5evlt-H-zezb35V7+qln$0dTtD9ZW|~-;s;rJ z-jW%Q#|orL$nBUNr!^@c)Ya55DeF4HjGt_kiz%>>(l05U{c$COBWR`G2dTykCAfG} zC>A(-8YCVH07Z%oK5#WL(pXnED`me%-XToKwJl3w> z9Ntc%wrmNL;*DhBQwYy-eczD`CaV9I2yzKaxAVhTBmLxUD|8G|`#-V7=rRhUGFW)d z#4@*LZNoWU(J{SE>)v|*-B3bddf?_UvmhnCJ}5uIjv|NCpg;$5J{zPQL8^Xj;HUNO zn=O{DpnH}e#Qz+O_613hdt#6VHbR)I+|)(1OLcv%JYV^)%n?$I8VV*`*@KX#IRE^W zU?F(6$=+>nBZ+n-j!r$;sDIV-Jx1e2?GX`u&n9cEtx`HIK#lvLmAhbmX~4N`a2YJ$ zlr{(I1d;c9!nnPMw(|LrI37S$)0?T`taWNN3lX8PLw2(Ej+?1)%g7d%H8?9{s!9V7 zvUtl=%Z&1_{B{Q6l)!oTjCWBJ5gE;Eaj=hq+guTQIEdU}(M?J6%47AAxd9H1Lq)t} z211h}#kq=`;0Q<2;c&FwPS2LD?~HY+AK=ToC-S}qX|w`3MYC5;jz`#`q^~94k2U5# ze3R1`FHa1v1pgxo`;SI@nx6koF#?rIg&!VI+)q#h@vuyj{ z&b9XMt#KSVH3G-V{O|Y@om{j7#g83Um9uMh9bL3{WKT8Ml~>xViFoM|sqLE?95haq zrQ^d=F3!6LC(LVRMlH?d{%$~yF9qzFP)kORvBNi5mk4x=2vjZ^Gxii<omK=VA-^E~D{bYo$2a_MCjS2^Aqc(&dx+jxk7bBOgV z5A*>}T00Rcc#cYC5&dY}9GHmA@~O{(B*Mp71Xb8^eE2~Dbc-=n zfqQ>;;FeMk|Lx~bw9hucnz+APdW-Y!x~qaw0mZ{lBHXO#BARP_vE|6B%;K;E7&kL` zMYC$N<7jK1>sAky)3@@J0Yk^JdgwNp`az)5r;jmsqGTG1Vz**<2S0pUxwfE+Q^U2W z8sz@tvaxpHQ0@4CEMVEwhMBIUJNSXZ*SoWMH%JipQ3F2Q2`sN!SHE^kE$Qk0<1gxB zAs^}2^e6hgn0KJ({_VD6nda3ytw;v-tNC8&ohNSzV9X<_xJ72=P3WPX>O|RB7B54f zP~%`rr@EQiN4I!!d7SSWgS#*r5SXDv-T+!3H3^;Vt|1rJHWi_xwn?^>|9Ra`8AJ+(X#ka#XmcXVlv)pv-&S`?xP`MrJ zbJ&cx;AiY`DZ+!44+o*do5hm~;P-2f<>?edF9kKM3jJKfHFT`|-*?g6elkPD!e4ArRM@bspLsj!AY%855XM&IiBzqhfGtN4Z(jBQH0FLF0Ch7U9h&B4@zn~pnbKJmRG==eo5TV&DOTneD_U5JPq z*2IMqUV+jc?=gAIqa_BIeX;;@>66sof|BoBv}#^-#p0cP(Na`u_ho;#P}fO=J`aI0?uk|6!Va2vUBkD568r3!%Z3Pz{v z$Y-6*MMJN6L4`O$_@|{uJOjI~hAlx_#doW|Oq!?mCQMJvArsT+ruq%>p7SOw2U&8u ziFSWy2^m=NvcV`<$(AvndJS&)kHy9Nqs=wO|J1CI^{2sgfiWW^S-=t>`Gywl(A!3p zhmY#5ZG-ViQn_o2?Lwrt!{l--td8A$ZAzsZm|dVFk%LqP_r{DWWN#%FZF9Bq-PCyv z;W4mQUG>}#v2y6T5R>8zf{)oJ@CBU4@Jwfcrs|t(ML+`+iJN-&o!V^8Z0yfMRF71BL6RM^_| zSzkvaiN52PS(mIvsRn`Rk9PU~28y?mlUZ@Z(v~vW7judx-8tD6p#S_Rve#}<@e5E= z$N#Gskmxq41q3_f+DbOdxr$Fptk~6e)_q5BCTwP)*bJc09Oz;la#3Vy9nwKN&~zNu zxh}Z+{7#sjPZ%*6;{tBS^<8Lb7eP!xshAlM80w1C3hAzar0#ewY_(Wh5ycow@jc%e zk(VSkB`>G0z;k%Ihtg7tgifVu#n6wma(l_cbWtZFyCwHp>SY&i%bT?hWDC36BDGr;l6x1^L9Bt-A3Z$2C}h_mSwhSlk(VRCPI( zMfJTw^qEN$&Prh!3w1UX(mYh6^4?m=BAq3@9M5`HW{dfLQt=;ZuE#zsy(ImKT<~Nt zxUJv}oG0nk)+y3_vuFFVn&`6fDnp{SQda%RR`l$U?=0|dpi|~PdsNUYF#sxn_LJg% zSCQ7}2ATG1gK+Jgus-*b?~IW1O#FV0jBvKdSj{v$n<&0rQKf+g&BJ~>&xOAozFsi& zzUH$uO7LzH3M$le6lZ9*PrR$e_@`mk4Od3iERC0HVQ7{3D;_T#8}24iDV$HgWiN&ciekz$ar zY%I0)KkjS-WCU0cnrJL)9HSWm9BuTI>KKgAth zm0(gDS$>e2xrNewZ_07Y2D|o{U|p)3q+m^$L8@@chk>uW94zF}vqq)yM$I}xPO@iO zm#-0we~sa|+CTM`X3UN!$UsF0R=3ikU4u0@cZl5y_CzhCM$5pDYu4%(YaN9p0b5-9 zqTKT-@lic0t@c6k1pRme@VYe2psM|wYxZ}H=i5~f`1EV?25F+#rVzKAVfJguZ4aCciao6OrAC}V znM|wbX_am!AUG6&90qAGVJ7;p`)OxN|ZiNk>dpwDPVn>o}UuQm0StR)>} z-u*;0p#SEhl_lxeJ0^%)fBGGhT9Y9va;9d79~0cGuF^>z@TJh#F>T|w5lF?T@cr;| z9I?$iaW{C?@bJ)f5jS{4Lr_-?2p4KF47cg<<=z({f8B5{PW#_%X2po{Yrh%Aup|Xb zr=hr#*w&G5SFf;m@#8S5&ko<3#8s?3Hu3fEu49VI_OnOCZmToiGqa^Yfx5~fP7+YCg z+8f&|VDZ(%U-E9MvG3aNH*PV2Oq*|=j4e>->%j;Rxb_8@OaQydIi$5LVq^lJ>q&D&b@>}@oKInketG^SpH%yu?QqkyE(Os20Pmb~M$_CtiS7E-9 zW%V)XO;RymqKcDtjzlj(^iA7d1~@*`0B2|A3O?EZR&Xf0k|e)7ccNnL`7U2?^!%DZ z#Z_{@_F$h$k$7j?i0ZT^xJA_QY}s*dIdjU6?9rD_Er@D7N9m#jzmm(!CT6rY{*R`! z>}o6AwlKx55ZooWyIUc+TX1)GibIRLyB2qs;uI&iYk}ep#l7v#IcMB4=7;=%z4!ZO ztvR3hh&6glLl6Gszf*($ z{NB){%v2^A&{tbWgJab)lllV!<`RTZ{Qk^^M+@KFm=w>-z@JDeEQRJG^CI4Jf9xr= z;whxf=v?OZntm1*>#tjVhZPwcp_l+5OL_R&YF#aq+wG`n?&{6IMxJNnnU%&buY14wOBX7FADZpOZZPkn6HxqGVL>xjcM~2 zYVIBKpI|1ZHC9EN+aMH@{ua(H!eMSZHtMu(3>Y6qSo8=ZzY==lj{zHXU+4D(VhB#x z>X(cQ)@nDK^5B9~*YrxLPl#F1LfR|Q62c}6ybs0eDQpk3GNPtbtUV`G>XN$vGX5uJ zAT&lN=B;ax$bvlV&^WwcPbX;Ujs~Zg70_HeF)jyVo0#B*x-%aQF{2qSU!LZ{gXG{3 zY9vLcM)65ZZWX}ZBp^)}f(*%tB!m&n*9e(Jk*IDIMX=(w4NQpRWmSSX+NrQw;TG_+ zOdV~?o9-;VnXcR_7RZg)htT{flkZjntAYzT2=)7mux|gJO54+C(x`F+!B`2<@}g7n zlWa;G>>GqC7znxElA0-I%eOg=6(GD2a(0HU@0K_loQq6U^ME-Gh>aShVyg-Q0g%uD zR!6%vU~%e-PLgMgyA0U>WS2tb6_6P8V*$Mg*`a-N?!?yAsXl5W3~`SD{rEGK+AR=y zMxh~t#$z}0n^ARdu6T!d<0?$B29~mnVlxB6fX4DzmDC{e>CAn9v*C9UbB<=lN}Z_3 zFFxb2ddFwZi!*&Wc18~5us)Tp%191ULbFw*@^fi;vZS^jiMz0<7{bOz@u(x!%j?=t z1V7$LSjFMQ2s|Kb$|@8Ln~R@yT|uh3ytI*Xx6m;51Jn!qgvR~Pv*A$%V3_;!Ku0ySSt@u^xp_KMdl z7iEd2gyN;AO)w_KD^(tbnFbak;oeN{=ut7MqGE25->b0U zd7~JPXrdXsz##J1Qc93By!aS?3egVfBUxpFnRlc_L#**-^+ie?np1l1w76j`gJ9>J zhLdQorN~gKT-3$z3p(M;{cnlWDQSbGxSyk1t)e8+`GbEt^KZfmElnw?k*|B8G zS$>h9jX(~|^|UC=;!8*lX2n?rJ(6?Md}r z2Z$$LcO(|qma+GY&O@@In$AMy0#S@p8-s~B9mT>X7AI16$|kC>7?{wM z?~*=@7mApZ^CO2?i5k6}liVFpI`sfPWm!^#o(tGqX+5WKZAFd3wI7jwn^l|FrV8%V zq(Y2nQ!z}Z8bEAA=eV~EwNMa3`=S1u^~mYp)0%Hq3DAiX=i|tnj>Sn0=lwL{YdL1% zR%G9mq{&@T!^@nGz&-GXP^8#o?`aOzrEPD`SNs8UuxDm|LTGpyMOd?JfBW!>6)bVz z1q1CP8F>pQmGyo#Dkm?o4r1(Jd87>Wfzjv0`UwoqUd374lgReF{S3ORq%!hT_sMC$4dZI;MW=)c)(72KtklXA9eE`440onXvTHu_iC>g!ny+ z+_~Grts_OFM!btyiXAmrmO~+Hc*J>)y^LDFkCKm6Gzt96iV!9EY*ddzJX(6(>~7Ts z;2a`claV-nRA>6KcD6((XL1E5qi94LzNCV`yWFV~6Kbf14L@3IniDdOToK*~4qNPz zX;3A#V58mqOaIVI|JXwwF+cG|x)&y>ynP+OWr{$*cP?st&r#`y>#BUUV?aWR*LAgkX#Do)}*6eS7XR_;c zN}Y;YrwiaNW&|jL#Bj`V{&SQ7)c|uaDl;k#_nea{R`F$hQVbMdndC`_ly`aRrH%h^ zX7xfkC#y+et#8v1e>I6nFZAOM>fRKh4)UY={Lx%0I>Y?C?pZ2?dLRcW#E#<|XO1ey zah8Y~5PQ!?Ee3wQO(&6|SNs|*P&1(8)$(Sq8pU;Zi0@8xAqispY1BH2(+t%eIRoWR z=7}+J;<~CZj)4FNHR&eO_y^5T7Rn)>sD-&%WGtuNjA-!gqbN5T6SsVr$Ii;N!>MqY zanPL8D8$jNPiT>lB1Y<7-)1iWad0d#Yx>xvIpH6k7$M|kE3gPOH9%`p2~hsJ#cdd! z_vLsq;Dy_3cBI#z?TWeY2S;~0Q9RL>`mlO)imGNBQTa~YR&P;Z;Kn60#@~b*h`uy{ zzHx?0$9?`R3|O4gAI8w~Tn|lOEe|kq9^xx^>c{EODJ`$=NcH;uZFSmI5Z@#yu5Cn( zNSc%xj&L_K3DEAdwgXK+KKt5gX zZ&>qb?D}$-Gl?5rZ(-k)rmt~OIEleDfxyi8Y*=3`L)XPHL%tGiwuXLnC%+`@68^w^ zK2h*_b(cZroa?;nI99PFm-|}om}!%%y!+1M!`aaTNrnAGWoUbhREqHTLJ+F2RMy&hJ;O_Mp6T?@zupObLv z`gc?<^*W{Io^55)Dsq@?#l&wqxnAwI%QyXtiLc^1BGePQUvY74Y~mgHShtn~IAP-s zLh0hYD2E`I*Ihs@^yPKGXWU;yr0;qksarodD)H8*58^W;4AXu+WoZ?;J5Gm9W9CWw zPM=g%=<8H>)Yg`E;F;z>^QslQGUkIA538ledN{Es$&C*z$LhghF zJW2jtMOG;5ytP`?ZJhlY_Pwy@XjofgbFMaEzEM5?kxq2cdCi_%zXoiWd@yl6Q%K}7 z{27+u1Y8|as43+{CA!ozZ_7Xi^ffZ%P0E02qelWSAdz{499Q&-Q0ivX`IsfDc{&H% zGU52V(q-`VCoIo!ug3{i)7@AAxgi<_HVu25IT?cRGmlIvkJ!`_Je35~NzWUq&A0ud z_f+~K$m`98uX_?v7Kj9xr~pee5ZSk)ks-B5f27#YO%>I_F5o)wO6;-@$@!O-qY7Bb zQ`Pd9@iqs}u>=4l@FQ2SSnHUGu)=djpr0i~{YN$wYWH}lV zD3ySBKbT44Uy-@~5p)7bG<%y2)6QJvwTB*d3i>6Gu(|Q1=LR>8_$1dc6wTPL+8~W9 zp>PtGem?@4z#O<;N6vzL>eEi78rqCrZiz>rvO;^OpVP2%{ z%Y?NyhZ>%mw}i6|yF;y7!ZYkCo@-CZ^>rCj;ex_`UMnmS-n8{cCB-m}@7j3<1{-3m z9&;XABOu6s!_3f48s^vyVO^5PV{J_#9}oWcl-xBNdn1;=)llu|S6BvES5EHlFfC#) ztH`~F=Wzd;!gA28r%4$kMQ6;u6-X=1(Vp8H< zkJXV~H8Iw&e1@OC=;2178rRjV1FU1@BPtb@Ikx*-CP$d}IhYYeGf1BK#<2 z87@6_Wy*Jnvm-n#iDwGzI{eFbud*ZNTTQq^-yMDgg|qHyN=)OMN3&P0vtqBb%jte; z>R8qwWkHP0EoP-01kvU@QvXo;KnxlXWQHou_Ye6Y%ehj7-vzs6 z6XF^V-BQoj?bXe|s-*6zxXr{@Z2SC)Cs<8&jC0U&nLBDeEoj7@q<{j|+Y*MXK3BE#qWv4j;jU|AqpdK8|A-4Ls-|gNkL^C1sHWLbo5OXn6tdgm<5+YGYK7N#I z2N^7|sVatuRMwMVHr}1uVWxPGs&X4hk#P*y?#en~%`!EVca1X1Tr;XSWM6jsyT|)8 zB=TF7o4L3YC3ccBv&Ov-xao`r``z|eI10~KFt<5c8%XI z|76gxo2eX;9qtcCVJUdeELy%xiVYFRer7;sm`~4(oO}obH;u$#1{>}4p(Ga_%4=$M zl_W2QBBK{ApD>IZ&=2$Lfg>WKCUldLGNK~pV2^M=tZPl7e!|c(IkTEhZBj0nIAWU| zRn+zaLq`sq-{~g9Ca?||x-%Y7%07C20|Ib5>5)o%izC>BjOwzIh3Gw!OJd?iXfIvW zWAm;xxeRsP=o_U6keChz3=QOi*AOGlMGW~VRS*iufS6KSHmC>HqXV;5Cslr|f?YrF z`4I}>_dc4m{DIp8fBb)ynfpiqQ98Cp>M>i@vV#^V=!Y>6$4{x@;>X;yY((RZoM9Wj z1cF76$Z03P85;93nV!`(GDE5kIfCp30^4;%?X<6(F=-A3N&lp>9&!w!@s)wS22lU2aMqhO1-eEz;5W^s3u5kCQ|hCvT9N5;%iL0;D?D zG*&^%GvzXi~eGr1vK?7PLNJd89=A(M^qmq>{5fN|CqM`@+6ZwwFOmqNN zW#~s0OI=?Xcs*?gH$*7XS*DphrZ%wmv9-#Jmt`{L!9*XzB{-yXycP~~-|gyg%RRFo zG=rO!3T5nyao@SbrDT9kpEI;R4%wm&*=mYEBo!;R;_AoultV$wzfe2#u-s8pIo^r=ec zxIljb=;>T3bKH)JJX;xZpRD@lV=5(6e%!O!9#shK*$4Bgu$6RcApqHUxOz2cWr?cE zGk$8p6rWUuQ{ZI1f#(Ox{2%r4Gd%ZyFF=Du~A+n|E`V%g!FnZ;%CyoYxHcjSp9LgEd8zj_0}Rfwz4!pi|nplK9S#71NR>L47ckI@XdhQ;R^$I5}&tG>SpEcOj=z{UR}*=#!y~bDLw&>Bj08VpeuYhgJewbf8!A5G{=@*3c$06 zRL$=Im#i0*a(V{9u`ojM3PzA|Vc7w$D7wjFyje?`xZ+XyrChM#iau&<=`gUrR9a1O zITWGT2HafNX@H0T>Bqx$Ct|@fz^&TO`B@UvX)ktbP`d3BSF^lBZOKL9--RivfO*<) z;pw3mtZO@5v*rJJw^xi4h8HnMu<$L{Pzjcvv*rjS?HK_wu1-&d$}}teDf_@s7k+m7+tvqMZAAeS$?5;-d!C zA+k{p&ft0>9sdx@$20^JzIhu59Wf=^GN78&jDKL<*LU_!86j^)v$JRUW&SDdy79-w z*h0!rlbFbq0t&)=6v8R$mZi9me~b1G<5 zjnNuZ9;U1_6&8ZXF6OV@on39G+)7OCI`=1R?Vp?r&~-cy8ndALR$GZ_6|`CIAZKv! zwcflC(Y(e(A@6n-Z}bmOuYul~gPUS6V58p>_hR?y=X;PrrIqjNxH}~8kr*Oyp|f|o zS)2Du)`U7Z@Xl3pa>d6jpK=)mY^~bjp z*$&qcyk?sN`C#ot%amY-#hStIz;LjGKDFX&}T1`hY+>Ib#T;uv;?LT<{MLtk7c@09#72RlZhYdaGcf2 zOmIf`R^BwWWyViG;9g^EHmqPit?xtfVRA3jXuErVign$V17G)(D?RA`Gxi>zH9FH& z7>(37_p);tTP^p!MpJC_+b9KNYfNnz(hI1w{d|-fvxER*ht5W$Yt)%$3ZT-jCSK4x zfxWMYXJLpFoQjFYvb7=8`FqXoV2@F}F#~CzGGPPM8@ktBJ@ZSxKQ1(>r_yu zAJ}#pT;%4OE5sE?jKufwisP*A?0LZ4*pxSEfNxN5hm5Te!gW$zWW5=#t+&GnSfUL@ zGd47xI+(Zb$05S&2??Ko`*Ym92b0DJ8Y>wUtgY)`Xt5ZDwq9{EIL9!d6eKur0gja2 z1$7T6_PK9bPyJTc}TORUc_(#T;)2HfyA6 zwyH$)tX$y9c+~2MRGF*K%<!7NGU(uC)q!lSSy))>w-DxCaNz`K3^fv%bjdYBuj$h|=pj*)|t)+Aq zaAPC&F0QHfI|_2%<4ILR`!cUeV^VJx?6TM$dYABU&u}b6rqRu-}CAe;^-ZYk)aA9 zmh9IWn**Gd3KL9$&Lc{EEmAeFc1LPmSu5%25no3I=;DA$@OnUGhH)Mrs3q$9L;5l$MNlBHJ$E_-c7Fdf z+h`+RNldzkc7v-e<4Awf(HRFvKflLHrqWPrx}dqj=)+fK@(X#Jo0(DxP|X57`b;I@ z*V90c*rh9p@<*XMfDV0uw0oDob2nG{v9*LR#h=o9_md6lb+7(Pn=DCKi5q-Qsa;0& z$)yI3A{8r8e)V&gf0u+6vOvOt>3p4C)jE8JF-9DmxrbFYVfxR2>u@JvXmW4O)SjtB zL&1#}$!XuOt$&JtSL&sj`r_9K+q9Qtw2q|v8ylYYA~IYKCOll@2O=j8`95~hwxx3s z5rgXo%ZrlcmejO1G`B6Ef6a(}O{j7bKri5Pye3L=sBhQHU#?loc1-g67T_{hQETQ| zk{Wm~Ya|g)Y_T5>XYeRH)i%d;<^6eQqU!eD4NuO9_{R#j(g%0~dE2&Js`-54!JQPD zjUm&MHtWeAcqi7=%zg5z3V2mFbuA)R>Q5|Kb>5~Qk#0SQ161n#5?td^ zI~_l1P}(%}(Knkj)j6YCgv6cwRY6jEP>N>I$CF^^fMuQ?x#l4lYB7u|JyKe`Qqo0w zU%M5#hhPfi%YRcZz9{*jAenHXW%a~K;!rXgT&4GJR><7LI2f3V1naz%xzxj$kQ=tM_I}eJR4Q3Pr?AKY1Zp1cln=*{Ix`Tzl-X^h)H2Y2F zCEUVhFpJv6#=z9*FJVm-T6iI?fRrn2Aq%xz#2dJ*fvCX?9Bm3xfh@F?{<vx z59$Vr3gFX8h9zZ7Ryp)Daq>-LhnRLMd=K{VfxV5k1;fgi8ze#?TqKCx?xjU<)DTnRj^}kD364Wp-O0P+n&u+FLT-%&DP3LN{tQ-`IkDqU7 zP4^eEIvQzP-cNp;!tS-shjKJ3ub5FRixQ5kGgJFpwEAe|2C=w^FN^T$-d7jj^RUAm zUVG1;*Kn;{#&cl`TGT7RQ#od;sOd$Glv__7PIq=LUczr?1pF>zisr&sQgr+~|4FGh z-#LBVwd~5PwX(~c*(mcq)uCjT*6M|?8Q7U>c-%yIuPiSZjg}d*C1gcO;*qVzf}l^e zKzHOQ@rpVc=og{jB-b~vNKRnl5cO51oHF>7xS-wbsVBZpuK1NN)$ez5Psq!yvbe`a3kGIE#4jBeoW1fOxt2{kbOE+wD2l|j_uhrB4VO24^ z&kAT<`wSD)Y)|or1sm2;NnEZjwSScwilG(}3F1KaFIf-K6d5>EB5P*EH^f*P9rl~J zGa#5GrOM1c3mioIs7@InS>qf7usXtmUeOlXk3|uRl}3kH2Nw(DLcmnRm~G4j`L;!V zQz{XzXkwPvlq^Dl{-Gt^Zq`1l*SS zM7#%qGG(q5)N~&=0I)KD33j_aRRd$EukPpK9&sO8mQyM=&J!@sE21*7Pf2 z`W50FIK|_q>OF_kxY%q(;64A_-Yj|8>xcLL(#qCwD<|8^2i0jcLs-ldNh*0L0iN=v z+hm!MnO0$O$j4NK=RRrHPA@U9yFBbR^Don*O-Op^da1dtZa9Cqy2*LDc~PvR#=(n5u{ z@Np$-u2?#m}W{z8<9n8O87G6XZArhbpQ|ioCLBQVQ&E6h-F&Vph zXD@1Z8)!yFT5!i=1+!@^kQT)*lJ|HE#wKRK>OG|su+F6rG0sA_iP=(3pVzRo2zNi& z*q@vl-&m|F?6|tDNhk{CP zvGv8oGYFZ~^>X+x`j0;MK8hO(;*!g`cC6f^=%K_0zoUe zSBR{H@Y|U4{NZcx^ot>AyJb~D6T2z+v|3?gOftEyS2QU171g{jLVOTYWO@SG*FF0|v2Y6CaX;*FuY9r593g*1 zQ)T6fX8C$4bhxvT_eoJ&)YZ)(uJ5nBi}vx>27n$~r^SD7OC7J~$Ka%_U>|#MtuoKF z_b`M%Qn%8VKEwEZq0Obcb}h$#DJ`b%zCtVIXYV7}X4+?JZo}_XZ$l~+6(aJ|Y^jlz z)Uh)QR%{9EjVY0gH+=K3&j|JM0Ij8-M;HbcB-}zjgOJmx^nNI0vG(O1H zYgK!Te~Mh+JWLDDb?dl@THA7%=A;USi6UeEUN&IJ6a_oV_bMPoI{&>iMOV@VdA%ZB zw<+I1v*!o2zWwR*%5+Rk=O5RR64!AQ3e?f1{N)zz>C?O2a8iQSqqe@!!yNa->R# zR<@$nNOd-^-IItycLTv#(F4^7TFo09p{E_dSKd;9RiBzz0Psg7(n)cG596pfbHU8L zvz1FV79AjJJAeE{tf(vvKmI6x2!Frf9}l`Ejjv}qFWP~Oly*OLvAkhe6zM#PKO{^$ z-d#G_*7PQ+5gEtgz2KIgdK$KmnR^gx?o}}eHkiifbji_8P_AJEnp3cXi&)&x%eZ-e zA21nHdLKyJ;L!?<2?8ORQ-fsiDH<9HK-X1yzcU#8dL!eeI)$Q$dfAAAc3c z^At(o;<*AFKYmX5^z~!?^VH@3Saf;l{J1NmzUPo8du{pL3(|#3U^?C+ys`!bz6UNds;5 zP@$y~)VyBY540d}g3gPKShDAccbm};-uFn~_i9UL;+%a5qk<{Li^@ds3@mHcs9t#G zd??R@z1)>_K7^Z}RB_&m2QCFY;+;aIpWl@*GLZFX1(Qmr4@}c-(}FYXQF!r)Z`Edp zNL+-;A@1_Q47p0ZGzVM>0uSWl+f%GAB3hr zzPK(-cI|8-CEl|7Cz3!Y*Rmh_^CktV+rh-vUwl7(5~u0RBpE3RCB| zq1F@HwtD3Tul}i#lo8;RY3YRh+=?{Rkkmc~HRc%vfxkVbC5_kTJ`WMO?%zLoo`Iwi z2dt1x{eOB;{>qxuuU}L=AZ7e= zivOY*z7qAS61<|;OtbZkoxk6am=O>;F%F{(oZaS6g&W1Bl<+D%l;^ez`MF=`BSY3y z&;XVKDGI9DSW4!1nTR^v#7N4~N3pbl(k`doSzCMZd`oYLrq-?Zb#FWiJTfi)3jR%$ zr>Cz?$yRu@ox`wsfU!Ip1#msR;0(Texkx=hJnk~*{IOldBVgLX&Z5a8g{jY*im^d5 z-L%+jTsZO}>6*5=J84W&k_>u6OnmIBnX9JxhG*q8KH=$Ux-mRw#@^i0C@wKfjrC`4 zB!4+vUb`uchq?rMH~I%XOsVgv{8^|g&@K@WP0>=V3YWpL67rvsJYIk@2<5g#hrzUh zASF{V870oMOzia+$iL5~4qi6!ICGV7>XdyzNEgIQ*hw_qN;JII=`P@oEBa z&1=M5LPKJi(@><6q+Po*-SBS&y~5>eEF!L=k(jdh@dA=n%37aB=!ijHFL^9=9m(6~ zW#E>rHI0g_+zHrY7M-KGV_W;mmtP(@qt1%3_b29(arhX@rJlvqqwJ#}4>LT%wmIeo zQmS)2Dtg{u*h8+MBJ1^)bvZjxZopR_-ab)L#SBiAsfBhW>G*S4B7b~1apbWz43;ZQ zQ-UDU@`6ZAjEA3Z(R36Fh6It|;~bK+K~XVTJt3f0D(Wq7%3L{N*;MfZC;RkIx_Lh} z9)R6s1Lj0psvOws#aixfYJWjL*D*ElW?5QT=WiE4C@&(mZEL99gp1an!wFck>0qKg{*l#}8L&kO0MrRBk((-NfTjGtXCF6hus-2T9ZD0e=-- zSRD}cGHWR+Zy;=+JvP@{Jo!(6)gC0ED!lT#<+m!<6BMIrfm zT@@a{%L6TrQij!*nS(?T9xplWk}&LvV&7p>jjXfrVGL-9QeAsQ5DF_b54W=@`dItz z<3>qz8&-ia8-rJ?XK^7ypDUcW03U}!MYW@TyQQRs2AowQ=kX#V6sMzi_Q5uFOSJVV zG5*{YDg&&Rq%1=Qxv9QD2r(_W&mf#K@TV#NY3`U7p$GR0wCJhZ1S7Nuv$8#RhfMft z3gHdYT8(C_-Jas-LT8RI#l>H>mix`q5aeE^?y;&6Gv>PNP1F6u?HOW7g^H7U3xpfm z22-n+VnBJuT-HCw#8Pd$rsD2N8QR2Kxim#2+L26k@h`*R%N;uMIlA*3#}$?iG>KR| z&ikuGkpY0_UNv@3!NyjYsZ`$VK#A~3QnkJDKVFHGxdkqO=$_7dwFwd6bAV9q3Hca;1S*-)&d&7tWVT394T{l*gt`2+UQ|k1z|kQ3E~@Ykb@J5~~{b4@+fD=}|!h zlT@uKq%7IrnO`DF(vi+^;K4B5C|w{$kvb&;h)l_zToRD2<3yI zE}h#>99t@2)3pcc0%xf!;QeC!kk^Q4&HiT0hy|YEG-I`Y>^+vP7ggwYgM|43O5K{ew8x8jXbBnCi>%uj~= zPKLa|@<>jMxBDNhbolxO2rWrdiKtndbw7>5WoJKf24ym~A*e@#Qez&BFB`QQ)%0X#F&uc| z5##t1)nbb)(gb>k&y9pW*fGdA%+L#Uwl)tA&_fjIK`M%CKL)zEQC@-I6+6-&%Ob}L zN0GX6!m1aZ{Pw^19;f@v2{ei87h%3X8FXN{GK>`;f7ES7QU4an0&xGWzL`u4*IL zW|c^8rvP(*%H(~1&{(fR&%X1xW87k;re@IYkk&=qo@2LVF#ZX3j23Hqvx)|k8XsB< z3!DIFZKsFqCmp!j?4@}`SC3jkKHi#VD2DJ8Msf9=il;f@I`()qnlQ0Io0tOrwYK&- zzNaJx0;S1)X>c@Ykhb8muj2f9v9Y=Hm2Z6WPwn-SHMti!NRsWE{dF_7KWYS$pHauU#3G6;^pmtPRawxcH(?HM3>aItdeSt zuLb7 zou{#Nb9D7qJ-!ae;={PfF;Mwmej5(SMW+-cPDvO{OLhFWc&QrTAwSnHX*#NNCfJK#n>jIRERCW{j zWuSdNgz8smBmQiVVU{>RAw9{6gmxP+E#HcYlwLr}aTT2E_3*56$hbt+x0px&O?Ldd z>6iVn!GA6moHF*X`pW(GsPG;&x1~`&8*60ZT$_vR${KWpx(ewkV+D9<$S@A7 zx~>CsQc|C~7I`Z$3v{f0V%xnxl7>1y&){WE#`@{^pEeU$!OGU=$sXJbIWL98Vck^V zL^p?@;#<3$N-|^H6c2M@5fq+Pg7}0s8Tm6cJQ&xS1}hYC&!dUXQKafN8Rtw|#b|}M zhMD2tR2daJaDNGuIp?W95Om|L?o<=SY!23whe@~y)!8$v)L<85p+?ie%?Fe*Ss2gq z`)4DNDJ+=Y%+iGAKFWRfdHeHtnajQtZz4C<d?+i7U$c9!DO2I zQvZ6!!>$3yOjqI~9X#qBDdOud^|k04_#leS4=AOFFSgMAn}HASeK8?U4*M@kU_T1H z+$=#Y=?*L^gGg|_)%=_;)9I%vjYO0tQ^y9~^JXKkB51_&x9Q?HSeA;f*j_AO zlwYB+HoZLNz}8j7rj95J?Z|dqy`}it<0MC-#+wEOC7nY^5oNBjOHJ%wM_y$p|83kf zNe5th?Ugval*fO!4e(R8Zt&UXmxpPt9|<9JH6S;Wz?T=9V@m!Z03b+Kcw&&M$;Fw{ zA_(I-pK4n!8J7^Hr+Nb?_Q4_v;myw2F#?V{5^j)wC`Mn&t>EoyKRneUJ@bUVA2#}Y zQ2P=#NEF4xh@b>5L83#j3E>VXsddo~W?-nBpaUMLQ!Ix{I;Z+?5L7iHybp}nR~wpF z=4_Vs8qXvTMt`^br#O@Wu%fnvZjkL<<5PPKISi4-b#PoLN1C>l+8T9RcDi80>9SJ@&S+k=JX~kZaS-~=3a~1O zIaj#U>M25IWsj^MrT%`0g-K^Q>n4C{8pc^`by^Fr*eUV^Ig9qK!2A{yrmZ_hm7hYd zq+F}1Bi9D}ov@xi0iEvpn&oI1seC@Un3_FGdvtqF8jr7nr{?3k9T0u7DK%dU6;h{K zkhHBz;Hvfa^sL_aeuKQ|#Ov=Q%_@!VMS707s497u@o6F;gs7mSZa9lj(mXDzdfaTX ztr&{}yMqz1P~#+zmpSk@uPxS2r4bQh3~wHqcHyJj)Ki7uDSFvupIqW#cJpK-ua_6| znjFYgRCeMJR)N;JVq}kcaFNWS{Jt>bMC`T0c<`M#EPu4K{IVd+hPv~>?sW!#rH-}M zz(BYCd!w^ct1}+6Z<}18*n<#Ktk|8iUMPyTPyCRbBT6GxY)0y`1tWc{`RN~1tUksU zH_A+20$znQS+`htNj5Y~W`c3pb+DgDWv^m^3at=^?{a&kF{{)%9$e84JhO+bAm{)O zh~!79;!NNXt$<@M>!RRa9gb|PtQ&qd=*6#AovF2$C$6HyqLtqQM|{EFyg(qSTB{Q|X&w7i((-_C z=U?G45%y;^w~rj1D%j>?rQ=Ev5QnHzwfp0w_>AtETzti+jIZ;RX#f`1(u#)4ikg<8 zw)Ndt5;2mXaKStvPqzUf;;18|>B-PVBv81nYMLqU zO6OjfiY1-X5mH91U86JZ7km#tUwiiS=Y7n7?&tgH|1YpQy32Cpn~(Lz42xfcClh=Q2cIgq#m;tx)E(Z9=(|{e1rR$klC=`Hjx_qPrX`kn^5ml%A{YmN zC_85#rfqTJr^U<5CdZ*f5KX5Dh8sYD8h5E5h07ay5+N@LdSnAqI29|RGPI8Gw8&jh z_dy19;5f#R|AQ%eQYn~liN5B?Tnv@BZPhf-KmJd25o}q{e1+GU5e~PR;k%1!rQ>w5e-%&3T zv47r;N`u4D4nF#VniHjP`WaD}! z5ee`>ihuc^hHhMF{)XB8bk;QNJ}MPXZ9PiI%cW^i08x&sr@$$21(Jgl9gjIRDK!*m zahlhwg`~A?t+Wg>Zt};85~@5u!h7;InrG;7dRQiqabON6X*hfukgS98zC5o@W*CTH#kJec$ z%T;J>^c}iMGBM@?e#abl=i%+rFZZPFPOW>hWp7QYtjQxL|C0W#=+3WsyMHNBIs}k! zDlEzkx`L&$fx~0ney2&t&tgLoTza3p&{*=jU@tG&cul`36b^OWH;K2yqEjT<{ay~M ziY@lSqmG;_)y3e5xW_+u%k_y`<7D9Tt$h#=y$z zeUJb7UfeHoQo)wf{`6!#n2V*wIDx`@O>h2t7(N%~BoB3KYZvXb-xGr1O5KhCYTZPQ z2dCulapn=YIA@nGvn#GGzJ2dTyPYe(u)sHb{de|<3eUyxU+Yvho_2{3mZI5r`}8R9a{lo*oTBw@T-)E+kb?)`g{ynzXI{!q5!|V`rCyAqU}h!o8%YennrV zcvs(Ucs8230yzoNnNsQ(Y&UKx0Slz{@s4S7IjPkL(>{Z@BIm1ry;}_@t?Oa&^<J)CM zARbq5D}8ExV=_n8;C`&sK)9oi_=s29!eOTK@ZPxC@w)oDoH!V@Eh_TJ;*_O3Q9qcs zaNv{BKO4iyCF!R&E%Yvq%F-tFv&uq2&UuC0i;`AlFy~A29`54fJ4)28RFU*H-d4wT zjZDEEl2UpWqsBmEtzNF)v_xT*(|?{9rFRfpZqu)&pX$h|fL{r>D`6m%d65XG`-k-!&&%SUHm!c^W8_Y=e=D*9Q|yWF9Psk z+EWg^*vL%1lnZ63!55r@9atT)9$ip!FJzLeZ{`- zPEzjE^TYJR(v@Y~^8eG=+o>9?ZO5-`lHu?#=0>ph4|S~?Ku5pL%|Rvzv}*7K z0xhKO3yRY;KHi&uKwpLpMyfQJlYw3g#RxZ7k0>v;B4Adze zsD}T1D{CZH3%RU~6v$6ZEUUEs39iB!>hC zNz;RUREWxv2!uk;)0)oantVG`%8HCu9L%lgpTJ_#yh98-y_!8atc` zCbTLCoQ}3LeO5(?b4Eg8BB$o+tqvI7@pw$9N@RCpGa9B@0A7O zKnsZwDs?lVRTSWk5R%ORwiEAm3b}@^5InG9BeK*cHgV0 zKuKZdMP7jj4wqrMqZ}-{|MjGk1-6?+f%v4#u_weQl}w1TopG*0E*moiqU?wkquhZA zu2xZR}T@_q^;qFGv5((LZza zngWW>jF z>JK9UN5ljU?*K|WLhcqR$H~D`1K+)+?;h{ICkHOcIR*0Ic7Jy*-d*+D0;H=nFM1ob zCmH>nZojgwUvg6BO)=ZvtjMwUXp;^jbQT8v16E=6n(CdV zdY`G@WyHy|^s`8p*bDC^5Xl!gI3KE{qulfNMyt_yI56+6&r5j7CTAvDFxQaE_3N* zL@9{WPN=3u?T{0w(nuKbKSzBkM-Yq;8?6yfr=i~q4UTa)>|Bin*M(NxArEX!CBK&& znT(a%nv`n&7%T3QGUX1{R^H?#y8?tHEA{3YlXZ!-m0!&Kk01YK4pLkpgT**X3PhPw zggT$Gio3`KMk8Bd23um1^?>|a8C{R)hNL&|y~y0IBLl6$0>ZhZK%AUN_*1UsvnAO= z$iXVqKcGPf@jeTQeL_y+8#M*uXDhTe0xadNL78_ z6o`ss=UPmNQ;V`xP1&qE>v)&sfYCEBTLp66<6slCi1LsBCM}8^Gny1uG76d&KyR$-$sd=vMEk7l>7F@$TTlZ_1da-KnUnt`hJ zPF5QgVossSBZYi{)$~O?8?P-fnM<08pJ7J^ECLQ#`@O0M?@Tdna{($?2rZS8-Bq&} z9!HG>*#`vM3kj_<<})Hj;Wi#Aw5DncGYv9RG#t#*s$XAcR$piO%JXoEtwo1RhD+SH zo5-HR~u3K2@g@W2pgW4b&^Y<#`MS%1JBFYrS z^}J>O`uHE>Nw&qx)F_%ju;|lnBRP14M}I`R5+RQD?)JL!m4tf?T5n-iT*N&H(Nf=( zp^<2Lct*O3)7W-N2snDsL#T=|Sv6;9vVoBe6dV+JB3jBn2cNvq5_x}$?k}rLi?qNk z(gKS$dBdM9QSnBR5}ow!q+crGm2rJSjJs2OZHppMaAqMVjSz{#3KAA_X3W7uH^%1$ zj}>u(8^Z;`s^x^IoOCEPluxyHJ2P6$ z$Nwa;zGY$6h^e5O%-qW?rBqU&rL3RGHYP-;jI48Aa~+28L-jc;O(Ho4 z``T`XY}_Y+*4=9gM44KckjoAinKGuo?^yh)d+{d%zEDvF-Z2ukMkH*F zNLU8nZafZVHH}?+Xk}B!1>$G$)(xff^NH!cz{Wf{$&he1I?Zl@79yyN!rzG=_36WU z(MAfi7`i^4xsLp0sTYgLto**{sDDd(%Q3I^fC>z_ zBD+_+jR~R%5d+d;^YKarDr~6V73l{YEXHV)*Wsn9U?775RLIvGn@o&@9!VB@e;A~9 zsG>z6myHOl9%5Yh_kPK~_gD12G4IL$Bea-1js;ricdSgj#>j6aQl4IlXL>1~?4@|J zm*N>-if4E!o{8GX4pwD|DJxG9adygFMtMwwDf1N{jfiP8QM@XUf5?5LK>Tdtr3$S^ zUKJD66D_adW7(^ZmlO#G z)??`iplFxK`CJZu=l*ro<;;&l|Mm39U#%=m0lKfvRD$j+rXGH1Br&dP?&+OztZ7XI;v}XLf%T-Oo5`6He?*b$AhodvO^4}A-;U6F+#MK zO6G11#U??vd5PYq17~3@)Gu>&Acl(r>%E3h{gUAV0Nf@<+FZy|n4g?S6{MKK}4-3(P$)LbDO^M}hk%DdA4B0B90 z=5_tV$5ds-B59SF`%b2BB{mC0#k$Zd)kPE?-uMVsW-IJUbXh*?OS!>eI;7!+d4Sx23LHjCJ`o zTRk<-oUxJT*BVz_%|&SI-lj+BHx=v-Fms@x8d4BXaTLOII&8T~ZSqiBtg_dGKS*(SK)S(?JKfzK7 zw3-}{CAKpF&sSDnE=P^P~QrTr_p+fF0t}_LqOhcm3Qgsasi9#-WqV|Rt zeGg>DW=Ud*EHOlukf9(E_;5sIhq9<8!9oc&lu@CvA0#E!czEb|d#tWoRS`EXDGkh$ z9NbiTLs>V5A|qo>E-8?y6fpTfgCbg9>=e~H^b#9wihZO&yx~FOq!4IoG})jG@L;4T z5>EzVX)zQP2;@h8m_R`|o-+knD&zpOqbG?hvP}mv z9?l@A^UhPGgIDNNePNr%%dvj(BDBe$Oe~A@|7Gn@*DmR@>M->Gx|Y}Z#OfoS^-GsR z6>uF!mW>1jRR{!#Ml@9g2uxWLI>(lDY~R|+Ihwh5=9iz5&e5OTBWJw3iyg6=Ima9W zIqr+8Zv3w@TaxHhwj@A?U5MQuk(Fe-$0t$v^%yr|^Nl6MJ-5VBh4|*){bhR$$~Yj| z3W*?j-^Jj_V5mrNIvC|C*-H&4UrU@>~^E+Mn6gY4wdPphM))3*ziXB{o-1iU14AWgu_g(Mv;Y6p=Wj5PX%j`}(w zGCGT#7vRU`#E`#Ig}c6un(er zO&Quaz}qOq6Myp$BOlB?QV5m6cAFqh2W-HL!TFZ(GRlRw#C=+lTP9nEgiP-rX7>*k z7^Sank#xB)Z&{&l+DwYtn4|I>{1S zD_d2qvQNNwRs+F&FAMf0>$~PVlH@m%_;K z0v2}hDH6rtDY^ATF$98bg`zM~EXJ`c0zaQ9#znF_Cwrb7w_&X8Y8|)P%ZBBbP^@Pj zJ~0v3=ZXn&h2E1xtyp^;6XJJJON0=$J_h?ag;M3@_J$qaO4xW@>SG9WI;Ez%CPQpS zI&~{1l66GbB~Pwe379gQlw1&sadvsn@~H8Ck)Be6zaSL(_raG-#Prl;#!e_kLaYXm zJt8`jME8lxJ`v9f-j}uV&rg-b_$&rTgq&yq$&Crxsj#McxO1ow8+~|rODq-n!+MuQ zeB!2%2ApQm)qyf48q$Rh>@+sF{zAv9)wsIU!LLeG%bHY^QY4<62v;FK-BQl&Cd1(K zC0Gp3k|Ay};7@>dkVJ98DVB&N62*j4YHz00o?No!s@LKNZqte19)(a0#x)@X z;uQNaB-oC6Nzr30u5M814D4qC4ds?}xu=^dBt$wc3KofCMK`@x6XJ)*Qeab^Io<+! z*BZqXA%3vPKo~@Z>LFb%ku|X{$z&;JZ^T3~meZKefcKD7Z_1XaJ8^qocZ-M~rxf*% zY1Lzc)3fPHo}#y9xg64rJ-eSNlsvb^we-ErnnMQ{yhxzF>Eu#wjGpBhs}MhhUkcOq z5~Z{l@PuO8PLv)bxYUCh{+oZsec;90ha4P&xN<_dB?c1$&T^FnR3XwFn?$dOSR_(; zLkNZ>(M|zzUnD8w`kTdogl=fVCOUAvz!rDYr+$%Dh|*c2*rvdu1}QnB(nVwjau&!`TrXFz^l=q3C#abd)V{$Il3FV`4?_GDn`Hx`BW;(e53A0I zmR%4+u|fbb4(%yKe!ZucM5m=va3bb8RM4|x@tbegetd)P?VDaGMkLnCOCqMZ2Win? z#3n^rgd7`BN#xkwOQKl9_uM5*tU;|QcQ1)}N?*^_9vBD?&O-biVD=?Codd+f&H4VM zZwq2cBDREX4IV^%=IcypK@ZePsUeoQJDcbhH_aBO^VamJ^ z&wbCEO7vQZvKX93fSwGY^9|RAnua6yt05oJ6f*^=j;(lT3Jw!*!YiP_8I@Df6%Q%5l*g|Sc;H0`s zqb>plhbLoC4k9fF5g}gZujjr~8`&S$y(no~rzAQO{elO=ojqLHTr#q`gl5gPBs$Uw zQEQe)>dTt(mkG4rq5|Eyy!e$MHvZ<%Ajp5Az3D=4)Ws40;_&|6RwYm=Fl!5)%C<1( z50*0DQsH&G0~kK!iV!em%e)`KNi#KhC4kIXY3C_qJ8Ib33)#%A?~>?D>P;b&Bjj8W z8aafx#!Le@ON2#23XD7eZh<>>Y=q?B*7&@RS-Yh|h|sALjm2+3lsS@}ITA4u6zgd* zTdQM2hdRca%btvYbjC;h|90SJM6`$0DOyP;6XLnIsC>$3^>_cOS4?-o%hRem<=1T{ z?C+B()^^f_OLQcFjqzWI*PBYI@+FK(opZ3kk@a+Jt_b26w|gHIjI9f1pccM|K5?SZ zwbZ#6I`W|gtxm`>+)F}?VNbb|C{a^lv!+J=9F7ScJ2pt<>lL$>{xZqpSteNsG3GlM zOo_iP&>O&Qdy|Kph$Bj8n~cz@N#RX&zUf|kE8A_5e#R1=XrJg=%ZA3uro~C^=9~Y! z^}q3v(mB$eL*E))U5Sp|SEgFpK{G@Jb$>%!0=g4?AU7Qzrir*b675Qe>9`=z8F-L@ z7X3^udelX0R!GrwgZ8N2EjqDj35G4RQ0x^k9^EC;H>(3m^Q=txtfu_&aQ=8m#N|<= zl!=*xWuin!B01y;5}jsaC8ySxjjq8uB5)n`$~x-x61Di!==zRZ8ksVosH9GsYvb|Q ziaMR8yCgHD!aq}(pG16Jc!*gJ;)^0Y^*x`GC?<<|^AY)Bp=0qCJy)v!j(kY@f9FRN zI#Ss0@|t~*VbUJi)IGi} zV`j}Do*5TAJpiu# zsp-KjbSlMLNr5CfH8UQG7?T8?Gal6$4+BRYN6>nJGX`EL5yzRGs^2>=1xmaTm~ed8 zk|=J{kIf|=0pHPb*wZT%Bn)_25s~Sk&u@K;c#+o<$c$063<+Dfg)N^T;S7GPzT2qh(DsrrZ7wCpH^^f@`k%jWhT>#Mz=$SHA;(~x%Jv*2`k!Jz(wAfug?Obi&%G@1 zHEylb2}lW74%^I%>WPqmk-piXvp)<@%W!DFl2PL1QXV66Z^J)JlWHjkn{OixbQSnh* zND2Mu&qH-6y4WM%6!Zo>9@Ig@Yle^K6Gh_qzzPOM;|R{6GiwZ}1gwzYIg%ZExMhEM zyU9jLdfw=tL|P+GLxr0JE?fdvv@oFwxmMM8NfetHtcBqoM?^V?xXntUL-$2oXhSUK zC4KKij79TmNyL~YC85aWzw+bFv2V4y&*~b~m31k%$tOBAi$v&gRjTV9;)mJL23r6MuH1~6ROd|(dZ zBBPmNnXre3%Bc|FbgIrr6x(KvZ#DZ?$Wk(ha}Gm*_yL93_^l_-?(UXnx(h~#x@Vff zg($J@&Y1cZvpA5L4MG`G1S1xHhggsP=sy=WymMC{Gy2pyx&0vOYXoZpd`8#~y=&k&bDh z_!3{8%**qEx$?{BeDJ#Hl(rY*GrG)Nh++}u(SM6{fm{~`dm-n6k?zX^?BklIArX7{)PsKfMI3e8Fu6hJ3xHe zj3tTn5M^TEc}CJpRvb#0gn!8%}q+q6p}b3E`7gqVP{ASaOvuXsHn zcl+I=Bs!Km#CG@Q`*to=pz|+8N`0lziV$g2m5t;=j)C7L#2DT;kttW`Ygx(eTq%Mr zz!h?_*=hTC@ImXABjX_&6GMe{g<-C zfn<4(^})1Yj;wBlVsj%m#6$;jW-V$Qc>HF4sAhdA5i5j>37K^xZ+Wd+u)%6~NyN(g z(gt0QQ!17%T`ikVFQ(yW*4nvzN)#)M?pbSc9V&y6rQbIYTTbp+%O>KGsTKN&u8`mQ z=P{|XQhKp;I#V{8-`sv1`I~(XT;5BzTSl53`QYLETff04;EL(&f#1>(ypkc=TpFF; zl#KK^QLjuKd%2@*zsba9`8%)8QaJH02u}iFPdN!-5IRw0}B4WS|BbDjraz%35xMte8X3D!d(Ki}?8p#w>9ypsNjZQ)vw)I>y^qhg0V?vJM=2>||Eq;CjNA3)Pt@fmb)|0W8vG&r{T28vm zj18_S4cu{zbdAs%Z@p|!7VPQd`0{idZo+Qv!EUZR4fmc%JB1Mf7cO15V3J77l36U=R7ZzG(^QApb1J4cto>hHmnKUEFCW zI`k^lI{Wjzi*3RP;#rLZ&qT43huHAq4o)5`jSlDgIeC<4x3l0qvXAl3ij0oNuO;zw z?}avZN<-B*PIi+!Y-n56rmZu%kQf+vknb?)aHgX?8F#Fp-_F@J7}B=pVn$+OI{jT< z2N-ur`Zb8NH@R3#bSR*+kVWTC9!WdwB7|bG^&uf+0$y{r6 z5BFlfJ(a^Az{=3tDazkcl)pLFcS+>>s`YNvu70N+ulYfg3+t@nd~eRy7P!46V&9g_ z>wN|%?zeu=jUb%~d0vY|TxwTR`Gk;=Q5kjQz5UVnM+B#_FCR2~p=0jY=Z}rG#OLLF zaNiBs1jesLz>NcYhY7ruXx>RQ=G2k7OBB20_`R`d5W=U%05|3J2Uaew7a^v+syZi# zxc2rCH9c%$XvNI?42Bt#sBVu)qPB0>zXs^@B z(%YYSN9Zw51Ssfebs^%(!P64q{OOgZBOUZ_Nt^}3hWloN9RWYRJh?YT#kbVqnTGPNNVKgOm3}DDUFiV5<=g=#~2j4SKGuFH|X5U#p8?GJ>rn#vV)Vy=Ja`eAmjy_!A8o0Zq^YuBq$bQIx z5iW}fShQf4YdOMHtynr!0?y6%sSr=ktAO-gRC-)fda}x(DoGP(goP7=)7WFUQK~26 zw_)e?!{x(U>l_Ft6jCFETELQIx)?N}FTAzIW z{sxC0!>#D?P&b&;F09l~QZpv088>g^n+m(At@7bOgr$)JB@`!IiNi#v>ALUiIdvtT zh5`n$Yf6d#mJg+P?|vb^r|&W%_O)$Q?j-uAc3-$m2(h(svsx;Y-L*ZtYr*S#bx36+|J5A3l0wq6 z{4C{>HKsVLAj=4yN`i=lv4Vw;8x})s%TBFop)mrUO%Q_;@qFTWua#-V z{%n*){9N)25uzHw?L`#@>TlIw5^*_%Ce=i#avUSoiaPXf{W)0**OBUFn)-b7|B{d}U*@5NRpa4Ux#HW~m!eY#o-$zxD54 zJq%UpDy7PQ;FOuAo&60DkMbks6eIFijFdNojert-clv*;ij~DQ|d#7>O@Mq zAuza+mD}Jb21kB}{F4ALPhHA^?^Is0%96K_%jxBoF)#4)JCU@jm9S9!cv>(g0t>@y z=vQP?CYV6-McX1ro7|21X(c;ky{zW8rO*0Oq`R1iT!?;1WQqShWR~e17^fM|fdmIC zrk(smp(9aW(BnVEp~8v^z0X4I-L*V)?pPqxTZ;i3_ZBnLLR@KiQfr>n;C_UbC;+#p z-nArR9SQ{6L`i(#NqndFv5c_PY0L&AN*}|wqNRwRz0xF{_oxR9Cm2e4AJW!yQYR4y z0;?A-uTft_CLu12wXOIf2JTcM#+r0WM7|NKqa-5DT`?h!2Uzb zj_MRzRiskcfUQQ+*@Uf55by*JIl@;h28Rr);4lb8QFNNaAcPhu5kjP6jjXN|Nrf0g z4m^=_@GEohYaFTAHD!*i$eYEOkz&ZctP^qJq1YutX=S|$gNzVgPga^jd|wLa5*(QA zBBAvmcT5aiY(64#`3KptnNqw{CQOMOL+)FMF?DrZ!wamLDu+S`hRw>$)|8bsZxEL- zQg;8bq#*Vfyo3`Sscb{ST8J@St|Qk-HP=lwW8Ym%ZB{&h+5 z$}Q%8G}}yFuvGOd23)=265iWC?KRC97m8v;cTDJ1dch*LG8Ti=HH$%<=1rCAv2kZ&2WsM;HriwMU`~;B)geC*ZDnvXRqT$c| zAy44(qUJX*Khaki*D`_WjvjlFTKzx19(!kwy)(z&JICJJWAF6PJ3aDF54_Xk?)0!b zJ?c&my3=EBt0j@gT(;2>eRIsMUg6jF@_l*sigzTfarUHIOr|*APHsv?9TpK%=+kAjM+#iwh+L-4T=0k`P_rFwjARZB$F}x3ak<~I)cEax z21RJ>>PWWvyo?k$m0BVgyM?ePGV|2~%DBBmY?Rn|qO>I?C$>~WKZ6t;q9Z-uE@q1a zOSgKU6EP+Vj*vGb)U{c*1i7g7tN)?*KECG@xAkxT;oJATd6^r;cfyhtxiBJrcYo1b z44b;1$Q3IL#X@gqq%vFmr66CYH*vQ&@uWPT{)f(EP$`8X%bV&WLdTNKW^R3LR=p_6 zzDT2w=Ag?UQP{N&UH=e@J=^pJ=TpT@V)+~Q{5=`zZKGA zW~9{2$n?Ol!Qime^WAit+%A7KJM9seY4ezT^L&$;^u3%WrpK0()7LhkU^`(}oiM9P zk4d7}fagDH_H{58s)oEXEVLIeHI+Le-U`6C&Ipkv9<6_a{V$rSAKTC)_ ziN;*5(5Wx|E%xsn3G_nzQYg-H<;pV=-%od&*ZY%v6^IH7ne;M8NpvPDF~|!F@%7Nq zn~3du5V%al%(aq5!^^cgbfMH-z&S#|Q`xXcLg#mra)i3Kg^qM3H1#ds>W>(1Y_Ji;Ob%5p+v25sIWLcCb_CuJ`-t^=4i zK&DwJa@nzXM$an%3rIGSR78J}~j5$l9)3OCGQRJo_%7Ve2omF>k-)nB^>w8Rc_O~XJnrq5eZ}WF)fGuf& ziSRiTN^yq%s>t7VYm=240DrT}yHY61a+`bmMDD8F*;NOP4`wgL_3u*DOA_n@2{g0u@Fk%@&Ugxp*e&M7h$0ojNYLnq+H^SU;eJA{G=+CPPO5*zJcg-&XduyQFP z89q%ccD z^euj4BG;zT^d#h1*U!4?u=}W~A(02QF-oGdH6O6q?g!Cq_uK!aR0?arwgyQVJRbNj z1trPgzyyZ_7(sjw?f-{l1pUmYd4cT^kHL3F`7C(BLIc-wlA+Nsb%OMl~@6U&t zKZIgc6?ezLs)~qfNt`HmQJzZqW%e>PXO^$WWA>Gbfj5&=C6Rj~*Di_3%$UK#N_41) z3cu#cDh2n&G8`5$3i_LC*;Z3+Rr+^C2C6g{5FI^%|)1ra-jMHQV& zrh%?GwGAVR8$ITPiL^8kU*9x_Wx7L6x`R+Gz(w!y7rO6PuIh)erTp=4r0zpkUuq&$ z-leLm-pv++ljR6fqM$!n;e1>Oy|bD7&f=&`y`tlEm>Z#Um4NH&XbUZgKxpPB(V3Rp zNtN3q(^^RsS6%83P39`bqFDzXj}$>+)*(a| zG-`~A*fTt6KqKTPD=goI&ScXRewHf}nilp*L|&I_OZ$~`*;zK;UzCk!D~V!h5kCYx z6@*Nr{(NKHpSUu&xZF9^|zpGPiWIk;~d#I}c`ngqV$)pTu{Z zpKcfDvNjj{!pXleFgNoqc@7W!Y+PT>3%R~-jOwJFJ`R7+Uy0xIxBXqkD!h_Cr?Bx3)@f;l)o3{@&WpKF7|6mGqX!C}Szk&2n;FbEeAFqc@F zI}(ZoQnow`9l6@9^tV~iwu?I)!?h6i1G-tB{e9y+^2j>5E34NttJgwD3JUPZ5Q<+N zdXzEC2^|ShfT918E&KT;*pEwaWbra0By^-{QTE&P5ts%Ss{ zJqz}Ps!fU@c51?OZfiGH=r>y@Zfr}n=4e{3AqND(Yoa5E046UnA5_f;5Vys4lW8jg zcGtE~68mc0o5qYYQLrH5+65edMA$o!bBjmJm#S*Js9jyut}bdjayvo^IIS%fmoMKn zSCf@aBa`6bEAeRrF{?dZ^a$};pbeqlXB_G$hQgS@iE|zD!^PlG;a>gI%;z*cD-rVr zcwQpzuvy1ayFq0U7A13`_*oa%KZ*EL(~fJqgkxV>0>0sVx1Q`w<95ECGNnqaltlbg ziaEv7GsS`nGW7O-{QEJYOLbfukL}8#=xYY2YW+G&qC|q&2v{FzY)X`f->hC^ zR8vuPi6wgRCa`0YVl!;iXEBf-)YK_m-!dOnia$egA64FUJE3~D_Yij7`O3HR{}I3s z8-0vF{)1SSu^*~eO_Kyx=D1Rs;}V&lBLsmbZuHX%9d*!=-%oTV?;LLMh|b8o;&{s| zQjHqRvhBR$)6KNlrrp0NmwS0zyiLyET=(TMFSi*d^-9{u$O7Cll%_Fx#PK_H*+6X!&PzR_dC<8|@Q8J^_zAqg#7nd)w!Fk{^+tl# z-%=MlubcDfcJ6^6GG?vuy30Zc@yGxA)j2dMBMDVZ$ZuU#;ksC1y^7>*8wq?QlQv#9 z$jecqnCQ@d5XpK~qc_J@116|6t_o$cbCg79GO<`uk|sJT_usoDIu;DjQr3;v%Q2yt z-Ayn#MEa?B4Xp9Y}=cWs_D2ppvfjgLg}QEF#vyh>x51d zzIQf)?~IM@m=O1UuC~3}J!jVQ<{L@!JH$!rR^`oygDFh`yQUxijP*Zm z1Fi71KC!pv63@qaPj4-ntho1N>*lM#tzq`!zs&&NGl`6)@FF)YoBxJpVF-szDt+pztL?rxdW-x?~+onmOVl4DJOQItI0zX#?)H`EBEQ?D@PbmBFTK4NHhWALsSf`+* zkX!cZEQ$CYjY|GP{46b{{$Ae=F`E`msw~KYSIDuoOCrYL`->|B>E*vItZRSQcLWWB zW0XWn`yr{-C?pXAm0O*x9LMkFaa`y?Kw5nwo#e5a{J}(LWkn*<`L5QDUxMEN$S1jrQNQc7UnuxoX#vSmTbST@HkQx{}Rf-z{(^NYv^zmVoV**LX5G)nSlFY?vM%2prX$%24wZ~;*%Y% zc>ZWN7Gg|o$wG`>3|xHWi?4g}ov$K)EPj#l?zM7D5iU`b!=kPPu~mR0K^8EnA8n#6 zt(eHMXO~2bakoWqtN~e446?Gj93zZ2fA>;a#C(Zvl@NmXwe9M>QZC*MO3^XZnm@9Y zpZ2deOR0&zkz$$1qQMgVgCgnr3j^k1y`24(V5$B1e1S3^5p`PT5pc%@F((BCCG>KDc2A;g%d zKqIL@<8l2`=-3cd@1eH9t-nij@>|;0I_|^!&J+Br(d7Q)f5%Zud@1mv!uqo%?I)dFTS$=r|GJ_{@SA#jK6;TA4)2{lGjLC!}$tX z=C*V9ln1ke<2iY>z|2NJu8tPD_23ZuVJrdHlUCQ?XmwzCg4ZP!8&~ieq8=i|$yh`u zq4ScN^LIIR@u{o>A}!G^CxJ;ABeD+itE>A>M+-CwL*O$Hk`+RuQXVVRvU0rGG^m5Q zgPJt~PlFQIzlzoTKX_Lc8ihy7Gg+KGm^k;#O79z)RC3gD$SVpo6;noWyW(Nz7nk06Oq`io};cp z6Rw_Tl|-hKuUZlv83{I-3A=+fey5E&hUmzF4-6O~zTQLAfzh3@hP1D~4- zz9Bb<{)y|~i~ki{?kdZheiV+29*>^Gw~svXPyR)D*LMObU7p7|jm z((m@VH7B}+M79DWmOwVwgY$v*SKdu^>%duZv8l#!O}*9R!e=nM1|?IW$ZS-u!4vUA zg1-EiY`QG~zEc65s^JDve`LoJe&yJO|Kvx!MXop6U?S?fx(9!}#V%9+s6JZcRBlaL z+4nxF{_t$E6&|+%K3!}>0!GvxAawE-_<4hc^poFW&Q|ZN8n?Ig(;IykH7*@pxBeT_ z7F;wUISO9ccG{IUDHDKL4FSk_^ebwIlWv_3%DcTwREw1t|jc;j$MDE_avwai9>qjL<{2Gxo_{on8 zWt6DfQDtJs1`PE6!%YXk+%I;jH*@obsd)t45;RU9LZ`j2Ci(5wR9%~ZRV^^Y5;1Qq zBH4b-o4vS6kN~+}$O(7k3DuxNFfCcPQ?q1&Tw1 zJH;J}JG3Q8ad#)UyOW#$-kCeI9+H=2&g6VKdzS5wC!FBrsttB-kWE-hlr}E%eg<5~ zaY$ZQI%_cSDVVkkTq#!0*VEMF1V7~l@I;A(aCub_@R69;1GYTmpW1aIrt3f})^>6{ zo{4hOWx;Z3ab#DUo-9PdZm}A_tntNE7PHI<_`XlWFEhIv6yIb<;72LLbm#Q)=pw8V ztR1|o#xbXK+l_$kG*w2l#RQ-yX~LAy7F2^IFr(-qOtKWzK!B z?qcwz8IvXY6?{41)Y=Bo4*jy?t&UZTJ^KF5EkdSBrB_`iL)v>&w%Y09wRwcu^G4a~ zf0dnzl@Kh5YwPt%8}v&mtdyw{&(g>aGv_81@AH;bX>Hfk16ux^QHC;~k)NAmvf0S`%?+l;9uguAsL&Q>%VYJ)~Z3sD}HxIwaIaHhn@qbGYVL1F4`caagHX)T#9Yd50#|k zR7+B6E9sm*hB?@H7OIPH=!F>ADL*o1r$;4YD~3OUy+sSV`vla{ssBZrJ&MQKl3_oD z%zvNZ5Eo;wM>GhI8QviT(0{6k*Asm6g+$TkKkH|#TN1t)0l8t{hVGOK9WAFPXG^za zdDStg8idBLQ=g&IZ-eX1SQK$A)nCFLC7{uDMvQ=~puW2coY~u+h@0)?VuKfM=G_UM z{8F2ItoVJvmz=S7{?{Zg?JIT9OW!oUBM9kzMRI>6+4QmPTg$~bi)khzz!R3nN0R*J1mm@q6lUpS56SQPC8KDjZ$tY|)f_PVP^HmUW6;UE_+y7Q+Jk{|4xbcQ#&L#M=E=IK2%2@P*nEov3w8O8Huj(E^$mQxhTT596>x&-%5=Ik_7` z#F}=uUY2)y_8H}2Lcw0o%mo`-rCx0l52+)1dwt(fG3mKk8DK^PV7ZLIi5MiF7DS?8(<@w%yNMzmPbtaVEAw?! z1d|=b8W_tiunq5T7%BowerqLT%oP!mI*cHJaX_~?azGG$AqPty%@Fu0jIQP!T8dV8 zq?;jxOIAK8cfllLrb$6YN;V0u+I&d{aekW!{rE2{3Z?r`HOCkAsy|tJ-NrZX0|E+P z*3R-GLDor!mwQL$v~-?;`_MeyeZ?{~>GFxXg!tUbycq|PD0jJT4>^~2E%NZaQ?7|U zilBqs@L)bfFJ~-(B=#-6`cf$NFfiK* zK)25MJ`ncdhe^eUXpN{Vf~1MF=c~Vg zvexaHxD)oRbW?QBHI<6xm=l~q07tj6h(mMYmwp4k6-Ilx80xa+7 zB#Uilk)~9_xa9qjn}aTEYr&9?^eS?OLYEj^b}mg`wh4jkHDDW_F~83wDZ?QTZBPWu z2=52W3r(8<<4rZ-!snncFfd5Xt`?!m2e5L< z&zlnDjNxpAd&YfueF+tpLX7{H!e9wB6P2$-S^Zl;Bg7ZjH;l=&c&=Wb-?@RW0x?ub zjDx$A892B}ljT#`F>0X`-~`D=k#Mr*nfIg?$0h4U-C<}vaLr@u z)hHf4DBihGOf9fu>_HzfW{}Sb7)I7%f6NAPI91bQq_5F{f4WX_0w-i)?pyHbAl zG9gjUM=}P;^-hUW>W_$0xJsh)!DoQC*`2KStZw#w-QZc93od;x=FKL0Tu2g9+FdX7 z>!*(QyrvN)Xw@iTBJwL*$!d@@r3?PL5tfwZ2vomGpfrf+26k|qyMD1q^DTf2Ev#uVu`j)<(&gk26ZKm_-T~3aw?vCCHD0m_%ITtU)0JQ6x`24!bmP;pPKfc@ z)UC&{YyQQ}z2fril}QgtuF1W&c~Ye66Afd{#F%a^bt9P`Qn@OZ2)JI^vgaSLs)W?0 z*IW5`q^c^Y1TgX+mZ?lJ3RYA1+WsqyH??TpYAD-(i8f_d(8m~EIa^1nlfYo;iA;DA z3Mh=~+6?6$ba~<3;u`-HY?ZaEn(36OpmfoQyn5~t;f@g}@!2WI&I~(d9WZ~GqCvA` ztEEQaFxf%IOaJS^0H`2k>)D7$`7358Ez+4Vy4ng`>Z%VltZVx0In)%VX2h=9h`{eC z>^bj8#^-5>h;wB|K7&Z3%7iR)WXt*HbfUA&5%;=!`BqQLz!LP=fj ztQuQ-`UFmkarfuvAKE`~QfF3jnGs5z1@D%)d{+5j;Pgn+_jP-*38fwRB7TEH}VOmMjs@4s3g~ZZaD%U*MI&qWN=x-Q}Ntb z4KdVh5;M{~8`~-RlfUep{t2^;`XQr_jyaq2sD<;Wb|+o4`EVRQ&$fIh<-I7Lb!F%m z%W4jfA1R*%aX`ik(kCwF<=%N)d8}=e6EWC2e@jtzgBrZRzoq6~A3=`nCITdkGw=-o zmRfm!iN{qKOZ041a1}^a>*N(dODO^Yqnc1b3G!sC)u^)XsqI1IHpi0J!TNw@sZYOK zc(DTd+_xU+l3kXC{e?GP?)H78M%N-H7tu~b=4i9!+qV}!uNpO3+yv)>RA|&ESqCd= zH&IW1%X*GJ5+46yB~cYh-QY9eZ)Iy81dq1B$d<3kU}?Oudl@;9#h1*0#0$y(<%%UC zn-+to`B4K6h#^b0{63fCkHNU=>NI%$7{@km{kguYE%RXj)){zTvAX^6jN+*8=GKk} za`z*1aqz6p^-Igk>ndPAQ9g0tf58$10J=KbO4RfD4;O!sPqa?3LgJazVy^oOv}LqQ zn`wGNY*4*SWIJ%RP83Jo`tneiNWqbl`$jlJtub7lq$=75fKn@-DwIR;xR7(7kSq-N znqRRy#bx7#J8T?h0E+7cvY6-ppnZzG`>gXlk8OY!G<0G98i7dtVQtsYqz(f z`~n~5=YKm7n`008!G`e73S+Cc=L`@t=0-$K3G^tZV;e`lk6j&Fq#(3mgCbCqIg|Mj zx4(qy?SHfT+B`SvN=++^#Js-GZtdBKc>)}_B*rsnC?Bn4n7|?UY#{>0&S&L0A_&r< z{sVc>G){}ZN57x+5B!uMkX%6#5J z$fhPUzPw92En(etuF?%HYTl&}Od)k9|HioPkq@m#2CX-g%q`!vTkaU5Oa57_aiX87b7hdi0DkG^6|A^f0$Cb@9Y}D`^PHNlL12Z zZx}f~q?0olxhl<*)BOS)PX>((akV*D9hlR`3)orH%R!&!n zal<6pQKMUz)kjK|KM-0Ts^t!hA>L7QWaz;ebLLt3FtX{g!{CS7$BicS z=JyH(WLzBzR~cI=Ik&2)btLf;7bxWK8HAHViXHWJhCa5Zz>Epy#uG537UVl}Gx+jZ zg(TxYNI}(8b-!ewt1>STe*F|&>6~K8-c6Nme2~`GEd8onJIc}}6z)zoux4TQ=jOQ! z7T$rJs3QftRyD$BJqbmmK_HJ7eCcOzs5I8Dj#Bmf>R*aCkDDlrA05DM8sptg@~QdE z;q4FBwHt1$zTy{uDMJiK5jJ2FhwJ?lpD1MAxsKQ{AdYTDLO717zc&f3H|dJZA{HV=)>QG)^}#l^)R^{YR= znbc|u6^%G4X29Pz&@+*DJEnmm4&wSW64w>Cd5gx*?l%|yQr+;=m-v)Wu|@j&lb|C5 zOOpz}J5)`8E5>pj#afy(v(dCTY;L4T-e5O@3RrE`^b0Qr&DC|^yG*h0YbKa5kjx7h zdTfNEU-Y`n;Gp?BuTx2fFQ9o1oTm;33AcxwYY8ju_y}lY^yThR#stpznoFN(i;&oz;DoDgn6ZRbgz7?W1DZzK^Q=`HBlmAt$ucHj=2`*~mvJ_rq zy!b5|%37m~#!A1f?Ad+7gA=wB{(~RKG8Hr?daOmzhKsiK4CH&uz!ut!#IT0D^gPX2 z);_&473}hkFv?xBMmB_zXN9f97#;Y>4I*7LvgR^%h83SY>T+VEZFzz@+ayc4S4u`z zisQCZpmKQ^tSvK({^3@fB%_QF4{{c(5iKt`33db=A{)%%oG#aiA0c+jN_`T{f3f) z_?9W+i1htia%8OT2MLC%?P<|U$j?MhQcNO`>f!IEJKXJOtTW$xwsWi42@>`x9W)l- zuFDMl+6M!9lP-0D&>LkkPtP74>zhqARmdzTO$QCX$E-9ebRs_-m%RhIQ=X(47=BJ{ zd3QF-9tfBu40Gtv9AT)N1C^tOaM9x>^%fcfH8b!ot5CetCcw6A>=HoRM5Vq%Jgt>d z4gH`<5hZ#OAEg+xy7i}Z#q5MQ{E;`4J#3!-(J+8Tx%tT!uw;C;X#DH3W&@?dzJUFk zWZA+>o^qKaE~!8fB7Sx@nFLM>-(lb><PHSAcI1s^LiMU^JvusW?Vmn54 zO`804?;hw4{$n;86#+Jlay8=sIBsQez*Jg|#cFEnBvDeCVV=@d!Gz#T_X9owUrDL~ z{iODyf8jW{V@)EB>8p_h;i07LX9B`_yqYUn7G1<#IrNWhN!A_*-Tq2MX-RUc;D^^- zc4duK!Kfb1U~deiFK@M<2-XCHFFGCx#bws5iw7pQ+Vppu!~be9mC!ug7M8 za!o@Y#kF=$ud6#6_B0~*X1E=C)xP+66Mey7uIff>Lz>OeRGwWq&FNkh56W8g&8n%@ zXM!J7(wz|8e?i~+xZ`ICA$iP$g1~8S3Hr%xXVbP?~8HmF|iIBx`hZIPJ zv;g*Z?}JUNn*QGp#+oH}oUf!0cK=;Oe@q89jZHl}3p0^$f=?_vKKnp~4@$?kB+5g9^OMzwukWK4!%B@ao9*_J`ZGELhL| zdQ5HLg>_R|=Y9Vps)66Q7MC_6LEjK+&zsDIDD`3|K@2vDJ6K2MUm0)$hs7!nbcjP45vp8DI={cUn{1?#OzdsZ32O8*?Hd&%X^B8s&E=oo zg|8k6G#T);r^S#$uIl5qwGd(X~J#ok|ck`1L9qf|N0LBx(HsYw>si1Pdr30h) zX~uQZ>YIV8R)-B$BJGhUslr>uh~?dxq+c`Qy_DosE7)(02t-js9UQq4{zMd&q}iw~ z;=n5@M9>5@>itnqd&R?KzrgZRe7yP=I4DH0g&dTi0)}2BRbuG+IY@<;wIm8gT!PWZ zkXXGk_Q)GesF@qXZC#LJpvtm2+1Nf-vSMLtTQ;piEUQOlr}c z)uP1n3|}ofJ|w!V`8F7U_us)H6Sz!tK^33s;BvkcaA|s)C2=}y==VoOEt0ES`z@*1 zP~@s=ni3EkABx)PM@}!&Juf-5GB&pA$8$vz7m1LUvWGm}_*I*D-xe9LpedX5+ddZV z0Z78X<&N@Y`NohFY0AXFDlt7QkL7>I9_99U$!UkM*f>dHB%nN)FoTMC`6}=pZHH`g z5(O*%lSAmlhwFR9CfUJ4igN6$DD|p!7^4tGcG&0NpR5h6LvqF*#^j*P#S%YMB^kWm zgi|hPrs2r-KP!r!JUHr`k_1JPMWU%=LmptOYKWhYZdUki(zMr47IHE$KFp^1O#4S( zs4af@6VwKtkDMvOv;2JXFWoUi%KEoziiBS{j^`F#CJGcPf7}vHlQVeK0N5g*ZK^36 zQ_e^PDRJ(@0a)b7(OS3kjR7%lo4;!sh<#w#XR#RVv%OlK`}%?-LY=(hK6{422)bH>W+EELuJX? z$0BRHhY7%jNvPNij%R*tL}EPI{Mw0B-xfOmdhu3kWc@rUty*o*1lu@9ydN%lmfnT~ z2Ttb;I*d1OHa!U2xG?4`e!T5q$(o`?Pu}Kdi4O3%>|h$|+$sTnMUykY@Q3?eD3=Nf zza%{&`sSH50SY$$lwf|JAa_dtR+R#uDi7Zf3>8`J0&>~|*RWX|<}nN;Fm*fZM{#OH zn5oe&_0UzjmzBDgV`#DXld*|?*zvcwqH!YDVbh3mW3|(}=H6=st7PsdmqZ^o2k53! zM2ZIu2;^16`aywuj)+cqkB+|MjG(2Ep|`-;&#SkFuIK-dGw>|QVhO>VHB#95jHYD; z1N{7pLUxCdODcVton+@eDTHl5*6T7~-IdCfoRffoNPS@p(h}q<&;>U;k$PJth+$_r z#p6@{9pqye6WXtY0%UqO)^u{hhY_VGWsLn4zp)g($dn}Squjx8G97Zb?=FQt?7tWL zgRP&6|MX7TYN_tuA6*z|MX7@q%HZnc-|8OZ7xSeEr;F5XLQ zF^qdOTZogl>3`#hG}V3XyWpUhQoXDW;1eW+9CWN|b3uyhxN*(pL+g{|6JEdMF@Y_Y z^GChV7!6#gx?E>Y^~{$?R?~a3!vd;Qda6}w!*bDkj=%9I&@>=-CPm?3tI~4EPUr(v z)YijPNfBhajR))Y*rLdcldnmJNcwWQq7zqiR3q25`RM!4Y2X}TA;7&#JUMkjX-a+B zAt<)RbvDS@bDi~=GG#sv@4pDsG==`YW(7{Z?%k=;8|JOEqVx%^O8UWSV7wN&iLFVQ zcyi}eQO=dlIfvxgx?)@xZ7qO@^}%<$iC?>lh#DP_)|!fi z>hOeiwQmC|gwks#*3{xTcs#>4J zsPr|>KssR6Q2f z_%ys1=MP_gHShGcoiCebHru_^U0eAM7_yi7M&T$^!5v+O`eIAp&n{R8C)LSX7fRm4 z=n+{EPqhfBXSE&m^**PC1SKSfYF5ojA>rwvTU37@9tIs=oaue-^V+`j4ZivUC-qL< zfwA^eL}HiWOr<~lcV3D%&XWSe4mEG0R|}-&#+J9s(snA~2jEVJAV)WxElQnzCfTPt z^H9P_?NDoO#U>zz4a@^w(1V-ka%k=L(Ko4yDqe9^Fbt#AgXI<_lSl~C?mJcB-RlFT z1q!c$jB2Ff)c9Jkba?AV8h&o+K+-pHm+fNQ;zWxaVBUaOV#HJj zb2uV@$?*Kva7if@=Wu4^aPF-k5!1 zJa+F>Lvm_xDoq{yJ|Ko`XR%R+5c6e-;$>8J-%>{35)8&kF95rP`}--igbOBwjkg<-y{cb{pXMw) zgNG*WxHL{YGWU-XUt_=r%oC@;)gnhdYur4_Hq;3jxKMR+Jr zGi{LH)1*h%*6YE`ob-u>71pPpF|V6Fwp~(>1{7y#4#{{KK9Z^(G`iBdj>;H}D?<{5 zAt)m@#40uF9ZiHHi2tzZ`vDhpP%@M%ff&_W=1>3FAiD%i^WiJ+5o}M}W*Z4NJ{$Zg zlnPbuA*1(^sWK%HHSf$#9K;eOyrsY-i=&`Iy)cNIhBpG$6tL?P)U8%GRGLKcwe6va z3hBek-EzM8R7wclAB5e1U>1B0yN{YQP1?s2TIc?ttC8~+x2^o2YW4IMweZ0<&d5vP zui^L&&Rb((u59EEpMDt{&I&dM;VY0Yh@J&!5}zRu&G^mW=fJ}sCSxa%U7sRrt&PN(wZ*jzD} zrtz~E660SMEFS@DYa#gPJ({XF#(#OP4`;V0eWDstGsRf{{Z!>93MIF;#qw2%?^ID( zD{ci4it1mT!B0z?Zvh!qgk^Jawowk9Wm2>ohhB*O)Z*{skl)#O=B~1asUc_WMR|=s zr5~@J~a-KGJGu3-qnrdtELT$pV`DGWRU)Igx~kkZq`oSY~3(-xp zXSk!u1tD9mrCt6Qc%XFaq8xkIc|Z3^VgRo73fvq|0JHzK%#P0)mMvf;{l)R}o6b?J zX+x3dAEO)jmI3LvY*=G2>439clQUZzcCG@MlDb=RWWn7~2V>0L>-O!ZtRdx`dBQtN zZd{fj=D#UwVGf)#uZoeRp%%bS6DRgt2I*2Gm!O35F*;~E&v;H63;8c(<`aqCV~J;~ z75UZzezQZlJ!OiFL$D)8Sp`FyNad0qKq`?pBR z4PZ})h)4PuY8B|U#_7GR39hNiq}uxJGMQ8c0HV zHRlEC$h&AI?VoTxZD_L_L(N@NHKiUB6}$jrYNu^smjh}DZy$?LIr$WBk&`J}%Hns( zb=Tx`STVCQKesY}JEMnR@aFH4cE4*VC1Q_3!8W&H(P+n=hag)vFm^SMh=AG?K<$~1 zWAyg!JHL;w{*`N)QX8IX4RUILj}>n!ka<|jc@MT!;gK%SaO;(s>_9Pt$&me)D*OXZtZIn;rS?6 z@O(o6ULIi^Te^fS-w zWQDNrj>~Cp_|{N3oDkp#c4khVFYg<3nv%5h5cZ7+T}4ItqW`jJ2^RI0`tqz0E*Y%6 z*l6*yJ3>BAJK1DPj4darySX6egOL)XD076+CMYJ#fdi__Rs&B%bF;u397)Z^T!OHW z9*^tN+M1$empRg9;100zg8nuVcb|}3CKJC_QLf3ax*0A``HXA?%2~DMIP4Hw*ylDG z`Bn*%o>rn|Dvxg-btrJlDTUFmpWAES{m@G2nJrXFPDCmTGT?x1Ukb^%xcBg<+&$g^k=)su!+7Ah8hCI0}6 zLAvWp3pje;Q!m`5b^A0MCv|{TBp0joRpD)n^zlWV2#l6v{wMRxUrjQoCKXn6tj?1d zN#Nw^%KK4fvwVJ?bUrOWM{>Wxuz-^|bD}pNLIZ2YKy>V>jJ6)3wzUPfKE9ZKrgp#& zw2qg@z}cj?UFpYk`&qv*rEXg_XgKd^Do{S8FDleu0!`x!o${H_U7 zTyd4MVW%z|4U+yg&#{Po0jtPU_Fv^cid*iz`cf8Y*| zsvN{#Q^^Y`Kw?7WB5!383w`a=Is6pu9MQ~(mmbp5s#%rmM*b5P8yO_>_y?j5@(=rd zEyr*WXZ!=?nzH_&?~Z6t+?2QvCFkK^jhi+2t3Iu3)|I&WWv6M$yn5-#;PW(0+&8gr zH-x-2fCvfn?N|>hzWK$6Pecv+6`mZS8(1ak#$&jlssqKUY0X5D^$x(Z4aZhk_c)jB zza%D|n{2-op7s4Pe05&P`nw>*n%Y}u@rBMu5mNmxd5LhcuCmXRpwIQYCyxyV!?gGz z=R2p$%dn%mR#i`EB_F_09Lj_a{?!4nsIizbeb4Gm_p2pVMVZxo!jMtJ2V+&&Cga%J zKE4VI9o!;y&_1lRDFqa_1k4ud{7MDI$Nl4AzqW$iOHb^?A-T_zh`pUUa*6 z)@I_^4f|@P+|nyhqy#ti7EqEjLd30p3%ryO>Ly%#QPpVKtu6I`tjgUoVPX_{U9kSO zj_enwC;3IQ5nt7sW{2Oa^w18>fmbc|i|IQh1HNEV_M)YjVwLe+rseD#2MSzw$~R&* zGypXN8%*l1w|#UqSUYY67m};OpfCyTfyLj2ZEO>l1Pqvl<#ug~5nuY46)$D2Kb z(T?mK*arF(?T{n4>W`NX5tm9Fn;I8MUkaXkpZb2%qD+TPJS3AZ$g6ncm(_{hsK3dq ziDAkZGQ!X)DZup4fjIczlfWP@C;8|u4gpUmmAywk=7CJ6{^m4Az(D1NY>z~y}gmU$JjjS(QY6yR3q4=N?74f zdjN50uc#}jB+c#dK(j6#w>P;2vqfza7ESmJ8^hDTSk;?wILb8Q-r(B|(PVL8!%?}u zn%dKGCC>YMRiiLozA(D*hvoT$)4>aR^<~MP#nKNCDhps;yCx@oY2+Bw*B_QwY*ADJ z@0C1{e--y<zBpDh%FLSdVFFIflkwHL7XdE~QMX4ovv#1@Fe$Jk3r^;pV5a5Ijpa ze+?)Z$pcl~E*R@A2&z?soOkhPx-2A;sDT~`Vi!tXsxvES1(0wb`398s=7Tsst(=n2N%nI7ryQmq-Q{j1dxzGE9K53`exI!&g6rc>akypn&t zkI~_7mLUmg?QDR)=cjA}AH|1bP}XP)|3$ppZ11dqI0`OS@+m|UhF)Ba|Nj1dSC*Y_ zoF(QPrx_}>Ej>ooMI%Ynk@Ulnu<}B1VVLRSfXm?mKqo|?ZqHemA(N`R&4-cShjG$T zkHC*bL@{Mo+tIyT@8o_%4xij)=Fza+M5Xsw`E8wjvH@E{ih$qZ%5l&RDsM;xuK=p% zD4tlTM|u%?f9bqNXN(hdDPxUGS5;U z24Jj5fPNyWocRcZA1Wn@@f}q6J@PJ;N#HkFAE+@Kw#G$Uh*3&0!8^%Y`QECgE(SwR zK0M!5z%+Cl*=|WGtz|k<3rj1|$i9|&tHt8RDj_}V^?KekHZlN-#1J+0Q$_|^Who86qTWSZDc;{7@9{#JZL^wLexdci-#9|HsePQ*t&!M=<%=!sqp7> zv#N&MrOc)3pM5{NZK8m8vGaGX z1hBPSfpV@yyIs1p+#0jdT>eH-q-W$~5$xa$w3eCm(J=8FF>@Hnfx0vjqB-wEUF>|k zH586h0Aa$Ixc-SF0pFZ+#jJCM-apE#(l?1Ak_|oSKgj4qj2g82A7McpGC$G!NfF;O z=$OD+Z@)Ws`Wrvi`Uk%(S3GHRTh__^bYb8X@j+SmHa?7Y?uAAlaX#M7KM9RI!7&*W zA)Y;cMbE-NZ@8MPfUtZgj)>i3h{Nu} zTc72*-}yCzH$N8U$&_5e-DGj~9a)J{Si$Uby}(lCSe_Du{G@L=X3jV~!pp2ttt;78 zxoDr;{^g+kA+JxJX7o9#3L@A)b?H)Y= zMww9Lr{mePMs1X~BCa2iGcL*hnkxnvs^i>az+Rv_&i!9ZGz+cvl#HM#nmJZ9^__lG zgBk2B{VrxTlkwq{hK)*xKacex+-~jrf42F3nkY~af&Kd;gx$UP4u z6Vc4i$^joDJmLQ}6Nf^tY{TtBz0LRNql*Qt8;k85SkfGlfRCokcN+|Rax_W(w5a>K z8CO@r;rF>(Cvb99i-rsp=sG1EIy^gck=ss${5+vuVP~c-UQZ>P^nl!Q;k`t#LIWiW z3smw7T98kOKKiUWXl%4!g!Tcq{I0VGvO_kBmN}U9dF3xq+tq>Kn}Yy*bCF|95yzrQ zpUl6VA(k$cxI!}kku9SOClN!K@ApO><8s*Bzy146_~>VL75$90D$aGe00T34C|HDa z3Cv3}REiMQ@+Rh*Foo$cNm+`ZG~ zdizb6%Pk$=VTsv@r#|6);a;_as=>#iTKdl)7~3Wr*iJX!!1J4Q(&xnU>%N2vAL^UC zAGJKE7IV!}hD8fQorD+Lhi&{%ymK#)U%#-i$HI0?RX>_QNz4Hxj43|+DLy@kBpC|% z4%tG`$QjN#rmdgwT+NczuWyWzddR+7e2r+-wzkr+gW(*HSRx>hlpYkj_X=KUTa z{WLmNzI^LtcDXf+MBMTa1*11x?yE^b;l0g~SKW`*Rrru65crD_v&w1oXt_ax3{ROC z>$IT>wYm*8XPGbGvhGrg0PHE{%Yoi!XVRrlEXJ7|a-8Q+K6st4V#1nQd?B})g?^D0 z70(7)fD*vt4cXuQ*Wh7VJ(csg@H2)OACk}o{Dl||r@qnAmz!izY*dT|&UPy8Aa~Tl zBmezu_?U$=HFhe{WiGuC5M55g<+3n~2d3vXmdL;2qJ6XY%;0T3-Zwu*%b4R7igdd< zCT*_#nBo(wMW9wjPFX%+x!nIgCy9vxY~h`x=qXmp{Fqc$T3ENeow_KQx)&EN37rY^ zB_8r@c&L;*sJJYu9HMqiYfVIpf4uV&NA``anF^k!U5G}X4bHb*_}MWW)D;pjQucxFaL;0Nl!L| zUl$1QDeupEjTUOq!rHRM@glq~LimM%>UXp#`v@WXNi|Ji3l{&WQ= zP(VkP&Hism=mpzOP&2=^%O_>{RfKU#%lCa}U50}7E5933F_B1*F3y!G`V{rZCx0Qf zP<=4Sw{jst>TWNh3NPx?_TkgSrDWDe*7ay3q)9$n2xyCqGR>u86ky1DaGhDZjOmUrt2qOt=io=flQom zStjd{RRdz(;>i*gPr8AmZJB5AH4Y=vU!uUCbh>HP@1S4hvRW=h;SK(+_}ZyY<3q>S zdY}OZYDAnjyfa_rX7pj~FZz$^XarDXR5n?SGD9|oQcz+Xos1)HK_T^TxH@o$*hah$ zWl>U`!TIEnFC>yJgN#e&Cl4VwEOhVFUw_|E(Pr<67w?WP&GLL-NsmkR zeMzKEcGLy&&k!9)@OISMPEX9^fQxxAXFJx0jKyalP6SA-F+mqJWh5fR>@9Y8RD4xt zR<;kNlGr-&d9vXwR}8~J>sR(E`14B?(hf=plmBCG3h#+^cXVXJ-+fF2vAG_<(LQ?y zoTy`cf~#|`hdOcUlsc7({S{_dL!S?}E_98#DR`%c(Y~JUR2z#5Z8n>JNIXyGoq`8r z6i7Hpnlepts#7?ccTn&yi?6}-Vmbi9Y(IuqiX}AJtn)>iV=ltmg2Ns_>5u&d6qZ~z zD?vz?GDCe)iCEsOsL6+&-W66TqTVQC%GI`=y1J)>%ife_*|f9VcfMFGlxNaqmAnG6#O5LKupwZ6y8(qo9*^pgro|57% zVc(7S71qWi$H%o%jg?VY)IqayXpIl`7qHJ@40fH@Fl4A*Z}@ufbz$!oyw?1uZZKPL zcMBZDiU1P9M5h|t=EFpXh+7gAM5;vR33g-&5)e)9A6@kDjHBf;0;HYY{F@sA(Yhb9 zM=+g*|)d~bj4i*R~E37-b3^$+@TvG*lk zB00}e2D|WrYaTDlr5)(F-APHwm2}541ckq)m^qfEBT<2=Pc7UUCGqVmJg7P$l@*QI z7Ju@s5Arj}^lp4|n#mZi5}FnCFooJ#!teFqmiv{>srvcioX%f>TshZD%r~&5~QG@e8@B1vwO8AMV+qydy;{;rL@*5c~#HF-j zzS2+H3#@%R&7b&0I$xRLC>#12&g7nsaRudO83Ye{@?jHIUZ!u$u#-l+Vt1H&!Z%i4 zX!ELku5n>=`Nl8*mm9T+SzlS-cngWmhE*G*POB8AMWv$N@ z6<^da0lBVH-IqPVdaMLNX+TDWfWNgo;kV+LxEdrhG^FH4-aVLby_8Mv*T>f6&9Kh_ z{lB-j*^ui|$7)sCi*Tk$Wo_}cteZbP6Gf|psPyo3VJq3ty&E7l=FI0;>fJC%ZXZ?d z%ev9-B#)O=8nI)HBEKVs^hm>Kwdgxr@m#X|!!6?DF03JV?2vb;9DkKduvvz%#ypLa z|5S=N{6-_-i=v_|ghyJ2O}`Z$j%~lw$i6s<+rI7BLfJMjCGIcthr*h)2*sMgi#1>z z_kxGtf-ik2FMah(dQ)0&owYWo(fme_n1DY+Nlyhfj~AcAFjS|P*&CE_li{0Va=q@G zdb|&#z_f@a>w{OfubWp9Os;9>jtngd-;qa?nT}a1kIS~#)VY49O2*$T*9G_Vof8xC z38e?(SzuL$g934@NC|Q@mYUqBA5%*^6OThKZAXE2v&z26^88vtY~BWRw}S=Hu>$CB zq}0AGNAi{9OLD`3Zst2M`UpSzh@y^#n(sk8rvC3d*fem>X9o&-dmCutbl++?-C;P< zv7my8e-45(06RbLvi9YL4m>T%p(N+@r^<6Bm+lApolFM|-rY=Ef!|rl{~)SF<_$Bw z?h>r?cZz(eKfYVCxIWhJnD!g4cmW2$3o=Ddb~Epefuj>S<)PvpZ+(1Z->4;=stXkx zz51NhVR`w$LQ2-PQJ*_Vx)@oKK#Ol?8xWK$n+>WyTRtn!iD*?tB}-{|>K_u@4tv)m z=`g0#nGB=Ed+}fUE-1W%Z&OQ@cf?Lch+H6R?1Ru*AWc#a*MhjestYQtt#rf<*|R?V zrd`ic-X&bo;FAHV8sj@NZCSdZW}y7gH(bK1K1Nhz`0HfjEyOQw{O&(cPMnR%sH%hT0%E$ zm55X}cGK~C&VGi>6_yPB0bkE)f6-hz*i{f3yl~m|74E9_+&kD!L17c{P+z|e%^a-%B_#*|pY0w^-eqfgy&W&B3(O@IRD7oc3kvK8o z*G3nUbaq(yJ{W{Mh71Y5p&d&Ta!F6)Q6D$N|9wcgS`1R)>J`t5pbs!^O6r>P5x|=O zeW^>MDVF6XsVT1M4e%&U+gI#;oU<;^K4~&hCyAb+93X z0eCZD+@b9(%h9rTTo9$b7`;sYn1l?`dkp+cnGLuggGk1-A#J~%lr?ycYkG?yd?t*6 zjJ%S5R>seQc;lpin}P7}QdcdfnOt7BV=ggrNkUeOE$Tkr{Q=MY-A7TWc7;k3J9$FQ}&2k4u5T_-a zFQRlV%@P)|fr|taefQz?Z>#(kf5;F?yg%vcy7KndSk}4T6xQ+4#~?Vl_Yx-Y2Aw*) zwe&JNYA~JXvrFFUerc4uZKh#zxg;5?`|`?vXm4VM^|6|ZNLWF&hbVz*i+VhHl-at) zCF2e+d*T4E-Ccc}C-_qE{F8d!v- z_3>?48Qjm};WuSe6xm-ylur?2Y*9$n`oEhrgkB8z>Pj|vhs5l&n{V`On5ys7>>Ye9 zuy=$=xF@;(F}eQfNrTC9DQhm(k=qdh@%>rHcE4WSrWP7bKE5nWAYJM zE*Uv89I3aN3*G;oBQ#l9U8jhqwBtA6uwhNuf20n1Ks>v$l6AKp}yIwBZko974U^y>lg%E#!WeniJ^XLDb8^(+Ck(d=ivFkOlVu)8UZ>NUP zETHZ9Jxe0SM0f2;ckRx-_oTLVQ(NuI^Xk~T6?yF3^Z0Mj2-n;Z2Y-#hI%cBWtI0q{ z+6i2e5b#gra+9r3oZfU`! z!K7AW0!xTpUp?02i85EvGgp9ih3%M~MPpdxDn{Vs3Sh}mJI?7xXNMXAi8`HoVj=z( z8cm+mNwGawBA!HRtlVB-uj!ovG7PcR?P63U@|GB-9id37-7dWgv4v?d5h286#{wIQ zz#CX~qAv`=$Wx*WAjFdU^pxYpOHhe0dXw0E83?S~PSV)CXoh))7` zFF5Q(N<%%F;(SCh274n>Tp?-=PsFRiw>1{=|B+36l*xz-mwMKg$%rWmG8x+=mS>cn zO#+=g_KxB2Hf!=7E3o|*lP;0a$yecXspY|8k4y#0@k~);tsKO^>bSpaHT76>rfjpQ zyrx3O4todQY3p9wj(~gh##x z(UIH4EyD-7DcZdz5nru+(yKM3jXz|VFqPVX%@dRYiDF8@umX8cqIjCC4`ensc@Y-_ z?pP*ssY2&lmMcRYVY?*aNpVBSc0)*i{JRP<1{;$^jdx3|iM-p^ z!ndu3IlmY7NPg3CqS7>%_i&c-toodYF_rg(7*lyqh%uFHg!mpR?+G0)?_1I1QIF!6 zhF(v9e|)$bc7#+80^c7pW*0g+nejKS>1#?S)v0 z7lTyp)RwGjNHm$Hw%47{2cFx@qr&F@Iw_#H*z;hsBw|ByBb7nOeP&hHKBsuO!Mzbq zmI)`zDv%U8%<^$Je+DOAh{>=1spv6Mt;0m3TZ}f)Bk;ULyh!?|qDOAMWE(!RP>D7& zh$agiIj~9PlgYOEWg@HT9r4UW+_utcg@9jCLyX0}bvePSS%@)L=ZF|nPvm?z!~M!2 zcd&HARDF%$7 zfk^F$NA}oam%PLX^k^bU^*|7j(Ya+$gss1J>`fc?D;rYvyvg+G(pS^iki5gB9bQ&d zYuR!ie+^9#A@=MkCdBW?4%M1j?i4!AS?9_O!Ic?;F&qF%IpJZodzfNrFuLP$7$l- zPilN#W))p#6A~eu<`TLZnXGmqPKepjLyOHxWOoc;vp-Djlro zC^sFe+p%hUq?P&`*$Fk4XCon!wD5rwamJIQ)UMx?ja=N8_hJxPhpoTad_JG1R}$hA z7lp2c_|(@aVwLp1y-*QiFD;5}iI{K)>Ac>aI7h0C*sQOo4PPSOSXpG7u|NNd-$S#a zWQ0CAN#ha!uUZ8FAoBSRh3GH<=UIdjF*%7?qO-UWUC52Cw^&uqM(+T`JB~mRpp zG3jF6iUB_b$r=Pl->FcxI*2qByQ#(C*uhqM9g4BN6?w+xmLB9j`T2J=qjC9c%Ob!pl z5^*?jEs$^PZCmc&;*5Z0hAD`MXX)Yj#svlb)FwB^AXbdHFVQ+kbmT?%Oy;t;nNnLF zApl2mBqr_Otd?G#@44h6I6aQ{Rub`EyP4Mz;upnpaoI;7-(UPeK{^!twEBpjMi66= zCFNyv0y9t&#t0OF{x-pp`{*U>P&I!5(ZP=>@`wx>94QCSyCgc~SmTM3$)kz!WjABo z2#OdScpva{LM_i0>y_&3LaeJGmgvZv=yNPiOs4~AOtznA34Vj#GQaue&sjB z^SrmcOQJJar>jt&sE+lF^^D0=+~9OhNGOvm%_U2=Fm4=#nEFSjY*{>#Tx45hB0g`B zbal&I1LH7-4yT0!b&I+zpusyA^!F^+XRGojofMNgL}7AQSh0(PqCf-Bj#3OwF+h^a+&~4 zPUsr~@Pn(AB81_kGVMihWWF_PNyO7Y<_H0+$M~y6v2>X3fe_+FrOx-=T)qMQiw?d- z{6RXaLqa^MPLiZ}DXcz`L6Od`6c9*KiU>mFVUrOC7pD7e)VJV+U!1Ka%gl(~R6BT2- zNxePFIX7paZ)TWr{Yd{72raBajNOrqP2|{gX!530O|!a!SzW<&KhZYVWw-YTgfN5{ z!)Hk3n0laAG|v9TzhyohN+-;9C><&jgnPV_qjI*sPL-tb91oV4#dIDl(;BGf zWko%#HFff6c{!u!(IO8;I&a)x#1xuo!)QerlQwpJ3u)w=Ir8oIFQH7)%n@>YNV{PY zv6Qt*YgS0UQ{V@#=R@t^$+6YJ$XsvV;&I6j8kbB8|DU;JP4$g1>h z-~)>t*Nap+D3mzZK6P!=qlH-X6+K!AdB_TbFQ#7a2Uq${o)>PA`R2%l(ul~>EJ0w8 zN)!trh?zq4n23C0NSSG*^A2Q7)1$vGWshjJ9?}jH!Ls)XmA(E~LAK+@g#Xxe!mjYBf7s<6MtT zVC^AMd;4%WCMA+4ACdl+xs+PdjN64}3DT!Qj z*`p+KtnZQt?_fO%kBB|>?#)uoCelGCW-xAH8UVhPkT(Qay9#Bo#=XzgLV^Yymbjkj z*3cg0U&V-ahkWQ?{!gqxUMzzJfy#gskIE)_p(C$RNUI4s_VkkIsGqYvC6QyRmqhON zL~LcOFUN#VSEsKeYhSTW|4AXn2G<=zj_r(5psjgScy(F!={Zp-CdH&by+yO6plp>Y2Jf6%&fs=QR$*1PNl9_Ixmd9gp8^v+inLXJIVBa_9BR z*6S#YRoQ$CFzFP@Zz0aY8w75GFNIsSE2UfSnTX$U(NI9hjK@_B&Xf!nxY0!H z$&_7;5YNwM>Q0E)`p#>8^PWIQ9!4Ia^M&S%s%I-}wuw%vRvTC?p))7`V6ge!;@;6} zH)8{y8zu*r^X9Xy$v}#F2F>5(DKI3~FFClirEFZyvtPQf;9Xyey z`icqh_Z{N2 zSI4NhaF;|!iVIWq_CQBUL0G*AIrd}>{fi5evdm&OuPa>jC^QHi8M{?|zChfb#0I=1 zI#q=+ya$n5*_oYFMl?!nJbj7Sd4*V_BR8~~vkoXBjb|WHu21h=pWbZl8XWS4jzlAB zI$PItyPmZqa_kESYzcOd!>vx#p01mTj^&Z{+{H>1(4HkxT#xczNn~B~r@6ilQxyy& zMUNzLnXa#bqsK%!uOb23*t=^d(pyfXi^79|qknNbzp=N;csZZ2B{_+o)M!%R=SLQ?LNFg8T5uszt+hV{Wis_i;UC(OD zo)R2LD3U!(a8f3@ybC5fcbbT?i-E62V+K2VhdX-V^f>4ZAn#f3*tU0U-mrPU#_gI) z?Blqj?!C1xt!8o)KC_K(W*gniHoBQ@bUoYXy4&bl=11Ca<^x_bOR<@<&Wo#6Ar}co z770drIgXdTqYSnc6FL&|W{2D>7HjGjiBh4s&vAufTqojLMRj@QF7!&>;44$H?nzB_ zhQ^ABJ!xaM;opWIg(&WFtYgr+LBw~p5clvp*EU{>&dS|pA{t4m<-s(xP4ZbU29Der zx)pP0-^_g2oeArd1b?bO-IF=8KHfgDrNg!9O2jiDd3B-lazB%!4lTu&6HzN00jC=Q zryBvOWVN}`tNOf~f;>X}yqkgpLTB1+tW186M}H?x#+MB0mCZU=HtS@s&hx_fuFAV0CglZiV2-5%U^5^h+Gq68Yg+`kHoza zvCu8j&tgX_#-JM#II;qg8P@k>G?1J208JIv-8EN8KY8j0t9DSlal3tNM)l!{P~JDILZnaJsvXc8+%y>seZS-HWE>15?&jLjvN6X z#2|#*Z0I&4Ut`V>X;umy_y>@~LBL-{sjwth6t;yOU7(GsNAn~dmqaf8lQuI>`ul=^tOQk?*A`FWo z3@*vcl6hyu{P$(a%n!3Gys;Dacy z$Whnq4%rTg#O{R+^U*(ua{gcbUxle(HI9;9Kma;v1oX&n76F5}i^1$fHkybOSNA;< z9U1B^a$4e6r|}~yf!)|wfT=x^6UTFxL?rKES&)dz`IveWaa}S{_SGp~(v>vSv2)vTNYf0o7RtG|7zLp((lr(NR~&swEN6FV2T#qQ{Y?&MF2+CL5?$18@tBmrumMQYAp> z$VhV*gOdp(S>RUP&YO8eAyoU2@i#aUh1tBsS)i-iAt5woA!lIV%z}C|yqw7_kPuIf zGecV9tQ3@wQRs)!Q})weLzeVn_WfeP~rF1C2P3BOwqW%BlW#`EEN+)@_CZ(gH3L8rig&wMPt;{ zG$M8H$hvoAdwY!9UnH3;?UAbVfkDPebsWvP+A>_RJvr3}x$+dsiHjR}d7vdqMWV3XF zlNy%Gj44Vxq8W;StO#t76Y(+o6TxMM^e+M^9eEAzdz~b*q@aB-pt$y9m&((s(i`kv1d|ib!W9wsq%4d z-c+kZypIvXs1yaQpZ@x5=vmCWpm4P4*3O4>yVbRcp)Z7LrVwL|?F>SU*%ex9pp!!S zRo_#w$06M$i$&Keq5M}&Rv3zZq?I+T zo&u6RD_<)&J!`(jwCP#7=~=nyS-I(1x#?NC>FKFmB4oZxGu@>fN+@7^?>C*FQb95` z-}g*T_;l^CH`gkyE8lH}WWb2l{yTTI->R5BnJy6Woj^jNsCJt@mynndV$8dcJ9j3x z>Q4lWSb;8$R<1PXzLMYhG^f*rPJTn4C1#%i)-H({Q}$WNF`r;(pS>wdBiKE2@0Nuy zXO|K=hP_}cOMj<5V>gSlTikCu`?8&VNk@VAZ`3JTqJ1HDh?F+Dy)Rte7cTD$ zDL#*JK=K|dou-BOk<{QV#9_fs)AtXf;pnHo!Qox*^B0#O=?9iZPtUL$g#MT881_Db zCNq*SGpcEY)vUs5n$XirBJN2l`=o_T6Hp6ONPJ)$EGm!4`aARbq%R1%Q1**U}s z#gH*o&L?;yKw^26y19{QG9Xuh5dywlM81!zw?)<4AKy~6An6!Xy=ki6G*xe!sy9W| zo1*G%Q}y;gLe(>e$aKtYHl{4P7$M*p;F(({?^Wkmq;jfZJ;(P=4>6Je_wwDmxy&Hx35PR3S(2}dVa&* z?Yqkh@&8;jLoqVnC;Rr7Bg+wtdI$-Tj3eQWp28hyh6Art==;s%X3B(`36zweWCX2b z1icv5?}FM=0w{@ic{;T;om;ZF0>-;2<^S|Yl*(c%>3Nh(B4FKy$s_{)w2TlaGG!M{ zv46N(U;6zk`RKPBM{cL88+ZU%bQ2+u4}m*_*y+AH#HzAV;0nPnP>5Ga;{+xYF|(4C zdKqLRK2Zk}BBj64)j`OmIGVItIDAeGcLXddX#lj6XQe5!^aRFvHS4&ghh)r%OsAyX zzLPyZ0kG&YP{nT5Vt@#{4g?Of_V6#Z5me`5OOHqT9J{DS)~wyvQ@jsqWst+|Pf5fR z(z%fmicvG0QfD@$B70Tz$k$gff9iPyb;1Gu9gFLo-B7F;60wXY`Hfq7v$jMjBVZ>O zBQu)^tA6t5b{ef#@3w@P;+jm43Gt({X;U3JVk=kEmO-gp`kU=mPY`qT{q`pnu{I}9 zp)*+Cp7DM{9wXWAQN7+lGYi%`LWgXRaDWlOPyg^Xoyz^79;$qh(CKW|cx1z&*l4cq zKUt-h$Y)9P)?@eTcEh>NiuwxLg9tGutpg#(UAs?{d}(({6kip( z*2MrPf{u{$`!f(04@$%xL;lFW8hWii{ddtTts6($B;o`;pU4tgpWO4IRYsApFT^n6 zj@?Tl{0%||hzzPvzn(Riqo<0o)U)EEo;1eMtA!LT)n$JbS=@h5Ro{!3AFm;TQ#mzv z$vany{3hi>yQ24<&t!ioAJ9&8p_ho5Ut#KY$&5y7Tu+yBl4^_@5QTjq*L69~5@kaY z&E2|Okuen+9I+}^F;HahVsK=%N86a&gw-`nVqGaZm;Niyd!(&mU=}@n+Dt9OiAyR& zWxHWl)^d?#W8P~bck-AV;JP~o->9Jpok}tm#t)&xSqNkPGhA<7BQpR=RPDLn@44T< zk`(ad9I_vB6BDt?1eGZH_nz}aLDf)V_@$5e@94+}%MdWX4(Ek@WF%i=8}vw*kSzS_f8 zrqEkPUCf{HKat^KJXL=aHyzZ5o-5=Me)ca|P2?96th)F6{udVC2DAP=V1lP97vZsYNqY9>uFk z^jZfI5=-=h_QbSP=Z^Jyih&}JH?v$wW$13cXrJX9O`n**gcii0SYVZhMa^}WL|7P2 zjdB1-pRP<2bVt&o9+JnzBh|qeLSqt|`{dCA#Z>j#>nFn2i7Ry;i5p`TtEL zp0{Tx&4+tY_ay&f_%ApIa$wM~HH&Ud^Ms{{#fo(Q|a*Tkw2S z=KraT$NR)f-2BXuw)okf@H6WM?T?JXQ*roCp_6B3Ax<@l%lEMQAPULAVzlN~6}n3w z(9pUxtkIH?qxNt(u z3w-ea)N$$*Ci{QUuyq#$ZuZnkDnu0qjRfwvYLpONvm~-^#&}Aimb;bSCXtW%}@)vAc;wWUB-driJO zC*SSZlYfT=9#ayabP&b&h(axO?TC1iHv4*o;_sq%Tl9Ep%7G@rSpxk(+(6WTi8UY^ zFojH&yPuMX@Az=uY1Pj~$`%@VLQK9aRv-Y*qVmpzc|_k+Xzr58v6g?=^ml0cOvLq; zT0w<)xhdB3(=ksrc~x4!P8xKHBF~pCm@`{2N48-0`l0sCTkV#Kjzyo*f~mGl`x;K( z>`}7**QC8}nE=da=nV8+HB=Q&(L)&7TyIoZLipN8|)NwIi zz9PvcQP~n77E9NETPSb%Mvlg-qkwjqU13`eAoa=IX<%4Q{Aetm>2G2X>~DXFH+UZ! zF+2Tj>=30-%3452c?U_Ajq_&^d9a5kFp;y1_?klTk#J4LNF#LeU1Caep*U`VGB|17 zpf*mY=k;Ug5Eo_gi`6ft^iy@>8?Q#9^=8kB5I-aR{knH!k2Z!l6OnEE+20iz52H9; zy9?GIZUl{+6M~8We5YI1^QlkecluB}DoWN^!+;48m%B<|aFYddkVn4wj+IThh_DU%Jwd35&cYk!h9j^&L(g<(cwcUBXH@ zlaZJE*)OmWk~}&J4v9{a|2IA&Q8KJYNpw1$TWT$dxLg@rN4hUqv?uYMW%aa`cu-w? zO3`YjdX*%BbTr-q^*5

1(6t2{M5< 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±a9N1uOh0`gZa`7Wuzg*% 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%0Du(UB=&CT=%1+so4B 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

sU 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 nNS(k&$vX5QC zPY`tw%Sf>(=&NJD;~^$tB5^P42VWyA2VI2w1&*j9C>wJV%JIlQ1&w&nh&jUC`jfb@ zS5JEf3-r(xg%VD1fs$MjH`?ld11dO1UVz;3>;yW9b#-w{X|_k_%kC%|3B%eJ4&u4i z-^kK-N#gMi&-a335rnpplqC)MTDD zgK7keA5#=WG6UC06z_;SfH&Ar37Ps2yqIEf12`KLejlp849>7@n#=5h$<0Cw*_{dc z!7w%lcPE>t5d$M`$g>Vn+{`zr(@tL$+W}=#UBRnP5r^IiWpxQM`WG`ShO+7Q59o8+ zKEp-u6X1;jDvgF*0V^%AV&f0B)34y33UrpN`K=&a7$Rm13bJpDX*uBR%@Yj28{RJ; z62X|+PJxy)zGgGNsm<0u>TcLhB26vQYr)f9XaR$?(d%F-yXnxjIudIfIbK0w(YA!I z^aCvG6MYBi?w0z9s}$a{?U{MUo_r& z1*8>uXUDHZ%_H#%W|IST=;{fC-_owwHQMl(F;EP?Y#77Px7oo8DGFstENn9l+&c~9 z?sWXyK5N>_yI7?H1xwa7KJg&h>qliQ>FoN1oLFFAot1(T@Ou=vpF}5i7`V+N@mdom zzMg(u{!)V%UMJz{l0~x2BlKd%`ZI=iu_CT znv@y5C>7|LtJW<)JRc?EI-^xJ#amAk!$U;J@VDuC#EQIRjqwRWg zQ{A;J_W=r_OD0f~g__>E%wfvJ_91Hi2K$u)K^GZpoG$4}=9mms3Oe2Y>i6Z}Zl32m zOZmcXqbl8(LH5UL5yN!f$L4QJ597R#Bg%pHe(%=&M~6EzmObuZ5K~n0^8{WhorQ{Y;Zwp?iHWV)W~t^$?!f5%QP zw}W9;BYb{WYd>t+&I#bZbUS0`mO8G63RI?YA;JrR)f7wM|MwfYdY<_TG&UsR2}JpN z;rR-Tg$Ut$a`}3(c}7gO2;nL6nNBe$7EIp%9qYwnH{6?ftv@_VM$7!MEPMl9?4Zq$ zy-#p7W+t8_1oOKQ?c1$Q>!m>k%{OB#ix1~?-23n6P!|GK7m&}me)>MDUkYHWQP(Uu zU|c_1(3?#&zqc1a%cz)-*F%f9+=Cs8d69Q?@K`^=TL*DT`EXzpO`NC#3a81CeK>Xr(|Y6+jW`1 z2$+?#C^W56w5nY=k=lidXSJOPCoD5AC|OSiX2FPs#aLED+q-t5#D5oCNk%Aq{hvxy zp?!pcNQg^GofE-NjfAQ7(5r>z?B-7hc*w9%8i_KHOP*H|rQ`(>4^EkgWLS)#&RP{H z5iRG^cWhb-V8>&Wx&~ac$DVuO17YV@Z)YUv)XtDw3m}pCi%K1PsFG5=7Y!p%2+g=5 z$2&&u2VxR5c>>8)EJ-hw-@6ZtjGO^)iZ_nU`q%99VOHM0VzS&z7MvAA;P_$SnEusL1oo_mY{`9)DAZCafPTH zo^t5SVKayH9L}?g8Lvnz3dQs|RD4|}$hK#eAl_7+yM=h^WV7g5i)I_O7@MdLu7PQ` z^%o(2*!G0+eMf-s`j8}(kZmJrpz%r#<^MgZBa%&sQ)H6KEreuoBE}CqkN>5Zk&LMQ z9?Aw0f#@ZOp=r^vcg_d%{%AX_M$owjGXv=NO{ceFY z3V|%hw-C?*f-#Z~6cs`)ne`Gxbp1|dfrJ>u$M?KQ)5Nq#n+({5tWI&AC5Wz@`jlbw z2U$QG(LsCFMxkXf;KgY>JQ+mS{i39`5L0U)L?#2nW3>k)=R~zb31_~9fmuS#RP2bK@Zws666ob`s&8mZmRm_603l{!k0Z861y1BuWYR7=8%L})oV-IJzPbC(=Reqk4b z|GQlb{;-U*a_g^5^q|U-4=fctSSN@i&?SX>0*Wk($!qytrGba@!3hu6QG!TvM6e%^ zV3t#}=wTH1%T(cFNwDYm{`*^_lYrrBw$ZHaLy9g@RrG|)O_4nxkWnFW$w`q46q?MB zG@1}H@8_x|XgP%UisgwY(##lvh^g7YYIB*)jDamsu7ca zLKl2O7aWf_rXwwbkn(Zr=jSAY4wK;yli{X2#S$#2r|ysUPe2!mn%8h+|c?)GZssa4xBMZ)U^{oqUYS?6bk@Bq<|9B*dGk zGsuxc6WksI!G%bZoZRJw_?e6bOPCJnAo(@bmg})eXsNqo`jEJAWJi+(WZ6ebftNT& z0?23LpFvAa3CYCH!S)I7FCvd9d4tHKkZt`bLALp=I?I`E9fTh)Q}yYtzYcQ0u&Fu! z?mv*=V)?+^$I$adpSpSW4cZ67oO7R?b8%dR=C{z^ruVPdUIf9izuuU)(WgG<{DsPQ zMb+gBY1I8a+4*^UtJ~YrBNMOck^r!erp%BVkdZ6BC!y^rDv=(vE|$%KwI{S~oojN? zLig0lVm={mFPf;Y34J`a39;6bIVn?;q59AmHg&og0L>3GL&53Bq|F8m|T} z1g7K)(SmL_-75lG=p!}r*SaGd1hkL`M8IuIG@4tMgT#4*?MAvuVLN}^f+!I%HZ1J& z=^6_%E`?1rADTOwt8Xgf4x0)98pg#obx7EroB>!9g;wPl2Q5cvZ&-T((On~25;sM7 zTxew9h1g%Q~?@~z|3@Rep0?7j*(_E)y5GEH0Z0&b8c^nBxlC&1r84>y3 zL+Y1z)#M-j%N?vnB!8|07xmDUxs}T{SZ7qW&mcW*p^2wfJ@-Kz~2Tv#;?k=t}CN7}=iW zH|W)UXR7avUgZ$<9ptO5kk*~ntE@ZVfUrMQNpqw|8DI2q0OL!qmR$E$-?XOe_4PML zW6WkEyz%or$_O%wZFQN^xtU6;|CFzYesVrVuC5QnA^Sva?5W&#vQZ-;RkNjh!Ej zvG<|ayyKpkb>%tC|7K6Q6LN+godkDi^EcIl~Na z2Q&{eUHj>UPv~up*gxRlVdE%jSAj^y!GOiVW$17nPh(P|7X#)5lzkC$3Uq{YH$$*f zdn`>sz4|)YI0JA20e%4UE4 z(SIro0)aztrakk?idC@cj#h$}nGiFah{;%t9Ml#Y=vsYWO`)Z(qzwmPq8&2r4mAn! z@5yfwS`s6>BvW>Bicr{stb&8SI{O@6?sJIr(j_9pNnYHQ?m0qx0PZPvpoK0GZiMD; zrmh|Fpq(^~GUXX%%0t3uL3{6YqU&~tklD#@?v(f3Avr$q8FdHl*DO3a)5!^&_-SI^bASg?JvBqQfisQYnUvu0Kb}^;iUo z9+`yLdZ#6bw|{MV{$8JZA>g;uI7 zD;3-+4~ywxF{y4r;8@J`raZl#-De3}orD{VCm|KxJ}$a_rs^Rf+m)aT3gJOw2Uuzb z{ahu8!*G6T6i$Tl*bC?^L3>f+S1?$v*Q68hE4$6yAN_AH&i+H%U^KH`C@SDL?kiC;W7Bkhm>iDDQSI-eR=7z(wLz#p_4 z$#d9@gjQupv#VRO%G;sLH`JaO<&P4zF6@Gc>(9s-TM2>9GbO5dGO%+=g5q+FR3+Ka zhZFL_9)%M^JlxZVAXv>YQiD|;BQ;<=i0^t_TsR%coh~cB+(G1e%$GP*2z;gz*j*6m zQhqsxvq8)*ZY9{a>7rs~5WfPX3)pRqkr`!;h3JwY>lwsojV7d|uP&vOY6)U>wM2kN zM1ajc9~^E2oRAADJpilouTP0`O$tS|)aBgC3?G_jL3{8{+gkd0kF?}+{f^@VlVfwA z`v3T+{$PesVT`HV)n#*Q&lZTf> zyNM7ln|2eS<=%&`_cXB&W#2-M`l8}jC^`0TGL?T zr=l14S@mOZyU~keiGvL97xxcP?Ok4^t*hbPorJ^fBr;#5Nn@5T@+ZAa-?jc4Nv_ni zA$+w6JDv}A4bzK^Rp|)M7mFg7kK%$(1wYvyAMbG%-N>utAZveozP4307I@jXJk>~) z)UPScQrmeqA$Y3n*vhLUy(-M~j5nLaJ{(*dj0|G0)2p@}YWAzm?#rS<)k){nuntm7 zj<4+%zbfm&mtH}ZNhuKnlTDBz6msndbUlO^*io87XsPEY)_oz=STfBrRB4N={Y~|4 zUgf8D(n8zUwl-E?eLJ$`)qM}LCbVR#Ed7vI=|DMqb-md{{;nZ^3oW%|MC4d#o!=Cc z?lhW&DlECN{7T7>=I~&KPHGmgumQ|3UVA6~lfS#a_Vd-(d6dt5Up25qIZ1YH@5{?^ zQv0pH*(8p$6A#(RJJ<0R$Eof`yE0=uD)+GQX>#}5`)ncK7b-N9s7PUkmJ>YyEg*u{ z6Fy*)%889>oU(Rahkf?_lfP#v7F>rT-0$P@b-2D;s;{@K#PjL}ABw|4o%O*Be9}_Y z19{J&s&@`DQJ(E4U!$1InA(Pt1cJ-z040Co$K|r$gVol0L7a1X2T!;I7T?Yhc zaUHJu^>x@soIm;diJrnCf1VPwB#nfHN{Ay0-aybYKe2_WxQBn*@x<~Bn}ld}Qu^5!Wly3mJD569+A|l1E=Ip|_m?`{%(h%f9Lctj4WW`VhkI zY%-L0BWxd-1wsr6b@fXjTAeW-3V5r&_LSO@_7rJjRym|WJcn5aGsX8$HV`4c_sVJ` zn`OzkkUUyPc3?ojOU>z3BWW0gl`enIF0rXMB+N z-azTJ!=vt9f_8wUIxrw)e`aPao>_}$*6f)zduDB)S=%M_J;~jkw{1f9%6Q*pu_DNx zT78#={K>Df5`-yrkdL83E418@ua_X&;2H&?NOF+mO~9idnwAGG^e-8#U=UhTTW`@_ zXXbkUScv8d@lz+cyh5b?53>G$SWF07F^<63W$yQ7HaIOjCc9`yH9LEF8$IG6y*dp=rp$Z`bn}3} zitXpShBJfxF^1ml|63V3?IBi}Xgcj?xei2Cq4u}VH`_kTE^_7GhWg%-pixQN8NX<} z`9;nC0B+XHAL#H8f5WLq(KC82K@130Dj5rrP%EW~JBrR2o@a_cadz1Ug@ODMKq%u_ zS1qVrNz^+Xw42zWF&c?X>;6X05izUTN|0^UCXv4t-Ffs?$ETW&7?2PvlMpun+2;Lb zV`~%wTV^Xkv?=B_QXsO45Hi&BQIcS2_l`)l(DqOFdV%_K04CNRvD%f?c$$+M zLcEmL7SuNb=~q&wL&2%@a&StBzORB)LL3YXPT8j!@o9usr9&{(jB|1dpEXXxuxp}% zx1go&u~4xTGUa#{6P`mvdS(eCr(CxFYVy(EKJ~A1P0sixXPlGk<(%B}%RK-0|0DhP zgV(FEN?jcII`=mr+o(rJ^is6_Y|ojWxO`rF52x)1TX?x#HkRnZOjrxTSLVb!BRVyS_~MG<8LA0jZm#|HILv_ zRzJv0C{WjhR!u9jAkS#@i52pUhVLx2>f2FZWIQ3=+137OvcdJ^h3oOcb#hKGuAs6oQ|&hMbWJd)su zdFn;h!pp1FtG0oEf~B_@IK+moTtep6fB`yOYE(rv7zqT}wK&p+J()O(f2_Pn&VM6o zprnHVElA-9(WcGM6-+NVwxETkdQKXruIWr&li379$k7X}Vc~`nWZPF= z36D#=%i+Bf#oDzPm?>0A6gtSFI7p#@14CK!rfe<_azmJP=tE+}TJa2EaSS6o!*sY1 za@7>7j)eG~92k=9uh4DNO-q+tIgxF5Y;f_9+b+HkDRnvu*t-@j=?*~&w&o7hM_Lvh zY@KL8OQ*=PkZpHtw|W9t-#adSt9I#yR#;3t&Fj#e;hQ73GoDj|4~?25IuF+r7F{_v z*Wve`^>z3Ky=F-K?EUcjix~d@v2?PB_W}HXYy|O1Cz1dbFwP8M;Q?&A$YHoVW_*05 z(qXXY-kuc^g~^>kZqQc*Pb1=N-8|Eu_vXS zavknF>^7lC{0ZKI$2nv)>#;aNbM0GC?HlS?p-hBjMTlGuZu0GP-`tb+*Fv=6G6vDc zsoY%Met0S$woEsTA)x#mC-?Pc!9@$A4ZcWF6i8bXNYz?EHX%C^M=L>_LOf_YRd29F z6soNRk%nVJLma~Mw(ZGqZ^;k0nYB2ymOD~kcPf)K$k!P<&Hkf)@9{R?$yvu*{Pl3( zVc7rhcZ!6wFbh$18)P;BsP96H{r(2M<%0zQTNK4$U5x1;5QrpN*ITelXi25;j+*Hm z@zOi$rFU-eoqKHC1wW3!x4rceK71nt{HWvCcvCGMvjpuQFAi(a zQU<6M18b5F-VHgd*9d8O*fuZQgjPD;us~KDD&&FK)nJmt+8oAdj^Z3)vk0x1f^pCf z$$vGg-w3H^i!gmil3R$x{mJ8_(E72$@;yN7F|cKf5=7fK{b!yqRxED(BU$9E(Og+K z^W{JMy;mLi4Os*|l52fZqgKeJo2M%`PlbRuoB%k>PR?r~1VWhGxlT2cKrQ(Jnjz8t zQ;;vk-y&K{xim%%qO)$1Fjsv$Ps-oL#NRkFAJ; zvpN76DJG;a&EvDSw#JfTA=5gmV)#)gH8XHTB}Ld-1dk0vh|~$$ zgtimd{IPd6WrKXxy9DvQvI+6Mu(4wka_QjvfJ!FBjr*pasSt1MLus=~74cQ6`VBI_ zkQqnAgrmV9E4~JqkNfU)i7Eu`wdygSM2P1K@kzS4D1#IJ>LqB;BkZwiiY-1#m9*YF zcf{Ys&uhM0jW}SBBwv@V;ZS>zZ4=@I6P-k8lP_M%;XkQ6r1Yo1%RH+{V92lD$+X_i zv?4PtluWCb1)A_=QW>xtizLr4S$4lASO{o2x4#uc8^rp9XuG7fMHJpb4{rf#=@)H5 z$biXozFVGI3}D&OqGABcrq~sOy=WtogQ{7gr6s-35@f}Tq3^ZPQV}0%Wkh6g%*dL} ztxk8RD&RT+)s+3KLT#U(@bD`}?qUZ{B=|pB;%vpk%Ou$77B5hwbp*^Ey3*umq z4Xf3GbrFqmY?4Kuln`xVuDw<_wxPI7kkhbm6KvChbKWJ0w#qvsMBDkP|8{=fwj41X z`h=4wZy|mY*n(Dmp>`uExk{MUfLUspgp!rk0Ny%Zd(xt)5tEi^52%eQTy-M8S2C*% z-c-_CJ5z!}t4e{nmLTk&ueV|xJ4^i}U;QLs9TCVrmuM%Wmmu<*zntKU0Y}7ClVqZ$ zqQ9qyMbeWy?#UhZut<7XBt5y~9>z#dp13DZ+(T#81%>TaD3hyO+k$z2`hOOd$(>RC z58}vGWLAjZ-Eu%=v)`1Qxf#+p*#6|809&JO0y0u#uX88wrw|!-CyNIGJV=pud0x2~ zD4>rLWUd41m4)my+_MCc=R{5f0f_-8eQzNy4ho(;QkrPw{6QE}h_|FhEK;_+I(ejA z5ErzaSTy)Kq%<6)97g>gnDgUx1hZNPuqkzY-Qsw z#U6@mbr9P~Dmp9lL;cecTac+j$gc~zprGp4iavDjYjJ`hO|xmo<+JF-*iAhck;*(vsUZD*kYBwmf zamM!Qe(hjKD$>Wxq8h!Ftq(QscFp=LfxZ9Gfj@Wf6AylzzWKp~_(@S265pQ^#M0hf zBvFD^6u4AZ16`F?Kh*MDXnR*_13q7Ez$G$T(_<3%O!Cb_OHxEopAlMAzGRZ(@w#k8_ZWMa@t(RX<-|E}TO+xE(T1+DR!>hJW* zyk2qFpUmCK;XnR)kw%}@LZK6ieen1Yg_%p?QZGulNm5gRB+pIS5_qd$uF@fbP_y)& zxzPJV?;Y&@v%goQhlUtdB`sPgVV#<=PGvo#Sb0K=0}t^n@g3Mx=I+H{vCjfHuQzq* zDcvb9+^PQ1+e<+SKfqEaEK0qFKm=dIj>ttv1hs}mj}EI$rS}dV_xG|U*))jYzkE!( zm`s`teyyN=``{O0H6@~&g94?mN^?u`2CeMwZ~MGjeoa-IIq^N2`wCjB-g`y~;^jB1 z$9+xj>G7fQvadQV0*mt*xyXL{>+X@$IVy)rw58h+go}eNhEIw)M{y+}bG;$u%$ zUGGgpXfINaZ9Y>>c7hp^+egDBB--jemkRBzMAh;^D|vHiC{(eicU4CTVl<$u(HIer zXwqa8TAfv%p!5OkqXyhe=zS2mob=LJi5m*MSBHb#EUeLg4szJYZ*}5M<*-3JDf49r zVKFA)*9GqzSCjOP)z;FH zk@jc5N|)pLq!Y4T&OW)>Re!6pgJ>{OSVb0RqP++nI!xmaU5ucpRiE7&$gHVwW~i!8 zTgBu_|GDWBKvrt9Z0};q1qt{)L_YooV+K1L(H{mNXubK%Hhuojev_+74jk8+wdBlN zQnQxSpTm0xHw6B#5JSUyuh6185E8W5WB1-y_^>XEP*pM*JD>GDlbBGCm=LImBOS?D zt~Gob6JmPdX8UF#2GVXGDTVeDbJG??Tj!Bdh&FteAleQZ4#w6G2G$SOEF5g_u%A7= zSC2M&?(;tg9*yDuCpG+6xsnV+7XSq!bK%|MCiM@K5(%9y^*hnuys0oxQ$p#)}dI@4x zpc4@7&9>#WQYk2#I-);W*^$~k6u@Wxb#zs%6YPt6xjsEv73W#rEzYW3$*Nq*s$9vc zT*;~^TjD@cPe|#;AZ_)T``%Q{jvlYEFQqOhbOS8 zdpy;>4@acAPnAAh3~4}fSZJvy=2TllebqZ0|H*O%HJ4KxH(G8NClIXfTXQxg+Ka(zayE9L zLufU+B)1w7SdAt0Y9X_M@6ds7srtBXm|sIZ71ZvN7Ig$QSZcSRenk4jF&r`wT0c@J z{;DygcwJaZpQ{A%14fz;4$j_AnH>Ylh)k{`LS}3s0WY+yT{O+Sd7LipvjpvRYI{JG zbRgnQp`g-FegXUc@0YKo3Az7I@Bfdt@W;FVeR=m6GEcCp!ME7kpj_V2--^qatdpDa4{2*@SpawQve8i7Jra_O%UHP>8mhQg1@EVRP#| zrJw9s3pGXZSYLEjD1h?8xeat_7h(hrQN5tAiq9TL+P}jZ?Xf zyVhBh$`n0z`Q3WNccs7n$X{>UVVNYv36a$(e_e=@l>4nxFT5_R7hYEhvU(wGLR2sO zV%hWI7k6L6Kl@7_hmYl+qzW5rKF|r+6GCWN{ia0+r=ec~++l-71@|v+G+5i~p)dR} z;PhN(FAC9ycLmXQNs8-owr1)p1kpKA2FLpR!z%s;uvBUk>gQ~5vNt;cEC-$*%pV<0 z9v$>aj-sB4_?&}lSN)VQa)s&w!9Iz)$Ij*Qp5xa4X=?G5rcmX*J(PM=m7q8Gw?>Wi z)GjhgkmkT<4GAnZHU3I8LcPq8?h)dlW`0U^fxhl_GG=t>5DR7hPFZ-NeF))NZ?Mn? zflECB7cXf|2=VYT=xYk`ZV$?*jd;`5lRD*Ub7YZWr%f^1#xwYtygaqY`S=epXt zKAW9ux>BHt$GNuTCgk9565E8hVd|JQBH`&+#D{dUP*j2JgiuPvHBJ?zz8C~ISWwFb ztvHBR6>;bz-6dM+&FvN3Zi#M3cK>B?_Xu28aLIHkqSZ8|3HSwQAz)rjwIHbu;r}t9 z#VgU1rRe#f-ZcR&2cIAOy9fX3!OuPTsrvQ@zZKJG*HA)@fd8Ks0vA+G*HfVx-@Ya2 z&nLA15=b_XI44qJbK_TG9_%=k2O~g|h=!);-91hF^RirY_JwS_Y6-G!=KmqG&y&wn zfp)?X9r-@};e3l>7h87{{eu&C^%PyoO0W*3vE zhO7;q=suYW?d1`|2gQIz<%u%<@^-TS{P+FYQ=h#P1_J)SZde> zLi7kB`Uu&4GPZVA&wf$QPn~9im>~z7D(Htx*3s-y33-;$eR|$(UoBgmo*Efk3iWo@ zPhDb1tDpN7sRuPRMrN~rD#f{ddLBoi&~eM7uPOgZBMxXNHq`=4bCK0Om;^+g1X`G0 z6`olF_@gy;g!ls$DecdjO`1kRZwtvD^}n)XYk&T~+DjfgMa=HnS2!VRGI{tyT8hEN zn5(+8^?TlV=V6#t*8hR)hklC4O0)WIVC6ut;!)OV*E#dM?dZ;*{}&W2qZ+xg4>%sz z$-M@}dqOOwu|%9IkD%eK#*XUygeXZ*yU2c8FJxXNXjQ6-%&P?PLtzVA+LW$WnfyS< z7d`Sci7y(IN~1|pfku`U>Jm?>gP`Y&^1m&a;HDya?ICxXAfW0H+&&?e)=OevXkXx$ z41&&?jp=vX86j0J4HYhp_3C^Xv?_NPsJu-La3_a@b`nB;$rZ9esP=aLu15GRqFU2L zw39Ls)YN%+Kc?nk^J07Jq!_ds`&Z0j!0&~|MM1oiYB?pe4nF?Wv$ zii$u~=8)l}J93L98$_F>+H-;f58HffF3puH#zGFZ4~pS|nYsrSw3H24g;3QBnrOXr z<*5yJ!-yS#)~hOi3!-h1PA){-1jm&{F#Oq_0>47EO)|EH zX#27fPi3fgV4{i;MX-sWk1Pa?inFM8-^I=!sJT-^JwX`zXeDU>K(3*hOK6Kho(s{Q z0UzqXp@O&fPC3)%$v7(aS%P*^v!-RjLl=&@27H%#!3mLgF;vt{#2Yx(_4IMf2rbv4 z6CuRE_hn{0C5WGDac50m%vn?d1Mp{~p?T11uf`R>bZm)=pZ(3ZROolz5%z-fYSVDA zB#$IY0+t1xA_EceOmBjacsMgWoS+{jA79DLZdJlgRl?ldZ2aD zOo4Th9_$36<_gQ>&l1F(TIDt+v_c2sdpQcvWIo(tr?P(ikQ75_sVoMKnhtOzj>jWW zh^!b5MIjfJ;9hh$8p9hf7KPT2lt9&4;4B7wr^chua{6&55t-s|j6ET~S7T2o$Ve(HcG;!DaHtsk+p+70XsiDpFA)O9Ky3G&P>Dk=g8g4ygc8F6kk< z3U!#dfIpGS)L%Mwci*4=4|HXZC3Txo3~13F=a!X~P6vC;XFuzi!afq8X@MDp=%9Y+ zeCtMVxmm%<0O$Gk3;Dojl8wA08_CidHB{@YiMH}-&<^%KqFeq(vY_gVP!Zn3Kow zoD^DTm=7lh0<(Yq76j{iIntU)eNUX)(PoU?T@3THe^}IBQD^btL;3KL`Fu*y&s+1q zYx=lXdhUP%i&VVVF3>36ajA;{8rn7fZ`30S(MG{kf^`WGO%fVpHvQ7Xudq)T;!oZcWz`#Q1C{y;aB+ z`qx>4)~od)$s>Ccf@;J=HuQ_VI=Gfu>eCkxi*p&nS8DVIIj%dT0CCtKsmp7CVQc(O-* z8;afit-K(|lfB}}Ua$0|J=tzg7U}uxDnWaLM`;~4c%r44Mk@yVUsIA*XV&icwl%(O zmv4JyVl$Oq4EWPuO+7WWuQ$*3glGF}Z)F_A6M1+dk4)r|iJac;J~hEP_to>Xou?=A z`OQRTxdh^kyJEv&&&54-Dr)12I2fF9zCDO~w@qkeh`kNA_BnkdnlH;m;vs=7Pb~(p zeEEiCpN8zohkX{LS9d%=KJ@KVr-6@w$0$Lz?K#GI=xNwI4V$N-OJMdkHm^*>E8EzU zZS3(jhWZ<9V?sQnX&bxW`Ks)&XRgbSbUu(%7H^&l=(x3$6D&0=yNZE@FH{CEHb8gC zDfHMGEn^{G+Q#C~=lw`Yjpu#!ysw`3GxL6C-Y1dY z?riC|(#!<5j8TGIj)1Y_Jbo(DUTs64iq~SAk z%P|qE$sv_&kLBE%+{(JgldMc0p^p&<%DD=Cgl~&K4BsxU7Ybnz(g6bDn~{vp5D)4n zsynT-XCvdxI)d)u^*2~~-CeJ-{f2FX($8>aW=Jjg;0fUTg?&wan?aF-Q4%h{QtnoV z;ZqScEx&i9k?xl?(rMe}#nuD+6(sBTTQulkkaC}R44A~(1K(g1Kz4u4qDQ`m;)T^h zju0hiQ3t{4YNVB@xOvA^j)`D(M&VEcA;ioFR>q*cN$jl2v)wZxUiB?>TY}88LM%@R zT%Sg+C&3P4gUASWI8lU}#;Yb^%iuIs@Nd2VrE*yH(9S(}l$2m$N+SH^+h&HEwlB1lDrWPxhIkM#RJ!unv zS37+|4puhDD%IrGJ?Aewec0CE^a(jZ>3Kt^uP2l)#8{q=;X)3cAEN~Ey;}Z-NPE}v zFQfvg(*;szGdZ3Kp5f)cC!8+CPlem}#sGV?{1YsN3CAo!4swEx)Gsf0cZz;p8@z>Z zbpK9UUL}sdbRuN&)BTgVUU|9lYL&$*YgLx2Ea@@1!&G`Fr^WKlv}mO|#16tofCE58 zszN1kN@$Ov^x6?(K;j~4UdUCzPb)!trL#75w>EXtkveFve-@dH~Wj4?deN7oM&b-s>icg$ZC$nlHT#TC=IWng^xD=uDsL(>s8rWXR6g zIS7F-imrBxn&vj0y0pq=2=US? zmm$PU8#k;Xm-a6UwM9VSX|w2YLGW57`vCNhPcpg(%K~>oZA!D1%7kN@8!hxhW!HX* zTS-8th3Y5-Ycm5#*BK1EeEF^9K@gz!n96DVc75}bPgVdQkLiqiZ)LF;(NYH$)L#hk zR98va0Qlh{1tmzAJYB{AYE!Bgl|e`r?XA11n6*(;2s(>*G4Mg7sw=n-qtEprbrGR; z@$Vx*BE&*xDU;mN1*+ti_hR6M$g8Ge{Pl8-Uuab#MntqZo^)^_%P6$S(|C0;=N}tN zY7_CSF{G_Z#9+W+4Ypbas`sA!Ke;FNS5o9G%auOam8YB=zmjM{fcs{hkI;H`wCvSE zF{!SWpcU%#8wq+?Kfb)QTX8e)PjUEfc0A;<$bbW!wI|i5shSg3jm^iRAP&6OeB3&Y zKifKvgKe@TG;ctQc2yzToNLKh>3khzlNG-mf$>(`l2B_*sP!GcLmy6|bxG56k3gZN z2CA331F6IZc@mWP2stIjQXnl#;y>fP7h9KZ9V6~>`;JO>YxWYfJ!746g4PJ}A?SC5jMY6V12qcE<4`riEnntH;2+}L5$V=ofn(EVfVd@0pI6F zBSenzC&VAcdG3>m=%2~5oyoEt{p~Juw?iobb~_PCl zo6!1{T#O$1eiPDE8C;H zeS^SEKnp&zha5H-`#_DE(2}w_Y(j4(NSK*hTHt5@iZyML_+_}#fELwb3ehH(pU}>} zKBg$zRyoueq)CtVs-!i7%e<3c){Xt428`r@-WaqhH39Y^ZU-Lki)t(<_ELh?DMbj~ zGaBP ztI3Ta9}7m#ee&Ak|6N=GE81(SwUoG&cUYBBg?1T0qt^`eXv|0mmJ02qUctX0-c#o^ ziT0{?^DrH>Z-cqM(iZ$wdqF+&`HmX!aeb<*gdX|4sRjBjPz4QN5>b`WhUueG3LRq^Rng7!s`U}w;hYbyz}gL9jAm0-{9VaIsLGw$)* z)%aeF`fh4H{NjguS`e?8Cc6-;P2u4N@k_vW4cb0km2Z5cj|mk=?h<5I*z`Te1mGH9 zY25heFOgx16ObtX?NwMgUI*O07t;M}G;qSfJ=+R#0*eBV7f)~6Kq0fSJuIQUb#4C^ zgf4&uITc1;%vynF<)NC7!TiER=geZjdU;2>(hToPrO%a8pC%GV5Pvfw@23hHdxSuO z7Den(U6@wZcM6Lw>IF2=)R4dy1Y3n{d-!GNr&wDP>0`u4re@1djeOS1An87tI)w^NsZlyT6;~2S_aXkmL5W; zhKyE%K#oxdB8_Sm(GEs`nI1Z(3Kgab6$UryAo_0Hq-XtLG^46&0FV3`cvldAtQslb zq1`}8u9l$HnK47=RLIj7$5){}ZP|^_V0+Mw3*?9DG4AQv*jlnIERQqTbNEB$M=G{? z9YD0Niy)^-Yq`HGS%{$3-SZ3sMS&wQ#;RO!97r1_a^N`#QKMoY&_KZN$~j1Y?~2B@ z2K=t-`zy56qu{tpkZm)zDVu7~gcf8qtb6k!2&dLdC@KasDhAVP2lFmLwjHq@_gl$- z&{A7Xq%(w8D}a&1zbduTb>Asz1A$ zwG5sWtB4Uh!#AokeAQuja5vQa!FPLT^+YFn zq7&$7faREIRW%Df9UqL_#JEG)Q9a@fmSLCBXB0nAzSD7s7tjB6+(BrOkd44YnE&VL z$itbUF6zd$612qBN95s*zF@r^c@T2)Y&v;1ojlXwpntb8oGIr^KC?F>9C$Gbh+wvm&(GIgf@ouHd?cg0HKSkU>bG`&0v;Jv z*)(4k(HDhiJEIi$9qi>0g`V)lBjV!3YH9gqU@C-CR-M zGdX4^$CJq+#IYjkyC=uY#R!IC|7J6&?7)DBbTS@Jrw68b z_yn=2V(w89v_*sVXYpY(C-78{_+);Sq3{1l*QjTmuyAXTk1f-umiHhB)(H@K{`3DM zu7ng4FBfQ@qXb0_Q4J6zn_F`v6|i0Z)RAQVw|8IO_t#tdW)R=n zsn#uI!b%HarD=2OY_TN7P3%&-jp%J}w#1|Q0kF>gjL)|nJ+Np2I1VJ;%RT+_rasOR zludnRQ=i$?uk7kqw)H#P`kigPWm|9m4{z)7nkX~WkN^N+>>HH;K^%bi$UV=mofG(r zzfG#;v1;logI;CXlL{NqHIh(z)2aU$F4Pu+Gl*)@Z%V7XORJ;V$I@ydE)}9{v?sOI zmv>5`y$61{wAy5iXNG@!+dBr)^4J4O2xSSI{Zb5=(`0DwrZkQk5+Y(C#BXsWSFBUp zDtS(QZ|#aL+zu^B=D3rjGet;KWI;4J16*loJx2cvTi(p( zH(xyG7ttAU=#9|pNN8PoZ_sLFtH2!}t|7}8M%Y1!BgD1gM9ZDY7%;qc4Z~mj9T$b-!4f->NqG`>d7d}hfshb% zNnSdMvy1J()1@L@lQFM@AwI?`K%#1TkHXey`+YNm@bWcvPc6ZCGS2FcQ%!G8nbSC5 zZPxKK6o!Aos>Q+VrfJjCaV37Tuf#uK0m#9E5J^y^=X&>PMaZ=#D{(O#Wg`A8Y0F$D!bDPy$MXDDci$BtB054qKY@NE>K)J zUhC!gNn)EG*I!?VLfp2X|BJ=4DFiHmLs0dE_V3>R51q+`T!~d%7TQLFF@9+fJ738r zRFS5R%h}9895=B z;GwOh5Elc@S)sj7pAI?-QHDtKScprjv>Al<;Q=CCpj8v?!K4IB&`KAxv?gs{s)twV z;e{H?X+nJG{{8O~94U4dT0fBB=w73{*62Hh&UXr(|JrgJDQmt{)_iu!Z9quJYbrW? zj;I#j>TDGB&6?VGi1;u5aiOdzHBd#1qXy|=##$9^P9ms>Ic-pM#_8!MG3}i^1W_-& zO16{^p?tA4=kxqpk-jFyAwy~xYokSueY|?SL5;bWATCiilPf~YB9)R3UFk$q9p$R5 zN$hWh6;z-tjG`c9J-iLb8{@kavQAlwn-RS=xoIg&sly@bYWJ}v$Np+U@@Q-7zAX6u zuj`b%qI;&B^0i1T@0V|9ZWwO-Rx$dEe^DUYB5il1pK1wO(l4r#lG$ikzvwPO*+%Yc zBlog?(OrVpTgU31Jv-D7mtGYC^N{GJ6SS8c9CIPgPedmWZ7YMQD#ac)1WWCNcPL@F z<8i&vE!}`+z9(}qLVMcZyc*2UZH5Q^^T&?*V2j`|ij*Wu9KlEtT8+BH z(4rTj2olwwv47mu8)!_ORZv__w}uA-1c$)~X9jnNK!Uq_aCdiimq7-14-nklJy?+7 zPC{@EAvlNczdBVKD<3fPaa}cx(QwR~n6(6>=(E$2wG$V2Up*-wQm< z{dB)XxkQ`rgB=q|#IdLC+A4T80`Y+XY0_5)CtPe&kP$+a6Si3U=fqLtt=-md4kKH8 zW&7{Tys4j2<~-FWl%rdt&N1yo7doEg4z8=Z4lmx6c#pPN4t_D9oT~@IK6&yNQPWYvVpQF=yR*aWWfFkgWC8vo2|dFJJyQu}mSYKjK~xvz5fpw=6n=D+o&gnLiRfij#2yqn~<%^mP~%hPjC5$Wf}h9+H7AO75v3Ooj9W_oH!!WV!@<*hb5Uk%oPQUA z3g}{{S8pai6sLl(hS*V?Pd_ShWH>g#tOzU(SLdpsPw_54gwG|;X8s5G9o?@`f{rg{ zaUriGeJnT^I%>~8>P*R7sy?!cs#TRLaz~}5sogDt7DS3O*>sBZtZ0Oe^`_)r zLSii2v-2$dj}_7H&8?mO{!F$FpRHt8%~u1Y+74GcU1*9ra;_^!>$a(V6_uAWNuE{{ zJ->NjkjM|Y{m%4N11+y|9yDc1=7_#=SMwc5;sqv?m>^scx2jUGSnJ5B^494c+v$_? zpIFP>r*vkj+$|oqu3ObQ8t!011$sLN_npr8mRKw>pKyu&M zE0#joEB*l+NZz5X3WmUQ7;Tc$Z_nXIVH8hKgK-i>k0ac|d?n4SlYy5)steJgs z9V72v_t=QuSv#^x&WCE|J`uMG&XF%K2Pu3QsCXuuGF4n#2}7bJhvZ)G7`EEavar?am%%G9W+1_XGW%=GS(Du=O!vwtfGu|E7}v8^>=&~&<2{Qy_-9%=AG zqh%v;y+t}0tJ(;hK#@ejDpk&O#CVME;kqfLSuuKx|NW;GDIY?!@s~G~_`1PG&E;t! z&!&_BoqNq4rnJuU2w(3!a>KHsVA1%_U5if1+rve{A>5P3{qsibORE$LjZMXODEu;P zaHn2H>iE1)V1kg$kaH!_wtDO%`{H=OZwjyP-uW4lM|E_0oa8nhh%`fUavgw{p#omNpCwHX( z)Y{%eEDrzV4+Bz=;^H^1UnN|qQW^NrZZEQ}F3bx9tJ_*Gzt2^5Dg7J6-Fp#EWh zCKLgmuR{iX(ZiMU0?~sm2e!Kq+tPOtXXMN;&CXfSI&VwAIMpbzzk_@Gb>O5ds2@v8iSW5$7^&~0YaiR^W13Sx%HK#{C}dL&e^hK1 zFHDM88fnOBi2TEUubUhY%{ziYXEeDoO(f~0{G#qhRA<=rx$b#PzlWgCaB{h7xjKg5 z{h>LD8+f@8QF=c3rK>&%c|{QcYWVSRfFSLruFMq(d`Xl=26q<_B=-_7dmG5;(lPV? zK2F<*pJ)1JMfJf&t6oXx{E1dg;dK2J^W%R{^0R9x8<$%(kS=(A@BMj!Ft8h-*GAR zzkj|y_`rD}kX(utH_Xv#l!U0MnWMc`nYxo|dEhni1Kt5Y&0I?Y8FP!Qfj0hMR>ofAyd@SKf5y*z zk+M>whKwQK&}+86GEU6mnOS$XWBA>EJLS&)HDd@l=Lb~|DjID|zNx_gqLqg^vwRuE=_;(x1${)%ciB-0BF=-*+yavUZr zgI4O@q4(xOe!QFZ_*YF8F*4A27MjJ)Ux8W%MpU&em64Sen`KV8HYwS~Tp)%eIZm}x z-ET7T1(|DteH8EiOng^q^V9V76BxB>ctOpE5L!tVS;zlQxwFClc6|p^C7@Abwoi#} z#X>@*p2IezFGj8xzmT0?Y5u+2=wkiM-`a;6_;|GUyYqa{MBEH3-!I+Udr!5r=3kY- zUyq<-eU_o{+el`tevn=mJsFC9;j{y}=D(7fI;Pc~PpG^f?g&|`hR%Y!)@pj3uRT5N zN(57?ybwKdKNNhDj1=k0{PoSOjF&0lf2Q~Jx&0a(oG$D+jOj_^R!+{0+k?j5P`vUd9a zl>bTqDBFg62BzBzz!(OHmpisqwsM-D5y9pF(Etq8JZ2(%f+>J`z z)nL$;xeQ2e{?vb0WG5QlmUD{+%BY(JV9`Q8x1{z#c{}8r6LZ`AF8;xZK)p?;CCzwHOwU-GyEMA)x%% zbRb8**P^#7{2cP&w1y#zV)wP)>EFaTIYr>uXH*B?f4RtGstbod zxI6W=Dcrlrt!r4uA6_=*BJUSoL!S3L1m7W0EFd=+mlIPhb@R~R@-QLPA8ocKi^v%B z`htV8)*JLuhqQ{VYtT@~;TWKL(pHes!Xdh6Dui#1(TA5%I1IXOm>@5H{YbmIe2AWk>LFRH zM^&r{n_WzSJyf3OLR%38?t|W+AvN_W{K?d2_F&GD;4`8Qe?R%hj7Oayri&vqA4mV= zxtmG2RCT{phU1M95}bELwpngp(tCJ#>7!J+l(`NJLnA+0)b4aV8!!h(T|V@3Edh~p z4s+G$+9_tnmBD<b4P))HR%Y)+Tten)my1irM$~ zMk9Y#ABK9CZzy@Uz~=?9nSE$95hcbnS);_jb(j!*Z<8tW_3P;mjo)^%#I$P_8FlFh zyyKXlf4LeCN+Sbd{V~XpkE_5Z+b3U{o7+DpGbqw`c zWA?JfdiMH&3&m-s;yZsiLrohdpRDrZ(f;28tO(#sm(UQ4<`!PJa^+w1B>TP4=59ML z&Na4UlZ=fkcxVXbD#b}C8yYcPjO!g^77!v<&wGEf5U|yOa8(Sc{gnissuSpad|Q( zhVX!w<5ha(!dLj4`c6YHuDPArhJ}Hl$a3w*mX&4He}E=xI0=5FjBoy~C7mWE?I!l` zOS+=zJBbYyM^8DIesL}d@jTjrPrZ8W8!a;sL~aDX{4@`j;QICa`uoO>2H13ryqqp%(*VFbXn`%fZ5?EHH56-6@Qr?=e*z$vcc^YQR2>9a^@f-Y1hl(q*%~38b#Mv1fqx2Hmp#T92n9b0{ z#@j}rAoNQk?28DEqLlLwzdHGmDzhP$rNdXzLVQS--(W*b&wxMaN{8pmlcqXT;FYHM zX1(y9S)wX>MrM#)wj?u#z*Z1Y`goI!&@7;yE%r%5{v9o_mNT}>GOp^j3>Q`YcgOzl zlQ-vj>T3Q}A`O>1k-6+B@1rTxCVUqgY6MNVaL8r+(ZtKM%*7K`o|&dg_?mDIa49_4GW;)!nM7=hAc%or5&=9c zfu6Uw5XlH-QiuH__Jg-1b$4Y#%>VaJjHV{~0=%<;IXoBvKp1%TOAq&NlCZ*?T1P|<*yLDD*( zKvYY!eRAR2KU$&KId>Rms=gt&a-3^qJw!#vV$JWLRg`?9ttZz<2-w>`85i42H}8Xn zmK!@9F@~YD;DN>(Q+zY|C!;=1_QVF3#uAY(6C1eBS!@IPvi8A}joHU_QoDrxTJ76i zJ+y|q38Igf$PAwW5}ew;Z=d|0W9{8zQnbg|AhZ80Aco@-rwbJOkx=!P$Mvm@OFpCb zt&f$_f-cQ9N$!Khm)v4CB{hbUQhoR5$d|`F1R@<4lq9JvpU9siz`yxWye|B`D_=}o zQtJm+0&a{`8ID4KU$i%mMgy)byA3C-LHJWB#0fc!hMdzkCH*DF^t+9Xg+a}-_b3?Xz) ziP0%jYXpv>T>dWij-%X5H4g`dOk_zAL)~Ph1esl3sY&2?VM7cIAf&J8u3+HtD$I#z@R5+&I6BFa-k1*OEK=$jn-PMu463!(v4F0uk93Q=)3)$G zz@z{V4E1?^#UXqN28w3OvnxE@p0E_MKG^AnY6{GIr_Fk&Ewb)Nr^vP}GeOZ1-?|A= z#ry*v)1Pd7$aU%nQ$)k>#aHz&Izx|W@}E7bbbz}AaVy(AERWEz1yqd;{0dek6-`DJ zi<6d0jzyVHf;d{!XZf%WCzQ>_lFy5W__0bE_<7nKF+=f|$QIGi8AHF_O=vSEYUTU6 zbMw$V(FA18hKf%lyCiI@+brYh*OVZKY=>_L&VvWoQ*O{qRp^VdF{MF{VG;y|vKZ** zGptX}@kO3a)`01FaL;eBGYRs$X8J@&KH_Z-myv&f{g@n6JFTOTJ56E^Cokev>OAWO zgp0k)$rbTistH)_kZ8@0m!fhcMj62^L^0F57F)O(a^uz=T<~-%Q!GWhtb^ zY)2QaCqb-_I+F4lMY?CAL}yH#Fo~Srj9v8C(ZFVH{armC=Yl=>jua6I`ge~4$i3)s zd3p=f!T0Ya&C60c5^~;Rwy-#d?1XvqJ=4bDaY{M$9J26M3RpT7#*A>!9tY&gpYnZ{ z+?JiK4ajvfBA52gAKqZZs$|T`yIi;Nr-@t|fqA$XpGCZ5f^+vAjM!J)WS#sU_TSzA zE!EoFeX*%#{*3o9KV5h28xX&Vx*1&$36W{=qb*Sfdnpif6s-Q$@^j$JOh@{_ma=Ky zEX;*TF7sK#aJQ~OuZRR#_LJ?=$w=8wSv9t-i=kD}A!V~uKHTs5epDGcI(MYwm-KyVJdQBp~T8TK$55xs@$7wL-MfQFXOh|Mu1DXuc|9dLf5Xa zMDUuii-kYh-y-eKZtc#GzT$(8b^8|AyTCqQk#8Mm{XByzn&+S&VTGckDE2Z#tLlH_e|!?sEKD zmWtL{B0>T>!dnNh+;^5<(*3c-(-;W3OykTuvO`C=t5+W*_V zdyj2HJ-@!A;~1bdh?aWlgPxR`a;7A1%qR~2hvKs#*poQT$Q(5fPTi9?DNGf${_9iz zs=y%TYh%3!uYgw&-b!-6jQ*Q@~Ejdh`nv zrts_c&G|s1SD~Xb<`TYzD2Xq95GQV%I%L@2LPt zA3{o%WKrSp-mapZ-aeC&=0NJa@LH2I z6?X5y2fV%w+*3_}R>lY=jeMT_A^ba^LO&|^)=K!b&-Prkb4;RbY~QDt?Ae-1Kh;{) z^p1LgYxyCH9kkAadI4340&|8ygnh2xKW7{a-Ff*tYXYT3a%+@FaN~a z+SfeBCFaGrD!oU%i8lngIY(`n;XAgU74QaY61tL3yOJ(2>*)7#4-KHcYOw{l{~kpx zkU8zhAPFAzTqW@8`09X4$f0G3j$)O~Sl3}rO zqlP3^7@^c}cj$BGX=(1fB2LnD2)pKlXsu;KoAo=_2+44_83{2+;7BAT4M_Xx2CtS& z+z%Lg-GJLIk!|{zb`kIg>FU&WX7e|U0Y&$Q8bH?AW<4sfzEA0bjB&JMpf;B8$R^3> z4S*@h)*TBP$tjIV9*sdB^c^Gi_6_&;n6}T-QP8b?p>1&~s6;uHI|kcKHf20@+hT$( zo}LJ@w(7_rbu6h(bUf?p(|KQFiV^Ighot!tprv{&jkp%?NdEz}i)ji)_JT8e+qWyH zWZu?-#|2&`PgTjHL~He4iXkCvhJgT@kj(~k@ zuF+R=E~fVlnUqpXCc3!JQ8hz>2Uklc8EA?-5hoEl(wTwW@RpLYy2lL=p{m6Szqd2y z5o`WtU<)z`(mv5wy;Op4_rQkZhsI4I10bR)2*&1|>{nix10k7hjObRo!m{-P@MlDo zs3|LF@p&^vR6zWl_GHsU{GBPnxkHyqFNv;T_cWKxpM!Bgrirgox{bfnpv?}MA3#3D zQ~5~Z>;Nh_MQF-iI?bm~Z`b1KNrXjDpBD!QROTc#l^1?c*HF2TC_z4k2= zj=hLWl?1*f;B}GGBC%DNz%+`nQ5@Ij2q!nrz1UG3l1oHj6vMl@Ywoe`;4yj4G*`Co zaYK%4!?`Rn_Hd$c?@{@HnxM(W*Be6;^cJJlkKxq8F#YvaTklyt@e} z>QWY$jYp)}j1{OKBwe~d4z?5VX;5C4g;}-7uqQXGvb*x26X*@*eLS1Zp3xdBrZvy5 ziB~n8{A@w+jDxz16)~bqq{l*Kqs_VZmpQ5o$$`YguJM4qF?-%7n`z^CPj-BfoFaPH zNHOzvM&jMEhHEYTB0I-J2gk#+^KG?=+C68fGK(cP)43?IaBVL;7wHD$PA@lICbqQ> zajG&-QJ0A7@eeB!cb?5nlxsIKG3VsPvkD@S#ayDQY3mPyJ24PK;FlTWy~z3d9d-!5 z?VID{bX@KF5-NQ0>}QTcrcTI%-?L5Q{Od6i&+QN7Cw>fD^DkA3wc?yhSP^1-5*!`; zv+ICWEb_M3SG0FD3+osH622A+77~S1VW}@+uIO+tr^;%P@I~gj$^B(AXh`G7aPu{t zjoL+W^3X(5^eCJyaTKS9`4d?ygF{v{apDs7bL9P6;}C#o0}LY8)UIMZJQ@z#+3eQ0iU!vC?bUP7adBW+j5EIA7vO06t&6wlx&PAJP`zRoVK#~&$ zL6M|P!+VgnxcTy%Yh(k8Z_PER31+BaXu@*r79X|H(|1(=>pS`V+vp(oY{VjFk^xN6Gv)#PiOHtRuzTomXB} zEAHwHqA?i5ztXQ-g0QB>BMYCCO-p!@9>%NLLu}-Oy{K5BFZOm4H}yW)tmFZ0EeC5eoxDj(5OXsWRSiIzO_aA{%1?hx2o4b0 zbJTF*6YHulM#c<@g_i=5*+sK=up&$1?iSCDS)72vC9k{$iJQjXO+kv&r} z4i|SgFv8D5?!I;5fPL_C~89&T2_2Hh`GMJ0wiXkcUN*L|iMWH}}j*41 z6zdYJM6}D9SZU*}%9Y@F`oR|JgjR5#q9|HVtDDcJ=SA1qmKULa;apj_p8Z$HD%Qvs zqn{Hgx&@*s`g`)=wk6eVIF)bC?dC+u>;pKl2?k()%b@Zt{Zq@`N?-K`Z_x&#NZ%+U zC?4ol>=v>A+I#idTjzg(E_AlO$^?P0OjLZ}`uRQqZ6{RKYSq+g<`;LK>o~x5Oj8O|y4uC37sDNB3gEYSr7{WE$3A|Jf)8w3j(He=#AP zU=*(4zg@2|)bD=bh*v};&-#HnHUpV=M&c6+)s6BU_kpgd{y0M{ z>=hGDm$rGX7DIx{VI}RU_|HD`Gp^X!X4w@T4I;05|F-UApyrT(CPQa1Hnx5>!#5v= z>1L(HIFZ(Qmor%^w7wJ81+2fyyACX&InMtF`5TFEng)4KO$H$mXHVO1JISA9z-!9V zmpYuBefss0S{=YXATrvyy}4slWYrkLWBYcJFL6~6lHlij682tg5O=85j7O@kpLw?; zUWuzP?(rn^`|wwqXnf_Qt!4(7t0qc^%A`kDu8f7Gvx#D4K(#+xT2<5J;_CkK-lpu; zdFfaEO^w(AIS{7Mn@7_?P%&g!%Tf-+MJ)nk?wUJ<=IY%LZOrAPxxX;n zzURPzcj)XLVRjC|wUi^W88%SV%2U)T2@+*Sze)^=j|1M`9k?X}f6JuvIAWoA*!ok6 zVJ4(EdyX(OGRl~Bhv0K1_dC)?69>p`LDg2tUdx$G46 zF`{(wW5m~UAz$<`z8Swq-mx!ekOw^e5xwv!RQx;3kqi`a?M+z~zYaholQv$+Wu#}8 zXlL&@h0Lp|kbaNhks1@lUukBsHk#%BnIh&DcDPYCFcPCgROrz93(cufkE-8#;Ya1l zL0wWEq7Fg&Fk^Q~15WF;VYMB^M1*>VkL?}md^)Y9F8D`}jkHKOiF&rF@LLb(gYQ9* z2>hR*KbE`mH~=6kOAPkUUxF3R^Jh-ULnUw2vhx zIfti7pG2aP10oc#gzx~cI~B-?>2Ae{#qwUGoy&(s4S_|CPDj|tXF?CIkJ9hWrp9Yl zZW7E(5s^EEx*WBcQ4cM=XFG1*L?(b6Pm_Sfh$W(IO%V^Lezg}1*&&rKYnIRq1HyCz z!m_1)b@`oh22|TxoSUx%H!(sPL?~fnlJ2~ec*Hyc%Q7;jqmuA=dL&zp>W@lyfqTUw ztfixoG{bu#+!2(7@0+_uoCSvMkm9cK#Uv#J-IbV{Bt^6j*rin~8%ai<9!vuRfPKBu zMn-oN%;KB`(T@sJg6r{{$ZZ@1gX)b;(`av{?8dLm6jm$|gkM?^E{)zE*&=fYho<9p zW&aKRt>^guq*9EFe~4ar;DAfvf+ppr;3&syOsoi>g9GI#;mNRUF15e7V`Jz1tk2}6 z(H%3-%k3EAd|$6Jk419*{q>44BH76TzPHMK@7Lck%-xOe@Li^#3D52%3R(-b%6{2$ zib45OId%U&e+#qCOILguPiTmLI*GhSHKYQXBJM3qB$G!sz~%t~$@Q4Q?%ZU%ab&x7 z)fom`t*n+_@t$K)b^2d}RGNeET(M)IoyZg$^^yX7V_i z6bAeuvxLAzp%lGO$_Ztc2BUwoASgh3`@mhT)WapI%tltCt0B~Fh8i}BVQl7>h!h#2Z!-v(I zW(d2GT59e#?~^LWpb|1EYv^W~sX7|RTp#-|QwcRLh_jHaHX>!-LZn@JwNcsKa8j~Y zb)yUSS{jh!={=8PT;|5Iln93hf`F(9XveRn!63q4g`jQ|%3=Bt<}X^o z%!mcn^TQV^=qkbMX`R0bG+3Equ;0lNiujCC>6(>AF(4-)rj8MjUO{>rnw=W|gQBrn zSo+3wlIr6b6W+hj%ZjwsM%(8%n0*a0QlxdVL!)ooBL4_?bohJkQSpHm9L%#~*mJn> zMVrOlS_=q!8)(Wpp1-W-a^9YEh~s8uIvKvK=9`ypLq(dSZ*qV$2pI+PHVf6w48cp0 z>hj{Woj^E1TWwgJ$glwT7Ycm0`6+a!-UF#~#Tt9yOJPI?9DudfmgFAQWWsdu@(s$w zf_U_PA=Zgf9G(V(E}gi|>Jb~B&^Kswp5Jg>GUc=5s8C7?WKD(dtEh4cfBiX_f_zc_ zV*7`HaJq?NM631&v00x~LC?)TNAmG8*GNY9^oDB9eLCT-TlQw_j0k}R$=q2U!mJ$$ zq#ZbeLRj!~gSbZ#V%1>+m=c{PT= zCOU3?g4g0g$xU0*asGYDh9tnnJK^x|LvrREtAc$4 z*g(~Zt)llID99rTO|SbCg{oA%7hiHR>UN&a<~aTA!>2G4?4JC$O>ov_cuEFoGhco{ zAO#qxCMrk=48-BqfUEcansi2~wqSMFgR{%&qpNr{pVYy?w??KeLj4?5e|*4>|E%|J z>|{3N?aV#rY!bfGQH^+;RMi}8o!q9KEK1cWdj~H<%}Fek6OdlSDEnsoz_(AJ%DA?{ z>RCY+E4~R<##|V!>eYW zDtt8RU!R0u$*Q$BFFCiU&y+#E+C{DA;XF`;(qK>P+hPpTo$74vWV|nA?QMzph_|;{ zEU8lMf5cY?k?YJclaXb4Diwex9Wr?g#nU{8ca|7}Es=S;LtFnNU4ko}qh*Dh3uKa} zL7(Q#)EXPvr0vQ>Ktin05k2+5d2}*$K2<^=SG@Q&8r?}H-&Z_wj3naU7X8RFbM7W{ zZq4o-@=!%)-boyh!j66~DqeY(jQHiRd2+c`Bet;&#V_fKUjnab9)fR7sY-Tucn|0l zIfkaGq_mm8Dz5w8`gsQl^|F5MV+~~TMud;%Rv49tP0NPiNT8Cie-X{tF_|NdH~R|2 z;F)M1PQ-E(U2j42xu-pj*2-fEJ3zW^+Tjl)cx2Y>JI}Gm{k0N&j@>`KxI2>VcU6c0 zhc&U|%c#HH=TAmK**og{6AAs6Rz9-uz#=~H5z|`%H1UsxKljC=`Vr?E&}^*W{Cgtb5Vb^XF@NNwoA(P&w2<$T+N)! z@!f*_?e>dmBcB89enN0LaUhRUpkt`XNXCDITd;Q49x^9yP$+e$L@L4! z6#6!Sdeoq}JerQ+{82>`X+_Ow2&Gs`ff^r|qG34ZEOQQXfXjX?kYB0ghV8{6R9;oe zOu&n%koDJ)sgrC!JTDKZ$mG`@16|1!`I+8^(H~VEsO@#j`W%^@-7w^eigt6}lY0 z1y$t%q1@!p9DJn+#P6}Ls7Z`_ZA^O{nj?)zm2bJ#s^QS{uF)487;{N>_)|U{Uy|7js^QhE>1C;zi8Lu;TN97iKf%VK z@Dp(Nk~ykqM5+(TucG6%3A!p6*u^c!Lh%2A#Z?tqdOxxu!;MEw-f|J7*4N zsfkcX2nMTuH`vmy!Pyo8z|ew>ytmOVd>tOtcj2~A25VoZj^DXG8Ec_Ngpjm)Bhvbe z1X*a$U{jSbJ87kVHkHK|8x~QuwgysyF?6tlqk|o^WLQ|sfF!$K9JHve`{!|WH5a6N z12kn}2EcbZ05(D3s$HJyHv{QOOpz}(%=B9SND^I^RZMPe6qdJ2ybDaimE(z4e9pK! zw<;@~QP}4#aR7O7A6dZltNeP{yXMZVlxoZw=HV;DGm$b4Whz`oGwvVeCbG3H9zJ3G zo4(3^ihD)X-9pSK*J1`ln;))WQ_(8=E!A>$W0G9l)*p@U*rd~AzjNTh#dk&%;+?Rv zAwgT;Fg5WbPdeyK>e@B3|JwQb)_u%WjS#q{ssBLhI!9vj=Psv_+&8ZpMFz?)P{(vR z79-s~!w9}ks@iELcEF!8WU{700W)=@>SVE-#`*gJ%x_Bkog~WrR6d<<6M0GR)7Gfs z@G}F8C&{hVYZ*0EIGYd#R#@KB#XrZNtrh2wUk*KoS+vsr7z(`Q~~kCmy+!IlUP1}MQV%@KKU3Ly)#3zg1Dp_Z>ZvK zowv5DG_Cq`savvne@HV0W~x{e8SVSvRJY|=w?$-kp*}M5760{DNQ|FXzTZD-qbVQJ zYK}G1s&zRjJ+n(LA}fp@c){>sb|Nf;rg%b^KifYZExItCa82&Qm4zui`x@@2L)@U8 z9JmD2;beS5)PBOWlk7gRW1Cbh6ew(9sLRH`S%<)W2cgb{Fy5e$PeEi+Lw^X#FPC+8 zkl8uqaYVwIB3$frC=Z614~DjgjyUalsW3}Fct|98h&?e4dGG#yvTq)0=#WUK-}uQ< zL!ewG*|3EN8KkRhlIDKlQYz$MP3nj@7o)er-o2yB3Hn;lvsXsQZ^Y9~4n}+zUbj}$ z6`fvKw14P52lpZd@)ngPQiu4&4RFOiBVl`PKUZ(ZJCmB8*|=)~RH+lHiD%1hf0a)0 z%8!qPh21i0WZTP%z`AH5!|hU)4$$QO55cGlEr1%Z1Crg zk&7bdm2VER)uYpV^yDDFh4IX^@fOCrBnYD(A%Y6)M;KRfwfOk`q!EGg=}~#b2apNX z8Y~^MmYQr-ZD;Fsd{yJ^uP5FYiA+O0s_PeH@(f=%ezvEMeIZH53GbjP-fWg(meFzD za<3l=Z>&sJ}U)CIbsxqnucqU$KeZqhq3xQC)mG6O~8H8y5wKxccSRuJ=& z%r8{2*QDYAjw+biCZR%)GUb&EA2Wj~jc6(S5k$7CyYQ~8)v%MB5Kz%f1S&$)nTX`* zSsnd5nDy#uLpa&Ekpi^!2Za&9Dt9*b@A(l4XNH#%?>)5A4zRlmZb_!({1KKfZ)T|> zI7pl`?$xTr_7rX)V4z3$jEv@Wb#Wl|j;;wZpfAZ@5ljjsX9sI=fFPm1@5~xm&vE8Q z%Q;(TP|%i9i~p>xfb&>LfxgJFV*vkRMMYxNGvDkOld$9H4&^XJ2*$?q=@|XwVJM^W`4pIhFC5k$e*DMJH%G`(wS!7+(cL;C9}*}(4MLc zHN|~!3vm{hJ2m`hVLdt&@+dG~ zYEuRT+je{uRC<_^-HCNZ)vedsFLme!{$&ISi>`yq0zD}a_>V@QEO~R0AI(Ojf&*>; z#!r|5Dxf2yQ_)>h1C}xE$lV?SY|!X}IIn{=)9K-)pm=|gMG+J``m*7w%Ex;7c#Sj*c*=%F5l-$o6i=2DXcU6{kX0d?y4n%JhtU>-61b?UJCo$S! zcAm6X4gL80)c@Rq?bIqo;F*`q+=<+k7mc;%O^(C`Qq#-0ra$e&1F*qAwpWWSBw-_M zF2(-Ic~fUZ5=trs*XLN&99b!Ee=~ZK&mExj3lCPIUx#yGe3Z7$ME({n8u{ySj>WPs zO9Y#~a6wFDELAl{L`5<59rI;PyL{lWL==N7(u(@EoIh0W_orON?b0<+(CAOrY@)Yv z*~X;8g_EUEQ!9WgoQw=ZDrc{;g|39q@{hO87;(~|oRl@aQ=vLGgBREXWvgv+8ef9) zht$+KH*P+B0)5EN5Nhd)!CQb2Q{`Bjy=An15~pq+Mq5J!s)8+706pS{{KF+NGh{*M z>4oUPuRidhVXUC9elym5Y(L@+t!Huz#DCJRpgK^OwC{ydvD6QY>4mig#?)|cQGpy7 z+oYf}H>sS-Fw>#jG!x><0J=Bnd58jD#*z0}GY9yfVTHz;8q)zcqLqQu>P_%FAdw-{ zz?%Y8;xt?H&s|6VMjPrN+edj(5lFDd&jhl`#1N-1z94eQZkkyGjf7Y-KTi6zBvrLJ zFk=v(u@}Bi0Rc#ctm}^gH(fcBk@?X1nkCvz@|o;<7L4`%TB|?lH7hFHg4Ad0H4`(& zX8y6gDh^r}Q`$k_@7tJSNj7t}ld7K3p$Y+9S(64r*F`mgcr;o`beuv0I;tIkwy4RN zjLEm5`*CwGZ_XMa4WH#WL!;lzWdMw0yS+$f<;kWvqLCI^OW2al=;z8r#qHn4%$Vn9 zt-ZUuBU1?^!bPi`s14sah0F7b1#*@m2De5{l%*Q~K`XGX%J>!JfLa};|9);PaTo_#GOvbJ1KY{;V}eavwuM)=LufJKorai)#o}o27~0C@1&6ClFX` zwny-tJ3$y(eokeXJ9ZKqvt3SBo@akUMcB(1>*bnF4KC)ey17<62F|R+=mQ<$OrI3} zkFhdJ@-{!*uVQ41A^AdJ3U|p1%KWELi7~5!zjtsGi_YEEI#~q~_D)iW+*Z$$4EhFv zaD%7m)(b)0Z_6%QNf?7*zuQTfIzk%rN|8UWDt_1ZGpj3@Zl#}9#;5B2>(j1YFFfm) zvG3)fBp>gn39V@e8{-Mp;t6Y8(K3i%QP1muroS$5siXpwz@>!jMic$@ZNcSRCz`qaN92EP2}hm5&7?-^1xM!wDZm4F0jG<<5Dv6=AUN_8AMJIKQ>hCV(`w3JPhphz`cz^Iyg7#xHt)`D;^uacFI`*z#!krd?|NGU1TVlZL zEbq(MMH!m|CYl3b)`6ko7b7soN5#uh=@a0Btdtcr_SmG zRD+NvTkTR+)}+3sU?<{?ObVBnedwKNIFVESd6(5jXTYfVs&rQcprbtE#{yW%gC2tO z)$@a9r+KKq=}S$;BS({do>^^KF|WF+-g9cB0KHMrIRzMx#)h3SueY#=;L0eDzU-fj z6m_xEwaU>vvC-cE-7jUk$%HCbgL_K?hs+yQ;&l z6t8sOHmi#Y90AQ{8TLRud$vtxFF<#(ULR$)t6V_2lE&NGiYFCPCSh4Da~p zk|0QQitfQJUTHp0(NT&BYjsRMT-Twy0GMEn_&EdlAcg~+D@*y2Vv*$$Kcf^~WEj}_7U#)P>JAz!8ij08Eyv|Yc|%fPgcX|hYfpNi4%U9A zIz>I7w8&%bk-Liv?8gsA?oW54%|StZKY#ZTf>HaH9pi5IjISXZ!vq4J&hZ&2f-&^I z=iB4OF?Fvqr=n}M@}bxh$82@)uclJ?3`;KjOfuQG2Vz!BoQ5VTR{8l*X3FCxFqh1m zmztc7O48~&9%{d-GvlD9sS?DqO%Lxm*WmekaBL>XSl(n9+gq|b8y|`85PAR5NyenA zlm@7`nfQ}hP>83t=;Af1ybf6}{Q3ER06am%zD{ggXuOeTEDZp5h0z|mo!NEF$-lH@ zgjccyng~Z{K@XKk%Y}}KD>hdDmk6A5s&)vcJgaDnBW<+9Q4S3-l)SCw4Gqfxtm?$1 z13)TpCzbI+Di~H@07$LizyaX1&uh-dWa!R>I__X%JmZvylwwediNwKOG=P(Y_F2}& zT8Zdf-I1zE0$Z{VsNyoo8eEY#AbZRMWbvwK{K8wuwMBj+oMw71L_ekprMW9NiE`nsTG@l?Yc5tNxd1Pf=X%szG;D z!`XT;-Hwp$&L)mnvG%^ve#{5WRc2%FMIr-BQi~P@Mz}MPYp%*jR|k-LX8u^wO;!7HVyv#l`B3vz`$`uuWa(O}^x2OZm2r(s3-6QlFk!3m) ztlClBj7+kw>&pN4|J(oPfBShS%$bl;kF#6v?;??ji+d59cbAt%)1v3P`dTKEdGw7T zLcekNWgBgp+s8s`F0G`{LR9Z(W#wj|BO=?FrX`0Uoa%Bi+Wcxo-?3n2TS$oKsu-32 zk5!kzzO=x8<|p`rv}B}K$8jekG|SMV>*ijvU>_H4Uqm~D4H5ilqAmH32cDzwCH+B?e2Tt|eLa?x$m zoeK(;lYUkZeD=f+%Cu%a&!RDzV%B^X-}l*jKdA%VniT&w+Mhe6@J7P%rwU-EMO++x zIEu(GbILFCE^k!QC&JGUMe2J#dzu1DLz_;mh;1Gk!F=+Z>ZRl>pMB~2^|RpjuXnat zEvSD>@n26S+K@(wPkMKJZ%EO89Iun#CQ~H(i({R3VzRoxP2Vv!UZ3u+Y*|k7cGm2&-32eLg+Qc`5`w^u8B5fGzNJgL1 z2tI4x%pP!!o(f%*ye?JOa!p2v#g{cgjJeTg-9L4^Ohw94hzN_vN4)-tMRD3l4O?v` zBg9Z-UiFjnUQzqvFg>sV9vH+Uw_aK@IwvjKg(Cq81j#{uyQ?rQ1IEz#B1GUjffPql zUI8nEu|ecaeB83MC84d6iJ$^NQB1Az zMktqh=FM?){gXsvp?1cwjM0$@g!Dp%Zy=~Us9us)8wo?}NOTaL19MiXIru_AXY%V< zbsFu0BtgthM4L`yF>MAoqf-^dZ9w{Y#FtD0r&)W{&7+m=AQ)Hah5eqL}UjCLsGq9YgJ+>YTtAG|W4{l0irU9ugU zv}Z61J`4-=?yW0kK4Yy0uhf?KxS7FCeB82DD3}TxK8OhhqVqF?DH%Tl2tO?tMKZ!2 zSm1`dae#9lHjpHYcIYjFvl*W}aQ#Fiwm-py<8yd-+%J4G4QQxP(=Fy{qTQi}7HK1* zt(m=gjt?c~Gg8HsO@yYC@y?!;fqqYNH{#})=jQnR)R7li$UY5P4Fa7-278)}UKSo- zEKpv}bg;tMBv^kIc%+t+ zn@oz87*=_R2~|*Vo#&aLZ2Lv)(|$8#D=QFRoseSuE* zw#UURK>$+*&&6M33IE?B2^?>6Y59O612!?-)>ZbFUpiL`AcY)Rf_9_b$i~R+)&Uwk zXq}u9#$sMP-=&X_@AC7%mmsVVUQeg6GSQ*6P}%sZOT9v@2Q@vQ*hyzlGXa$K>O+Fl z9c>VJ_-a+bOOv|Ok-o|Y-76WPCRpa()<)B3Xgx8U0iJprJ_6Z*F8rIi|@EWg8`wz}t z|1Z+@aqDsLxs(y>Zqn-YB}U~_W@;vCVA#wxNT~!SD>J zLy->e{_^h)<%b&~)V*Ucn?baRvt3c6`g><(+(7nIEQC5grr!V}Aq5BjJf5A#$(kS# zugWOb1tS-gU>vmB&O!U{psikLXFJtg0Tq>7OGcXp8xg{umJRi{TkCJ+7+HG;*zf40 z$HVz6_$hqcu@Njs2|FJ5JL+_J*aaoF*lZDD3$e}u&j@QSW&(+j#93#NWTaZ*7|G}m z944$6$Q>K#WD|g}(rHN$0KbfsmWqta*=itfbAeWICCeFn$^R;qRTcn7f>Z;52nC2r zquS8N=R~zC9(Q<;We%c1B9jjBHEZ4S9DK|NDPg^4GP03$r2Wr68ox&Zt0d!e?6B@= zq5{IPL)Nm5W5pCLp%B_;IJ`^K5BbnR!h9{pvKPw}%%ct4p zEVMJRdw5q>N;@I+`$nx_tBvjK0hD+YaB;4&PlN|Cb!KctuTKi%?FW?IOW)Xfei&4iTkA@$Kjj$LODyu^MoMDn z=MMi~Y49$csoHe*h)lPxrdwC^IZMfJDOSn$H#+(Dv&Os5s6n)U4ELY>Ci@?tUF8xk z5D~0r&~Jsu(2Tv6^S?3sOyt&1{t}L3^QYrDR^f|4w7>F8#Mz5^M^Df1vy~*Zy ziOGiy2r>DP0ja6_)rah3|4H}UCimPT_uL|F^v6kzz74mW#BMo>Q98^>F_@Rxg**HS z&yov34GAMBBXkgO#FSN5gR;TmuVzeFqEVblF8>>e1$6I9eB6|H7$q5P%Ho!)yLeDP zN0j%az200*Hvk~=ypoe+^CbH0lVt~Nv^}R(`f*ef)2fMS71=NL(p--Ru@x|`qCHo1 zX2Q%1X#dU3ye2i*`G|A*9BJn1q9r5PA4G`J8;c0vR2Ek^Yt(O4-Fy3M*;}n^-5(?K zFZ?=p7);oaCw-qf+okQ~?Ly*R^mGIYM!G>Vp~afWh`g&ZV3#Fxqd5EaGiPa>DNusw zdHy4goX7g!`EI`zA`IyD3C)$n$I#)gF}M?aqK_6?X${;i1TAkMRXYftf{IA}CDx(o zM6@X)xTrbDH2u*dOqM0g$i`%_mu@g%k*hCkS35ta(z4@>*+getinZLy(Gnrqs3KKY z31d07oZ#wKG4JL@7x&JV`z6*%7z5fA6I?bIiGs_Q+Be)wqOq!=u?pfgL7v3}{=ygr zAg)Ucb3}>-NBrjP-sYRVn>YY;4GCbsQ&?!?Ra~O9sbvchUdR}c_}LX#{e7}&zwmo6 zMHJ31MoQ3>k&F=I8xOy6_xh^4`RS>gi^<+pS5HQWO=yr1Ar`l+5n_?dY`inE0YiEY zf~%BRpJ->8U4Kzxod_}ZArK)3uL=N66cvpo0nQ{UcOC!~tX^Kl_ip~Y=Ff}LrjcUP z|2Ns(re54f&&g`3!()fI5Ci68^sDL+C?-NI`c#Y*t1}sGduyl1WxJbXX@s52bCzK- zh11iM(Yf2B4t{EHL@pV1$ijy>2Z=pKs3I-czZ2p6G8KJ)|6H*DJe>u3422vCIS__r zZ>(}N2f}aGv>9mvRKLAi9bVNA4|>IkrBYvF90-XJ<3LD+*oDA_gK^ka+H^%gAu-isA-QD)3X}**>Wzk|KtDPE;BWV--T@*03ZTnq{E1C+L~*R?=Qbd%f-DcGarfi}J{9&>zp}ywe-)P3UeCcLPLz zFcUO6A2&H4Urpmb5juaN{5dTCbddvVwAI*L-Quk4_0k1<`I?T&glO}E4+ndqtvl~; zcHjP_w*#Fw*g#+uxBLPT6aZ%eHog#p8Y(^rZ1fg4_82$Zv=FHNxP1 z;IE2atqPK7v`jYKRB402`}|5OiUxrz>5fwQ9v@vA#xxPaDu5 zD%KzBWRJvE9b3eIlcJ-%9FfX~8jZlY&QC@3B)tGY?im!40y@_lLIRLMjgZkvD)8To z6zek?DOUV{h5y&VydjciY;~V#O585k`Nb$WSBj`*< zEUw0%Jy+wu4Ne-80;epLPgVe6pOQvU9R>C~+STx&Ty9q?_gS`k)s8y=9c=)JL<60X z_<5@*Bg8HQqRSP3mHb^x74r^zQ|XfkY|MrpnE*Jn6B-~ykjIttnT0iOHp3ZVSIXD6 zA+-kFEdY=vC@1w~bT<1|2!0H(T=#d`|FSyW%8Cq&?dN6aYt20N&z0GoKp-AbrALo10QwY9BnVi{@~x)wIT1P(*uFs&Zyq5jeDS4h=3VYzQG>6Mlnxqc z2=c{~{U0bAcj6-sC;WT>5Mh5Pkz!HfFSdy;i-W;b&8vXVAb>B82*9RT*PR5csa2Da z7|PMULWJ0jG~kj)FupqpOz$Vp&#^m)wau>^|a0#Z!j z8L~mU$**H7G|0z#^pfLb#LV{pj!Qabwu#LHA2)7~v;8L6<_ZbyYzn*)&Z>IlZc~LG zlFxjJao<3+so^K9EV0s&;12onxF;^$8oYw8=X#o85>lyX1hHZ!BdkUm)IW*Ty;jwK zMVq5Acrx1bX^J%*k*bMb7@Cd22mmHML~fBr3Rxt@f5#gOL?k|5fK7K%dEtT_gyv>y zbJKOQdNNY~6j`s__{z_u%i-i};Tx(&%|z9??=07^rWg@k%K7l_+zX@oEhi&1W^gl1 zgrOpK!*y}*I~O;<0C5;7g2cav?3&i~y+fb<#b1;)Rip1zPf(_-Q|3<1ZX0^$EHH0J zzQ~s7nJ542jLK_T7tbNYsr-xVFLeyM7EW_KA*}mmG_y;iu+uE7Z#|Q;j9l}hYcLd{ z*(>w^_tsNq;J@Ff2~ZUpR_5W8XWJl!fnlG!qUqrp;9wXbxy9M$_G~k6jsK%@Cdrbd zq5FKtak-NKN(!7hsUE>9Ua&rhkPB`27DRX{mGSCptUz*=2r)`45q(w3c&%}CDEHw3 zMaB!dc${{au!|7N7dLAa7Xo@FQAVX~J(cJ+B+C`b3yK!#XVaI)MU9FqTpd50MzUCKE#dn{}{A3=!?0hFrgqs3gP6eV9?R(?Z#4A#7Q0Y+wfd z8s<`7_#iriT-f1W*xp{)+g@lcyUev#vD?&`uVqZDxXz3 zr>mw$h>^RM&E3kZ^BEx)C(lR~(%g~}z6*23MBBeIy@)2Llj7EJzL?+v*z_c!B?%^! zu2Onexga-=X;~!&x}s;Z)AIX6?D7QQj=t}{mj?f<*!kjWU)884?&o<)v%&0P>Pa}`rSk`V}M zgGe%OkAJ1BV&6L~{9pY0FAMX`g?Z+}Ty?Rfy4W`kn;Dwq;GtNt;`V5Mdo=G(=s!Aq z-3k5fgnoBI|LJ<~O;>y@%<)%g-$=1hrmd;Jt(^2GXb3=vMf$Zv0*J(W8*Qpg6pBj4clc7n>+AdeRmBlMB)ymfb|uxj#^9xj)3RrSWOI1YpK&|9D)_@J$aa16S@_7qOaRJ}5 z^XagNq+T2?qCHUS3Q2sTv!)u)2J`!I9si4T7AbKZM`Phhof4?R+f?CgtnhXgc)Lii zU7S}&LYx*-oB8d~7zEA`ddBUb@&^EamDwF45l&`HMxU}3EA&fm3fmlXviWB;4H26F zXVFr{s*76Db>maH&TUvT`$>>CnJeV8XWWB9(Dt+VzmJdEeiGbst`P9#7i`Wbzc$zi zAujstBsuoN67h$pYvmXJdpeg;R9Rroj5g5&qV9qWI>CkjTw6&XlB5eds*Dtp5~8bm zC^o8ML^@{By#PY2KR_u$ZGd(u~%; z7CR^m@zIbK-LgigBe8NqBr05ttl1;5Vn+Cl(vFw2J>)fWGQt=iWJ9A(CFDi1W6dIG zK8b0H2up~LGy)MO2>FO)_aU8;DMwKbXm>Eh!*VbHMkq2sC%$l~c%3|>0DdXBH~_mt zQGO%=MB--}Ar?Q=2r>T57+$FDP+1Y%k=vo0u}-4*4-dQX7ykk@nM<^pxsnlL6~=i)h++Sm<<|Rk0i(cXr6z%p z>7mAv|Bg2nh)8_AKtv+Z5lfsejH1El&M=2w(7RvUm_k-J9?zf^XEcUWpiOfx*yN#q za)NR_?@x4UZ_uporoWKM0AOU6B!CDtGJ1^LXD}+<;{t3t7Esd^8|5(R$?TVekHQc; zoCtaJX#R-DQwHT$*@^7<4CXns=B7}i06wfz(VU5o!^pgo0FK;17a|dkT;!%pRW8J7 zVbduGbMzJ%Cp}L#9xxJQb|?Jk)3+i3A5;pj|=ioN*+9@IBEmD5l$xroqsi{xy+0))>6g>uY4pWQ5q@ z!X8Mm3KeOQOwBVXCYp2?*18MX%XJyrcXk@d(sF4+S|=22=DCT8$RXAJayX;E^vkDS zi%TyS2jPxEgc#j1h!A7D%-~3R6<%-vn@a7>p5uaIAyHt{<{8_jri&~$U1dawT?m{D zjfGv>fEHYL^p{I7Pn5uHM0*Eb>B1w91%b{%FFPFdYg1jY_ho1_Va03$a86bV8A zU}yBpoCv@M&Gg3lnQP_9QC~F~AuW%J?oj=9b({*LP5a-$Yq#V4qgi7lqa9kdOkL+D zDq1t!w>=DCtI`nd0Ud@(7wRWQMmv#W(VIi07}RiXr_r<1==S?qO*t$g+%8h}xfL^| zgp88T^mj0Nfp8PD&P4>VrFD8!jdoa?FYJwoaAlDGbXg_S`Df3b-`Z~$)Wnet&)3;T z|I)8LqB_}~lli4{^0M3KWw+0-HJss`95b~iYR}W2rZG!{hF(#Ntf*66(1E?Eh;_!N zb1x%BKbWE)Owli;=$BITPd?s#1KriLZl1+*f8it7nO|dE>Z*IOi`TIfscLAzQ;Blk z(bm3}7G}%BO~E+5W-<~qjmw>i^;VA&0Umv#&@VbIT>WGm(< zKY2nSSsM}=c;7T7`Ol}~D$R#W^-F*FQz*EP>RZIc^~aF7$gFml*+B##?x>a>4Zox z5h0_`8HxzsgtR~$`|s!;{;bRRt2+I#Qm@f>)b7PtGeV5TMpFN zw4iJmop)22i0w;_?Mvqds7Fu!m;THDWI&u65a(9|;_Jw6Q|QN^S(mwMlYcuzLgZN* zM4C&uiSjsROoMRN2%a*~Nn$ClWiCQuqlcdnJ1#%t&m{^ z4kKek`w?e0+T99Ow0xd$gvG-dz$da+kO~;cVU3}`APxY42*m-26r)@F7gOhF)9W(@ zYj0Dnqcn!TDbZQEHN}X|RLWmugdf$x0lJ=*Al(m*9xgVm<$t_>w5;2Yi&Njd0D< zW1Q&R0n2y#p;`XYfBOklGO|}g*?0f&Y&g7z`)umFtdenACF8P6#$}ZZvc+W9%oJ-? zinS^YTa|{bO4Qb8Ux|lv0i*tZuTKOiGDl-0#Nz#p5W`j^cWzCCyj5~C+BD5sY)K+7 z=`-6HUVj4k#x!doGWCsfXGU{Z?7VYLMmvUNl}7PG0PJ}XmCqwG{w!u>+atE7;v~^_XVFWKQHH+Ggajm~f$FKDK2w7yw%gM{ z_lluEJUa^y7RMejLLy8*%)Dfig_=`|&8fuc9`^Z-L?6xFZ+t8k4MmY#kz3qt(#+4j z(~k+qFaLuS{aRrJdd}mKCnbo+T^7(-KeGZiIdx>1hb$BkVo{i2cX%Bv>HtK0AZFs{ z@35kXi@9l841l-eYqFp?Sz#P5+z(goyG=g2XZxW0mn5M1KX@`kXc6UgRGrXL;?U^C zB2^ZZb0A4C+&vlL7qI_>2zBS-M&tpxl>xI?0h|_a-vF?`Ag$_=kBhBfpUDVE9NR-) z^#kRwV5<7nG#Q%)dWX)Pl7Of`BUu!j)8`q9mkvI{Y4~Z5F$xBM4pNWG4}KmZCL+Sn0$Bii7&SK8)4PX7?EOYCL_egJO6FG zH$`qmZk*SN8;a0-(;@TaCB(rdd(gfe>wK&J?T96eeIgv{%3^0tF(D zv4F`&&1|Eld{K42=!u0KJrQE#o&Pr8n=lV37+Do0Fz4u(&-U0TPbqK$|MPp^!#|-VDx6GfTb6+KyOIacKXVR#TvjL5^UHr8ttPQuU1W|eGRH7b)Fhz(hpGMt z%E589+THkixi)vXHaDJX^mvJ>9{m)gpNjNTl4ecXyWg*s(#XZm@92z)gi5Sj+{caf zRtgddY^w8J6eVM&DvJ}GwPB9^Zb-xu?MJrS2s^mr@|ldV9?EE-A=)(AppQoA0`a!F zb=OSYHIsMEWo6mR%Ccd?5tRp`J+Q92&p=5;Qd=EKKzY*ElaUA@wYYp%)Z^aN;@(jH zqz?}fQU_uBY=mD(5@xmH_+Zp#fWx!mxG*Ilh8AdRIjCPYgO@~zI_*$Pq`(h zn@m43`-J;usjp;F-2iqM`Aq;919CW(`w6-(F8eQn^3xQ%Z7xtuo-v1o!g2zP^pXS^ zStAMHdoo0XZyGTpeAfY;z+AoWhKYaxnE0`YHp1l%Uf|RociQck=nUrG3s3Kv6+2_h zeRu)C@`tCR1KZ-@(}jmK(Uu_>uZspvpfN+&a4j7UkEK9kWIz0dk4R@6ir*%Bxb1=x?0 zwWOspB)_u_4KDNyUHDlSO7{GV(i(+B#+2Cs03w=bJ+w^^cZzYNaoKJ03zh?4yZqYQ zuf6%&f+Z{wUMs=t@cJlr$WAJZ?36+&mamr6ScqFQb&ilm;8D|P;7nXSFTg%$-8+&QFM4gaC zyqSN}{l@H_?zRR);>ttBailhlBSiSR(ksZ{KeVG?{YPI{m@YSMUduHmmze$+RG2=Y zkeg^YOf;O30-{~={jrP9=e`EOnjC9kfLI+ff5~)aITU+=h%{ua0V47-m?l1MwmzLX z5&)Fb9%kGC&a^nuf=T`u(UhP10*O%&ABt1V?e8}Dcpi+1G-;)tqL1@QD zq^x37QZbUq6R$MF>5pIfeByar`U;EFBR`Qyv1kps=y%XIXp zPyqOu%pjo4tKuT7?}?9R9n(>)HNuHxTV-XwM(G;M7OCl&CCv6k8TAyDr=9PufCw?Rs1PZ3k7R@xQ*K0OJ7~2cqVszhGs16U?4~<9(HhAJF{Vi;)1>!&xnjof~lE2ftdEL`p9rI-w zg@0-{KT8=mw-sf(2^sB-JjX?M#n;%~k`ZDYm58>;{jV(lOO50J8zV2iMEu><1~B;z z3UWjjI}I7D3ROjhzUGvq@+EDGOWG8b0okyK)j0fj^rZ=K@tL*w%#9IH0iAbu+Fgi1xY@(5EFx9S&gDYXYbyq5w;SUtO=R}Hq;VT?O7d7t=jSZt{ydY9iORo(LO1T)cWQ5m_GhiESTC4D@ zu%jcC5##3)?a;uQXdEEILH1qr!&tKZw;%yP@=3~1Uy8B>uOT{yZWYeTu|PK3;WB@; zaFWsMEyP}m&{V?1?og}j;&D>Da`Bu}<`=CIKxcUo387f{0B!1kmXVBham)zXF&!?l zL=^6goLzCHe%`v2h_FZHWk@7)%rG_M`plvuy0Bmm4z#89n*`9;iU&BEG9z^gunRT`R61Tzn220)64=;LeC#j<_Vq^jA-a`yB*kVDP!{~^ z$!IrxXv2x%zD2f_M!VaC(gyS|-iVhjwtlk4;+~-C*A-N@^ZEcOSn`TF)?3Rb@mJ3_QjX+pCU;f-2T&13!P zNX*#3URwYm=g&nt-(c>0VEd*bo zeG#1zMCU9GZ7Iu_O5LH!*y-j$6g4Cw5fIy*j1UWYppv%rJ^PC&GNwXAqJiM*~Ccz*et_T18ltuBuMQ_MJ%}qjP%W*f3W!D(=e|;f?TLj1fuFEL25_5NlBGCqir> z+f9TR7t-ZfE^%>f^pZ9(!r@U@OnHe7NMaHp*1$O+LX5MVCfts03CwcSvs_h-2)8n4 zKB7$xklK?GVoJnhCt|!^=@tYkjumfVZZF<$FX&_mTHyB)iv-Tw$!L2C@v@j`aK;){ zNh{{D$jf}h1_I5Ij1c4cg6PvVM}^x^#E5X(7$ZWApFyNpsmVyWH>chvJ^>K`d=EtG z{roDB-8vUJL^@yH=PQ(Gj5I{onv8I67$d^D86fi$;oL+lz5o+q^;V1sKY=l#?G&0m zckw$vu9z?DqfN{Lb1tdXIS*ms^Tr<7r(h*WteW+Hai!AN|3ae!FI5rr`v3 zem7~cI}PeAs3Nx_xAJsO(+x#}Y&7mu*fGVyQKun>w5R5-H4TEwd?qM}!!2b@NH#I;WSNkL>1Eck`;Rs@Ua}>pbO& z(vp$3K~dEviet$^(Owj@Ydj^2-8pxpw<0REH7L$4JJF-t)9DsTy&0V)km=W#iIcH< zMZy&5EH=YcF!-TBTXN`}M~?@%!KpVIy}QM3~5y+F-Jv)MT_jlWk^~Z1~R-?NE(f+JOi0JwJ9c+S$a~rcgcSptHIN zSHY+<0%?~@Z&mD)kajrN9ntRS-@4EKmdK1Y9-tUulvv;+uBG+P-S~=x-en1f%U&m9 zDxb5J=Q&%yAGcMsQoO;I>kY1BhdqkF4~R&Cd?CQe>~w{QBF|Z1O;Z(FQz0V6GB$cd zh`lrN&c84G8AN#S;Gx$84anK~y)U#dTxe-vHz$$W971iH2r)Gq`*uN-;BdQO^w-k< z!RV~*t`W05CCtH2do|`|B<)evQuMb1O!K0fetzHAXTlB}*~_ z^)wVlj5f`q1}&|MwK5nZ!WR*7(4v@~e6=ARv>UA58}d8ReS-%`a-6?<(_gV&ibwpN zL2e;JOw_j~>RT>~5$yr-XnhUF%2bR9HxF96Zh5sqrGXAT2jPH7b*PCun;j#<0pYza zL6k>eW!lDxC^)-Bimf{tA@;mh8bUElu^Xsiag#$`KFBvfxaLCZ(g^?8V>1hYcRQuT zWQ0%cX!Y%G^$pbSWTaSb$w=RLPO6>4D~boe2#Q3EiDX=mj12cBBE_K84ulxJtcVcf zp80YTAD%g(5egJ~5~t9a1U5PVAkKc{p9q%&=EW;EQvzq?j6_lr z!1%;@xpn=*>0dp)0Kc*p!q?+urn-KyF+psCVNeDH{sDb6iEt%^AlJCX!^+g&G{Tu< zjOg$lA1mpSW2*ia2^M;>d^jcx0>~G{d=QTiSc-mEqn%L-h*^T@)KSjBA7pBx$i~I3 zDzL#A={X5(q`PZL0$Xa*i8_G&lvy$)G>Ak@QI}JO!z(-yBzQQmgbL=q5xOD@iaSK8 zCKOQNh)%X9GPNOL547PsazVg0xcpRk%hOt*0}(Dj zF8`~kahKIZh(6sD6cc>nI-*ue2#<%U2GKe11D|WO=~Z>x(kgZU)v@~M^_aSM`TL1P zH0&STp)VAkLPWTILy^Tu6&`(OiJmyt9s9PP8h3%(v5E@Jw-suM&LV|HY$Hi~R$j&2 zV|UkQ^|{AYSuvtB+_qVRO_s@t4g)iwa~<7S3K#{4oT;F2llcVDsVY92S8FXE- zD2GUt(Naky5@qyJ7k5GxWpid%whVG#XCxvzzq`GWs!D`o!Lw1HjEA!z!x_WdS;X71 z;+VP?8_c54HwFMddYB(Qz>l6-+Mm;1PKo~4{%s0Li_P5mqup;8sN< zmV22D@5Bs>+m{M&6Ms$rg{h3QO5s?2CnK#oB8#YUZ^1HlB!M%bPmQ!h__AD^bP%CH zsyPD&(QY7Qh5RhhhHgY`pDdzsdq;J9N7XGiB|h3f-2w@S{1S^>#0W7q_hvWuX3&{3 zT9$f+2{7A=!M?l6zJq9Jz4aH$SOADbZr(_-ASyIaU~%S3)KLHwK?=P&t=^OqgJ~|# z2{YqFh)pg-sDVLr*JN}uV7D{q&hKcXG{VO+M)IB%;POgFiuIC=6pK1c2ak`!9Mtzi zWGqGib_hKniBbA%D;ci>y6MAW;JFpRA1;hoSPm}Hio4N3rCE5k+pokIS z3qQH33-#u+4j0(pDisc{!;Q{V*s-iM!n9CXA^`#sfFDN`>}76zyY{3ddv}r*`&PVg zfYn?=B?m}V>yQv8+5=8;k-j3rYlG}Dm>no@@OX>I!%V&=c+x@ToX^Jkjn1TyBg9J95(GRW=_6~G;+FqWv?c(yt zKNil~g_Cv+AJ`sMPuf-@o&AE7o((Ma_h0cjQxgq&$I8M~QVJi!l|}J~e-%0We{?fd~8*HbF*+6KtIY#+R<)rE7HQ8eCW%n@(x5bW)Q5BBuu+86h^I%2YJf z-J0rdO@~v{p$wnUPLIoji;Cq%#qy$Jc~P;vsPM90eIw8I&?v4p4P?44v~5)A`evBr*=eWf^XtF*;$4z`o#*F5KUZ#~1BqTzq};nrUfes>3 z<|3a-MxwJuycMf3 zfG=^AF7ayIIVTt}NbwAqb&jTQPyRYa)_J>8?slhKBu4IJBu;t8E);af(Z#GGQmo&} z2r;HqGAGpFB4)D^^TSjeW-9XkxVZ~`gpmHsnqr8=o4w4Ny|`zC-W9Q2X2Mr{RB!bcIWV9<4LX+8r z!QxlZMv>|EAfi3pOq1Q7#RXc?O09gy;;m&4OMNLH82!~H38-@{lB-0xjPODL$yUsk zj3jx{M>4{%WY5{K;PYH$VN6*eL5YAW0Tc7UMR#Yp8ccVd;8j!ZlLDJot~ahcbiD?c zGZ`Va(AY|(SewZRzej{*J1rKs6%f572Vx98rG{VsPiJ&Otw9WFbgd$cb=4UIk8pA9 zHv!PHghCj=`5J?YFJVa#VvWOnb|r3D5}XQz{|A^Sd@A`n;DzyRj1aroPR}a--Bpcy z+OY1f>fyy3qFYtLX!~6do2Y$Af~2eD?*%xeq{B|K?(3gChFCUTqu*qi&!w_zr3*5I^Q*; zu<#P`CnkP}GkoCf691cT^Y%06QanFq{oKco`HkNsf9lH`Lp{s>*lD3(yQ8VTPxVMe zrP~Or`U-+3(WZ3exo6)fcoU5ca0zcOl+c-z5k5>byvKLe{Lg6usCrY4HcfOF-CrxZ zFA8OLj8t3rN_yuW{=OWoX4bn+yQ?PPzASDI_!WCaT^LHc18EcZk`uByRHn*G*%=*kTvml>6k^l;bg@YN;?npyL zcAf~O%vhrsoij$aW+N05LW9u=q|^!;>4g&dh5Gr|%9&F)^K{eZgiDNoA~CfRDR!d+ zOBeaMAZJcSAW}_GgaT|>l}9P4nete9u^QokOt?1??QWKX(V2M6Hh9<&!wd--l1Qy8 z)Jz?l;%iOuwPLCbQWp{UurWg|Cigp33#j`_)0O*8t}8%0egG^%)4m^E5t(@TTpTtt z?QDcoV)nq#9Usl#_%BiR2s&k4O_%=lsaVf5&a)XY%8Y%0rzVnVgY_`9b-0F`*fvFP zd`CYh2fNT|WGDxRna`zxt17-wq7gc|(Xng&nUga2>+s(n!G=lm=T7hKZ~V6eu6;p@ z1Q`t=EZ9%JDj7WsR)LLCmW$uWz=6;|$I~rdY_1w4*O>V7A)F9lKId#OEX3A18&ouj zuqhWyyI5&scg4K|$9UFUr>n2?5e#S^zuTtn@WfZ;Xx;Ei0guAXqcD}gIpS*hRG=}A z5jShZtwSR&(T=alVUx23ZYK`8L`dy($XyCc_cxZn7*WP7ehvLMzj zaaqo)%W_b&e=yQvIk9-SSUf7!+qecheJqlZF_wk9R+x{*Rd`G}Vl96L*<8*=$Zr?p z{9mAkgZZ)#&$B}lZTaTd`q?u+#OnQvQ*bxU<9PCX#ifyuPo4qu9NFl9iXFw(l0~o2 zC6m2odEHEL^&rK8M<$!G+_#@atWkgg&mtCAv!BJUePR_3by@@Y*#s?`2x+MlUtWv0 zTQSx5s$2RCND&jgrJ1EOplwwg-?0_yI(2^1BwtFLQPko`} z?|qg*TGw?i2|Wl9Ar^fXNVb@2){lq>OuY^ ztoD@iR5mbkyJciqG2ElyKLv;1{QWR~zQPAOzP7;j5b-ite5q6vuS~FnhnVS^l|q#z zz>YrZid+uSrtVLsc8%K74hqgofYUn^`;!o31lkoOG;WK@y_K3%!LP)ekg+5(@=)Ue zX}=g8PEQEobrVHbAf$UHeY%0pkJ6&XonWnTO#|>LPd!hpXdVfCNFXEuP(vtzPjqfk zysQr`Xx0nO@dw8R?>GMy_5+7uSfEo7tVW_UVX@L@1TGU#4bjdNIf*rjdx_vpOXI78 zK_wQ|B-@-%jjnA_9RYTzA)kl;-*7r&h76DbdF-zKu-iReg~%g^n?Kkk?W-0b<)rfiF+YLM1VGJq|m4agcEz? zYQpxjqf=wyP!XM7SjKCOcKpiQSK>q~AGD_TccYj>89`0}toyQ2MUxFG{;?74`oUBzudv_WipHBP*ay>GbF z2f)M@Bt9dRU2>u{}nT)n1cwb$Q zKDQ!lq*ED*rrga_?nPPhMZHw^p$)T8qtgf0c3_?eY|7}wRZfJ83FjK3%@U>DNHcrn zv~34M`}0KNA31<;y-zDRpfw3lqGJU4PSe)S`R7p%4*Pi4!LSh@RU2`lP5;w4sJt`A zGi}xDByoT17ZS==bA_i8VAT);r$(rYhS-47mPTG&$y~`d5bA0; z!vXC9vM&5RX=*!Y(VLUe8B@Y>E;>Gekc^;eZNIt0{T%oB(MoQfXR|FVH1?+W+%fv-|I`w|*?^F4&yhrN(8;Vqu z6J9|YKU9%c$g~2T|35Vk5S4+n6pNhW0QDv8$M67}?gf@E)u1l?XTjLrZ4=*Z6CY}W zq1;D=?}oiwHjQNrZSjb9SVO4e&ug;9F9@Ph5&dfPWQ2(&Jm-zD6lm{U3A7+HV2xG1 z+Nzr_mfe1q(XDj`-h>Avxk1bT5TUBv$!KTwKBf4^;N{%j+-Y|n2Y_51qW!3Db>v9g zIMHV^LS~ZtBqDsoh$=h)K49ojqwE@f?oc-e+H_@_)Q^mW$dfqfPCymYew53v?{6#? z`0oWrLUhu`V~p$=Vm=;&vt~DdZ~aJ?L(BY_?-YNkIT1At?~*vcU{nof9p?`j2(|%_qWN|+~`c%5Ro{{+|VnVT6IN>T7S{Ek%%P-h7vUH z=WgQ4jB;=iV(ZZB9jHW|$oaDEP%eM_*FXPqlV6UJuYXVn#V@L}>Xdt8uU|#obN-^q z&%VUQJ4zuJrPnC0Snrp&VL`W(m2iGSKU4K@|8By@4#vpm2H@ikL63~4TcS;&-cS}5 zH*?Z<#7MC*lhLM9Z^2Ubd|vD;&QKT-E#s~m7WrzSU z(z!mTCVs~6Gg55e^1;y5q7|hlBg6^>h={bdFZjugZgfFvx|0!_wR>=J0I;Ax#iV4k zGf8S8oeZ=&1mXN30@<0Vjo zm}v7}i}ebTVtphd#crhGJNzO-=4#Qms>2Ent!o~O7k#Gi^Dh-@zbW0SJ&R)Y98z=B zkeXj(%<~f|7I}W6&2i>p1(w5anHrFbW49~1MBE>uF!4la%Q96Tm?{rUR|i~JC>n-` zy`9Em?$k8E65-PIVA@X=;kW-EPfZF-I6h+Xp^gBN==W3fd-2H6N`PQPPkc~U97E2< zOW|vOfChRD9?pG?LIboo!yY}Tcwb?zOh!iu~vE&YmVQ4;Rkbo zoFt+fAqIC%07Nh|w;+aW4VTH|CTejXUrpfSccUQOi+Z{utvzNk!pPOJX3cinOR_Bfg+LDBtk599QUn#W$)T* z5@~%=wZ5pD3N>>-F{DHR6d5BKZBC|fm2gw_G}vnr{Z^}O+TP||`SWDIfBQ%2>EzTN z4eQCt3f}$2QEB8>OpE}N34T8dwjXz5la1IRa1vBgK9?w>2&-p2i|$n79Oh=QmD~~QC0V+JVl?3)XBnt7cQ99@?2?XsSgdzpDh2p#+ zS89)kBi3j47a+L2u*%w8OzAjE0wDd8 zNlFCzU~D;zb_OjV4m!~WTW=tP5{n2rJVweu=5kS~Ej<}w`<+qsCPF1#vX))BzssI2 zL>o>EsB*AbtEy%gG7INoj%Ms&I|Yb6PQ_*qKxI(4Y8EZEtCN~a*3tea^X-|yD|+cA zuk`DTnHNJ1OzDdqNJfgC5&Yo=_o|Vxo3K(n22_u5#mThNUSiCqHD=RF)253EvDkP$ zW8NcxP%MftJvKhh$JPDZwZFtL3;?)bI9xEK{g&vS93Gn`HJU9CGGj)dGc}V3D;dC8g!(_BA2t?&03nW<|$ude-QKF>)cHhBzkLu8hrVoK# zu;PoEmuQCs5J}2SdBRBpCZpZKmH=^qHp&!cXDXJn@n@QU!J?st5*VDrnUUda$z_Jo zWmac1^}0EAb8DM%D>6IsCr0?CqQp5952ADTo+XH!%)Ag`Z_N9j2*)2}y6KI9`=N^a zp~NjUvZM|szVLqhoqzO_I>>L}4FhZnyoWLa5l&-?tR28EkPU&}0?^sXS_GHqWARMY z?!vh%ru~b}7zHc;9NF7=E1-{;sc7ZS9Z8!S?a#HQ=hCECDMDY-sWg)SIB^vxm1q~O z(v#6HUauRW_R8hc@>ZjC#fTIOwIU+K=;lU*SQIvlKrb9^=0~(8oCjfnwrMjOKj;kV=1pCfe~V{ zQ5eruZ@zBzlzn;1z8sq`)ARRZdj4l;;`om4xA1ujE(;NU-E+;8Qz|DfqaCtsv2Zln zvLzlNMA#|YRFJwL!sS>XElIS&_d=Vt9oWjPl^qdEZ_Hd~yRF@?|EF~2(AZ9NrV|Qj z8sYue)Szar)>UI5!l=gok~Z`CKvo_AaE#cbMzk|lEOCs8_KQ@x@5P7&HzL3eC;0&r z5F#88mJ^9~WjiY!t`6EXxDWeXqV4r$_tsYQ{v=?U|1ixz_MKWMTHaieYDRmAiIm0* zC+U8Se(DcSKh*F1r*nzJwJ#PoeI+B5AT!zni8cg>2QqxzI%recRM*N>F*d?p1*;=~ zQ`*4aTq|X)o&+{6N+RLHWzpTaPy%=oyaJ~PF`lniqkhxGX#~L6Yw-9X!q-zJv#YKU zJnzZ9!a=bxIQK&mKvIEaDm9eX#V-zkY8^YMhKgG%=>aI6AM^mCGtx$L!zmCF?dB?j zQM3zb)v8Fy@}OO zQY;(=h!DHsldX29X0o@@Zq8X7?XE(kfKpve`LMh!Er9s&3J|iw-{#I7mEP z?dd0QSEcHufz)F#b;z!%V@8CSj+zgekC_jdkC+db&k&P)9rWiImxoK>eD7Dm<#T;&{_IR(vXPA&$pbjY8%q}sqp>7-%pYS%yx{< zc8tDgv}A-G6$vp!$X(0F8fYU?e7v&>Hfq!vq{<7K+zV;k3t83+Db@@8!wcj?{)Jo@ z03tFoztwxyZ*Ecm@SYUbLL@#6yc7WNLH(){M6_?Yk3`{dK!ljcL^e?R)>Nrl>fQ*S zDnS_Bq_N0p=tUsfoSc@YsgL>4E9&}g7FMXW=ar1k(EA1ocs!o_+lJUr-C$JhN{Fxn z;R2gzdq>dDZK@P9Qwm0C*P&M@k=8iima=WCffF3ILqte*Y1a>QZW`|}9(9c-!XeSQ z&OP@jqAineW^_ZIwAi#PakCRud-PFt$3KF`yx$9N_oBPK=w_$5oO-%HQ^IfV5pOR& z;?s3iBE*mn15hN=5c45FQ=KHg_I`8Rm`+1Hx4$A%Vm^2OIN7j&`0v@>7IJxKF(!bq z{`86nU>79MQ~RLib7w(A0!T$psjNgkaZAXY86MZhe$ho_?AhnJxV+w zgGaQZ-R&f2lF?aTO>fq{H80++7jMHwe=RRN&zfC|%U{I8tCUETvti2Fn2J?}$W#vg ziqS461sLJSO8p7Q+?!$U&DbaeHEdZc23C6_b){#r(lc4Eykjx~fW0q9KDsb=w53o6 z4=ab>xO4zeVj&pcFOf!LT_D9;Nk)oIP|vXBjt+W zr3Ddsn3&)s649;3hhZ4gN%c8JOTvkCv0m4$i)JdT5%u4=0f|s);ofsSbt^9+?q>-R z-n4fzI_uZBV>^`ulpMNo9++HNPPh=^REQt)ZTdpPibnzu1Ye1*^P6QC0J396Y^EYM zQ}b}wJl=J2iyqU0AFEBXJ9TOXQg%9ZIEO!6VprYZj9T|`qyF80tjgF~=(p-+i;Woh zWP+#oV?TV_clrNY&yk-$wX3wvX%wkcxa!EP#hk`x(Ow*0=zbOrJ={X`*~lKeZkI!k zjtC9sY(*g2^h#|>0PQWAJCXqAj5Ay$qfP(Vg-b02B!2hL67-+n&m7ni9>DQFR3bdaxRFtM zy&&!lGr%5Og-IQrqX8SvfdH|=%CJWJxCwDs?nPlU0NhLGRRVD*#jB#(=Dcd2iyJNx z06T2%sKOfnUD5F}@ymCGY;II-u(^(e4H^sqb|+;u+2xmwlf})KWorAn?qn1{?liIR zanm`?7HYwGBO}Ww4kTA|t7)$teoi?FprCbJgp(0&t&Y+H(WcX7Y$l1$d2er&7bkil zIvIV$L=Af>RSp0hlBz_7N^!O&3In zp#cFv2^;5Y=(dC2dVm-(*_GkH*(ApI?e7*DwZMQg?%%=fzhJ+E|_OCOD%+SW9rWyrwH_F03hX z7uVn1c_nHfrpT?HhK;2rC{IT=Hv-R4O9H;-=5eVC9TmZEq^KXudW&L!w3b zZdb8}`!&XViN&WH{S~zJr%*FIl|Ld+-&SBI%S|7*eXmFG;~)ROVpYfPp)-}mW{&9G z9MKRF<`h8KrjaW&?N!{ImLS^fFl($9lZ~LfsL^ikUf{T0W@d0Qjh^O%?)HwO+uoA^ zNvrYW2-`RVzC!Go#RA%A}2VK0J6set*1n| z66TpejLtMn*A*k(qmzmklbO38S$!K?F-37qvkf6f&vVE2;#p53gzC_5q z14U`}^pz(8{7m(7_I1__zxPYA+Qr}z@|f-P84|I-tIJ*`M5J%!O=^2;XRNDzX^Qyj z8#9pniiUk62os)BDH$QXhl_?w_t3#Bv`z#xcufMkp_UZh8AKo7;iRL_)e?_8&J(BN`f3BnwDj$?bk*<=u#5BKgDQ~BH%F1r zNQ|7Yd$?_*EobS+hG)Rz2+0Hrt#{?el99G3g^d>t`qLr6ht(@kPj!myt?p*GNWDDTm!&Op-yCtzeNSqusGI0aFF& zoQQLmhcR*h^@UY6kHs?YJcf=zfNkTx0SaO)o1)*KQLbb_#3BT&F((1Z_-M3bgmVgM zb%0HE)XZ0g`z*xd8V)Ue%r1YA%id zsYJyiwz_g*`~_z0dIw@UZ@hED4x6#;;A4WHdm;v;ebY%{w$B!u6N zB^n>$^znYLByb|gZ3sNs4gq`@PV!>s4^=T={*LAwfQZC!Ai!KmsY&3l|FS|v%8-2F zJg+WzW|lblx2nmX2nUF31fos3(mchYgnxTDs78|t(22!u9%m5<=Z(s?@&%O-g={Fu zOcB^@g0G2^G%;)i*(ey#L>sC6=rp65Ye(OGPXcEvaQ1WI`W*m#kq#?gBGHqPe;gV- zpI&F8GZ459xY-wSHN}V&8ww3YZijBhK*<5v%!oo)t!T=LF2LAO439l0BOK|dZ5Xj5dCZ4ePS73dQ!y2zstZ){ zeIHSd%$uA_KTQ^W5fV^Rh(+qg;rBebLS+?bhpZg+>6fdrk)eq%M|5gn3Q_Tl{&bxN zOzJnj6(hm{>6l`PHbpS6nT%B9UD?f1Ccu|x=w_~tF`~`Cw1dE=}sDtUbwi>zBbA^_~5xYHu~loMIt-x8I7qTrCIHC4lw z)5jHi$d8Qxl7avrfxtWs0PJV3fErdn@terK2b=T=%f=W5uscYh7b(-EZ4NVYhncyd zJXiR&57M@`BmqTkhi=ABA80Z{3?vDF4bx7UcUEk?5dhdvd)!@=QEwL8CIUOQK#5KM zgxtY4Q6!66V(yxZ&MkL_h8(nAptDNrDg)ipMyt|Ms)|^V31HK{wIl&WdQV1*tveYZ z##IT?rjAP#h>12`XRgTG1L4cQP=!(UjHO4=w1B__JIR$~w6oICgNwTX&S|W1aQM%D z=Z$`YgAuDuw_C|;SX%{&9%y%ZZPAQoVDUbi$j<@52wGt0676EAUZedY;v==94s#3W ztKI7IZKg=Jhay>!Ad=koXQJS8f;7VKe8!JMoBF+fkN%Sk3)z#YMO%G<;Nzh5i-uYD zt;AGYJYo7-%Vi-?pPrbL)4Alhs(x>FGSv1+#5H(kf?UUGpQOW0jqd!Wxpox|Q_=K!k3&M2ZcChO@TCS=(qm zM4>?dzXs_ARtyN*Oh$@D0e}cGwe@zT0U*~olM!1kQLjSLr=kLYeKXJ*Y|nI)_^6Uk zbQ2M6s72t7pf+(&rd|PX`WqVCh(O}xm47R59H2SWredokqdlx~W27#mJd@F;8CvGe z#q7seU;JPE+pUce5xTHW+9?_BrV6mc1taN_Wv2=d8yOH22_#~lsM2)Ve^=6ou?LuE z^)e#G1OPcDCL4+NfH!0e@kGdDu*^t=tAJxvalJUuRgw{6ohoW_rn_`4Zi0P8cu@_x~{=>7S`ThShbf~cdo~T&~Y}AO3MKQsq$;dPzdlV*R0g$HU z#z2!mlWd^?8d+i60I);G82e=aBnmO6w#?k^S+v}D5>WQGQKBHzY^`EPWrSHYzsspR zV-?rWOm>ZAgw!XuRC#KbwWeZ3;A?TQL$v7{nw7sryT&IO-3k+tFZgb+Io|4gt`Sm} zj5RBSEE_W`aY{;ARKJK6i)J#S?;xQy&&$p8^5r>Kd1U=O9CPXS@|PMZw(evk2449p z^SYdQ^+NT>$h>kdM5GwXYE5M|rMZpp8H_bg2)BiP@AbuR(_wkhw-^o$9=(CB6_H|f zCZjWHnk!zs|H?+A<(?e+3dTdO^Y%oNjiY}oF)H{nP@&Ni(^|3yC zSNDsXU#2PH)AaA3N`_e~nMPnXY8*9V@awEI#at5~`8WDrzG9GPQw$%chvgoZ&l1ir zw7}7?kJ0iE{y~^(7O#kVPe!P5He~aNP7JGc0hGGJi^gbIv zeU#{!Y=juZc5<)+KQr<~5~(!}-QbSBo!^%}rl?^vzzQH9~zl9AFGt0W`LsPG2|z$u9LGCFfj z(I7&EvkrzK0N5VGY!40>0|Y|>wT~|zAKoI>S~rj3=VdnS<=8AQx5%l#{J|fl3(E;K zI43@C70Fa1LlfVf__*mdaOY%nwuOfq6uGqk*!ADX9-1EDH_))@+d*9JLLFa(gBp`A_?jR4Q2WaW_;l z*nx*NUQ@4e%de4pCL_cOEE$Ou8#5W915S!Ute$XhK4vo7MN&n{2r(+zP0%vc;cvv3Ig1*2 z(_b5E+YsBv8u(cX2mNvNWb_dO8HkVj!dQ!kkG~FeGT|XSH9i(Nc=-4$5~+CDI8GnC zMFD);^ruaHT3L3iz;dx`Z~;KM3~G!3SU!SA^_ZBv)4Vl`4A6oI$3-BvI@FN_&VRjy ztFZtIi$SC_LcszMP>S+_#gV822s^w(#qO@TIK>)2)roPK(>Ob?PKZW~Fb!@0%BfHJhU7qI>JGaPv zI=24spP&G6;bSj+=DCd6{8;)oUV-d$h<0!ytX~VnaEL&EQa0F}o2z1OHab6UViqtu zv5zB^@Ng;^=duhrS)y}#P&^Z0wWw6>DueG1n)rF#p%u%^C&1Z%->NcB>ls1C`y4c) z-GJgIBHG&MJzKuG)D@!iYO$xEk($J0_FjA)S6F@#DOT@fq}Ufm@g0t?A;?OED_l1A zK)A-K3`>N~R0HL=ThTBG4?z_sdTCFKBgF;e9n)A(MrT?+LwKmk5#c&`RT-r|Fw%Or zS7e9?YXO3kBF6#)Q6#uE{MZQzNVoA7%_4D6r&s?-jSe`tb>C~iyLof*aucsPG4 zdoh)~2+C*VNdu_VgvJG%?p=;4^$7Mow61T=3O_@79cn^u9x9YgJv z6CY9Co$%u$3If!`*8$ixlME?dqMhO1Tj~F`Fh0!UwDg7b%31me><0a_xUh+~mPVo!}N}BkHzlX@Wajf7r5!#tR8;&JG1bhP&V!n;Nzm2WG4ZURu0BE;q zJzhuD3M|@vMFPcWtIu&-*qCVMWF*nv=*J~etSQvM5JiM3A-aLJB!DA$A~8xF_1}N` z+kca(IyPz12tp*DY2+%1Fhp|;m$ik<$VwP#ARp{w4^C-8+gg}p|80I+uMe0mOyCC@r`xg!$7kD<+l|6UzqGfQ_`;UjxUKxBk`fS|fY{ zm4wGPO2RV#kk(4I>PmH|O?9WutCH}G{icL|jWAm&W1PS(? zWZ2l3U=w^NqqFjuPNz<#QzI!0%6E2U@?>dp64-L-K3Q;HNH_tprvN(l&smuVON?mK z_Nky597Rq{AvGE84DpH3BO}`M1gS}2gGF;EKB8Y|;zSdjcaJJsctHc9BR#nOm;5l? zwvi>1ot-U}zAT5UIg=4$k$Ha{slswPdJl=9C^Jy%B0`;nJ4uzs$3qeudN+Aqb<-Lq z`*3X`fGlc|1|l5|v>OJfSeOu@UNu3b8y4zoQ^_f!P2KD}37{S}L764m)ZH2UcAR$e ztpseg%>t+@teG_SRz#~2r9DpR_7o4JPymE4fi%!uXKnc}ew)e#i?YLK_ea1;FG+xr zb5jz8GQdEpbSVWkhSFk0D4j*jNU>g$kz#o!BbD8js%}f=x}|d6if=&`D*u-AH|&>@ zQ9J}qf{o1LDoJ3=5;@r$nOvl}i-^!e!V7AeI(VCQc$b%0e1H*R(%a|vsM7hrk-{Af z3f&E<^Z~XH^!vFknaFTuq}e$zz3QKY5W?BcUR{4>O3eVBmE}Nw+h{jinHnJ$iAy8I zI#@MCh*74V2;A=p%?l!3@c1rGSLwyI;jCQNAC;vMLIMG>%Hy zNU;!uB|;2h0suS1S|b`Xh>(CO5CJBN3o52X0jPo0_r%8?76H)sL+;mC#RPTh>Z_I4V^w5!C40Jb zIu`RiSq)?tJqe9=Mf21+xksWsAXyom=|qSzDNBS{9516SC%j}!y!p;8Gyh_iO5hmm zc7D&1Nld>gH^Y~lJ=$QT$!Krgi~wxPB!!F`5n>!ph(xsut&}RZ`nT=_)OHm>-{y(L zrFNESfAlL!K7%I}7mm^Z5s9xN5E1U6xXB8C&F}&sI`{6mPcX9q?Tj>NObN~FiHlTf zqYcN|z_#^aIzKb!U##{MA2%o=EAbHr4HGs1 zBHTU@AvSTii4?mXgZLh^5JqPo7^6|_7J=fl$Bov}b6o*OXA;1Tj0k|njark@ zr(;RMtap->(H)G74$ByPdZYAP62OgxNE=UNKysQ0v59gQkz%)FU^qLL%`B6Dwo!a9 z{@cQD>|nN^4L$%aIz#}r%qx=sBHY9gZMrlT`!$x&Jsj=um>#c3yG5qQH?q;bjW_<` z=>5@e9bN*KLEK}4D}W-*oT~0*{Y%tV&Y~lV^|!<)7Bsix4PG^DgIRK+YL?--cfbA2 zx!TTm=*NTjkNy#^#%rUDeU_R8>;*bYO@fWi)B?{~Y`X?2oB|u273)-0GRKrsd~b#& zR1-yq2t1|^Lu{f=H_#i$^#XI_0(&ItAdtr^kjLw2&Fn*eg}j}S28d`IQESRDv&6_3 zNA=ZFeF;@xL)8~r2os>51xW@h?gD_KbGQV_NOx*gJ|%L-Q5Ek!8J$dt3!2>p%?5fJ zhn|a~Ktc91LKQ6t-$oezN#eUI(@mjG77m0&;MY%B-4bc&ffee+LYZ*m@4 z_!4c{02SABR#6cEhaVAuJyflX%kz{O|LFIhUfiJD3~^}&PXCyncjg{Xnq;Jw(NI+& zLJS%2TUrJ~7HUHlYV}rD{AR?(gK~4pw6tVeS~78QBJgqQxX9r1!B;C(s4CcZAuAGY z^+0NWjv=(Fv2Lo@ZYpx$3f)e?NEeN|Uq!sNK9iAYoYgeW_@>mvVUJM3*vg+r^0g`< zP03hZ(yEJ`J2yB5MCT4aV>RTXf$;Na5#Q9J^k@ZidFxWkLpIh$iQmw%X-#cIVd_G3 zrl>P@M$0qN`Ia~63R1R_cf?FaZltG431iDnpOJ>x^5l!ZLlbXexRre&%bKs_?ID}} z(LY5#iZ=;zPw&e&5}rw*cAvZLarF%8fXcK*rEFj)PaIE1QibCfpNtTPyIUjMtwHhD zn24L|*04D;|BgEjrRI@e_vRJ7J{6t#A>G${GTOAQXEHm#ds|EC$8*g5Cv$(GIp4_$ z;~O_lL{@H)7y@+fPNkpV$%xSW4rV)2i5YCw^OH%3bo)u{Y{(|QZeHydILCfYp;8qK zn(zU!CE}B*q3#^|!F*P^iWt@Lq#5Gekn+Z#>NU;QTAz~yTdCSqB;rHv1=eYft+D-V zQo?on$waro@+4y^qDnDML?~&ar_Sw2`t_VjNnTXF<8w+#TBYfsa?)n46`c0xg5Ramq2JycY4vx8%qsF zt0k`_0r)Zhyisw~5x2h&o2y@;#CIp7Et`*#j8q~mDv=gNZijBh$YCHt470LD8e$C_ zwHl&x)yHZ&2q!=|L}(fW*i9w_$w+hf@EkrGZb+0Yr}%F17K>Zefig3gB`q19S{L8V zXwxB-u5qx;4PwQNyaf<43+&`(>H#>SD)*!V}dTA(x68s#GZFcX|LR5C(01-eoIPCoMt zSs^?e09PzKqlvbxk0@_&J}_FxAuI@hy?|Ggh%`moOC&zeXj6UQX2VTIO}E8x$PSl| z{^aZ!5xzx7A2X3#Bq+`Iz8aSMXwU+{U4EoA1dvi;|JPk4)%|j$LfkLJMrYI)zp$1c_W+IXiKz%k{SH*;li4er34$KuY$`=wAr5y!!y1T z5^M{?ZVl|;psq!`3(*;jqpc{m??7rD8aWx^{|0^n5#Dc*Vh6O_yXOG=86I#+xb4#J zY^)@p{TlBQ(22v^uO|Uq*|^i2asdmufHNtbE!qBiP&m3Xe2F~(<;^9_Cym*6q~`=fsi zW)(RZ+O&4G(NDH|JrlenDb^S31vYe2be-r-Smy;{z83(^(Q3E3Rn#3Fr4%D@=UJ8^ z`nZtLq9hZaY&x^i>3CVXOo^le5QLXHR6Q892B;ABj0v|oCeEav)poB_@m4K-G*RMG zGph06R&uAvG8+*p^o*&JF{p|`_X_D(Je)n}>#KDVi+xEinJELPA{??`w`ITP4GkN9 zOZ)~lj)A`YSx)T{_YAXG zKFbz*QTsDo0#7YBX7a9L_DNm_y%0}f9T=3;cmk#N3#{^tHXS0YXpe+UGSX_egX?}W z$q}LVt0OwF}% z`*_5sk)U3vpdXC@1uRn{5S*z_PXrkaszIMIt~cBdR68G5I}dey*oOjb`9>5fw9ZYP z_QK;Y&61@U5q=~O&m(moy<*YUP82O$4Q31gXt`-n7bDsO=5 znue86-k|NaDiPotS1J1eI;}LUShUqTRE)WKf`3*cl?gaLH^+byd^>WzsBk_c%>lK6;rbvDij6L__dPeqND zex(#Ki7n6IZ#LTE#y%ujlC5TA7M^MOxQ6g3BBKJUl7d-9(|q#nbta=TZw>7biL}0c z#GoTqBi|7zY#_vrhg&k*)Udhv+KB;LF{7R3HXyKleP@gg===3*>Go==XRVfql>47E z8DVYEZVLein1Tbd`pRIRzoib+L&!%E?4^BqPOM zl)Ts)-rXeLx#x|=m66)SNenx$%qSvL-X4+F7y*!a02QskuJ4i#>(T|QTH65xy9ErA zWt#FTthWIuayxW0hN>T{*%|%T7Znm%2#lVA*ntz_WO6G=#P+i?lfcGC^kZKmK)>J{ zIu0y;MZ!B;Er7tEnlOb9fWyK*Fc!KeD!79-WsyIa$ev%vLz5_u4Tn&1jY9Z%y;A`h zE_m`_GQu?+_nyRvo5Y9(6dCS2AG~DH$E+6;vao8s>BwLNk&A^!!2noV(eI83 zORIGXHb!_ikpEZMviu+a?zOMHK=A@#hY4M^9UUo=%(&hqx?VwVUaj13(PPoj|hNL$~+4Z z?if32!(&^P5k?kRs1{g=B`LT1Ul{gAdm{k5RcA>8nyyfq>TA<4#6c8*+}l-Pa9GiX?zlF?$^HV~c0ib|S5wVJ%g(q7Kc#I+Br! zE16ZciMHcN{={bxNdX{c1Cd+UqM9V@2mbt^69>?y++YZh61n|T{a$U;2R8(p9NtK|&A9G9pYHobQQfS(e*#=ddq8;OqP3J8soM(F8t1kORd!PWa5$ z3hc%u0Uyt1{Kk72VFZHuT2bLEbV);=fhdY$QP9meIw-aO)o$9;ZrW2Z&bzE4H4#n# zR9+9FF_CWIq8m6EVKER#f(7WDqS&rSTLjR{a85ZIY+QobkOX#v-O7l%Es*Nw%Z2k; za>uGY608BxI?-TAL!^;1K2swqhdOlH0^#loc^ab^>uC43#}zq3xDg;KMgvuTHtlKD znI3;4-*N7z(5WLr%5EanN3^vXpaQEz38M`o+M$yy1rM=0P_n-4zN$?Zt4>v(hjE0WP~yZdyHECE0YeP(BiDX5oVb=2_TZ8 zw?*XYw2RZ{j%eCw5RptbYZBN<&_zXRK@Pcc>j8j*DsEDMQ_Z{G$;$@3lbjVG`6Y~M z0PypvZ%U-j@5D#_4RdTD#il~sGIEbW1b#_t-k~0Ica$Tcp@z4qUbLCqr<75Ik49u7B`&M-mh9+Lx{hMu%-LTiyTq;|2>EDE z1KJtBXLl07XKHT(v@w{4M+beW(OxA^=vM`&r!Y0%-FpDgKrg@L)~j2Q`-w!4y8w6E z{Z0ZA3DLhn)_g&#qL6t(1FvEhaCun3H1>WteWdM0QGy6vO|jxJ!d?<93jjstOh$+; zbVU*=)@Cxok$!I5h@oKJPJW7wf!HfGsuPI#A3r81BgEnm86oDL!tWj7x3( zO@$`DBL9o%Tviw*ItGb21_NCx7$k<&N`|yam~;>j*_Avh3Q;IAaVs(5qSI7jV!XT$ zHy2GB%}pB3k?#xRZ=w@(5l?l!U{6+u}fk(jk*ulY?L5BK(wy8R2Si57_s9c*ca^NfvYcYE$!t(9f4C%&fwsHQO?k(2W!u3Plg-87{)% zIsl7}B`1M>X}?0tgK(K%(F+T-(TY0J&Q-XbCRYxkuknR$HM-vtjjLksRu>tyuj%$_ zjrqMLfheIdjo~at_`u!VS{Giq6WLCq^WBk;5Kyl3QNu-cCu3Fql|bnus`?0?(&jQ& z6a%RvqbMJrUcDr+Gc=e>eaTxE6yjj&3#0;HsIC*?wai>DWiFR9mrHAiva~uN+7#z) zjFH4L$XPPtGCAlpq`!1^og^c~2CMy?#fid`hzK#%I=j`;qP$35--A$t8f0h!;gGYq zQOvj<_9G>Vyf=BdSrPSlSYvHBe4|QURvyzp~XJYZdTMY+L4m?r2hSw z)Q=i%&Fp7kCbB9MnVpFw+UOsT7E0zJxzn9VV9PN~hG7u3WarieZYLS%M2Hn|iiy zA^>7zhhhoQ9<13%zcJ7!EAe@5RVJS;^DryF#FPlMCS#}Yxrm+M4#me&@mk<)1a3`O zM51Xn9#v)lYi0%zK#?($5n{~FfB!T#|M5S2>5J>SDTp?eo#L(_LJMhgzdY`XxIxZ+ zL9nsvIyVLZ^jlz*q@D< zmViVf%QG2a`#i~^1==(><4c2~8rHK(0OaigQ92?tITmOs5up{5OX%B9BHny^@7=6| z)?2L47aDn1mNMK0UAV~g32w7P%BJkNc z_z>+bH3tD45cP8`O%k{J>u&2if9qr2s%iq$>aXQiir`kEa_Rb$vEt{gRcmROA;P`)>E!sEk%;=rz%Gm-Non`C-h0sWh zq{7yY=uZ+A&R_SjL&sg{^LCDDOiH{^D-6IKzlyv80v{@irEg2y% zP|(y!1ZolWLqoJKw3)9nl!X*K(I)kHn1np&g%_V|6jMsYeicAeh%6=qX;(+$OjYP5 zK2u1DX2-A_TFJ->f+faOR1l+9scxc%9d~rLhh+^B4pWDA1*tiiPL&iFJq^5+O!n(z0mvI_v$b(Bpot4H56$lK>+< zCjmy5{wLgn(D@UaHlQ4LiO~k{|CfSul$`07Tus2C&KOnuzEq0hUV&V}G>L`NkMQb3D62|zfm@hd-uu=_ep>VNsG z>F>dcAa8X}X7%Yo5^AFMka5j(n>JSx*l6J+&8tC7E9ACEPe!}K@--9#i4bcLRwdeg z7jf#wrtZwpH5u}&@rVs|B`r0U96{R*8j+V~_c~pLx9(p4O3+P0sfkwJ1(!M64LLkT z`3s}qN4zw=AVc0P<4!s+km24{w!hOyyau7=&ZiyaU;cx??QJqQp^ya+7YG129EZP_ z(Rb`7$`A>n*v(yH%tjk3Lb27>-`u7nbE34=8`WC1i`6E!N9!@0<_q#DVd;?gh(#{n z1>#6miLs`<7<&&g#Z{_mQLzvXTcnKTTH&hK2%V&i5n=lpF(bvALQRp`laV&QF*keB z8|0^u`tK!sD`Woq?$53OE_ zw5vnudARl*q7q3!I$o6fLSd;W0^kn$B(NK2p(GutO}qG(1dy9R1Ym2!`IGD+?|jH6 z|MGXE%zPpDd?E47zgSBlI+w*+EG0f}&^}M^1;J0)Zi249Ae)(Wb|agWsf5GEHk#_* zEg78*S9zn95YeW*klG(uB^spBV_-g0@mnaJ@R5o%BPW544yDtVgbfHKG(LVg!3M?Z zW8o=4Y4}NdQ}*Xap&%&jM4%@$^vV-$_P7p~CxUreyg6-f5!;RJ%}Kzmj@6C4^`$Ff zyxa6Fl>CD3OSI`{5i*%X__}NhAwmq=D*)z>nmUSzHd^b2uD~`NhB8(RQAY}}GZ?Qu z1|A?RbS0=yK9-!PjS#z`LU4c5nQ`}16gTM1 zB(UE#!)byun<%3~a=ghB9?q5AAV7|K#DxmP<-gwPgYX^B2uzto5t8WC+^c#nh_G>@ zvZdNSiwUMN2vf&sfOH8?YK>}a6!e=|nRBoSG)pyjMV|^EgULhEDEm+c+WZIV`D)wp z_UQ8VXeczqVSMay!IQ!|nns008^YC)tH#U}7gms=h~j^!-vgi(d7H@yJlCA5bo6h zaFtS}RE=H@qT!L_Bf?cm=`tc*rPMs^c70eAuQhT?WjduYal9oQWJS;*Kh>O!6pLB0 zm^)r5CX`Lfyh!>q+M!)V)+Z5ek;ni~4?6=d6hKS(g046bt_04*^UTBl>c6I}Ua&lr zpBc=?G_=AC?2z(cPq=#Orv?0{1^lD76Z0{o`pUa!bx!KB`ODb96738to5rveaJ7ODwt^3`&x=aH z@DOdf^FVMCXb(1zME^f!PS4^8?a@r-p-xaf0BMu?GaL8REN&>=5G4@fvf5(SMAZDIr)+k2=Ma@R&Q6dH=$4&99P zR~I^J$?yVX!#D$tJP}H!vZuY!8>?{w1KJIXm08MzJS>4PD~UxqbyOO8Ibi13~Hf6KE>D8cb79|Y<=9VCfh)r2M}0QB{BcrX&3t;V?&W2_}YH<+)75j@Y8 zIq?9*^*|~vnYh#gc#Or)sx~gkdh#7ao2}3x(no|Ve!cT1SZL8W00x^t;Ffb`*sKI_ zk#ZD6Z7c)-$C*k{lh)M8H7Tf)XO#-e^DqC5SBa}L-;1a^WasVzigqXEDRKx;tf6}# z_M*7gN;1L{qQW$sC_b-(D5tk`S^fN)b=r~sF4 z>!Ik^Xkv{m4mI#$CEwB584YwW0gX>(+j_sfVRI{c_9pJiN@$2h6l5C4F2@>)^nNz^ z6=zC3<3E%bfwU}KJsIIJQY;(?ETa&5MFs(A)3pfO+&I*j`bvU304qpYrKF5S2lP$o zJ@l29U&eB_QR?hb%+M$$FK*c56`e8UYFrmI=OC70_ zvGo+r^gKIgJcIKJvCDWy0iM{QQy=^RJ%Jv(>Eb|T6#5lS`V|Y3H*t+n zlMa3haf2UUmOuHGl;yg43Ssnej{6q;`P)o-_(HRhkS+MMV2VCMBGmlZM|ep+M16!6 zJe-ESaZLhe1KZz_W&?;)Lu9kUEw(`zCsAt99WQ1)odIAA3N@vWTMA#W|Lpr@9 zt@fj>7{ZS{QD*kxj5cQ)#4;fs!OncqF_`Fiz{5!{!>hW|s~XzF)m@UEV}a3GF5=q@ zAQ7LTk4c0tmZ=p%6^4#VpgcYg!ts&buQj$C7oSEV4X-;H?FQD&q?>|g90VsFU^Q#L!%iBLZ_1C~UoF+@ioLIse_&0@bSEqaX<>n#~67K-pht`t^R z3hSooQDLTui_B_@Ry9RSJl>bQcbHhjx|#^BP(c+odZ7gy?TkWE#E3Q}8!A;N#^W3O zt&{L2-WKK&H~($5%rS6G*ZGrD-J(+qF7RJQMs~+ zBR3PAMjHjlqDo{bsu@?6jH@D20O?i$p%pceV&Ym;N2gnGra!i`j2Yqb6OH=T<{%_3 zy2ULzeMCvmxJ}uRj;0ZI@DsNO5%f{!QE4~YDyE8TUZ+x@bta=t`_)QISnfZHwj|{> z5*w1D{YcSvq-Zx%v>7o8KD>K^07|qQR=*bo(}168!WEV-_F{-KWK%to zo}y)zr?vZP`?D<87k>8m z{EA1(<8vq_D5^vO)g`E=p%7B3K9QMHQYaIVY9yrR>9^?Z<6tq@-uwS0q!!BRs+%>( zvU!Rb;o)v>Hf-1q1siL$Vw-+uK=62kuvKd;n?BEZWqZS z9C`H=hoqa!@>ysXYj1mB+oCOb$fWD4YJ^|<;FLIxR zJe#A&y9O%{C346j3vCF-&vS1C6`sMt|%{lH8F_q(4i#Px>_Aw2tA`$Vo3&D zLeBCq^ZWJzC-q01ThH)ko%qV{|Ffh9ymI+_OMysAEgC39n~r3WLy67=RokNFwo$#y zLg1>R;-Vs1PIf;9GFzq=0BZzEQPGRamf92()9X@?q0bmv=E2zw6>RT@heBJe#JiT2#?PZ1wL%k(Uh<51NaY5r zQWGDYyo7e4Vm_1Z-TD6R9symn?!3hm*+ zFrL9s-L0B{I|N#k)9z77;s3jxHiEOFA1-r;Y&#L_!8vCVoJpm!6_PZcsx_ag+7Ppi z_eg%({8Q)wK9#`C3IIM5cscA9BBT^J1Zmr(4LN9>gc2esH=Lfk*A)KN&esalf3 zr$NRFLr5n=Nvad2K;%!u7HCW9tSAJcjb9H%cOkx4oPMD#jiNQQ`M&wnkGG~r{Xa%B zfJLd?`#a|b{8!2Gx=+i#sC59FJz}8xM6lJCPT98X1e{WzLc6HO4L9BWVv~fF>z#(% zuNrLTLWh&0%(#V2rx00<>`6pGU*+$Sc`Wp4{M=kT)Qs!SI`T37(LIEUSN<^G3+MM~ zW$VeDDYGulOB!HDGMOJ6?buw>HbQra)X?GOOW*xPi)S*et}22K_wA zrR7jn4Mba|%#sjoZlDla$UfBq`+fS{>;Gm!FcU1P9C~r*&MjLLyVBqZ85!)a>DZJA zLj?K|nz$(SaW8KzUYjwN1H<}s_L>v7t){y}T z#4S1mbEBcf6?!pGlZ#Pp6H+9SaxwRJu*Ch8QCd0&d6?AJMfg&^5S;01y60)>lTNyI zaM|4X`(OgPxm!BjkKzC5roUeU zpl6(ibSCLeC*^g2HAcz}ue9EtSA8_mFIQ)~_H=B%tNd2PEIM!0bFUN7B5(1`2-`IU_nak{Od%pp%Z;LyLg2Y-oycA$I#c!rn~QZjHBtmys*{sM z0uaP01yrPFUML+_@ZX}4n4|}f^MhG|fSib|9w$WPAjJHQUB#KM`LNLt=TK)a5^2$c zzPV{VR>}f(G$OKR3M*fQ7>%lwkP+HldMF^<6H$(#vOk)TB^qi=foK~Py%5^!JlKh`Ywx7^f9m&jib>Taye~KW) ztxkmM{>gbhr$Ao~0gvHrfsjMTD`Lkhx(8+RQuJA*gA-t&4tA0v*s&srn#O)mNKhd% zOJrLwDbO}k>6Nl{lYef&pDoUk5KoxqDK8O1w@rGLCjMtJsL|Y^Mso+2YxF4G=*)3I zX&}(%ObCKmWh8yF{JdHZZXHq?@^ zt8q<%_B%rn?<#2YY9%SV`$SNlCK?UH4a0%Yrt^kt$1`LjA3to81;1{K_+2DSUt}O( zq}J+{6!;^cMHNog92o4E326_Zt)?PFt-D||Grk5#zLF3w8%FqgZ9!HUgBp3qvkY!X zDO%5x2<;{n4+Ern^HalSR!}@^8#3Foz1XDs*PQI0A%(;zX;Ngm(c=n4+feT;BHQXr zfk>;CEr(yyZ~GYe^C_L&3q70S^6hvQx62RCvit9T z4>DQIRiJPI8BrnfYmQ!H3dE{9$dxV%;ZCe?Q&`UX^qk!9*tZW1f68YjgR`=nf!h!L zM#vS5tgE<9Z?3lk$!4p8g*;V2SXo58g4H3!qMde}$UwZNEjT`n93S=(C2LgG9C!0N z)4CQF1n_QT9*H(YLEBN$4CLxV65`(2>vTQ__q9P!QrxOU$E!dD2+lVVKg-$ps2%O3 zJR9%~HOk)$xpohg8ZOlE+7rF0;lWb2d@yMT=N!CzpZ#%Z)1GZNP!$cvBC`mWYrMWfS10OS!* z73~r+&p;=qyV)I zNJiy}&KPhFBi&Cep*t%lq2eL5JLRE~H5cOdogZjG3r<5I+Hkr8(Z&QH0gsb&F2Ps1 zpK4y68Dt^#L3=DAl3he87vhLPXJ!qwsS$b#|5G5_+DL(HTk$%~AfTwDCxXzKLo!+a zf%v_4zq2OAqWDfA+Td*jvdwSR%FVeMyTIEMC}IJaK!tXGxai`m7rL)mqD-1Vi|5Z0 z{&&~(N#OTk`V`^~ImvJoQWYS*R zDiMyDpDF7qmD|JwrHuL+e{(3?r>FR$iwAbx_8?>y*N(|IWLq|5F9 z>|2DBz{XTH1)@#u&V=X=x;f(Q-Nd@R-mI|Yc<s4KoWJ ztFAw{)P)hP4ugu3LZsF#r$|F0CU;_G#$kJ#Fe|NFQu)md1# z7BAFd>MCwlM`Bcr-^)id6eT+*eZy-d`nCN;Qu#crDPG0bU(9aY@62}~3gRrrR6YpD z{DX7M|1?o)1H78Uy5i$zqPEch>2}77X&~*56oX{o?NLq!ba!Z(FBXZy3pxIi9siN# z;{TtE(0}ZliKAy+{bE%8VoV)m8p^rSIi5H(=YbLP)7>fsI&M7@dvO1WHaT4+h>DEd zs8B+}iki+fHH|_jPYLiA@^Olk^SGHutsybz)YoOpq{V!K>=d#A-$eGnWlNBchPP>u z)>z5l{C>m>j!B5;-O->j?G^mXg(-CjV{4NyIRUc17<ieMlk)uW zNqL?w^r&9}O`iqo!yHy9#i1%x2n>B_;u)|6UM8V)zN8Kq$Q3ep-OVqZn5Wl?vJf1P zk8DQ+E?iK-3&cEuY(i(0NG&hW?&>7H_?0?b2y!5FE=1d6eXI~|x5W1J69#*<-6}bU z4Z{nzKiYi-U&n5^SArJ)RsyH{ma7pS9P}ToI(+7vo~f2{7PEX-YdHI^|%yH-90HjxW^~G3_lWJt6RJX1#FEG zB8CJ`zqVws)rJnjaM_l(!CWN4nG_-E1o1o~{x~WOUXeL$(|)(m8HhIBu^^Y{taS21 zu;T<*M2IIwHlbaDbIU^4PYcn*niVjeevK5!>GdUA9P5%U>KGdE@TVOZY3l3L+>a9u zNv33A3#6HZXgl77OCWP>b_4MTy7s7h1ME`C_pIA?(6i-7bp#u6+jif!WTd+h5Dam4 zbtmdReQrSAwk5`Od4GAaZd+`8f5F<+i)t09-Vff1chp(ONFp5f+C`kd1&jfQA`t>_AyP!I1~!1(^v z*~Z|~w{z+LBQuv^tY+~a2$;we|Dgx}p)K}dXT zqC|G1RQBvikDKxxjRpv|9Khs+z~S;JqY>!SSGgN@$O*!l)yQH;pcR|s${l%&hqE-Vc>Q9o4W5O|U* zl)SENde@rMK0@cXD_be}|31wxL?W+yFU=nml9N3CcA+uo@@Fs@>uKZ>zB^N0JR z&}Y?X^k|FMJ|h-4*y%s^<3CH686Og{ZC+Ax*3o-K(IgagcttAiRr&~K&eMqqd9o7Z zdj5ZA`h6lq^GiXTvQe!1vssX3+!n62R__wxMAev+d<`JbR0hO=@W z&pg7%&B}&G1Lu*uXdbzP&+WWtpp%!Vo;QS!7iQCVESgA$=aHdl#HBdHY!A&Lm+2oO zTi`o2kId&cVB81$0$i+KQlKrJr+cM9&W*N~0!4f*!efXA4&3Q@+)()H6c4&`WO;R# z0`2jVKz7O)?1?y=o`E9qEW}@}IY zB5Ebuq7wszsEiP8H#G-}=Ol+8o0spaYF4^@XDc(tAK2pP<71j%)1LG9oEK0*Ff9$u zO1MujzYI-EFE^VerSW0p`js*KajPD8@+beC5wJ_aF6jVqiViKY5?W$qg#W6foVxnJ zww{p0SE>{5a7R9bRPh~wXnU9C{dU+@QQ5-S5+C^87r$7);3arIq8aIkW~4&}^MPn1 z0gB+$yPh!=8(P>&POE0urA5Y+jbC1X`PmLHi5jpeLu6~vpa5^D}^u_$R zDjT@=E7Y;n&PrsT2-)4b^(1n5@ zv`-~0V{85&w^jE2m3@1)oC4|gnlf=t_;`b{iYF*a(d%0YkC>gs)U>cLe2;D zIuIpm<9h?KfM{^(6XL-~DZ7Gl(=oZ}kQ_$-8Yz&nZg^F>9VJ`MQ8FR?Ofg5o;&v({ zI6T4N~>_0dA&p{~3&Hgh8 zCwhXL5dN?3_Rs5atAzjTkrZfuY;22t3w~kp+Zy zd;(6=fbab~pvhejZ>6#a9yb+KQBzL<3w=caI$!d<>r-7B-uMb{9L=EMdJEB(Nw^fE z?Hq&wEf@d4_}Ldf_~N%;{AwQm#i-_43RlN}i#=gpdv$-#b42I?V!%SQsTN0wHcF`w z@H@z7COCK7EsJ)k(A*ttx?q>$Qej~rbE;dAs!_z=RW}sqc>dkC{DrFTqyAgpYY-Bm zmH9pG{NE21G@DVJ<;g5NjV^G^(r?lwmTf)U)Yu}hn|O1iY(_()+)^NF8L6SJ(4H>) zjs7^05Axf%n*oW*X&t0Fiio^R0teR*>rNgfwdX0{#e$$;Oa728gFqrc*B z`r=cbSIo~3Zbl5QiO$5^2h&4SvCVS}J|!<6((x+a47hhs{liawKT(qkN0fC$b~2U@ z$llG;@q{1f<}`6Mb@^!U<>8Sp{(Gf(315tv?R>x253U{;|IP5g#xrL_&<=cr!#?e( z2jM3)N@$%?+iAJ@KPssa#yDQ%Q5FGdAiffu8AcMuea^^F%mH}%orEi90>I-1I{p9R zGdufVU$!hIYLQ;|KHi(OXDbmeL*s&=AeepXleq+R=5#hWT@zj1z$kl5(`t9Wqe#z77Ka7?YnT$!^RiItiAp~9fgtk%^ z$#rliabj7-;nd#c6v*WiNOvlwFtIHb|r;wOLf#A@s3vD(i=wO>SPzYNrVQ=IlSO#8eT zbC0+s^U-jUzS?3GcV$&W%HgaOvZ-A~XDgx?UGa>|5f1F-uVtwcaDuq@eVT!qT9*6Ft_1UzS? zurzCNfhE>*3SYa6mi+ZrUnfWnUjM$UP3%E zq{9&Kw5ac==`awyZpi?r1j4~Jdv|*U<>U(6EV1P+-t)F*8j3z$0IY5y+7wB!q7@Jn zbfOO@)gF=o2M;X-bdPbQGsLnqU459i%+3hJQ%WLAH50|%5T_@nCMrs-8&XH)cB054 zS25I#N$ukX0~8QCiS5r0{1YiaMjy!D2g9K5oj$d+p6>_m5` zeN&)wiyi+Hoj`w_#uUiaDXjqm3Yq|I9ugWxLvB|)*`sF+1NKMT$dhhB$M#9xMI?UPiM%|k7BlE*A` z?m&>j(5;t<+g7+2D@uF$y9`*JK}&V{<#5aZ+1jFxUefpJ3Wg&PG)D@=3x2;pymi-( zI(+tW-x{3r;TSSh_ka42lzlE@XEd=h+BdT^y4e{$Zn++}T;I~-g-ysYvD{N2+LTxo zqKzp;0$C{IW&-tTEqY1xSCr~omh$pj*w4PIEBVR0imhm`G9Ov>K*7;iDbV(PxZ;jn zB<|?W6#^r)u#|m1mdcKE1hPORnm{~Klr<1+X-dN+>S z7Tbh)MqzUY^P9J1Q!yjab^{doBd|@?m)<5j=;U{?!7Xcr4+dLJp!Zfpn+ zE|bt!wRtbt9yH&RP*xUq*U5sl0YxfX1#h_*UdpdW=0iv*#*9Ee9hnL-xY(qYE5Ahf9y z)6#S$uPcd$3yD;*CFLBU!_80(zP2yUEMe8{^}6#Q#_i4Wu5x)zypZuw{4| zy^5FCE0$X(PW=X| zsp~@?Sr0~8kKKGvf%a4+m4jj(^@R+IS3@T`TD+NGDUkC{pKO?gPJQ7||4E|WA#|M( zfNKiCH3#6D18_|NxTbL1S6C!2(ONFiY7W4)@>mprYY~8J4!|`B;6B?;GvvMcvzt~# zfP#)-y0alDRU7q4k08^t6q5X1X8cD)C=Mus6JkI2IEY+AA$6x_9Nfl3@rLnwstXk6 zY9yR8hX0c!9DpoS%~z-*H9~K|eIG+_z<`_hEP4hJw=cdb+^!b~=AI3_tId|H&7#Rg znT`U2V`NX3dC5SxH$J?g9kZNptDfD4eolR{o0uVU96^Hl%Y5V`NSRE zfQ;ZJ9QK3>bMRY)wmMV8Cgf1t;m^$Irc@$E_d<<{0B?V@s+H%k(g~(r4xvvmy=Nk-U zu^wnhgkJpr;wNAHScyM})X%H9Px-2VklMxMWMKBSgoxBuZxW?IJEU0CBg(4w%%`E? z6nIKhnzsPsrJ%!sl9jyCv-ONLll@t zl_C1$RmSTD=1hUMM24~k=ZaJFnFNtL-Y0|Yg3YILGbWtuhIWO5_28CwS*o|11iPq# zU>b5@wzSBQX)oFaXj`EFO4ORZu~*-^gE|<~8h9lW=}RJ3!64!{A7!QPtm75)LJiJb z4bt2z@$EkB(VzYchCC&teq1#J7W}@e>w+1pne;NDb9+Ef{zOiNw#rm)*Q+SJs%<74 zany-U$_5+#3AvIGFbd9c=ZnfHpt$gXwTBlA58YEkar10yXr3w1u0e1Pw5yrD2Hbno z(rqbCmJ%Gxq42UgJ4)soEnJ28N$6w}h~KxEKLv1$lIpq{efpwOq0m;_Nte=arh<}Z z?J1DUWkxcf<&h%b8?mpyq)gvfbb`n^0#!mAa%M_X32irXNYT}y$EG>ZR=e9f#2Oh+A~Tv} z$WRsE64%9m1y9UQT~Y!=)6ZmZMgqL=<8%r|sZ%ltPGnFbw=}O+6iiF=kS4H&1=2)j zQi415@QIi-w+VFfTlsW?bMFmV2sZS25vjYaHBs&Bi`||r0%(A%6A?f&MKO!5*z+%j z1v?|=Lj1ac*@b`?X}pVeI@q2QA}Hs5Lc9d>{w21(CGURa6v!2AB`VrV`>KpUV=pu= zlOx>QunF;d&HSFuOfp5dQXp2Mb%w@;_TbTvWWXY@flEZ--O9XEAeMm9(`t8Y0m9wS zVOwEau>}ZOi;$40;q9B^9&7%G)xSiHGD4K+^-wPmg0jUrp$P+y@}pVNOh8uYn@iB5 zyzF+_%ZT~LI-{Ba??~Q<%BbfgO@JeAdA|lP*6epU_&@#aUlF~zsu~;a!q2x#Ul7Gd zGq~22R&MW2%BU9!85ijo`mb8J$FC(@szgS&I9=aE&ab-!kzhB9A(J}wox{=m>F*>+ zkK-paaWn~N5l2&Kt5>>Aoa&nyRLu-3?|sals-F96c`Ta!YfS&u^MCaMP^AmRC4li7 z5;z*!QxYY<7`@5M(Hm?Ik9#C^yeJey!yzL&AzN{80�HB+o;%I~jXOwF#ZjYa^*f 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�OOXitN_AH&Ed^qe!xpWW8(Eu{n-64m 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 ?=ZYB;2c_9Ewp$dt3E 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 JE`%YD7XUWm$Atg@ literal 475974 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±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�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�W*p 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∋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 Date: Sat, 6 Mar 2021 19:01:17 -0500 Subject: [PATCH 257/646] Add exportable option to default styles Primarily, this enables the user to export of construction entities in 2D views such as SVG. Previously constuction entities were always skipped. The "export these objects" is now available for all default styles. One may turn off export of constraints or the inactive groups for example. This also adds the exportable flag to the factory settings and support for saving the exportable option for default styles in the configuration. Construction entities with custom styles respect this option as well. NOTE: Running this version will add new entries to the configuration (Registry, .config etc.) on exit when testing this code. --- src/drawentity.cpp | 2 +- src/export.cpp | 1 - src/exportvector.cpp | 9 +++++++- src/sketch.h | 2 ++ src/style.cpp | 52 +++++++++++++++++++++++++------------------- 5 files changed, 41 insertions(+), 25 deletions(-) diff --git a/src/drawentity.cpp b/src/drawentity.cpp index b8e3cbd5e..00bcb28a8 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -462,7 +462,7 @@ void Entity::GenerateBezierCurves(SBezierList *sbl) const { // Record our style for all of the Beziers that we just created. for(; i < sbl->l.n; i++) { - sbl->l[i].auxA = style.v; + sbl->l[i].auxA = Style::ForEntity(h).v; } } diff --git a/src/export.cpp b/src/export.cpp index 0bf166f5c..b9ebb914b 100644 --- a/src/export.cpp +++ b/src/export.cpp @@ -207,7 +207,6 @@ void SolveSpaceUI::ExportViewOrWireframeTo(const Platform::Path &filename, bool for(auto &entity : SK.entity) { Entity *e = &entity; if(!e->IsVisible()) continue; - if(e->construction) continue; if(SS.exportPwlCurves || sm || fabs(SS.exportOffset) > LENGTH_EPS) { diff --git a/src/exportvector.cpp b/src/exportvector.cpp index 198502c13..977309976 100644 --- a/src/exportvector.cpp +++ b/src/exportvector.cpp @@ -1085,7 +1085,9 @@ void SvgFileWriter::StartFile() { fprintf(f, "}\r\n"); auto export_style = [&](hStyle hs) { + Style *s = Style::Get(hs); RgbaColor strokeRgb = Style::Color(hs, /*forExport=*/true); + RgbaColor fillRgb = Style::FillColor(hs, /*forExport=*/true); StipplePattern pattern = Style::PatternType(hs); double stippleScale = Style::StippleScaleMm(hs); @@ -1100,7 +1102,12 @@ void SvgFileWriter::StartFile() { if(!patternStr.empty()) { fprintf(f, "stroke-dasharray:%s;\r\n", patternStr.c_str()); } - fprintf(f, "fill:none;\r\n"); + if(s->filled) { + fprintf(f, "fill:#%02x%02x%02x;\r\n", fillRgb.red, fillRgb.green, fillRgb.blue); + } + else { + fprintf(f, "fill:none;\r\n"); + } fprintf(f, "}\r\n"); }; diff --git a/src/sketch.h b/src/sketch.h index 903e638f5..68a912b39 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -883,6 +883,7 @@ class Style { RgbaColor color; double width; int zIndex; + bool exportable; } Default; static const Default Defaults[]; @@ -890,6 +891,7 @@ class Style { static std::string CnfWidth(const std::string &prefix); static std::string CnfTextHeight(const std::string &prefix); static std::string CnfPrefixToName(const std::string &prefix); + static std::string CnfExportable(const std::string &prefix); static void CreateAllDefaultStyles(); static void CreateDefaultStyle(hStyle h); diff --git a/src/style.cpp b/src/style.cpp index 1f719f671..19a1835c0 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -8,22 +8,22 @@ #include "solvespace.h" const Style::Default Style::Defaults[] = { - { { ACTIVE_GRP }, "ActiveGrp", RGBf(1.0, 1.0, 1.0), 1.5, 4 }, - { { CONSTRUCTION }, "Construction", RGBf(0.1, 0.7, 0.1), 1.5, 0 }, - { { INACTIVE_GRP }, "InactiveGrp", RGBf(0.5, 0.3, 0.0), 1.5, 3 }, - { { DATUM }, "Datum", RGBf(0.0, 0.8, 0.0), 1.5, 0 }, - { { SOLID_EDGE }, "SolidEdge", RGBf(0.8, 0.8, 0.8), 1.0, 2 }, - { { CONSTRAINT }, "Constraint", RGBf(1.0, 0.1, 1.0), 1.0, 0 }, - { { SELECTED }, "Selected", RGBf(1.0, 0.0, 0.0), 1.5, 0 }, - { { HOVERED }, "Hovered", RGBf(1.0, 1.0, 0.0), 1.5, 0 }, - { { CONTOUR_FILL }, "ContourFill", RGBf(0.0, 0.1, 0.1), 1.0, 0 }, - { { NORMALS }, "Normals", RGBf(0.0, 0.4, 0.4), 1.0, 0 }, - { { ANALYZE }, "Analyze", RGBf(0.0, 1.0, 1.0), 3.0, 0 }, - { { DRAW_ERROR }, "DrawError", RGBf(1.0, 0.0, 0.0), 8.0, 0 }, - { { DIM_SOLID }, "DimSolid", RGBf(0.1, 0.1, 0.1), 1.0, 0 }, - { { HIDDEN_EDGE }, "HiddenEdge", RGBf(0.8, 0.8, 0.8), 1.0, 1 }, - { { OUTLINE }, "Outline", RGBf(0.8, 0.8, 0.8), 3.0, 5 }, - { { 0 }, NULL, RGBf(0.0, 0.0, 0.0), 0.0, 0 } + { { ACTIVE_GRP }, "ActiveGrp", RGBf(1.0, 1.0, 1.0), 1.5, 4, true }, + { { CONSTRUCTION }, "Construction", RGBf(0.1, 0.7, 0.1), 1.5, 0, false }, + { { INACTIVE_GRP }, "InactiveGrp", RGBf(0.5, 0.3, 0.0), 1.5, 3, true }, + { { DATUM }, "Datum", RGBf(0.0, 0.8, 0.0), 1.5, 0, true }, + { { SOLID_EDGE }, "SolidEdge", RGBf(0.8, 0.8, 0.8), 1.0, 2, true }, + { { CONSTRAINT }, "Constraint", RGBf(1.0, 0.1, 1.0), 1.0, 0, true }, + { { SELECTED }, "Selected", RGBf(1.0, 0.0, 0.0), 1.5, 0, true }, + { { HOVERED }, "Hovered", RGBf(1.0, 1.0, 0.0), 1.5, 0, true }, + { { CONTOUR_FILL }, "ContourFill", RGBf(0.0, 0.1, 0.1), 1.0, 0, true }, + { { NORMALS }, "Normals", RGBf(0.0, 0.4, 0.4), 1.0, 0, true }, + { { ANALYZE }, "Analyze", RGBf(0.0, 1.0, 1.0), 3.0, 0, true }, + { { DRAW_ERROR }, "DrawError", RGBf(1.0, 0.0, 0.0), 8.0, 0, true }, + { { DIM_SOLID }, "DimSolid", RGBf(0.1, 0.1, 0.1), 1.0, 0, true }, + { { HIDDEN_EDGE }, "HiddenEdge", RGBf(0.8, 0.8, 0.8), 1.0, 1, true }, + { { OUTLINE }, "Outline", RGBf(0.8, 0.8, 0.8), 3.0, 5, true }, + { { 0 }, NULL, RGBf(0.0, 0.0, 0.0), 0.0, 0, true } }; std::string Style::CnfColor(const std::string &prefix) { @@ -35,6 +35,9 @@ std::string Style::CnfWidth(const std::string &prefix) { std::string Style::CnfTextHeight(const std::string &prefix) { return "Style_" + prefix + "_TextHeight"; } +std::string Style::CnfExportable(const std::string &prefix) { + return "Style_" + prefix + "_Exportable"; +} std::string Style::CnfPrefixToName(const std::string &prefix) { std::string name = "#def-"; @@ -97,7 +100,9 @@ void Style::FillDefaultStyle(Style *s, const Default *d, bool factory) { s->textOrigin = TextOrigin::NONE; s->textAngle = 0; s->visible = true; - s->exportable = true; + s->exportable = (factory) + ? d->exportable + : settings->ThawBool(CnfExportable(d->cnfPrefix), d->exportable); s->filled = false; s->fillColor = RGBf(0.3, 0.3, 0.3); s->stippleType = (d->h.v == Style::HIDDEN_EDGE) ? StipplePattern::DASH @@ -121,6 +126,7 @@ void Style::FreezeDefaultStyles(Platform::SettingsRef settings) { settings->FreezeColor(CnfColor(d->cnfPrefix), Color(d->h)); settings->FreezeFloat(CnfWidth(d->cnfPrefix), (float)Width(d->h)); settings->FreezeFloat(CnfTextHeight(d->cnfPrefix), (float)TextHeight(d->h)); + settings->FreezeBool(CnfExportable(d->cnfPrefix), Exportable(d->h.v)); } } @@ -850,17 +856,19 @@ void TextWindow::ShowStyleInfo() { ((uint32_t)s->textOrigin & (uint32_t)Style::TextOrigin::TOP) ? RADIO_TRUE : RADIO_FALSE); } - if(s->h.v >= Style::FIRST_CUSTOM) { - Printf(false, ""); + Printf(false, ""); + if(s->h.v >= Style::FIRST_CUSTOM) { Printf(false, " %Fd%D%f%Lv%s show these objects on screen%E", s->h.v, &ScreenChangeStyleYesNo, s->visible ? CHECK_TRUE : CHECK_FALSE); + } - Printf(false, " %Fd%D%f%Le%s export these objects%E", - s->h.v, &ScreenChangeStyleYesNo, - s->exportable ? CHECK_TRUE : CHECK_FALSE); + Printf(false, " %Fd%D%f%Le%s export these objects%E", + s->h.v, &ScreenChangeStyleYesNo, + s->exportable ? CHECK_TRUE : CHECK_FALSE); + if(s->h.v >= Style::FIRST_CUSTOM) { Printf(false, ""); Printf(false, "To assign lines or curves to this style,"); Printf(false, "right-click them on the drawing."); From 52c4350b1c614b3af18fc951c22a75ced5c7bb86 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 20 Mar 2021 12:09:34 -0400 Subject: [PATCH 258/646] Add Turkish translation by mhalil (Mustafa Halil). --- res/CMakeLists.txt | 1 + res/locales.txt | 1 + res/locales/tr_TR.po | 2192 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 2194 insertions(+) create mode 100644 res/locales/tr_TR.po diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index 9152488d3..5b7c45d19 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -257,6 +257,7 @@ add_resources( locales/en_US.po locales/fr_FR.po locales/uk_UA.po + locales/tr_TR.po locales/ru_RU.po locales/zh_CN.po fonts/unifont.hex.gz diff --git a/res/locales.txt b/res/locales.txt index 0f4fab16b..daedc309c 100644 --- a/res/locales.txt +++ b/res/locales.txt @@ -4,5 +4,6 @@ de-DE,0407,Deutsch en-US,0409,English (US) fr-FR,040C,Français ru-RU,0419,Русский +tr-TR,041F,Türkçe uk-UA,0422,Українська zh-CN,0804,简体中文 diff --git a/res/locales/tr_TR.po b/res/locales/tr_TR.po new file mode 100644 index 000000000..9e46b0dde --- /dev/null +++ b/res/locales/tr_TR.po @@ -0,0 +1,2192 @@ +# Turkish translations for SolveSpace package. +# 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-02-01 15:45+0200\n" +"PO-Revision-Date: 2021-03-09 22:58+0300\n" +"Last-Translator: Mustafa Halil GÖRENTAŞ \n" +"Language-Team: app4soft\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.2\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: clipboard.cpp:310 +msgid "" +"Cut, paste, and copy work only in a workplane.\n" +"\n" +"Activate one with Sketch -> In Workplane." +msgstr "" +"İşi yalnızca bir çalışma düzleminde kesin, yapıştır ve kopyalayın.\n" +"\n" +"Çizim -> Çalışma Düzleminde menüsü ile bir düzlemi etkinleştirin." + +#: clipboard.cpp:327 +msgid "Clipboard is empty; nothing to paste." +msgstr "Pano boş; yapıştırılacak bir şey yok." + +#: clipboard.cpp:374 +msgid "Number of copies to paste must be at least one." +msgstr "Yapıştırılacak kopya sayısı en az bir olmalıdır." + +#: clipboard.cpp:390 textscreens.cpp:783 +msgid "Scale cannot be zero." +msgstr "Ölçek sıfır olamaz." + +#: clipboard.cpp:432 +msgid "Select one point to define origin of rotation." +msgstr "Dönüşün başlangıç noktasını tanımlamak için bir nokta seçin." + +#: clipboard.cpp:444 +msgid "Select two points to define translation vector." +msgstr "Öteleme vektörünü tanımlamak için iki nokta seçin." + +#: clipboard.cpp:454 +msgid "" +"Transformation is identity. So all copies will be exactly on top of each " +"other." +msgstr "Dönüşüm özdeştir. Yani tüm kopyalar tam olarak üst üste gelecek." + +#: clipboard.cpp:458 +msgid "Too many items to paste; split this into smaller pastes." +msgstr "Yapıştırılamayacak kadar çok öğe; bunu daha küçük yapıştımalara bölün." + +#: clipboard.cpp:463 +msgid "No workplane active." +msgstr "Etkin Çalışma Düzlemi yok." + +#: confscreen.cpp:418 +msgid "Bad format: specify coordinates as x, y, z" +msgstr "Hatalı biçim: koordinatları x, y, z olarak belirtin" + +#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +msgid "Bad format: specify color as r, g, b" +msgstr "Hatalı biçim: rengi r, g, b olarak belirtin" + +#: confscreen.cpp:454 +msgid "" +"The perspective factor will have no effect until you enable View -> Use " +"Perspective Projection." +msgstr "" +"Görünüm -> Perspektif Projeksiyonu Kullan'ı etkinleştirene kadar perspektif " +"çarpanının hiçbir etkisi olmayacaktır." + +#: confscreen.cpp:467 confscreen.cpp:477 +#, c-format +msgid "Specify between 0 and %d digits after the decimal." +msgstr "Ondalık basamak sonra 0 ile %d arasında basamak belirtin." + +#: confscreen.cpp:489 +msgid "Export scale must not be zero!" +msgstr "Dışa aktarma ölçeği sıfır olmamalıdır!" + +#: confscreen.cpp:501 +msgid "Cutter radius offset must not be negative!" +msgstr "Kesici yarıçap ofseti negatif olmamalıdır!" + +#: confscreen.cpp:555 +msgid "Bad value: autosave interval should be positive" +msgstr "Hatalı değer: otomatik kaydetme süresi pozitif olmalıdır" + +#: confscreen.cpp:558 +msgid "Bad format: specify interval in integral minutes" +msgstr "Hatalı biçim: süre aralığını dakika cinsinden belirtin" + +#: constraint.cpp:12 +msgctxt "constr-name" +msgid "pts-coincident" +msgstr "nktlar-kesişen" + +#: constraint.cpp:13 +msgctxt "constr-name" +msgid "pt-pt-distance" +msgstr "nkt-nkt-mesafe" + +#: constraint.cpp:14 +msgctxt "constr-name" +msgid "pt-line-distance" +msgstr "nkt-çizgi-mesafesi" + +#: constraint.cpp:15 +msgctxt "constr-name" +msgid "pt-plane-distance" +msgstr "nkt-düzlem-mesafesi" + +#: constraint.cpp:16 +msgctxt "constr-name" +msgid "pt-face-distance" +msgstr "nkt-yüzey-mesafesi" + +#: constraint.cpp:17 +msgctxt "constr-name" +msgid "proj-pt-pt-distance" +msgstr "proj-nkt-nkt-mesafesi" + +#: constraint.cpp:18 +msgctxt "constr-name" +msgid "pt-in-plane" +msgstr "düzlemde-nkt" + +#: constraint.cpp:19 +msgctxt "constr-name" +msgid "pt-on-line" +msgstr "nkt-çizgide" + +#: constraint.cpp:20 +msgctxt "constr-name" +msgid "pt-on-face" +msgstr "yüzeyde-nkt" + +#: constraint.cpp:21 +msgctxt "constr-name" +msgid "eq-length" +msgstr "eş-uzunluk" + +#: constraint.cpp:22 +msgctxt "constr-name" +msgid "eq-length-and-pt-ln-dist" +msgstr "eş-uzunluk-ve-çzg-nkt-mesafesi" + +#: constraint.cpp:23 +msgctxt "constr-name" +msgid "eq-pt-line-distances" +msgstr "eş-nkt-çizgi-mesafesi" + +#: constraint.cpp:24 +msgctxt "constr-name" +msgid "length-ratio" +msgstr "uzunluk-oranı" + +#: constraint.cpp:25 +msgctxt "constr-name" +msgid "length-difference" +msgstr "uzunluk-farkı" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "symmetric" +msgstr "simetrik" + +#: constraint.cpp:27 +msgctxt "constr-name" +msgid "symmetric-h" +msgstr "simetrik-y" + +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "symmetric-v" +msgstr "simetrik-d" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "symmetric-line" +msgstr "simetrik-çizgi" + +#: constraint.cpp:30 +msgctxt "constr-name" +msgid "at-midpoint" +msgstr "orta noktada" + +#: constraint.cpp:31 +msgctxt "constr-name" +msgid "horizontal" +msgstr "yatay" + +#: constraint.cpp:32 +msgctxt "constr-name" +msgid "vertical" +msgstr "dikey" + +#: constraint.cpp:33 +msgctxt "constr-name" +msgid "diameter" +msgstr "çap" + +#: constraint.cpp:34 +msgctxt "constr-name" +msgid "pt-on-circle" +msgstr "nkt-çemberde" + +#: constraint.cpp:35 +msgctxt "constr-name" +msgid "same-orientation" +msgstr "aynı-yön" + +#: constraint.cpp:36 +msgctxt "constr-name" +msgid "angle" +msgstr "açı" + +#: constraint.cpp:37 +msgctxt "constr-name" +msgid "parallel" +msgstr "paralel" + +#: constraint.cpp:38 +msgctxt "constr-name" +msgid "arc-line-tangent" +msgstr "yay-çizgi-teğet" + +#: constraint.cpp:39 +msgctxt "constr-name" +msgid "cubic-line-tangent" +msgstr "kubik-çizgi-teğet" + +#: constraint.cpp:40 +msgctxt "constr-name" +msgid "curve-curve-tangent" +msgstr "eğri-eğri-teğet" + +#: constraint.cpp:41 +msgctxt "constr-name" +msgid "perpendicular" +msgstr "dik" + +#: constraint.cpp:42 +msgctxt "constr-name" +msgid "eq-radius" +msgstr "eş-yarıçap" + +#: constraint.cpp:43 +msgctxt "constr-name" +msgid "eq-angle" +msgstr "eş-açı" + +#: constraint.cpp:44 +msgctxt "constr-name" +msgid "eq-line-len-arc-len" +msgstr "eş-çizgi-uzn-yay-uzn" + +#: constraint.cpp:45 +msgctxt "constr-name" +msgid "lock-where-dragged" +msgstr "sürüklendiği-yerde-kilitli" + +#: constraint.cpp:46 +msgctxt "constr-name" +msgid "comment" +msgstr "yorum" + +#: constraint.cpp:140 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "" +"Teğet, yay ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğeti " +"sınırlandırmadan önce bunları Sınırlandır -> Noktada ile sınırlandırın." + +#: constraint.cpp:158 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." +msgstr "" +"Teğet kübik ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğeti " +"sınırlandırmadan önce onları Sınırlandır -> Noktada ile sınırlandırın." + +#: constraint.cpp:183 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." +msgstr "" +"Eğriler bir uç noktayı paylaşmalıdır. Teğeti sınırlandırmadan önce onları " +"Sınırlandır -> Noktada ile sınırlandırın." + +#: constraint.cpp:231 +msgid "" +"Bad selection for distance / diameter constraint. This constraint can apply " +"to:\n" +"\n" +" * two points (distance between points)\n" +" * a line segment (length)\n" +" * two points and a line segment or normal (projected distance)\n" +" * a workplane and a point (minimum distance)\n" +" * a line segment and a point (minimum distance)\n" +" * a plane face and a point (minimum distance)\n" +" * a circle or an arc (diameter)\n" +msgstr "" +"Mesafe / çap sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki nokta (noktalar arasındaki mesafe)\n" +" * bir çizgi parçası (uzunluk)\n" +" * iki nokta ve bir çizgi parçası veya normal (öngörülen mesafe)\n" +" * bir çalışma düzlemi ve bir nokta (minimum mesafe)\n" +" * bir çizgi parçası ve bir nokta (minimum mesafe)\n" +" * bir düzlem yüzeyi ve bir nokta (minimum mesafe)\n" +" * bir daire veya yay (çap)\n" + +#: constraint.cpp:284 +msgid "" +"Bad selection for on point / curve / plane constraint. This constraint can " +"apply to:\n" +"\n" +" * two points (points coincident)\n" +" * a point and a workplane (point in plane)\n" +" * a point and a line segment (point on line)\n" +" * a point and a circle or arc (point on curve)\n" +" * a point and a plane face (point on face)\n" +msgstr "" +"Nokta / eğri / düzlem sınırlandırması için hatalı seçim. Bu sınırlandırma " +"şunlara uygulanabilir:\n" +"\n" +" * iki nokta (çakışan noktalar)\n" +" * bir nokta ve bir çalışma düzlemi (düzlemdeki nokta)\n" +" * bir nokta ve bir çizgi parçası (çizgi üzerinde nokta)\n" +" * bir nokta ve bir daire veya yay (eğri üzerinde nokta)\n" +" * bir nokta ve bir düzlem yüzeyi (yüzeyin üzerine gelin)\n" + +#: constraint.cpp:346 +msgid "" +"Bad selection for equal length / radius constraint. This constraint can " +"apply to:\n" +"\n" +" * two line segments (equal length)\n" +" * two line segments and two points (equal point-line distances)\n" +" * a line segment and two points (equal point-line distances)\n" +" * a line segment, and a point and line segment (point-line distance " +"equals length)\n" +" * four line segments or normals (equal angle between A,B and C,D)\n" +" * three line segments or normals (equal angle between A,B and B,C)\n" +" * two circles or arcs (equal radius)\n" +" * a line segment and an arc (line segment length equals arc length)\n" +msgstr "" +"Eşit uzunluk / yarıçap sınırlandırması için hatalı seçim. Bu sınırlandırma " +"şunlara uygulanabilir:\n" +"\n" +" * iki çizgi parçası (eşit uzunluk)\n" +" * iki çizgi parçası ve iki nokta (eşit nokta-çizgi mesafeleri)\n" +" * bir çizgi parçası ve iki nokta (eşit nokta-çizgi mesafeleri)\n" +" * bir çizgi parçası ve bir nokta ve çizgi parçası (nokta-çizgi mesafesi " +"uzunluğa eşittir)\n" +" * dört çizgi parçası veya normal (A, B ve C, D arasında eşit açı)\n" +" * üç çizgi parçası veya normal (A, B ve B, C arasında eşit açı)\n" +" * iki daire veya yay (eşit yarıçap)\n" +" * bir çizgi parçası ve bir yay (çizgi parçası uzunluğu yay uzunluğuna " +"eşittir)\n" + +#: constraint.cpp:385 +msgid "" +"Bad selection for length ratio constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +msgstr "" +"Uzunluk oranı sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki çizgi parçası\n" + +#: constraint.cpp:402 +msgid "" +"Bad selection for length difference constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments\n" +msgstr "" +"Uzunluk farkı sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki çizgi parçası\n" + +#: constraint.cpp:428 +msgid "" +"Bad selection for at midpoint constraint. This constraint can apply to:\n" +"\n" +" * a line segment and a point (point at midpoint)\n" +" * a line segment and a workplane (line's midpoint on plane)\n" +msgstr "" +"Orta nokta sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * bir çizgi parçası ve bir nokta (orta noktayı işaret edin)\n" +" * bir çizgi parçası ve bir çalışma düzlemi (düzlemdeki çizginin orta " +"noktası)\n" + +#: constraint.cpp:486 +msgid "" +"Bad selection for symmetric constraint. This constraint can apply to:\n" +"\n" +" * two points or a line segment (symmetric about workplane's coordinate " +"axis)\n" +" * line segment, and two points or a line segment (symmetric about line " +"segment)\n" +" * workplane, and two points or a line segment (symmetric about " +"workplane)\n" +msgstr "" +"Simetrik sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki nokta veya bir çizgi parçası (çalışma düzleminin koordinat ekseni " +"etrafında simetrik)\n" +" * çizgi parçası ve iki nokta veya bir çizgi parçası (çizgi parçası " +"etrafında simetrik)\n" +" * çalışma düzlemi ve iki nokta veya bir çizgi parçası (çalışma düzlemi " +"etrafında simetrik)\n" + +#: constraint.cpp:500 +msgid "" +"A workplane must be active when constraining symmetric without an explicit " +"symmetry plane." +msgstr "" +"Açık bir simetri düzlemi olmadan simetriyi sınırlandırırken bir çalışma " +"düzlemi etkin olmalıdır." + +#: constraint.cpp:530 +msgid "" +"Activate a workplane (with Sketch -> In Workplane) before applying a " +"horizontal or vertical constraint." +msgstr "" +"Yatay veya dikey bir sınırlandırma uygulamadan önce bir çalışma düzlemini " +"(Çizim -> Çalışma Düzleminde menüsü) etkinleştirin." + +#: constraint.cpp:543 +msgid "" +"Bad selection for horizontal / vertical constraint. This constraint can " +"apply to:\n" +"\n" +" * two points\n" +" * a line segment\n" +msgstr "" +"Yatay / dikey sınırlandırma için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki nokta\n" +" * bir çizgi parçası\n" + +#: constraint.cpp:564 +msgid "" +"Bad selection for same orientation constraint. This constraint can apply " +"to:\n" +"\n" +" * two normals\n" +msgstr "" +"Aynı yön sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki normal\n" + +#: constraint.cpp:614 +msgid "Must select an angle constraint." +msgstr "Bir açı sınırlaması seçilmelidir." + +#: constraint.cpp:627 +msgid "Must select a constraint with associated label." +msgstr "İlişkili etikete sahip bir sınırlama seçilmelidir." + +#: constraint.cpp:638 +msgid "" +"Bad selection for angle constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"Açı sınırlaması için hatalı seçim. Bu sınırlandırma şunlara uygulanabilir:\n" +"\n" +" * iki çizgi parçası\n" +" * bir çizgi parçası ve normal\n" +" * iki normal\n" + +#: constraint.cpp:701 +msgid "Curve-curve tangency must apply in workplane." +msgstr "Eğri-eğri teğetliği çalışma düzlemine uygulanmalıdır." + +#: constraint.cpp:711 +msgid "" +"Bad selection for parallel / tangent constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments (parallel)\n" +" * a line segment and a normal (parallel)\n" +" * two normals (parallel)\n" +" * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" +msgstr "" +"Paralel / teğet sınırlaması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki çizgi parçası (paralel)\n" +" * bir çizgi parçası ve normal (paralel)\n" +" * iki normal (paralel)\n" +" * bir uç noktayı paylaşan(teğet) iki çizgi parçası, yay veya " +"bezier'ler\n" + +#: constraint.cpp:729 +msgid "" +"Bad selection for perpendicular constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"Dikey sınırlama için hatalı seçim. Bu sınırlandırma şunlara uygulanabilir:\n" +"\n" +" * iki çizgi parçası\n" +" * bir çizgi parçası ve normal\n" +" * iki normal\n" + +#: constraint.cpp:744 +msgid "" +"Bad selection for lock point where dragged constraint. This constraint can " +"apply to:\n" +"\n" +" * a point\n" +msgstr "" +"Sürüklendiği yerde noktayı sınırlandırmak için hatalı seçim. Bu " +"sınırlandırma şunlara uygulanabilir:\n" +"\n" +"* bir nokta\n" + +#: constraint.cpp:755 +msgid "click center of comment text" +msgstr "yorum metninin merkezine tıklayın" + +#: export.cpp:19 +msgid "" +"No solid model present; draw one with extrudes and revolves, or use Export " +"2d View to export bare lines and curves." +msgstr "" +"Katı model yok; katılama ve döndürme komutları ile bir model çizin veya açık " +"çizgileri ve eğrileri dışa vermek için Görüntüyü 2d olarak Dışa Aktar'ı " +"kullanın." + +#: export.cpp:61 +msgid "" +"Bad selection for export section. Please select:\n" +"\n" +" * nothing, with an active workplane (workplane is section plane)\n" +" * a face (section plane through face)\n" +" * a point and two line segments (plane through point and parallel to " +"lines)\n" +msgstr "" +"Kesiti Dışa Aktarmak için hatalı seçim. Lütfen şunlardan birini seçin:\n" +"\n" +" * aktif bir çalışma düzleminde iken hiçbir şey seçmeyin (çalışma " +"düzlemi, kesit düzlemidir)\n" +" * bir yüzey (yüzeyden kesit düzlemi)\n" +" * bir nokta ve iki çizgi parçası (nokta boyunca düzlem ve çizgilere " +"paralel)\n" + +#: export.cpp:822 +msgid "Active group mesh is empty; nothing to export." +msgstr "Etkin Mesh grubu boş; dışa aktarılacak bir şey yok." + +#: exportvector.cpp:337 +msgid "freehand lines were replaced with continuous lines" +msgstr "serbest çizgiler, sürekli çizgilerle değiştirildi" + +#: exportvector.cpp:339 +msgid "zigzag lines were replaced with continuous lines" +msgstr "zikzak çizgiler sürekli çizgilerle değiştirildi" + +#: exportvector.cpp:593 +msgid "" +"Some aspects of the drawing have no DXF equivalent and were not exported:\n" +msgstr "Çizimin bazı yönlerinin DXF eşdeğeri yoktur ve dışa aktarılmamıştır:\n" + +#: exportvector.cpp:839 +msgid "" +"PDF page size exceeds 200 by 200 inches; many viewers may reject this file." +msgstr "" +"PDF sayfa boyutu 200 x 200 inç'i aşıyor; birçok görüntüleyici bu dosyayı " +"reddedebilir." + +#: file.cpp:44 group.cpp:91 +msgctxt "group-name" +msgid "sketch-in-plane" +msgstr "düzlemde çizim" + +#: file.cpp:62 +msgctxt "group-name" +msgid "#references" +msgstr "#referanslar" + +#: file.cpp:552 +msgid "The file is empty. It may be corrupt." +msgstr "Dosya boş. Bozuk olabilir." + +#: file.cpp:557 +msgid "" +"Unrecognized data in file. This file may be corrupt, or from a newer version " +"of the program." +msgstr "" +"Dosyada veriler tanınmadı. Bu dosya bozuk veya programın daha yeni bir " +"sürümü ile oluşturulmuş olabilir." + +#: file.cpp:867 +msgctxt "title" +msgid "Missing File" +msgstr "Eksik Dosya" + +#: file.cpp:868 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "\"%s\" bağlantılı dosya yok." + +#: file.cpp:870 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." +msgstr "" +"Yerini manuel olarak mı bulmak istiyorsunuz?\n" +"\n" +"Reddederseniz, eksik dosyaya bağlı olan geometri kalıcı olarak " +"kaldırılacaktır." + +#: file.cpp:873 +msgctxt "button" +msgid "&Yes" +msgstr "&Evet" + +#: file.cpp:875 +msgctxt "button" +msgid "&No" +msgstr "&Hayır" + +#: file.cpp:877 solvespace.cpp:569 +msgctxt "button" +msgid "&Cancel" +msgstr "&İptal" + +#: graphicswin.cpp:41 +msgid "&File" +msgstr "&Dosya" + +#: graphicswin.cpp:42 +msgid "&New" +msgstr "&Yeni" + +#: graphicswin.cpp:43 +msgid "&Open..." +msgstr "&Aç..." + +#: graphicswin.cpp:44 +msgid "Open &Recent" +msgstr "&Son Erişilenden Aç" + +#: graphicswin.cpp:45 +msgid "&Save" +msgstr "&Kaydet" + +#: graphicswin.cpp:46 +msgid "Save &As..." +msgstr "&Farklı kaydet..." + +#: graphicswin.cpp:48 +msgid "Export &Image..." +msgstr "&Resim olarak dışa aktar..." + +#: graphicswin.cpp:49 +msgid "Export 2d &View..." +msgstr "&Görüntüyü 2d olarak dışa aktar..." + +#: graphicswin.cpp:50 +msgid "Export 2d &Section..." +msgstr "&Kesiti 2d olarak dışa aktar..." + +#: graphicswin.cpp:51 +msgid "Export 3d &Wireframe..." +msgstr "3d &TelKafes olarak dışa aktar..." + +#: graphicswin.cpp:52 +msgid "Export Triangle &Mesh..." +msgstr "&Üçgensel Mesh olarak dışa aktar..." + +#: graphicswin.cpp:53 +msgid "Export &Surfaces..." +msgstr "Y&üzeyleri dışa aktar..." + +#: graphicswin.cpp:54 +msgid "Im&port..." +msgstr "&İçe Aktar..." + +#: graphicswin.cpp:57 +msgid "E&xit" +msgstr "&Çıkış" + +#: graphicswin.cpp:60 +msgid "&Edit" +msgstr "D&üzen" + +#: graphicswin.cpp:61 +msgid "&Undo" +msgstr "&Geri al" + +#: graphicswin.cpp:62 +msgid "&Redo" +msgstr "&Yinele" + +#: graphicswin.cpp:63 +msgid "Re&generate All" +msgstr "Tümünü Yeniden &Oluştur" + +#: graphicswin.cpp:65 +msgid "Snap Selection to &Grid" +msgstr "Seçimi &Izgaraya Tuttur" + +#: graphicswin.cpp:66 +msgid "Rotate Imported &90°" +msgstr "İçe Aktarılanları &90° Döndür" + +#: graphicswin.cpp:68 +msgid "Cu&t" +msgstr "&Kes" + +#: graphicswin.cpp:69 +msgid "&Copy" +msgstr "K&opyala" + +#: graphicswin.cpp:70 +msgid "&Paste" +msgstr "Y&apıştır" + +#: graphicswin.cpp:71 +msgid "Paste &Transformed..." +msgstr "&Dönüştürerek Yapıştır..." + +#: graphicswin.cpp:72 +msgid "&Delete" +msgstr "&Sil" + +#: graphicswin.cpp:74 +msgid "Select &Edge Chain" +msgstr "Kenar &Zincirini Seçin" + +#: graphicswin.cpp:75 +msgid "Select &All" +msgstr "&Tümünü Seç" + +#: graphicswin.cpp:76 +msgid "&Unselect All" +msgstr "Tüm Seçimi &Kaldır" + +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "&Çizgi Biçimi..." + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "&Projeksiyonu Görüntüle..." + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "Y&apılandır..." + +#: graphicswin.cpp:84 +msgid "&View" +msgstr "&Görünüm" + +#: graphicswin.cpp:85 +msgid "Zoom &In" +msgstr "&Yakınlaş" + +#: graphicswin.cpp:86 +msgid "Zoom &Out" +msgstr "&Uzaklaş" + +#: graphicswin.cpp:87 +msgid "Zoom To &Fit" +msgstr "&Sığacak Şekilde Yakınlaş" + +#: graphicswin.cpp:89 +msgid "Align View to &Workplane" +msgstr "Görünümü &Çalışma Düzlemine Hizala" + +#: graphicswin.cpp:90 +msgid "Nearest &Ortho View" +msgstr "En Yakın &Orto Görünüm" + +#: graphicswin.cpp:91 +msgid "Nearest &Isometric View" +msgstr "En Yakın &İzometrik Görünüm" + +#: graphicswin.cpp:92 +msgid "&Center View At Point" +msgstr "&Noktayı Merkezde Görüntüle" + +#: graphicswin.cpp:94 +msgid "Show Snap &Grid" +msgstr "&Izgarayı Göster" + +#: graphicswin.cpp:95 +msgid "Darken Inactive Solids" +msgstr "Aktif Olmayan Katıları &Koyulaştır" + +#: graphicswin.cpp:96 +msgid "Use &Perspective Projection" +msgstr "&Perspektif Projeksiyonu Kullanın" + +#: graphicswin.cpp:97 +msgid "Dimension &Units" +msgstr "Ölçü &Birimleri" + +#: graphicswin.cpp:98 +msgid "Dimensions in &Millimeters" +msgstr "&Milimetre cinsinden ölçü" + +#: graphicswin.cpp:99 +msgid "Dimensions in M&eters" +msgstr "M&etre cinsinden ölçü" + +#: graphicswin.cpp:100 +msgid "Dimensions in &Inches" +msgstr "&İnç cinsinden ölçü" + +#: graphicswin.cpp:102 +msgid "Show &Toolbar" +msgstr "&Araç Çubuğunu Göster" + +#: graphicswin.cpp:103 +msgid "Show Property Bro&wser" +msgstr "&Özellik Tarayıcısını Göster" + +#: graphicswin.cpp:105 +msgid "&Full Screen" +msgstr "&Tam Ekran" + +#: graphicswin.cpp:107 +msgid "&New Group" +msgstr "Yeni &Grup" + +#: graphicswin.cpp:108 +msgid "Sketch In &3d" +msgstr "&3d'de Çizim Yap" + +#: graphicswin.cpp:109 +msgid "Sketch In New &Workplane" +msgstr "&Yeni Çalışma Düzleminde Çizim Yap" + +#: graphicswin.cpp:111 +msgid "Step &Translating" +msgstr "Adım &Ötele" + +#: graphicswin.cpp:112 +msgid "Step &Rotating" +msgstr "Adım &Döndür" + +#: graphicswin.cpp:114 +msgid "E&xtrude" +msgstr "&Katıla" + +#: graphicswin.cpp:115 +msgid "&Helix" +msgstr "&Helis" + +#: graphicswin.cpp:116 +msgid "&Lathe" +msgstr "&Çark" + +#: graphicswin.cpp:117 +msgid "Re&volve" +msgstr "Dö&ndür" + +#: graphicswin.cpp:119 +msgid "Link / Assemble..." +msgstr "Bağla / Montajla..." + +#: graphicswin.cpp:120 +msgid "Link Recent" +msgstr "Son Erişilenden Bağla" + +#: graphicswin.cpp:122 +msgid "&Sketch" +msgstr "&Çizim" + +#: graphicswin.cpp:123 +msgid "In &Workplane" +msgstr "Ç&alışma Düzleminde" + +#: graphicswin.cpp:124 +msgid "Anywhere In &3d" +msgstr "&3d'de Herhangi Bir Yerde" + +#: graphicswin.cpp:126 +msgid "Datum &Point" +msgstr "Referasn &Noktası" + +#: graphicswin.cpp:127 +msgid "&Workplane" +msgstr "Ça&lışma Düzlemi" + +#: graphicswin.cpp:129 +msgid "Line &Segment" +msgstr "Çizgi &Parçası" + +#: graphicswin.cpp:130 +msgid "C&onstruction Line Segment" +msgstr "&Yapı Çizgisi Parçası" + +#: graphicswin.cpp:131 +msgid "&Rectangle" +msgstr "&Dikdörtgen" + +#: graphicswin.cpp:132 +msgid "&Circle" +msgstr "&Çember" + +#: graphicswin.cpp:133 +msgid "&Arc of a Circle" +msgstr "Çember &Yayı" + +#: graphicswin.cpp:134 +msgid "&Bezier Cubic Spline" +msgstr "Bezier Kübik &Eğri" + +#: graphicswin.cpp:136 +msgid "&Text in TrueType Font" +msgstr "TrueType Yazı Tipinde &Metin" + +#: graphicswin.cpp:137 +msgid "&Image" +msgstr "&Resim" + +#: graphicswin.cpp:139 +msgid "To&ggle Construction" +msgstr "Yap&ıyı Değiştir" + +#: graphicswin.cpp:140 +msgid "Tangent &Arc at Point" +msgstr "Noktada &Teğet Yay" + +#: graphicswin.cpp:141 +msgid "Split Curves at &Intersection" +msgstr "Kesişim yerinde Eğrileri &Böl" + +#: graphicswin.cpp:143 +msgid "&Constrain" +msgstr "&Sınırlandır" + +#: graphicswin.cpp:144 +msgid "&Distance / Diameter" +msgstr "&Mesafe / Çap" + +#: graphicswin.cpp:145 +msgid "Re&ference Dimension" +msgstr "&Referans Ölçü" + +#: graphicswin.cpp:146 +msgid "A&ngle" +msgstr "&Açı" + +#: graphicswin.cpp:147 +msgid "Reference An&gle" +msgstr "Referans A&çı" + +#: graphicswin.cpp:148 +msgid "Other S&upplementary Angle" +msgstr "Diğer &Bütünler Açı" + +#: graphicswin.cpp:149 +msgid "Toggle R&eference Dim" +msgstr "Ölçüyü Re&ferans Yap / Yapma" + +#: graphicswin.cpp:151 +msgid "&Horizontal" +msgstr "&Yatay" + +#: graphicswin.cpp:152 +msgid "&Vertical" +msgstr "&Dikey" + +#: graphicswin.cpp:154 +msgid "&On Point / Curve / Plane" +msgstr "&Noktada / Eğride / Düzlemde" + +#: graphicswin.cpp:155 +msgid "E&qual Length / Radius / Angle" +msgstr "&Eşit Uzunluk / Yarıçap / Açı" + +#: graphicswin.cpp:156 +msgid "Length Ra&tio" +msgstr "&Uzunluk Oranı" + +#: graphicswin.cpp:157 +msgid "Length Diff&erence" +msgstr "U&zunluk Farkı" + +#: graphicswin.cpp:158 +msgid "At &Midpoint" +msgstr "&Orta Noktada" + +#: graphicswin.cpp:159 +msgid "S&ymmetric" +msgstr "&Simetrik" + +#: graphicswin.cpp:160 +msgid "Para&llel / Tangent" +msgstr "&Paralel / Teğet" + +#: graphicswin.cpp:161 +msgid "&Perpendicular" +msgstr "D&ik" + +#: graphicswin.cpp:162 +msgid "Same Orient&ation" +msgstr "Aynı &Yön" + +#: graphicswin.cpp:163 +msgid "Lock Point Where &Dragged" +msgstr "Sürüklendiği Yerde Noktayı &Kilitle" + +#: graphicswin.cpp:165 +msgid "Comment" +msgstr "Y&orum" + +#: graphicswin.cpp:167 +msgid "&Analyze" +msgstr "&Analiz Et" + +#: graphicswin.cpp:168 +msgid "Measure &Volume" +msgstr "&Hacmi Ölçün" + +#: graphicswin.cpp:169 +msgid "Measure A&rea" +msgstr "&Alanı Ölçün" + +#: graphicswin.cpp:170 +msgid "Measure &Perimeter" +msgstr "&Çevre Uzunluğunu Ölçün" + +#: graphicswin.cpp:171 +msgid "Show &Interfering Parts" +msgstr "&Engelleyen Parçaları Göster" + +#: graphicswin.cpp:172 +msgid "Show &Naked Edges" +msgstr "A&çık Kenarları Göster" + +#: graphicswin.cpp:173 +msgid "Show &Center of Mass" +msgstr "&Kütle Merkezini Göster" + +#: graphicswin.cpp:175 +msgid "Show &Underconstrained Points" +msgstr "&Sınırlanmamış Noktaları Göster" + +#: graphicswin.cpp:177 +msgid "&Trace Point" +msgstr "&Noktayı İzle" + +#: graphicswin.cpp:178 +msgid "&Stop Tracing..." +msgstr "&İzlemeyi &Durdur..." + +#: graphicswin.cpp:179 +msgid "Step &Dimension..." +msgstr "Adım &Ölçüsü..." + +#: graphicswin.cpp:181 +msgid "&Help" +msgstr "&Yardım" + +#: graphicswin.cpp:182 +msgid "&Language" +msgstr "&Dil" + +#: graphicswin.cpp:183 +msgid "&Website / Manual" +msgstr "&Web sitesi / Kılavuz" + +#: graphicswin.cpp:185 +msgid "&About" +msgstr "&Hakkında" + +#: graphicswin.cpp:355 +msgid "(no recent files)" +msgstr "(yeni dosyalar yok)" + +#: graphicswin.cpp:363 +#, c-format +msgid "File '%s' does not exist." +msgstr "'%s' dosyası mevcut değil." + +#: graphicswin.cpp:725 +msgid "No workplane is active, so the grid will not appear." +msgstr "Etkin çalışma düzlemi yok, bu nedenle ızgara görünmeyecektir." + +#: graphicswin.cpp:740 +msgid "" +"The perspective factor is set to zero, so the view will always be a parallel " +"projection.\n" +"\n" +"For a perspective projection, modify the perspective factor in the " +"configuration screen. A value around 0.3 is typical." +msgstr "" +"Perspektif çarpanı sıfıra ayarlanmıştır, bu nedenle görünüm her zaman " +"paralel bir projeksiyon olacaktır.\n" +"\n" +"Perspektif bir projeksiyon için, konfigürasyon ekranındaki perspektif " +"çarpanını değiştirin. 0,3 civarında bir değer tipiktir." + +#: graphicswin.cpp:819 +msgid "" +"Select a point; this point will become the center of the view on screen." +msgstr "" +"Bir nokta seçin; bu nokta ekrandaki görüntünün merkezi haline gelecektir." + +#: graphicswin.cpp:1114 +msgid "No additional entities share endpoints with the selected entities." +msgstr "Hiçbir ek öğe, seçili öğeler ile uç noktaları paylaşmaz." + +#: graphicswin.cpp:1132 +msgid "" +"To use this command, select a point or other entity from an linked part, or " +"make a link group the active group." +msgstr "" +"Bu komutu kullanmak için, bağlantılı bir parçadan bir nokta veya başka bir " +"öğe seçin veya bir bağlantı grubunu etkin grup haline getirin." + +#: graphicswin.cpp:1155 +msgid "" +"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " +"to define the plane for the snap grid." +msgstr "" +"Etkin çalışma düzlemi yok. Tutturma ızgarasının düzlemini tanımlamak için " +"bir çalışma düzlemini (Çizim -> Çalışma Düzleminde menüsü ile) etkinleştirin." + +#: graphicswin.cpp:1162 +msgid "" +"Can't snap these items to grid; select points, text comments, or constraints " +"with a label. To snap a line, select its endpoints." +msgstr "" +"Bu öğeleri ızgaraya tutturamazsınız; noktaları, metin yorumlarını veya " +"sınırlamaları bir etiketle seçin. Bir çizgiyi tutturmak için uç noktalarını " +"seçin." + +#: graphicswin.cpp:1247 +msgid "No workplane selected. Activating default workplane for this group." +msgstr "" +"Çalışma düzlemi seçilmedi. Bu grup için varsayılan çalışma düzlemi " +"etkinleştiriliyor." + +#: graphicswin.cpp:1250 +msgid "" +"No workplane is selected, and the active group does not have a default " +"workplane. Try selecting a workplane, or activating a sketch-in-new-" +"workplane group." +msgstr "" +"Hiçbir çalışma düzlemi seçilmemiştir ve aktif grubun varsayılan bir çalışma " +"düzlemi yoktur. Bir çalışma düzlemi seçmeyi veya yeni çalışma düzleminde " +"çizim grubunu etkinleştirmeyi deneyin." + +#: graphicswin.cpp:1271 +msgid "" +"Bad selection for tangent arc at point. Select a single point, or select " +"nothing to set up arc parameters." +msgstr "" +"Noktada teğet yay oluşturmak için hatalı seçim. Tek bir nokta seçin veya yay " +"parametrelerini ayarlamak için hiçbir şey seçmeyin." + +#: graphicswin.cpp:1282 +msgid "click point on arc (draws anti-clockwise)" +msgstr "yayın ilk noktası için tıklayın (saat yönünün tersine çizilir)" + +#: graphicswin.cpp:1283 +msgid "click to place datum point" +msgstr "referans noktasını yerleştirmek için tıklayın" + +#: graphicswin.cpp:1284 +msgid "click first point of line segment" +msgstr "çizgi parçasının ilk noktası için tıklayın" + +#: graphicswin.cpp:1286 +msgid "click first point of construction line segment" +msgstr "yapı çizgisinin ilk noktası için tıklayın" + +#: graphicswin.cpp:1287 +msgid "click first point of cubic segment" +msgstr "kübik segmentin ilk noktası için tıklayın" + +#: graphicswin.cpp:1288 +msgid "click center of circle" +msgstr "çemberin merkezi için tıklayın" + +#: graphicswin.cpp:1289 +msgid "click origin of workplane" +msgstr "çalışma düzleminin merkezi için tıklayın" + +#: graphicswin.cpp:1290 +msgid "click one corner of rectangle" +msgstr "dikdörtgenin bir köşesi için tıklayın" + +#: graphicswin.cpp:1291 +msgid "click top left of text" +msgstr "metnin sol üst köşesi için tıklayın" + +#: graphicswin.cpp:1297 +msgid "click top left of image" +msgstr "resmin sol üst köşesi için tıklayın" + +#: graphicswin.cpp:1309 +msgid "" +"No entities are selected. Select entities before trying to toggle their " +"construction state." +msgstr "" +"Hiçbir öğe seçilmedi. Yapı durumlarını geçiş yapmaya çalışmadan önce öğeleri " +"seçin." + +#: group.cpp:86 +msgctxt "group-name" +msgid "sketch-in-3d" +msgstr "3d-içinde-çizim" + +#: group.cpp:142 +msgid "" +"Bad selection for new sketch in workplane. This group can be created with:\n" +"\n" +" * a point (through the point, orthogonal to coordinate axes)\n" +" * a point and two line segments (through the point, parallel to the " +"lines)\n" +" * a workplane (copy of the workplane)\n" +msgstr "" +"Çalışma düzleminde yeni taslak çizmek için hatalı seçim. Bu grup şunlarla " +"oluşturulabilir:\n" +"\n" +" * bir nokta (nokta boyunca, eksenleri koordine etmek için ortogonal)\n" +" * bir nokta ve iki çizgi parçası (noktadan, çizgilere paralel)\n" +" * bir çalışma düzlemi (çalışma düzleminin kopyası)\n" + +#: group.cpp:154 +msgid "" +"Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " +"will be extruded normal to the workplane." +msgstr "" +"Katılama işleminden önce bir çalışma düzlemini etkinleştirin (Çizim -> " +"Çalışma Düzleminde menüsü). Çizim, çalışma düzlemine dik olarak " +"katılanacaktır." + +#: group.cpp:163 +msgctxt "group-name" +msgid "extrude" +msgstr "katıla" + +#: group.cpp:168 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "Çark işlemi yalnızca düzlemsel çizimlere uygulanabilir." + +#: group.cpp:179 +msgid "" +"Bad selection for new lathe group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Yeni çark grubu için hatalı seçim. Bu grup şu şekilde oluşturulabilir:\n" +"\n" +" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel " +"bir eksen etrafında, nokta boyunca döndürülür )\n" +" * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n" + +#: group.cpp:189 +msgctxt "group-name" +msgid "lathe" +msgstr "çark" + +#: group.cpp:194 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "Döndürme işlemi yalnızca düzlemsel çizimlere uygulanabilir." + +#: group.cpp:205 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Yeni döndürme grup için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n" +"\n" +" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel, " +"noktadan geçen bir eksen etrafında döndürülür)\n" +" * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n" + +#: group.cpp:217 +msgctxt "group-name" +msgid "revolve" +msgstr "döndür" + +#: group.cpp:222 +msgid "Helix operation can only be applied to planar sketches." +msgstr "Helis işlemi yalnızca düzlemsel çizimlere uygulanabilir." + +#: group.cpp:233 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Yeni helis grubu için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n" +"\n" +" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel, " +"noktadan geçen bir eksen etrafında döndürülür)\n" +" * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n" + +#: group.cpp:245 +msgctxt "group-name" +msgid "helix" +msgstr "helis" + +#: group.cpp:258 +msgid "" +"Bad selection for new rotation. This group can be created with:\n" +"\n" +" * a point, while locked in workplane (rotate in plane, about that " +"point)\n" +" * a point and a line or a normal (rotate about an axis through the " +"point, and parallel to line / normal)\n" +msgstr "" +"Yeni çevirme için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n" +"\n" +" * çalışma düzleminde bir nokta, kilitli olduğu sürece (düzlemde o nokta " +"etrafında çevirin)\n" +" * bir nokta ve bir çizgi veya bir normal (nokta boyunca bir eksen " +"etrafında ve çizgiye / normale paralel çevirin)\n" + +#: group.cpp:271 +msgctxt "group-name" +msgid "rotate" +msgstr "çevir" + +#: group.cpp:282 +msgctxt "group-name" +msgid "translate" +msgstr "ötele" + +#: group.cpp:400 +msgid "(unnamed)" +msgstr "(isimsiz)" + +#: groupmesh.cpp:709 +msgid "not closed contour, or not all same style!" +msgstr "kapalı olmayan kontur veya tümü aynı biçimde değil!" + +#: groupmesh.cpp:722 +msgid "points not all coplanar!" +msgstr "noktaların hepsi aynı düzlemde değil!" + +#: groupmesh.cpp:724 +msgid "contour is self-intersecting!" +msgstr "kontur kendisiyle kesişiyor!" + +#: groupmesh.cpp:726 +msgid "zero-length edge!" +msgstr "sıfır-uzunlukta kenar!" + +#: modify.cpp:254 +msgid "Must be sketching in workplane to create tangent arc." +msgstr "Teğet yay oluşturmak için çalışma düzleminde çizim yapılmalıdır." + +#: modify.cpp:301 +msgid "" +"To create a tangent arc, select a point where two non-construction lines or " +"circles in this group and workplane join." +msgstr "" +"Bir teğet yay oluşturmak için, bu gruptaki iki yapı-dışı çizginin veya " +"dairenin ve çalışma düzleminin birleştiği bir nokta seçin." + +#: modify.cpp:388 +msgid "" +"Couldn't round this corner. Try a smaller radius, or try creating the " +"desired geometry by hand with tangency constraints." +msgstr "" +"Bu köşe yuvarlatılamadı. Daha küçük bir yarıçap deneyin veya teğet " +"sınırlamaları ile istenen geometriyi elle oluşturmayı deneyin." + +#: modify.cpp:597 +msgid "Couldn't split this entity; lines, circles, or cubics only." +msgstr "Bu öğeler bölünemedi; yalnızca çizgiler, çemberler veya küpler." + +#: modify.cpp:624 +msgid "Must be sketching in workplane to split." +msgstr "Bölmek için çalışma düzleminde çizim olmalı." + +#: modify.cpp:631 +msgid "" +"Select two entities that intersect each other (e.g. two lines/circles/arcs " +"or a line/circle/arc and a point)." +msgstr "" +"Birbiriyle kesişen iki öğe seçin (örneğin iki çizgi / çember / yay veya bir " +"çizgi / çember / yay ve bir nokta)." + +#: modify.cpp:736 +msgid "Can't split; no intersection found." +msgstr "Bölünemez; kesişim bulunamadı." + +#: mouse.cpp:559 +msgid "Assign to Style" +msgstr "Biçime Ata" + +#: mouse.cpp:575 +msgid "No Style" +msgstr "Biçim Yok" + +#: mouse.cpp:578 +msgid "Newly Created Custom Style..." +msgstr "Yeni Oluşturulan Özel Biçim ..." + +#: mouse.cpp:585 +msgid "Group Info" +msgstr "Grup Bilgisi" + +#: mouse.cpp:605 +msgid "Style Info" +msgstr "Biçim Bİlgisi" + +#: mouse.cpp:625 +msgid "Select Edge Chain" +msgstr "Kenar Zinciri Seçin" + +#: mouse.cpp:631 +msgid "Toggle Reference Dimension" +msgstr "Ölçü Referansını Değiştir" + +#: mouse.cpp:637 +msgid "Other Supplementary Angle" +msgstr "Diğer Bütünler Açı" + +#: mouse.cpp:642 +msgid "Snap to Grid" +msgstr "Izgaraya Tuttur" + +#: mouse.cpp:651 +msgid "Remove Spline Point" +msgstr "Eğri Noktasını Sil" + +#: mouse.cpp:686 +msgid "Add Spline Point" +msgstr "Eğri Noktası Ekle" + +#: mouse.cpp:690 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "Eğri noktası eklenemiyor: en fazla nokta sayısına ulaşıldı." + +#: mouse.cpp:715 +msgid "Toggle Construction" +msgstr "Yapıyı değiştir" + +#: mouse.cpp:730 +msgid "Delete Point-Coincident Constraint" +msgstr "Çakışan-Nokta Sınırlamasını Sil" + +#: mouse.cpp:749 +msgid "Cut" +msgstr "Kes" + +#: mouse.cpp:751 +msgid "Copy" +msgstr "Kopyala" + +#: mouse.cpp:755 +msgid "Select All" +msgstr "Tümünü Seç" + +#: mouse.cpp:760 +msgid "Paste" +msgstr "Yapıştır" + +#: mouse.cpp:762 +msgid "Paste Transformed..." +msgstr "Dönüştürerek Yapıştır..." + +#: mouse.cpp:767 +msgid "Delete" +msgstr "Sil" + +#: mouse.cpp:770 +msgid "Unselect All" +msgstr "Tüm Seçimi Kaldır" + +#: mouse.cpp:777 +msgid "Unselect Hovered" +msgstr "Fareyle Üzerine Gelinen Seçimi Kaldır" + +#: mouse.cpp:786 +msgid "Zoom to Fit" +msgstr "Sığdırmak için Yakınlaştır" + +#: mouse.cpp:988 mouse.cpp:1275 +msgid "click next point of line, or press Esc" +msgstr "çizginin sonraki noktası için tıklayın veya Esc tuşuna basın" + +#: mouse.cpp:994 +msgid "" +"Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"3d'de dikdörtgen çizilemez; önce Çizim -> Çalışma Düzleminde menüsü ile bir " +"çalışma düzlemini etkinleştirin." + +#: mouse.cpp:1028 +msgid "click to place other corner of rectangle" +msgstr "dikdörtgenin diğer köşesini yerleştirmek için tıklayın" + +#: mouse.cpp:1048 +msgid "click to set radius" +msgstr "yarıçapı ayarlamak için tıklayın" + +#: mouse.cpp:1053 +msgid "" +"Can't draw arc in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"3d'de yay çizemez; önce Çizim -> Çalışma Düzleminde menüsü ile bir çalışma " +"düzlemini etkinleştirin." + +#: mouse.cpp:1072 +msgid "click to place point" +msgstr "noktayı yerleştirmek için tıklayın" + +#: mouse.cpp:1088 +msgid "click next point of cubic, or press Esc" +msgstr "sonraki kübik noktayı tıklayın veya Esc tuşuna basın" + +#: mouse.cpp:1093 +msgid "" +"Sketching in a workplane already; sketch in 3d before creating new workplane." +msgstr "" +"Zaten bir çalışma düzleminde çizim yapılıyor; 3d'de çizim yapmadan önce yeni " +"çalışma düzlemi oluşturun." + +#: mouse.cpp:1109 +msgid "" +"Can't draw text in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"3d'de metin yazılamaz; önce Çizim -> Çalışma Düzleminde menüsü ile bir " +"çalışma düzlemini etkinleştirin." + +#: mouse.cpp:1126 +msgid "click to place bottom right of text" +msgstr "metnin sağ alt konumunu yerleştirmek için tıklayın" + +#: mouse.cpp:1132 +msgid "" +"Can't draw image in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"3d'de resim eklenemez; önce Çizim -> Çalışma Düzleminde menüsü ile bir " +"çalışma düzlemini etkinleştirin." + +#: mouse.cpp:1159 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "YENİ YORUM - DÜZENLEMEK İÇİN ÇİFT TIKLAYIN" + +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +msgctxt "file-type" +msgid "SolveSpace models" +msgstr "SolveSpace Modelleri" + +#: platform/gui.cpp:90 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "IDF devre kartı" + +#: platform/gui.cpp:94 +msgctxt "file-type" +msgid "PNG image" +msgstr "PNG Resmi" + +#: platform/gui.cpp:98 +msgctxt "file-type" +msgid "STL mesh" +msgstr "STL mesh" + +#: platform/gui.cpp:99 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" +msgstr "Wavefront OBJ mesh" + +#: platform/gui.cpp:100 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" +msgstr "Görüntüleyicili, Three.js-uyumlu mesh" + +#: platform/gui.cpp:101 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "Three.js-uyumlu mesh, yalnızca mesh" + +#: platform/gui.cpp:102 +msgctxt "file-type" +msgid "VRML text file" +msgstr "VRML metin dosyası" + +#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +msgctxt "file-type" +msgid "STEP file" +msgstr "STEP dosyası" + +#: platform/gui.cpp:110 +msgctxt "file-type" +msgid "PDF file" +msgstr "PDF dosyası" + +#: platform/gui.cpp:111 +msgctxt "file-type" +msgid "Encapsulated PostScript" +msgstr "Kapsüllenmiş PostScript" + +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "Ölçeklenebilir Vektör Grafikleri (SVG)" + +#: platform/gui.cpp:114 platform/gui.cpp:121 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" +msgstr "DXF dosyası (AutoCAD 2007)" + +#: platform/gui.cpp:115 +msgctxt "file-type" +msgid "HPGL file" +msgstr "HPGL dosyası" + +#: platform/gui.cpp:116 +msgctxt "file-type" +msgid "G Code" +msgstr "G Kodu" + +#: platform/gui.cpp:125 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" +msgstr "AutoCAD DXF ve DWG dosyaları" + +#: platform/gui.cpp:129 +msgctxt "file-type" +msgid "Comma-separated values" +msgstr "Virgülle ayrılmış değerler (CSV)" + +#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +msgid "untitled" +msgstr "isimsiz" + +#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1582 +msgctxt "title" +msgid "Save File" +msgstr "Dosyayı Kaydet" + +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1584 +msgctxt "title" +msgid "Open File" +msgstr "Dosyayı Aç" + +#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +msgctxt "button" +msgid "_Cancel" +msgstr "_İptal" + +#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +msgctxt "button" +msgid "_Save" +msgstr "_Kaydet" + +#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +msgctxt "button" +msgid "_Open" +msgstr "_Aç" + +#: solvespace.cpp:169 +msgctxt "title" +msgid "Autosave Available" +msgstr "Otomatik Kaydetme Kullanılabilir" + +#: solvespace.cpp:170 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "Bu çizim için otomatik kaydetme dosyası kullanılabilir." + +#: solvespace.cpp:171 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "Bunun yerine otomatik kaydetme dosyasını yüklemek istiyor musunuz?" + +#: solvespace.cpp:172 +msgctxt "button" +msgid "&Load autosave" +msgstr "&Otomatik kaydetmeyi yükle" + +#: solvespace.cpp:174 +msgctxt "button" +msgid "Do&n't Load" +msgstr "&Yükleme" + +#: solvespace.cpp:557 +msgctxt "title" +msgid "Modified File" +msgstr "Değiştirilen Dosya" + +#: solvespace.cpp:559 +#, c-format +msgctxt "dialog" +msgid "Do you want to save the changes you made to the sketch “%s”?" +msgstr "\"%s\" çiziminde yaptığınız değişiklikleri kaydetmek istiyor musunuz?" + +#: solvespace.cpp:562 +msgctxt "dialog" +msgid "Do you want to save the changes you made to the new sketch?" +msgstr "Yeni çizimde yaptığınız değişiklikleri kaydetmek istiyor musunuz?" + +#: solvespace.cpp:565 +msgctxt "dialog" +msgid "Your changes will be lost if you don't save them." +msgstr "Bunları kaydetmezseniz değişiklikleriniz kaybolur." + +#: solvespace.cpp:566 +msgctxt "button" +msgid "&Save" +msgstr "&Kaydet" + +#: solvespace.cpp:568 +msgctxt "button" +msgid "Do&n't Save" +msgstr "K&aydetme" + +#: solvespace.cpp:589 +msgctxt "title" +msgid "(new sketch)" +msgstr "(yeni çizim)" + +#: solvespace.cpp:596 +msgctxt "title" +msgid "Property Browser" +msgstr "Özellik Tarayıcısı" + +#: solvespace.cpp:658 +msgid "" +"Constraints are currently shown, and will be exported in the toolpath. This " +"is probably not what you want; hide them by clicking the link at the top of " +"the text window." +msgstr "" +"Sınırlamalar şu anda gösterilmektedir ve takım yolunda dışa aktarılacaktır. " +"Muhtemelen istediğiniz bu değil; metin penceresinin üst kısmındaki " +"bağlantıya tıklayarak bunları gizleyin." + +#: solvespace.cpp:730 +#, c-format +msgid "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." +msgstr "" +"Dosya türü '%s' dosya uzantısından tanımlanamıyor; .dxf veya .dwg'yi deneyin." + +#: solvespace.cpp:778 +msgid "Constraint must have a label, and must not be a reference dimension." +msgstr "Sınırlamanın bir etiketi olmalı ve bir referans ölçüsü olmamalıdır." + +#: solvespace.cpp:782 +msgid "Bad selection for step dimension; select a constraint." +msgstr "" +"Adım ölçüsü için hatalı seçim; bir nokta boyunca, eksenleri koordine etmek " +"için ortogonal seçin." + +#: solvespace.cpp:806 +msgid "The assembly does not interfere, good." +msgstr "Montaj engel değil, iyi." + +#: solvespace.cpp:822 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" +"Katı modelin hacmi:\n" +"\n" +" % s" + +#: solvespace.cpp:831 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" +"\n" +"Mevcut mesh grubunun hacmi:\n" +"\n" +" %s" + +#: solvespace.cpp:836 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" +"\n" +"\n" +"Eğri yüzeyler, üçgenler olarak yaklaştırılmıştır.\n" +"Bu, tipik olarak yaklaşık 1% hataya neden olur." + +#: solvespace.cpp:851 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"Seçilen yüzlerin yüzey alanı:\n" +"\n" +" %s\n" +"\n" +"Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" +"Bu, tipik olarak yaklaşık 1%% hataya neden olur." + +#: solvespace.cpp:860 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." +msgstr "" +"Bu grup, doğru biçimlendirilmiş 2d kapalı alan içermiyor. Açık, eş düzlemli " +"değil veya kendisiyle kesişiyor." + +#: solvespace.cpp:872 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"Bu grupta çizilen bölgenin alanı:\n" +"\n" +" %s\n" +"\n" +"Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" +"Bu, tipik olarak yaklaşık 1%% hataya neden olur." + +#: solvespace.cpp:892 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"Seçilen öğelerin toplam uzunluğu:\n" +"\n" +" %s\n" +"\n" +"Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" +"Bu, tipik olarak yaklaşık 1%% hataya neden olur." + +#: solvespace.cpp:898 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "" +"Çevre uzunluğu için hatalı seçim; çizgi parçalarını, yayları ve eğrileri " +"seçin." + +#: solvespace.cpp:914 +msgid "Bad selection for trace; select a single point." +msgstr "İzleme için hatalı seçim; tek bir nokta seçin." + +#: solvespace.cpp:941 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "\"%s\" ye yazılamadı" + +#: solvespace.cpp:971 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "Mesh kendisiyle kesişiyor (TAMAM değil, geçersiz)." + +#: solvespace.cpp:972 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "Mesh kendi kendine kesişmiyor (tamam, geçerli)." + +#: solvespace.cpp:974 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "Mesh'in açık kenarları var (tamam DEĞİL, geçersiz)." + +#: solvespace.cpp:975 +msgid "The mesh is watertight (okay, valid)." +msgstr "Mesh çok sıkı (tamam, geçerli)" + +#: solvespace.cpp:978 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" +"\n" +"\n" +"Model, %d yüzeylerden %d üçgen içerir." + +#: solvespace.cpp:982 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"Sıfır sorunlu kenar, iyi.%s" + +#: solvespace.cpp:985 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d sorunlu kenar, kötü.%s" + +#: solvespace.cpp:998 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" +"Bu SolveSpace'in %s sürümüdür.\n" +"\n" +"Daha fazla bilgi için, http://solvespace.com/ bkz.\n" +"\n" +"SolveSpace ücretsiz bir yazılımdır: GNU Genel Kamu \n" +"Lisansı (GPL) sürüm 3 veya daha sonraki hükümler altında \n" +"onu değiştirmekte ve / veya yeniden dağıtmakta özgürsünüz.\n" +"\n" +"Yasaların izin verdiği ölçüde GARANTİ YOKTUR. \n" +"Ayrıntılar için http://gnu.org/licenses/ adresini ziyaret edin.\n" +"\n" +"© 2008-% d Jonathan Westhues ve diğer yazarlar.\n" + +#: style.cpp:166 +msgid "" +"Can't assign style to an entity that's derived from another entity; try " +"assigning a style to this entity's parent." +msgstr "" +"Başka bir öğeden türetilen bir öğeye biçim atayamazsınız; bu öğenin üst " +"öğesine bir biçim atamayı deneyin." + +#: style.cpp:665 +msgid "Style name cannot be empty" +msgstr "Biçim adı boş olamaz" + +#: textscreens.cpp:741 +msgid "Can't repeat fewer than 1 time." +msgstr "1 defadan az tekrar edilemez." + +#: textscreens.cpp:745 +msgid "Can't repeat more than 999 times." +msgstr "999 defadan fazla tekrar edilemez." + +#: textscreens.cpp:770 +msgid "Group name cannot be empty" +msgstr "Grup adı boş olamaz" + +#: textscreens.cpp:813 +msgid "Opacity must be between zero and one." +msgstr "Şeffaflık değeri sıfır ile bir arasında olmalıdır." + +#: textscreens.cpp:848 +msgid "Radius cannot be zero or negative." +msgstr "Yarıçap sıfır veya negatif değer olamaz." + +#: toolbar.cpp:18 +msgid "Sketch line segment" +msgstr "Çizgi parçası ile taslak çizin" + +#: toolbar.cpp:20 +msgid "Sketch rectangle" +msgstr "Dikdörtgen çizin" + +#: toolbar.cpp:22 +msgid "Sketch circle" +msgstr "Çember çizin" + +#: toolbar.cpp:24 +msgid "Sketch arc of a circle" +msgstr "Bir çember yayı çizin" + +#: toolbar.cpp:26 +msgid "Sketch curves from text in a TrueType font" +msgstr "TrueType yazı tipindeki metinden eğriler çizin" + +#: toolbar.cpp:28 +msgid "Sketch image from a file" +msgstr "Bir dosyadan resim ekleyin" + +#: toolbar.cpp:30 +msgid "Create tangent arc at selected point" +msgstr "Seçilen noktada teğet yay oluşturun" + +#: toolbar.cpp:32 +msgid "Sketch cubic Bezier spline" +msgstr "Kübik Bezier Eğri Çizin" + +#: toolbar.cpp:34 +msgid "Sketch datum point" +msgstr "Referans Nokta Ekleyin" + +#: toolbar.cpp:36 +msgid "Toggle construction" +msgstr "Yapıyı değiştirin" + +#: toolbar.cpp:38 +msgid "Split lines / curves where they intersect" +msgstr "Çizgileri / eğrileri kesiştikleri yerde bölün" + +#: toolbar.cpp:42 +msgid "Constrain distance / diameter / length" +msgstr "Mesafeyi / çapı / uzunluğu sınırlandırın" + +#: toolbar.cpp:44 +msgid "Constrain angle" +msgstr "Açıyı sınırlandırın" + +#: toolbar.cpp:46 +msgid "Constrain to be horizontal" +msgstr "Yatay olarak sınırlandırın" + +#: toolbar.cpp:48 +msgid "Constrain to be vertical" +msgstr "Dikey olarak sınırlandırın" + +#: toolbar.cpp:50 +msgid "Constrain to be parallel or tangent" +msgstr "Paralel veya teğet olarak sınırlandırın" + +#: toolbar.cpp:52 +msgid "Constrain to be perpendicular" +msgstr "Dik olarak sınırlandırın" + +#: toolbar.cpp:54 +msgid "Constrain point on line / curve / plane / point" +msgstr "Noktayı çizgi / eğri / düzlem / nokta ile çakıştırarak sınırlandırın" + +#: toolbar.cpp:56 +msgid "Constrain symmetric" +msgstr "Simetrik olarak sınırlandırın" + +#: toolbar.cpp:58 +msgid "Constrain equal length / radius / angle" +msgstr "Eşit uzunluk / yarıçap / açı olarak sınırlandırın" + +#: toolbar.cpp:60 +msgid "Constrain normals in same orientation" +msgstr "Normalleri aynı yönde sınırlandırın" + +#: toolbar.cpp:62 +msgid "Other supplementary angle" +msgstr "Diğer bütünler açı" + +#: toolbar.cpp:64 +msgid "Toggle reference dimension" +msgstr "Ölçüyü Referans Yap / Yapma" + +#: toolbar.cpp:68 +msgid "New group extruding active sketch" +msgstr "Etkin çizimi katılayarak yeni grup oluşturun" + +#: toolbar.cpp:70 +msgid "New group rotating active sketch" +msgstr "Etkin çizimi döndürerek yeni grup oluşturun" + +#: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "Etkin çizimden sarmal yeni grup oluştur" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "Etkin çizimi döndürülür yeni grup oluşturun" + +#: toolbar.cpp:76 +msgid "New group step and repeat rotating" +msgstr "Adımlayarak ve tekrarlayarak yeni dönüş grup oluşturun" + +#: toolbar.cpp:78 +msgid "New group step and repeat translating" +msgstr "Adımlayarak ve tekrarlayarak yeni öteleme grup oluşturun" + +#: toolbar.cpp:80 +msgid "New group in new workplane (thru given entities)" +msgstr "" +"Yeni çalışma düzleminde yeni grup oluşturun (verilen öğeler aracılığıyla)" + +#: toolbar.cpp:82 +msgid "New group in 3d" +msgstr "3d'de yeni grup oluşturun" + +#: toolbar.cpp:84 +msgid "New group linking / assembling file" +msgstr "Bağlantı / Montaj dosyası ile yeni grup oluşturun" + +#: toolbar.cpp:88 +msgid "Nearest isometric view" +msgstr "En yakın izometrik görünüm" + +#: toolbar.cpp:90 +msgid "Align view to active workplane" +msgstr "Görünümü etkin çalışma düzlemine hizalayın" + +#: util.cpp:165 +msgctxt "title" +msgid "Error" +msgstr "Hata" + +#: util.cpp:165 +msgctxt "title" +msgid "Message" +msgstr "Mesaj" + +#: util.cpp:170 +msgctxt "button" +msgid "&OK" +msgstr "&Tamam" + +#: view.cpp:78 +msgid "Scale cannot be zero or negative." +msgstr "Ölçek sıfır veya negatif olamaz." + +#: view.cpp:90 view.cpp:99 +msgid "Bad format: specify x, y, z" +msgstr "Kötü biçim: x, y, z'yi belirtin" + +#~ msgctxt "file-type" +#~ msgid "Q3D Object file" +#~ msgstr "Q3D Object file" From ae89781734b43ab2e46aa13eb837c7d946f1a064 Mon Sep 17 00:00:00 2001 From: app4soft Date: Sat, 20 Mar 2021 23:02:00 +0200 Subject: [PATCH 259/646] Update uk_UA.po --- res/locales/uk_UA.po | 281 +++++++++++++++++++++++-------------------- 1 file changed, 149 insertions(+), 132 deletions(-) diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index 86ce77b46..0b09760fb 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -1,20 +1,21 @@ # Ukrainian translations for SolveSpace package. # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. -# AppSoft4 , 2017. +# app4soft , 2021. msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" -"Report-Msgid-Bugs-To: whitequark@whitequark.org\n" +"Report-Msgid-Bugs-To: https://github.com/solvespace/solvespace/issues\n" "POT-Creation-Date: 2021-02-01 15:45+0200\n" -"PO-Revision-Date: 2017-01-05 10:30+0000\n" -"Last-Translator: appsoft@ua.fm\n" -"Language-Team: OpenOrienteeringUkraine\n" +"PO-Revision-Date: 2021-03-09 23:34+0200\n" +"Last-Translator: https://github.com/Symbian9\n" +"Language-Team: app4soft\n" "Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.2\n" #: clipboard.cpp:310 msgid "" @@ -22,26 +23,29 @@ msgid "" "\n" "Activate one with Sketch -> In Workplane." msgstr "" +"Вирізання, вставка та копіювання працює лише у площині.\n" +"\n" +"Активуйте одну через Креслення -> У площині." #: clipboard.cpp:327 msgid "Clipboard is empty; nothing to paste." -msgstr "" +msgstr "Буфер обміну порожній; немає чого вставляти." #: clipboard.cpp:374 msgid "Number of copies to paste must be at least one." -msgstr "" +msgstr "Кількість копій для вставки має бути не менше одної." #: clipboard.cpp:390 textscreens.cpp:783 msgid "Scale cannot be zero." -msgstr "" +msgstr "Масштаб не може бути нульовим." #: clipboard.cpp:432 msgid "Select one point to define origin of rotation." -msgstr "" +msgstr "Оберіть одну точку для визначення центру обертання." #: clipboard.cpp:444 msgid "Select two points to define translation vector." -msgstr "" +msgstr "Оберіть дві точки для визначення вектору розміщення." #: clipboard.cpp:454 msgid "" @@ -50,97 +54,102 @@ msgid "" msgstr "" #: clipboard.cpp:458 +#, fuzzy msgid "Too many items to paste; split this into smaller pastes." -msgstr "" +msgstr "Забагато об'єктів для вставки; рзділіть копіювання на кілька етапів." #: clipboard.cpp:463 msgid "No workplane active." -msgstr "" +msgstr "Немає активної площини." #: confscreen.cpp:418 msgid "Bad format: specify coordinates as x, y, z" -msgstr "" +msgstr "Некоректний формат: визначте координати X, Y, Z" #: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 msgid "Bad format: specify color as r, g, b" -msgstr "" +msgstr "Некоректний формат: визначте колір як R, G, B" #: confscreen.cpp:454 +#, fuzzy msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." msgstr "" +"Значення перспективи не матиме ефекту допоки не ввімкнено Вигляд -> " +"Використовувати Перспективну проєкцію." #: confscreen.cpp:467 confscreen.cpp:477 #, c-format msgid "Specify between 0 and %d digits after the decimal." -msgstr "" +msgstr "Визначте кількість десяткових знаків від 0 до %d." #: confscreen.cpp:489 msgid "Export scale must not be zero!" -msgstr "" +msgstr "Масштаб експорту не може бути нульовим!" #: confscreen.cpp:501 msgid "Cutter radius offset must not be negative!" -msgstr "" +msgstr "Радіус відступу різання не може бути від'ємним!" #: confscreen.cpp:555 msgid "Bad value: autosave interval should be positive" -msgstr "" +msgstr "Некоректне значення: інтервал автозбереження має бути додатнім" #: confscreen.cpp:558 +#, fuzzy msgid "Bad format: specify interval in integral minutes" -msgstr "" +msgstr "Некоректний формат: визначте цілим числом інтервал у хвилинах" #: constraint.cpp:12 msgctxt "constr-name" msgid "pts-coincident" -msgstr "" +msgstr "співпадіння-тчк" #: constraint.cpp:13 msgctxt "constr-name" msgid "pt-pt-distance" -msgstr "" +msgstr "відстань-тчк-тчк" #: constraint.cpp:14 msgctxt "constr-name" msgid "pt-line-distance" -msgstr "" +msgstr "відстань-тчк-лінія" #: constraint.cpp:15 msgctxt "constr-name" msgid "pt-plane-distance" -msgstr "" +msgstr "відстань-тчк-площина" #: constraint.cpp:16 msgctxt "constr-name" msgid "pt-face-distance" -msgstr "" +msgstr "відстань-тчк-грань" #: constraint.cpp:17 msgctxt "constr-name" msgid "proj-pt-pt-distance" -msgstr "" +msgstr "проєційна-відстань-тчк-тчк" #: constraint.cpp:18 msgctxt "constr-name" msgid "pt-in-plane" -msgstr "" +msgstr "тчк-у-площині" #: constraint.cpp:19 msgctxt "constr-name" msgid "pt-on-line" -msgstr "" +msgstr "тчк-на-лінії" #: constraint.cpp:20 msgctxt "constr-name" msgid "pt-on-face" -msgstr "" +msgstr "тчк-на-грані" #: constraint.cpp:21 msgctxt "constr-name" msgid "eq-length" -msgstr "" +msgstr "рівні-довжини" #: constraint.cpp:22 msgctxt "constr-name" @@ -150,62 +159,62 @@ msgstr "" #: constraint.cpp:23 msgctxt "constr-name" msgid "eq-pt-line-distances" -msgstr "" +msgstr "рівна-відстань-тчк-лінія" #: constraint.cpp:24 msgctxt "constr-name" msgid "length-ratio" -msgstr "" +msgstr "пропорція-довжин" #: constraint.cpp:25 msgctxt "constr-name" msgid "length-difference" -msgstr "" +msgstr "різниця-довжин" #: constraint.cpp:26 msgctxt "constr-name" msgid "symmetric" -msgstr "" +msgstr "симетрія" #: constraint.cpp:27 msgctxt "constr-name" msgid "symmetric-h" -msgstr "" +msgstr "симетрія-вертикально" #: constraint.cpp:28 msgctxt "constr-name" msgid "symmetric-v" -msgstr "" +msgstr "симетрія-горизонтально" #: constraint.cpp:29 msgctxt "constr-name" msgid "symmetric-line" -msgstr "" +msgstr "симетрія-відносно-лінії" #: constraint.cpp:30 msgctxt "constr-name" msgid "at-midpoint" -msgstr "" +msgstr "на-середині" #: constraint.cpp:31 msgctxt "constr-name" msgid "horizontal" -msgstr "" +msgstr "горизонталь" #: constraint.cpp:32 msgctxt "constr-name" msgid "vertical" -msgstr "" +msgstr "вертикаль" #: constraint.cpp:33 msgctxt "constr-name" msgid "diameter" -msgstr "" +msgstr "діаметр" #: constraint.cpp:34 msgctxt "constr-name" msgid "pt-on-circle" -msgstr "" +msgstr "тчк-на-колі" #: constraint.cpp:35 msgctxt "constr-name" @@ -215,57 +224,57 @@ msgstr "" #: constraint.cpp:36 msgctxt "constr-name" msgid "angle" -msgstr "" +msgstr "кут" #: constraint.cpp:37 msgctxt "constr-name" msgid "parallel" -msgstr "" +msgstr "паралель" #: constraint.cpp:38 msgctxt "constr-name" msgid "arc-line-tangent" -msgstr "" +msgstr "дотичні-дуга-лінія" #: constraint.cpp:39 msgctxt "constr-name" msgid "cubic-line-tangent" -msgstr "" +msgstr "дотичні-сплайн-лінія" #: constraint.cpp:40 msgctxt "constr-name" msgid "curve-curve-tangent" -msgstr "" +msgstr "дотичні-крива-крива" #: constraint.cpp:41 msgctxt "constr-name" msgid "perpendicular" -msgstr "" +msgstr "перпендикуляр" #: constraint.cpp:42 msgctxt "constr-name" msgid "eq-radius" -msgstr "" +msgstr "рівнозначні-радіуси" #: constraint.cpp:43 msgctxt "constr-name" msgid "eq-angle" -msgstr "" +msgstr "рівнозначні-кути" #: constraint.cpp:44 msgctxt "constr-name" msgid "eq-line-len-arc-len" -msgstr "" +msgstr "рівнозначні-лінія-дуга" #: constraint.cpp:45 msgctxt "constr-name" msgid "lock-where-dragged" -msgstr "" +msgstr "фіксоване-положення" #: constraint.cpp:46 msgctxt "constr-name" msgid "comment" -msgstr "" +msgstr "коментар" #: constraint.cpp:140 msgid "" @@ -442,7 +451,7 @@ msgstr "" #: constraint.cpp:755 msgid "click center of comment text" -msgstr "" +msgstr "клікніть в місце де буде центр коментаря" #: export.cpp:19 msgid "" @@ -485,33 +494,35 @@ msgstr "" #: file.cpp:44 group.cpp:91 msgctxt "group-name" msgid "sketch-in-plane" -msgstr "" +msgstr "креслення-в-площині" #: file.cpp:62 msgctxt "group-name" msgid "#references" -msgstr "" +msgstr "#базові-площини" #: file.cpp:552 msgid "The file is empty. It may be corrupt." -msgstr "" +msgstr "Файл порожній. Він може бути пошкодженим." #: file.cpp:557 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." msgstr "" +"Нерозпізнані дані у файлі. Цей файл може бути пошкодженим або збереженим " +"новою версією програми." #: file.cpp:867 msgctxt "title" msgid "Missing File" -msgstr "" +msgstr "Втрачений Файл" #: file.cpp:868 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." -msgstr "" +msgstr "Приєднаний файл “%s” відсутній." #: file.cpp:870 msgctxt "dialog" @@ -525,17 +536,17 @@ msgstr "" #: file.cpp:873 msgctxt "button" msgid "&Yes" -msgstr "" +msgstr "&Так" #: file.cpp:875 msgctxt "button" msgid "&No" -msgstr "" +msgstr "&Ні" #: file.cpp:877 solvespace.cpp:569 msgctxt "button" msgid "&Cancel" -msgstr "" +msgstr "&Відмінити" #: graphicswin.cpp:41 msgid "&File" @@ -635,7 +646,7 @@ msgstr "Вставити &Трансфмованим..." #: graphicswin.cpp:72 msgid "&Delete" -msgstr "&Delete" +msgstr "&Видалити" #: graphicswin.cpp:74 msgid "Select &Edge Chain" @@ -651,19 +662,19 @@ msgstr "&Зняти Виділення з Усього" #: graphicswin.cpp:78 msgid "&Line Styles..." -msgstr "" +msgstr "Стилі &Ліній..." #: graphicswin.cpp:79 msgid "&View Projection..." -msgstr "" +msgstr "&Проекція Відображення..." #: graphicswin.cpp:81 msgid "Con&figuration..." -msgstr "" +msgstr "&Налаштування..." #: graphicswin.cpp:84 msgid "&View" -msgstr "&View" +msgstr "&Відображення" #: graphicswin.cpp:85 msgid "Zoom &In" @@ -691,7 +702,7 @@ msgstr "Найближчий &Ізометричний Вигляд" #: graphicswin.cpp:92 msgid "&Center View At Point" -msgstr "&Центрувати Вигляд На Точці" +msgstr "&Центрувати Вигляд на Точці" #: graphicswin.cpp:94 msgid "Show Snap &Grid" @@ -699,7 +710,7 @@ msgstr "Показати &Сітку Прикріплення" #: graphicswin.cpp:95 msgid "Darken Inactive Solids" -msgstr "" +msgstr "Затінювати Неактивні Тіла" #: graphicswin.cpp:96 msgid "Use &Perspective Projection" @@ -707,19 +718,19 @@ msgstr "Використовувати &Перспективну Проекці #: graphicswin.cpp:97 msgid "Dimension &Units" -msgstr "" +msgstr "Розмірні &Одиниці" #: graphicswin.cpp:98 msgid "Dimensions in &Millimeters" -msgstr "Розміри в &Міліметрах" +msgstr "Розміри у &Міліметрах" #: graphicswin.cpp:99 msgid "Dimensions in M&eters" -msgstr "" +msgstr "Розміри у &Метрах" #: graphicswin.cpp:100 msgid "Dimensions in &Inches" -msgstr "Розміри в &Дюймах" +msgstr "Розміри у &Дюймах" #: graphicswin.cpp:102 msgid "Show &Toolbar" @@ -739,11 +750,11 @@ msgstr "&Нова Група" #: graphicswin.cpp:108 msgid "Sketch In &3d" -msgstr "Креслення В &3d" +msgstr "Креслення в &3D" #: graphicswin.cpp:109 msgid "Sketch In New &Workplane" -msgstr "Креслення В Новій Робочій &Площині" +msgstr "Креслення в Новій &Площині" #: graphicswin.cpp:111 msgid "Step &Translating" @@ -759,7 +770,7 @@ msgstr "Ви&давити" #: graphicswin.cpp:115 msgid "&Helix" -msgstr "" +msgstr "&Спіраль" #: graphicswin.cpp:116 msgid "&Lathe" @@ -767,13 +778,15 @@ msgstr "&Виточити" #: graphicswin.cpp:117 msgid "Re&volve" -msgstr "" +msgstr "&Обертати" #: graphicswin.cpp:119 +#, fuzzy msgid "Link / Assemble..." msgstr "Приєднати / Монтувати..." #: graphicswin.cpp:120 +#, fuzzy msgid "Link Recent" msgstr "Приєднати Недавні" @@ -783,11 +796,11 @@ msgstr "&Креслення" #: graphicswin.cpp:123 msgid "In &Workplane" -msgstr "В Робочій &Площині" +msgstr "У Робочій &Площині" #: graphicswin.cpp:124 msgid "Anywhere In &3d" -msgstr "Будь-де В &3d" +msgstr "Будь-де В &3D" #: graphicswin.cpp:126 msgid "Datum &Point" @@ -823,11 +836,11 @@ msgstr "Кубічний Сплайн &Без'є" #: graphicswin.cpp:136 msgid "&Text in TrueType Font" -msgstr "&Текст з TrueType Шрифтом" +msgstr "&Текст із TrueType Шрифтом" #: graphicswin.cpp:137 msgid "&Image" -msgstr "" +msgstr "&Зображення" #: graphicswin.cpp:139 msgid "To&ggle Construction" @@ -947,7 +960,7 @@ msgstr "Показати &Приховані Ребра" #: graphicswin.cpp:173 msgid "Show &Center of Mass" -msgstr "" +msgstr "Показати &Центр Масс" #: graphicswin.cpp:175 msgid "Show &Underconstrained Points" @@ -983,16 +996,16 @@ msgstr "&Про програму" #: graphicswin.cpp:355 msgid "(no recent files)" -msgstr "" +msgstr "(нємає нещодавніх файлів)" #: graphicswin.cpp:363 #, c-format msgid "File '%s' does not exist." -msgstr "" +msgstr "Файл '%s' відсутній." #: graphicswin.cpp:725 msgid "No workplane is active, so the grid will not appear." -msgstr "" +msgstr "Відсутня активна площина - сітка не відображатиметься." #: graphicswin.cpp:740 msgid "" @@ -1195,7 +1208,7 @@ msgstr "" #: group.cpp:400 msgid "(unnamed)" -msgstr "" +msgstr "(безіменне)" #: groupmesh.cpp:709 msgid "not closed contour, or not all same style!" @@ -1211,7 +1224,7 @@ msgstr "" #: groupmesh.cpp:726 msgid "zero-length edge!" -msgstr "" +msgstr "ребро нульової довжини!" #: modify.cpp:254 msgid "Must be sketching in workplane to create tangent arc." @@ -1234,8 +1247,9 @@ msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" #: modify.cpp:624 +#, fuzzy msgid "Must be sketching in workplane to split." -msgstr "" +msgstr "Має бути накреслений у робочій площині для розділеня." #: modify.cpp:631 msgid "" @@ -1245,7 +1259,7 @@ msgstr "" #: modify.cpp:736 msgid "Can't split; no intersection found." -msgstr "" +msgstr "Неможливо розділити; відсутній перетин." #: mouse.cpp:559 msgid "Assign to Style" @@ -1394,12 +1408,12 @@ msgstr "" #: mouse.cpp:1159 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "" +msgstr "КОМЕНТАР -- ДВІЧІ КЛІКНІТЬ ДЛЯ РЕДАГУВАННЯ" #: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 msgctxt "file-type" msgid "SolveSpace models" -msgstr "" +msgstr "SolveSpace модель" #: platform/gui.cpp:90 msgctxt "file-type" @@ -1409,17 +1423,17 @@ msgstr "" #: platform/gui.cpp:94 msgctxt "file-type" msgid "PNG image" -msgstr "" +msgstr "PNG зображення" #: platform/gui.cpp:98 msgctxt "file-type" msgid "STL mesh" -msgstr "" +msgstr "STL меш" #: platform/gui.cpp:99 msgctxt "file-type" msgid "Wavefront OBJ mesh" -msgstr "" +msgstr "Wavefront OBJ меш" #: platform/gui.cpp:100 msgctxt "file-type" @@ -1434,17 +1448,17 @@ msgstr "" #: platform/gui.cpp:102 msgctxt "file-type" msgid "VRML text file" -msgstr "" +msgstr "VRML меш, текстовий формат" #: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 msgctxt "file-type" msgid "STEP file" -msgstr "" +msgstr "STEP файл" #: platform/gui.cpp:110 msgctxt "file-type" msgid "PDF file" -msgstr "" +msgstr "PDF файл" #: platform/gui.cpp:111 msgctxt "file-type" @@ -1454,93 +1468,93 @@ msgstr "" #: platform/gui.cpp:112 msgctxt "file-type" msgid "Scalable Vector Graphics" -msgstr "" +msgstr "Scalable Vector Graphics, векторний формат" #: platform/gui.cpp:114 platform/gui.cpp:121 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" -msgstr "" +msgstr "DXF файл (AutoCAD 2007)" #: platform/gui.cpp:115 msgctxt "file-type" msgid "HPGL file" -msgstr "" +msgstr "HPGL файл" #: platform/gui.cpp:116 msgctxt "file-type" msgid "G Code" -msgstr "" +msgstr "G Code" #: platform/gui.cpp:125 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" -msgstr "" +msgstr "AutoCAD DXF та DWG файли" #: platform/gui.cpp:129 msgctxt "file-type" msgid "Comma-separated values" -msgstr "" +msgstr "Comma-separated values" #: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 msgid "untitled" -msgstr "" +msgstr "без імені" #: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 #: platform/guiwin.cpp:1582 msgctxt "title" msgid "Save File" -msgstr "" +msgstr "Зберегти Файл" #: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 #: platform/guiwin.cpp:1584 msgctxt "title" msgid "Open File" -msgstr "" +msgstr "Відкрити Файл" #: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 msgctxt "button" msgid "_Cancel" -msgstr "" +msgstr "_Скасувати" #: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 msgctxt "button" msgid "_Save" -msgstr "" +msgstr "_Зберегти" #: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 msgctxt "button" msgid "_Open" -msgstr "" +msgstr "_Відкрити" #: solvespace.cpp:169 msgctxt "title" msgid "Autosave Available" -msgstr "" +msgstr "Наявні автозбереження" #: solvespace.cpp:170 msgctxt "dialog" msgid "An autosave file is available for this sketch." -msgstr "" +msgstr "Наявні автозбереження для цього креслення." #: solvespace.cpp:171 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" -msgstr "" +msgstr "Завантажити файл автозбереження?" #: solvespace.cpp:172 msgctxt "button" msgid "&Load autosave" -msgstr "" +msgstr "&Завантажити автозбереження" #: solvespace.cpp:174 msgctxt "button" msgid "Do&n't Load" -msgstr "" +msgstr "&Не Завантажувати" #: solvespace.cpp:557 msgctxt "title" msgid "Modified File" -msgstr "" +msgstr "Файл Змінено" #: solvespace.cpp:559 #, c-format @@ -1561,22 +1575,22 @@ msgstr "" #: solvespace.cpp:566 msgctxt "button" msgid "&Save" -msgstr "" +msgstr "&Зберегти" #: solvespace.cpp:568 msgctxt "button" msgid "Do&n't Save" -msgstr "" +msgstr "&Не Зберігати" #: solvespace.cpp:589 msgctxt "title" msgid "(new sketch)" -msgstr "" +msgstr "(нове креслення)" #: solvespace.cpp:596 msgctxt "title" msgid "Property Browser" -msgstr "" +msgstr "Браузер Властивостей" #: solvespace.cpp:658 msgid "" @@ -1605,12 +1619,15 @@ msgid "The assembly does not interfere, good." msgstr "" #: solvespace.cpp:822 -#, c-format +#, fuzzy, c-format msgid "" "The volume of the solid model is:\n" "\n" " %s" msgstr "" +"Об'єм тіла:\n" +"\n" +" %s" #: solvespace.cpp:831 #, c-format @@ -1679,7 +1696,7 @@ msgstr "" #: solvespace.cpp:941 #, c-format msgid "Couldn't write to '%s'" -msgstr "" +msgstr "Неможливо записати у '%s'" #: solvespace.cpp:971 msgid "The mesh is self-intersecting (NOT okay, invalid)." @@ -1750,27 +1767,27 @@ msgstr "" #: style.cpp:665 msgid "Style name cannot be empty" -msgstr "" +msgstr "Стиль не може містити порожнє ім'я" #: textscreens.cpp:741 msgid "Can't repeat fewer than 1 time." -msgstr "" +msgstr "Не можливо повторити менше 1 разу." #: textscreens.cpp:745 msgid "Can't repeat more than 999 times." -msgstr "" +msgstr "Не можливо повторити понад 999 разів." #: textscreens.cpp:770 msgid "Group name cannot be empty" -msgstr "" +msgstr "Група не може містити порожнє ім'я" #: textscreens.cpp:813 msgid "Opacity must be between zero and one." -msgstr "" +msgstr "Непрозорість має бути між 0 та 1." #: textscreens.cpp:848 msgid "Radius cannot be zero or negative." -msgstr "" +msgstr "Радіус не може бути нульовим чи від'ємним." #: toolbar.cpp:18 msgid "Sketch line segment" @@ -1794,7 +1811,7 @@ msgstr "Накреслити криві з тексту на TrueType шрифт #: toolbar.cpp:28 msgid "Sketch image from a file" -msgstr "" +msgstr "Вставити зображення з файлу" #: toolbar.cpp:30 msgid "Create tangent arc at selected point" @@ -1911,25 +1928,25 @@ msgstr "Вирівняти вигляд до активної робочої п #: util.cpp:165 msgctxt "title" msgid "Error" -msgstr "" +msgstr "Помилка" #: util.cpp:165 msgctxt "title" msgid "Message" -msgstr "" +msgstr "Повідомлення" #: util.cpp:170 msgctxt "button" msgid "&OK" -msgstr "" +msgstr "&OK" #: view.cpp:78 msgid "Scale cannot be zero or negative." -msgstr "" +msgstr "Масштаб не може бути нульовим чи від'ємним." #: view.cpp:90 view.cpp:99 msgid "Bad format: specify x, y, z" -msgstr "" +msgstr "Некоректний формат: визначте X, Y, Z" #~ msgid "Show Degrees of &Freedom" #~ msgstr "Показати Степені &Свободи" From 3c60a2a9f8591c8c86f009860fe83022cdd1264e Mon Sep 17 00:00:00 2001 From: robnee Date: Thu, 25 Mar 2021 20:50:44 -0400 Subject: [PATCH 260/646] export style for construction entities for edges --- src/drawentity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/drawentity.cpp b/src/drawentity.cpp index 00bcb28a8..5e1122ad3 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -26,7 +26,7 @@ void Entity::GenerateEdges(SEdgeList *el) { List lv = {}; sb->MakePwlInto(&lv); for(int j = 1; j < lv.n; j++) { - el->AddEdge(lv[j-1], lv[j], style.v, i); + el->AddEdge(lv[j-1], lv[j], Style::ForEntity(h).v, i); } lv.Clear(); } From bdde8f6ae9187d63ae8c9af6a7edfb00c7f748b2 Mon Sep 17 00:00:00 2001 From: robnee Date: Sat, 27 Mar 2021 11:35:59 -0400 Subject: [PATCH 261/646] Trigger redraw on load factory default styles --- src/style.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/style.cpp b/src/style.cpp index 19a1835c0..7f89e7b8d 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -389,6 +389,7 @@ void TextWindow::ScreenShowStyleInfo(int link, uint32_t v) { void TextWindow::ScreenLoadFactoryDefaultStyles(int link, uint32_t v) { Style::LoadFactoryDefaults(); SS.TW.GoToScreen(Screen::LIST_OF_STYLES); + SS.GW.persistentDirty = true; } void TextWindow::ScreenCreateCustomStyle(int link, uint32_t v) { From ab1efe7d495a6a838bc6c1b6d0a03017db47b930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Sat, 27 Mar 2021 14:48:31 +0100 Subject: [PATCH 262/646] Fix pathologically slow translate groups on Linux Major performance improvement on GCC with libstdc++. --- src/dsc.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/dsc.h b/src/dsc.h index 93403bca0..34190e620 100644 --- a/src/dsc.h +++ b/src/dsc.h @@ -467,11 +467,17 @@ class IdList { // Look to see if we already have something with the same handle value. ssassert(FindByIdNoOops(t->h) == nullptr, "Handle isn't unique"); - // Copy-construct at the end of the list. - new(&elem[n]) T(*t); + // Find out where the added element should be. + int pos = LowerBoundIndex(*t); + + // Shift everything from there to the end of the array. + new(&elem[n]) T(); + for (int i = n; i > pos; i--) + elem[i] = std::move(elem[i - 1]); + + // Copy-construct at the right place. + elem[pos] = T(*t); ++n; - // The item we just added is trivially sorted, so "merge" - std::inplace_merge(begin(), end() - 1, end(), Compare()); } T *FindById(H h) { From 737b07250a7c9697cb160bd7746449a69203c695 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 29 Mar 2021 13:43:50 -0400 Subject: [PATCH 263/646] Add some notes on ID lists, Entities, and Remap --- developer_docs/IdLists_Entities_and_Remap.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 developer_docs/IdLists_Entities_and_Remap.txt diff --git a/developer_docs/IdLists_Entities_and_Remap.txt b/developer_docs/IdLists_Entities_and_Remap.txt new file mode 100644 index 000000000..c0a595d89 --- /dev/null +++ b/developer_docs/IdLists_Entities_and_Remap.txt @@ -0,0 +1,17 @@ +Some notes about Entities, Entity IDs and the IdList structure +============================================================== +Sketch entities in SolveSpace are all of the same type without use of language support for polymorphism. The entity class is defined in sketch.h. That class contains an enum for each entity to define its type (line, arc, etc...) and some other members that can be used to store different things depending on the entity type. This means all entities are the same size, so some data may be reference by pointers from the entity (font, extra points, etc...) + +Entities in a sketch are kept in a global array (IdList) referenced by a unique Id (handle) and can be looked up by Id in log(n) time via binary search. In order to use binary seach the array must be kept in order sorted by Id. One problem is that insertion takes O(n) time because half the list (on average) must be shifted to make room for a new item. + +The IdList class is a template and is used for more than entites. + +EntityMap: +========== +Another important structure is the EntityMap and EntityKey defined in sketch.h This is what allows SovleSpace to update groups when earlier groups in the sketch are changed. If a rectangle is extruded to a box and items are constrained to entites on that box, the user can go back to the sketch and modify it. Entites can be added, modified an even deleted. So long as the entites that are later used to build upon are kept the later extrude group will pick up the changes from the 2D sketch and anything build on it will remain. + +The way this works is that each group has a member called remap, which is one of these maps. This is where my understanding is fuzzy. At the end of Group.cpp is a function called Group::CopyEntity() which is used to make new sketch entites when a group is created. These are generally copies of entities in the previous group, but there are exceptions. A point will be used to generate a line when extruding a 2D sketch. A point will also be "copied" to a circle for a Lathe group. For this reason, the entity key is derived by combining its previous key with something often called the CopyNumber or just remap (unfortunate). + +When a group is regenerated (the first time, or after a previous one is modified) entites are copied from the old group to the new one. For Step Translating and Rotating there may be many copies, and the copy number is literally N for the Nth copy except for the last one which gets an enum - it is common to constrain the last item, so it gets a large unique number so that constraints still refer to it if the number of copies changes. When an entity is copied like this a new handle is created unless there is already an entity in Remap that was created the same way. This is how constructions are preserved across underlying changes. + +There are some hard limits used in the hash table for the remap mechanism which limit the number of entites in a group (but not the global sketch). From 94fdf82df94d4cc656b5d858bc688d303c96e6ca Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 29 Mar 2021 13:52:41 -0400 Subject: [PATCH 264/646] formatting --- developer_docs/IdLists_Entities_and_Remap.txt | 44 ++++++++++++++++--- 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/developer_docs/IdLists_Entities_and_Remap.txt b/developer_docs/IdLists_Entities_and_Remap.txt index c0a595d89..03ea9d7f3 100644 --- a/developer_docs/IdLists_Entities_and_Remap.txt +++ b/developer_docs/IdLists_Entities_and_Remap.txt @@ -1,17 +1,49 @@ Some notes about Entities, Entity IDs and the IdList structure ============================================================== -Sketch entities in SolveSpace are all of the same type without use of language support for polymorphism. The entity class is defined in sketch.h. That class contains an enum for each entity to define its type (line, arc, etc...) and some other members that can be used to store different things depending on the entity type. This means all entities are the same size, so some data may be reference by pointers from the entity (font, extra points, etc...) +Sketch entities in SolveSpace are all of the same type without use of language +support for polymorphism. The entity class is defined in sketch.h. That class +contains an enum for each entity to define its type (line, arc, etc...) and some +other members that can be used to store different things depending on the entity +type. This means all entities are the same size, so some data may be reference +by pointers from the entity (font, extra points, etc...) -Entities in a sketch are kept in a global array (IdList) referenced by a unique Id (handle) and can be looked up by Id in log(n) time via binary search. In order to use binary seach the array must be kept in order sorted by Id. One problem is that insertion takes O(n) time because half the list (on average) must be shifted to make room for a new item. +Entities in a sketch are kept in a global array (IdList) referenced by a unique +Id (handle) and can be looked up by Id in log(n) time via binary search. In +order to use binary seach the array must be kept in order sorted by Id. One +problem is that insertion takes O(n) time because half the list (on average) +must be shifted to make room for a new item. The IdList class is a template and is used for more than entites. EntityMap: ========== -Another important structure is the EntityMap and EntityKey defined in sketch.h This is what allows SovleSpace to update groups when earlier groups in the sketch are changed. If a rectangle is extruded to a box and items are constrained to entites on that box, the user can go back to the sketch and modify it. Entites can be added, modified an even deleted. So long as the entites that are later used to build upon are kept the later extrude group will pick up the changes from the 2D sketch and anything build on it will remain. +Another important structure is the EntityMap and EntityKey defined in sketch.h +This is what allows SovleSpace to update groups when earlier groups in the +sketch are changed. If a rectangle is extruded to a box and items are +constrained to entites on that box, the user can go back to the sketch and +modify it. Entites can be added, modified an even deleted. So long as the +entites that are later used to build upon are kept the later extrude group will +pick up the changes from the 2D sketch and anything build on it will remain. -The way this works is that each group has a member called remap, which is one of these maps. This is where my understanding is fuzzy. At the end of Group.cpp is a function called Group::CopyEntity() which is used to make new sketch entites when a group is created. These are generally copies of entities in the previous group, but there are exceptions. A point will be used to generate a line when extruding a 2D sketch. A point will also be "copied" to a circle for a Lathe group. For this reason, the entity key is derived by combining its previous key with something often called the CopyNumber or just remap (unfortunate). +The way this works is that each group has a member called remap, which is one of +these maps. This is where my understanding is fuzzy. At the end of Group.cpp is +a function called Group::CopyEntity() which is used to make new sketch entites +when a group is created. These are generally copies of entities in the previous +group, but there are exceptions. A point will be used to generate a line when +extruding a 2D sketch. A point will also be "copied" to a circle for a Lathe +group. For this reason, the entity key is derived by combining its previous key +with something often called the CopyNumber or just remap (unfortunate). -When a group is regenerated (the first time, or after a previous one is modified) entites are copied from the old group to the new one. For Step Translating and Rotating there may be many copies, and the copy number is literally N for the Nth copy except for the last one which gets an enum - it is common to constrain the last item, so it gets a large unique number so that constraints still refer to it if the number of copies changes. When an entity is copied like this a new handle is created unless there is already an entity in Remap that was created the same way. This is how constructions are preserved across underlying changes. +When a group is regenerated (the first time, or after a previous one is +modified) entites are copied from the old group to the new one. For Step +Translating and Rotating there may be many copies, and the copy number is +literally N for the Nth copy except for the last one which gets an enum - it is +common to constrain the last item, so it gets a large unique number so that +constraints still refer to it if the number of copies changes. When an entity is +copied like this a new handle is created unless there is already an entity in +Remap that was created the same way. This is how constructions are preserved +across underlying changes. + +There are some hard limits used in the hash table for the remap mechanism which +limit the number of entites in a group (but not the global sketch). -There are some hard limits used in the hash table for the remap mechanism which limit the number of entites in a group (but not the global sketch). From 5be59d28f464d5711d4ef9a056cb9b2d6fe1112b Mon Sep 17 00:00:00 2001 From: robnee Date: Sat, 27 Mar 2021 11:12:01 -0400 Subject: [PATCH 265/646] Save stipple settings for default styles to config --- src/sketch.h | 6 ++++ src/style.cpp | 98 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 85 insertions(+), 19 deletions(-) diff --git a/src/sketch.h b/src/sketch.h index 68a912b39..bda0a983c 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -884,11 +884,14 @@ class Style { double width; int zIndex; bool exportable; + StipplePattern stippleType; } Default; static const Default Defaults[]; static std::string CnfColor(const std::string &prefix); static std::string CnfWidth(const std::string &prefix); + static std::string CnfStippleType(const std::string &prefix); + static std::string CnfStippleScale(const std::string &prefix); static std::string CnfTextHeight(const std::string &prefix); static std::string CnfPrefixToName(const std::string &prefix); static std::string CnfExportable(const std::string &prefix); @@ -918,7 +921,10 @@ class Style { static bool Exportable(int hs); static hStyle ForEntity(hEntity he); static StipplePattern PatternType(hStyle hs); + static double StippleScale(hStyle hs); static double StippleScaleMm(hStyle hs); + static std::string StipplePatternName(hStyle hs); + static StipplePattern StipplePatternFromString(std::string name); std::string DescriptionString() const; diff --git a/src/style.cpp b/src/style.cpp index 7f89e7b8d..b4ed841e4 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -8,22 +8,22 @@ #include "solvespace.h" const Style::Default Style::Defaults[] = { - { { ACTIVE_GRP }, "ActiveGrp", RGBf(1.0, 1.0, 1.0), 1.5, 4, true }, - { { CONSTRUCTION }, "Construction", RGBf(0.1, 0.7, 0.1), 1.5, 0, false }, - { { INACTIVE_GRP }, "InactiveGrp", RGBf(0.5, 0.3, 0.0), 1.5, 3, true }, - { { DATUM }, "Datum", RGBf(0.0, 0.8, 0.0), 1.5, 0, true }, - { { SOLID_EDGE }, "SolidEdge", RGBf(0.8, 0.8, 0.8), 1.0, 2, true }, - { { CONSTRAINT }, "Constraint", RGBf(1.0, 0.1, 1.0), 1.0, 0, true }, - { { SELECTED }, "Selected", RGBf(1.0, 0.0, 0.0), 1.5, 0, true }, - { { HOVERED }, "Hovered", RGBf(1.0, 1.0, 0.0), 1.5, 0, true }, - { { CONTOUR_FILL }, "ContourFill", RGBf(0.0, 0.1, 0.1), 1.0, 0, true }, - { { NORMALS }, "Normals", RGBf(0.0, 0.4, 0.4), 1.0, 0, true }, - { { ANALYZE }, "Analyze", RGBf(0.0, 1.0, 1.0), 3.0, 0, true }, - { { DRAW_ERROR }, "DrawError", RGBf(1.0, 0.0, 0.0), 8.0, 0, true }, - { { DIM_SOLID }, "DimSolid", RGBf(0.1, 0.1, 0.1), 1.0, 0, true }, - { { HIDDEN_EDGE }, "HiddenEdge", RGBf(0.8, 0.8, 0.8), 1.0, 1, true }, - { { OUTLINE }, "Outline", RGBf(0.8, 0.8, 0.8), 3.0, 5, true }, - { { 0 }, NULL, RGBf(0.0, 0.0, 0.0), 0.0, 0, true } + { { ACTIVE_GRP }, "ActiveGrp", RGBf(1.0, 1.0, 1.0), 1.5, 4, true, StipplePattern::CONTINUOUS }, + { { CONSTRUCTION }, "Construction", RGBf(0.1, 0.7, 0.1), 1.5, 0, false, StipplePattern::CONTINUOUS }, + { { INACTIVE_GRP }, "InactiveGrp", RGBf(0.5, 0.3, 0.0), 1.5, 3, true, StipplePattern::CONTINUOUS }, + { { DATUM }, "Datum", RGBf(0.0, 0.8, 0.0), 1.5, 0, true, StipplePattern::CONTINUOUS }, + { { SOLID_EDGE }, "SolidEdge", RGBf(0.8, 0.8, 0.8), 1.0, 2, true, StipplePattern::CONTINUOUS }, + { { CONSTRAINT }, "Constraint", RGBf(1.0, 0.1, 1.0), 1.0, 0, true, StipplePattern::CONTINUOUS }, + { { SELECTED }, "Selected", RGBf(1.0, 0.0, 0.0), 1.5, 0, true, StipplePattern::CONTINUOUS }, + { { HOVERED }, "Hovered", RGBf(1.0, 1.0, 0.0), 1.5, 0, true, StipplePattern::CONTINUOUS }, + { { CONTOUR_FILL }, "ContourFill", RGBf(0.0, 0.1, 0.1), 1.0, 0, true, StipplePattern::CONTINUOUS }, + { { NORMALS }, "Normals", RGBf(0.0, 0.4, 0.4), 1.0, 0, true, StipplePattern::CONTINUOUS }, + { { ANALYZE }, "Analyze", RGBf(0.0, 1.0, 1.0), 3.0, 0, true, StipplePattern::CONTINUOUS }, + { { DRAW_ERROR }, "DrawError", RGBf(1.0, 0.0, 0.0), 8.0, 0, true, StipplePattern::CONTINUOUS }, + { { DIM_SOLID }, "DimSolid", RGBf(0.1, 0.1, 0.1), 1.0, 0, true, StipplePattern::CONTINUOUS }, + { { HIDDEN_EDGE }, "HiddenEdge", RGBf(0.8, 0.8, 0.8), 1.0, 1, true, StipplePattern::DASH }, + { { OUTLINE }, "Outline", RGBf(0.8, 0.8, 0.8), 3.0, 5, true, StipplePattern::CONTINUOUS }, + { { 0 }, NULL, RGBf(0.0, 0.0, 0.0), 0.0, 0, true, StipplePattern::CONTINUOUS } }; std::string Style::CnfColor(const std::string &prefix) { @@ -32,6 +32,12 @@ std::string Style::CnfColor(const std::string &prefix) { std::string Style::CnfWidth(const std::string &prefix) { return "Style_" + prefix + "_Width"; } +std::string Style::CnfStippleType(const std::string &prefix) { + return "Style_" + prefix + "_StippleType"; +} +std::string Style::CnfStippleScale(const std::string &prefix) { + return "Style_" + prefix + "_StippleScale"; +} std::string Style::CnfTextHeight(const std::string &prefix) { return "Style_" + prefix + "_TextHeight"; } @@ -105,9 +111,13 @@ void Style::FillDefaultStyle(Style *s, const Default *d, bool factory) { : settings->ThawBool(CnfExportable(d->cnfPrefix), d->exportable); s->filled = false; s->fillColor = RGBf(0.3, 0.3, 0.3); - s->stippleType = (d->h.v == Style::HIDDEN_EDGE) ? StipplePattern::DASH - : StipplePattern::CONTINUOUS; - s->stippleScale = 15.0; + s->stippleType = (factory) + ? d->stippleType + : Style::StipplePatternFromString( + settings->ThawString(CnfStippleType(d->cnfPrefix), "")); + s->stippleScale = (factory) + ? 15.0 + : settings->ThawFloat(CnfStippleScale(d->cnfPrefix), 15.0); s->zIndex = d->zIndex; } @@ -125,6 +135,8 @@ void Style::FreezeDefaultStyles(Platform::SettingsRef settings) { for(d = &(Defaults[0]); d->h.v; d++) { settings->FreezeColor(CnfColor(d->cnfPrefix), Color(d->h)); settings->FreezeFloat(CnfWidth(d->cnfPrefix), (float)Width(d->h)); + settings->FreezeString(CnfStippleType(d->cnfPrefix), StipplePatternName(d->h)); + settings->FreezeFloat(CnfStippleScale(d->cnfPrefix), (float)StippleScale(d->h)); settings->FreezeFloat(CnfTextHeight(d->cnfPrefix), (float)TextHeight(d->h)); settings->FreezeBool(CnfExportable(d->cnfPrefix), Exportable(d->h.v)); } @@ -353,11 +365,59 @@ hStyle Style::ForEntity(hEntity he) { return hs; } +StipplePattern Style::StipplePatternFromString(std::string name) { + std::transform(name.begin(), name.end(), name.begin(), ::tolower); + if(name == "continuous") { + return StipplePattern::CONTINUOUS; + } else if(name == "shortdash") { + return StipplePattern::SHORT_DASH; + } else if(name == "dash") { + return StipplePattern::DASH; + } else if(name == "longdash") { + return StipplePattern::LONG_DASH; + } else if(name == "dashdot") { + return StipplePattern::DASH_DOT; + } else if(name == "dashdotdot") { + return StipplePattern::DASH_DOT_DOT; + } else if(name == "dot") { + return StipplePattern::DOT; + } else if(name == "freehand") { + return StipplePattern::FREEHAND; + } else if(name == "zigzag") { + return StipplePattern::ZIGZAG; + } + + return StipplePattern::CONTINUOUS; +} + StipplePattern Style::PatternType(hStyle hs) { Style *s = Get(hs); return s->stippleType; } +std::string Style::StipplePatternName(hStyle hs) { + Style *s = Get(hs); + switch(s->stippleType) { + case StipplePattern::CONTINUOUS: return "Continuous"; + case StipplePattern::SHORT_DASH: return "ShortDash"; + case StipplePattern::DASH: return "Dash"; + case StipplePattern::LONG_DASH: return "LongDash"; + case StipplePattern::DASH_DOT: return "DashDot"; + case StipplePattern::DASH_DOT_DOT: return "DashDotDot"; + case StipplePattern::DOT: return "Dot"; + case StipplePattern::FREEHAND: return "FreeHand"; + case StipplePattern::ZIGZAG: return "ZigZag"; + } + + return "CONTINUOUS"; +} + + +double Style::StippleScale(hStyle hs) { + Style *s = Get(hs); + return s->stippleScale; +} + double Style::StippleScaleMm(hStyle hs) { Style *s = Get(hs); if(s->widthAs == UnitsAs::MM) { From 295ad6c05466f1f6cd1ba18885a6c5ab1c7882bf Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Tue, 30 Mar 2021 11:35:04 +0200 Subject: [PATCH 266/646] CI: Lock qemu version to known working --- .github/workflows/cd.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 4cf7ab407..154b6faa2 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -135,6 +135,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: docker/setup-qemu-action@v1 + with: + image: tonistiigi/binfmt@sha256:df15403e06a03c2f461c1f7938b171fda34a5849eb63a70e2a2109ed5a778bde - uses: actions/checkout@v2 - name: Set Up Source run: rsync --filter=":- .gitignore" -r ./ pkg/snap/solvespace-snap-src From 3eda698f85b747b9573e02c2a86d703dd8e0a12b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Sun, 28 Mar 2021 19:05:03 +0200 Subject: [PATCH 267/646] GTK: make spacenavd work through its socket, too E.g. for when you have more than one user logged in, in which case spacenavd works only for the first of those X11 displays. We try to do it the old way first, so there should be no regressions. Also fixes storing non-booleans in bool variables. --- src/platform/guigtk.cpp | 74 +++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index 94247b458..e4bc3156c 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -34,6 +34,11 @@ #if defined(HAVE_SPACEWARE) # include # include +# if GTK_CHECK_VERSION(3, 20, 0) +# include +# else +# include +# endif #endif #include "solvespace.h" @@ -1039,15 +1044,7 @@ void Open3DConnexion() {} void Close3DConnexion() {} #if defined(HAVE_SPACEWARE) && defined(GDK_WINDOWING_X11) -static GdkFilterReturn GdkSpnavFilter(GdkXEvent *gdkXEvent, GdkEvent *gdkEvent, gpointer data) { - XEvent *xEvent = (XEvent *)gdkXEvent; - WindowImplGtk *window = (WindowImplGtk *)data; - - spnav_event spnavEvent; - if(!spnav_x11_event(xEvent, &spnavEvent)) { - return GDK_FILTER_CONTINUE; - } - +static void ProcessSpnavEvent(WindowImplGtk *window, const spnav_event &spnavEvent, bool shiftDown, bool controlDown) { switch(spnavEvent.type) { case SPNAV_EVENT_MOTION: { SixDofEvent event = {}; @@ -1058,8 +1055,8 @@ static GdkFilterReturn GdkSpnavFilter(GdkXEvent *gdkXEvent, GdkEvent *gdkEvent, event.rotationX = (double)spnavEvent.motion.rx * 0.001; event.rotationY = (double)spnavEvent.motion.ry * 0.001; event.rotationZ = (double)spnavEvent.motion.rz * -0.001; - event.shiftDown = xEvent->xmotion.state & ShiftMask; - event.controlDown = xEvent->xmotion.state & ControlMask; + event.shiftDown = shiftDown; + event.controlDown = controlDown; if(window->onSixDofEvent) { window->onSixDofEvent(event); } @@ -1075,17 +1072,52 @@ static GdkFilterReturn GdkSpnavFilter(GdkXEvent *gdkXEvent, GdkEvent *gdkEvent, } switch(spnavEvent.button.bnum) { case 0: event.button = SixDofEvent::Button::FIT; break; - default: return GDK_FILTER_REMOVE; + default: return; } - event.shiftDown = xEvent->xmotion.state & ShiftMask; - event.controlDown = xEvent->xmotion.state & ControlMask; + event.shiftDown = shiftDown; + event.controlDown = controlDown; if(window->onSixDofEvent) { window->onSixDofEvent(event); } break; } +} + +static GdkFilterReturn GdkSpnavFilter(GdkXEvent *gdkXEvent, GdkEvent *gdkEvent, gpointer data) { + XEvent *xEvent = (XEvent *)gdkXEvent; + WindowImplGtk *window = (WindowImplGtk *)data; + bool shiftDown = (xEvent->xmotion.state & ShiftMask) != 0; + bool controlDown = (xEvent->xmotion.state & ControlMask) != 0; - return GDK_FILTER_REMOVE; + spnav_event spnavEvent; + if(spnav_x11_event(xEvent, &spnavEvent)) { + ProcessSpnavEvent(window, spnavEvent, shiftDown, controlDown); + return GDK_FILTER_REMOVE; + } + return GDK_FILTER_CONTINUE; +} + +static gboolean ConsumeSpnavQueue(GIOChannel *, GIOCondition, gpointer data) { + WindowImplGtk *window = (WindowImplGtk *)data; + Glib::RefPtr gdkWindow = window->gtkWindow.get_window(); + + // We don't get modifier state through the socket. + int x, y; + Gdk::ModifierType mask{}; +#if GTK_CHECK_VERSION(3, 20, 0) + Glib::RefPtr device = gdkWindow->get_display()->get_default_seat()->get_pointer(); +#else + Glib::RefPtr device = gdkWindow->get_display()->get_device_manager()->get_client_pointer(); +#endif + gdkWindow->get_device_position(device, x, y, mask); + bool shiftDown = (mask & Gdk::SHIFT_MASK) != 0; + bool controlDown = (mask & Gdk::CONTROL_MASK) != 0; + + spnav_event spnavEvent; + while(spnav_poll_event(&spnavEvent)) { + ProcessSpnavEvent(window, spnavEvent, shiftDown, controlDown); + } + return TRUE; } void Request3DConnexionEventsForWindow(WindowRef window) { @@ -1093,10 +1125,16 @@ void Request3DConnexionEventsForWindow(WindowRef window) { std::static_pointer_cast(window); Glib::RefPtr gdkWindow = windowImpl->gtkWindow.get_window(); - if(GDK_IS_X11_DISPLAY(gdkWindow->get_display()->gobj())) { + if(!GDK_IS_X11_DISPLAY(gdkWindow->get_display()->gobj())) { + return; + } + + if(spnav_x11_open(gdk_x11_get_default_xdisplay(), + gdk_x11_window_get_xid(gdkWindow->gobj())) != -1) { gdkWindow->add_filter(GdkSpnavFilter, windowImpl.get()); - spnav_x11_open(gdk_x11_get_default_xdisplay(), - gdk_x11_window_get_xid(gdkWindow->gobj())); + } else if(spnav_open() != -1) { + g_io_add_watch(g_io_channel_unix_new(spnav_fd()), G_IO_IN, + ConsumeSpnavQueue, windowImpl.get()); } } #else From ee9cec7208e34a501787e17aef974cfcc3eb43f2 Mon Sep 17 00:00:00 2001 From: dustinhartlyn <79132671+dustinhartlyn@users.noreply.github.com> Date: Thu, 1 Apr 2021 06:24:04 -0700 Subject: [PATCH 268/646] minor fix open/save dialogue on windows (#983) * minor fix open/save dialogue on windows On windows 10 the open/save dialogue box has an minor error, and I believe I fixed it. When "Open" is selected from the menu, the title of the dialogue box says "SolveSpace - Save File" and the entered file name is "united". My fix correctly titles the dialoged box, and leaves the address bar blank when a file is being opened because "united" is only needed as a default name when a file being saved. I found that class FileDialogImplWin32 from guiwin.cpp contains two if statements for "isSaveDialog". This is redundant. I removed the first where the title was originally set, but not working. I then set the title in the second if statement and moved the 'if isEmpty'' to this section. * Update guiwin.cpp replaced tabs with spaces --- src/platform/guiwin.cpp | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index b93b87b4a..e98e87388 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1583,11 +1583,6 @@ class FileDialogImplWin32 final : public FileDialog { ofn.nMaxFile = sizeof(filenameWC) / sizeof(wchar_t); ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; - if(isSaveDialog) { - SetTitle(C_("title", "Save File")); - } else { - SetTitle(C_("title", "Open File")); - } } void SetTitle(std::string title) override { @@ -1640,13 +1635,14 @@ class FileDialogImplWin32 final : public FileDialog { } bool RunModal() override { - if(GetFilename().IsEmpty()) { - SetFilename(Path::From(_("untitled"))); - } - if(isSaveDialog) { + SetTitle(C_("title", "Save File")); + if(GetFilename().IsEmpty()) { + SetFilename(Path::From(_("untitled"))); + } return GetSaveFileNameW(&ofn) == TRUE; } else { + SetTitle(C_("title", "Open File")); return GetOpenFileNameW(&ofn) == TRUE; } } From 0cec5460b10c571929b1b14a7018374d2a581fd0 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 1 Apr 2021 17:28:43 -0400 Subject: [PATCH 269/646] correct the order of glyphs 2334, 2335 and 2312 in unicode.lff.gz font file. --- res/fonts/unicode.lff.gz | Bin 482562 -> 482562 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/res/fonts/unicode.lff.gz b/res/fonts/unicode.lff.gz index 6b1b04daf484b2d5e5d5281a74cb354bc1834f0d..f6e55fbfc9a12943edc73fee0c604d6e92c196ef 100644 GIT binary patch delta 478882 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%0A4lJ?*(&ZgvW#xjpup3- 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%0DJpLu2W{(tF4QdTmN(Il^) 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 z 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 z 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 E2PzyAUh&CNjl{UX!4J7$+Sy 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'{|9>14Ex zLs9x~r`ZAqOJXBMk4r)ytr#pOh}$RzE7|EJr_V5EgIt(-%@X87bbs%c4gCd!Xk%=D zj35z41xzs)xBJ_AF@VLH94B&8lai7Y@P0vF6j~=Ukf+)LlDznsseg2DglJrf&UQk3 z!QF?+JqHQw{PEZpVSTq-4T5yFH0YWwvw5Sf7CJ=5^i)G)G@h3Z6m~u#{LGoUZ!s4z zxe)9Y+H3swm!N|nnwJi{O+FK=eO09MP1 zjuJ!EULv`3M*=A=;y>r(+LTlGK4__b9ZQ!y zW+(gQ>#(w4oY|_}_rSFfqRk3`uRd^AQ#nmRR|c!S zGFXpeVvonp_k|Zfr#$0FWgIDg^th;9!v}uy!Ozt%IJo1gvv;TVM9}t3FiN0EO2muj z@ppUt^~>W=2=p@zzf@k;+oLaG!*<(W7a}`LHX&BCkWYF~FQzCiLi$l?hkCnH7D5b{ zbk-^h@u=Au`w&8b!r&o{fLBNyj$sBJmRdNpLM-Oja?NQlSi;vum+CBkLmi=Mj?gsO zlC>BtrTw6ES8s<8!GNj7fMnD`t#+a9Ybp6J#hu3JAhvU%J)l3-!dOWTg^;FWNxFte za0c;O&pkGR7E7rf9Ral3s=u9qEn}1*+He3G>5DgXHV@+U(!OHbj14n#GrNBMpSvm* zXD+H^6VM4@-kg96Q=KP&*FEN0UDeKFU>3)17RRkq>fMTgBSd#AL94#8YtQuFeTHq% zc(Z{=9F&v!>y)dLuu3mT+(PXWgsz45q}bC4j=IoNnERY1h$Vf9F9bz><}5)AI!`PO zM*ZzEe|||Ws5wF@(`_l!m5h@5{0cF;**=RNMfp6X(bSY)-)Izn1C(}cVVz=N;(-NO zBHN4fh|n6GpD3-Wui7eRqu%mTod;rMP=&mWMOqS@6P<7adiM~S2_n&GFJvW%7Zq;c z0dK=H%vNERJfih(VbXL(oRzh()d4dP4sQ(!i-IFVpUm+7)V)5Sa-rJ{$$ zqmfy?&l0pc+fh}2X|$_ek_EzhGLF6{$uLl1i6x{rIf3s zmaF#?lxnV%?hJD%{rO;B00B>3Y)nSL5-VB=Xpz#05N*yT#aBX2)_Ip87h|1w30iLR zc9$TM<6*NZ#**wIE$n>I+~+_*?sgZaa85(Og{&Uez>};ySl5*66ESGXj}-T;w!d!r{Zg-;%lbjtEb|t z%NMOh`bkv6fP|zf@GkjBQp^ZqD!ogkpJ;V%`N)b1@eXR45#sQ@=m)aYtftm1eed9{ zVBLVWix7W*t&}9x?ZD}ec9)=(hSk)D>2oJV7=$=&cJV_A;>58o34SP^@EPP z0S}J&YeANUnYzl8^2Qgugr@}Y00@DUprzJc__abV7-_Wx**0bgq76D6SZj97_t*a& z`GSWDgwy;%@pgF_6Ib|THT3Cf=>0}MlN9Uu#P^+lPC~ObQeEBNIuEFoBE93mUh7v< zS|d%z8Xc-eH?oN`O~r(}>2s$ifBjEE>Z3;K zR#*b_jDXZbQL+HyN?_6Qnh2fVrxnpvGS5K7hcovLf(Woa@XU-c#r(u?~b zIq1?&ec9XyNUbk{G}nb_>r|r^TGFDlLao++K=!wjL{90g@5yV2Tkd(i4`+itdf%P{YkMfA}b{^$&WbcR7X!xt6W zvr1&mpp@iasmZ^7$gWg3PXw)nXghh15u%L*PIYVO?tyBsugM1qa81v5euMl|kyei` z(kcO%z+$oD`Q;XMY-c?9mXi(Px-9O05J!=Ui{;43ynING`%v9`5Z+~l?hlD^Pn`zC zW@R(EN(*?OYA^Q`gXN&LW7bvExERo7P`J*Ge5HPBK+DC=T*x-?JB4U_(Sw~RyFVoP zFJ#+&mLSLLyTkR^8)z|D7o)DKkEgyur-+cjQh#5_x(L~JJSAwUeBK>_RZMVyCe9+n zZ=tN-eE&^@-3YE*aTTVc?h>?fYFKagz96*Dv}IF>`nuw^UGds*+OjF_icgvL9KN?S z#&7&1vQXJk{-kF`fFiR>(kH>Xk~R<8YYJlk1`EFkA%GxW18P8AU3y`A6vJO8Aj`C| z@>htT=;Uv;D|9`!UFmgwBuOlPwA8J>igEF7gCeDnIm_cJK}#L%o8CKE8iz1h8zsmN zS66F@!TbrGW`o_?FgdDcN%g6(`Ow!qx7t&JRsscGr=Uh&($2qsmLTsYII{}v z-L%@n6`~EdA&55It{~fLD?u1cQUwZ=;7kK^p_T9H)5Fs|{hOzMV@eF6#US2NHpiU_ zBPNRIAmTw?))KTPPc8~9K06!y8~>zGAbDrTK6m56{jg4IhN+b;17aOX&|${SDvTK!gXoOA$ZeaKpFi( zmIeum1U#{*t%DHDky+PzdcS+HL|i3^v16251?{tCy6vLq4Q2TUtMd<*=7WJuKC%?6 zE=?i{O^`*b#ulAbaCMZR^&^=G@k;LSPaHazt*5i#SEbepLIHt)Atywe0!~6piVs!I zo7!jf+#Q*_=q7=n02|s9ahNC_EVRfJm|H2CU~#b}`LL7-wezVm6q_=!Psa{DJ zv`60Fh5_$C@+3ijYtZ+G&VUfh26tg$30e`rC@(3D&ciyCLWG=tL_|=CL&cpvEc=e4 zQuIF(T1<7ct@J~HwE#tS_5k8Q9ls+g`%c4W5aRu@AEC}f(d{sh1w;=uL)yTl1|O<4 zXg<%WM=dYKWM=SDl%T6fBgm>4XaQjTe(7j5Ed@8*qo5z!r8%?Ff0AHF=e1E+5FAd= zQGz%+RJ$U?ksuMr{tKJ-_8WgxsPT4w?z;7Tb@8}P<`bccBDB;|5%)ldkv=sDI^5<5 z!@lpPkOYg$4wX?u)b(#={G!LbUw?7qv33z8Iz1DeW^!zk;fldtg`&c^eNP-5sUG4$rx zxMaE2TnCw{1GOAPtC2{-aY(eJu8)Dpl0!IaYB^)ev_&FmodL3^7%ndiUJ_wy<6MGhBd?wy!B>T(e^rk)G?jw(*io56klpxa zmLS?NAA)RyHz`CLnEIcr@o*2al4fL|`*G|P5gwHkcoH|oU{Q@l5ZNUz>e3gTsm0hc z@)tKv{x|*%mG1{=WIJeI43@gzB9bMvPI5xf##?ByQ`gNVNUVL|$AFG+jDA|I?>kl2 zesJ43*AERFPxk-j)Ol0td`zd#gHK~PIT~k&4N#tpGNojf`QcYAwbY=-bM-Kv(m^4+LeAO(m zTSaeBmk2>zp{2HlkBa@UUe~pmhBR;xAP{D3RCx+M;LCad2({c$@5(=&ijNAyw z!?)V{3{~WvKF7JkdF8(Pv=ZbL=_8S7aUELNW?$LJe;}|0{0AZ09&@!%G3DDV25WDq zTmb|kf9-%fV$MVlXQKPC(@&pvdb&fjH_pT_BAD=(+LXyA-`PfieMLShc^(9oqo}O} zEwv=YwLIMO7;J;R1_-POFCiv!u)b1#;e^(utRdp7L@Zo0N$qs>VrYp8T8$L;u>&ze z`vk%k$xKf9zUlb(V@C$|A%sssVrG6mnf&g|63X zm6DQI0jdd%K|4N(sRS}A(W<0Df-f$_AF2Aw+jWSSmz2w7!|y8-RlVr00oW>Qw#u5V zvU;Kj(Pjcd^+dUDPZXi0wh51Zl_te`d!n58o9(tpB`3-mqR<(l&APV*CmW}f*+@RSdl)}cA!p4>jmb2?8n*{Nj{{y{;gYJYykS9jtonXgt z+Hj;8vvCW-34{GrmKsdp%C|IzQ4gEK&MaqSQFjFp95fonCxXv|ol7lAa*2~0sd9fo zNt}$->0!8_qcp_{_TN7ISs0_b4&N6!=r6{1blcOlwd z;mdqXZ5TI7ZMMBWQ{d97D$}x7j;GaSNhNN?k*~wwl3} zAZj1T*A^l-TfX)aU)#3pYa3e11=)rLM2I%bCbBEpCUdVKk5>>#((NTgK)tHc>>X={ zm+By>bI9~~6}j%W`zDv13m&Kmf45!oAL%UI_sdQHrCkdBoBtHyM@Ehgbm*QXXz$8< zw?xEPXsKacRbmBn7wJ_=Bx)CklAhjoUD432X(C`D^ux?$CuPb&@kpdM)#46;K3WL2 zWtXn((5BHPU@yO3?{Q%pn~Xh77h-|SpC(K|*but>_; zAyk3IYQ6hr2o?Y7%T>U;^hgTBVBbF>hD7zho;3e~{w-EA$o? zVZZrPlq_*ZL-&Zn`pq*MB8r&NLXH{N+#}3rs2DxPU~x$987&}Lecq1MFEs0 zUV5Va-;htoQHqEa*Z5i3;zZ@_CUEic%vsrBZ6D|Ps1wuZ#X$9xPfgMU-4prt62whKtT7?_ zl7kzK(CX~>hB{y&9_g(jLF6*aM~j1&&7*nQJhGJD(>5WNCT1!9!u)r5irlyM zS9aO*Z~m-Aj`{pxlS@4MjK)Ab(ULYhHX}Oo)tC1u_!bI8`LVeiT*GO|1m2ttqMy!<})6|Gz^F5Ug@}oXMfL z2%b_uYEoz&m-s~EdRbJ>E41<#@TU)d)N5>vYft;%`rBo%D955>kAr%m$V94T*h0<2y9AMKb&;tgv~RXD z=Rs7fyTIWffMCNVZW+L;EM34d(J#|M?hgpB;*p^MaWjN;92<-XlG}BXFVfkIbjT#Z zaG_=Wvl1aRT$@-Zb^yY{l=k^X4A5TeyeWk5Al=Cimex-N{)2uPFI9igvluM(+^w?& zf33>Z9hZvheN}}+D?yH_HeLwPkU)e!LW!m)In6o{T7#Mu?t~|$61E?GN)XHN21pnL zt235=7J~&zH;=B@ev6xX1uaM%b$1C zj*iLxtA!$-hqWV7dLa^;JdmQtMepMV^9ifr{^>dg2EiTJm2P^>DGl@>wmt8ZuYzC~ zfEn*kFG0*=tE5B7x4h?`gRzW3qPsbeTe$R1*@}mJh+Djf+kqWsVCr9)g1M4{e{mLe zJX*{ImQDt0ws=qp<)mVa5Lb?-KnBqpr6*`L*0@aR#YwIHL;Cf8-fvrkxH2%CIJ|m5 zHIhm(MA~Rs(G0-s%89#0;G8S?1VX%?C#$IWK`}C`6kx6St?~e|35q3OPI4 zuM)IUm5rn_w<_q0xoyiv3&Mn#Hf>QI8@0W`Mi8PaESr!|EU$x&X$!Im(WcfBJ*^|4 zxAUkf1;m;wVmv`S+R0XPvU$SZeqQYDY1=Em0)hn|?aR-n1UcU_W(i`|u}D!u3J`4%L0`0UBEJ^u}85uHrPw!!ao zki2m6dkgL8v!srLwzQOrq$h_D5(MDhfcOMp0i3E(6u4D09YBKiC!BU-gnmfC=m>9g zl0xKmJQ5}f+GqB`b4}1bUQ6{J1ulMEp*A>p>SB~Z$gnZWQ!WI#i1`1#QPcF zX71Y6-}=vmyr?h3r0p;s>Eup>@$^L1a{DecyupvihXKx=7-H|9t9jqKYYL zX`~5w^--uUNkP|QVCF^j@dAB!)S%R0N!}0z*FyZ`J!;B2e-MChg>bNt4+&6N5?WnN z%XrKgpOPRSl>QT9a((X7ouG9_`X1*ZZ7@hz9%l(!(up3DOrP{Qjz*qw&}u{t)pX6o zU?6OELL8lHm@BEp?jBDDyl<+G65^e6wsg#$Tlua30@vlBn*!$VNo_pvD^BLWX_Rap zZLYqkcpv>;e*hj5H|Mbgttzeq-D#lkE_QqlxN zY-ZRUx|piA)2lwSp|tMmIya*L?;I;HT8SLRKzy;Ne^q;zFKxcg9y>Va>s89=3>N?E z)zYc@$^dv2Z6TJZOZ`NK$h=i=P2SEm4cTV`ao zEM=AZe~(rhe5LpmvgXuJ=Q2kYsd%l|r-Td{a>Cr*3QoWEf0T&yu7i{P@UsK4Vrlk% zC+XYOe`Xz;ZoN@f^H3vLe8{Fe{?=cXPUo$Q`_XJT-D%nFa#; zfAAm)@gU9ZAn)zq`QhNF%UR5Jtrt3#%>Aaf9}$AgEdIngmx)g5={&18T|a(QwVVdz16Lr zl0+q4wX+04h=kiA#akj=M=cMh)_71{<}5)={RWvc&6d$4KKcBW9NFXYx-Wze%@N_= ztjXX0AB(%L$%S#1=pNSJHF#*OC5CEp z2-!AT39{|U|6|FL_?|(_ys8<7)m&2hmUsUPd-MM7e_t%7u&=hd-vlwwG@0do745f+ zD-|*pSM{=lAXmGzdg;X?CiHl?vt60)7n#kMqaN3#Et9X2$lXZ#;cI*!f0{Vt#e$AC zQfttwT=`CxGwano^=@?mzSGK5Qxh+gi{ud~?ChTpJ`n)F!6cnq2vX0`I541Y?oim7 zXe;gRC{@uTc^C>D>Z&b&u=AHxy%`?BLgtT8)zCRv?d=)r#2vaah#zfbZ$?7&3K;9? z9Jwns(M$zkL6k>)XMh!je-#5qsnKy(Xh8>l$0keA%1+HAxPn;EZ zfDfEJNn^H`#rlhBP(PzBJ?oo|-QWpWGq5f2Qz`x2E*JM-FN-#bIn;CYIF(#K&X+~G z{p(Ujw?6JIG=8%Eub=*1wN=|&_Lsx&{&z37H#U{?ejSB%NahqOInP zCncNaKvi?}_H3rI36XDGQ{MfuofMrB5-(SlPdz{Q^kBZ_V73Jt6(dR7w(iOeQ$2Sd z9P=wRVxhpz2a=i(QkwN_@0JF%Nb^95w#veX&OkBt$d7LuxFKF~Fl?b`EFdJHf@l*1O31c0 zOVFwk$V0zcqJ7bk00lXPXq`-yKE;6L-fD;|M6Ub5&P=e9QgVAZcw`9c6$5g~x*8-B z@oH)RIul@W2a%w~ZWXMHv4w^i>ep~pfB_HB+RnUnbqX6Fe=3PruNY*u(Hl@`Np$=i zC5R(arSsz_J4pP~|49v8_MUd2MDN@F^(O&xM7mEfhpTKou?)#r|jS}RShB%k)4`O}z5?i_re?8>oLy?WBIlzrmovol(nLHflMz8olCaM*0doSAaY&)4Qe9D{ zx}0)>^u-ffjm_hh*;O)Ttw}Fwbpw{5lH@WhOl}3je;}Q0SOYRaXJSY9V!+%54u^wr z8xb`|D+c=rtR9;|z@#f%jr_=`f52ya4Zydyg`d};zp1>VRQUnQwxD!kU z*n~Kc=C0)q!lzD>`xSla{QnTY6IxEla_2;)%};--ofAcG2W#IB`WpwGjc?;BYPPV@hqD@JWJ5(IDyHz(oC0U*%S)Mck7VOI`{@0ZvrAw1N4w}-Bap^He-;B;R1Pad8^fDF-bU&BcKN>CRPX9%OzIHOqUHla zv{mvWzmH6HRP+`;*b&}0nL8;uWTGX3e-L?em=-}C0A@{Ij?mRa=xQQ#P8u zQDKmT{lQi5)EftTZejiFwFL11tKJh&qzJ1hyFt$0!1mJcnD;9_{7XAF@zdW)9{ZrO z`N1R$5+8hEjN)K`LeIFy5zwMFe@@7Ch@+JtAMM+Vlz5S|#uYBq@$qv?HNT*m5dhDd|3xi2Yx1lg>UuJ}O*1{V)Bdm7a!;FtXq%*^2syp(TJMos zZ<1@2tlEE8Y#V*^>15jMfB7xUZygCfxOSkw*A67eF7y_(KXrfi)};oS1}XL#DfSuW zN}#vqk?a+twg&vj3B@`BhwFK$`Q985sOJfY=yhYt_%VvJlXsl|_g) ztt>*RLT{P!@|T`>`DY*k9|9n0Zj2<%)63HvNqYUMrsM-I8@H$lv$QxD0LMvmT-w7Hq zqeNiJ{gLw7e`DH)t~Yda8i_I}O@cxLDDXVRy=xocK@|9E3VaO(K7xo(RR&)gNP|2s z^(B_qL#Jo2Nka{48Fapj9`|O7+EbkHhSrGSXPe-M$0I>cwp5L#^M+TGg~>W+|v zh2oG0mrc5@I&9m8o@Bw_f1?C(v6W4TORj7}7U;q;N65DRl%NQC z@u2?8o4oSVe{UM;mW1$+#&Tr>8{yz8F*jaL7x^U!d*4r~JyUmi_6U6-%8i zb(nzPgpz@q`HrnK@X|=_)=PdR6JO5C=&xL3{v+RVIBkfp>SB3i98tE3(oAG^^*t5~ ze|~ni8iA#-bSnl+w4Zk=)<&W)3jphz4RhzYeD|N%C5MK@Pk)xU_j^3WdQ&)IC~$W< za5oaT8xfzBb{tNNTU|vWjSTco2JZDDvkT%<>DA&;y80>TPmA}oR*QL zF}NheoX5*%(SXZNWlaHGdoywAtj&i_f1%|TDN}SqYeUi_4hay~cI(pp^nZP&o5j8{ zSf}=H6f_YroTOo9I?x$uv!F$(4oJ}wER`pKf<$)3hdMM6z_Np*#X$G9>%Mm823TUE zPD48m42uCH=r`EX@0QM7gb;1`_@HlM?}N|yz)wE-x%}?RDwCqv#ZYuAy;@Sff10xR zgfLls2mxsg=o7-ak@scjVkFF4%UztlpV{K=6*=s_v&UbU1Hoq%iyMnp3sg+e5jM8noI6KA>PqEcH^Ue_P5@)U`$ko zZyxuewq`nmn7b3a4)P*^f87Wz$cGAAjeQGY6JqhWY(h&rdw)t0ZTF{Y%#{@;JMj~5h z#5;u6zH*8l&F^)C2QxZ+;4@DD!yVbsaqt)=$hIC^A3lBeQG!-}e-r;7Llyw=vW0BB zYYC!Feupa^f7EC$m&pH5e@=5;$hNDNAlqjC-;~UqX77ASkz`GOOyx%Vw?q0v8}Z~Z zn4A&fN9@5mDNqhV^wI3d3$4LS0tkgdJh5UfV6HrSuKYc7NvnFl76Ya{cyjISWl17m zTvSM2cKXPb9x(w&e-0{Ef|iPAFO^{GNc0RJlZ2dY6n}P@#;Yb5A?$&bdy3zx)tKjD z{KQSB_-B8=R7P*$cZhN%#JSVh!MCP^@AFawsGbGTw?=W15b6=(QW-3@0J#4Ddy~AD zlsUWl&Q~7IA=|)Zi-_+O*%{m2HN8vrS%SPzj!}ZVQ=)llf9no!4M{QtE!H>fHZB57 z6=1xGh@n(UKRjy0+DUQVFeba*v0#gRg^WUCy!ES4ijywyDjA$hUD^ zC5X0HYXdipNwd#8nG>b8-xA#4=T|D!;Raj^{(Y(ff1z5O02U>ihI38&b)_+K1A1=r z;il>K=4Q^w7WRmEzVzmtYH4JYf78c9!^a=QcUql8lRjvjuP(p$ZC>(yzuEk^#9qF+ z{87^niE{j%X~Y5nRZrMP|wXU`DefL;+)S9 zo_GlMf6tj8l&U7+DuLB@vYLX`E=`p%5-NZ2CIjjdu()~Z^f4)Mg)QJKIR!;ZtP~)x zo&9?s2VSTMb(SFRPxo%B7qq0btD4M4!cL9PB1D_x-;c-Tb-&rLD699&DWNhf%8hBq z3K}Yr3sCh|3IKjD5@;#GAW}Ol;uOiND-kS*f3SX}>vuj(xg8-Ay|pWu_1L%hUvdNZ zwrCn6AIK-2-|fWO;qF?3Xj6AyA=)${g}DDY3K|dQ3@hafE2Wu~(q5J+VP^nY4qK?; z{NdUSpOt197BdVBcWn&vy6{z(Xe|swHjA%3%61cxTfA5(#x^enGj@Raw%$u1HJMJz z5OWIz)VgMF;oUOX>Qsof!73Ud+LX~2Vs>0MN3BO9AwjH?Pz+RPN!$SM)?dGahMMr8oLN(vHqpR%&=PN#W}doHkgu4#C%>iAAtS0fW_hUR~Rl{O5m@fzOGk@JM0B5EVZ! zZnqM)l^4x?V8tM84gfo-sKP?Fl301sVSTMjia}gH3eBjB)=M#;f9WWYTP0HUq<%-S z5=Cg5EA-M8-5kHKdW>D9M&jg{T=L6ZcVAE|!@PJ5_(2l4>5he1935JIbJu$b?VI)G zeT5I+8X&4k-m!H6_alQ0lpo%khtPH>8e>pF%YT5Lfz%JFnYi!o*r|bk{=2*oI~v;1 zkoG`NZ2~b^f`vwQ+hRce1$rxc zgBuE>8JPaXJ+QwG)L9HjBU9)|$mAZ_ghHvAq0~%MWe^b+GFJRV!q%$FL0+o6 zBHG31ondV}E_L8;%1P&-SHxGpgD1P3~Y2Wo(Y_JG`#F5e=7V7B6~Y+mZ1Hq>Tn(8>gg0uD>tIrX}2r96d6&fMK;%12Ze>kVWa~} zyM1O6;%aX-@b})3q82=wF}u3!h$FbD0%M||kza|-l6utX$_*7^~ z^Wb_)&=PxzJ)VfHf4~YMA}b((crUc5eE=r!o2634f0bZS{GhT{7T;n6R!zIw_;LO5 z<6eqtOK7mpS3z_|>hb1;MmxhGD-xjkPl#ME*lHRAio=ZdLqbt5=p~5nRi!!EVCpM$ zQ3Yh=A3*{^T41erDT#SIMN_*8&OXbo2G zVH^u#JfI!n6mjJ?@f9*nLQ7rGDJDdOx9%F)!V}P!yX`h!CH=fmAoOLs*Q3>~J2f#n zhf-6Y$DqA8biOetHJv>I5+|KSRB8uhAMDu&e_6HUWX;2HMl!rDG}ljwq#KC ze?AF>hKfR_YIfOhuR99jvY$x#$fs9fL|`>VeA_Kf0nz@8fwppZG>o1Sb^n{i61ASCghWSZ6(M& z-r79oknV*pD$b}xq%B>n2od7wr^{c5N(cauyAoO=_jxap611C%2l1>lRA5QOV4up4 zgv|M2qCo2UQWU?6!Jct@xkMiqA)gh|I=MBSnJkzSMB7Mv&yoI~P7EY7(BeF`e>hJq zN8wkXwN2aD^@wrS9Stl&J5Pf}AL=VaKBGbi@$fks?pA}hL*&EYeU>25nxU+2u&haa zmY|(N>-3X?-eht18u*LbQTi8u?ltgRX$GVPQD-l-zcbEGxIaW(q}3>_zGNq;Q1j&k zbt)BW;JJ6r669GmJgNA;{8dVfe@ckTfS(*DY%JjPxfX{mDq58R;`4{qjh^G}4;~ddoPEEM^N~ z@#aSwEDgp!O3;!J)3{0yLpg}02CdFGM1y=w^&kXwQA2f7c6feRbBTx>!JsHt65Ez4#f1CPlyf; zM-IVGB#$JQiB?k3gRL|s&KcVWMb}%QC0A{nCCHr&k90C*CDQdFsT?661EE?Y#Gi>6 zt@}~bPc6lYy?i^!FKS~ne`p#!kyGe5#oVJ zU4ezxnRXsH=qclSB`erdeb4HpZ_2XRt7`so-`DQ<_V_#SynDS>SXT+ete_y(~{W7NP}4FN6Fmb?pU{P*=1bkCKz$@J{sU5U-G z`JMj&_9rx4_Ro3t)+mG@%{K3NTx|TrR-utARXwlJdKV`(f5}tS&T5V)gpi%Py}UUN z=UNHKA5{;V@v=zpQD{l7^$_z^9Lsm1R_J9S1N$TOg)@4oDi;RAYAZiIHomN?b${r6Y&YXy{%u!PbOci$WS;<*l=pCg5^|>9iBqOP8oG3W ztWLC36!4vqDIwxg&j16#ey1(XmNWDY1|jG+b+dd2Q?fi^oURR3=L3Turjs89R)T1| z*veIiHhPwiwTt>C3jx0YEvJ>3)LsC=*S7;yfA#rEX?g7$O_s-&=gopk8MLI`c-$q3 zHn2iw_$2$gJ*^m+@HAQpVrUAB$W59qR0JlA^$p0|!9ozk?6t&k5qRvpFwFK7{2>3| zRARcv+qsL4|K+cFM}~)fa&8KdOVYRm2|3G$k>6Fy!2e^gI@zU{I&*LIL&o++>H=lI ze`2eV0u$Ox#7nD3WH==5&Q^jJWSLaIE3|&pME!@ohi~{*S22Kaw`;?-30C$S$0jJW zYMS~5u{1`u`EJ7rA!w;75E|YK{h$!1@)DksCdoVNBW8h(S>;3f1ZKPL2QJE90`%@Xi-}$w9br)pmmZG%s+R9 zei_v?A>1EREgy3&doZZEw;9I9G+g+P%McSp-?^)g$v%sy4oU`}q+wb*@1?H*LVerrWNe_VHb zywx3lUy1C{{cz~MCEO}R+YTX?ApU*XgiP$jO%)RT6Cu4B7R$Bg8J0|;y&z+z6@%3! zF`Ul0L-c3m6@>QEr|TZHnG@YS8BkcUcwtE$#bBx1I~;ESM?%k8f)WXBiG;S~k+0;D z6ZJ*hsOy3ZdT*RuBa;gpz^4S+f9Cfpk$fiFDzts}XoSybgts%f@6$GfE^*a`b_#Nj z9i$9}_6IoOv)9w%(}XBIvz1w+5= zSOSP)kReFl&3uFXT$|=hhlP2)*}hVrQ*SgLM08H3WJfXBr{vpY4xweSv#SKLtV5@` z<{N#^*KLIh@-y5q81NJ1&0CA~cJIGCz5m|YhgHV^5$QRe62z;$h1d+J z2Xnc(!p$DsLggAOA?^G>eiqr!c8AMi) zXV6!&Rnq=Bqos^$fA1#U)FA%M0UkU7b#0|neWViQdreuZ?gp`zA-+-H5zpWK=OsPn z4|&}|OBDJ#N|4F)ZI&QLM_libqNQ5DN=-I)a+m3TSs+Vh0E;@=62S7;t($mQH}UwH zt0c5a0;z$$5N+*KY;eXCFDro%d?$;es6EvP8Lfr$*l?ifTeG#0kX83sryYDg7{X7DQSAsE0xP!W<0G zV^{0Dx`6K^1^1aLEB;=^*6vD#9KX_yfY0Tf6f^IMf_! zKzwu1!CT>qMZ`@{;=ALkI2^M*n^fZiBy$wcv;0y?e_Y-#l^o>HM8bn;lOuG>5h8zF z1d8Kf;z*7nV>9>4s}7+;E>f@Z5;9(@>$a~0lslf4D^et|1{EK@%KY-X{2Gc38jd-N zVXHQ6d%N2c)oYASpxNqvLB*K8IcrP)4Q0NbVUkW`9a&}GsWv}5+3flrn~e6mf6Vh0 zBj(#>e**uKfQO5dX>1`TYfnmA3+-he1S*iZh{!6ftXdM{_pLl$jLRK+_HV(&05HMf zxJwX!*OpBv=m-Vdi8$PW90R}(5}rPo3nlL>cIQpWtSh!Fw)3)0$Q3$z>&fUPznUIb zRgwiH)7v&K+II<}4aD3a+S;c~?NgRcKB5pme?c}O<>srB^OZlcGbWB)*wYy&-;BW$ zWO6!tq7#{lK6?qG?P8Qr$oc;JEPuP-%p6+NH!rZ z^{@qzuyM1W1*$UH+Z4{q9yUV!+>0avA&y^ND{kdYmEXpaRG$O<= zPjW%d+pWHaTYU}n-a0RJ<04>;h!ondEVzdRv}i>XvTf87w4Dqfa6^c8OcPz(@U@5- zh^cJMDYT>w!fs|nCc%u5U|uoOrR{&uV*b z1``)#jG@LFmsIm6nL9!F!WVmmofqHQsY5f=g5x4@1i^k3dI<4qs%}AuNdzk4&q(9% zg%mD5z;bf+;Saq?_kSLL4H?AZVW~WEx5BC20GF?hR1m|F+wtaiM)K1Em~Q`b2vrOKTb-zSrTT+qN@wS*MDa zC-z(Qu}@Sjgtou(62C~UtmmNG&o`S6r9v)Fz@b!#Hf4uT=g*u`tIiHTO|Jgq{x_p5 zo-{2hh^Q6TRUszun+S!PfAxcNojiaVMn?4sRLF%1bC#fR_~sjrRL^bxaaU zLZT%hf%xOzCE-^KEopgOi02aRk;A5LSdmYvZ|)IduyfE&7J_wiNf+Hvjc$-hFM8ar z*GHpXCjnzVja7g;icdBip$b5?t(~?BZGRxP@or=2U|4@`NY^)re>R=YEi5v*aKI+C zMwCf|csI?df2r-LlXTEhn`We?gjSc*|5xEHuF*o1h6WE4I&}>RNkKum5*`{Jn5oGE~^Uh2`%Xbscjtt zc=Kg2uiy@^;C{0yR(^ZkvPfrr%m#eY(OHOl5SS4`&dE-ve`F_rnPzKs+|zny5*C~M z`wk*R7-%LsJ|ob7UCJX}4w!$hGPpa( zTG_+D#Wh0#NGX%;fd(&WqV01v`3{sd^raPA79yJ^h=WRMjzYBU&%8h3eBGb?AA01a z(cihQH`}v?e-VzZh}`pv$o*t*{r`HOP1Mc{tzh}UbIQR}%J=QPw&Vx`NBfb9({tys zgDmA25x|H4t5L>M2!E;V1B3xTsYyzjXgk3ekSJ;-TIv(B-$}qvWEBYkQ?;}Z@UPQC zAPT1bi+Yf;B8-48BXV~^OFhO=X42TZaCdDaTM}Rof18WfBxtFA{wW5`3N^74i1rGi zixR{IzVYS??e`9E7eY&sK_nH0*7qHx?B~Ye^&q@F246|mVz8Y9htpow3?`W&E7Fs`|i*pu+nct z32Zeye>+(KDa0I#Y(hzNws5mKyi$~C))WPg@DcHeX4owUvyF*j`xwGb=4?p89?3snBQ|PHvkob}Ti^ve- ze+k+PIl9(Dw4TTzne!?^`%2?XRSdWwi%=!R2uJ1SA;cqe<24mp7AAd3ltsF$g49o_ zmC=rkgGet#e=+0hDM9;p+Y5>lG;W^*g}@hrRD!{>VAm`` zysFMlR;NTk*?P=Mdvw02wHU0I(4x*X505!B?7PVy4m4T`vhB(LBTFp~&5T3yJxfg- zyRTSpQ_hhd6Z6ndlI@n-%a`TmL7Rtv^S4;7cYxAN{uK!|Y6D-30j{NLT)ynIf84lh zHSed2_jBxqt3{8D=WEW5@xiOnUARWDApeGOfybrBN62JvK}x9OP0O7UFw*_$oR%ml zru#(e^RGn|_(lNkFqo!9G4e-%|AQJFJQnIAEoudtf0u$r&1ny;{$ zFUMdmvzou>?Eio&;0)|3Y3Pd;e}Bhaf>`n0$p#c!jSWboX3sj(Ngv-}H74{?^L(Y| zxz6P5hd=X?wnfnDRK6G*Q?kVr3nUHhT7pP9yRhsLkZ)?KgcjcG6W;4%j%yp{y$Y?V zn!ybPP($Yj8q(e`4b2v(f-&ci1ZWA&h?GVHge+AXCS^`3} zEB{t6k{Hsx1jWm}6-BNq5zIe>b*1ivh{eq6Y{q%ZDKZGPO`P6C?>3$o#yERGno|Ti^Hf zTi}bkI|O%HS{w=lDDLj=?#{*CU5dNAdx7Ha?(W{APk#S*&&+;tX6_`J$<5rHefC

@s9Hx98#{dWp@26LL{*iBV>C@e0#_)(7nTnn9gVg( z){>SIig8dkZ)ygl9dKqQm}k)=B5BepO{5MyxGQ?BQ)vn^wD}gSB$+KIm1rak0Y-=W z@wWWT&5yQNnTqBTZd3DBjPq4?bQ%~E@v?go8Ip{!XWmVoWn==j$b3ay^2q8*10PCV zuu+wtDXn_HcEZBnWVK5$Q7u!VDLV|GqiY~;pHhcCDWaqXRbu1k^`=@&MMKIpx0_g4 z9NvWD8zq%P1=0wiFO`Hg=K%)*rxm)xSUxtTFFpQsV+f=p?!j?_j>3?*Eg$=i1V&A4 zE`h1T*IT`zd$K&oEVH}$tM%Ot#pY0ODz2t_Xura==q<%Go^0{yH4f(ZYZ@9?2=oXa z|EYt}0Gb`*?uKdn2eis1(4f+0H>!KS87XaarZE&DR9gsWw<0?yPbdQiv0?7mqCB9m zgF!+W9TZ+#6CsDDpy6CwDqeWz`}A7p&yOAK8iMY;sAq1^`Y(bu|F&MQoKvPth-g7! zs#tZ}Wp(os=5M9Kuib3+5y-fdRvr7&`d`ic626J4%00t6t)^!%vZgf7Hcl0NuqO=# zbz9%96rc56s7bwFj#dDTGR?LDVk_sGf7pIPw&y#6ViFOFD+=<__a}@sDV^=QpDW-L zGjpftFkO7FORLq6vxucwdt08HwWv960=+ymeM9V7OE$>gA0b-5hrYF#i96QFehd7? zmls2-A34OCNzSbcVlT$WRt%2$QfnjZumrfP*2klYa6_#94PJmir)xwS)m?!*{=QSo zB^35fww0Ks@70GW+{gBhV%2N#Sz%4o;ZHDfi@6{ob8}-nJUa&(&DkS5j(R3|1iP>Q z{fG+-bivwKIJ8kPzHxv$vyxP9SJDuAr#ct0RZ(z#|FM(dZ2o7xS^qieyM!SK0OR+x(xd%DG*-&hv zoroebFLq0%hG@+=JK+Re#4s$JR0gy0xAU~HELZO^2{m4@`9a*qbCT1fmR`7f(oBsZ z8Fl17;*Hv$rZ7qd^L}U&!&~?5LacAip;k{BFI_!q%K%wi03;y+OKo~8^Q?qajmi`m zm+=fOB!pYp<#%JgfS2qyXZSpk2z`j2p|AT3+#DsZ$Mq=a%gzQwBZMc41Lka*FjR7(qG zv=8OApv73P*^ghS_ou!z#sC@hD|icg###=YmkD-zWRcQLGnUwyduG43VFbh(rLYo^ zMcZ#_;b~(>wTBz%qG=A9@Y(N1vy-&uAnSnM+5d6~Ra&MYiy$$(xE`8C{be>=JXY!l zS~hPLSX|~$Psj-e^yo6D33C+A+GpdR#icAk-6|ZQ&V?!`P47BWy~-6ltD8Z{(tVF^ z^|=esoe#b>6k8~3NdA7dqnId_B+S=kl(SM-^;d3NnRQ8`PMO2F$$kl-1@EIKF2y|zhKqz2pz~%hd4~*K=TxgIl_HZmEMh4&k*1Q=i0&Bv5~c5Yub^ya;0lfcS00>_mJ1F->$hurd<*) z+yak-3`1bw1pUDSzvDJkh9w+&&#DXxYSwFCa-aSdg#YBj_}KI_8N4HAy&a6Ypb21+ zs+qCifGWxYML!d(;Zq-n!nKbY>*Y{~0df&W;C=KlGfYE`JL6~BFrY7RYxc{SJ?K~;c8_*b}-e1FRy#4wHx2d_}QQt`@uWKzRA!mQRGTfkpVj?&;a>xZC zb86sYRP5{9Qil7+0^6JFW zQQ}kNe8c7Aj&YT`9dB?1()f`phIta_iKv-eNbPcS2!-lL{tMlvR0ys9A_IaTzTS_x zM>xPsAo&vNy49`rdwYn<#p*^R$xLMk1^F>yug0=#d7?3#k3iHM;WgQM3x4tX%~ z2xLJ}b*>YbzyNwZ8oh;?HLU%#WfEtAj7@W<fq0*Lo*&jcn5({ly9U}4b@bSKn)!_Usz^fiHLC-1mi_P;vN0F zG!=5rk=dnQPprEd_6Zew)6RkaJ#wM+4OTiuq2OG$(sj);8g~= zB0m2bEn6Vd7dw317eVL6Ga#-fvw6@r_@%XSo#*N5pYgA-UA@#V?XBg}&b@@EIv;P5y`8;?1-D z@Uz6h&6kOCj5Vhd#R^~#RzzK8qw(aL=UsZ{BbnzPtvxiq%J&;^*m$@*o5V^77Rd&bG@|zX zw%jK$NXB66Ky1Fz^zc+IXjN5dCO`8ho`J3_A1@4vin|hdivGkOC#@C;6uG)#TAB)+ zNhC7`7LmHDFrSDx{0!7rc0-&wglb%K+J3oQ_?ECGw7B=T_>LW$ZxX_1__KKc(@5;? zdu>Pd+7Bo2wk<~X>I)}~t#||%u=T(B83BaBD*l@cm$@RPv%2_TN-V{qtl`iU(WaB> z@0w6!);&_Nbw4*a4A29ttwFv>E0!;(oFu1Jd0aXw17FO`0x4&o!BSntB|Kt`u5L8{ ztE0&op~4kLSK5Ks9z!>8Ub z#hDX@DKh>Khb61~<&CExzm_0SeEg@3%w*UVj%>(aoN!+sSpK)kEckx$AszcnF1!(= z(W=0#v6%AxES@U{eYAK#jo)=#S~R^lADLIwG7f5%AqX|dyyD#QaWSZ*YjY^;AF*RA zytXTw9((niGeaP|urpdd$`&ZBIWQy;_(#Wp{hoo>OZL0{2PwPy&|MOFF(t!M@U-I; zx+3(kW&Y$7AUVkD`b(>6PN)njdr`*#b#b5$*Hc5W)}hptxI7)%8nbq!XK`PzUr5-C zpj~O>a(?Dq9)a5gDz&_=aD;DgM2stb=`2qDMGVTjb+mxi-c)w#n+6Cm zH_hyyw~199`-(I<;En28De=q|=DRA#OY%k0%L)1eC|8|7+@E>qwn^w<+p8XLWlUs- z`w1m8WHBXdj)F)Fns%n1cJA4q%E>vOeCqk&+#w=nc@aE(98)l zLUJsM*_Ax5Hmkidj?>t$8K8~NX^P<3^sIr5Z-XD#MxnnAbyA#*Q!ZbyYM_LV4-OW3 zsW8CX=nhBksSZXXBYTnik0?MjnpylNL5y<_*jZx)Z7h$Az#BG#@YMNQUD-Ua8{4_q zuc^bi-gTW!#R`2t>~L;)d63FhhVU2A3)mFaxUF0{4oa&t_!X5r9$G#YsV7iDwaj(+ z&vX6WH>wOqt50Jq>X2r!dM<))n=)R6W4YR5`Qg=A%Jcnwi`CfEpO334!*=dp`loZC z4F0^1io`p2;ua3ESns1GajS)gQZHe_QC=VII8pL^)J@>KPy1J|y@ShFp$_XL$MwHP z9n`4Lo8GlH8dqd+HZLu&nAPtB^dDJCg{zij8~)L67(6}4;l2abjedM+zY&)np2^^^ zfq(Swd}-;|P|1vCcrbJ*oTx>_xlr&JOg*1(jgOsPNA|h zn1ar27$klvS&>*_)gw7=2z}In8%Q0W5bz!e*F#10^+JsInitD`Z2$-D|9K@B)BuNJ7*3 zx#~vqu_?Y@JEwWfc__;o0rvA`=QX9@GiDD=*p?PWx#i`-!;J<1lE`7H(-bRXV+mf0 z6z*GPG5(vMF`@ifRlE3Kl?Z!xgdK5-4VW=+jc~U*BmY+dlFI0D03M~keTXEWAILeL8EL$~z6+Wx5uxnTB%5K{fFlNGL5@~^6Y@Ft}r8p;L} zSOmBzM4;K`p-&~^#|ZHz@q#~5XgrNQ|6xM)H=V2;^s}2aP*L6pwE2wI{9mW|da|2S zVw;zofYRAmne-aJ4;Z)J=9)opom9*4g~_v!Enq>NVraLXp{Xj57p55CUCqb5P_c>q z@Mkd;c@=j!HFaqw9r`cI&5tDSuer5wk>TRM^!+z+aE=b4{UpsQbenJKQ4adaP(}sV zi#*hqsqq|Zh1&2uy{hA_I@D=IzosabHW7VETPA@(FW+S?2-nLKq`t_PtXZ63Hk-Wv z@gVt*HbDhdFHDT!jZF+VI~9=IdLp7O!oW$u4q>muU2J`jq)_I*SzG?dp7;LSh&QlR zK~LAXPC;t2FY=P%)}v-#)Z zQAJ;pTd<_64E!;ZWvyZIcoK)uRddiqv<~zirkUPi#p8CYvxbe$&PunjGVcb)^&!fL+&)sLBF91wPs1g zqCx^_jfT6=xVE%;B|%;P;2{)$cq4R~vS~xCyeL$Au-tc3@j2AcZ2G;O)=Xzw@nNZe z;rq9YhN=f^E3;;RJx_G7K#Z&+oU=YS+S-7wT@SG877pE~;V&MFaIMZz5z z@!Ej-o-Y8&>2i9wUra)Rau|$i#!}o192{XLPZtdtFF@qO=U|0x6Zi}E1lpg0I2Y)F zgUI*I&RQ9z>ab%~DH{7VLHKDw<}nNdB>0ZcLfgd+(RB2D(K{1$v3%ekgSy;*blbnD z_rG{lR6q%uL9Giu5peFgqyp*3N96^JPHz-5t z+d9Jngk}*>2IRN3U$OXJ`FjQ_BH=7CAi4DS%m_*)&#TUN5%}c5u zkXe`R8TIhc87~zbvidI@G;Lvu2mx(NG(jq#ZVC2INexhIh>Ms}P-*Z?VT-s(MyR4H z8tddHs+-@LUnL)gM0?mMT>JsnZsht`d*mHs_^L!j0`n&F0W!uu);t{5E4A0nZ<+?+ zVqmzJ^-I-NHQ^=<<3=dTBGu6jJw>x0QglDA1#621tNeyvR3^Gn#bLz1I6eN&V0XE% zn}POvZ0i`o|5&LX_SJrWg48nhm-XPq*t376Hb0^0whm0GYD*7-CysFu{*9IGCAdRn z*8ARcy9+TO^yEIWhyS)VrY;nNxc|Yj09UC?XJXickTeTs*d5?>R}lrhFfzd!CMG{2 z{>PRo5IV~Q#3sW)c?Yh9GQa&V{Ly){-zB#NekL0pzd9@*bEl&VZ^r0zBpglS&}~sI z^k<#_Lh*^^TT3`a$TW!!zqs3ksXYcqGQv843QoZc?I#eKnMxKsXU(R_z|f;M2Ndez zPJYjw{3fG+)mN(8)OiRuos|r|t@kVQ4;SVi0GU%8c&ar-FxuIb{1!z)LtSuJex%)9 zfpOR+KT^s`Mg3gtJ2r2Z{k)orvY0uoUYLc(E{$pkafbq+xzyqnDJO|Jv(iPYTlDCv z7Bj4$yp%RYE|{BYi8qZfKCJ(K z>o6`mNP@p)`VmBC+JpvehB4dD)lt3qD;H0r8jCyfm_PiA5#u=r=Z@}@mp7$#&<;h@ z6uiXmO5V%0CjJ=Rgq=|>`%48m+w#JNCdIVC2tP60aG#+BNKioY3zx!W0J=@da~tN0 ztGJWY#CD8@Hi! zW|EisN#i}^j!rdj4kjcKpcEVm`7)93!3-i>hrO9gGwad;_pYy!xP)iYJX8r}U2(}B z{*XK3WjW$~1;j4|cXyu|nm>?+Hs?RKuk1Lt9oCN)RBxo6k7qzCS@Wv8OqO92VRkWn z(|q7LtS-%4hAtQ}f07#?TexaS{ro*dHI*M0Y7v@!e31w#pix+6HIK%V7qgp0mY3^n z`}jhBxim)r9-ALA+5SKLsIn+q?)gOUKd}0kEG`u07Xrz{{yuqR%CAf{qL(3Pyv}9h zGI+vJvOw%O{$E_-H*lbKyt)>Gra%h8*<{i&z|L^t@5b6~QdGz~hhOrBu#Yg4uM3$E z%n*S{wT-a=O+M-Ku$W#$=+6;xt~rb~Cr(A^h}XuR-m})>Ym0}m^L~t{=1Wv19Q0$< z#%t0@{bk>qetUpdBhe?MW+H{%gji62v7i=;j^8N5^SxriMpCFp_lTN zCoP3#?1{p1!-M(g6WBG`YAB%oGLMO0j)1(NrcZ|qq|YHzUxO4-eJpIv$No8sCui+H zS<3MLFqVU;oJ1IeOmy|avMU&ONYT3Iisu5aWLX9Cx~|Ox5obcM#p7(uBPm5P)px;O zY-6|s%wP_XEa=;ik#KKUWSXg5z{47>^XhQng)T_8m?g*@t3u-VXnZAw+lrv~odEop z&R+v~8WJlfpGxoF-@%nDMk9}Nyhbg&PAt4K|6kdtkJzd21UNKh!)Ia#aL81^FlRAm z5KtmhJ_NB}O!;4zeVB~Q3{fQy zB8$%nofMDX@;*9VG=fGSO>R+BZ65dl5{e%UFC16hFcm*@Z}Q6=gEFst-t=y|o}e6U zS2_g#UgY~`CX?<4LsQMj-bpskM26bQ#+7Y!r9xDiLA~|lV%54$;!O?r61(X_y2K%P zp+ebtvf1Ek1K6d{P>Q(dt|*!b;ey{K!AKVgN1}f2=!qAQIZ5DD8(yKHieS3lAc>#;npVeXiXxMvrLz3O1__VHOKL5 zDQ;tR?HYz^{iEN2K!9(|_p8>;?mXh-HoMP-w!yeCts$0CVdGJNbkx=sOqYA!CCfgO zCa=`AW6MV0pv~z^MjI)|OKds7H?EDQv}-(BD#d0~`+4uPTy6^aSS%j|e<|*gMZikH?Hf-FKRFQNy|SxJi^VnE;%q=p%bMU!fEG#;u54s#uiZY zzfs&zmPekF0lJRu`X6WtwhTl9+IbJ~Z?(l-qeQS3-!N8`Pq$9Y{9!}?hM@x_a*i29Y;;(_zr-i0p_M|RoRik5E<$J9tQ_;$=j zKRW4=db%?(YGrs}xfXG`Ah|MW{9FLGGKkIX8qJ9^`|n1PYvTn#vQfHt-=300{J8@G zCesd>l+G$)7-}vzDT|aRoNA+U#;FPHFQ9on92biei*UMx`r$4pKoE@6qs*SVIDz54 zqPhALh%0&zYuZ$|Ix;)@q!^j16SbZpHsHpcZvp0eQK0`3R04sQZL)V)%A;6=xOpgn z_z}XH5gxg#2mmbQl9!7tQ`93zTG|17IoP+36Ll3aNQUvs^~*F{mQPNL<(~j7BglKO zK7P-dW5XeVW{C!RlaobeIXS-dDWh1fLme14$sERMjzuz)J3L-^l?XdoZd0-q0-@@z z`}0kN1|C6NN+4zLZ!)pU$Lsum#!-LmAjsaqq?hF$0Mf+o*)i4y)OTftZ4_&zw1UQ3 z!*`udm2##LUu1+jur#x5a_u3g6)6(z(92u0*Q+g_MK$6xshEd2BmQ0WDXztDF%MBj z{Cn!LT#I`fbtx^Y93RgNut>L@50yywvo-=WK7+q2mwKjaeD-h?RBKmuHq1=>Y$O2qSe1niXJ}y+&^|7 zPyT=EM7;O}SfbJMd&&omLp0n6T?Zf4?4vqp0e7?IYFucZL%KZp`pm6D5R>5-w$ z3mZ$3Y}osan>iIp<@DtJk&O1?W4jhu3-FDgtqJyLlEK}kdJzpan1q4V1C`~OL;1FFn>u!;6`7*#2n~A1hnF8hExJl zp3kEoYV?p*0nq=@*{>{Fy!F$gHPY-)y4(bnEUa)~#Hv${ijzqa!QRJQvfY@leMUHmXL6YNB{_&|eEj=94s@|t}7oe zD3vO9PUyo$&>I=`PUV}qZm=SG_drOs5rdX-Z3#pNWV&M3#v%2f z*(oZKnEdwXO=(8yn?H`d}LNp6}QqzPWM_32x5mVLQxr8%S5#)>;VUWOwHCI{` z>k~*1_K3{^23vX@sr9nL=!@ntTm+AIBHl>4a3zXKgGjJ3UdVgN#dVMu*lX6}bF@;p zjX~a4i>g{%EB+6M>i z{10^=y*KR`Sn6W*ccVXt$V;uf`)5Vl-=bBuUUJ8p2Q_9g6a1*!6N|{fOrWC- zH*H&1Aq|WG{&zP4yYt;oXNIOQOrugaCe3LJg!k1V{N82E9GDskIzSn zlifJCB*K9IjA%_VgVY_F4f1F-VV3{oio$cxVVgLrbe|@%Cq$dqH7&>Rg2i4L60%HFG5 z6Ew2QzsOhBPnRP{pt65j4_kvao84In3F9W*fxiF<;ML%j;=&dJpNo=I4777Pc>)%S zuyv8Izlr{tyK58Pe^Lra36ifcgwFbPry#nV@Mm~=gtcxZ1K-XJZ!fx+EwTZBdRPAC zd*Wc;d@i-cZ_{Wn%)Xsh95~AOGD-{KH!C(Zb3Um(5e6mBu3nvt8ZwrotRP5W1 zz<{Dxt-O-P7f}5l?X=B)bR;;4(zv*&x25g(lSA;;9-y@DQcF47F@+{%@fgIa$mg4+Z@y)~#YRjDk^4=|Iz!N|D#9vcnd^U|5gVy_^Sk77s*NzxP281NMlZr3DbM0@_3P*xS~$J zfP~CwB&B*slt<9wq2qx<>S0l7>8v0Ml3L+Jk!X6Wx-1rO=inThI<}Q1=Q{fd>_0*r>Xp^9(;EYLUOjf+9;Y{0lO~@(cuZ5pB=%$IN>mHIi$O;*YD_ z2j>`p3+XeuECz*z)ujq=m{#JiGTauxx^Q-uDdQ!j;Ad~WbBo!G$ysIkjCjWilc-^& zP$xJECQJA3vXETHDcSK0UL%vEnvYhutNA6`huL$?P(li;#lN}G1*(^XGvVf@^1UX< z|CSHhMXHk+1%)L#RgP7Dgs}C0@Z`uc_shOGm-z5>INu&Wlf=fXG-ryWd%d;*cgMTa zK6_IuZHgR%gB9SH$^sf9p_S>H^JBH*JNv?T#;&Jy0|ghjc6*CGu>( zkf-mFCg2@i><7mo2=5@NNEr#l|M8`WeiI>lsr%01geR%fdTBTHRu}#R{1q!aBwhF0 z?|?7*)L8uK{)iskcj?q-IQ^^qw{a!ScsR3r-6xdC=zq&A==_%i8zfs1fH%VIe>~9E zjcSpse$3IIQy6)Mqxpw5K>Wde%E&ao;Kh|n8X+mD@CVTS<#0yj(>&&v%CATZ!i~h zzl|0lPl8uQ=yX~NMXdBdpmO6EjWcI(ZzVcw_WV{5?tjEAmXzdQ7SnSfA)}`lez*Le z-X()EbDRUMW&raUAg#sbTm3EjX_T2|MjhlN7)H=Aee@<++I~8;y`IztN1k6uM65lL zh+%+red70FhKH2_;wq(&Tt}7?#Ws9$4^`En%WR!N1rr6_c;5pKKvA+uC3xrFbM&nF z+9xQZ#6LTJEoKpgPcWMjs7v2KAo7}i&7s+jzl?!m_-VuBKZbUDSYajMY{`Wkrhy0N zA>7^0?Va=Ht^CVX>abv``li2phzn3~s=Gv{J7|tar2unbynw~?cTX?W`ir`gyg{Ghut%6==3!;d#tBTvow334 znl`Vf_Z@)2+6F-&!R7`2QASWl>}#%C>E9P|Y0_I(2=vz*Fe|Xnjq6ehN~58lUwR}I z-A?kJlpVY*6YQO<-lP&~4^|Zbp=S}2s6T}C<9TO=C;#SZ#Uth;CF3I^+Y;a0^-sot zNg3gXWRTi?@$U8h{CE01YrgZc_e6|T`}k;Bq#2!1tMt!S&aGqqx40sKLBW*ONdK5h zIgdnZA6rK`Ah6zASA(O*C3uy1;4aG=yhhLEG%HQ#^-K4{^!~m_A(7-UVrY!Me#I#-7o5D32svLB7K;-vn zdoSPXjkRK7uSt#m(;&xFji^xu@YM1}`Ei{8X;>xD!SBsR;P_~F#;Vr?0*9*ZfG9ci zAfO@sW2tFF*3ml_Sg(hoLBZ^E55~8!YZ%2Soi_qbO-#xF=L+<$g~(>U6q+=e`n^ z|NoXY{vKkZZ>|{a$OVP?F@Spm)3fo#!6J?3Sq)a!PQhN@c;K3`3AoEN;GyP zkqJbF29fznjD<*%2MR!;L42MGlRZ*oiejcq+?f@V|NoW^;&B@uE&Mj`UZtbu{#cek zpsPKM#fi@;j^@n7UrC{Y9z=%@8?y$PFvFJHG1kS$3wqvzw+rY?!Rkw>f4F`IzG|Ne zVQWy=EV=%3dv8T=G0XbeQ3xZeYBAmbBhmT*@kHiF-P0=o#5bSHd1zqb6^}0A=bCw& zU#y56e}S9xT)|<@K0kOD&^71#Xv#m&@Mv_%-?z@s*qokqpZN8#pOnRH5?;?W4^j+B z5mu|S1f^u;)ERum*gE-Pj)_;jPp>o<{6Cf+`C9g?08LI$MKD*H(i>fZj9A`3uGvYq zF;@~8^xqclcjNYggH-{QD?OI7@_m}zdx46_-(Bye5 z`jqUa!!Wj!N=Yf{*qMC#5fyDi`*MYl!Fica!SbNN69#0ggMCAf#MGuU+hOw zT6|RL8|f%4hChUjl4mhf=Qas<_iiq}L&)UJ`h!y#A=Y$zM+N~+4;i0`Y50}F#T*#3 z8GEz!|BmR-G~9wd4HfV;0Tmku%#!|qDdPMlYw90_KQQ#vDLyyQD3*!598@XmkVPF< zo%x((a0jO$NH`jJ1uq|g$kJPWVH3KN6}br9*Yg<2SdJgc#P!~8pe)1O zrJR&A96{&&+^^RxQP$BcR%sw4?j68b&4%(s>`$bq?>$z6q$4HXR)d=dvB&15(90Zo zlHjTTn@xn0V4c4FgV2mj5R$D%bSe*vh*Om9fYRO{tQL};PPw4Zw?TJ4R+5@C#2 z#3cPwxqd&|1|Mjj7P2Y*;w0k_Ftit{N<&^Ww$w52luw{C)_^D=D7pAYiXEUv3 zrsT)rYw)O>=)wV_#rzxp%0CaUinX;FO01gGgip1x#p7`RQCvJ@7j51JJwrTcBTLGJ ze-mw^O_r78H27(L)bIz$mNlca2Em7~8KLfc!8!OeZ1USC%?~F5hLNx8@-tgc{eB}I ziP8xZ9Qwb#dt7k?gNOf?RWFOIF?;>xJ#uw)F5Jux?;{n)Bt|v7l}SDFOlVR3!eFk) z22*f9JXW3ybZIqmlweAFNinFS)0!*n=NP7*_{`6a$mTuCw@=ivh=N)X zF7^O~-yURyHLxr&#rude0k)hQj8K}#l( z@B-^V03F5`4yN%RnxQH)j|N5+s6|8!I563KK zZl~_`X-0=q6O&WaUEAD*%sg+2odM;s1g1&~>Pk_97@2`$6>0<;G^br+j820GZ++p$ z;X#Zbme7d1M1b*cQ}{I1ZDF76ZH%PyClyc)K;u13C$}Y!aj2UqH&0Pv>5k@?bQwMx zSg_pwoOY<`no^pTKcwEO_~@E-KHRNERC>xRBCd`HhH~G+CGCT!&4^SKhj}+g_<|y5Hw33 zPEgEeZl+AK%2C+`W#Ba2No!-v+Viu3@OF-I1FS$v2P?=}dV{D3weeRmI_->N-AZD8 zgP7w~^`6yMOgLF|7Fl%NQ{HmtUUvHab3bcYUgzJ1Uef&K|Cs6Lejj1nsvcrgWPBdS z%CXO0)3SU!o`IS_rdXU-XU>z*OCA(Vgpa)a2(5v1us%bq3FVJ(2K<@X7>EWi0#33C-!(M|>I=f7I_g~31F zz#}ZW)2B=^q68V}p~0%zc7+Vx8>G zj&<@~cvb)VU~}6S%lowX_W@S$m()S*Q&B&&(AX04FIV59&96_Pq3hH#dc4E+_&6yq zVn4zS@$q?b2vzYBn-Y4-8VN_7mZO4HO~e~2wCYFK^2Rymv+*JRC(I_6^MJ6ksbPFA z1pkR|)a4#*wN4TNyN*%H)GO1WShszo!B}9v^|?@T^@*>Ffhr`F?D~9RSDxD1TqGk| zER5ajLi?WMsa#6%-o=>9I_M{gzT6=VLgOs9)XOa=`GzLwJy3;6%Qn&R1SZkJ#|fY_ zf&uern!>^wmLed@62Z`=NyJY~#BbsU8L=(&uQ((I{!bNmHFDvOGKiv0^9SoA$YdFi z`+P0Crupm<+qm!e7PAMFXylah{PDMBKSf$`V+saGFF%JhAdI@}&hkWCd}o)u-^xa! z4eZ%edPkT7f(*h@QTs>0jG#YTH1wX}!e|XRAT*{|C9eYc<)Rb6I9>X79$-6ETkv^&H2q&mGF=0&G3 zPOXjBMnJeNx}rVPubxeFRa%&W9&fE4W7Q@7AiG=6EXTwc}16c^DZ()p0VHUlaGzFC?!%1dN0Y$PeC$KM$gZv6s5T8V;+;|V|@v%Av|w*vGr3xI-v!55~~vj{QcIJ`bABSW_172)0op@q9Yug8){jG z^a`NKg;Gn-&LdIezg1U z*(FZiI&NjiOY!O-UCi7sUdr;y!3tn4l=1|r3;jQ0a@IkAmX*4cpdW%y# z5#;uA=~@wauLc1~%uU83`|9RE))scs<@byr2Bx;USILps!)yHzSxem7+Rx*xx?Z$z zi9H=Xk9P}89!XQ)dhE3#+!C%fS7T!iiZ4|?D^xKJSZFIFyh}H@LuHqu9c)H?3{SN; z7LHGAFV>(fJcjRyrQ!x5DOmiUn8^bcv3}?$jD|;B{Hk}=4fT11ytf%ZkEu#RbJClIdFISA6Z1dP}V~qlJ~6Q0<_0eZn+yOn*s#*s#j2ZF~?p>14>-|ZzV3<;>Pin@U4R8Lq%)`a?7>U2s!&dpK{F_su-kqF$dvEZ1S z62$aa@>;S!y&Uy@8S6fUt^8A^{EYtl(wZ&FjnbMd?LROwyvu_WNHgmzDWZEt_hZs( z{3Eu7kt%ng5MQVU+_%9eISzDC_tU5)Wv0nUYaE}Zn5({EuM{wGqOw2EmY;k+0_JFl zlVLS3NX}(4o{Q->>iHbAj*(8*j%Vf__p~W^(%4^csT1JpSIF~)+!!!5WzN=!G+R7R zXZJF-$)D=Ybt8l&FGjNdVZ*f9U|T+(YAGh3*XS{-vM=Lc+Iad zy-OySPbM5(%zQK*=3?x;u}maWR^tN1&VT!jt|35c?46D zYHyJ~z?d53E4m=!-zD$jK@lw;_eOHQ^XrMYIO+)b7WnoxWb@)fi-7wAq?%^Vb79(s zDx#A2*fPnv_G662@nAFLc{4s&L1K-d$Gr2O=*0Uc+r=@m<7+gazf5fAnk3@3|0|{--JZG{z+9>$G0#iVn7N$yl`vfT?EU8?#@C7! zNTa+!6W@cg;c>4rRFV;mABWDEh|c+W5k^YcfDa~uZ)foT#O2A@r z{${RA7m1q>L-)AB7xi7*Edz%BB}b)`Try8vCf>G(ycA54k~qWOny;m!rz!ZB=xpESa(f; z5||hnS$3s_;Km|IwMh8Oe3X+TVh+3P?^>(;fR@~%%R2cwY_SDiW2SS zcgx$E%^wdnjxv*fY0Q2lo*n#x2yFR2fTs`2x2M3RiaJTKxkPp=STQq zFgq7>vXjZ-@bY^8NM7qx|D6D1e)4>^_r$CDa(7BPJM$HoB8SKI=Gv*~n0apws0$arh879M-#X+$J>*BupbFn1drd zKloe#I!d@p);&@YsrfAhWZZ9!r9!`-C$DmQ`4YCnJWfRye~(qnS2X(r0YxqNTmvE1 z+Tg#)44)(^0}0`hj9(D?(_h z5yGygs9GzO1HFI3^GOHpRuoZZ6^UH$TjrOnU=FI14?6ZX9OLh*s~6QHQ}w>ud8`KQ z;idfPz9j@^Hn;9EDN$&Nw&kJ9@GD~<=|B6w;Vb=6#sljYqbA(-C21`fgDfZyv0;@gybnoX@ASxXQy)M5v2$ET5 z4{SM`n!!?14eDJZn|w#65*%>(h5lm+yD~QTDTf$8@vLsv zVL?$o&44e#!QI~ZI&K5R(t}R#%8#_#iOYO~Du&ql7j;ou50}(F2Pi6EHrf~uzOKy+ zN@qua#kb1sBt%O`L2&BdY|dU5RU1dHdLUX%CKW&03O24GAJ59(WA44{6KuDY%-h-f z)oT>~$7h2}W7s3)o4-BGwJdES1n#$KWRpEe`;Jl5UxHRXJ|&=e)B2+W=e08r-K(%5 z;J^s{oZGDP6)V|WC%lL!nmOEpf;C@G0AIWCAYgdt+>da8@WIT|B^MEW(9Z}L*Y1`| z=jUJw&OA#R_A`+@2K+ou5ll@EkG26}a0~SI$=ztkhn%q|24fpHd(SYX4UXUKz>=aH zmGhPo3~Ref!v_e`=*u|8B~3R&xg286+mzav>doi&ktLeqEo5l&)-Fb`t#;D4pQ@)g z&x=Wgb#c73#(~SjG-FH(ar4u;u5$K-Q|j z6GM^zMojy7Z`CjPr4Xe@Mg?0&A6sTgPn4TN07IHlEDInA6wq|4m%y&9fk_B82Z$5@ zzHL1pb9Mrap|xeS@HVFks2RI6Byo0%sfOZNNh|Kh>WMJ+Zx4C#^#uWR+S+yPoq%`8y3 z!f1;h9oHqM1QA6dezHUwfX~ zZA1pqKFFAMu$ML~KJ7WP8{)$P)Z%j?>_Y|fR{m$jL!FtV3Fe%P71eH54Xzvq+Aa}w z8-=fW1;NI1m78@VSc`wFUQ~;S;UHjj$pn-*uueQ|6T44r+JsP(7WjP@Z4AU!wS!P$ z9revuCQ(0p@O|u0(da|q%~TSRmRAp9OBQL4Z%C1G;K!#14!R!SK>+%WqyXtq?r3qk7pg)0a5D7 zwR1|L6niclro$#gRBdLyN-45YXBK@i8TuoNsx2wA_~3>EJxtEjH9Prt0MP{-dfv2{ zmb!TrwS64V+0B~jfHdTcJ-P~J&T0#m{z)IEDkXoGMqel8S0*=?e%}==iMmW#BDg77 z9o3dD({nlM^f?y?Rq!!71s(rpMz=T|)b`f^=!+31@Qt~d&?(!nW;CuQ92D5Z4}nkr zwfNiYmzwH^EmVq9po9=QU>Nc%w4d_Hf#GHAaH1K-dh<`?we~eetxu;SlI7fH*qYjK zSoUrSyKro`#LICjLApZ;!vgdQK>-4zz)>u8*8P`VM3R-WUvlyDB)j++@d30KgIJF6 z51YbZ9yeXg4`Be4Pd`n&FvwN1K1d#0CEWPY>`9f5i^ExhMsigbCJseBd=YUixD{*l zt-+nkGRSAC6Xv?R5%IdazQG*p$I0%izuecsnAg(W3UsG4ahoPtoNLXB7Zmp1cmnBx z;G%vq#vZtgxYrAp2nLw*mQ%JoiSQ$&YuS!pbU|1jr!>GBs&F&VAf9&6s7Zl>g5 zPFAQ&ht0gQP$Q@(ilUxj)phHo(E%IS+In#$hz4JRfStuHlGxh-G$%;g6Fdj8QU5WQ z9{pThWRtbILa@XGRJw{2)D5Ic3aZpCETQS1!L%5PD!6Q!Q^O#$v6Qg*J~^5>b&yCa z-VTUmo(4mODw7q%4Wh>~e-@m}79JzHo=8|3fr$d?3Vo7Dln%z+1wus@U-nJnQL2^# zTrpz4+b2rqCZju;)pl#~v=;o5k6);F#MMtUdBs@TB!XG>9CA)?k`&9O>yfb*pPEAx}+-ojX+P(3kWxLEJyVnZGTkL zLMwb{>xZaC(@t`BJHb5f>c>Gognp4D6uX*v-A~%fGIRnr+9-HPL74=1Pos8xy8Jjy zi(2T@l#nydO|V??NJ0q)G6Is;*NK7!6)9Ix4U`EycoV}{3vVlyVp41EdIgk&y`_ zCLbArXMqB13hpenE9#jR> zu5sic7au{RjZe>-P;Qq>u3iK73})Z$%EK_zUkat}dT+vAfC2RKqmI>XWew|_5&|lt z!M{+q4T!umi?(bT>Q>o^GEv+TK~rG7E^?*63Tv(VVh9_3WY5XUGw+h zhf}|E6KRI|k%>aW?&KOYt_!!R7si0@&)EPG_bV(kzwDmp{@^EBRRYYNJj}s)(6%8p z*u#bWOG6vlFhxsb@kSr$t!)D>Z0yiS!>+erj`^r?GX;=WlTgXS(9`I#NZh~faFu=L z0}9{~q445KFu@l7fa~9e&L(HXg|WU0+2Nd8J^%O zu){*V%YPW)FwR)1gbDj6x*XFvI_UTx(rKE7*{s~0yC>^s?cV0b!#D^8TXUUpdU-eA zW%PX|Z*psFPvpZhK`L(vP=FQbd-a4Kk|DpR#wzzqR!u#CdPZ>_)1%6`cAg?orRgrW zefCuxOay&z>eVg|3&q!>Vb-HF&B?4+vJ@)P@dQLcqg^v!ldP)$y%;iSn1SN0<8eKv z-=b&PtoWGSkQYM~=~DyIGRbv^h{6~T#Ewcz!?c7-#-Uazlsux6K0Y>nUE>Vj?e$UU zNLR>2@vF)Aeci<~<)SIf41y}Dllv)u4Oeq^;q=<2=clNd#dj@~@rtBZx$P~5xPQn~ zHR7vyd2(HF-B`!Z3>9@t&_3$-^6w&HfsY|fuDN6bJvb_eB~%#{$tO*TNri!Ur_P(8 z{Z$WNd!~oRp4iXVu?}X+9u94Ue5nG@uu5;b;REt*(&zl zN0%4^f;+dQc~{fqsL8(&9$7rWKM1QZBSEeABj9@ux*a70j$ZI@&78eT2Bp@hTDe)Z zA=YiiW}Te~tT9jwnxwz@p%FlUE0zgvygNMG+p|tFA(2{nMdB5;@Wh?1PpDf)jC9{z zS<~=RQ5?vs7Uv+WuHY6(kgy>=Kux`VDx8LNUL&z|BgW|Y(}qr?q1;_l8qth1ziJL2 zBMvwZwoc_}=H}l)o)y7uDjfTww`bqY>qZbEb!mqMZGxDp=Rl}GR!5y&_mvLo#RTYY zEfGxFzV5ETUJ_|1-Ni0TJdv+nG;dHMbM%nv=Yrw4uz+S1xSL>mamrR9rRl=HFA2^C zzEuxt!|Y5FxNS&0N;4hO(Jnzlo=_wJsLg3sN4JD7+-Jde@uhD7Caz!fW7LC1mwx|p ze*zO8z(zT_v_H?qSdE6$!tHCCpsL0o;5StrNnGo~ZUj<(g+FM9(fQ??d0T{|)fLWG z<&{eMLkF^-?I)O`TDFb$muBOzh)+Ti!XI$vZ~{bgWN_rb?&k?^-;Wu;q$*id;+2e+ zgGoKLrqso}0dII7n2$Pi@d2;8*+PDF%;r_|N6@zRQ$0(RiY7b0K;FGzQo2f9I(m5o z70H-REtd}=mYLU{)vFZ++`J1b zYmilBw8$4;>a_&2>Q*^L*bv!9^rsH6g7&Y5zPRs_0P*M84_K}=bs`=;M?6~e>P!8f+%)S^{kA{2-SWkO zTpiSHgcv$8Gn#O&yLB5JfB zm2AZxhB|V2RWR4kQkiI|)7wfJB+%pG3bm8~D|-q^*5+zM&Z#cXY?ce~%ZID2w`j5p z`MzR7{=Bju9D%?Z$K`tzS) zN#2?67cR*g9b*?QI{%ygb`%#IJTn*+)$aVd$mOpYb+rGB@BW(Ks+za-cdFrTD;s^0 zmMW^3V3469kPk4>TZ`ORa>zQW`j$!OS0j&!@4Qy05P2Ir;WuKLC#Vmf&>W-Q9^1LB zn>>y!PDvJ;*~T*U$ab>B-RLGWb-#*mw)L6WeKtWKOd8~+Me-@fhM z8CbD`H!R&@=iFo?|NUsSI%R~J<5Phfd3hUP_<*a|u*E(-vUhIe5rAZZ&n2BCBT*nF zxs#18%#C=;4zkmJPyY5JFKF?#DRLuP% z3y57V{%@ZZ3L+CX*M}S@pnEd@0%O0x%1_QEpy$Gs-OA+{{fp(NlCDRAFT$RlQ~fMl zfV>bS9;=Na*iFQKY=?C1h&Emp16B|x@gLg$w8&*VE&VANXm5DY(lK-L{d_{|sAIid zI4j4lLoGjIq`mdv>%p!g=0@-@)6;Y=O3>bk&S02Jql!krS+I)SAeRzOaSuKWkB-U& zTn%ryHqQ5Bsx2D5m6*M4UUq$}zF~5g$KK8C2IAiz$zghbiXt=|q6t8u}Yqi+l1`(x6cy znurY>6p)6YDO3kt$8SJ2Nnt!g%8T2lrSl_#ftK@_3q#=&X9?mHERe#)NU?>y0(I|` zEq{n{E~(`BIe(iAk{LelzjD#%Y5$DSQ^m^zd@s&|^@<80#{V-97Ya{9aYem=V5f)X zc!sw56H|seo|jh5^yeRKQ_?eDPzpSiXkvJ1>Cu*u;_Gdrfy)EfglY?(=KcFg(KwSd zqaG+)PC8HY_rka2%?M`}^)Co0)>9A!txS|18t=C^hK;H zDp3pBAo=Ro*F8^0G~Tt5@P?069guu=@7HBxtbaQL>Hogq0!9c}MhNQ5L1!f@5WSaH zcu8fU)hM~g!Wl^ChZw)%hx{cEBiP?=+!{aM9^cp0^SZI%pgztnW-jVxY7K_bJG&fd zk%QCWU4G~DnSOJU?n4jJXnEFheRAsj&GmvH_LL0I!)Z*|k00r{!UDCbxOrBlFXF&u}3$?y-1}CX1`Aq)zN>-QK16qxR;>he)N~&w(Ooy z0KLfmq4cVbrhD&g&m+@x&E?O4e_?)+qjF6zjwXkq_4}&JHYfzYa*I+tX<<3z*Jyr{_0#CCtViJ6Eikp7XTTial z&Uh0Y!4taSj9?`MCCe4bss>1<;+$eCR|MrBMcwo=XY7_zdYx0aXOiciqHhXQq%O;w z83T=X(~twFGh$BMHwh>-Sx|6TV(w3U2$~t(@yojuQJiVRg4{3xzGFCzV&xBRAGK0X z%!PUj63t2M7>kRZ9wMcGO>fP-{}tmm6TWIsn)O|V3`>fEx{_@9XqpdPPNW$E2K*;8 zW|7s(<6||wOZBH}W-JQ*Ec28<-&l3C$V+w?T96n#x`nB~gGHx_&(`AxrN2|ejLv&8 zK|5^jaR`x-q8fkW_lgC6M9~mQWRfVRPMGjG)-3Ct}ZSlhW`qr0e*_s7G%l; zqr`H*%;iFoo%R(3wmmBGEgX*VGCb-Ax~VpmTK)!!zyh#)!O39! zqY(kb1gGg9rx4(pNO}fS@E2*~&kW{Zw%#E(O)~&~-Q`{U*NSB#8(r)VLH z9&K}Fy0MwdaG_QHU<15>Iof8UbDVDIQ7Ta(pwB#7nR4L@4(Ns9Oa_bV- z&U{cSAXHdRC_0c_)7$+;62=#e`Q6-i^4`(Fd^Q@_ELCLS9O+SNN{SM^_oTJRzl`4? zVaz<60D|D-e7|F#e^Sovy8UAiN6!ymp8Kp5W4fq_#^wpRH2zgbwBFdvq8g%X1W%#@ zw#9+%#;`Zo3;I`kD4xIBSbSC&19O<3B;w4^a;nkiipC7{L%*DdXh+ngwvfO6&G5yl z+-72>)lAl4MXg50S{5e@fbI#&Qp&__QSz-e^+;#R0bY4UbJ-?#qZaD2nrSD!Xdwlvmz%R>cnjQQ&Z zF_DnehK{6nuk=uqcSG)rSg9>-8G!FLI<;`TDy@r>{-84_lL8Ic7SU%G^H$r9q7;*{ zP>r6*#80Ct#rvZ^f+ikz{(U04wP zBnD_LO>+ZXOA_Z3FruA=tNSYf!b~m~5^}sVS4&`x*dmdrb?V7&M8BE(xf>od9`s@r zOpT-B3g+OGJ#DwNy1QbbHAiLKljna7V%|a0HYD60g(c}y zjBszp>WP}x%NI|rTs;nHPTm$~94SV~PYcG1LR>9%JTni$)~_HtCrjc1EKd*0IE90R zi0tiiVXl6@$EDlmoHE**=P3!Rc9{K`PO|}%nIRz;2HQUoy!hGQdxXNh+7yA7;oT^$ z4}8AVnXD6%`xF68%FJ-}KF^^Rd7)=xVZOM<+U|lP!guHDWdU&kBVa!EIp477vCXO= zN>*8cyvYMMcO6J!fN^6r$>HppJM@Lf-W(uUY(vz!^IUmWZ(TbP=OP@hj_Z{B<@i@i z5*8B|V`pSQ2&)DhE4QfoDE-|k0kb)U(faWI%%3f{2xMi8jsGU-Nh)CdgJ=+uHxo!N}cJwYI z8*}7)-&L3U$Z_juwN0C_b76ndHa`i|8m$^=5bNLYN6?R9-pD~b@8CLwciLEfsuurs z%?YPm|6Kg;{t4aprFf6SWr7W(a*QIyKJIWcV{^P?B&k|~v>*-xe!LyYH`pmk1bK(0 z77xi39W)OKwU?C;J&lfbN?R#V(_~HcXOchgV(*?u$8*cDuHik@0lcs5Y-J_G{IrX> z`xfG>=$9py5TuI9(yMl%6}G32!NuI`UYu}|#yM}ZaX7RL{fa~V?@^!g*d+c(o(FRJ z;2QLf36`iEXsS@UCu~1t2@s1;15}0YKd~)N0hRyq9MOo4FmaXIQ-P)!oP^gJ&hM5z zs~&6G;-E0PXLivKoNNRzDI*x~xk&^+ty*juN)$Y5=inU6uE^e|ltEFa*0q zpt;$51Eg-aSDBVF$nan=$HhExmsdQv_n^42iZl1GNm=~AV*&^g)X3=(J~@i@#bW7j z?lQl`qU^X*T*h?1#)CT{8!V8vfG+@5i+hA&>0n9dh*iLMb$Ry=kx%TzQ@pH>HkoBm zCpUHvfSOBI1a2beeT2w(uiUT}Lscw*VAZTS_;L|*_YQk$vsng}LpC0VA-tR4u$V#+ z!MzgHAAvE8tgP6#+j83oeAq22SCC7RTpH~z{Xd9IYeWU4P#9cpX7%3Af&{W^j zSXh(^`AiQ79MHNUx}slqQ!;^`S4GMP!U@eOSheZcare1Gu@oud0)JZ-C}K)L zKomAg{G$we$^6Tm)6qO`iEus7kVY{mPsCGAnfAc?rA1P7*QN=qKf40y(Y!+3#VNCQ zz)wKA103XZE8Nw=`9hWmySqJS2IZeJI96c_a`Se!GnfT zf9UKM+NH9JOf0RKsgXi*)UFkuP5xMs4gT05hem2nC($T3O^WqwyD{Ap9}%Gh0Jq)1TG_7QyfQ4;W~NY#vabs^K{oL5Ru_oVsQ6rnD}<^vIuOS zML4;Q@Py6Vi$yQJ=HO*@n?80&LGBz$QAxyJ(+-jid0r$%9OsQS=8QFxyq~lDY!j!4 zbQ7Sk>L)HyklZd`zX)xzXMT&r{TNAL0#lQc4Wdb(L0>^39wAR{jvYOKx52Ow1nKm~ zqjN)W7kydiCSK6`)@jZAum zzTU3&XC#+H;*;gCc`%^H9BJ-rYToR0k8mm7x)$FeL9uMyLuD~n;6zuF@p8<20bKNf z|2BRz0~ZMLfx;1<^fJnpiS|J)aEV?L0etRtRGuM+y4(!?GEl7Rtz7S%5CC_eduURD z&tO)Ej)QJ{2a-c?_luc=d#NB92U|!sQPo%s1=$y=Y2Tam{ZB&!NXB)$%9i9`$?iHS zDj{wJqD3pn_rOURgjA&S5~KcJ@@@4a&WMLfH_+`jl4hr%_MUm%Hw|wwp_}Je!mIDT zl~uu{&s`O8s3k~%KVa`0ikm%n9h4yy;N9OP4%?&Hz$x^rcP>c!{<}fAW4Wz0Wa5x- z$@ivK5e`k3pSt@N_dDvdVR>(0PU~}NBSd&rTfF{@D1Xf4Bup+0L4z+&>a}+TJkM4uTL}s zA0!h@tY;JL7!jL-erCC+n9Q7;j(Ci6TwHG~JsCy6INA!m?T2~mq1UB%Sr;};aq=mSL&T8=qgAw5?}SERc0q*3Hk(h!tO=$OSn+h9=bAcvM(~^6c=PXe zoX)@dg*K4BLq$Qw;eqXlq7+RHLQDnSt`48L!7To;d^l1@lX?MGhXt8&{cpb|j==Af zUY^n&^T?NSB{L~%d0#Q5(Lo%Pmt{zV-oc`QxRPfohUr?%?nqJ0r?8x}i}8K9Fd+R9 zd+#U9qcS~|LPA=gjkP6d9356ogydDT{eBJ1HPqPO%3o4PeW=%|AMa}*6P2(Xe^hHh zWp60$Y-mtXRMl+1rEJVrn4Y&{gdW^nX(}n8G!#tP6^&Jer;M@1okNuZWsvfhBH@4o z$8$pd;<#CC{cgfpRA~zl_eKEn&_)MU6VmS#Y>CQ%kA|fTHu1k2qYJnr+66)mYcVq> z-m@`Z4#G~^E>6}~^%|L&;y6}+K8YVnGqie=h&I9cHSf^jXl zs=aS15z3b3=@{TR7~mFc;cr>QT1gs69`(mSvugT^#T>y}fByOu=D}bHT?>gkAlo58 zzMsVYOl*Go*8PqwvcQ9_H)X4rT&Hr^TPf0+*@B#lQx%ROFu+sE;j?7w>CChEHjq(e zh*ep1o_0^@=Ypj#9)t#(XAu}V3UZhtzX@YXo`~@w{^`R}JR-c~H_`vEK7<4Ga1?!_ zUguPNorUfYBO(usIPeC03?Q-Bf>XVIWDl7n9C@pYX4(24ufJx~gdbgwhf)ESuSp}9 z{%Hiva>1O3ROkE3ZZ}H9c>0V>D5FZ}nxhdFyek&}B7{kW$Yug1rQzXm5SNB2FSPwH zT6q}V85rz2Wg!ooIef~>d1akwILe%e4RTvUCa$ER3G&#D#|ysfDzuP4^Ed*R!y!!L zi_oZUc3RJgfryPAm^VKFty>KROUMi^`Rn9^0R5C2gqm8P9MU$9(w?FMR)e_JRX>B?3Tt&u*r)_S2P^1K!Yn;Zob9f;@feMDNcQH38AG`g%-d9O+ zh0}lEC}0Ty_1jrCm&{#{cRqsiw+-A2E5?(LuLG0rlrPX$J;p|W`Si|^mybfBP1Gnd z#3&H>Ba%UKVw`obq;P}Oj{tKRobKwmWuUsl!Dsb#Bx#Iduz~Uv%$1xxNY5aak^ZiS z@qFhq4W1|W87i#C9-fR34}PjZFv>%mq1yLL$?v{dwntbZ`pre+loi=V65EGy6}yv1 z*x1~s9JrZ1gb-@>X~j`~*5@DQ!cGeI-@%u9J;5}Tn_Z}4G)o3OSYMlR&|Yc8Jz4mr z6kLAFtdv{l)H~b7$1yLIr9P6wFC(IRe%yXi)dpi@vf=@Ai(n*CR8i2Wv-E#br6V1#drt^lQW_e2r*)R(9@{UOkEDvQ&g{F>F%ix}%rkoSfF+}zD7 zv@C)pV%EDFa{7V=@S>D6mJpNDjC|1PJB@a=`o^FA#*yS10h>B-5+XrI*9@LYzE0~_+s9T6}@zw)}pG9 zgshfgd@-+u`DCjq+a;X2T)MjD+JB?ps z-JpmGz`gMkjv@gpX-?h0X*em@?s43TIUvYfZ3trKPOV3_aI z5SJJgA?2_TL+1igH=;r@{l);GDlF|!VI)r@i;4lS(Z9oIS+gwC6=UOYz-DXyXVg$5 zJq%NTxXOL-!{s*U6D?;f*dRhvA9r0Ukj>8qUBDO&8+6M=P?6T&@3d_3Esf^U>=Mxd z&M-9}89NnpV>WP!aD=Pc)K*nCo$4k9YFXbv6Yx=_?H1IOpyNSL=@xV=<)QK;sfNnj z>V(TzH4_9s>_Ji*Y$h13B&gc3MB6_3<+SABcRC$sZ0TYxdiKvDr66z#}mDRFmP9ZoN`OMLU|j z5f0>S{Ba3Za~d)6Pl{<}30iaq#-MVBAyRG_`SW0RI@4c&zIV?uZ~0sH(Ej`e@Lu2P zBAlFY2!(&Y9f^JUQv+{JN8u!761Dp+GMQSAxL*cr5$zb5EyOECz+B2}0BtT30jbBK zer1DVt*t3PAl}A@O~ka-Popx20B@7if`Rca5tYFaKAT8Vw3)0w@mv zG9H?L>Xn8gW`&*dH_(n1B^YB$%l7?_vxPv<%jC;nV;8@n!ihR|x7}F#uZ6(A(8Eo5 z$zTQpCIlF$D6)cH1XzhUIIn)mn!ACfq@i z4?f;C>6-C_IBE%3_CtL*NK>##swUqwr9ae#&P5Qrhdx;OuX9i$p6YX?kPwNPm~uC@ zj}EPozUWZ?l({NQC13aXfhKkYY(>0I(!6IJ%p{P7@EMBj9*pgtj3u!eiM=PFxGW1H z^A02PrX_dtEvJ+SUr~kaw$UJP(zyT~<_8}wy0>}T1Z+>Vr1MG&fh!a%GQ9q^nO>MG zI7@!IQO3)ZfF!;6J*_S+?nbjj#s-R^9DFljC`Bx#o(t1^2c9amT;B^$#3@X zooIHIIR{=^!~9L|60}l|f1l-Ah%o^%A20nBkO5}bU~3WCnZTzJdf3+6VmT;FhHZM5(JT2-kc zcT!xO+|?priLW@FX*Zm?)w&>-4Q$}?-Z2O{jDMTV7Eo$YG);SxW9zrNz9jXhXn^X1iHaC8bZ0*+%a#=-5kJnKe?pgK=>a5 zsSdxSk%c5k+Msh%bwqQOWJ?tz4{T^X!mO)oo8LckjlzOQGnSb_J?5`H^wx2k=A33O z7GAYv&BR&A7Lyw@YGN06AM_Hr0S_~b6&hc1D(49%tw7yDdm!2vcoc%&6nEk@Vg#N_cuT}n3P;ACq#B@7z zSYarIQ&W_fv0|qoKZCp^&4Gy+SHh|b;r>O-%}wn?(4fzKR(xonBdg?mpl0?PVVl4l z3DW~Mo)T-fZF=kb)SfLF_S4tZ+J9*gutS&czZ80XuD>0j66SjQ?O8 zviqshvb60GQ?|3oNa!h{p|~6CNG3iwUi|Dda)w;Gjg+B7d9Ci!$n*~7)vrqYMyKXQ z)(%OBLU=IGg>nQKm*hGQ`F1 zV4`!8R5^~!pS`dAjmGzv*|ye@UeoDWl@GEU9`5(0M$2a0MvJsRTD37{ELl7mi&Poo z3BxI}>yIsA&GO*~oS8q?#5^#~CMBqi4t2kmG*>`V!fs7TzPitvyNoFv7a?9AIiyCV z1^!|&9eb7?k`KpA0s~n88V@fT(XXtN$TYSTp%HmySRv2c3)FGAohWew(gQA(2zJyX zU%xGl`u-(zpYg~|lRT-T&0#0CafPKBn3J0oW>*+S3w(eIvAWnG!r6}_#(u*tET1r0 zfh+)ZPZ_%~20m4NeMALs=Xc*dQO_^5!%;2L4Nf?udao?=b^Yvdu?^)>Dk$0S)k02P z{H|oPt#issR5tq~F>)b9e>H>oY!Y|5F{H)blvg)@7sL^j=08JM&6^W6x_H+H9!O^k6GfY;uyYHXa)9!Dc~TfcRF|o~w~}rcq@71PT5J zK}uOtzZMna<8UURB*TZ-zW$nzXigTCzmvRF$fOt)RBRT{kB?CrYRGB`z2$w@OY{xr z9zvlto>-m2mvmD8Q1`~KGwRf?dk2jebmP_;O{`R{R7dc-yfnviVq7hR6kq%<>8#H} zSXG3HHWEDU$4$AbEB%3i@ewDBK-rato7jW5;$bMGN6Wg(-(r==auXuo{@MR8PVHg@L)3Eu$wPOkT{2Lbe>9Q@>lEiFQj!vM zd?Has%xpON1`W{%Kdi)GT<^16z&NO3&W&U4jbq%6^0)g@DfRo?iWg5vR~VuzKw-li ztwvFRnwrHIaBHe7zLpCFrHSJU4KbTVULn$$;4Z$@t;UUxfSn4rVNUryG*wnyb&NC? zWyHeTjyfkw61F9;-s02zN0A>xb^#E>#;0U;Vj4=f6HLOVx3gzn0EK(mbudBR| zz4l0YHW4v}uI|L>;m+x8Ybqw(!pF5^A4N4xqNxRXN#{Hxcey=C{e>*PrO~uX8a=lYMJoZ(KYaXlk?_EKK2FwG&51~wG zeFXYJbR>xO`BM(0nvX>_b&PAfLP*?vPk78#1Lyvo>owgV=NmUyyCQ+4DtB1dY`#1p z$xz{5;aK8`dkbQ}2VlbI2}soPaNWg(Ocny;0;X~zV(D;@VT#YDfP_F8 z`sF1|;wk5Nx=Zu4%izBhyNR-^*>F@fW?aiDy-KLkMd=!gCU)a44}HQo8ADu3tP5iZ z$HlbE-$u=cc$WAjGy=+Z;AImX!Oj6QN{z8xzo%NDSvM20J`z@#bs!N_vCFnLq<3F1oV z{WZf23u_)211p%Qcn z3N?rDdrHHIS#m?%fVD7%U{Xd%vE0Q)gT=)NQ-8A6nkXt`0^;_f^heuh zFhCm6Dg@SiK^lq4#IkS}*FZ*SfMTA42tVLZCZuq4Y{M@K3iN`zM1aUnF#3doSW-9$ zfkcmJ;|5fBacC5`5*RNWBfBM2@vJj=a^r~vMQ<3z%8TE;eqCERMova@m8{jLC{#?C zT}n!Lsl3RJZiV502Em`hftq?1Zqs#`T$!>Yc#Nro;U{j*xzuqZI@tnqF%1MSewqeL zRrg7yIo=t=L3)H_nrHXM!$UzypCrpA&9$Q#8GC<4>Pp47p=3j;%Z-VNh&QB}(kBx!?e9!=mtFP(>vq1T2_RM&9fRvYWa0rF%!##>h z@aTmeDh7%{!h_hh88SihpNX2FYl^Vgx5Zm+@9|^Odr=Xm zj{=F#nMzRS(QF2EC<Bs0zXqUWl*iT4*Jq5_ z%bMuh8$ettPB9if`N$b*+Aw-%l${Ru{pDwYp}hJY7+~4l!u_*M`Cy*tuqV2?%g&vB zo%Pf-ZSxu`8k7-@USvR)VCMR@D5oaGra15k?}w=l&9FR?v0i;$H79*h{qI8w232C( z&{I2@6Y@jY=@`;zBM2!yd8l81HLA=}U(sEDotQu(2L&vqWsD7ZxltD>c6Zb7b>?+&SiUXB!s!2SUqq8e3LZkRBnLs39eI;nK!@eiU_>7X31{ zhcD_3r|TdzQXD>GUp`=87Up`jqdar(v2V0WgAu(GDEVU%EWvT`{`vR8f_2-FA(?Qm zr1AAz&O&CZnk}5 z8V|vX3?q>;IX{ikY=pFoHekyTg8R26y2uU?WOqFfX_+@hH{Lf6A(wNkZaz>AqFU$V zo{$w)SndsN*i*K3*82Vuc#fbtKbin#!}^VBgA8Oi*j|qH%UTonvJ%#GcsN{clRQH4(ck`hLMcyj>z+GviE^I^QXn$)Z@4-CL~I!{4HFI>j<}_ z?ZD|<`!ik2F_y#ofjmYxJqcp0+GifFlC-eBK^@Xg8mj0+9C?09Bk%qyZ*frQ*}`HS zg)+#qD8}fqKlia9cSwz^HTvCSOL@FjFqgifnbLNgJ+6mZ;R81XN$-7T=9LOi)-GaU6ve` z^yXSL-yN+uBf@Qf4*ietNEUB8slV*ezZ($6`3(ih!+$Yc{K5_L8Kq+-DEMptT5*{d zeHiD*^X~A9%5#>!AK=I#k^8F8zOHfDBFHL#y_w*jA80i2J9hxHO5kl^iUtNQ6!Heu zuA}q}kQ%8L+9!;b{DCy?<-dB4LT{u$4&*vv>GMD18LB zD^OwZn@`h3#@L1-!t_bQ9Eu7LBbMA{%`x?;F|~gM)F$jWE>5LI=+SMF!!q&;}%pWD^dteut>mF%*pu2yUgVqMdSZ5 zbyY!awOuz@aZ2!Dg#>qpLW>jJ-QC@t;2I>j7A+3NihFS=MOxe`Qlu@EQk*~UclFP# zIg^XroMg^<_FjAKwa$)H+D1<}@3jJ<3Ax%lxdxQ>NyPEw&BzM7x^&dRcc4H5J+Nsv z)jG)rwqGKOxO}tvgW_i}k;ti=EIOfM;*D+!+#h|c=k8L}=q~~P9+W)o>Et5i!oQx) zI!U1j%RxHYK8FQi^K$XWIcacH-xfU&ZVNq|*dJF41)`&In8r$;9}ivcEqlO6fY z`Bh`?Ek*HeN7rs+IN8Lq@uU9)%Pc10-xL8?9QsW{32EvsKX-R#o%(2ni1@QJlaOdL z;zwpVw2^3aTB2Jc(MvTfU-wpuoiY(ch8C|Jo>4<=0j~Z%$@eb4LqhvfCZ!OAPbKs$t1}jo)VK@jq9zvW#+ zyHAVv9UtZhnFA#7{wC@HCB7loycYCAj(}-rjVA}V*ld}zywa3j%f2rx(^Au7Ew3=~ zd5nF!FG8m<+><>>*VD9Fd8AsYfftTJ1Ktq)TlS)}GZEz1OVl#8XO3j9s z^-_rSl8m(_fn-%S(F82VMP{N#pEp>c;0;zy;P`)Ec2Tn-W4(mq26TLM%qF{)0B^Ly zaBa-Nb5syA$iE-Xck=_c##L(On`Ek4ZcZ*?gJg?K)#Z-8 z`K?_4+c9aPS`KNE0dK;mWIHU|c=)VY@a`tOjSi<4bN;7IWRX+~mTq(PTdG|u?$vG1 ziR?={kZZo{z$1KN;Q&9_~(q z95#GDHB^p4-o)?NKfpl(Uf9e|`xxX#my*}rpK_I<$YBxv*WT~x6`5=LwHUj=Qbnvb zTs)3o4b$+Ade46TIP{L#PGK8985Kh0)R5;;oyy@8zV`&#B4WjJd(ESjN-rFkGN*OOp3hX7L0!iEc>keGG1f|zr~cZsm$m~DL~e7 zQAw`(DGN4xRxO7~Y6VTaim3J~FAb|L*iasQk7(83z6)IPUiNS>r8UZlUE2G3hXmWp zTDF3s-|LPcjIm3wQG~Cj#d!=GJBp9raLj?~CfD@;;PS=i-%_KC^Lxj74tdmc9 zVFDx99;|#%TQkk^TjJD0baDJ;s_szglUVIA`P7IGr(>bG#&UlKvZof$90^(DGV6To za3@gZdx@Q>1Odt6RBH-sa(_}r?7p9H>NN-aR;tllVHdyjLZpJ%EIe&PaQ~JXboUx` zzX_6omB`K4%gtBIX=WwYy8Uc)`$-@*VW34AVZhl%l3YU&yH0~A zgZu@MP`dr*`VWcG*UKwU!Y!X{$N5IOc3KTKJt_}c7fxe$dH*a!;|-UnFbWG~Mij-Y z978kkQ9obwxWARlDd(s9Qxlg#_Vwe)I1K+DbkMT!F~D-2n1z67!U`05v{s5P$5o+;uSXOL4IrZof7Bw$bAnNWtBXWIu)G-w zRbf)v#oZ;bgu3c zabQ(8eClB;hj>q1#98OEZD``cXco@CT=s`TFOD196^@`kOD=W!G7-0~!obVxuszKb zcx{4s+Nl2gSBb-SuT0_!uk9tC2b_Ltc8|+;j2{G+(L6fPn`AmjS=}%!@-N@T@qpF^ zvCdEmTm4cL0)z-7_HvuSX$cHTCDu$3hSW~)3EGBgd6wTaRP@!3o0AT(Ma!1rG0d{h ztvY6chW!3-(W$&@OH1FU+ypm^h`OH>H`05}+HTgd6}$*q+j6E5YDq6cc{U}aN2t_K+>wsv75HL zO!$iQba$RHrWv~=yb2=p*7D(PCf#e~G{oC%Ot3s-ERrMG4}K(53#V|uVjV8x<>MZ8;>!OI}n=q8o^2EdAH>xL7T z>WtB{h|#nNj>bl~eI>9xZVZmW}$$rt-7&7 zPvi_JPUeCFyKl>_@WXwLU+BI8=xLtFW2_~+vAhQD5?H~p{86lt$9V0G0`i@3zbK^U zrzuyO>Y&~K>Jv~D!fCFvVqM&CMH2uin2nmU0@ zVFsrrn!nXhJADaJMBqs?SOADr2D*g}AJ2t9!B9kQ2hz3Jepf=VX$bY4q82A(V{4Hi4*Wq>nB-IDW&kOqATv)8+T6AAU3c}JzGR=TJn+4uC3fUn zmK?u3)w%Vpy~9b-1G33SJVAJ68Hl`#>6w6D@~ICQ-JkUyq_Z zR~$a;s_kh{iQyURyI9-e_%q=BJbjMbP-<$=MCjhQi%_fMXNzP%9#YAIQWmdRX`4RdT_kQs+^h(K~yP5XBrAK>Z8|? zeInMje+@1g?9@O#DwL1mEx@BT*n}X8OPJJ9&E`77@5Y^`E5pV|NLf=a z>EaxsGn^o@GN@UOzNRIph+2@(ME)x~N=Ubl(masxn`*U*G;%{$8CwCiX`{3meP=Q&hb25Tv&3%yJhneB+4DIe;D`Y&SnK7&JwS)j+mF#9@;Bz z61?{8QIpQn2(Ym=+$3QzFrrA^=>yz}@11JfXAM0~!Ht-&J;kKjximk%U#KVQohqJd zSVYUXo?0$rNEDdq3W$+&Knr}{rvd1L=!1Q|G+520$k0q;)~;I*&(uDCHsJ*A^0R;y zqQ7Xc<8K*$Z?<5yomZq>Y$J`b%e=egunXtsybCaT(Kb zDMPuIxMbr!&!u4%E!P?sViVa%TR2mC;YF%axP9&3ft!B6dd|1}$wNx!D|?MyYTW9$ zVxP?Sr!tI+r7}$Rl))WKn%gKElOCNm6zM!eM2RV;;1D}l)t1Sb-EM7=c5{GKGevAr zoH?8X^elaiF?boUdKqB&KY)H2Zq+Ejz!#Ppfhe#+;kQ7iDNU_LEv-f+twv?7pSH~m zim&-d88WQOnXxA4BlMu^)1=2K=PecYm2wZ2Rs_7mI9Iloqd)Mk1d2X#j>hj5_L-T^ z8~SOVjvT8%5Hrb?{d6(aQK7Dsh+!#Fbmi2tvHx>O{sBlStZ{JXH zPZSY!cPHM9++VPvlxCZCTnE-CY5jFq7UV-egq_+PtqgM;+47E$_0likN-xv)G(zScMc7sxo${PZe+*--2OK(dvoi3?!qefi_#0c_ z+fdtnL>c8}CAd?62&iJWQ)x$&FaoSUD|-zs;kqsS2U;Xjk*Ww~KV4RFn52iFQ?Ik! zJ`M1auHxwfQNaPr`e>se-~bRC@6p-TH72=g0TFaUcKYRBD&n#td=C-SusG>}SAH;`eF~=5kfRM_bd!ZywIPwk3RzgN0FA0opEIZ~8e7G(u;{ z7KuD}mhZCoP@jjt#+ z=HKD^Jh5J5^5UbqcK45RctjA}DN#6%n5ya(sp^%(q&V;{QX`U+fY&!i-s!+Yg=|5$ zm)O2eA@tG&DcNl>zflf0HU;b62vYv^K{uv&%21^(xYlZC#yk@#sVcc-8A2!#Prq$J z#a{zxnU{J60cwo7PGylG6n__3UGF*V$n}MI^2Nvcpgl6_EMD zfB7%ty(mC-7EA|1Ja{cLG$A(LS#+qmWac7?Wn4_0GdtK1_~_-(+_=my25gsFre%ik z(R=~vh~M2(f#!6c!EB_)p0wY5Ev_bRv36XFo0S3gf24i|mZ<)n<4p&Od-Z3m%3OwG z(8yaX7P7H$$aeB{ok13~G^oEM2tvoDNLSi89n9wh_A{jYqmDN!hei|BC`w%0zvH^M z7}F0rEPjR6t{iH2!%!H0}tEyw|Bm zzwTni2qf<>otet{gENH%gaBte*`mg(5!&T3aera+z;l&++Rr2?GokcUPCl`?Yvfdx zT$2`Mgsx2Y<);P5XK8OGQUR}y%uNB*WYwRzv*L(b&L178F1hn+Xl>aT_Ke!fGa=C&~GtI6#2T6zV3rsPqvDm zG4x62x;Tu%pK1e1zyoC*+j>SlL`R%oBwdn9%gKuQsIj-oNg5pS$ZOWN zP>nv^S%rlH2m0g9&2OeSWcbM9?^U2;>&dW9tPWnXVeJ<7&$!4zcuNh(D|^lu^7kLn zf14vea>o{sfBKxXtN8EJ-zMHK4;p2}q{n!*N3O)LJaM7kDsD54>?YCdeyGne-D>Bu^H260hikKZAEwtGMxD5Z{P^N&D&qpWQGkrjTHFes z%*P$21phMRz}`%sz=h(Y9&^ZwPL;r*EP)xPbUiw3A#GxyQ2Fg6AFT>s&$LQMMcJO_ zNbgwBH(9p?^b+=!wwltn_2!#bY9|5BUvy2iLT@|6tVnM^Gmg-re!A?n|AbtJOT zCC=Aht^A7$9|n#b*Kb;*??M_G1Udpv>)c@FG*AclW~G%jF7NyR&j@=tjDZ-$S3=Vm zld)hc*{QzTqV8ihE!VHP(L;PG4=C^pSirWZ^yXYjMIiw}K=fox6BnPsAoA}epk7P5 z5taz`iteMw2}+$DO;eYT)e!}6;*?u@+3D@53{f?z!#xHkTj-@5rjq8jzG&R5FKjn7 zyftVA6kJy%(`U!*=;WirW~IZLL{LjqjMPw#^?o8n9$Xv=glLN7l7Zv&M%I;atXOFn znd21H7m)tuHuskQ@T#RvLjKBYn*Pl>JITMu-_=>GEl!U}a0Hp=WXK!lN5)@w#Qu@! z>Iw$VjZRdzIF?gZ-+m)Oms*^RHz>|ERY4@!Ox9zVv{^suC>V(Zqv0bGZcA3e&b-xX z8DTK4Ow@tuI``=3{oxF(UsX>|f5^x`x4s(HYrMi}Goe;7_I4?dyT30qS1>xeqF?j* zoPu=u-fW+hB(tTOKQBU`bEblH0%x(wi}zRVpKf6m(96*D*K|$I1{4JC>Y z#N%?T)u7DYRQJUb8>mGMX5Z|Y0hP)O84m}c>hWV2W-S?d z9RB8hA<8c_<%;$?J$If<#ibc+s_D*M-Tw~+^G(Aw?tS}86PoNVoSu%eU1Yd9!2+AR zdmCj**!K>3CeC?|%qYCre5X7lngI;ck`iMEh7k$qpfrWlq@B}gE!yAo5$*B?8mazR zNb6!1UZc^LWOz(yIyvGYeKbZJKb?y}w&e33meDI+^%&P_b#37e=^X~?QuN)5H>i>f ze3a0F(Ckt+MPzz~@Bx`7+u8<~AFP@tTK1J~CR+Tp=9wvKDFsmmoPm$ui*L;*SXPyv z9k#hr;}qQni*aE@PK!r40Xbhq5Ly0#F^7(A2mVCK1j96PG*sXXO?*b&|E>@|%?-`7 z$bTXMnv7$|^+G>(?4p&^j5rot5|p_`Ns~Q*Tsrvi9>A7cZ~Oy&dp%eV1bBx*t~wYY zxn72%xA~iIi{V@y)NfGQZWApCN3RI? zbGR(EK{Bc1R5AaySVosQ3O6|l8+PZhK2_%yohDJJ?3nc9kW}R<$o&4kK&!NB z&OM%^`aWCreb^=AUHFw1eff@{&=IpL@2Ai7Py>z{)%D{+b=R&M%k;&l7R-(OdE{(+A@PbYtW z1#|>zd-k`9n2Xku4}Qb7a7*V+63V{-vHGRjL{o5H#W&e9>i2afG1>br5r)cle0KfA z1|FTW{vvoH3A?>iLoIOrXPk6HwT)JX0dQTDKKUK@SK#M^IV^ui`(P?%(9S+k5fxY} z958BiEs87ireyy>I&KhSz8TlafgC!XC_pf8Xg6;0YR^kD6>Jqce&Rd$-I9*Xvn=-(K7#pT?SQQ zASHg)Jd$vpJ5Mmg?=l`HqW1BM`^hy@Srck4>Q7O^_5G8TyW$|KkRYhk^7{=dbNL@L z`U=`4_7WJrY1WQk7MOo5YzYqCk$71@Z>yurEAg^Bp*DUsD~37px6%k)$ky;q(zeSg z9({W2oEetcN6=Vnp@}7cdNsc$hN@t9_-|F4~#i3M#@0$6v?c zTE}UO+psW}0-FqgZ67_TFHg-MF7T8{ZRu-|$d#t|3rN*sFuo*u;iR$cb+GU8 z!gNPle$*nz;dLX2Or(r9TIO!r=KT%tjp;hUjxIz)gmK|OF3p7BuEn|8WlRZu&8?^l%LcwotJ`U#gt?N=nz1|3 zV}sdyaSZc#tdc^40XA3VA?~tO!5VMRwkiDO511M>i9|SnWz)0{+Kp^F8howjLo1v} zZuzSgC{Doz;4A55e%9yZ=kl7#z2(PSK~Oo>)-S{M-$?W^pg^sfjXzd8n4aR5wPr67 z#nb^wWR}vL2h%v;)VzSTBuJdTiHzTwWn95n(o8nf@Npx=kE~-!T#@p|H+%r1WMKOu2I*mD?yE|fAdq=!H=K``nCx>jj7C_TAy|TGnkO)E ze3Sm;D{O8s+;ijKoNL&it9W-xln^Z9EsQ4a(;sr$-^+$OSUh~nM3T|$F`mwbbVr{! zjy`Qs{NQu$rzfa*?JJw&EB(O!DPZ^T!KLj}bC+y3%f>!$1DSfAT=NzQWSF_ORbJqU zU#&!BHLWYzMw-Q*5Vm_mUjVBq?%S&*7cm!XqXlE2MSoap=!wrRDLpt2m`8b%1_ekd zQfNa0lZN;cA72pqZ9mp;Cwov^ojdyI0W=v>>M7?cufJE!2q{mDMnzq->Eyd8N+Nog zAS0bn-90wE<<38l!~?>r%SOXsfzRKOywi3SnOs>VAvfwz*nR9b$)B~zz})(=&%!LU zpy0)c+^mU@Y&U5THe+&h4X!r`{`7j8iQ8#&GWD|`Rn@OSmh@|gY{*(>x_P~`lmE#@ zLqLeJ%s?y_BjuP;aDwF{YRSa;o;KkxIc7doS528V>m2KxuFH?NCSjmyMo^81plN5m zc5|!|&>PnWrmqfV?kXc}H9j@Hh2u_h040-kHf9+?=X+!J5S#Mc_wL z1Lzb2iXubQ?ra|1ieQk>jx1x``s!sJ5%v~eQ_aAXLeQ6gU(GQ&wCzc8n~s00U_*s$gm$Ee}|S7X*n6LbGn+`bo4fR>jvoi;cUCQ}$gTSuv3ub;L2D#{2Fpo3>W+QmDc*TXAQmI^2r*&O5?GbpFij zjjhAjT=eek@M4TTE*=wzi(0`8kCU}7C-d(rUC@4&%{Ga?B7iUFgtJ35xH!o6pV!s( ze`q5ejrTZ6NVxsvOSB2QrD~S#+Mb7H^GlhD>oQb5{7OBT2MI~rTs<^q42gB@1gdEC zabWpS8jfi@tabi2WFGpL1Cx+i2Umvq(V>g{7=?2d&Bwm69)*U7IsHwZvIbPcN5^L3 zduE305<0PZeMPz9@x@90M_E>%N77))A(G!Dv7K2eF_S(I&mK=z&2di9p6#T||h8CtV>BAc!>KGPd?|W>`V?&)^wsO3A9~|cTHpY}e$o6#OT{9_z zD0?(NYg95po1^Jc`XE;#R^jQuMP=T(?IH#mh{ZfyhgKhidSe_cJJxLdGi|RP{^sy3 z{B#DQw~gX&L8SvYZW&0Ju@_JL{zv(+FQ|E+zgcKq@?9 z$>r3-n+j|je%PyTPntg|7Y@+{M~7>$tfRQH-OD@WVokHhlO$v*S(KI> z&(zG2)KHB?DFkkO__k1WyJ8Il8{6l~r^tW-tv04re!1HP zwzdQKqiJaHp#^&_ADPR^?fwKfj#H)$D?uGt+)K0xS^dGj*jpXbpGjruzCvdv1c=|E zrm#fpe8Q<%F+~>s2uCyaly~k$(sMQqjT=XGge5cxY|(>U**c(bg{w@y zbcEHX!YoV5=}=~*usuSBBMS`&2ODu1C2)5!8q=x13#wKb+~fiQ=apb zU}k^-RG%E0euQm$@up)5;|aIPc3Qq;ckWxXFbQt2e{0;Ps_q2Ro@>%g%^9El$Nj82 zY*$9-497fhw0bGm#@|V;dCH6<4)Eei8;V?)(t!!;v{MXg4=B z8etT~xV2M_(K}}-MgECEz6y-+_PD9aOpARH%9IgF4RoT9QLJU}uj7IPW~A};cJNlv zGP-~S4&%H`qU)M$H6T}<`ZyEJ`SH{dA}qP01}+^!n7h@RYKOgCpKef7VdGVw&>AfP z`=u%(hQ^^l2`ZN9-^_!m5ycx~vRSoe@QGJcW;{?Rq&q<w8H_R)JadC%Y2-rW$v6`5Mp$wm8 zJ1oKkkZ)k_@+elZLGRN_ZS*XTmC_I)P12q(=k^x}quOBmoVWD{muEfw{v-}h<6o*G zsovZ$kUKDvwa7yUQJ~$*_gM3#NI&3gE(O%dmvG$? z1Y^R_L$Gt$h8OxdOgh-xn3nU=WH>QCJD}6Q1n5tVe4{&6NKuSa>T_%1+VdNCqrjRj zE}5q~_ej8+dc*kpC;mk@J!y{=X-`1uJOT1*X|ld8wtVf*IDc@D^{*r4M|U`_p=3OI zDKne&E;dpN&B3hiC}YEJ6`-{XBGFx z4f(OAM;7{Ec2TfEnQB&>OJCcZA?55aQ4y!pw|@qWlmoqdL=`Odq+6jkr(+(%`7_)K zHFZo|y2QV-jn@*so{w*H&t}FNhsPJfR8WDtfU|Gk(T@yvAVkWtZ(NM9G8sxhFoFlZ zs?S!&G_J<7BCa<40=5gvi^oWvVTdwhM7GRfDl7&~ON0;@!GTf43n)DOtETN#?LtmY zorp`&>1oF|3`$*VF?aygB@ya@MKO=|WtrZ@GwBA(#UE`8WE1WNr`+fPM7~^1d8dXx z&j~$^|ElD6CBSth&pR?xeQyqi@xD?0T_Jx8TvUYG!xK*|EBqoNL1TDMpzRqY8fu3( z=)eBpEHLwY|6JlGR3@SX`-n&6zr2DI?r+VFi#Y5=s*7*pxw&b|3e8?)^JvKvS;*Gw z)I*!ab-5dt>hh*dbj7+cW)(8{rClO#q@pR@-~H^d-{=kkhLfj-WqsceX z|1@xXLwWUwl>Zn2dK?Q;+Oj}NYP$K*YKg2wW1!8nNd~E?0bk&#qCj!M^3)ux?fw!e zhYdPjwKR%mAKdI>6~*!LtL zinB@*$Yd#dL{l~x+|)t(wC80-}mGf zKOj2KHD?$W(!L4W_!jOG0|!aNu?DlfnF_FRFc)s#K=2!p9GXC?-i^lUOhs8hpYA(hOy$CxFe1KofJZ*Q;s_)F?K$}gp zehXSYmORW}>SdO~bWBPDyO7><4pyOetshp^n>vRih-=#?O#*zL%-)6reEexZ{mDoL znk1VCbJm448-<=ZK%rr05M`(Ji}UQb&GBrs=uZo)H~X1!nN}K!2_r+M0^u3a*M>`@ zMhV9zn}}LPRO6PH)q8xClqLwNz-YYCNfwD1Q6d=7fDIHa1m@vlxgeI**%3_##(I;P zy`S=xEm9j6$EI^MAL6AW3LQVA`M2KTLM8*{Xd_4_F~(`gDPwtZBWYDaWzoFWxOrtR zTh>>A)eL>9M>jHY)|01*YdoB0$}Ii2ri`}`Oa7yDOO``i?dR96lgAqx&3iaQB6J~a zsi&}7tFJnX-E|*D-L=~jBn4A)7qUnfoxUQ_N+hW_38DF3PX z{B=I92JvjBq@B+)r5H3{_s@sTV1CxMv;HLqMpM>GB14CE@*|uZrxf%t(}L}u40bYP zPimT5Sp@oPv9aHLCu2>KS1jLCri|#F5$A`2O*kv2NJ+!J0;TCXs?lb!cp23iOUE`tuR&K9G4PFHJMG)%e#hFd`u-7+Bz+lOwlScGP`m#FQR* zl}s-^;CW+9<(j`fF73qCP%$U1^UL1$z^()WUeB#$jH4?&L2|1PPIBAL7PiI;@vx&> zimazp-JHSxw!yGN=9{QCn+m;gPiBa~^j!Jrp;?Q?D{@zJS+OX5;Dcis=WWXOPb{cQ zxswj9#`Y;T(OPPw*bPU~PkXJ`u_cFw>%eoApEfptc(WkwSI^jNZ6mI0VpG#5^3ge7 z^RA0UxHwrEVS0oi*CPZ|ZFb^c%3!>CR!bpd+y7RBC2G(%^GTkC){4d6|Ar1^SRQtl*JJUAa!Nv1%pA>Ngiawz1o@Z|k>_TtbVcYj-V z{(bOoH{`5_DPNeYGp(gTB)GY%^&y+&gx@jHzGwiO&5oH|GvK$b6cV4R1HkbKq_A6`O5stbCz6XF^ zDNYoi#S2*C&Ra9I9?9=;OfzA};4R?@h9?^A-D z=b8e(u`45FM8n4HZ^j=p&HFu`w@oOt6eExhGb27xX3n)32nsg(q*Pc>9Snwn5Qznz5Q61Tj|--EcG3x60*_K##q{b zNGL&-)KqD>fU@KS9e(!oe$0@yF7+F0g3lwcqOYW5-07;ts?E}Msjy{E6?_Pb(7g3( zUf)Pd+Fza;_)?xnGDyv+$rh+t^SZteDc2?)b(Ope9LZ5Ztug|Vy9M;46?L6BIx!}l z_iBs0-}O|^rZ+4`QF4drtMbf=^nRV7d$*n~+4~h)x`&y0Fv0y;zL!DBcQ#UXC0_ON zl|1$b=$f|B6tvm%;E3blUj1xfw-dK+c=6$D_DyHrkSg*f^jLCnsKn#3UzGjfk7NZ& zpkYaHQpoWQ(-`c;_IieUzYE);-(^IEse1|U9p)Y#-aLLqkQ+{j;~U|l z7RkK`&WD?k(VBB;n0@wX`h@EggWiBy7tNdb-KLE-U;BputszRs#B!CKxZe=R5h+h? zqL>DQ0gNo5B0C*cppuwHp%)mBt*hZtbX1AEryssq&AO5?U!^iXV=Ue;G#4AQB4T6- zNbLX#er0;$^=9Y8(dh&U^Usgj@WG`M4GbotUjdHju{VmLq zT)@l4zIWpK^jLBg>ET8B9@A>uty_}AR07y8+>K`0hI8kzfm^%!F=-`k?49$PG?_MA zk8g+;X@030;$~FL#P;z~4k>{4i!Y<**4WS6U~Fo4PsiJEFq#nW#**%Jwz;T24qXg2 z(oDX5b7E}bd26E`?3C+~2n)v2RKWePr)GGH$*JBF4 zEm={t*WgEiW&S;piCm;{B@DQ6(j8LH=w3whPhoDdgG!l?w9EJoQ{c+dtJ+YdsltB>udb<3De-KAS|FzGWr$DMLq19Bg{4Utuc0=-7n?%yd4gI}!tIxZjobjyCj8nV$0-KOohXpiB~+L2x1Hym?6-GK0x#*=NVs zg7B$${31>{Adgzdu48m7fVU7Lt3Y+Ru4GZ__rlt6+#aaI)p_B`wbMpFb?70vJR^GRRp$em|9Gl zJ4`KA9xjlZ^?ae^Nd+x=AXRpB7fsIq{4;WE_R|hV307w5P0iQ!9#)R!!K1u(mBMxv zlUcnGO=tr@C_;If0?5VOlKFjF*b>T5ajJ3AccTjLpZ>c}u)RpIZA$-~L;VpJAg5}U zq@h-F4j%Gy;2nb#02}2N{Ng=0`JmCx7k@u?bfYHrpeBl8K#>amP3rV7LYGId=+A#+ zHidk60fdv)>_qgjv*Z8 z2=B-5C>(KnouDZ?qrjV+vl=7zfc+&MR}vo^!VK{t^ccz1)r)Ew+WTOqqF<(2sL1t9 zm4M;%ODSX{Gk}5-fQ^XHjfCc)*~c<)A-BNs| zqxlo@y>)yRIgH-rBKOz)_Kt-iD%p%P6Js__Ic_`_h&pZ; zeKCoug_eEzs;s?9;>V52c_RANYOt<8w)N}w!krU6-d~4u8pX%j+=fAt!p4%Tag-MfJ zI!JOoUezIuke;lg9?1~Sxb*TjqsRmiMAl^*6g$}Gn!;e3Rz=7Mm7b9P#RnXK3JGa4 z6UrP@8OrEg-V3g;m~Wge*+b z9Ctc!k~)5nYp`?GxNT2?jbn7tw0E{8Z_MH%(xza&oFL4}U6u>vJ24z5f|>9ZS`Fr0 z86e)h=Yx@k!k$fR3zUupw6qUsFv8PS-1BX}7!n($uB z+=?0t*}Y0CM6bjQ#zcAUD*UGHc_-FbhRqCNq^0gVu4WR2Y`mU7Wynq#yo#s^JtEY! zxq&|S!DR@0a%bX$yD`6iA7=irZv+uF-_;q}qk^Fil1}bsVlDE-nI?b*=E_Rf?eP2E zijM0p*kX)yh~mTK&|NUK9!^El9A|ijUw#$;eE+)LbWhkTGp8&H*dJBxm`b+TN_n&D z#nt+}|Gdq`FBrca<4OadL$#^+6z{Q?#|2(Xrd_u$WI}B&$upSSvbBEsgcq*2V5Sh< zcMd!7`&PS=bUEQN_v*`W?;_Q?>aiPI@~w`cD3&`SM17pQSgW%@DDeX;o)#@cW)aA?AqOUK!^ET9LF-U$0VJZ&A3(2YAA` z*r#|2a3f7tM$HY>P3K&D>6U^+a}0isZ!%jrZXw_##G!FPV|y#xWQ}RPI*4AK4i4-% zxPt`tw=@71l6CU2tgT`cl2>M3=^R1eQ@&-b;;`ils~* z?3z`VyJF}ANd5$oq@#*1Q%R$yA+0OY<`vm~Z^KDWkxoH+53rc$<)L2sbi3~-lMZnj zcJh8nEDmx&wxb1EVV~Rufmi}*jvzERq4RMeopgKYP*bkMq6C)Ox#Z0lkYAcZ{1a9) zUJn#J(lmlGI7I{ur!i}CSbj065CD!b{FXaarh7?EP_~I6oTMKji0KeR)KOfjupSv-ygtNqfAGw;>bkW-dhx> zLp5kHuEo~A{Vp+a(?>=MwFiGo5d+Y;0^()SiV!z}bx5wB3%zWb6qfa1s!aNaAXxiH z2A0cAENvb@q>Y%8PBv{Emh~quM$k>@6Ub73YPp^MfLeQ7yo}30)5wBwpH^%$;W8A=D+J$uiKA}m$!@JB)Go3dN=(?qEsZ5PqbbO6DF64)tu-G23pa8 znPqok;OtBD7@a19bkI$F*5@~PZ_I}&vUEQ6WL zhRVy=Kv9yFekl@nT6)%yi}x;vra#R!qdp)q2`C-0E=MySU$Id7??DKdA3^|xmM|8C zmF7NodjeNd)Q}GBb6xlsx^V7ftieiyE!PlHD5iT!P8HWb@8<3M4=iYA)wq#6m`#{{KDQJwc_kjdbKkeg6rO%L zT&NzHocf;igg##g)|H5g_MOk8to}Sh5IY37 zmz~U98n)>8-3A0*YhEFbW%|!j)wZHw#zw*9_c^q>etc`#%6WLB+mmbJKOQdNNY~6j`s_ z_{z_u%i-i};Tx(&%|z9??=07^rWg@k%K7l_+zX@oEhi&1W`A%qOoX8#cEfdX?>iSa zzW{Lx{~4 zS{KhD#Hsv?>@Rf;x)x4zJRz+6W;C-)qp;H~t8YD%vW#5wqiZk}q1h|*|M%8YXW+lz zs0mON8dm1vlYeL1AccWppSz;z;Tqsz7$LdE+2;0aGjEOmqj4t5lBA*ge8+LQlK@Hz zoI0rMcqx_f>T9e(a+L@%N-Gh4Rmpg*adas6;Q>X)3%Yomc9^h> z5Xu)fYZVs)dL~gurEEQw=rttE70L^W7U*Zwm&QenihnFz>0Gx~I+s(1{Cc<*PQB?D ze+4!Vkr=ur6GH%-b+AYb5$&IbT)&a1B*V&mm{GISLfL5{Y*}t>U=Tt?2 zkGu14HmPUUanuRG?tmtzV1eBgp)sSq8izxJtcQWj3z1@VCZlr-gJKe^aG*0foQoj# zDMYaY68lj!mDnohB%oIB?3VCMM=jJNi-;;Blo>(whg6lzuJ)rUMub?TB8?R5B^fEE zhJSEsheyLfp`)d|cPZ>`q}c8MyXlb07||Ior&69pj(N>p5HoWXQ$Ugt2x@~!GH;K6 zrK@7!J1qQP{QEBp^UQ^L=E7Wcv8B4$Hx8Q_n&jZ2Sh3>vXnuP%?@s7HI(*#;{qBT* zcS8T^dhbnFd@RiIS83l!u~DY2slTn9^nWI32tbHM`>_#X5aceBBfLCrsl)d!N>vxJ z0`NZqh{SsvZK_NZib}-+vy#SuRwy_f`cCDpse;H8SwvS)+jm*ZlNoN{Cn z;ywt#op|O>JY)S%-e&O)+pCx29*37pRYdqet>ik^fDPMmR3MA;c?(N%0pGIo>3^_@ zq+T2?qCHUS3Q2sTv!)u)2J`!I9si4T7AbKZM`Phhof4?R+f?CgtnhXgc)LiiU7S}& zLYx*-oB8d~7zEA`ddBUb@&^EamDwF45l&`HMxU}3EA&fm3fmlXviWB;4H26FXVFr{ zs*76Db>maH&TUvT`$>>CnJeV8XMfy-LD2TI_`i>j*?tn-bFL8Z?Aq%!V>X^r)%XG|9d)@P*ho9&WtwE1ETJN3_8Jv09;#1Ad;jDI;xBmk`kh;dMGxk zVnjM-(7gactU&CU2r3#Mcmr$oZ;#JPBX?$r{Tsi@C_CM5Lj{LOO7C>;zd@ zv4a%56}m+@o+}wSA+nqhS?FA4j0hjv;MhroSdA}v}h6jWq;8bEWMJ4GL4>l)fWGQt=iWJ9A(CFDi1W6dIG zK8b0H2up~LGy)MO2>FO)_aU8;DMwKbXm>Eh!*VbHMkq2sC%$l~c%3|>0DdXBH~_mt zQGO%=MB--}Ar?Q=2!ApD%otv%?NDI?P6Q2z(3CUMuPimSm;Q)Qposq?LM5H=N90m( zA}_O4F*JulLy_B|o3T!!_YV)d@fZIBG?`1ZnYoe?Vim@DM2KPko8{K~bpfNmW~C;9 zkm;euk^hc27KliEyg)=E(Gg3WFN~tW=*}>QUeLQ=+?YaEH-8?_pcQ8{hEt$Tb1&HB zp?`9May{=)bZT$Vtna43kjVgGWR@g=2sJW#jN4~0D%|4&Y&sTD(-a%!FzLzcmxPbP z5IdX*dGu)hh{sa~?Lc%9RHo^Gr>mmjEaIlT&!&I0`Rm^J#9oO@@y^=A8{g>S5vyb+GDHQW9zQk zJrm)~Ymwl_F0X!9~_&n5TB8dbCUZ7n;?3{5Vf$%-iFes+mkfy=Vo&GhEI@TDx)9Y(w z%w&Yv;KCkAu?iJwkxb1qDJGh97uLE9*~@hq+IMyu$? zzx2zeUW-dF76;*uL4+9HF^CXjyUgH7dKF%90DqfG?aZFzf?^?2VAJLq+oqpDiPwtzgSHzC>uJp}r89cC3yS=~2&``^K9x8wYySz{!l z9a^?bUFRk$S~J_XJq%#0(h%(d9fnC4>VGFjMmv#W(VIi07}RiXr_r<1==S?qO*t$g z+%8h}xfL^|gp88T^mj0Nfp8PD&P4>VrFD8!jdoa?FYJwoaAlDGbXg_S`Df3b-`Z~$ z)Wnet&)3;T|I)8LqB_}~lli4{^0M3KWw+0-HJss`95b~iYR}W2rZG!{hF(#NtbeFe zUC@EOsEBpOr*khOML(FLA576NrRbMZ^iMwCeFNRqvu>Wna)03?*O^~qTm@coS0hrPxA$a(7=3SukosYa=+qvXbPtjqYTI{mOxuhDnZ?!{O$LX5>nBE;g7 zH9`z&mF7OE$RkB%nFs@O#zvE9cj%>37aLXM@O+SpMcgM1gxbjD65#-2nbQ|1y22{1 z(RVC@D@^I>0?!7tpllhPcYjlvi0w;_?Mvqds7Fu!m;THDWI&u65a(9|;_Jw6Q|QN^ zS(mwMlYcuzLgZN*M4C&uiSjsROoMRN2%a*~Nn$ClWiCQIf8Nes9R*(u9$YG74zaS0(fC$9_ zh!mq+`xjH^XVdF51#53pt)n!CzA4dJxi!Uz&Q!`@WP~5p!2!CSl_1>@jUFyGt>u5b zb%eK&&W(tl%|=-dIzclx1O{?dQ@2~{$(S3}u%|L|-$yoUR1>btCxaakqf zvP#Bfl?<}QWY)|SYgLN1Dh*qehOJ7})@NUdhjRg={(rAe1Sv8{VYaufAjdN#4b64!VbAL@nJCvV8L)GYPCMaRk z;p!4MW1ykXP~>*#X3W2odBer*p3$aGan3-&CWo(EH!!yFwWnVMF4no{-yq806p zCZw@x$t4*{$fR4yM4LZd-KY8Rm;O9O*IHcNSyj8Ns$Eglj>7h5D*&0rrn;RNy8!2I zRNZc=ZignbB!7Si8@`ATW5X8_Viy7za^4p*-t;=XlATY(Ubte0``UAGVTN0_A-K}3 zDM7XYLAC)wL0UNl}7PG0PJ}XmCqwG{(mfHWZNUQrs5>gc4yH`k5Puc z&V&Rcr-ACJp*~ZCC$`(uK=+EFKRi1N4;IHBF+w6tKg_&jlZBd7iOs3R=^pm^jYJ>K z-EVv>77ay_TajDbZPLuoz0;2g$1neb6#ZIZ1bWWnktZdH#$6WBSUL=2X(1 zXom(hO^%4f{SLw=5lWf-KO*rR+Db-X1F@xP+6-&5pg37!94_1sSMIw_KDuZ7p!=63 zp!q*|GDK(*<#kk@&{E>i=)@vb7L{`#NiWXSyb?4zm*r0kc;DoEC83 z0I+Xv$p}Xr+e2RU1Ld$_s}P-E5RBBwj01@e5KU4=|_03$KgHO+KQd6%Y-$-2&c=`Tf|)Qrfa{fWT9C?5HDDDVPA&?E=KtGg9p13mPeQ*JOlp1r^__HNDwQ_R?3@QJcH#PeqAhcxgD?J(iu`%U&A( z#KhGXv-=|`FA$7tZn(ShQc<(IRlEu=mF-xjnc9^$D@Hr?=P5%!(IFFN2u5diJgA=Q zhbS%=ip0|st)0CUH7h_Jjmp}!lF^BEC4Ypg=Y(ml^)%PIFmY^j_CQTBBE%$ZVbl46 zRi^+Vu}YliI-h8t!NbR26C1K<+W1Vw;$y53VB}+77O<=ZH8N1fj15erB1t+#o{9)D_Vg2NSpQa- ze0TJTFShv`Vb#tUkz#8mBgDo#|82ZCMQ%lIoY#pPis*cc5HUV^O(Nwex_?p>9p`X` z*(d0-(;@TaCB( zrdd(gfe>wK&J?T96eeIgv{%3^0tF(Dv4F`&&1|Eld{K42=!u0KJrQE#o&Pr8n61*tEatNdOlcPDQEQpN;XHoGxF0i;gA^{SP z=Rlh(y`hjsgx(C!OfyTp$=Z%shqg=&W&rh_Tr(MANyVmd5EKSvgny$&hzPSg1%QZhFzjvVS0#tO4UB)q7SqYW-qQ_F7H#Y)lC9tq;1-d65)r7z&V}LbOM_bW`&Do zqp>NgFH+E?fLA_*k%AZZv97sk&HT#uIYGfNwu@4t`u# zC)M-Ie;%zSv0Ytcj(;sO$1qUTB%uC>ss0Db!Ev?P-S~RBHg~x;H=b(rc!{YV{S>61 ziu6;GW=-0=->;R@$i>d@=!}VkN~~Pm$Bp(@3K9xzs`FhGC1a&3ixZr+VUGQ7NW>ED zN4DAsJGkTWnT)U=%4nb=+BDgqk4ESM@wT~j*G%0tlXuN!Wq;Yr%Ccd?5tRp`J+Q92 z&p=5;Qd=EKKzY*ElaUA@wYYp%)Z^aN;@(jHqz?}fQU_uBY=mD(5@xmH_+Zp z#fWx!mxG*Ilh8AdRIjCPYgO@~zI_*$Pq`(hn@m43`-J;usjp;F-2iqM`Aq;919CW( z`w6-(F8eQn@_*A5yKOE|Or9}^g~Dt)>C=mtNkCL^dr86YIvkeU{^bB42SrHS!RzuyW1q?15hJ|z z=r<&z&3{&kOddiE2SmLkBgKMqKxAEkYF&YbbqY#6Mt^62%Wb(4Qd-=H*T42Y{3ovSROn(f zkiTQKMs)UsadC$GBM|n9^qL}y#3FgDj+CwtQPB7cD9k-8=ak-x6)6!ul!e>0Eg0Ud_gPgmy$q2Fd)PD)-iF=|YC*IEp=}N|kaBwA3mw)zbH-F_{ z9~E*inOFc;*XB~s`clvOi_R45zZxluB7dE}%{W!VcGNL0z?!=!BQ5#6jMl3rzN(4u zrecuM`OzvX-BlKNg9R=Ctke+!;0~fQ35rP6(2A>Rg^R3=ONB`Ja`Xg|bx@Hf27j^7 znvJ1a)RF+c7hhS2YRZ-Ol96KbPDY5~VrK_dh2{uFs<3=ztw=yQVW)%{Y3KttB zailhlBSiSR(ksZ{KeVG?{YPI{m@YSMUduHmmze$+RG2=Ykeg^YOf;O30-{~={jrP9 z=e`EOnjC9kfLI+ff5~)aITU+=h%{ua0V47-m?l1MwmzLX5&)Fb9%kGC&VRHx(Sk|- z7}F-BE$=~A_#&?|Ab2~H0A3l}UZV|#n@IJY$CtXG(WdMC&HIgevQkz0Bzh{Q(pnmE z-jl#tR3F=ckeUvFk3&-fz&Qjb?MMB0R1VHR-#rQ7GRtThAwrCq3?jrT1e1vnBdNJq z)O}9Hi10lq^j_^ibJv&ZT7M)xKURFm-U6UfclzIx5n4fL$3~>AVpCEvlE@RUG{WhR zU;2FFd0hGmi_;@Nkw~#<4Y}xd-Jp+!S_6>sL~+!JP+fbfgC(}8p}!H;OrpbTJeAK- zMhT$8Wf{q6PpGE{pOc8gVaP$n70tr8Wbg+Z>=umAlM(8YBa%=6_ ziH~O;(^0H7!ii*CWo5ob=^D!xsp*&{%=SeY^%Rt+o&SvRy=(k90Q@?pb>@1h$gg+a zuIs(3ePfJdgp)5#AF&#is{2Iv7K{OPcV#Nx$UMC*zkf%B)y%^Q585^|p6B7KhWMxlT__9jFZL=BZAn9yWTcW{p2-OB z%NP+pnYwGmNxf#v`1WWNcX6XDh)8UxkG~pg`zO(wo#@MoEytGa;d>PufCw?Rs1PZ3 zk7R@xQ*K0OJ7~2cqVszhGs16U?4~<9(HhAJF{Vi;)1>!&xqo8Ldiq!YHA)m0Y8E^# z&32nny@=C7gcwf&k@|eHdzzwVq0?d%Oni|uo`_P|%3x3DeVhu4^8+=%Ld7y%W(!Qp z^MG#_B7o4L>_bTql;))2d3xNyo ze&MaZW;NpnC4Z3OK3;i1WC;Z}m|0g&0^4R(_M(!%)4O@y(_J0&Wf_HkYBxVi88^2T zWxEL(?TkFfMR*xiy5VjPu-w#fajEdNW5D^^8LJ9a zMTWlSl%(<{ZHi0U6qNzlu!z+-{CD)F32^b5wfM}95r0qtop*QIU6JgNSajI?EVcov z7fYD}07aHVi!p91mQ_=yb>>7T?Usu+!llPljGUoA>tS`{p1}UB!?wf0eDV{t^s;^q z(e^L=qG7^{!vKiPL)|h`?8edMt_s2wIT@YZ(z(*Z7MKVh8s&qUwd^fR>)GOoyO@0_ z{mAIDe1C?{Q$G0Be~a7|H8LPk81oB8B@9X+)wjgQt(T}hWzG$H{$wgF);DJO(-i<^ z04i$d9~_;WU;Pj19mU1_?bOWpc&w{L>D#h4vh_?XuKd&QcJH54NAEfv}AX4vIMUoI)-i)&dRYsHrnAbf3$Ft(d#Y5 zUW(9E!o%)RtL)-&QoC~ToKof&tr0+Hc@YVrSoi>K>VTG!jCOI%2--0nF0w=v?v0#X zaixCVx|E2pN9AQmBy!9!HRJlsq9eMnV1Ew|w59c%1kl%t2msQ~NLT=v^pVKoxZ*d4 zgMD~i0U_fuBXtU}3pNQ@WrP^+x$2x|MY##by#v7X0eTXg7Rl z!-?R&MYfbiyW4}(2xs5I1|h)ttN%SU2(g5+Y#g6>+}0=&5CNzqf%8A1>=+`WK!0cz z>yS|-iVhjwtlk4;+~-C*A-N@^ZEcOSn`TF)?3Rb@mJ3_QjX+pCU;f-2T&1%DGLMM%ut zEg5ZE-CQLZNh>T%DlA(mtXL_mpn)tFI7avc++6_5pjIVNDTN)km(k-EQ!NBvp?wjZ z5k%)K4Q(mQmrC8C$=K=UK@>G4A`uYVos19*dZ3cF^*#HGC^Du(M52MUMu%yQGSTvdz+w=!ow zqD>8u+LIAtO2lL*V!U1H76dAe6>ni~FWzo1=wu06;P(-W1kT&ZXnP6qvY2Ra#u`;g zE9SAt%Y4KJ0?m<(5aarS=+iYvh1*cXh;Z5%BSMUyL8Mrz$w;|3r+?liJ^>K`d=EtG z{roDB-8vUJL^@yH=PQ(Gj5I{onv8I67$d^D86fi$;oL+lz5o+q^;V1sKY=l#?G&0m zckw$vu9z?DqfN{Lb1tdXIS*ms^Tr<7r(h*WteW+Hai!AN|3ae!FI5rr`v3 zem7~cI}PeAs3Nx_w}0|RpLD60mvuivhirqPPq_-j}v^6NsEj!Vp+keyP7D>Gsoh6Xz*O!Tt zv3f*t`W05CCtH2do|`|B<)evQuMb1O!K0fetzHAXTl zB}*~_^)wVlj5f`q1}&|MwK5nZ!WR*7(4v@~e6=ARv>UA58}d8ReS-%`a-6?<(_gV& zibwpNL4R%`LQK@RChA)*iV^Jr@o0Sw#>!NT2saN}x^8*3L8XBXJqO`{NOh=*JDVLN z!U5sEEU}f6Ii6}U`M2f9D86oz(RvJPvOtBlNVR4f~T|US+K)B{Y>(U7S*JCpa zfOk8k#AJj|?P&GwZuJe+?qsA`ZpldBcuuOF!hb7@2fzr5M2v}KT#$?m_a!35pwte8 z7`?2B5aXWtauOe&IiV2>6nYY;(3u1_IshQfibQ|({*RK3@NGlo$_SqbmjmX-D>hRC zXXK1TQWC)U#Cf@O{le*AJ-q1_b^AeKU!0C4?Z?xW&WD z)PLSI!kJ@?=|0 zWNMK5Fu)!GVISFi}yK6}TTWZpYI)MF@Su!Lvh(t_Lms5trD?AY-csQ_x3g*5M zx*`gSJ4C1^6j0%aPPQg8wIN{-wBb8)L4UwDxcpRk%bU zKb_vmQtUpKyaB+99xZ#D|j6nZY8}b9Q4y*evN9Uw=BERh7-^ z!e)12v#YQfbX~D1he(vsQb{BdW%N-OcS03qb7ohz402y*BqBP$ySLm>)gBkDgfCpVM7ViT>CAZ3; z#0W7q_hvWuX3&{3T9$f+2{7A=!M?l6zJq9Jz4aH$SOADbZr(_-Ab%<}P+)Q9O4LyR z6hR8TIj!E56N70k&IvQ)M2Jl;L#Tm4bk}5bGGMne=+5tGq%^|EGDh;A6yWkoMvC>4 zj1-GHOb3sT!W`81Lu4#Q0CosHAc;}>YviuUXm=M^j1UVZ#1Oe9gL@*Nu0b~qwoL^{ ztXNB=Gyi?uY7m?|TYtfslK{#av>G5njSD_EXrceo#dP6rTjdjaX{I}{5n=_z1)@)r z?gg8<@R=pr1?!-Q5#b9zxv2~F=CckL*xxD@4z9zE&Q#d3tTe*3P+1}Y0ug{8M-=R3 zZhX7;q$PWIk`?<_yl{ZkTtX!WNLA~Q5GL9KPH~aGBEoBf?0+$s9Vl<`c#FrwOui*; zncsO93l@7sibctbXlGL=tM;xZ$;|1+2n^VmUW`61QWfm7ZhIo#_0s|u>!&Jaq4x+K zvcJYxF0ga)PS~XZe+rz#i|`->_=f z{dDTvdAZu5xqsTBdESZ=c+x@To zX^Jkjn1TyBg9J95(GRW=_6~G;+FqWv?c(ytKNil~g_Cv+AJ`sMPuf-TXSkQ`4agpU_T^%Y%!G+WECV|H%aQqU6OsB=jTE{S8k*O ziC$8q+`~jiM&ctf63To!8`{inAld~Qv#~FkI%_^@&i_=cs32-Gt9q3yJCpNJI|mU` z^M7{4;Fk3Emh{$^G;(KG41z#-e|F~nrUfes>3<|3a-Mt`ESM!XfPb~hi6jn`OY4~!Ixog&fx+z08}vxMzdj6~O2Kaz%74tq8A~b; z%Tg9kH>Q2X2Mr{RB!bcIWV9<4LX+8r!QxlZMv>|EAfi3pOq1Q7#RXc?O09gy;;m&4 zOMNLH82!~H38-@{lB-0xjPODL$yUskj3jx{M>4{%WY5{K;PYH$VN6*eL5YAW0Tc7U zMR#Yp8ccVd;8j!ZlLDJou75YKJaoMVm@^q6w$Rv0q*$BD2){>!WIHVuw-pe*BnM&) zJ*9?U|4(OhLajjzX>_e3jCIu+1CMZV>^A|>vV=ky!1)@3iZ5YF5MqtPeRd^oSQ4BH zg#QPaCwwaTJK%-!ZHy4R*-puIk~%8=_lP!D#zk5PzGfeMo|&tK{z| z&l!*M=ZMQ6OQu0H6F-+a1TAANz-QxV&*L=x>;E-@(~0dY?4vPqM*Dtb z_0B;F@I)r+)r?#ylg5i!Fy+6zu-7`@HKVZb67eS{eup!B;O!Fsn{V^>Gv`t~KW6>h z$B+4q-z0zP%Nj#H%YXjZX`x@cqp7}6^+-jf+X$=r3W6rlrgY`GXWuAz6O9dU32!fy z(3z7FK1?*c$9LBJ&uIdvdQ*)yO>`ICUn{yV3T1YTR9pB;dgmVgz8tM)*1Ju+t2Wao zpKjG`JC1YZ2Ol;}k6N^30BI@A_1%o_V_v8NZaAIEXj5x)CVzp=*0w2jSZ3cV3(Q2j zfn!F!u=!4RT)wjTCS6@ODG~Msj1{l#XVLnUXw!hN(spk_(=lkEXpjSneF5db^md(1 z3ef@xv>PPzASDI_!WCaT^LHc18EcZk z`uByRHn*G*%zygKGqWI{J(2(lh=qe0(C$b>MRuMDrOa5P7@adlw`L<05<-K~2&B{s z8tH`+`i1)W*UFhwH}iDU=7dX(fFd!q5-E1014|eAxgcjwMj%p6P=o?(Sd~X9sG0Iu zd9fPdfK0eI5bbW3gVC9I%rNb&7fZWXX=8WAy#mL0)?BBnuk#TMXdb`Y zrta{>SLJBk@Ja!X!p);FmB2aTYWY;4F^&;8Yk$P8LnAKHj<3mKld}bGCl0wpNbPgT zT^@3$hul#-ls+Tr&z;V=-}tj+d#*>aAl5E%SFw$W;v3R&xJSx=NxCT3Y zERvBimW8`kn2*L)cuYBBEq?~tT+T(vZx`eIU!aDA`LYksvqKYY`R3UA*)u-G>ivsT zaDO+=<9PCX#ifyuPo4qu9NFl9iXFw(l0~o2C6m2odEHEL^&rK8M<$!G+_#@atWkgg z&mtCAv!BJUePR_3by@@Y*#s?`2x+MlUtWv0TQSx5s$2RCND&jgrJ1EOplwwg-?0_y zI(2^1BwtFLQPk()(!F9|&e5Fr+a%}5>VnXxzx z-EBrj@d;cf+Ppwj(GI2eSYXz!MJEw9l@T+N3>bzeS7WWeP!yRi*%Dzx`g}JIHIbZ+ z#Rt*$MVizb2Ej6p4HS0muxE%FnFzl=F6u%4Bdqq6^Her4bGv0^SuxzB-#-P1-+%o5 zFn+$m2RgpC!1fUFGFW`6R1~jFu!M)0>6w*6l_kKAKI)2G4$-FWPo{Q_+R_dR&P#yP zI~4nq5Mu<|6(lrni^;u}np45A#GH_^Br@_);{j>E7#vPd2;p@TMOPrCdnSFlfzFT8 zqQ;$It#M5Q@F`C{PpoJj34BN(B!2-=LnwhybZ$|+tPd?{)(g$?2ge2PH~$s(1BYQ) zpi>a6MxrxevC?M*E)!1;(asb(i8YFQiQr933_Aj#j#TP-0*RFuzntjf|Fi?v27fp_P~+zi zoeMH_HX>6DbdF-zKu-iReg~%g^n?Kkk?W-0b<)rfiGO<`L_~l#ZKTks280uP<7&e8v!hdE;ZPBsU0B9zjduLX z+gIX5D<8C{BXbXA-Rf@L>W;%4vAFwA_2f7IBzb2vVUxpQ1#2)b!MFm$-z;K%EU6=1 zLg^`?ly>n};#^_TyzT8{njY-fJ+znBbt9Df$EIO!CTg4s^g z8-c_d9yJ;5imkyF{&MWOh^<}4Z9%j_Y4yPb)Z} zH3?9nV+8q5)7H)T=TQz0`*_yDun`|s8*!pd|I;|Ayfel#ZPn`}aewO<63SL{g{M=6 zE)c+$X1FB7J^Kq_)er)wMyQL1*nrWNMqXUWT*)^O>S{Q{0e|fQvM&5RX=*!Y(VLUe z8B@Y>E;>Gekc^;eZNI|jkyHCvxSaK-z@{fm3Bdp$@O1OLG}1Ep@1b)~ zLR_J#Mn+2A2v-CcNCoV5iOa-Ad^+`h>+e(fue?X<{u_!^lM`M+8b4H#R>-sho&P^I z4-l1sv=ob+;{f#~?8oo`n(hUbF4dqe{Aa<~-E9-!ZGRIVYJ;KNM}+T&y<0YoWejcc zh;~>*sN>ITvc)e5qEQk3YV>4;i6uPejj$AG?_3GAATwZ%RlVA(n=Y2!ewNX#bq3yq z2PC;c%m5Ifs@%zFXZ1d%_{QMn+}_-2cOD0TTpgnQsBU%SNZdHlXEH)&lKUhge8h+< zJODmm=zmb7>>7UVP&WtKbY+^@y=&&Ls8}=`JAra)89gki2x5?Pt=uFuVkvPoU&?}o-bw!I>e}B=pk%%P-h7vUH=WgQ4jB;=iV(ZZB z9jHW|$oaDEP%eM_*FXPqlV6UJuYXVn#V@L}>Xdt8uU|#obN-^q&%VUQJ4zuJrPnC0 zSnrp&VL`W(m2iGSKU4K@|8By@4#vpm2H@ikL63~4TcS;&-cS}5H*?Z<#7MC*lhLM9 zZ-2p3_IzIKE6z|Rpv+XQ$>_vXO8(e3z$&=F99iI;;l>C6IAw?cFw(g`rzU>J?=wVwlDa}jc#;7YPypVnzegyaR9KOKgFbEv@=O+A)O4gIRxSS zAOhK$sgAS4Z%Zo|qS&c4xIo!h<))!h_J5m2vViYKbO!mZ7!f|9!;Y9}^InVf3Xx)c zBqPOcq~SaKB0}bB(YLC@3J$Gn9*Y-!rttGG6>7gJ-Ksr{V)h(TbJLKTUt`Sk6DbyX zexl8B=3)hw!*7`ykc(rtE4oD7AEGevL}<%0RUeot4@_4FTv#X?hKIeK#$)c(G=IPn z;nMYB+D{eXxBnkcO$tjmK4S8rjsTJ9_fzzH@yO3gfM7#Ud{9>$L(auZ;cI_@26_x0 z&V7tR1GG599zE1JfzS}$U=u=g_9(YorI5P5u~xdVR(cg{j^BUb2Xla&B%&K326s&W zL@+bAAckxWm&xNMYH=T5P2l5qqkkaWi+Z{utvzNk!pPOJX3cinOR_Bfg+LDBtk599QUn#W$)T*5@~%=wZ5pD z3N>>-F{DHR6d5BKZBC|fm2gw_G}vnr{Z^}O+TP||`SWDIfBQ%2>EzTN4S(y&$qL^6 z#ZhVGR!ocllL>x53$`D3Vv~*7A#f5@Q$Cj{q6n*JJd5sJ{=QZ8`)~~SjB{);-*Fo$ zPU9rA`PE}WWAv-+356L8|C&HS$!(Ww1eXVsq zeZfx;a%_#*HcUs8vn!7-BYy!ZJhznu_B$jB@vu=k=q(8Z?IDCB1-6CaydhU=kB1}H zXgoQIr*Qj3$CdNF(`x=ZzaiT0lCG8DaaKQS~N5C0w$WU4Oa1%bqPn8%_(T za`_lbTA_(f%j%?U}$Udg&#v^y`e7 z7eft9>5CmmMv9#g{NV-ns*$mquu?q+RF81Q$+Xg5V$7yBX46X3ri%!%*myl--Xnle zEQ&BaHa^bB)&1PHzkkFq3;?)bI9xEK{g&vS93Gn`HJU9CGGj)dG;b7W8J$In z2)43Tsa9z+IIdyYun{g{LJMt$+_@$!6ITH_}bN8Mlh@8y45Mgi3`=1EMA7r}eje+~2iu<9& zEj6;F4ko_ve*B$(^pZNrZ{Q6BYzn-GG6NA#V~MOCz<(}~4T0VQ(Amja1efSz@l4h3 z!nrG^{fo^Q1uOp?+1q$4ppTcSXywiwNt+t&&$XuK(xg`@LSNCTG?M^0aTO<(Xcw*0 zlhH0-uN$HE%H`AYR-<&qh!hL8A|k}-=0=2A6gG@NGa8VCBihu=i2?}Gmfu2pF<#&Y z2y7@%M1O6U-{Mb9^=0~(8oCjfnwrMjOKj;kV=1pCfe~V{ zQ5eruZ@zBzlzn;1z8sq`)ARRZdj4l;;`om4w}0??3oZ*0e%*7;lT#`uFQXl@ZLx4P z+Oj1cAw<|I+f!S_O&wjJ2Yt(6@SN^i_uX1lH3um7iX<D;=&5+BCQi`(2{#^0xv0U**$wS{-=W_m0CEl@0Ds`w zAR=3}!G+yQM(1G6po$3K@F=y`T}r7guT;gHfy-LdkL5yQR%0d`<7^Bb&6-m&B3wKq z|4WK7`=A+}1%fw8M4O`Ll}CuRsxcHB_Vv5{e?&M;+=g-Km%Yq0a`JC}k-%1)QhjMt zYU~#>QY;(=h!DHsldX29X0o@@Zhy{M8||(_q<~UgP5H3K2>34I#AYSLpT?u&W~A~o zBRL^Xgma@cZmWm5{tx~ly}MSRcQM+MWSq&!tuE88E{w5$K%`jgVTcgp;i_)Yyo(M$ z5jaRZT#r=TR1+8giz218mPW^!ET3nOFnz<<~NFn7w5@?D;h&$Jcq;v zMauCU8ilA)K1hBw!uxZ+xg9Hx@f+=CGCK*(XA&yZGciJ;EVkN4n`T;&?|(M#80SI8 zyVxp$8cU1h3)5^!@trkQBY#;cJgT!P+wwCQzW(~DT=x&eKbn>>S^nd@uUq^oNLZ%g) zV*uq@V{=TTJZn~(HE#-&b?T9Eb3ARgOB5#2Y^b@TZqyv*x+^}l!NqyeYJi<3ZDN06bS~fux~WloYP|F%g4E9&}g7FMXW=ar1k(EA1o zcs!o_+lJUr-C$JhN{Fxn;R2gzdq>dDZK@P9Qwm0C*P&M@k=8iima=WCffF3ILqte* zY1a>QZW`|}9(9c-!XeSQ&OP@jqAineW^_ZIwAi#PakCRud-Q)%b;mz~#=PGPZ}+0R zz367AxSV>rKU2bQ?h$Vt`KRU*WY4+Bsn(h&0@KU19~zxIA}+?Y;7Jh#6hQer-L z|2WyOfB5g&-4=3rXE7##vHtXm2w)c^&r|!L=5uF3Ljp)ePN}R!KI8ms+=-yHWa_XO zZE6)qv4==IeE5HsNv%CfJRyTew4>eaBxjP*Szk?W*1a_^-mMpJ!$p5BFFVhgU5d+J z#KNnTNR+c-%GsETRfWh@4*rVKE+z#S;m1n-3CP@=VeZY?Cf({qqJCy{K9J+BHm|R&-xDeq~h#&H8`a;8s zM*4<)I!Pxwo+~D$tOoMm7`&CEEH;jpF5HO=8Q93B%@9L*o8|i1SEd< z&k}$1pWn|M*b*MV@jg@{JjS?@QF^@~?hP}*9$SS;9iF2B8_t0MvBAo)M*Fx4aais} zVKV^SOXpPraVN#AqS@xWYMzT5E)f7bZ0@MS8vtF=@iOttcZFRSp0hlBz_7N^!O&3Inp#cFv2^;5Y=(dC2dVm-(*_GkH*(ApI?e7*D zwZiX zh^EAEi{f#!I#)_BC<*=(L{HcwEyjdrmq zs!?!_nN4zOshBWG6xBmkY$J6y&z(eDszzI?=vrYW2-`RVzC!Go#TH*dm<+|k^r*D1Ffe-xDw`>K#a~bOxG17-J_F=7n7O0U@MX4wq__BSLEXCs=48BCjy#qyQ_Vkq}0sKt$a`tuB48QkFvD(Gp z5%QSr^cfPdzpKk$B}AleKikV{ECKsA_#vIo>3_oA-#u-hD-O* z!7H>*1VWOL4&p?pMP_sv677nnv*^VkI;*;4T^^zk0k&EqLNE*0O|&P}k&Gh8$SRmQ zqESJ6y6y`AK&4mqtDe6 zk2}s2r{el*1IT~0^zF2C)$k9ni}T}yDv-=KN0HA+jGVB0xNV~?XX(d=XTakK$pi|m zcjd>Dk+vv>jTa62(;>iz)hkfs>LUj)@DvC;_B%10k02ZcD+*}KS%P{&5#!ekR?h7L z!JsdfkxFXUNJdd9huvOGl0lZOV38-I-LW(QQw8Xph;x6JhcR*h^@UY6kHs?YJcf=z zfNkTx0SaO)o1)*KQLbb_#3BT&F((1Z_-M3bgmVgMb%0HE)XZ0g`z*xd8V)Ue%r1YA z%id905BeuG7WnhYu-uOx6H$ZZHb*$x4G z7f$kG=MPmeU;d8f8-R$!a3H{3NU2HSu>Z0`M9P1VeBnH=E_h~^IQh4#$)5-Zh-(C* zO}WxM#iE3NdpM{@lM2v@#cdvE5eVmv%C_o_q$(i8jRr=@Rz}PSx1usP{bx@D>F@np)F!|S3stnUnE?O`AycCb2+J^L zbBNBchRlUP$Y!B7aEmI`G=?pdKH1}&_{e|t_b5pqA}VVu7mkHQEM|eg`VOrvBQ2}7 zfUu-ShDj3LAO439l0BOK|dZ5Xj5dCZ4ePS73dQ!y2zstZ){eIHSd%$uA_KTQ^W5fXn; zQiw(B#^Luoxk6u~&}{N*PR^cjDD*)g$QBKnjQS>WFim4Bk(kf=3P!6?@2!jR2B@03d! zAd=koXQJS8f;7VKe8!JMoBF+fkN%Sk3)z#YMO%G<;Nzh5i-uYDt;By+TRdU$F4 zno~8gp5+*61S`81Z(W;^;A>Lz>ekK5ZlfxdEA1lo3?tUk<;~8|P8J{HQ^{|+C4z-_ z>JqvUF$YzUU{n>+t$34#e4o*_np~m_n$&!0Lj)riI>CXrOKuZZ1aTbP1`L+a$59ZF z#z%5b(Dr*K{|GNGsuzD3^`(o5lpCf*m@6RKY%#h;Sq{nr{vR)FQ3@kZGWkSpJ!y5a zy5V|hJreBZO_2JE{L=mkx#V+g{@_sTfB)ZvzDvw)Sp`obaDjr*YlQ8FYSwhp>e}WL zAx3c%BE+5-R%?Z8&p8!SL`muCOO*;&Q0IjI!b0D{Dl%-l5(R&7I+m%K*`k9)cnK;Y z(T=wTvu!}qDraO}^CP2Um7S2n8j`}gmGuNbgl@S+iVcN^v$n-q+h{#Rp+Nw@2I&P> z3<%mxMv6rNfCw?Q^>(EJAlEsQ5nC=%uR_tMq5^<@Gte1q&vcXcsFF`~6A^8wMc|E~ zHgQj;UIB3W8ybJxh(O}xm47R59H2SWredokqdlx~W27#mJd@F;8CvGe#q7seU;JPE z+pUce5xTHW+9?_BrV6mc1taN_Wv2=d8yOH22_#~lsM2)Ve^=6ou?LuE^)e#G1OPcD zCL4+NfH!0e@kGdDu*^t=tAJxvalJUuRgw{6ohoW8v{kU+o{SqW^^h>k@u!KTT`G$DHwCS?JTrsc*!lR%Sf zp#U0LVcP((L&g~UWdI}!F{ZZ6-0fMk+;C%062YL~U9VnpC;aj`?R=^C1qzeT&oCmDa;3KNkp_-?N`-s*g=5mJ_nH7kTH z8#60$N=jK&zlaozW-_AhAfYwS%gyuh?+A<(?e+3dTdO^Y%oNjiY}oF)H{nP@&Ni(^|3yCSNDsX zU#2PH)AaA3N`_e~nMPnXY8*9V@awEI#at5~`8WDrzG9GPQw$%chvgoZ&l1irw7}7? zkJ0iE{y~^(7O#kVPe!P5He~aNP7JGc0hE8b!i&aeSF{R-Ee_H7{b9VE1Qfv$xqX!A zm~4a?#CCG90zWhIL=veuom7;o$uk*kE6JosQ)YNfFoMgY*s73)n^nfYWGq~uE4;XL z)+$n96)CW)52dRQrL*g#OT{D_!h)m&a&F|CfX;X|ke)R{CpfP3@h}D5d`h$j(l>um zvmt_^Wd~`R=Z)84i^IiLjkpqFCHJ>BGp@?2<1a&VY88XuU_swb)0E!723gtv72r#etY&k(cio7Ne65wp;C&GUUk_(!J zuC7S)v2H-5X4Br2k?Ig4{-GgEx`dJ?WShFcCJV-Nn5in&3@kM>3KD5@+Pu}ql{#l9~w9;9LrcRM4uE8 zj`?Jv7YO^jm@a8heH2CWodno#7Pl6_mhC9EMHjkg&T9n7s;YnF46z>p`A_?jR4Q2W zaW_;l*nx*NUQ@4e%de4pCL_cOEE$Ou8#5W915S!Ute$XhK4vo7MN&n{2r(+zP0l>-n9WESF`2mkpJg=1P|U@5lLjjFS)hgMat2e5HL4 z+h0Qie?c3Ej~kV#8$5>lUH{Lpx^Zqb<1k_uq;prDyFY(2*%Jgu>MUL1fi~7zOaI|- z#FsgX8hF!R8*1AS+r}FBSqcaJarI>M5d#^BkNd({i-(WD4s|l&Av`rc7C3nL_$v~r zc-S~jAG<{XeA@JcB-L8LQ6!2&~b(c}AtTY5EMi8*jYiX2E< zs@Ynq*+K$~<|BjZX%p9j(IzpfOb?PKZW~Fb!@0%BfHJh zU7qI>JGaPvI=24spP&G6;bSj+=DCd6{8;)oUV-d$h<0!ytX~VnaEL&EQa0F}o2z1O zHab6UViqtuv5zB^@Ng;^=duhrS)y}#P&^Z0wWw6>DueG1n)rF#p%u%^C&1Z%->NcB z>luGR#rqsIqTPVvCL-F}=sjD$xYQM*^lGuEpOKoxWcFTs9amU>5h+&hWTe;^M)4hv zt|7=ugezP&_CUDCsSHbm%~S*Bw_DLL2oFIOCVFX4izCGaykPex~2K0|n@$r0f? zcvTstJ}}aHw^w9{2yA!`f{cbKKoo$*8LxlG6G;FaP@Fkqd}aKyh zLS4nGu38nzuO}j~VT{_QZySI3 zpGcaUR)NPIL+zClA5q<%@Z%#20@TFU0oXK?3@Kiso#EbF>HoDbKFs2@^o8}xS^5d= z2K}?Ru!**oMyZR0P(Vp2q$I$*^rm;|St;NFf1&ddK)TC8`y+a^m@zwdO1XfO1Q0nk zl9Wgw;_U6e?)c+e|8Iv%n)rynhsb}rajf7r5!#tR8;&JG1bhP&V!n;N zzm2WG4ZURu0BE;qJzhuD3M|@vMFPcWtIu&-*qCVMWF*nv=*J~etSQvM5Ji84DIvOn zwIqNecp@=M9QEIS`rCh#sX8`k(Fj5$o@wMNh%iKR3zxNp%g9O?X&@i$V-HSgLEBoD z4p3xK)S)s&c_`{op~r%fc~4faB4Za9Cs8l~n184AS2GnO#(Jo*T)H(cbBCg_iI1Po z@+0oYX!iuz9fC1u=mua`x>tWqmj#D24uH{FQJr-s*ik@Qm3mQHH`N)!6q-nL`CXEc zVh$C}?nRS((cE4%wHM9oB{nu7xh)ED3w%>Au%(P0Whgrk^>(6jz{8U}Hitl)p6hXM z!+GXNshoK<8kvF4;Cg1ca~c5f+i(kUJ35hkiPJeOt~D_43&>|Te9M1`)a)EFBAn-m zWIYi+Gh*jH`oT#Z{nP)LPKaSuU#g}epu4!|AdGYM>Vo4f6t=~`x3Za1)&;zWcsH@-DE5y@NS?n?#m zOOdKbeTf9C$Oy5CwX=UZQoG4DM*A}n*3ZORzthibf>}p|80I+uMe0mOyCC@r`xg!< zXfGM+Ga1}!fpOh#)A{R40?0H#83_PK)UwCgMuc@%@Kb@1#4A`Z6X8N*{yG3o8EeMH zy@!=_LL+=AxI|q-f{^=80=QMHZdKHYMrGw_d=beGWyZb|S|)$W3C#nMAuA@96%)$_ z)qst(+Ft|5l(+uX@meE%0+ocvH%h`X|B%*7wdzWBr%iRI&8w2|i~XjAevL3&Fm}5y zu04HmbDlQgfBvVcc?1deon+Y9mtYfoC!@3Sm`nFmXZXw&wopcx!RPD~*+8SM=5iO?e>+VljeNnnFTb0fe;ld8ayohsiJ&MmQ0gK= zorF6{mBz@Q9J}qf{o1LDoJ3=5;@r$nOvl}i-^!e!V7AeI(VCQ zc$b%0e1H*R(%a|vsM7hrk-{Af3f&E<^Z~XH^!vFknaFTuq}e$zz3QKY5W?BcUR{4> zO3eVBmE}Nw+h{jinHnJ$iAy8II#@MCh*74V2;6_~3C#;4UGVrWO;_o~wc)H>)*qFn z5kdk1u;hE!%Aa*kY^6)(-nv+nlt{4DLZDG&iBiVG^HMFFUR z)c3^49Tox63t$wNC8k`}Xgk^b!9)Z)GhIh++31W&RWm0MVx3fWAjIMn86g&@(&)^( zj$MDA>u1;ePxMk(KKDUvfHN{$jqJRIp>{6BjBqVWVq>*K`}?E+EuEK~Q$*LqB=^Kf zt)ub@5IG?Py8kXnasWhx=|l=;p^fi9Ss|ibd@zl6L6$ONL?`oi)(g?QM1)N< z$m~Pz*H^^^b?fS@mDgicWOgNcx^y}g^F4oA4P+NR35|9|^VB%GN1{C-Ss9(_M2Imd zON3Y)FQY9dyktwf`OYmf|6-O(;27+7e$SCfOus5O!r+F+!~Xm8z&0Bp)6g^U^z zVjND0M70a8lq$CRx9$Vfb`?P1=843mc9v;>^eag|gC`Xij?w@TiLW9M5$>S4$qIje z&F}&sI`{6mPcX9q?Tj>NObN~FiHlTfqYcN| zz_#^aIzKb!U##{MA2%o=EAbHr4HJJh03zHz5Fs{kxQP_I9fSBDvk*pS9~h%i>=uFI zw8xFx^ev=ad2?L>MrRVhjf@C@#*JE&(Whfc!K`UpA9|$E;>X2w#+M&03v_f#1U<} zG#2|cmd`yL?eLf$uSdH@rpGt3(Y}p0{^98T(Qh4I0+vDCV}dJyBFvns?qvN-)K<=- zBZ~F6#3vRsx8n_7HEe@fa-nLL;kkFe{mi-A&Ufg?gZPjB5w6B-ql|r)ngr|xI!jH0 zjn32p&sc1`1}U5Z8=V#FR8@a6$COfhZ-ymQ6GevzJf;pqY@$s!&>P3~0(0X6dnD>0 zkjE>K$Lna#>_dNryq%E-h-e#8YsxUQ#K;#%_0>^*2~}T1)fZX_6QG_2Nd_$L0)V1( zxCF^acWPBWC341574JP6olJ=fn%xD>26`HYo{OSDLH0936)gzgMi_toN#eUI(@mjG z77m0&;MY%B-4bc&ffee+LYZ*m@4_!4c{02SABR#6cEhaVAuJyflX%kz{O z|LFIhUfiJD3~^}&PXCyncjg{Xnq;Jw(NI+&LJS%2TUrJ~7HUHlYV}rD{AR?(gK~4p zw6tVeS~78QBJgqQxX6Ft^TAguRH!Q0cOfehZuLNFe~uxvshS>7ti@!q?Z(_KWeId)5ujB0@oBh#0MLvo*335;G%Qq69NuYM0yX|rH z4C#Q%v_++CU?)!;PexLO;~1Ze5Qn>4BipS(@z$7#o9foEIWqr_I}WAhkze=b6}>(c zo%kW$*LpJAw5@+TAlF_r4i@L&v zO2&mU#)T5Yh5EvUJl2IY7XQk}7{ds$7)y*0ixI~N@2gSBF?uzoSJy_7B&l7_TMV-* zz_}c~<(EKcQFnUL%o|NmGqM0cm}^hfB^hmLbkl!3S5vDcuOtEZG5@?#anupFzYm+M zU!lZzC!;N!kCBX2A}uPB7DaA{ZpO%AAVLhYvPBwV4I8x@qI1>9YB~rfKsZEb8U)x) zCIiVxbNKKaJ{oRFlq{$CZt)h2Th)OwGngeU8J$`e-_2;#A(XChu*?l&#f-cK5Hbtw z*O@qT| z10edY!gUZVtTCMn-j6XNe(K~!gdrxDH=*VqU{i_{g7iSR4p?EiFgA5~K-@_H^*BTT zP-F$Qf{Uon!~o;qb74<}QyET6qiGn8?5Teorh}W<;er@cP6_pOj)hgDqXtKfjZI@C zz>(>H#>SD)*!V}dTA(x68s#GZFcX|LR5C(01-eoIPCoMtSs^?e09PzKqlvbxk0@_& zJ}_FxAuI@hy?|Ggh%`moOC&zeXj6UQX2VTIO}E8x$PSl|{^aZ!5xzx7A2X3#Bq)E) z_r4mI`)JStz+HZ%Gz5@RVgKBsq(!BW(4CCV4gdp}z<0IJaN|I3*o4Q*`J}x7@QK`IP_6^JYYz60n8)ghEj#h# zs@2qz8F?d{*=S3&gOVBi@!`Unlcj$I8>Fv-%S^P{pAN$_z7i5_3&L&8KL&W>q%R!zF(SG$+sXX2C z5e2F~(<;^9_Cym*6q~`=fsiW)(RZ+O&4G(NDH| zJrlenDb^S31vYe2be-r-Smy;{z83(^(Q3E3Rn#3Fr4%D@=UJ8^`nZ3P(4r(0pKLm_ z(dl?ux=e|r0}zClI#fLvv<9dU_KXR)IwsDfpVfA+Q}I?Ud^AzwQZuUY;8t>{$TAxd zD)fx0k};@?LH7#jS3I0O=j*F=5{rFFFPSL=s3IJ)U$=ILM6#Ql*|x1IO|etM6_#{sFnet35YW2L?`CanrKu094^^FXPBkWp3!DEH54Ye?4${g z5!hS>BL~rL);u>7OD#l(h*UvdDj}bJMVZX=G;ORy2qBu6D@Xf}n=eNDc*LiXpkAn; zAB_M7EK?#7oT-0KPXrkaszIMIt~cBdR68G5I}dey*oOjb`9>5fw9ZYP_QK;Y&61@U z5q=~O&m(moy<*YUP82O$4Q31gXt`-n7bDsObUK#Gk!86kGln|+8F*sHd(-74)pD?v|$Z>tvWHKR=QqsRtd zNb_D#hWT{wK9VBT*ooGu5(Cb;+v5>)UWVx|(Jl}MkNcPipTPT=XrHktZexKB8A9?1 zgQyQew!nX`B4i8TWKo0xbpG2dt3>LJi3ySjX-AUyh<0^0&Il8DwUAFmjg@|-6fub{ z&){!1+TzAOBw3QJW@8qfY5BN@@F*gq0;`gOSw+))^6hmdqcd*}?GTByzJA1@BUU5d z5h-jS#EyqsGTPLzx%t|O0a`Jmo#i$luzh`Jj1GV3`}Jz+_G+nTt(J(C`=2uzVQtXm zO@+H(YoOP)((Nt)iI8YD}Am(Ek%_Y?Ph zZqk3&y3oFUp?CfK)fPs9c+?6hMuGP1sq9Tcv?;t5qX5yS?_XRmM6{eA*hd91Hox)m z%p3=fCqs+_08a}SwFjcB4!RN@`>ZVLein1Tbd`pRIRzoib+L&!%E?4^BqPOMl)Ts) z-rXeLx#x|=m66)SNenx$%qSvL-X4+F7y*BfdH@xzz^?C-4(rkdt6JLu1iJ+cl4Y9m zDy+8wC~`Y=Glr@ktJxX-))y5LSO|=sf!Ki);bd|vNW}KDGLyi@M)YG}BS6348#)dw zenrANS}lOUpPDd*4uHeLJ}?%#Cn~suHf51Nn8==A$3v4Sjtz%Uag9Rwc)e2r87_Z# z@?bK;H5~Vz#E6^3hy@fG?mHj6WYEW~EmaV1Wx2AjYQ5>mU<8qig+{>uSX$BVjtEPu zbqY2{csG#$SJ<-rAOG&Pue?C<0$_&;U9}w@DUsz?NtkF;vOCtCL?5v?5+X@mTA~#; zTGHjX!B#Rl$0N$YajOA2!Q}jsIAMR#ZwET-!*d9u{6GX@kvJ<0%rGjC2!K+`JPQ%- z7&~giV_TLHMiyA87FdWSDYyDx81_bcBLKTqXGsE^CcPIeT0@Q{o(!{2BfQshdmQp(i)Yn#BCVcbEmgFl4$XhSI+Br! zE16ZciMHcN{={bxNdX{c1Cd+UqM9V@2mbt^69>?y++YZh61n|T{a$U;2R8(^ALX8gu`7-0m0`dU%pD|AUio`EQeVNuY{I65e`|J82V({6v-Q!&oFtRgiL zP5@M1527)VZs4LDI2d6u5J!Rq=$xY1u18x0(93X6IT~zSg4vJ+c7xr@h`KG1>gLOZ z^H_4nsyz~{0nj?pU`RuxkupA0BPxeFblL*p?h1JtqZjLF_qN9sIYPJ*ASy-!Rem<@ zY1Ek>eJuW;4yMgygfa+wj9P#GE0YeP(BiDX5oVb= z2_TZ8w?*XYw2RZ{j%eCw5RptbYZBN<&_zXRK@Pcc>j8j*DsEDMQ_Z{G$;$@3lbjVG z`6Y~M0PypvZ%U-j@5D#_4RdTD#il~sGIEbW1b#_t-l2aUb9a;@p`nJisa~|1+^3XLgpWpKA|)=X@|NuAQ@V~~;mp}zCcDJ0 zBMA9uP6OH*zGrt5z-MZ20<8JA-ralU)~j2Q`-w!4y8w6E z{Z0ZA3DLhn)_g&#qL6t(1FvEhaCun3H1>WteWdM0QG$O6T}`p#F~VLFD+>Tc=1fM2 zEp$Z^Db{8(!jXP%+lZlH-A;arje*!JHL4Sc_#ZzeCnLn-5E&unp2F`P;krNmWu&<- zBpWYe8mV=BA$xS;cw9Ib{0n0QfLJaqC!<}YdMt3JgeXRY_!1BnHu;^7qB%4zE2@DN z=@3vu@=AXKXK8U{93xK~0Ciqa7@=c+79}xA0HCbNQG#eU)FcPhGdN6)j$tAm^>+*t zM2by?CcYy7i|AZd7$rIei8uxWT`CwPhSW-iv`LtB5D?jwJSqxNC^2y>G2x=qRAOSh zybm`QO&ZNj8qJaK3*&F16LS$yb-iE-+;=ikE60DR$!LT16RWt17N47}O@tWyMgS0jN5J{m!NHp4RLN_=m9`{4#-ZfxeJhnQWydsS$7J(rdsjn= zV7!0$Bs>L5BK(wy8R2Si57_s9c*ca^NfvYcYE$!t(9f4C%&fwsHQO?k(2W!u3Plg- z87{)%Isl7}B`1M>X}?0tgK(K%(F+T-(TY0J&Q-XbCRYxkuknR$HM-vtjjLksRu>ty zuj%$_jrqMLfheIdjo~at_`u!VS{Giq6WM=Gqx0R7j}TC<^HIY^b|+(1{*^%KBdYoc zp3>$rRuluNBcmuEpI*HruroB6OMS^(78K%O>I(W1OaUEhOHgBpKi zXaeDov$#>rxE=N*C5pT^dAV5;^?6uhZ8vy4))bf?x@|CFuE(PAEn3Q^r_UC{0S&NpSMu>69AVTay;OoB4j*$!x_=d3`(yf*y z83q6zE)%!Yri<0$tVEm2=V8P|WUlEj*AzZf%;*8A)E%F&oX`u-Xrz0HHoB7^+9y^b ztc4Mg4;khn0Agc@VhPb6tl3AuG0-O~@p*1lCZ8?yFe|^rlnAsYW2f-Bh@F4n4#me& z@mk<)1a3`OM51Xn9#v)lYi0%zK#?($5n{~FfB!T#|M5S2>5J>SDTp?eo#L(_LJMhg zzdY`XxIxZ+L9nsvIyVLZ^jlz*q@Dg4SEC&lehbR+ci{1zotv_2aMVzs_7QfJm(5jSwqL9-C-&4}B=nro*DX zhzMC(F(UBUIrtFmE;R=M91!($EKL%(`|ED&JAdnA-KuH=)9SC~R*HY%R-tm~`jfHZ z=dD$1X_z6xyK$Hy+H7sj{8UyB!b2;*2@w|f9B7ExVBK(hDS;EHJJy?Gk=Q3ftf44C zv}LF=lF>=*gy2r(3xIHuM{>gm|JNf|4X`B&mXi@am2F;km&Z7J**JDv00AGJLmf*c{K%;D~0N&Y$5s_7xKxos2(y2n}yK5}S5U_;@&z!$1vBT2a0Ht=O#L0R=gM)5 z3ha)Rdu+CeaCA6&5TOSXE=U09#>m+G8-b0GVSX3pdlx(Lie-Ob3j|~%Hx?CNBE0r1 zFTtQy;6?*L+MBoIWgVI^bfXdB|CmL)OnO72c_gDEk%;=ro!oHd-rDiR*>=@Ce@KQ|MM4Q%$K{Ktzt1K?;jPPBU%p}^{{J&7K11)8BF)j=f zD253XV|ZLRt-F8x7pPETYj#XdE)s-DtZr|Ras|N75)pp@My7VslNKD&TW^F|p=uBi zIylPN0vnxW>;i?*NQ|Vy){f{?KlOkxwt0i!;;8DXm26h&ZxGK|_$@)m$nS}dBqiM= z35b+*=VY{5AY3gOAumwS)JOzs5%ohuv@W!nuQQZ|6g$x-^>~ z>;0?H<9@CU5%1iS03$so0Y;YoC)|V3`4gKqpfi7XM@k`-4uLjJYJxvYr2m^E8R7j< zJ^_$|c#(v7p|4TMAp+nuuak>4LiO~k{|CfSul$`07Tus2C&KOnuzEq0hUV&V}G>L`NkMQb3D6 z2|#~1uJJ2BhOqlOOzMC6tLg8-iXd-wPGuM_X7@T>g}3fr z{z}kILaB*X-UXLA+6_58MfnS(;77bPydZx=-YnxzIxmpn-c`20(?`4pq2?X<(38L7|U1H2e8!AGv)z;tKrXzErwA35bTD6PS zCbmcGF`MQK@+e{Hkobs2F5d;>NL7ikro0$?4>HA7s%lZO5Dr_UjOAM4s@Djeq>O(N zVfz{}BgL9RO_AA?kv6_DH+#_=#tzL<=t3&B|xb_^P5=lThUX=SnVW}tr;12mDup4KgBpsaqe61L$r2vUmE0gej(Ws}3dH5V z-sywz9nJ_$nM4ti=+xY+dM=2taiX%N+CGa3rZEUp$7q0b2~KK_YHSqrn^>81un9Cv zHF!mz3Lk^XL((YwPzT!l2kQB1+w%74^7d#bG{j+i>~X=9!aABpg+zZF!qt$g#>^BK zR*<2H;(w^$1E3Xoo5={|7qS|On4l?gRV&DZh3~S!Mn_lds2)G)kzFTrRZvRDMj}H+ zC3dR!D)J5&Wk~5DKkOhs>>v+i3bno8IDZm*0NMq=?kuJlCA5bo6haFtS}RE=H@qT!L_Bf?cm=`tc*rPMs^c70eA zuQhT?WjduYal9oQWJS;*Kh>O!6pLB0m^)r5CX`Lfyh!>q+M!)V)+Z5ek;ni~4?6=d z6hKS(g046bt_04*^UTBl>c6I}Ua&lrpBc=?G_=AC?2z(cPq=@2>Zb+#rv?0@wiEL) zr25LcXLU~MvH8o`zY^^XE1p3knu9i^vIm-gLiaYNX+ECofGy-km{VewHrmaCe@571 zipl{5(k;iZCh3o*UU0R754M62vd@c3z~pfpMVa7n2%K}VH1H5@y7NGA5@-)Lk3|1J zWl(#J@>fioVsd}nOxC_w-!?Nhn$yqOIvLrq<^StbYw@_~b4x~uk#0ex*sahZFGLSW zI7AW!jSy{O1RL9Xs1|b9Ml=)}irfy}jP+L+I%>)A0%XHD1C2ZpN~W@>z0e!0aRLL{ z4U6RxT8=}*Jzs={=yNbB~qQqNU_(@tR+G>n6HNsJkOOm@c_j2Kq@YoxYPr9jK$8XHZI9}@*PB* zt`8|$Iy*JxsmEexxiatUj)cn~;cu74(eS{S}oQAw{O#){F+ux981Bg;XWV3(5 zEw(`zCsAt99WQ1)odIAA3N@vWTMA#W|Lpr@9t@fj>7{ZS{QD*kxj5cQ)#4;fs z!OncqF_`Fiz{5!{!>hW|s~XzF)m@UEV}a3GF5=q@AQ7LTk4c0tmZ=p%6^4#VpgcYg z!ts&buQj$C7oSEV4X-;H?FQD&q?><&hJp2vasY(TPw$ zHUpMKsWC)HAVLL@%*|rIEG>GC6zeS+DHe+GM6MK8R|@N<>QP~)iHpo?idHp6OFZ6} zymy#b#JZXYtx!P~HhQ528|{ojQN)NgB^xSLC&uF&{H>GlY)OFq+1H%}K6QT=E?N)) zph0z>xzY&L>h;b7+>#OXlEE}m!a*wzKX{^8QgBhZvWO!$6P!jH1<0aGWGSi{SCx#b zB2ob9Rsf+DHIZWCT2n`-TX3d7wzG^G;qnuW`qt(kBrUqdEjoQfNzb@V*^rK=5q9ts zw+9jQQRY!;H`*$uifmq|QlEcyCZkRJ)k;fP?mvpQB;_>{8EfeE`=IiE>f+>Q}p2o$yaUZ)oOC%=jdC_|Z|EzLPZC8fS+l?6_zgcVu&(iQ$3QNLKUeWBJ_XVu&zb4p^&|1 z64)14MZIaMqWPt;RCWe{SVu;I3<%W`N)Z$7M~B8p1d_#jvVcJmsLf=gSXPMM@Z`zC z5?dVrsz6o0=C6%moz>LNzi*XS0sg=2{oA@NO>z|o-utsG))#*E`231T$>Vb;amuz&&w#yYwj;+X3$Z`p1a$s!zodG!>CdCfr{ zhLCd=b(&LwiHKb})!Gc5eLtP+lOBYO5&);11rLvazK&Er0q7tva-W1eo1@0N1}hIG za>ybJZ3xECbB6@7P)AD!wp=3xqHR#(QpmPCQy_(g>r4i_ljT;W&E_e1+ICIHFlOXe zXXIDg3U=W7Y%7f`M=|1m(+3h=tq3-IIv<@kJi0&(Ue57V(JNs@*96XtsNSq8(Ed{S z5QSO_Q@PjD1C6`sMt|%{lH8F_q(4i#Px>_Aw2tA{JS7J#9TSCtAF!THN z0VnlGoLkTEXPx-U@Bg!;2E20ldrN^xN-Y{FM4OIekwb~j1XbIj<+f41%R=C)qT-?= zSx$C81u|U#w~UZ$Q)Hr8cwykg;0$`V2_s-XCiVq*wG5Ue2+@XP2t?aCQiBcgaBc)| zTcm(!K)zA6N>x~YuvG}OW2^FE(^8jrF&Dq<;x}Cstvvf3)OatJVeowKPNLXVo;x=MBC7-oUm!Yem12iNTdl;qmX*fOqa3wD6OCT-jCe@p2CGsNADz5} zcA;WElkVO5{_Y+DUCfn2HuPF45RYWA#93%FrUJosi>Ot9E2&mb1eY7LU2e=4k#Pm* zCD6pWN+KqCCJ#Y~Cx|UAmhRQMoVCQgc7RQZ4I#fx( ziP9j&ZLp&%#bEQ+IZ5u~Vt}mntOonCQ_?ONA=*P_?Y+rEjoha(W8P3xx+;yntp#~fN$@Yh#F*<*$JU>n?!3hm*+FrL9s z-L0B{I|N#k)9z77;s3jxHiEOFA1-r;Y&#L_!8vCVoJpm!6_PZcsx_ag+7Ppi_eg%({8Q)wK9#`C3IIM5cscA9BBT^J1Zmr(4LN9>h<2M4v-UqakJtJG0Qxv5%`!KXpS z3PVUILP@F8vOOqK#h}Kn`b4nRmQLBW>;#-rpF+E+#tk>!{bG}Zl_+pijI z=0b;mlcLPHg-oXqS&i&TL_lBV?~!>d^lALuTs+i_>&`mzG5yg!go;=GFy0I2_i1J8 z$($*(F3w9DU`H~UF(6QxILMgWRY~@2twMu`}al`mHq5Tco-C?UAZL_67TOD@L zI7G;{5B+ykT!HEsp`AnXBG41!ZLF!Fj&|&yg}4)Sd@*d^p=))!xi^{`4n!OMFV>L( z3B)Zr1aqUI#T9xnPm_yLZ4*)?l5#Qkcd*3$lu=qb2YHy()NR$_=ly-kw)|G|?|tXS?=vY`&}fR>UkiZ`5>Vt-=dJ1qz8}lgIR%qoQSL*Cq(2R#Qcq2#hI@8u+b3bP-ia^ zY0-nexoJIC$^vyXBC=-+D_?~ejjEK85!zjPC?MMtQI4UqKbnvw8fr^_foK~Py%5^! zJlKh`Ywx7^f9m&jib>Tay ze~KW)txkmM{>gbhr$Ao~0gvHrfsjMTD`Lkhx(8+RQuJA*gA-t&4tA0v*s&srn#O)m zNKhd%OJrLwDbO}k>6Nm7bd!H>z@IJ7k`Par<|!``LbpwNl_vgYF{shpp+<8DmTUAV z+~~}4KxrV*=1d5JS!E=Bvi!VS59FqWN3kR@TFrb-fp&F+%oK>XQ*h(IfB2{W?tf01 zWH!{2u&Z%Rf%ZE?5$`H!^lBw3yZb~?o+cU%!wtiM&!+Q+YsWKxWFsFxY?1}PZj1O` zBurmqAYY``>Xj7uBcMeUPSzY4?3W2?523B5B15gaU^6qm21mY<5H1@=_=+q1pcr25yK?4BWo#3yM|WV+Gg3Pjsb z?<^wQ>P&%1tClT)hhNff`z8HJw?2J95G!jeZWs){3XuTl`ab5PONW#Q&`UX^qk!9*tZW1f68Yj zgR`=nf!h!LM#vS5tgE<9Z?3lk$!4p8g*;V2SXo58g4H3!qMde}$UwZNEjT`n93S=( zC2LgG9C!0N)4CQF1n_QT9*H(YLEBN$4CLxV65`(2>vTQ__q9P!QrxOU$E!dD2+lVV zKg-$ps2%Npq&yq&3^mH%3%Pa=l^QP8@Y)l-so}v=wtO&Y2j?8Te4$;ansq0GbD&Xp zB19&g77(Fb+-cUp?_4P>ux=M)-KLfm zGs_BpE%5aNdBQ_`5g{j^Z|9zG(qJ{Fgg7awm530J43}YIKT}VgcbRCKZ9q*IiZ>A) z|3;CPKpXNdm;~`iM&*gl7;p_E-A^r{J1Zxl;vuv<<)M)^7vlGwA80@ePD3EtaJmA~ z#snV$kCSsQ!B@GTYF?cgWFhrIdn_T6T|_B=7vhLPXJ!qwsS$b#|5G5_+DL(HTk$%~ zAfTwDCxXzKLo!+af%v_4zq2OAqWDfA+Td*jvdwSR%FVeMyTIEMC}IJaK!tXGxai`m z7rL)mqD-1Vi|5Z0{&&~(N#OTk`V`^~ImvJoQWYS*z22;_<#_MZP6T(hs{4d2 z0_BQ7*p?bRo((e#9jmTCx739Ztqy~KijhL3)-0z-N3S?tvR1^=SppoXilzUr6tCjz zb*7Kl+K>PHxGvRMShp50)MDx?ZdONPRE*!tM>G^AJ0^X@YbE-%{X|mvJgg~R#n)fV zZrtz8cOVMlEXGtm2*><`bIkuVQE3Cbn!~!{<7T3^(E#ao#)@em?Tr+JWZ><8QBDSQ zcW9X}7Ky?OIsTI!|B>b5|DTJ{f9#xzqi0m>j!B5;-^N#Cri*YtJk z?A=~K)D2KQfL^=8!Q>e%GQRhWDU204C8BxvwBbteLcT@k@FX#R{QtE0PG=*xoD9x( z4+$-7_lOu=wczQusA4y(VjCP%V|TbBXWXQn3b393-4TobvJ9gRu^9+xkuNA@+whSg zx>D5aH4trs9;py*>I(3GG#y;Zas*O=5KL;@UMXFCOVd*En-cLGx2_))>0taOgp{jT z6kVB)%6PuY#f8px6!esy0_{hZ=4{_Mtg_vrD{EYNSY6J(c~o85qbdf~l|4dYOkE@` z=$SJ=`+rQ<&+9dyuq^&dhXgD4gBa-513i17y9LE<7O~|=3+qvTElKK8n`59ew^2gA z;?6c)DPG98T%5K=D$Od44Mdx|3<`0|mkq*(eb6hpXnieMlk)uWNqL?w^r&9}O`iqo!yHy9#i1%x2n>B_;u)|6UM8V) zzN8Kq$Q3ep-OVqZn5Wl?vJf1Pk8DQ+E?iK-3&cEuY(i&$lt?Wv(C+Faz4(hYiCEwm|OI2604vtu;=H%al6mCa@;U*2(uo?}{p0 zW6vfC9w86}<*Ko^Tk$N~)Utw4CU!KkiM#~8eET^LgQKnbmWvzM+&sH1YI))I;(6Y%QleXy{M8D z+MV%XBuD{vr&t}<(`AavGS}q}a`9M-uMk+hy;_U69*UyWYlOUPf~+gFq09!Ad<7bZ z{wLU-DwyD;Rp(N(bE)~UXnfA#g-x|83q+e71GCP51{oyH{ma7pS9P}ToI(+7vo~f2{7PEX-YdHI z^|%yH-90HjxW^~G3_lWJt6RJX1#FEGB8CJ`zqVws)rJnjaM_l(!CWN4nG_-E1o1o~ z{x~WOUXeL$(|)(m8HhIBu^^Y{taS21u;T=OS44;>MmC{cf^*A4*G~)4!@bIS{7-{P3)ZC8~4oRkDU<;&~glIe7gi9cEY<2_j2fFsCdjsrJ z$@i?=cF?osM|A`naocv^wq&Hc5fBVHi}$mtd@B@gE47$Q1vf2mhfh z^B;t^RA1TVhlm9Qkg>(%@m^J#f6|+O6kDfemlPq3Jk@F%l#tnnY{VBN!ZYTi#I?9t z&y!ALAm)fQ(9l5=J1=M|pr%U5?O*Pi0&QiQGtZ8=5JOr8fwr=~!|C5ai^6H<<*C-y z;M^%q!-ilt1$M2A6rDw)*+}J~)1nrvQ|@UJBjTh%Tz!|PW7$n(D^CZro5oguo)OIs zx#b+&lhr)7GB+@fexfoC2#UrF`4){W>}dXTqC|G1RQBvikDKxxjRpv|9Khs+z~S;J zqY>!SSGgN@$O z*!l)yQH;pcR|s${l%&hqE-VdyIZ;1U_AyxGP&J`2Rl5FGM1* zh(Xby0!*+ysfCOpc3JjL&lfU)+&oyCh1oR0=|9cKQ7hHR-GLON&{hxXl~W*kJGWY^ z5V87fvg?k}{+c{v+zHMUX9lXZljo9}n^+Oq_Xd~P#jSp3?~tAh&M%{Xww3!J zd!<0mjkcBoMSLv6V~7S0-067SQ26Q;54v(>d3BZo?eUU8cFGuk?1?y=o`E9qEW}@} zIYB5Ebuq7wszsEiP8H#G-}=Ol+8 zo0spaYF4^@XDc&*#vj1%}TgWFux2)UnjgN@Sl1+1t|UB+-9d4?@#{4hdjf%M-42O&}7Q2AVoGJ6#8<|g@PZnPbDm4YyKa%RrdXreS5W> z0_paeGI37$c!RNuCn!qM>stwt&T^l#aV}JzBH(C$s-zzaZTFqx?_gwYS%8E9-$+)3 z|G%wtLb0O#byYW9OtC>gs)U>cLe2;DIuIpm<9h?KfM{^(6XL-~ zDZ7Gya?>%n>5v>o{u(KevTk@)xg8~2%~3KT{7f-N!s2!+Bjkx6k24TYw0i?*+g@bH zzS9qR=_kLPELvkJ4LJMqpIdnU@}FC5IqW|-`_Dlr$<6*V2q$`in-Ko5?)J~?ajS&? z?2!~`e{5`vedT2x3hvoZsZg0FvPL5#=LSrFF;m=&fEJMjgm!!aPSSwy{X3w^T@Y`j zvIibF6;x4EPXG&jMFBcr^1SO)T^Zi^3U3_Epx}B7(UwWL6r$}MgaIuV|G)Uz7eDyo zw_p5f9{siCgWo-X^1{y5ozSOb2irb)-S z8Uw?e#csx{A~+_VZ_xsMd2=919v4%8X0{#e$$;Oa728gFqrc*B`r=cbSIo~3Zbl5Q ziO$5^2h&4SvCVS}J|!<6((x+a47hhs{liawKT(qkN0fC$b~2U@$llG;@q{1f<}`6M zb@^!U<>8Sp{(Gf(315tv?R>x253U{;|IP5g#xrL_&<=cr!#?e(2jM3)N@$&bQQK*` z_&+MC5ym)P<53m?X&}B5oEb(E#(mDnPs{;$`kjO;W&*(D1v>rz;xjw@UthK?C2Emg z_ded6v}Y?3FXUU!1XO~%>?+Dm#+sDf@QOkS70N**aUtlns(q5fDJy!=+Er?_>DHUe zAC1u8IWZH{{D1fm=A}bPK#LrIN+Ab>vjfK9xmQ`HbF)s?`u}A%?^=&V4&@3q?=qWr zna#VFnbX*@DFJ=)J1>4?#G?`6ycqG+eoe^LYdQMu>sk>!RZzd70P zFsm@_vEe%c(WZTy5N#I?7eD=SEgru0;+N}}Ts+fsc`2@y3~){)n5F-JmlM$06XtXw z^>jecitYYi9Cx(1VApk3G@1YP@two(?!b#NzfVp+uD z)ZXP3$mJABcPgbYu`N0*+NcX{h}Wu-x)2W(eRPJqq+jlve%YcNxdHPl?1Go4J=Iz5 zsS0h9EGR=`%UX}OIS(~|;wOLf#A@s3vD(i=wO>SPzYNrVQ=IlSO#8eTbC0+s^U-jU zzS?3GcV$&W%HgaOvZ-A~XDgx?UGa>|5f1F-uVtwcaDuq@eVT!- zRVwOx(j#+-l|9vkc9SXx7{)=IUgzdT{ge<~!b9`$jN-}Wb=K*(ECf7fq_8w=ae*b) zatdS)d(J74YhU?)b)25Ey|gF0S9JTauh5b(69 z@2BZ75WH^50H*}P!8Ln#dj;j>3fnBPFM(PBhs>w_#uUiaDXjqm3Yq|I9ugWxLvB|)*`sF+1NKMT$dhhB$M#9xMI?UPiM%|k7BlE*A`?m&>j z(5;t<+g7+2D@uF$y9`*JK}&V{<#5aZ+1jFxUefn}=?aD;5Hv>$#0!4EKfHCBhhvP6!{~tP1Tp)COhclcd_HcHj8aS5j!m|;$B^97vyjQxS}_o z)m#W?=_GfO0ngH8%XA^H-FHrbc$VhrAlWE?AG;)#g-m#$Gdd(k8E8xLxULk)6_BW3 z7NYLJZy$e(?TYi*O3C*2C}aZZTD#wAkGOSs-jRKhmFytk^)5lyLj%pbrmO@ zXbN$l!xo5F7B(?kbY)!&5w=-u6N)f7>lfAuvHbLZpp+gRw1LZAQXm!qo~|z`(00dv zMer!Q!7Xcr4+dLJp!Zfpn+ zE|bt!wRtbt9yH&RP*xUq*U5sl0YxfX1Ht%$ZdSfC$;5Q_w%z8r{0Kbb-n+R|ahv>>#p z6VuXkC9f-qh6{;Qu_fgkp~KBk48VL}yqGGJMBD~67Vrx3xRmjrJ|-`T1uCOrQdy}K z2w#cSz1s(`_Q9)s@H(C!L(8P+jyvP9wSM|Pp1aA*)*IvFc*Or$4-KRqz}3}%i|epu zcp1Hlm)0wmTP9F?q*8jMQhKCPx>G65sT3zyE+mA z-YLO}4V?Wv5-38uvteCc+~{zXJ~}O^?;;?PmKFkr%#OuC7O(;cWSQdVu<;Q?ZU|05 zdb*yYNB>zop0((_qMla>F>g|TSj322_c~s}Dz*uo$@AQg?PN=ZxFIV?5C%V{vc8r= zSUClvhg`|=655@`SFA4M%QBf%sDq)!J8uOrWMhH_IexFj!%K10vt3%914Sz0Oww7e zYb;`dO=x#l#ic+zTG@n-4IRGEYA1A7N;I81uM^tR^l3c>+G>y3qJ<)VY|sXQO^8=# zvVs|lNG(CUF2TIk_<${tvq`mB|D%w1r4_Zsikf8$6nPzuQXGoIjx7R^Edr1|0+5}j z>W=X|sp~@?Sr0~8kKKGvf%a4+m4jj(^@R+IS3@T`TD+NGDUkC{pKO?gPJQ7||4E|W zA#|M(fNKiCH3#6D18_}$0l21c+gDg5F40;p(P|FBwenaLfNK$eYYxCQ2jD*2O*7=Z z`m>u>M1X>hV7jv*C{-KvNRJ@XvlNp2U1t18L?{j@f)ipt_c(}LLLqghW*pqcL-B_3 zda4T)=4vFIGKT+?BpiS&Q_WYXA~iy9zZ@_??_$+z`5w|aYzAD_V7YF8^4ZN$( zmaEO8$wirt0)k^{%{w%&&7n+~L%|U2f}9M_?I=0yK&-wTl=v2sgTK^@(wdW4!h0;{ zx&=|qMTSf98!_hW+xIa8psP`wTAdZhi@nF3v`reKtz zI0pH|9o&G7;3XV?_Jj#@@LPnoI#a_YnIKhnzsPsrJ%!sl9jy zCv-ONLll^QN0lM^<5kA%1?EhFwnT=q2Iq=X^O*#ZJKiUQ?Sjpxax*5J?1pxQg7x5* zcUh{pngqM3fnXYPV79c#kZCX4254KL|4P)FzOh%|x`R3x(;9ds6X{DLR>2_RHy>rC z?yTb#^Fj^ITn*CPEAj0m|CL3|oiB8G}8~q8nk`OQo&T{9A$|#_?@PW057Yh&FQ$um{Y-(tpDbTJ# za1OMqnY{+wd(+ZwDNU9V9Lu5bvN}6T<{K?sh4@M6WD2HZ)6-J|Q$ZlUZ~1*o z@52fGRj8T5&3N>Ue)=z6rLnWlLNeH18=ggfA}Yaef#2Oh+A~Tv}$WRsE64%9m1y9UQT~Y!=)6ZmZMgqL=<8%r|sZ%ltPGnFbw=}PR zRTNB1^N=R6g$2??W>SJX^zez8G`9(K^IQ3Jf^+W;SqL`tc@e3*tu;~Y>x*l;`zOFA##V#X6x0 z1CH{eSYEu<%?v8353&#Bn9HVpC!~pbUyryhzsr!(H>DPGhV7? zR#eqAwR}6N=avi3-Jgs;b(Am?9S%06!q0CI+LIG*QKxCHSj}X!X0n+> zTBe#+*L^{&0LnqA17_!`Y1?fR0pCb1p;0^$*Pv|Gpln^$dt;$pC@!{MTVks&x9L!2 zi@jses;W1bqj+vJgXJ=RKV!PC;PMt@x~9QWOE7tQ3+DKY`q*bO@cdSudn{haw{X(^ z&MDIU>Hkhw;Nm31{5kRT9DEaa-y(Arm&2VA)FyYh_FQWIK4u{)wV#p#d`yP(Wd4tLbQ>aL|~~c z@b;@(#&m8>t~&*?4LoHb+E@!)T^)PNKweKs!5e&~oOOoid?4GdI|bTm=Tvom6t-#6 zkf%jMp6JJOzx*DU+&Eey`|O;h;cUtDSgO5qd6w#sOn;W@kWA-N{jAhW|6eIydB*_ZV1_h-+kqN9R5cx;4^{0u>u+3E}&9d-hmyl@3!k1*= z%+)9<5Yv>B3l<_<7uj!2mrT~WZvbkc*(aV)rdL%sJxl6;v&$Z`k{sD`u{ny`GyDGX z8J9fLOwZ_g$|2RY=opi#Z9$Fuw4S2Jx%>7G?>mDTy3H(BP-~@wyx>%?OLfQ3I2(FbjJ6jC zk$h!;6-YhhtCwdWm!{_1Yp!X)!%k)Bzg~7R%mRmJufEWh5Q|^HOUfA#dbj9$D#Xhy zHC!RnIPTXX)xTn$c#LZvri#6KE*ImgfPDGA1weDzvHOSI?#%4U^+p5+julbBE;0b{h!(>DgmDjwTp? z2P0D8>`#1dK0T`p7eWqtl0TPe&v`5DNxK7wqA&;eV3CED5>+ia>`;7PRojQU)_(zX;EQ)wL+Hn#geN@PfBG}Q_!reGP zq9i+pU=MO)sJ@lGo6Om}N$WkG%z>_dq^>vIz2m&3KnlQ3RZOW81~&yd#tD&ZQ%NQi zVlc3>75I#OA)3`-10i%K!S1k=5Pzq-($(0HqGY?>DG+}wrM?OHQ@P&V(jGfMPy&hs zc5I>7E)cz zV<6g;w-(yX-0T!+hjw^+RK&k7&y79l(&h}`0fb`-wAK7g4de!iHhkEx?Xc7+3+<{% zs$o@7GB`H`Bh3bTI2x@cS6O}CM5z(t8(n%oohrMUXf}Txg>}#J*>k$VmgczH{VKg` zXN|(=@YW8xF$WMaN`~ETAcv!Wv!l_O5mvPX7CI9;;)_^)h z=0J&jzD>iHo0k7mi>-hEsIvUQ|H2uY`-O5`C7f^}FJY)^7TVU`TPe_g7O!%y6o_ky z+O7!gueWR&jo%T7HXKVJ+PE#~RRsS7P?AbOOD2z7h_)gfWTN9@Lq7@oB_ftP7E(@y zwmPnXJ%31th&Sbv+JH!?(3Y?`IW0u|T9D^m2-|r|Dr<9u&OG;4+0Bk%TWYzp7IU!s z8txEuWD}ytt}YK(YpxXKmGNYv;NNQvX1sj+IgI)r zoWRu|{Osu8i&d*R*VFPh23bJ0ephEnHI{T=Nw<|$S4pq%MGL%teSl%Z2swzZ760mw z#R3uCD?YZI*?Z6Ym+U?HPvOx*9in2nuNARQ16t51ClGB?=&GU6C2#YC-%opgB$M4Mtn)BD1u z$ao;yxPv921wZM3-79-YK6<6MfgmDqJTa&qtmIg9(C&zwL!M3{&zIf|jiy@deAk`= zorU+@U~t=o_ye^wGtFCC!TnBwKH0=V)0)_ni^d}ZVrKb;bY$0J7l;?1Y82CJ`W0e} zSJ-ASgN1frG}36(_J7t z&?oJQ^yvKY(n_;)f5QiSH>4B&3oe}Ib0eC- zX8u|>$IXD}sX|G@ja+L8Q3hfWk0`lKG1GfG8=E6ZXWffHWUO)C$&O8r=-D}DxU1M{uKCU{7tWi_?a$4NyVKuhzRzX(>4UivERiY7RA>Ks+yU z{e1*~Lyd;JC$aLxJ>>k4IQ{ni&3NlEHCf;9nUU=OkGRX@Ra^DkXDa*Q;r#x=pZs-P zn=gsGpL4gGi(T4!EH1qZeZ6LVy=HyA7BlbX+^rAfU9}RGCLM_XJq6m*p~A*R$W=2@ zG&8v}qXTvzuFN2|2MSk7E91q4#KmmHMF!`8Mf&DfeU$SP4eYhFoC48C!Y{#gFN9>U z&7gm!(zAzx-!-b;A3Hz(zlJ+hyKU1ZOgESbkLNGM{dZNza3Z^SY=)da6cj;oMCeR> zXM%*zmJq!SwT~0xWYxKL2$9a!#RDSZ`G-bV^dJ9%X#6=ztEu~VGD0_CPaRmY&C3GwM~dVJ!2S;4;M_dhlnQ9Ss?jcloM+Xwv?q{3&HL@6PPxII9Ac_ z_S?wCU$WQQ`c-lKehA0!&lx|1>v3*>UMwI09L+@vF+_}5DXb_&vUs5qi4ZFX&X=V? zoQafbFA94q?#X=;w@H&EI0|@b25P~pXd&_0LJG8n6le>{P$A{%Q5`TH1-)-ies@Gh z%d)LRQ6iiRifs}(nFWzkA^t3SMbjAyo5_^)^y1eXM%J6PR=3iwMCSIWzf*4glY>U3^vryG?as#wad_fX1=^Ci zVYd|#2T*dtzy^T}7C-bz>C#>9DbQ}DQC(`WeGuRKp)ZS?HAh$r-tv<6Y%NDUP zqYQDd^q8W9A|M6gxtZ^OIyDpIj~cW+A@Zqpo`ue>WRnPgY87^CWXOi?7t&I1YFSk= zN2*{~Evrg*PP^ncDVKwYTw4m{;>&TTK)fDoceSeMO4@wAbi)~@5f3{XQIu(4L@cOf zVqw<{mYIdphz{0lVJ@Up&5f97yUB$yziMVi$b<7$yo#^a#C+6$od57guM;zm27BPj znatq%;Fqt?a8w|ENW@=NDXk^s8jCVhAl`3>SdapF<-P6{$VJE9MaQ7RnF%K%+%yr6 zU=Lfy2g_vqNXU1U#pKca{Ofn0+4F&Tr6{1aRs(H7Ke0%bch{%Ul zwoPbv6?5o5n-r_SZx3|#7sECoUXsR+nCw=-w`v#&@vX9dS-ZSEtw5S+pIK5&SZqa? z!FZYBzQ`t0%**=KxN5;B6fwUi=+`{gw%564j zcLWR00-ev)VX)=q9R4Q3=I(K67rC51SWX|TNFS_7AFN0ptdOTz&g%_rZVz%kZUq~3 znfb}84eHE)5%iu6Xu+TlWLsY;5I2ah1=^h|Z|E#0#IONu<8#|JQy|*Tkr>E=!Uu`c zc3TX16r_s~Z2z<*9U6F~AkU1R0&R)Yz;hL1a0E7dNId~Am&fNQl+QejN{LY+9&A;= zHYR?nvWdyyWRW4%e!f76$J^uFc6MXKvty({{IpJg#+(r12b~-=w!&3JSwuLY?e4=X z1=`B!T`L7*z-3UsOK3MLrk8+3gj#rqLxAq%T!VPCMnw$lS_`Y>S8cObc-u& zt=T3N`OD?dRh32@^74Tg|C{d$|4nvL$o$qow)tCU9LZ8SKsJwn*+YHnq<}FcaC-{G z?e02%G1@>J6Bdd4ZayNefB64GsTcH=&*Q0D;Nxarf};&Bu(gq-rBJH!k}1$h2iVkY zxvNb=w1Mdn$hOu~Alt5$0-bs898o?ZEkb8FR#smHV#!`%J1wCz3dD2>bcQ!7DsUSR zvG5J^Hc!efkcA=^-&RV}Z1z-`Md zOIBTBGc~4$N_7pDYABcFXqc4Ih_C6+C)lddLw5h7Y9`27nNo{tf;`v;h;*D8bR5Zi zcM8*$;xKiIFm=I?LJ$T0&4^r0Sf#XGS$~b%1fb9``YvBZVc*lSEualF9$Ki>VKP7BmV;Y)~SlP^rt@eh)qEJ-o z_l{?eBTAL9crta0e%@zEXGbuo4NQJqJZrKfym~(A`pjNjjEVFK5P}MNmNuq;O7tYF zqr=3^2o=(|pTd6Q82k(~C5@^JmrclQBPXsW$(nV(p3f#}YnHs@Syp6~cXi|{T%#rf zhJ5B+f7R8HpOmEv)`OW$8^817hoAJ90WFyuFCp7{*q{cE;`gb!UqlSV6LBqtj%(wt zXF(|s+Iex`BGJwjncaTI!Q1SA;H|>D+2P&%A^NM2w1XdXb5YT+^-$6ApJ;2#|C`z7 z^zXHv1D141P^W`lUEB}I3gOEJv#YUnL1wR1r}j$NMq~hm_~D&pRfGAsqE2?4wmO>D z^Qq*awf&Uo%1C~^j%d}@@JSAxAQLkQFq8vmA(YcXD5t7wxGHznL^)`G>=9jeJeA_c z+tZT-95)aJu4{lkCr1dxvMKkt^| zj@ZMu~^0%Yn zm<*gj&m#reQissos^bD-5_@f-bF61rfW9Ea7#Z#@4c)Dw`wZfL{7pHHqNITnE4)k` z#L$RA>$w~yFgZ$KF18Ofzz=vnN>dX?Y8jq(isTg4n?mU2CZE9@op9iw3`Ve7VBc0U z;CV(uJ~U>Y$`6w`8-0PIS!JsDXVE_h6jA)@@OhiQ_bB%H-GWH<@1{Yb*fNh5Gp3NM zo!OsGUpLRZX8HnuHFqy|nKz&%bBioQ8^>kmopAG3xVef~>Suo;rVRprVIimxDPQXT zF7&jr81EX-ETTORu8LIYEq(!#^SA#aA&7t$5rTwhBmKvvv&dEDngZ=k@hWIe;4%TDLyO!XAr}9y^Ugp#2)3l-7k-Ts2~r@EwL-kwWV@)YUoxpkhB>povLdG0 zne}CEV~))F%Fe7mebZNVW<4{ro+GoqvJF>?7xFD!FDfD&|L?z9W<7YqC2Y=42MS-X zg}2qh-D=@~lr=kL#eQ4)a=GbWczhq6!OBuvgbXgm5H6MsUaS{{?%7KU9*OoGDRN8Rx5$*Y&sUm%K;EmcD&u~!N!@|`T!9rP*AOC~ z9B8-5MF*mjDVq?FPPP#?Owh>B3vDY=wG=3}pRqb3E+ImL84k+~hh>ICp09j{$JhUI zJMiU}!OQCIuIn-20C4`VIVX690#ywjz;Mbx>ZVt)0EBp$sv{SojdY@HI#CvHJP>Ub z^O$CT2FxC8fo@wZFUR qWY{;Lgg$mM^PH&FPL#^qvXL3b0|hNU>+J0JgK>1tuK!1a{$FIzmpdXg?&;BJB;EQp3a@`2Hh@B{; z!G`b&^5J;Ibjen6cqCs4n!$l02~{HrC7Ne{eV>t>*_K&J2DC^aqt7>J&Xk3(GuYCD zgeav@B&kLusYGDQkenxA++Xh$V$KLhy57(Coxh*HjSuI)=TpUmMpKYb^MW23ay%8p zEuu5OP>%83N!*Hv>bQdR2*rvCqIWVl-)P-5Z5~9d9+e-}SuqJN;2bH?IR|HyO^^+L zh#0EHnlbu@$$YGX)HRWKLTI9OsWipNHDwi2cQQ5pg zlP@TUD>V6B+-T2gMX_VNim%sQcQpBbe)hj6Qa6HW_(C+S;SSYT+Z9qHgWKh2(?MsK zVB1%IoaT>v0KSoHVxcNsd5(e0R24@(I9pOj390`k>EmSJ9oZc_GICpoqqE(GMvzeC zG(!ZM>Qp2KfQz6=u|-Ri`O}{(x=`F1@!UjRRZyGJy2YI~xD|JAahKrkuEn9advJml zcPOE_ySqzqDee@9QrvIOxp(HythYR6=AXU4y}l)OSseh>uQB(*fN7-BN=lsbK*GZ( zP^?DaTf>$L<)p|8WF`oo+slQT0P+J&@?rye`lW^WZ^ zK?`|U3we}w)4s|2nSi2k%WvW(ogm<%;!z4q<`@Urgjh)&gI$4w84S8VS*Qd!lV=5U zoDymep(SDV1+b`*Bdg~ilp7pX8ywBv$Yu+sgi=!ZVvoROlk|xs^%Z+cr+W6hIG({I zlTDwyejvEffv^VOF@=L3Et7q@k=Be3^w9=S#1bjpoaxwYPZ2n9Hr04jL2CxCY^^7u zQc(lY_FUS^jbwUnc;8-lTpn`Mwhwzmz~QY^VslJTEdvw{ zDht|cS@);@`j&BjW0555ycHNPqtA#raF`_OKH?T7uW7`-n}#3xc`9Mg&03goeSSDu zZpDL!@5cT_^Ox8Ng7B%oP(gz~c9doFVtdD-No(iwmh8}@x)7!(s9ZqdVCB+TY#cRI zsOgOgKCp~HllmTjLAYKI6q0o4p!MO~tfCa$I7aNG!nk$g6gM(jjhbpSXC9?bHUa$s z|62Q;;Da<1fVWEPU2c7&i0vc?r;680BPzK_w=oxU^@)8dmV&ccPfzmO;SYLvhSkyr zw=iOKGctSi6Y-23&=HpA-RNfp+7?_eC9w{@$Fawj9%*vKAZEu?*+$<-QfQM=%=C}g z4L#M$s@K~G$?{-QwOK7ActJ8EzTdswt$vzuBs=3n6%W2oQP(InZ)b-K|Jt(}yV{{> z`afh1b*=t+kQN7d!Bk7z#&k{mdLT!Cx{gtDrvg!~%KoEBIG7`uR!iD;JKl3y_lgw% zZqOss)sQc;?5LN;>XjBAL`iP9jFn(9%>w8f?xst=qLY-58IA<#DJI-uG&0`@UC#`J zds>dZ{UQ*mbYsp;r_z^Cq#^GkvuExj>GClR&~Kgcx9Kgtq~syW;kR$a^qgM^BNRPO zlmyWXq&Bc1n7zn~i$qilnCntN4V>QH#fW35jn*_K_v_NEn z7e|b=aXj4BxH6PVM4(UwINL)G{ztIdF}#Nk>|!Y#_O5CLHW5aFXi{Tk5}kng;d(qn zCD!W6f=|@)f>fx~tCLDFADS{34U}Hs1NnvR@@cs{>Y(JbWw0U^yrknbGN@5><*hkX zl=EgS7Kk#7ZY{Dh3uQRK@}*rksQkw6!}R9ZCR0Fb1g;&lu_EpoN%c1~IT?EIwP)Lh z+l3mH9u;nSCG&pYD+yNIY76~iUZ&e->);!#`f^T-&8vk8rS3lPqaDd7#HynhfiTgZ zr?hXlwvPuDoGBNg|5AWt8w?ixQ*B^xmB+18=%}&CuTR`B+0j|;)R|{bPc74~nOpL< z7Xop`L3a}b9&XKq_*Ir!OB_o6nN;118s_za3l?6bQFl2T0?6rp3x)@Ey8Vp43x*eJ zZf!D?Lo-7|tW1>fUqzJ+x=*(CL-A{Gwc`@>o5D~)6|?dCk2#) zWugt?aR4As3W4gkAc=Y@nBbr=_F+a;*$c58?C-wQ8_BRM!;eOoWkgt#>72NGC|3b` z#DS6>4R1Ia4GAl{{NcNA6mF(q{)Dkl`RX8RuODUg-yTPFFT1zki6$%_SqEgMmgF>J(~Shp7EMkj(O`eml9MY z;uiREzX^h2EHF#q%gtQ?ie!u9tPJ)x`soqeYRFG~v2W8lFEIs)%p1^BEcnb@>9%Ad zjK~pyE?@~%;~RWjs~neuTty*V8`g zmE;)RAkOWJz8qM~#T?E>Xq0a73T92=`iQyI49bg-O8%OOvZ0CxnI>e%(Q)YGm{+-T zE`{CAlkI7b5{H@uD?&Di0$aI9rG7H+9nc8#xSmFjdB8v)?a#;L9BEr#Bi5+77+^L< ziad&;R%+PPpYR&-9~6ZpS$s=%4KMm`SV@I&`@IFcWgoALLS=j$;VU$BpRZ#+kR4c_ z+Z-I+F5mmtl~o^Rq~F?of^;Wt>6Xt5|KrCy=Vy1RgvF*ivLzD zwoY`Aa4{K+{^ffFYwikR>(LfJ!7J|$^3S|OtBp*uu36U2BeIJz!ntc20Ke;vMeksL zS&L$@XQERbNS)&C-~6=*Vm;Cjw?@7LX7}D6+6vOG8dQ1JmIP%Otd_S=Sy$jPW#I6$ zXFPkta^P09`?W1J7<{mHjn$fodG4IF*Pvl0ScP&A2|&el>kIQRF*@PuB(kwP zGpRUvzVGP07fDXg&B&Y_7m#jweU|{47VVy^QBwz`BY*Ha=sA-RE?iL7eYCe)-RAcL z-tB>o=IbiwF0m64GafS9l+pqQ#Y@1vJ3jpb3i4-5irO|uJbj9aiquMa_zx%il6MtcFGz{QWbl~@%RZZF0At?}Tb>gX-YkWcnEqfqvhZBPcN>^Ru{Eufi$l)i zGm(Htv%JLfo(;}H{x=$095$0iCnB9Pqx~avCjxmnl}Q)>NHK4wTxH_WSMIq~FQ%$5ykik{u1n<{8tWYUAx)zco!71oP0@UPL)Zel~DFriX(cOoo_Fl=3DuYrfW5o{N zc-mYM+WxUvWxT*ByWdn=s{R117D`rO8E=r$q)>w>8;b_k63XdUDSl*Xt>(H)$|Cl^ z0y{L~(^0(&HrBo*_@daSZdHVMb&f)0pi?&!TErn`QFh5|s6E(LD#-n_!m!0-_gs~D4FWOc`(bt-$t%o@n7PizxqxCOYv>T=w zaQvpx(po@+Hov=kCUTIyL!nsnfw$4pDbq%Lg~0vrk*z|oCjlp{1^L0MqPk7Ft%KI(YRJz8i=68bvYA=rEVlJU|B-qArocgL1TyV2;Rvkc;yjjcujfqfb znmst2R-|RYC=n{|S3oex=ai9oI;mq}%9rhlGhH8pNz1miqX$*{{w0M=%qlAUeTy=9 z>~WaZta(=ifoqBs|(HQmo5axO_Di>5u1DmO==xY5GSJ7419$^|vBX1oMgdkDRuE!xk zbdYodexI&p1QGQXz^Cin)85v&s!}y-g@(D7ZQ0~kO`tI5Fms)XZ;U4e8@t=GsmjOX zEbh&+D5W5nSb~5Sel+mdDY~Di+GKYY}z&F7|>Fqb$Bp54aZCr&jJcTpiEM3(diFDl8 zgvvx=N3{f$=BLX3Z$E4NyH7E$U4}bm>MWo1f>}OuXlh4FBV~?#M0x@1R&scEpg4H^ z3eWKT3c6^`4CP+F;L60X7kB5Dp~kdnv3hl;eXZxUMtE^=KV~ZKCuk5U z>pL%|9hN=mg(~Yp4Rab5fqG|mm$I)fWv~w_jQi7dCFXU2Xkk{zK8_Yd>#(r zAD5r3{!G8~Y8C{Yx`p6)&calvmoAB%lT{J%WEH{yavW~EBnOzfAOyOcsttJ&$6)lGhZd`p&F z`3c*BLfEN%lfSoUdpwl+Szi2w9UUB_z4!&hg^1j;DvRK`mrasUhDpYb+twt*MG_ab!5ldrCHnN=P=_UttI-iM5E`2mR~5Y zvLi>^d4|b!@n)**elY`;6% z4b12y(zk$--I;r5bOkxyfzy#(BCAL98*q;N7gx~sDquWiV+row%#>OR%izx6F0`+L zr$Rm(_A^?LkW^sL78m~mHpgYbT?wMurU4C3$RrA&wjPwrh`~C6T<;gYg?yqQBSl z)XcyR1T5N_mAJAMll+D|1x4C~C$p-V6w3P#YY&NV=Y3T~gyX8b`}nr13qCrZlanP%JsG}Kkb6(y9*WXiA7C2Nl3ce#qgu0 ze{>@WBIOOuhKCmE@k+|rNxPSjkE8I&vo*usgj>~}A!@gJrY+AEb5(}nAFRqhJMM}u zJkpajO{93cCEo;kLRC$;hmZvtBCM}V#>F&l=jxlhQIHIJqRQw%Se;GvL}!1ZL=epc z-s`liADW&QSNp7U<_3`TMmRg;CX6OL^OUn0LuQ+*NT`oqjTCOcxyIQ{gu8B3nagB` zH6)qo*%$!~;=l1zY6WGj&1y?GU~YZU`5R7JxUB6x9_`gN9DdcD-tp+!d>s1>(UepB zKGuYJtJoA+JDCOtnnikj5o^xusn}F$x@y_E6{k5*PfzKDD0) z>$Erv!78d%OUF|iERM3Mw2@dB=NZfC+PYYb&o5n=BF(W3O6qXLcGsRSy7;tQ0DRZ; zpY2Ep3hVpTp>Ok%twtdc8BS3-Gk{P1Q;U2Lt zO@Da=pOP0Zh9=^SzG(JebjNjObhN1QtG}3BgmhUFGR{m~(9W=Jk`etSu^GFdd*Gkm z6lJ%Z1Qjw7Eq%nJQjjw77ABo{>ZzX0*rvX)3&*?CcP2m?+LYa?qTi>@i%4+bwAbJ{ zC^7&LKRbKtfoVKx3x6p_M}T-!xKs_9<+?0YV(F7 zz-QPcZN&ReFl=Zr6_T4=Ekt20CE<3MuGs=XAo+G>8wI*=@~{)c(u*#NlpGG4VE(5V z%q=Vi6ems;CtuRVe3S=FjMr#EbzKeKq`tdpg_AOc78kxR0pFcG*#$GL{?g%!Fk3(c z{-#_1r05Dnh0r7m0UVN92=1(qNi)d&iI{2f$WP@S;#dl2-gA@)-GrfZ#8M`@}!-)xGUi6I=#&G-XSPsN-g)f@L0sQUBzxT02l-fXs5mH z5z&}yWFNm-jj%W4;rgu(MI+JuSS;w7#`EK;T59K>2Rr@2%9#_|8d+wnjX3cQ%FlE~>^2`YO8ny~^HWNLw-LBx)@YLrEj(`m3_bUZo+tqu-9Q{iF5l-0j^I- z*#Zz@&F#1Wj~|jeLOgsggxZRPe;3sKbcYC>?==$=2kx4v;*3o$Cdu>suHR)-RK5lg zyKur?XcKkNnSR2nJC(LwQwEXtUr3#60smSl^mIIlq9STD1A-#lOT-$Fi`&h`nZ90A zE$Zg;amO*jwvZj`2r_(6-`RFZyZ@|CvC3kB|5~8aY6i3hNN)?E(MaP$PvYzxHpKa1yBahnf*Wy#)dX~bcyw=eb2GMc{h?I>ly{f*Jn zBS5jf4eN1HE=k_Z|9nABX3~W69 zhaLc~->6ewI#^Rb`UULvGhuP1OAi=3I%qqSW1GY;256!;1MG*yB10ih+&9!t>OXRb zi8&F?_A4X>C$P;L1+ZEqe=wm-uauT%=xMfRO3@O#wwsyQgL1|(ex%7#I&L;eqJ6bG zL_0>T=Vea-Cgdex4%@Oc z+PYt`0zVIHC`h^5i-IOe0^fj8T~x+aR8|;|&bbZSx)*}t>UksIoYPTt|eJsUbqFOse2{Z`x|{hKRahrW}WwC9iFQjQ}7uZY~e zy<|2CqWl+a+>eYU9x#+2=o+{a7B*XSCU#dQ44$iMD^n}w85nb7p$YN=L@MCF1Mpo z`Z|KuAHRp?DI~%aP8#)K`=fi#$jgNG2|m{l^wy{}Iu+xIuqCB=s&b5M;x6VP%Cqsk z>L`%rfy>yPmu;!~uAn0^Xy1Yswj3vapvC+e#?g~bu^v6%2;#^(ej4NWL9G^+tD~~C z*9*Jjs)b2J9ogf zwbm+?qxFmy195bYJ{t;j)r$E=1p4NKga@b86zW2AbV5?H5^P0V^h9@Q6_)}~a*aeh zVe`kaT#m{k@1w~!ndMW%yc;AJ9y^xn-VqC?P}K6g-M%ij{jINSqJV9aI+M<75J0H@ z{;Iz0t0~3mU>?CL|C14tKtor#CwyJ3;!qcm?(R2wI67a`enDnN z1U>Hk;FNu!9)F*Jve;A%nn*NPJn`BK?b-{A>_4YUoNIKM)xf?GgPhn|Ru9{%+2aPPtmL zM9-P-Fun);RNQdSdDfs|oPp*#dz_?hxnzO4d}Y#4Sfg<$xmDix+MRxG)$Ax1_@ws0 zPgYR*p?W+2$$hsM%6!iQ_h1YA#`l$bYR`WY7$>qP%?0a!q~2z@KsKN((FLV^x|yU^ zJRda&F)n88T_>;Xuq(4YY=Plx<)?UU8a1p$S_NIwLq|uiD>8!YY1a}l!HPEG)@AJ5 z$pXmHsPhhI#UPeBK;WyT1tvh7ZuR6tRFhrCD7+b!50>PJxo|oOG!f9A{C4U1+%|^w z8x(4Xp<_}PI$zejl>%Jg8-G_ zL&TyJ4p-DomMds?gMx*o%?|MX34OaO?|j6|-O_OnG?ChkLooTA%ou>=S{Dxf#2gGZ?{ zAcQ3dGHN0qIzSX|eH-Gg#T{;24n9JAlHrGXi+j*UA7OhDc;mV7lA_Gngl)K1M{+=`fa@cQ z(0ZW=iF^80a`f_49DOa{#|7CapjD$tq9E?_gzSNS{>T+}l!mZoid2#px@~lhOvB%{ zvPHXu*OQY!kUy7U%@hRMLFN0;OQs*`g)j=(SjPLC<=6Ef)j6^>K2#$(jCrGfB|}CY zbBUOUI2pJoldy=1zOB+oX8#ieP7#~`3y??V3#Enk7s14Dpg|NOve(%MfLc zH}M0ZS*$hM{*$z${-)4O+ryRlRm6W`lvavqOq6Qm{yqwAFd3etI2C98bx2hH%u5!ePmAvrVxDQd9`0#%Q7B9L8=(rXum~#R9USmpK;CQP--&eu3bBIMiaaK4iS!UqB=Gn!+fzl;wWh*le=#tz!l? zaoOFk>4)0Pm!B;$2jlQxbScuR0As9d3C>dV#H48!y}ad;1#OZ*--&c9kr7AH6Kr-6 zIu1J{&NI_id1UBcl2MmEZWT8{rJutm*GB!HuZ_q?EfQqGT<etmyKoKKX6%R~E@iuw|ezAHX7Mr-nj&+3e36QW2Q|wVV z)9y3nF_(xnPtLIClc8~Cz>y-WOt|G&dE(5h>(F8m`N_N}nkIL7RLAsw@F)dG1Ff)?h?{;;cVGj_DoIbGAtGoc|9(Jk@Xv#i9hL#?|z z)YK~yON;5vdq4}c!wf8+i9fj91L_L3G-F+#i-TcMb1S^);?W86z&Z;rTieY`Pyhtx z#{ap*Ma75s2;_S^$}JS4=7KN?{(Nt^Lv=ur?8Q32UyJl*fVcboH-cij)r0Qe^K#Ui zwwV{J>?7s2$bPSM0q3vwa!Vc7B)D&5rV#26%vIT}YA$fFck4 zI79qQwuQNMUnm{Tm&u}FOn3>csh2ZJv9S2DR?DqT%IC#&sRdyT7ja@aC3FXoN~gzr zxe>D~3T`6N)F7Vd#9;t!2b68&PvS{!HPA#StD$`;W7<3anS|YS4ES&~$`SBxkr{YZ zvoet|Q0rFOtN7`eTd0W_kX&q2_e?3d z_BaTocbT|9QmqP!3rUSk=*@llkZBRDLBZA=-JB7^qdWbb@CU$wFHLMsn8+IKW-Q{z z5VE@5)`p2h_eIB=u9d{|pm!q7uW93n-a-x;)H58CXLspkJ`ne2ZRZiLT zfhzwvq#trR@ga96%^mBR%xjTmv9i9%E>f9;49TB_#HRJzV9}d?u%f&8sJ_jffuS^D z{_=*DH(&q{)d_J`6QhG)=Wk#~qcH0Jzg;Z6NQrTQYEKu6!#@>pi9%cqrR;+y$4|6X z*U_K3@L|GJ%Fq#wZ zLJcj)AiuTF%s%1YN>nhLgrj|dgBoExtJFtT^U5qkJML*xGN&a8k{7(#>{RryD?$f~a@acXgWz zP_VHyNc`0ogHL6)fX^kY$V5uKTe{@}QZ_q)3Ie(Ftml0h!NVN9A72_syxU*iH1VxT zH1;we-o7sEbQjqFLv~wj^5RKjSkK6|5`WQpaQs1ID%wv|E?JmaN{3}4P{*geg`e%` z#JtgD6G??sow}RSxGRRTivY~Iei)Dbw7fxi7*gtKBU~b&EEf8e&V?F9BN#Iwph{-n zfMCNOFw3FRqr_f(n-O*kY$YkiTTiuUK$$6%Jl1M8Db80zj-r-wb(9Bb$3)cTiJ6D$ zDWqbGoWoSOl_dq}?FAKw^r$1!1FKWa;4y7g%JIkRAvMj$>J)4L|+wgQ`#xGVz;9B^uo*dT1kJ zLN`Le!!nt~*xO#O`b|q-pKfszd#{27btfcMs&TWYMP%7h;

L*7)2xo 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 ?=ZYB;2c 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 Xf3bT258zMx`00NEM}aPcA&wUS#HD;- From ed0533ad3a2346ba9fc7eb1ee54005e2b55bf40e Mon Sep 17 00:00:00 2001 From: robnee Date: Thu, 1 Apr 2021 20:52:03 -0400 Subject: [PATCH 270/646] Clamp lighting value on export to fix flat colors Also, this fixes the Printf format for the ambient lighting entry on the configuration screen. This was causing string behavior when attempting to edit the ambient lighting value on Windows. Oddly this didn't seem to affect Linux. --- src/confscreen.cpp | 4 +--- src/export.cpp | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/confscreen.cpp b/src/confscreen.cpp index c7e2815a0..4a4b7b23d 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -236,9 +236,7 @@ void TextWindow::ShowConfiguration() { CO(SS.lightDir[i]), i, &ScreenChangeLightDirection, SS.lightIntensity[i], i, &ScreenChangeLightIntensity); } - Printf(false, "%Bp ambient lighting " - "%2 %Fl%D%f%Ll[c]%E", - (i & 1) ? 'd' : 'a', i, + Printf(false, "%Ba ambient lighting %2 %Fl%f%Ll[c]%E", SS.ambientIntensity, &ScreenChangeLightAmbient); Printf(false, ""); diff --git a/src/export.cpp b/src/export.cpp index b9ebb914b..f1c331fd7 100644 --- a/src/export.cpp +++ b/src/export.cpp @@ -366,9 +366,9 @@ void SolveSpaceUI::ExportLinesAndMesh(SEdgeList *sel, SBezierList *sbl, SMesh *s // And calculate lighting for the triangle Vector n = tt.Normal().WithMagnitude(1); - double lighting = SS.ambientIntensity + + double lighting = min(1.0, SS.ambientIntensity + max(0.0, (SS.lightIntensity[0])*(n.Dot(l0))) + - max(0.0, (SS.lightIntensity[1])*(n.Dot(l1))); + max(0.0, (SS.lightIntensity[1])*(n.Dot(l1)))); double r = min(1.0, tt.meta.color.redF() * lighting), g = min(1.0, tt.meta.color.greenF() * lighting), b = min(1.0, tt.meta.color.blueF() * lighting); From 323ac9010b78f1abe96fa56622414c8167d58844 Mon Sep 17 00:00:00 2001 From: robnee Date: Sat, 27 Mar 2021 12:26:49 -0400 Subject: [PATCH 271/646] Allow right click to end sketching of all entities --- src/mouse.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/mouse.cpp b/src/mouse.cpp index 77b52342d..b8a191f77 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -526,11 +526,16 @@ void GraphicsWindow::MouseRightUp(double x, double y) { } if(pending.operation == Pending::DRAGGING_NEW_LINE_POINT || - pending.operation == Pending::DRAGGING_NEW_CUBIC_POINT) + pending.operation == Pending::DRAGGING_NEW_CUBIC_POINT || + pending.operation == Pending::DRAGGING_NEW_ARC_POINT || + pending.operation == Pending::DRAGGING_NEW_RADIUS || + pending.operation == Pending::DRAGGING_NEW_POINT + ) { // Special case; use a right click to stop drawing lines, since // a left click would draw another one. This is quicker and more - // intuitive than hitting escape. Likewise for new cubic segments. + // intuitive than hitting escape. Likewise for other entities + // for consistency. ClearPending(); return; } From a335196ae3da86fc5c7aacdb10f1e911c46eefb2 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 1 Apr 2021 19:54:48 -0400 Subject: [PATCH 272/646] change test sketch failing under x86-64-v3. Add a copy of the sketch for the old round-trip tests. --- test/constraint/equal_angle/normal.png | Bin 5267 -> 5271 bytes test/constraint/equal_angle/normal.slvs | 20 +- .../equal_angle/normal_old_version.slvs | 463 ++++++++++++++++++ test/constraint/equal_angle/test.cpp | 4 +- 4 files changed, 475 insertions(+), 12 deletions(-) create mode 100644 test/constraint/equal_angle/normal_old_version.slvs diff --git a/test/constraint/equal_angle/normal.png b/test/constraint/equal_angle/normal.png index 3f81a9543e93bd20eed1bc2f27cd82c6e4962e4a..aecf31558739c25da5a58ab8caa8bad7e4c0a8b5 100644 GIT binary patch literal 5271 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 F{1e^z4Lkq< diff --git a/test/constraint/equal_angle/normal.slvs b/test/constraint/equal_angle/normal.slvs index b1d538f1d..60e7b924c 100644 --- a/test/constraint/equal_angle/normal.slvs +++ b/test/constraint/equal_angle/normal.slvs @@ -119,7 +119,7 @@ Param.val=-5.00000000000000000000 AddParam Param.h.v.=00040011 -Param.val=5.00000000000000000000 +Param.val=5.00000000000000088818 AddParam Param.h.v.=00040013 @@ -147,7 +147,7 @@ Param.val=10.00000000000000000000 AddParam Param.h.v.=00060010 -Param.val=10.00000000000000000000 +Param.val=10.29878739785912600269 AddParam Param.h.v.=00060011 @@ -155,7 +155,7 @@ Param.val=10.00000000000000000000 AddParam Param.h.v.=00060013 -Param.val=5.00000000000000000000 +Param.val=5.29878739785912422633 AddParam Param.h.v.=00060014 @@ -163,7 +163,7 @@ Param.val=5.00000000000000000000 AddParam Param.h.v.=00070010 -Param.val=5.00000000000000000000 +Param.val=5.29878739785912422633 AddParam Param.h.v.=00070011 @@ -171,7 +171,7 @@ Param.val=5.00000000000000000000 AddParam Param.h.v.=00070013 -Param.val=10.00000000000000000000 +Param.val=10.29878739785912600269 AddParam Param.h.v.=00070014 @@ -310,7 +310,7 @@ Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 Entity.actPoint.x=-5.00000000000000000000 -Entity.actPoint.y=5.00000000000000000000 +Entity.actPoint.y=5.00000000000000088818 Entity.actVisible=1 AddEntity @@ -363,7 +363,7 @@ Entity.h.v=00060001 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=10.00000000000000000000 +Entity.actPoint.x=10.29878739785912600269 Entity.actPoint.y=10.00000000000000000000 Entity.actVisible=1 AddEntity @@ -372,7 +372,7 @@ Entity.h.v=00060002 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=5.00000000000000000000 +Entity.actPoint.x=5.29878739785912422633 Entity.actPoint.y=5.00000000000000000000 Entity.actVisible=1 AddEntity @@ -390,7 +390,7 @@ Entity.h.v=00070001 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=5.00000000000000000000 +Entity.actPoint.x=5.29878739785912422633 Entity.actPoint.y=5.00000000000000000000 Entity.actVisible=1 AddEntity @@ -399,7 +399,7 @@ Entity.h.v=00070002 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=10.00000000000000000000 +Entity.actPoint.x=10.29878739785912600269 Entity.actPoint.y=5.00000000000000000000 Entity.actVisible=1 AddEntity diff --git a/test/constraint/equal_angle/normal_old_version.slvs b/test/constraint/equal_angle/normal_old_version.slvs new file mode 100644 index 000000000..b1d538f1d --- /dev/null +++ b/test/constraint/equal_angle/normal_old_version.slvs @@ -0,0 +1,463 @@ +SolveSpaceREVa + + +Group.h.v=00000001 +Group.type=5000 +Group.name=#references +Group.color=ff000000 +Group.skipFirst=0 +Group.predef.swapUV=0 +Group.predef.negateU=0 +Group.predef.negateV=0 +Group.visible=1 +Group.suppress=0 +Group.relaxConstraints=0 +Group.allowRedundant=0 +Group.allDimsReference=0 +Group.scale=1.00000000000000000000 +Group.remap={ +} +AddGroup + +Group.h.v=00000002 +Group.type=5001 +Group.order=1 +Group.name=sketch-in-plane +Group.activeWorkplane.v=80020000 +Group.color=ff000000 +Group.subtype=6000 +Group.skipFirst=0 +Group.predef.q.w=1.00000000000000000000 +Group.predef.origin.v=00010001 +Group.predef.swapUV=0 +Group.predef.negateU=0 +Group.predef.negateV=0 +Group.visible=1 +Group.suppress=0 +Group.relaxConstraints=0 +Group.allowRedundant=0 +Group.allDimsReference=0 +Group.scale=1.00000000000000000000 +Group.remap={ +} +AddGroup + +Param.h.v.=00010010 +AddParam + +Param.h.v.=00010011 +AddParam + +Param.h.v.=00010012 +AddParam + +Param.h.v.=00010020 +Param.val=1.00000000000000000000 +AddParam + +Param.h.v.=00010021 +AddParam + +Param.h.v.=00010022 +AddParam + +Param.h.v.=00010023 +AddParam + +Param.h.v.=00020010 +AddParam + +Param.h.v.=00020011 +AddParam + +Param.h.v.=00020012 +AddParam + +Param.h.v.=00020020 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020021 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020022 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020023 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00030010 +AddParam + +Param.h.v.=00030011 +AddParam + +Param.h.v.=00030012 +AddParam + +Param.h.v.=00030020 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00030021 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00030022 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00030023 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00040010 +Param.val=-5.00000000000000000000 +AddParam + +Param.h.v.=00040011 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00040013 +Param.val=-10.00000000000000000000 +AddParam + +Param.h.v.=00040014 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00050010 +Param.val=-10.00000000000000000000 +AddParam + +Param.h.v.=00050011 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00050013 +Param.val=-5.00000000000000000000 +AddParam + +Param.h.v.=00050014 +Param.val=10.00000000000000000000 +AddParam + +Param.h.v.=00060010 +Param.val=10.00000000000000000000 +AddParam + +Param.h.v.=00060011 +Param.val=10.00000000000000000000 +AddParam + +Param.h.v.=00060013 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00060014 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00070010 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00070011 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00070013 +Param.val=10.00000000000000000000 +AddParam + +Param.h.v.=00070014 +Param.val=5.00000000000000000000 +AddParam + +Request.h.v=00000001 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000002 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000003 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000004 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Request.h.v=00000005 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Request.h.v=00000006 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Request.h.v=00000007 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Entity.h.v=00010000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00010001 +Entity.normal.v=00010020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00010001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00010020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00010001 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00020001 +Entity.normal.v=00020020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00020001 +Entity.actNormal.w=0.50000000000000000000 +Entity.actNormal.vx=0.50000000000000000000 +Entity.actNormal.vy=0.50000000000000000000 +Entity.actNormal.vz=0.50000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00030001 +Entity.normal.v=00030020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00030001 +Entity.actNormal.w=0.50000000000000000000 +Entity.actNormal.vx=-0.50000000000000000000 +Entity.actNormal.vy=-0.50000000000000000000 +Entity.actNormal.vz=-0.50000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00040001 +Entity.point[1].v=00040002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-5.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-10.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00050000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00050001 +Entity.point[1].v=00050002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00050001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-10.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00050002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-5.00000000000000000000 +Entity.actPoint.y=10.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00060000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00060001 +Entity.point[1].v=00060002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00060001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=10.00000000000000000000 +Entity.actPoint.y=10.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00060002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=5.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00070000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00070001 +Entity.point[1].v=00070002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00070001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=5.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00070002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=10.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80020000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=80020002 +Entity.normal.v=80020001 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80020001 +Entity.type=3010 +Entity.construction=0 +Entity.point[0].v=80020002 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80020002 +Entity.type=2012 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Constraint.h.v=00000001 +Constraint.type=20 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.ptA.v=00040002 +Constraint.ptB.v=00050001 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000002 +Constraint.type=20 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.ptA.v=00060002 +Constraint.ptB.v=00070001 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000003 +Constraint.type=54 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.entityA.v=00040000 +Constraint.entityB.v=00050000 +Constraint.entityC.v=00070000 +Constraint.entityD.v=00060000 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + diff --git a/test/constraint/equal_angle/test.cpp b/test/constraint/equal_angle/test.cpp index f1e5fce94..e96c709f0 100644 --- a/test/constraint/equal_angle/test.cpp +++ b/test/constraint/equal_angle/test.cpp @@ -8,12 +8,12 @@ TEST_CASE(normal_roundtrip) { TEST_CASE(normal_migrate_from_v20) { CHECK_LOAD("normal_v20.slvs"); - CHECK_SAVE("normal.slvs"); + CHECK_SAVE("normal_old_version.slvs"); } TEST_CASE(normal_migrate_from_v22) { CHECK_LOAD("normal_v22.slvs"); - CHECK_SAVE("normal.slvs"); + CHECK_SAVE("normal_old_version.slvs"); } TEST_CASE(other_roundtrip) { From 806ce15a80672292ff2f743f800d9ddc00b15179 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 2 Apr 2021 17:17:10 -0400 Subject: [PATCH 273/646] Update mimalloc version. --- extlib/mimalloc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/mimalloc b/extlib/mimalloc index 276278436..4e643b6d3 160000 --- a/extlib/mimalloc +++ b/extlib/mimalloc @@ -1 +1 @@ -Subproject commit 27627843648ef84aee1621976f25bee5946e6bda +Subproject commit 4e643b6d3178e0ea2a093b7e14fe621631a91e4b From adffca7e14aad40a256f2067b4e5106afddf7b8d Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 3 Apr 2021 13:13:27 -0400 Subject: [PATCH 274/646] Fix issue #984 by changing the comma in not-closed-contour chinese translation. --- res/locales/zh_CN.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index 1c2ce7f68..6cc88cdde 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -2,20 +2,20 @@ # Copyright (C) 2020 the PACKAGE authors # This file is distributed under the same license as the SolveSpace package. # , 2020. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" "POT-Creation-Date: 2021-02-01 15:45+0200\n" -"PO-Revision-Date: 2020-09-28 12:42+0800\n" +"PO-Revision-Date: 2021-04-03 13:10-0400\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.1\n" +"X-Generator: Poedit 2.4.2\n" #: clipboard.cpp:310 msgid "" @@ -1286,7 +1286,7 @@ msgstr "(未命名)" #: groupmesh.cpp:709 msgid "not closed contour, or not all same style!" -msgstr "未闭合轮廓,或样式不一致!" +msgstr "未闭合轮廓 , 或样式不一致!" #: groupmesh.cpp:722 msgid "points not all coplanar!" From 0cd6fa9cc02871f78da98835e4285339d2c6a8d4 Mon Sep 17 00:00:00 2001 From: robnee Date: Sat, 3 Apr 2021 15:11:10 -0400 Subject: [PATCH 275/646] Skip image rendering in CLI rather than hard abort --- src/render/render2d.cpp | 4 ++-- test/request/image/linked.png | Bin 0 -> 4309 bytes test/request/image/normal.png | Bin 0 -> 4292 bytes test/request/image/test.cpp | 5 ++--- 4 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 test/request/image/linked.png create mode 100644 test/request/image/normal.png diff --git a/src/render/render2d.cpp b/src/render/render2d.cpp index 710e795d6..fd948e805 100644 --- a/src/render/render2d.cpp +++ b/src/render/render2d.cpp @@ -190,11 +190,11 @@ void SurfaceRenderer::DrawFaces(const SMesh &m, const std::vector &fac void SurfaceRenderer::DrawPixmap(std::shared_ptr pm, const Vector &o, const Vector &u, const Vector &v, const Point2d &ta, const Point2d &tb, hFill hcf) { - ssassert(false, "Not implemented"); + dbp("Not implemented"); } void SurfaceRenderer::InvalidatePixmap(std::shared_ptr pm) { - ssassert(false, "Not implemented"); + dbp("Not implemented"); } //----------------------------------------------------------------------------- diff --git a/test/request/image/linked.png b/test/request/image/linked.png new file mode 100644 index 0000000000000000000000000000000000000000..8667e34140ad2c7704ef6f2ca9b11630c3c03765 GIT binary patch literal 4309 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 literal 0 HcmV?d00001 diff --git a/test/request/image/test.cpp b/test/request/image/test.cpp index da0954e0e..a9507beed 100644 --- a/test/request/image/test.cpp +++ b/test/request/image/test.cpp @@ -2,13 +2,12 @@ TEST_CASE(normal_roundtrip) { CHECK_LOAD("normal.slvs"); - // Can't render images through cairo for now. - // CHECK_RENDER("normal.png"); + CHECK_RENDER("normal.png"); CHECK_SAVE("normal.slvs"); } TEST_CASE(linked_roundtrip) { CHECK_LOAD("linked.slvs"); - // CHECK_RENDER("linked.png"); + CHECK_RENDER("linked.png"); CHECK_SAVE("linked.slvs"); } From 6437a5cdd972dce0d32c74bed8796533876aebcd Mon Sep 17 00:00:00 2001 From: robnee Date: Sat, 3 Apr 2021 14:41:08 -0400 Subject: [PATCH 276/646] repair glyph data for [ff0c] to prevent assertion --- res/fonts/unicode.lff.gz | Bin 482562 -> 482559 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/res/fonts/unicode.lff.gz b/res/fonts/unicode.lff.gz index f6e55fbfc9a12943edc73fee0c604d6e92c196ef..6d35aecf6bca69f87886c7d51db5d1bc25ec0caa 100644 GIT binary patch delta 4035 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 delta 4038 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 s9be$Rt<8 From 5297e6e3acbbbb674adaaac12b22cbdce31e7202 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 8 Feb 2021 01:07:21 +0100 Subject: [PATCH 277/646] Add apple arm64 support --- .github/scripts/build-macos.sh | 67 ++++++++++++------ .github/scripts/install-macos.sh | 14 +++- .github/scripts/sign-macos.sh | 14 ++++ .github/workflows/cd.yml | 18 ++--- .github/workflows/test.yml | 6 +- CMakeLists.txt | 32 ++++----- cmake/libpng-macos-arm64.patch | 117 +++++++++++++++++++++++++++++++ extlib/libpng | 2 +- res/CMakeLists.txt | 2 +- src/CMakeLists.txt | 46 ++++++++---- 10 files changed, 250 insertions(+), 68 deletions(-) create mode 100644 cmake/libpng-macos-arm64.patch diff --git a/.github/scripts/build-macos.sh b/.github/scripts/build-macos.sh index bb4c1e0ce..fae7e27ff 100755 --- a/.github/scripts/build-macos.sh +++ b/.github/scripts/build-macos.sh @@ -1,27 +1,52 @@ #!/bin/sh -xe -mkdir build || true -cd build - -OSX_TARGET="10.9" - +ENABLE_SANITIZERS="OFF" if [ "$1" = "release" ]; then - BUILD_TYPE=RelWithDebInfo - cmake \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_TARGET}" \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ - -DENABLE_OPENMP="ON" \ - -DENABLE_LTO="ON" \ - .. + BUILD_TYPE="RelWithDebInfo" + ENABLE_LTO="ON" +else + BUILD_TYPE="Debug" + ENABLE_LTO="OFF" +fi + +# this is an option for our Github CI only, since it doesn't have a macos arm64 image yet +CMAKE_GENERATOR="Unix Makefiles" +CMAKE_PREFIX_PATH="" +if [ "$2" = "arm64" ]; then + OSX_ARCHITECTURE="arm64" + CMAKE_PREFIX_PATH="/tmp/libomp-arm64/libomp/11.0.1" + git apply cmake/libpng-macos-arm64.patch || echo "Could not apply patch, probably already patched..." + mkdir build-arm64 || true + cd build-arm64 +elif [ "$2" = "x86_64" ]; then + OSX_ARCHITECTURE="x86_64" + CMAKE_PREFIX_PATH="/tmp/libomp-x86_64/libomp/11.0.1" + mkdir build || true + cd build else - BUILD_TYPE=Debug - cmake \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_TARGET}" \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ - -DENABLE_OPENMP="ON" \ - -DENABLE_SANITIZERS="ON" \ - .. + mkdir build || true + cd build fi -cmake --build . --config "${BUILD_TYPE}" -- -j$(nproc) -make -j$(nproc) test_solvespace +if [ "$3" = "xcode" ]; then + CMAKE_GENERATOR="Xcode" +fi + +cmake \ + -G "${CMAKE_GENERATOR}" \ + -D CMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}" \ + -D CMAKE_OSX_ARCHITECTURES="${OSX_ARCHITECTURE}" \ + -D CMAKE_BUILD_TYPE="${BUILD_TYPE}" \ + -D ENABLE_OPENMP="ON" \ + -D ENABLE_SANITIZERS="${ENABLE_SANITIZERS}" \ + -D ENABLE_LTO="${ENABLE_LTO}" \ + .. + +if [ "$3" = "xcode" ]; then + open solvespace.xcodeproj +else + cmake --build . --config "${BUILD_TYPE}" -j$(sysctl -n hw.logicalcpu) + if [ $(uname -m) = "$2" ]; then + make -j$(sysctl -n hw.logicalcpu) test_solvespace + fi +fi \ No newline at end of file diff --git a/.github/scripts/install-macos.sh b/.github/scripts/install-macos.sh index 457dd5d4b..c6ec104d4 100755 --- a/.github/scripts/install-macos.sh +++ b/.github/scripts/install-macos.sh @@ -1,4 +1,14 @@ #!/bin/sh -xe -brew install libomp -git submodule update --init \ No newline at end of file +if [ "$1" = "ci" ]; then + curl -L https://bintray.com/homebrew/bottles/download_file?file_path=libomp-11.0.1.arm64_big_sur.bottle.tar.gz --output /tmp/libomp-arm64.tar.gz + mkdir /tmp/libomp-arm64 || true + tar -xzvf /tmp/libomp-arm64.tar.gz -C /tmp/libomp-arm64 + curl -L https://bintray.com/homebrew/bottles/download_file?file_path=libomp-11.0.1.big_sur.bottle.tar.gz --output /tmp/libomp-x86_64.tar.gz + mkdir /tmp/libomp-x86_64 || true + tar -xzvf /tmp/libomp-x86_64.tar.gz -C /tmp/libomp-x86_64 +else + brew install libomp +fi + +git submodule update --init extlib/cairo extlib/freetype extlib/libdxfrw extlib/libpng extlib/mimalloc extlib/pixman extlib/zlib diff --git a/.github/scripts/sign-macos.sh b/.github/scripts/sign-macos.sh index c23dab998..80ac1256b 100755 --- a/.github/scripts/sign-macos.sh +++ b/.github/scripts/sign-macos.sh @@ -1,5 +1,19 @@ #!/bin/bash -xe +lipo \ + -create \ + build/bin/SolveSpace.app/Contents/MacOS/SolveSpace \ + build-arm64/bin/SolveSpace.app/Contents/MacOS/SolveSpace \ + -output \ + build/bin/SolveSpace.app/Contents/MacOS/SolveSpace + +lipo \ + -create \ + build/bin/SolveSpace.app/Contents/MacOS/solvespace-cli \ + build-arm64/bin/SolveSpace.app/Contents/MacOS/solvespace-cli \ + -output \ + build/bin/SolveSpace.app/Contents/MacOS/solvespace-cli + cd build openmp="bin/SolveSpace.app/Contents/Resources/lib/libomp.dylib" diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 154b6faa2..99c85b3d0 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -32,14 +32,14 @@ jobs: shell: bash test_macos: - runs-on: macos-latest + runs-on: macos-10.15 name: Test macOS steps: - uses: actions/checkout@v2 - name: Install Dependencies - run: .github/scripts/install-macos.sh + run: .github/scripts/install-macos.sh ci - name: Build & Test - run: .github/scripts/build-macos.sh + run: .github/scripts/build-macos.sh debug arm64 && .github/scripts/build-macos.sh debug x86_64 build_release_windows: needs: [test_ubuntu, test_windows, test_macos] @@ -80,13 +80,13 @@ jobs: build_release_macos: needs: [test_ubuntu, test_windows, test_macos] name: Build Release macOS - runs-on: macos-latest + runs-on: macos-10.15 steps: - uses: actions/checkout@v2 - name: Install Dependencies - run: .github/scripts/install-macos.sh + run: .github/scripts/install-macos.sh ci - name: Build & Test - run: .github/scripts/build-macos.sh release + run: .github/scripts/build-macos.sh release arm64 && .github/scripts/build-macos.sh release x86_64 - name: Sign Build run: .github/scripts/sign-macos.sh env: @@ -100,7 +100,7 @@ jobs: with: name: macos path: build/bin/SolveSpace.dmg - + deploy_snap_amd64: needs: [test_ubuntu, test_windows, test_macos] name: Deploy AMD64 Snap @@ -128,7 +128,7 @@ jobs: store_login: ${{ secrets.SNAPSTORE_LOGIN }} snap: ${{ steps.build.outputs.snap }} release: edge,beta - + deploy_snap_arm64: needs: [test_ubuntu, test_windows, test_macos] name: Deploy ARM64 Snap @@ -160,7 +160,7 @@ jobs: store_login: ${{ secrets.SNAPSTORE_LOGIN }} snap: ${{ steps.build.outputs.snap }} release: edge,beta - + update_edge_release: name: Update Edge Release needs: [build_release_windows, build_release_windows_openmp, build_release_macos] diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 27462aeff..1ca64b3a8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,11 +34,11 @@ jobs: shell: bash test_macos: - runs-on: macos-latest + runs-on: macos-10.15 name: Test macOS steps: - uses: actions/checkout@v2 - name: Install Dependencies - run: .github/scripts/install-macos.sh + run: .github/scripts/install-macos.sh ci - name: Build & Test - run: .github/scripts/build-macos.sh + run: .github/scripts/build-macos.sh debug arm64 && .github/scripts/build-macos.sh debug x86_64 diff --git a/CMakeLists.txt b/CMakeLists.txt index 12948781f..62eb646d2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ # cmake configuration +cmake_minimum_required(VERSION 3.9...3.19) if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) message(FATAL_ERROR @@ -7,17 +8,10 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) " mkdir build && cd build && cmake ..") endif() -cmake_minimum_required(VERSION 3.7.2 FATAL_ERROR) -if(NOT CMAKE_VERSION VERSION_LESS 3.11.0) - cmake_policy(VERSION 3.11.0) -endif() -if(NOT CMAKE_VERSION VERSION_LESS 3.9) - # LTO/IPO with non-Intel compilers on Linux requires policy CMP0069 to be set to NEW. - # Set it explicitly until cmake_minimum_required is raised to >= 3.9. - cmake_policy(SET CMP0069 NEW) -endif() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") + +cmake_policy(SET CMP0048 OLD) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED YES) @@ -27,7 +21,7 @@ set(CMAKE_USER_MAKE_RULES_OVERRIDE set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX "${CMAKE_SOURCE_DIR}/cmake/cxx_flag_overrides.cmake") -if(APPLE OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") +if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() @@ -40,10 +34,10 @@ include(GetGitCommitHash) # and instead uncomment the following, adding the complete git hash of the checkout you are using: # set(GIT_COMMIT_HASH 0000000000000000000000000000000000000000) -project(solvespace) 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) set(ENABLE_GUI ON CACHE BOOL "Whether the graphical interface is enabled") @@ -68,10 +62,6 @@ if("${CMAKE_GENERATOR}" STREQUAL "Xcode") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${CMAKE_BINARY_DIR}/bin>) endif() -if(NOT CMAKE_C_COMPILER_ID STREQUAL CMAKE_CXX_COMPILER_ID) - message(FATAL_ERROR "C and C++ compilers should be supplied by the same vendor") -endif() - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) # GCC 4.8/4.9 ship with broken but present . meh. @@ -210,6 +200,12 @@ if(WIN32 OR APPLE) find_vendored_package(PNG libpng SKIP_INSTALL_ALL ON PNG_LIBRARY png_static + PNG_ARM_NEON "off" + PNG_SHARED OFF + PNG_STATIC ON + PNG_EXECUTABLES OFF + PNG_TESTS OFF + PNG_FRAMEWORK OFF PNG_PNG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/extlib/libpng) list(APPEND PNG_PNG_INCLUDE_DIR ${CMAKE_BINARY_DIR}/extlib/libpng) @@ -222,11 +218,14 @@ if(WIN32 OR APPLE) FREETYPE_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extlib/freetype/include) message(STATUS "Using in-tree pixman") - add_vendored_subdirectory(extlib/pixman) set(PIXMAN_FOUND YES) set(PIXMAN_LIBRARY pixman) + set(PIXMAN_BUILD_TESTS OFF CACHE BOOL "") + set(PIXMAN_BUILD_DEMOS OFF CACHE BOOL "") + set(PIXMAN_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extlib/pixman/pixman) list(APPEND PIXMAN_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/extlib/pixman/pixman) + add_vendored_subdirectory(extlib/pixman) message(STATUS "Using in-tree cairo") add_vendored_subdirectory(extlib/cairo) @@ -275,6 +274,7 @@ if(ENABLE_GUI) elseif(APPLE) find_package(OpenGL REQUIRED) find_library(APPKIT_LIBRARY AppKit REQUIRED) + set(util_LIBRARIES ${APPKIT_LIBRARY}) else() find_package(OpenGL REQUIRED) find_package(SpaceWare) diff --git a/cmake/libpng-macos-arm64.patch b/cmake/libpng-macos-arm64.patch new file mode 100644 index 000000000..2d0e15cfa --- /dev/null +++ b/cmake/libpng-macos-arm64.patch @@ -0,0 +1,117 @@ +diff --git a/extlib/libpng/CMakeLists.txt b/extlib/libpng/CMakeLists.txt +index 42ff0f9025..6834ea332e 100644 +--- a/extlib/libpng/CMakeLists.txt ++++ b/extlib/libpng/CMakeLists.txt +@@ -65,11 +65,22 @@ option(PNG_HARDWARE_OPTIMIZATIONS "Enable hardware optimizations" ON) + set(PNG_PREFIX "" CACHE STRING "Prefix to add to the API function names") + set(DFA_XTRA "" CACHE FILEPATH "File containing extra configuration settings") + ++# CMake currently sets CMAKE_SYSTEM_PROCESSOR to one of x86_64 or arm64 on macOS, ++# based upon the OS architecture, not the target architecture. As such, we need ++# to check CMAKE_OSX_ARCHITECTURES to identify which hardware-specific flags to ++# enable. Note that this will fail if you attempt to build a universal binary in ++# a single cmake invocation. ++if (APPLE AND CMAKE_OSX_ARCHITECTURES) ++ set(TARGET_ARCH ${CMAKE_OSX_ARCHITECTURES}) ++else() ++ set(TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR}) ++endif() ++ + if(PNG_HARDWARE_OPTIMIZATIONS) + + # Set definitions and sources for ARM. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64") ++if(TARGET_ARCH MATCHES "^arm" OR ++ TARGET_ARCH MATCHES "^aarch64") + set(PNG_ARM_NEON_POSSIBLE_VALUES check on off) + set(PNG_ARM_NEON "check" + CACHE STRING "Enable ARM NEON optimizations: check|on|off; check is default") +@@ -95,8 +106,8 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR + endif() + + # Set definitions and sources for PowerPC. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*") ++if(TARGET_ARCH MATCHES "^powerpc*" OR ++ TARGET_ARCH MATCHES "^ppc64*") + set(PNG_POWERPC_VSX_POSSIBLE_VALUES on off) + set(PNG_POWERPC_VSX "on" + CACHE STRING "Enable POWERPC VSX optimizations: on|off; on is default") +@@ -118,8 +129,8 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR + endif() + + # Set definitions and sources for Intel. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*") ++if(TARGET_ARCH MATCHES "^i?86" OR ++ TARGET_ARCH MATCHES "^x86_64*") + set(PNG_INTEL_SSE_POSSIBLE_VALUES on off) + set(PNG_INTEL_SSE "on" + CACHE STRING "Enable INTEL_SSE optimizations: on|off; on is default") +@@ -141,8 +152,8 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR + endif() + + # Set definitions and sources for MIPS. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*") ++if(TARGET_ARCH MATCHES "mipsel*" OR ++ TARGET_ARCH MATCHES "mips64el*") + set(PNG_MIPS_MSA_POSSIBLE_VALUES on off) + set(PNG_MIPS_MSA "on" + CACHE STRING "Enable MIPS_MSA optimizations: on|off; on is default") +@@ -166,26 +177,26 @@ endif() + else(PNG_HARDWARE_OPTIMIZATIONS) + + # Set definitions and sources for ARM. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64") ++if(TARGET_ARCH MATCHES "^arm" OR ++ TARGET_ARCH MATCHES "^aarch64") + add_definitions(-DPNG_ARM_NEON_OPT=0) + endif() + + # Set definitions and sources for PowerPC. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*") ++if(TARGET_ARCH MATCHES "^powerpc*" OR ++ TARGET_ARCH MATCHES "^ppc64*") + add_definitions(-DPNG_POWERPC_VSX_OPT=0) + endif() + + # Set definitions and sources for Intel. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*") ++if(TARGET_ARCH MATCHES "^i?86" OR ++ TARGET_ARCH MATCHES "^x86_64*") + add_definitions(-DPNG_INTEL_SSE_OPT=0) + endif() + + # Set definitions and sources for MIPS. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*") ++if(TARGET_ARCH MATCHES "mipsel*" OR ++ TARGET_ARCH MATCHES "mips64el*") + add_definitions(-DPNG_MIPS_MSA_OPT=0) + endif() + +@@ -412,19 +412,11 @@ else() + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/checksym.awk" + "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.def") + +- add_custom_target(symbol-check +- DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk") +- + generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out" + "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym") + generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out" + "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers") + +- add_custom_target(genvers +- DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers") +- add_custom_target(gensym +- DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym") +- + add_custom_target("genprebuilt" + COMMAND "${CMAKE_COMMAND}" + "-DOUTPUT=scripts/pnglibconf.h.prebuilt" diff --git a/extlib/libpng b/extlib/libpng index e9c3d83d5..dbe3e0c43 160000 --- a/extlib/libpng +++ b/extlib/libpng @@ -1 +1 @@ -Subproject commit e9c3d83d5a04835806287f1e8c0f2d3a962d6673 +Subproject commit dbe3e0c43e549a1602286144d94b0666549b18e6 diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index 5b7c45d19..0f737a1e3 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -31,7 +31,7 @@ if(WIN32) set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${source}") endfunction() elseif(APPLE) - set(app_resource_dir ${CMAKE_BINARY_DIR}/bin/SolveSpace.app/Contents/Resources) + set(app_resource_dir ${CMAKE_BINARY_DIR}/Resources) set(cli_resource_dir ${CMAKE_BINARY_DIR}/res) function(add_resource name) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 45dab944f..5ac7b41d0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -338,7 +338,10 @@ if(ENABLE_GUI) LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF") elseif(APPLE) set_target_properties(solvespace PROPERTIES - OUTPUT_NAME SolveSpace) + OUTPUT_NAME SolveSpace + XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES" + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.solvespace" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") endif() endif() @@ -401,17 +404,30 @@ endif() # solvespace macOS package if(APPLE) - set(bundle SolveSpace) - set(bundle_bin ${EXECUTABLE_OUTPUT_PATH}/${bundle}.app/Contents/MacOS) - set(bundle_resources ${EXECUTABLE_OUTPUT_PATH}/${bundle}.app/Contents/Resources/lib) - execute_process( - COMMAND mkdir -p ${bundle_resources} - COMMAND cp -p /usr/local/opt/libomp/lib/libomp.dylib ${bundle_resources}/libomp.dylib - ) - add_custom_command(TARGET solvespace POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory ${bundle_bin} - COMMAND ${CMAKE_COMMAND} -E copy $ ${bundle_bin} - COMMAND install_name_tool -change /usr/local/opt/libomp/lib/libomp.dylib "@executable_path/../Resources/lib/libomp.dylib" ${bundle_bin}/${bundle} - COMMENT "Bundling executable solvespace-cli" - VERBATIM) -endif() + set(LIBOMP_LIB_PATH ${OpenMP_CXX_INCLUDE_DIRS}/../lib/libomp.dylib) + set(LIBOMP_LINK_PATH "@executable_path/../Resources/libomp.dylib") + set(LIBOMP_LINK_PATH_UTILS "@executable_path/SolveSpace.app/Contents/Resources/libomp.dylib") + if(ENABLE_GUI) + add_custom_command(TARGET solvespace POST_BUILD + COMMAND cp -r ${CMAKE_BINARY_DIR}/Resources $ + ) + if(ENABLE_OPENMP) + execute_process(COMMAND install_name_tool -id ${LIBOMP_LINK_PATH} ${LIBOMP_LIB_PATH}) + message("FROM " ${${LIBOMP_LIB_PATH}} "TO" $/Resources/libomp.dylib) + add_custom_command(TARGET solvespace POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${LIBOMP_LIB_PATH} $/Resources/libomp.dylib + COMMAND install_name_tool -change ${LIBOMP_LINK_PATH} ${LIBOMP_LINK_PATH_UTILS} $ + ) + endif() + endif() + if(ENABLE_TESTS AND ENABLE_OPENMP) + add_custom_command(TARGET solvespace POST_BUILD + COMMAND install_name_tool -change ${LIBOMP_LINK_PATH} ${LIBOMP_LINK_PATH_UTILS} $) + endif() + if(ENABLE_CLI) + add_custom_command(TARGET solvespace POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy $ $ + COMMENT "Bundling executable solvespace-cli" + VERBATIM) + endif() +endif() \ No newline at end of file From c01ce4d3a8b8249ef2c644da5aa98537b42ce268 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 8 Feb 2021 01:07:53 +0100 Subject: [PATCH 278/646] Fix debugging and profiling on macOS --- CMakeLists.txt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 62eb646d2..bdd36705d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,11 +72,13 @@ endif() # common compiler flags include(CheckCXXCompilerFlag) -set(FILE_PREFIX_MAP "-ffile-prefix-map=${CMAKE_CURRENT_SOURCE_DIR}=.") -check_cxx_compiler_flag("${FILE_PREFIX_MAP}" HAS_FILE_PREFIX_MAP) -if(HAS_FILE_PREFIX_MAP) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FILE_PREFIX_MAP}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FILE_PREFIX_MAP}") +if (NOT APPLE) + set(FILE_PREFIX_MAP "-ffile-prefix-map=${CMAKE_CURRENT_SOURCE_DIR}=.") + check_cxx_compiler_flag("${FILE_PREFIX_MAP}" HAS_FILE_PREFIX_MAP) + if(HAS_FILE_PREFIX_MAP) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FILE_PREFIX_MAP}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FILE_PREFIX_MAP}") + endif() endif() if(MINGW) From 6b09e4ab48a4882eda549be3e5a08f22004dfab8 Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Sun, 4 Apr 2021 13:21:14 +0100 Subject: [PATCH 279/646] Copy path to avoid it being invalidated by OkayToStartNewFile() --- src/graphicswin.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index a7d44f12f..8427fa1e9 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -369,8 +369,11 @@ static void PopulateMenuWithPathnames(Platform::MenuRef menu, void GraphicsWindow::PopulateRecentFiles() { PopulateMenuWithPathnames(openRecentMenu, SS.recentFiles, [](const Platform::Path &path) { + // OkayToStartNewFile could mutate recentFiles, which will invalidate path (which is a + // refererence into the recentFiles vector), so take a copy of it here. + Platform::Path pathCopy(path); if(!SS.OkayToStartNewFile()) return; - SS.Load(path); + SS.Load(pathCopy); }); PopulateMenuWithPathnames(linkRecentMenu, SS.recentFiles, [](const Platform::Path &path) { From 12dd7935c0eef224771e828e272b2a1f56a104cc Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 4 Apr 2021 19:15:00 +0200 Subject: [PATCH 280/646] Correct libomp.dylib path in sign-macos.sh script --- .github/scripts/sign-macos.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/sign-macos.sh b/.github/scripts/sign-macos.sh index 80ac1256b..74cd47689 100755 --- a/.github/scripts/sign-macos.sh +++ b/.github/scripts/sign-macos.sh @@ -16,7 +16,7 @@ lipo \ cd build -openmp="bin/SolveSpace.app/Contents/Resources/lib/libomp.dylib" +openmp="bin/SolveSpace.app/Contents/Resources/libomp.dylib" app="bin/SolveSpace.app" dmg="bin/SolveSpace.dmg" bundle_id="com.solvespace.solvespace" From 9026848d9722048020b144863f651490ab181dfc Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 4 Apr 2021 20:24:22 +0200 Subject: [PATCH 281/646] Combine arm64 and x86_64 libomp libraries --- .github/scripts/sign-macos.sh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/scripts/sign-macos.sh b/.github/scripts/sign-macos.sh index 74cd47689..8e944d3e7 100755 --- a/.github/scripts/sign-macos.sh +++ b/.github/scripts/sign-macos.sh @@ -1,5 +1,12 @@ #!/bin/bash -xe +lipo \ + -create \ + build/bin/SolveSpace.app/Contents/Resources/libomp.dylib \ + build-arm64/bin/SolveSpace.app/Contents/Resources/libomp.dylib \ + -output \ + build/bin/SolveSpace.app/Contents/Resources/libomp.dylib + lipo \ -create \ build/bin/SolveSpace.app/Contents/MacOS/SolveSpace \ From dee6cf99df28d5f4272499179b5c160de2e73daa Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 7 Apr 2021 10:45:03 +0300 Subject: [PATCH 282/646] Extrude, Lathe and Revolve Icons Updated Discussion here https://github.com/solvespace/solvespace/issues/857#issuecomment-813631658 --- res/icons/graphics-window/extrude.png | Bin 207 -> 216 bytes res/icons/graphics-window/lathe.png | Bin 245 -> 245 bytes res/icons/graphics-window/revolve.png | Bin 226 -> 245 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/res/icons/graphics-window/extrude.png b/res/icons/graphics-window/extrude.png index ad71bce33b5580e16c097121a561cde66b40a603..a8eb88bccda1dcf6d60e61e88e778f17960d1698 100644 GIT binary patch delta 170 zcmV;b09F6b0oVbMHh+ytL_t(I%iWVp3cxT3M2&|X@082hMIe~3QbK7vyLRMh#3A~I z0BB4A97?2_t>n=rqLh+LA)=gf{lj}ZNNGUU-aKv9ELl4!OHtKk4;{#zXsqOEwY%(5 zeCqV(pvWCPJJFAKBqEhnQf?dAPZ3$3+5XC_ThhOr2!I>fP$T;9QTp^pC}VEVr2oab Y0M-zQoYf{A2mk;807*qoM6N<$g2{?d0{{R3 delta 161 zcmV;S0AByt0nY)DHh&3lNLh0L01FcU01FcV0GgZ_0001QNkl^958W@NQT6+0K0{%t0FQ^s49TNQ?AdAJPzZCl5gWBN&!U_gMy0X z9FF(PZE8f+o%9=Wr#77*`U;fymV?TD%Xx`133b{ZQHriLdKy%HTenXFxcgsYAf1%G P00000NkvXXu0mjf@ghJ! diff --git a/res/icons/graphics-window/lathe.png b/res/icons/graphics-window/lathe.png index 02625401d3d75fe219d7f2da0752ed9a367649fb..3487bf239c0486b3c507b063210fa2fc0af53522 100644 GIT binary patch delta 199 zcmV;&0672k0rdfpHh-!~L_t(I%gt0l4#Xe`1ha32H|b~D0|{+a5I1g8PE8pm1A_p( zEznC4(e!_7Ek$&%A8X?51Lq0ZK;~Jd__8bzkqmDMrXV67%c#AKju4SjAR;1;?I=q( zY`lXsrxY3ctpor*UeA%cnHl{Ye{=1;B6EkC^&`8nhF-ak>=A4SoVM{6LicB50&ra=raRSmmTwpHT5)1$U002ovPDHLkV1g$@ BQ|tn0a_!N^u#r`8sDE?R2w7Hk5vsp+1@k08&b(Eb2NkJb?9ev>jdgMVJ`?03sqH z=cG};ZnfCu==uuC6OCHl>c&f~s0E)FO}fU|SHh-|{Y5+kyDNZf|A+MAgp+jTobwag g=ezToUCOcR1}8CEkVezuO8@`>07*qoM6N<$f)vwKq5uE@ delta 159 zcmV;Q0AT<10pbCWOMik%L_t(I%k5KJ4!|G?lZCV5ne?*Vhl|nR1Co7giF`^aAZ-X= z3z{WFWcZ$QHW9V;x@Mj2aI--iNIT0A&)Wh3F~%*7b)ULCfc1B@6J7cuA_4#a5fPDb zQ`Xll6kZ)&Zwc}c{gH@`w(=3R{-_o)ij#Ebl+u&)>$~HsUKl-5;sz=mJQfGbGTQ(E N002ovPDHLkV1k{yMlJvV From dff458cd87fb80100b6b338463db1b7e3c51781f Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 7 Apr 2021 12:54:14 +0300 Subject: [PATCH 283/646] Revolve icon updated to counter-clockwise, which is the way revolve works Lathe icon updated to match. Discussion here https://github.com/solvespace/solvespace/issues/857#issuecomment-814697125 --- res/icons/graphics-window/lathe.png | Bin 245 -> 260 bytes res/icons/graphics-window/revolve.png | Bin 245 -> 264 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/res/icons/graphics-window/lathe.png b/res/icons/graphics-window/lathe.png index 3487bf239c0486b3c507b063210fa2fc0af53522..cb91631b2b7def64147005c0dba90b65a294f899 100644 GIT binary patch delta 222 zcmV<403rYN0fYjOE`R?+r05&~006m3L_t(I%f(e&4#Xe`1mjuZO!l(u2OEo^q-)&N zkf!0)=}e&rAaLRoICSbNK*Ur3b+xG<-K*L9Sd&DDMw+*JX6$G)%SM-;W&u7TTjY1u zRve2A?P6M)0#+NiL_qwuo04#oO~f{q$S(qjzNF@KzVK!LO;@$^h`Mk@%*@ua1g=Iz zdexi6MDFD7tPaIgtgg4!)S)ZelDp*cWIhy*({70<4s_BkPRY(i_@%07*qoM6N<$g3?QHcmMzZ delta 207 zcmV;=05JcA0`&oqE`I=SrU#J#0062CDmw1{=&{s2Y8>H;Y;8W90_V%Tmu8DD_H*?e*O8DJm-xjO`! zTo)d7x@;l;5h$gzu%k??B_vv>Vguv$D)`%xRHoWNmD!hfpfo+ g8O7awY`?YHZ%3tAAx}39ZvX%Q07*qoM6N<$f>YjOxBvhE delta 211 zcmeBR`pP&#tDXS_@|Lkr1X7#@9+AZi4BWyX%*Zfnjs#F}s;7%%h{frrlO6dEC~&YW z{kZmr+TSzAf48W;Ug6`a-)| zoD4x;%XD5@8QC;^E!`p;`^$BPBm;wzlG5`ff%|>(w%&O9;uqHm;ohiwua0@IS;0DA z+;`Wp8{vnRP5kR>!?L>}=YRW`M=g^}p3eC!eEa$C&$D7rZG6q9ZWuMe?eZgUkn=rV L{an^LB{Ts5nPXWE From 153b7b4d1b9b7e647e1a210fb6e60fc2c23ea413 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Thu, 8 Apr 2021 16:24:53 +0200 Subject: [PATCH 284/646] CI: Support cancelling, update actions & prevent draft releases Allow the workflow to be cancelled without running all remaining jobs. On invocation of the workflow, cancel concurrent runs of older commits automatically. Replace unmaintained release action with recommended alternative. After much testing, I found that the problem of releases being created as draft releases can be traced to a consistency issue/race condition on GitHub's side. Prevent this by inserting a generous delay between deleting and re-creating the edge release. --- .github/workflows/cd.yml | 44 ++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 99c85b3d0..22a5d1a7c 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -9,19 +9,32 @@ on: - created jobs: + cancel_previous_runs: + runs-on: ubuntu-latest + name: Cancel Previous Runs + if: github.event_name == 'push' + steps: + - uses: styfle/cancel-workflow-action@0.8.0 + with: + access_token: ${{ github.token }} + test_ubuntu: - runs-on: ubuntu-18.04 - name: Test Ubuntu - steps: - - uses: actions/checkout@v2 - - name: Install Dependencies - run: .github/scripts/install-ubuntu.sh - - name: Build & Test - run: .github/scripts/build-ubuntu.sh + needs: [cancel_previous_runs] + runs-on: ubuntu-18.04 + name: Test Ubuntu + if: "!cancelled()" + steps: + - uses: actions/checkout@v2 + - name: Install Dependencies + run: .github/scripts/install-ubuntu.sh + - name: Build & Test + run: .github/scripts/build-ubuntu.sh test_windows: + needs: [cancel_previous_runs] runs-on: windows-2019 name: Test Windows + if: "!cancelled()" steps: - uses: actions/checkout@v2 - name: Install Dependencies @@ -32,8 +45,10 @@ jobs: shell: bash test_macos: + needs: [cancel_previous_runs] runs-on: macos-10.15 name: Test macOS + if: "!cancelled()" steps: - uses: actions/checkout@v2 - name: Install Dependencies @@ -164,26 +179,29 @@ jobs: update_edge_release: name: Update Edge Release needs: [build_release_windows, build_release_windows_openmp, build_release_macos] - if: always() && github.event_name == 'push' + if: github.event_name == 'push' && !cancelled() runs-on: ubuntu-latest outputs: upload_url: ${{ steps.create_release.outputs.upload_url }} steps: - name: Delete Old Edge Release - uses: dev-drprasad/delete-tag-and-release@v0.1.2 + uses: dev-drprasad/delete-tag-and-release@v0.2.0 with: delete_release: true tag_name: edge env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Wait + shell: bash + run: sleep 60 - name: Create New Edge Release id: create_release - uses: actions/create-release@v1 + uses: softprops/action-gh-release@35d938cf01f60fbe522917c81be1e892074f6ad6 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: tag_name: edge - release_name: Edge + name: Edge prerelease: true draft: false body: ${{ github.event.head_commit.message }} @@ -191,7 +209,7 @@ jobs: upload_release_assets: name: Upload Release Assets needs: [build_release_windows, build_release_windows_openmp, build_release_macos, update_edge_release] - if: always() + if: "!cancelled()" runs-on: ubuntu-latest steps: - name: Download All Workflow Artifacts From a6fd79ece8225212f97d9abdaebcd39aa6993bd8 Mon Sep 17 00:00:00 2001 From: app4soft Date: Tue, 13 Apr 2021 21:32:17 +0300 Subject: [PATCH 285/646] Update uk_UA.po --- res/locales/uk_UA.po | 179 +++++++++++++++++++++++++++---------------- 1 file changed, 115 insertions(+), 64 deletions(-) diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index 0b09760fb..e71069a9e 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: https://github.com/solvespace/solvespace/issues\n" "POT-Creation-Date: 2021-02-01 15:45+0200\n" -"PO-Revision-Date: 2021-03-09 23:34+0200\n" +"PO-Revision-Date: 2021-04-14 01:42+0300\n" "Last-Translator: https://github.com/Symbian9\n" "Language-Team: app4soft\n" "Language: uk_UA\n" @@ -154,7 +154,7 @@ msgstr "рівні-довжини" #: constraint.cpp:22 msgctxt "constr-name" msgid "eq-length-and-pt-ln-dist" -msgstr "" +msgstr "рівні-довжина-відстань-тчк-лінія" #: constraint.cpp:23 msgctxt "constr-name" @@ -219,7 +219,7 @@ msgstr "тчк-на-колі" #: constraint.cpp:35 msgctxt "constr-name" msgid "same-orientation" -msgstr "" +msgstr "співнаправленість" #: constraint.cpp:36 msgctxt "constr-name" @@ -401,12 +401,13 @@ msgid "" msgstr "" #: constraint.cpp:614 +#, fuzzy msgid "Must select an angle constraint." -msgstr "" +msgstr "Необхідно обрати кут." #: constraint.cpp:627 msgid "Must select a constraint with associated label." -msgstr "" +msgstr "Необхідно обрати обмежувач з відповідною міткою." #: constraint.cpp:638 msgid "" @@ -458,6 +459,9 @@ msgid "" "No solid model present; draw one with extrudes and revolves, or use Export " "2d View to export bare lines and curves." msgstr "" +"Вісутня об'ємна модель; створіть одну з допомогою екструдування та " +"виточування або скористайтеся функцією \"Експортувати 2D Вигляд\" для " +"еспорту лише ліній та кривих." #: export.cpp:61 msgid "" @@ -471,7 +475,7 @@ msgstr "" #: export.cpp:822 msgid "Active group mesh is empty; nothing to export." -msgstr "" +msgstr "Активна група не містить меш; немає чого експортувати." #: exportvector.cpp:337 msgid "freehand lines were replaced with continuous lines" @@ -485,11 +489,15 @@ msgstr "" msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" +"Деякі аспекти креслення на мають відповідників у форматі DXF і не будуть " +"експортовані:\n" #: exportvector.cpp:839 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" +"Розмір аркуша у PDF перевищує 200×200 дюймів; багато переглядачів можуть не " +"підтримувати цей файл." #: file.cpp:44 group.cpp:91 msgctxt "group-name" @@ -578,15 +586,15 @@ msgstr "Експортувати &Зображення..." #: graphicswin.cpp:49 msgid "Export 2d &View..." -msgstr "Експортувати 2d &Вигляд..." +msgstr "Експортувати 2D &Вигляд..." #: graphicswin.cpp:50 msgid "Export 2d &Section..." -msgstr "Експортувати 2d &Секцію..." +msgstr "Експортувати 2D &Секцію..." #: graphicswin.cpp:51 msgid "Export 3d &Wireframe..." -msgstr "Експортувати 3d &Скелет..." +msgstr "Експортувати 3D &Скелет..." #: graphicswin.cpp:52 msgid "Export Triangle &Mesh..." @@ -750,11 +758,11 @@ msgstr "&Нова Група" #: graphicswin.cpp:108 msgid "Sketch In &3d" -msgstr "Креслення в &3D" +msgstr "Креслення у &3D" #: graphicswin.cpp:109 msgid "Sketch In New &Workplane" -msgstr "Креслення в Новій &Площині" +msgstr "Креслення у Новій &Площині" #: graphicswin.cpp:111 msgid "Step &Translating" @@ -781,14 +789,12 @@ msgid "Re&volve" msgstr "&Обертати" #: graphicswin.cpp:119 -#, fuzzy msgid "Link / Assemble..." -msgstr "Приєднати / Монтувати..." +msgstr "Приєднати / Зібрати..." #: graphicswin.cpp:120 -#, fuzzy msgid "Link Recent" -msgstr "Приєднати Недавні" +msgstr "Приєднати Нещодавні" #: graphicswin.cpp:122 msgid "&Sketch" @@ -800,7 +806,7 @@ msgstr "У Робочій &Площині" #: graphicswin.cpp:124 msgid "Anywhere In &3d" -msgstr "Будь-де В &3D" +msgstr "Будь-де в &3D" #: graphicswin.cpp:126 msgid "Datum &Point" @@ -964,7 +970,7 @@ msgstr "Показати &Центр Масс" #: graphicswin.cpp:175 msgid "Show &Underconstrained Points" -msgstr "" +msgstr "Показати &Надмірно Обмежені Точки" #: graphicswin.cpp:177 msgid "&Trace Point" @@ -1066,39 +1072,39 @@ msgstr "" #: graphicswin.cpp:1283 msgid "click to place datum point" -msgstr "" +msgstr "клікніть для встановлення вихідної точки" #: graphicswin.cpp:1284 msgid "click first point of line segment" -msgstr "" +msgstr "клікніть першу точку прямої лінії" #: graphicswin.cpp:1286 msgid "click first point of construction line segment" -msgstr "" +msgstr "клікніть першу точку конструктивної прямої лінії" #: graphicswin.cpp:1287 msgid "click first point of cubic segment" -msgstr "" +msgstr "клікніть першу точку кривої" #: graphicswin.cpp:1288 msgid "click center of circle" -msgstr "" +msgstr "клікніть в місце де буде центр коментаря" #: graphicswin.cpp:1289 msgid "click origin of workplane" -msgstr "" +msgstr "клікніть в центр відліку площини" #: graphicswin.cpp:1290 msgid "click one corner of rectangle" -msgstr "" +msgstr "клікніть для встановлення першого кута прямокутника" #: graphicswin.cpp:1291 msgid "click top left of text" -msgstr "" +msgstr "клікніть для встановлення верхньої лівої межі тексту" #: graphicswin.cpp:1297 msgid "click top left of image" -msgstr "" +msgstr "клікніть для встановлення верхньої лівої межі зображення" #: graphicswin.cpp:1309 msgid "" @@ -1109,7 +1115,7 @@ msgstr "" #: group.cpp:86 msgctxt "group-name" msgid "sketch-in-3d" -msgstr "" +msgstr "ескіз-в-3D" #: group.cpp:142 msgid "" @@ -1126,11 +1132,13 @@ msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." msgstr "" +"Активуйте робочу площину ( Ескіз -> У Площині) перед екструдуванням. Ескіз " +"буде екструдовано перпендикулярно до робочої площини." #: group.cpp:163 msgctxt "group-name" msgid "extrude" -msgstr "" +msgstr "видавлювання" #: group.cpp:168 msgid "Lathe operation can only be applied to planar sketches." @@ -1148,7 +1156,7 @@ msgstr "" #: group.cpp:189 msgctxt "group-name" msgid "lathe" -msgstr "" +msgstr "проточування" #: group.cpp:194 msgid "Revolve operation can only be applied to planar sketches." @@ -1166,11 +1174,11 @@ msgstr "" #: group.cpp:217 msgctxt "group-name" msgid "revolve" -msgstr "" +msgstr "прокручування" #: group.cpp:222 msgid "Helix operation can only be applied to planar sketches." -msgstr "" +msgstr "Спіраль може бути створена лише на основі площинного ескізу." #: group.cpp:233 msgid "" @@ -1184,7 +1192,7 @@ msgstr "" #: group.cpp:245 msgctxt "group-name" msgid "helix" -msgstr "" +msgstr "спіраль" #: group.cpp:258 msgid "" @@ -1199,12 +1207,12 @@ msgstr "" #: group.cpp:271 msgctxt "group-name" msgid "rotate" -msgstr "" +msgstr "крутіння" #: group.cpp:282 msgctxt "group-name" msgid "translate" -msgstr "" +msgstr "перекладання" #: group.cpp:400 msgid "(unnamed)" @@ -1212,7 +1220,7 @@ msgstr "(безіменне)" #: groupmesh.cpp:709 msgid "not closed contour, or not all same style!" -msgstr "" +msgstr "не замкнений контур або не все в єдиному стилі!" #: groupmesh.cpp:722 msgid "points not all coplanar!" @@ -1220,7 +1228,7 @@ msgstr "" #: groupmesh.cpp:724 msgid "contour is self-intersecting!" -msgstr "" +msgstr "контур самоперетинається!" #: groupmesh.cpp:726 msgid "zero-length edge!" @@ -1308,6 +1316,7 @@ msgstr "Додати Точку Сплайну" #: mouse.cpp:690 msgid "Cannot add spline point: maximum number of points reached." msgstr "" +"Неможливо додати точку сплайна: перевищено максимальну кількість точок." #: mouse.cpp:715 msgid "Toggle Construction" @@ -1355,7 +1364,7 @@ msgstr "Умістити на Екрані" #: mouse.cpp:988 mouse.cpp:1275 msgid "click next point of line, or press Esc" -msgstr "" +msgstr "клікніть наступну точку лінії або натисніть Esc" #: mouse.cpp:994 msgid "" @@ -1365,11 +1374,11 @@ msgstr "" #: mouse.cpp:1028 msgid "click to place other corner of rectangle" -msgstr "" +msgstr "клікніть для встановлення іншого кута прямокутника" #: mouse.cpp:1048 msgid "click to set radius" -msgstr "" +msgstr "клікніть для визначення радіусу" #: mouse.cpp:1053 msgid "" @@ -1379,11 +1388,11 @@ msgstr "" #: mouse.cpp:1072 msgid "click to place point" -msgstr "" +msgstr "клікніть для встановлення точки" #: mouse.cpp:1088 msgid "click next point of cubic, or press Esc" -msgstr "" +msgstr "клікніть наступну точку кривої або натисніть Esc" #: mouse.cpp:1093 msgid "" @@ -1398,7 +1407,7 @@ msgstr "" #: mouse.cpp:1126 msgid "click to place bottom right of text" -msgstr "" +msgstr "клікніть для встановлення нижньої правої межі тексту" #: mouse.cpp:1132 msgid "" @@ -1418,7 +1427,7 @@ msgstr "SolveSpace модель" #: platform/gui.cpp:90 msgctxt "file-type" msgid "IDF circuit board" -msgstr "" +msgstr "IDF друкована плата" #: platform/gui.cpp:94 msgctxt "file-type" @@ -1438,12 +1447,12 @@ msgstr "Wavefront OBJ меш" #: platform/gui.cpp:100 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" -msgstr "" +msgstr "Three.js-сумісний меш, з переглядачем" #: platform/gui.cpp:101 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" -msgstr "" +msgstr "Three.js-сумісний меш, лише меш" #: platform/gui.cpp:102 msgctxt "file-type" @@ -1463,7 +1472,7 @@ msgstr "PDF файл" #: platform/gui.cpp:111 msgctxt "file-type" msgid "Encapsulated PostScript" -msgstr "" +msgstr "Encapsulated PostScript" #: platform/gui.cpp:112 msgctxt "file-type" @@ -1560,17 +1569,17 @@ msgstr "Файл Змінено" #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" -msgstr "" +msgstr "Чи хочете ви зберегти зміни зроблені вами у ескізі “%s”?" #: solvespace.cpp:562 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" -msgstr "" +msgstr "Чи хочете ви зберегти зміни зроблені вами у новому ескізі?" #: solvespace.cpp:565 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." -msgstr "" +msgstr "Ваші зміни буде втрачено якщо ви не збережете їх." #: solvespace.cpp:566 msgctxt "button" @@ -1608,24 +1617,24 @@ msgstr "" #: solvespace.cpp:778 msgid "Constraint must have a label, and must not be a reference dimension." -msgstr "" +msgstr "Обмежувач має містити мітку і бути не відносним розміром." #: solvespace.cpp:782 msgid "Bad selection for step dimension; select a constraint." -msgstr "" +msgstr "Поганий вибір для крокової зміни розміру; оберіть обмежувач." #: solvespace.cpp:806 msgid "The assembly does not interfere, good." msgstr "" #: solvespace.cpp:822 -#, fuzzy, c-format +#, c-format msgid "" "The volume of the solid model is:\n" "\n" " %s" msgstr "" -"Об'єм тіла:\n" +"Об'єм твердого тіла становить:\n" "\n" " %s" @@ -1637,6 +1646,10 @@ msgid "" "\n" " %s" msgstr "" +"\n" +"Об'єм поточної групи мешу становить:\n" +"\n" +" %s" #: solvespace.cpp:836 msgid "" @@ -1662,6 +1675,8 @@ msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" +"Ця група не місить коректно сформованого замкненої 2D площини. Вона " +"відкрита, не компланарна, або ж самоперетинається." #: solvespace.cpp:872 #, c-format @@ -1673,6 +1688,12 @@ msgid "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." msgstr "" +"Площа заповнення ескізу у цій групі становить:\n" +"\n" +" %s\n" +"\n" +"Криві наближено до ламаних ліній.\n" +"Це вносить похибку, зазвичай близько 1%%." #: solvespace.cpp:892 #, c-format @@ -1684,14 +1705,20 @@ msgid "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." msgstr "" +"Загальна довжина обраних елементів становить:\n" +"\n" +" %s\n" +"\n" +"Криві наближено до ламаних ліній.\n" +"Це вносить похибку, зазвичай близько 1%%." #: solvespace.cpp:898 msgid "Bad selection for perimeter; select line segments, arcs, and curves." -msgstr "" +msgstr "Поганий вибір для периметру; оберіть відрізки, дуги та криві." #: solvespace.cpp:914 msgid "Bad selection for trace; select a single point." -msgstr "" +msgstr "Поганий вибір для вістежування шляху; оберіть одну точку." #: solvespace.cpp:941 #, c-format @@ -1700,19 +1727,19 @@ msgstr "Неможливо записати у '%s'" #: solvespace.cpp:971 msgid "The mesh is self-intersecting (NOT okay, invalid)." -msgstr "" +msgstr "Меш самоперетинається (НЕ добре, недійсний)." #: solvespace.cpp:972 msgid "The mesh is not self-intersecting (okay, valid)." -msgstr "" +msgstr "Меш самоперетинається (добре, дійсний)." #: solvespace.cpp:974 msgid "The mesh has naked edges (NOT okay, invalid)." -msgstr "" +msgstr "Меш містить оголені ребра (НЕ добре, недійсний)." #: solvespace.cpp:975 msgid "The mesh is watertight (okay, valid)." -msgstr "" +msgstr "Меш водонепроникний (добре, дійсний)." #: solvespace.cpp:978 #, c-format @@ -1731,6 +1758,11 @@ msgid "" "\n" "Zero problematic edges, good.%s" msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"Відсутні проблемні ребра, добре.%s" #: solvespace.cpp:985 #, c-format @@ -1741,6 +1773,11 @@ msgid "" "\n" "%d problematic edges, bad.%s" msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d проблемних ребер, погано.%s" #: solvespace.cpp:998 #, c-format @@ -1758,12 +1795,26 @@ msgid "" "\n" "© 2008-%d Jonathan Westhues and other authors.\n" msgstr "" +"Це SolveSpace версії %s.\n" +"\n" +"Більше інформації на сайті http://solvespace.com/\n" +"\n" +"SolveSpace є вільною програмою: ви можете модифікувати\n" +"та/або розповсюджувати її відповідно до ліцензії GNU\n" +"General Public License (GPL) версії 3 чи новішої.\n" +"\n" +"ВІЧСУТНІ БУДЬ-ЯКІ ГАРАНТІЇ, в межах, доволених\n" +"законом. Деталі на сайті http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues та інші автори.\n" #: style.cpp:166 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." msgstr "" +"Неможливо призначити стиль елементу який походить від іншого елемента; " +"спробуйте призначити стиль батьківському елементу." #: style.cpp:665 msgid "Style name cannot be empty" @@ -1883,19 +1934,19 @@ msgstr "Перемкнути відносність розміру" #: toolbar.cpp:68 msgid "New group extruding active sketch" -msgstr "Нова група екструдування активного креслення" +msgstr "Нова група екструдування активного ескізу" #: toolbar.cpp:70 msgid "New group rotating active sketch" -msgstr "Нова група обертання актиного креслення" +msgstr "Нова група обертання актиного ескізу" #: toolbar.cpp:72 msgid "New group helix from active sketch" -msgstr "" +msgstr "Нова група спіралі з активного ескізу" #: toolbar.cpp:74 msgid "New group revolve active sketch" -msgstr "" +msgstr "Нова група обертання активного ескізу" #: toolbar.cpp:76 msgid "New group step and repeat rotating" @@ -1911,7 +1962,7 @@ msgstr "Нова група в новій площині (через обран #: toolbar.cpp:82 msgid "New group in 3d" -msgstr "Нова група в 3d" +msgstr "Нова група в 3D" #: toolbar.cpp:84 msgid "New group linking / assembling file" From e76bdb7d479e09128bde0ba767deaa5236f7cd42 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Sat, 17 Apr 2021 23:22:09 +0200 Subject: [PATCH 286/646] CI: Never skip cancel_previous_runs The if condition was nonsensical and did not serve any practical purpose; removing it allows the succeeding jobs to run in any case without additional code. --- .github/workflows/cd.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 22a5d1a7c..dde06b802 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -12,7 +12,6 @@ jobs: cancel_previous_runs: runs-on: ubuntu-latest name: Cancel Previous Runs - if: github.event_name == 'push' steps: - uses: styfle/cancel-workflow-action@0.8.0 with: @@ -22,7 +21,6 @@ jobs: needs: [cancel_previous_runs] runs-on: ubuntu-18.04 name: Test Ubuntu - if: "!cancelled()" steps: - uses: actions/checkout@v2 - name: Install Dependencies @@ -34,7 +32,6 @@ jobs: needs: [cancel_previous_runs] runs-on: windows-2019 name: Test Windows - if: "!cancelled()" steps: - uses: actions/checkout@v2 - name: Install Dependencies @@ -48,7 +45,6 @@ jobs: needs: [cancel_previous_runs] runs-on: macos-10.15 name: Test macOS - if: "!cancelled()" steps: - uses: actions/checkout@v2 - name: Install Dependencies From 3af6d7fa03817c236339840d3bb411e275b41ff9 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 21 Apr 2021 09:57:49 -0500 Subject: [PATCH 287/646] Add comment about asan warnings. --- src/platform/guigtk.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index e4bc3156c..94eb6b5e6 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -222,6 +222,10 @@ class TimerImplGtk final : public Timer { } return false; }; + // Note: asan warnings about new-delete-type-mismatch are false positives here: + // https://gitlab.gnome.org/GNOME/gtkmm/-/issues/65 + // Pass new_delete_type_mismatch=0 to ASAN_OPTIONS to disable those warnings. + // Unfortunately they won't go away until upgrading to gtkmm4 _connection = Glib::signal_timeout().connect(handler, milliseconds); } }; From 66ea57663b788e8a3e27bfff313298b46098ba12 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 21 Apr 2021 16:32:24 -0500 Subject: [PATCH 288/646] Install appstream metadata in flatpak and normal desktop Linux --- res/CMakeLists.txt | 14 +++ .../com.solvespace.SolveSpace.metainfo.xml.in | 87 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 res/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index 0f737a1e3..3bd63d8be 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -134,6 +134,13 @@ else() DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications RENAME com.solvespace.SolveSpace.desktop) + set(DESKTOP_FILE_NAME com.solvespace.SolveSpace.desktop) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in + ${CMAKE_CURRENT_BINARY_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo) + install(FILES freedesktop/solvespace-flatpak-mime.xml DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/mime/packages RENAME com.solvespace.SolveSpace-slvs.xml) @@ -176,6 +183,13 @@ else() install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freedesktop/solvespace.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) + set(DESKTOP_FILE_NAME solvespace.desktop) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in + ${CMAKE_CURRENT_BINARY_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo) + install(FILES freedesktop/solvespace-mime.xml DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/mime/packages RENAME solvespace-slvs.xml) diff --git a/res/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in b/res/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in new file mode 100644 index 000000000..3e88165bd --- /dev/null +++ b/res/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in @@ -0,0 +1,87 @@ + + + com.solvespace.SolveSpace + + SolveSpace +

A free (GPLv3) parametric 3d CAD tool + + CC0-1.0 + GPL-3.0-or-later + ryan_AT_ryanpavlik.com + + + Graphics + 3DGraphics + Engineering + + +

+ SolveSpace is a free (GPLv3) parametric 3d CAD tool. Applications include: +

+
    +
  • Modeling 3d parts — draw with extrudes, revolves, and Boolean operations
  • +
  • Modeling 2d parts — draw the part as a single section, and export; use 3d assembly to verify fit
  • +
  • Modeling 3d-printed parts — export the STL or other triangle mesh expected by most slicers
  • +
  • Preparing 2D CAM data — export 2d vector art for a waterjet machine or laser cutter
  • +
  • Mechanism design — use the constraint solver to simulate planar or spatial linkages
  • +
  • Plane and solid geometry — replace hand-solved trigonometry with a live dimensioned drawing
  • +
+
+ https://solvespace.com + https://github.com/solvespace/solvespace/issues + + @DESKTOP_FILE_NAME@ + + application/x-solvespace + + + + + + + +

Major new stable release. Includes new intersection boolean operation, + new types of groups, solid model suppression, usability improvements + (especially regarding redundant constraints and automatic constraints), + and more. Also includes performance and scalability improvements.

+
+ https://github.com/solvespace/solvespace/releases/tag/v3.0 +
+ + + +

Second release candidate for the 3.0 stable release.

+
+ https://github.com/solvespace/solvespace/releases/tag/v3.0.rc2 +
+ + + +

First release candidate for the 3.0 stable release.

+
+ https://github.com/solvespace/solvespace/releases/tag/v3.0.rc1 +
+ + + +

Bug-fix release in the 2.x series, fixing some crashes.

+
+ https://github.com/solvespace/solvespace/releases/tag/v2.3 +
+ + + +

Bug-fix release, including performance improvements.

+
+ https://github.com/solvespace/solvespace/releases/tag/v2.2 +
+ + + +

Introduced *nix compatibility, internationalization, technical drawing mode, improved import and export, and other features and fixes.

+
+ https://github.com/solvespace/solvespace/releases/tag/v2.1 +
+
+ + From 7a6a8d1dc4a9af4c3fb777dc0de08b15677cead3 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 21 Apr 2021 16:34:22 -0500 Subject: [PATCH 289/646] Add more categories to the desktop files. --- res/freedesktop/solvespace-flatpak.desktop.in | 2 +- res/freedesktop/solvespace-snap.desktop | 2 +- res/freedesktop/solvespace.desktop.in | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/res/freedesktop/solvespace-flatpak.desktop.in b/res/freedesktop/solvespace-flatpak.desktop.in index b16ccf44e..c80b67ad6 100644 --- a/res/freedesktop/solvespace-flatpak.desktop.in +++ b/res/freedesktop/solvespace-flatpak.desktop.in @@ -6,5 +6,5 @@ Exec=${CMAKE_INSTALL_FULL_BINDIR}/solvespace MimeType=application/x-solvespace Icon=com.solvespace.SolveSpace Type=Application -Categories=Graphics +Categories=Graphics;3DGraphics;Engineering; Keywords=parametric;cad;2d;3d; diff --git a/res/freedesktop/solvespace-snap.desktop b/res/freedesktop/solvespace-snap.desktop index 8441258c9..da0dda13a 100644 --- a/res/freedesktop/solvespace-snap.desktop +++ b/res/freedesktop/solvespace-snap.desktop @@ -6,5 +6,5 @@ Exec=solvespace MimeType=application/x-solvespace Icon=${SNAP}/meta/icons/hicolor/scalable/apps/snap.solvespace.svg Type=Application -Categories=Graphics +Categories=Graphics;3DGraphics;Engineering; Keywords=parametric;cad;2d;3d; diff --git a/res/freedesktop/solvespace.desktop.in b/res/freedesktop/solvespace.desktop.in index 8c6fb24a9..87e6863c9 100644 --- a/res/freedesktop/solvespace.desktop.in +++ b/res/freedesktop/solvespace.desktop.in @@ -6,5 +6,5 @@ Exec=${CMAKE_INSTALL_FULL_BINDIR}/solvespace MimeType=application/x-solvespace Icon=solvespace Type=Application -Categories=Graphics +Categories=Graphics;3DGraphics;Engineering; Keywords=parametric;cad;2d;3d; From 87011affc1033aa06fc2cdae2528a3dfc45c1403 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 21 Apr 2021 16:34:55 -0500 Subject: [PATCH 290/646] Update flatpak manifest --- pkg/flatpak/com.solvespace.SolveSpace.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index 8c4ce5137..fe03179f0 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -125,8 +125,8 @@ "name": "SolveSpace", "sources": [ { - "type": "git", - "path": "/home/whitequark/Projects/solvespace" + "type": "dir", + "path": "../.." } ], "buildsystem": "cmake", From e0759f5fb31438ad477baca2491e90c1581615e3 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 22 Apr 2021 13:17:49 -0500 Subject: [PATCH 291/646] Update flatpak manifest more. --- pkg/flatpak/com.solvespace.SolveSpace.json | 53 +++++++++++++--------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index fe03179f0..8f55fa848 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -1,19 +1,29 @@ { "app-id": "com.solvespace.SolveSpace", - "runtime": "org.gnome.Platform", - "runtime-version": "3.30", - "sdk": "org.gnome.Sdk", + "runtime": "org.freedesktop.Platform", + "runtime-version": "20.08", + "sdk": "org.freedesktop.Sdk", "finish-args": [ /* Access to display server and OpenGL */ - "--share=ipc", "--socket=fallback-x11", "--socket=wayland", "--device=dri", + "--share=ipc", + "--socket=fallback-x11", + "--socket=wayland", + "--device=dri", /* Access to save files */ "--filesystem=home" ], "cleanup": [ - "/include", "/lib/*/include", - "*.a", "*.la", "*.m4", "/lib/libslvs*.so*", "/lib/libglibmm_generate_extra_defs*.so*", - "/share/pkgconfig", "*.pc", - "/share/man", "/share/doc", + "/include", + "/lib/*/include", + "*.a", + "*.la", + "*.m4", + "/lib/libslvs*.so*", + "/lib/libglibmm_generate_extra_defs*.so*", + "/share/pkgconfig", + "*.pc", + "/share/man", + "/share/doc", "/share/aclocal", /* mm-common junk */ "/bin/mm-common-prepare", @@ -26,8 +36,8 @@ "sources": [ { "type": "archive", - "url": "http://ftp.gnome.org/pub/GNOME/sources/mm-common/0.9/mm-common-0.9.12.tar.xz", - "sha256": "ceffdcce1e5b52742884c233ec604bf6fded12eea9da077ce7a62c02c87e7c0b" + "url": "https://download.gnome.org/sources/mm-common/1.0/mm-common-1.0.2.tar.xz", + "sha256": "a2a99f3fa943cf662f189163ed39a2cfc19a428d906dd4f92b387d3659d1641d" } ] }, @@ -39,21 +49,20 @@ "sources": [ { "type": "archive", - "url": "http://ftp.gnome.org/pub/GNOME/sources/libsigc++/2.10/libsigc++-2.10.1.tar.xz", - "sha256": "c9a25f26178c6cbb147f9904d8c533b5a5c5111a41ac2eb781eb734eea446003" + "url": "https://download.gnome.org/sources/libsigc++/2.10/libsigc%2B%2B-2.10.6.tar.xz", + "sha256": "dda176dc4681bda9d5a2ac1bc55273bdd381662b7a6d49e918267d13e8774e1b" } ] }, { "name": "glibmm", - "config-opts": [ - "--disable-documentation" - ], + "config-opts": [], + "buildsystem": "meson", "sources": [ { "type": "archive", - "url": "http://ftp.gnome.org/pub/GNOME/sources/glibmm/2.58/glibmm-2.58.1.tar.xz", - "sha256": "6e5fe03bdf1e220eeffd543e017fd2fb15bcec9235f0ffd50674aff9362a85f0" + "url": "https://download.gnome.org/sources/glibmm/2.64/glibmm-2.64.5.tar.xz", + "sha256": "508fc86e2c9141198aa16c225b16fd6b911917c0d3817602652844d0973ea386" } ] }, @@ -98,14 +107,13 @@ }, { "name": "gtkmm", - "config-opts": [ - "--disable-documentation" - ], + "config-opts": [], + "buildsystem": "meson", "sources": [ { "type": "archive", - "url": "http://ftp.gnome.org/pub/GNOME/sources/gtkmm/3.24/gtkmm-3.24.1.tar.xz", - "sha256": "ddfe42ed2458a20a34de252854bcf4b52d3f0c671c045f56b42aa27c7542d2fd" + "url": "https://download.gnome.org/sources/gtkmm/3.24/gtkmm-3.24.4.tar.xz", + "sha256": "9beb71c3e90cfcfb790396b51e3f5e7169966751efd4f3ef9697114be3be6743" } ] }, @@ -113,6 +121,7 @@ "name": "libjson-c", "sources": [ { + /* 0.15-nodoc doesn't build */ "type": "archive", "url": "https://s3.amazonaws.com/json-c_releases/releases/json-c-0.13.1-nodoc.tar.gz", "sha256": "94a26340c0785fcff4f46ff38609cf84ebcd670df0c8efd75d039cc951d80132" From 662d78c2123c9f95c2fa42be0fa9b4cd44af293a Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 23 Apr 2021 14:29:22 +0300 Subject: [PATCH 292/646] Final Update of Changelog for 3.0 (#1025) * Final Update of Changelog for 3.0 * Fix markdownlint warnings on CHANGELOG.md * Remove Q3D mention from 3.0 release changelog. Co-authored-by: Ryan Pavlik --- CHANGELOG.md | 474 ++++++++++++++++++++++++++------------------------- 1 file changed, 244 insertions(+), 230 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f70812eca..c6d0fe701 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,280 +5,294 @@ Changelog --- New sketch features: - * New intersection boolean operation for solid models. - * New groups, revolution and helical extrusion. - * Extrude, lathe, translate and rotate groups can use the "assembly" - boolean operation, to increase performance. - * The solid model of extrude and lathe groups can be suppressed, - for splitting a single model in multiple parts to export, - or if only the generated entities are desired, without the mesh. - * Translate and rotate groups can create n-dimensional arrays using - the "difference" and "assembly" boolean operations. - * A new sketch in workplane group can be created based on existing workplane. - * TTF text request has two additional points on the right side, which allow - constraining the width of text. - * Image requests can now be created, similar to TTF text requests. - This replaces the "style → background image" feature. - * Irrelevant points (e.g. arc center point) are not counted when estimating - the bounding box used to compute chord tolerance. - * When adding a constraint which has a label and is redundant with another - constraint, the constraint is added as a reference, avoiding an error. - * Datum points can be copied and pasted. - * "Split Curves at Intersection" can now split curves at point lying on curve, - not just at intersection of two curves. - * Property browser now shows amount of degrees of freedom in group list. - It also shows a yellow "err" if the sketch has problems (e.g. self - intersecting) that would propagate in subsequent groups. - * It is now possible to press "g" to toggle construction on new objects while - they are still being drawn. + +* New intersection boolean operation for solid models. +* New groups, revolution and helical extrusion. +* Extrude, lathe, translate and rotate groups can use the "assembly" + boolean operation, to increase performance. +* The solid model of extrude and lathe groups can be suppressed, + for splitting a single model in multiple parts to export, + or if only the generated entities are desired, without the mesh. +* Translate and rotate groups can create n-dimensional arrays using + the "difference" and "assembly" boolean operations. +* A new sketch in workplane group can be created based on existing workplane. +* TTF text request has two additional points on the right side, which allow + constraining the width of text. +* Image requests can now be created, similar to TTF text requests. + This replaces the "style → background image" feature. +* Irrelevant points (e.g. arc center point) are not counted when estimating + the bounding box used to compute chord tolerance. +* When adding a constraint which has a label and is redundant with another + constraint, the constraint is added as a reference, avoiding an error. +* Datum points can be copied and pasted. +* "Split Curves at Intersection" can now split curves at point lying on curve, + not just at intersection of two curves. +* Property browser now shows amount of degrees of freedom in group list. + It also shows a yellow "err" if the sketch has problems (e.g. self + intersecting) that would propagate in subsequent groups. +* It is now possible to press "g" to toggle construction on new objects while + they are still being drawn. +* Allow right click to end sketching of all entities. New constraint features: - * When dragging an arc or rectangle point, it will be automatically - constrained to other points with a click. - * When selecting a constraint, the requests it constraints can be selected - in the text window. - * When selecting an entity, the constraints applied to it can be selected - in the text window. - * Distance constraint labels can now be formatted to use SI prefixes. - Values are edited in the configured unit regardless of label format. - * When creating a constraint, if an exactly identical constraint already - exists, it is now selected instead of adding a redundant constraint. - * It is now possible to turn off automatic creation of horizontal/vertical - constraints on line segments. - * Automatic creation of constraints no longer happens if the constraint - would have been redundant with other ones. - * New option to open the constraint editor for newly created constraints - with a value. - * New "redundant constraint timeout (in ms)" option to prevent UI freeze - when looking for redundant constraints. - * Swap vertical and horizontal constraints when pasting rotated by 90/270 - degrees. + +* When dragging an arc or rectangle point, it will be automatically + constrained to other points with a click. +* When selecting a constraint, the requests it constraints can be selected + in the text window. +* When selecting an entity, the constraints applied to it can be selected + in the text window. +* Distance constraint labels can now be formatted to use SI prefixes. + Values are edited in the configured unit regardless of label format. +* When creating a constraint, if an exactly identical constraint already + exists, it is now selected instead of adding a redundant constraint. +* It is now possible to turn off automatic creation of horizontal/vertical + constraints on line segments. +* Automatic creation of constraints no longer happens if the constraint + would have been redundant with other ones. +* New option to open the constraint editor for newly created constraints + with a value. +* New "redundant constraint timeout (in ms)" option to prevent UI freeze + when looking for redundant constraints. +* Swap vertical and horizontal constraints when pasting rotated by 90/270 + degrees. New export/import features: - * Link IDF circuit boards in an assembly (.emn files) - * Three.js: allow configuring projection for exported model, and initially - use the current viewport projection. - * Wavefront OBJ: a material file is exported alongside the model, containing - mesh color information. - * DXF/DWG: 3D DXF files are imported as construction entities, in 3d. - * [ADDED 2019-02-25](https://github.com/solvespace/solvespace/pull/384) and [REMOVED 2020-11-13](https://github.com/solvespace/solvespace/issues/795): - Q3D: [Q3D](https://github.com/q3k/q3d/) triangle meshes can now be - exported. This format allows to easily hack on triangle mesh data created - in SolveSpace, supports colour information and is more space efficient than - most other formats. - * VRML (WRL) triangle meshes can now be exported, useful for e.g. [KiCAD](http://kicad.org). - * Export 2d section: custom styled entities that lie in the same - plane as the exported section are included. - * Added ExportBackgroundColor in configuration for EPS, PDF, and SVG files. - * STEP export includes object colors and transparency. + +* Link IDF circuit boards in an assembly (.emn files) +* Three.js: allow configuring projection for exported model, and initially + use the current viewport projection. +* Wavefront OBJ: a material file is exported alongside the model, containing + mesh color information. +* DXF/DWG: 3D DXF files are imported as construction entities, in 3d. +* VRML (WRL) triangle meshes can now be exported, useful for e.g. [KiCAD](http://kicad.org). +* Export 2d section: custom styled entities that lie in the same + plane as the exported section are included. +* Added ExportBackgroundColor in configuration for EPS, PDF, and SVG files. +* STEP export includes object colors and transparency. +* Default "line styles" have a new "export these objects" option. New rendering features: - * The "Show/hide hidden lines" button is now a tri-state button that allows - showing all lines (on top of shaded mesh), stippling occluded lines - or not drawing them at all. - * The "Show/hide outlines" button is now independent from "Show/hide edges". - * "View | Darken Inactive Solids" added. When turned off and a "sketch in plane" - group is active solids form previous groups will not be "darkened" (have the - s000d-#def-dim-solid style applied to them). + +* The "Show/hide hidden lines" button is now a tri-state button that allows + showing all lines (on top of shaded mesh), stippling occluded lines + or not drawing them at all. +* The "Show/hide outlines" button is now independent from "Show/hide edges". +* "View | Darken Inactive Solids" added. When turned off and a "sketch in plane" + group is active solids form previous groups will not be "darkened" (have the + s000d-#def-dim-solid style applied to them). New measurement/analysis features: - * New choice for base unit, meters. - * New command for measuring total length of selected entities, - "Analyze → Measure Perimeter". - * New command for measuring center of mass, with live updates as the sketch - changes, "Analyze → Center of Mass". - * New option for displaying areas of closed contours. - * When calculating volume of the mesh, volume of the solid from the current - group is now shown alongside total volume of all solids. - * When calculating area, and faces are selected, calculate area of those faces - instead of the closed contour in the sketch. - * When selecting a point and a line, projected distance to current - workplane is displayed. + +* New choice for base unit, meters. +* New command for measuring total length of selected entities, + "Analyze → Measure Perimeter". +* New command for measuring center of mass, with live updates as the sketch + changes, "Analyze → Center of Mass". +* New option for displaying areas of closed contours. +* When calculating volume of the mesh, volume of the solid from the current + group is now shown alongside total volume of all solids. +* When calculating area, and faces are selected, calculate area of those faces + instead of the closed contour in the sketch. +* When selecting a point and a line, projected distance to current + workplane is displayed. Other new features: - * Improvements to the text window for selected entities and constraints. - * Ambient light source added in text window to allow flat shaded renderings. - * New command-line interface, for batch exporting and more. - * The graphical interface now supports HiDPI screens on every OS. - * New option to lock Z axis to be always vertical, like in SketchUp. - * New button to hide all construction entities. - * New link to match the on-screen size of the sketch with its actual size, - "view → set to full scale". - * When zooming to fit, constraints are also considered. - * Ctrl-clicking entities now deselects them, as the inverse of clicking. - * When clicking on an entity that shares a place with other entities, - the entity from the current group is selected. - * When dragging an entity that shares a place with other entities, - the entity from a request is selected. For example, dragging a point on - a face of an extrusion coincident with the source sketch plane will - drag the point from the source sketch. - * The default font for TTF text is now Bitstream Vera Sans, which is - included in the resources such that it is available on any OS. - * In expressions, numbers can contain the digit group separator, "_". - * The "=" key is bound to "Zoom In", like "+" key. - * The numpad decimal separator key is bound to "." regardless of locale. - * On Windows, full-screen mode is implemented. - * On Linux, native file chooser dialog can be used. - * New edit menu items "Line Styles", "View Projection" and "Configuration" - that are shortcuts to the respective configuration screens. - * New cmake build options using -DENABLE_OPENMP=yes and -DENABLE_LTO=yes - to enable support for multi-threading and link-time optimization. - * "Shift+Scroll" for ten times finer zoom. - * Chinese translation + +* Improvements to the text window for selected entities and constraints. +* Ambient light source added in text window to allow flat shaded renderings. +* New command-line interface, for batch exporting and more. +* The graphical interface now supports HiDPI screens on every OS. +* New option to lock Z axis to be always vertical, like in SketchUp. +* New button to hide all construction entities. +* New link to match the on-screen size of the sketch with its actual size, + "view → set to full scale". +* When zooming to fit, constraints are also considered. +* Ctrl-clicking entities now deselects them, as the inverse of clicking. +* When clicking on an entity that shares a place with other entities, + the entity from the current group is selected. +* When dragging an entity that shares a place with other entities, + the entity from a request is selected. For example, dragging a point on + a face of an extrusion coincident with the source sketch plane will + drag the point from the source sketch. +* The default font for TTF text is now Bitstream Vera Sans, which is + included in the resources such that it is available on any OS. +* In expressions, numbers can contain the digit group separator, "_". +* The "=" key is bound to "Zoom In", like "+" key. +* The numpad decimal separator key is bound to "." regardless of locale. +* On Windows, full-screen mode is implemented. +* On Linux, native file chooser dialog can be used. +* New edit menu items "Line Styles", "View Projection" and "Configuration" + that are shortcuts to the respective configuration screens. +* New cmake build options using -DENABLE_OPENMP=yes and -DENABLE_LTO=yes + to enable support for multi-threading and link-time optimization. +* "Shift+Scroll" for ten times finer zoom. +* Translations: Chinese, French, German, Russian, Turkish, Ukrainian. Bugs fixed: - * Fixed broken --view options for command line thumbnail image creation. - * Some errors in Triangulation of surfaces. - * Some NURNS boolean operations that failed particularly on surfaces - created with Lathe, Revolve, or Helix. - * Segfault in Remove Spline Point context menu. - * A point in 3d constrained to any line whose length is free no longer - causes the line length to collapse. - * Curve-line constraints (in 3d), parallel constraints (in 3d), and - same orientation constraints are more robust. - * Adding some constraints (vertical, midpoint, etc) twice errors out - immediately, instead of later and in a confusing way. - * Constraining a newly placed point to a hovered entity does not cause - spurious changes in the sketch. - * Points highlighted with "Analyze → Show Degrees of Freedom" are drawn - on top of all other geometry. - * A step rotate/translate group using a group forced to triangle mesh - as a source group also gets forced to triangle mesh. - * Paste Transformed with a negative scale does not invert arcs. - * The tangent arc now modifies the original entities instead of deleting - them, such that their constraints are retained. - * When linking a sketch file, missing custom styles are now imported from - the linked file. - * 3Dconnexion SpaceMouse should now work (on Windows and macOS X). - * Improved NURBS boolean operations on curved surfaces in some cases. - * Show only usable fonts in the font selector. + +* Fixed broken --view options for command line thumbnail image creation. +* Some errors in Triangulation of surfaces. +* Some NURNS boolean operations that failed particularly on surfaces + created with Lathe, Revolve, or Helix. +* Segfault in Remove Spline Point context menu. +* A point in 3d constrained to any line whose length is free no longer + causes the line length to collapse. +* Curve-line constraints (in 3d), parallel constraints (in 3d), and + same orientation constraints are more robust. +* Adding some constraints (vertical, midpoint, etc) twice errors out + immediately, instead of later and in a confusing way. +* Constraining a newly placed point to a hovered entity does not cause + spurious changes in the sketch. +* Points highlighted with "Analyze → Show Degrees of Freedom" are drawn + on top of all other geometry. +* A step rotate/translate group using a group forced to triangle mesh + as a source group also gets forced to triangle mesh. +* Paste Transformed with a negative scale does not invert arcs. +* The tangent arc now modifies the original entities instead of deleting + them, such that their constraints are retained. +* When linking a sketch file, missing custom styles are now imported from + the linked file. +* 3Dconnexion SpaceMouse should now work (on Windows and macOS X). +* Improved NURBS boolean operations on curved surfaces in some cases. +* Show only usable fonts in the font selector. 2.x --- Bug fixes: - * Do not crash when changing an unconstrained lathe group between - union and difference modes. + +* Do not crash when changing an unconstrained lathe group between + union and difference modes. 2.3 --- Bug fixes: - * Do not crash when applying a symmetry constraint to two points. - * Fix TTF font metrics again (properly this time). - * Fix the "draw back faces in red" option. - * Fix export of wireframe as 3D DXF. - * Various minor crashes. + +* Do not crash when applying a symmetry constraint to two points. +* Fix TTF font metrics again (properly this time). +* Fix the "draw back faces in red" option. +* Fix export of wireframe as 3D DXF. +* Various minor crashes. 2.2 --- Other new features: - * OS X: support 3Dconnexion devices (SpaceMouse, SpaceNavigator, etc). - * GTK: files with uppercase extensions can be opened. + +* OS X: support 3Dconnexion devices (SpaceMouse, SpaceNavigator, etc). +* GTK: files with uppercase extensions can be opened. Bug fixes: - * Do not remove autosaves after successfully opening a file, preventing - data loss in case of two abnormal terminations in a row. - * Do not crash when changing autosave interval. - * Unbreak the "Show degrees of freedom" command. - * Three.js: correctly respond to controls when browser zoom is used. - * OS X: do not completely hide main window when defocused. - * GTK: unbreak 3Dconnexion support. - * When pasting transformed entities, multiply constraint values by scale. - * Fix TTF font metrics (restore the behavior from version 2.0). - * Forcibly show the current group once we start a drawing operation. - * DXF export: always declare layers before using them. - * Do not truncate operations on selections to first 32 selected entities. - * Translate and rotate groups inherit the "suppress solid model" setting. - * DXF: files with paths containing non-ASCII or spaces can be exported - or imported. - * Significantly improved performance when dragging an entity. - * Various crashes and minor glitches. + +* Do not remove autosaves after successfully opening a file, preventing + data loss in case of two abnormal terminations in a row. +* Do not crash when changing autosave interval. +* Unbreak the "Show degrees of freedom" command. +* Three.js: correctly respond to controls when browser zoom is used. +* OS X: do not completely hide main window when defocused. +* GTK: unbreak 3Dconnexion support. +* When pasting transformed entities, multiply constraint values by scale. +* Fix TTF font metrics (restore the behavior from version 2.0). +* Forcibly show the current group once we start a drawing operation. +* DXF export: always declare layers before using them. +* Do not truncate operations on selections to first 32 selected entities. +* Translate and rotate groups inherit the "suppress solid model" setting. +* DXF: files with paths containing non-ASCII or spaces can be exported + or imported. +* Significantly improved performance when dragging an entity. +* Various crashes and minor glitches. 2.1 --- New sketch features: - * Lathe groups create circle and face entities. - * New toolbar button for creating lathe groups. - * Chord tolerance is separated into two: display chord tolerance (specified - in percents, relative to model bounding box), and export chord tolerance - (specified in millimeters as absolute value). - * Bezier spline points can be added and removed after the spline is created. - * When an unconstrained extrusion is switched between "union" and - "difference", its normal is flipped. - * Groups can be added in the middle of the stack. Note that this results - in files incompatible with version 2.0. - * Active group can be removed. - * Removing an imported group does not cause all subsequent groups to also - be removed. - * When a new group with a solid is created, the color is taken from - a previous group with a solid, if any. - * Entities in a newly active group do not become visible. - * When entities are selected, "Zoom to fit" zooms to fit only these - entities and not the entire sketch. - * Zero-length edges are reported with a "zero-length error", not - "points not all coplanar". + +* Lathe groups create circle and face entities. +* New toolbar button for creating lathe groups. +* Chord tolerance is separated into two: display chord tolerance (specified + in percents, relative to model bounding box), and export chord tolerance + (specified in millimeters as absolute value). +* Bezier spline points can be added and removed after the spline is created. +* When an unconstrained extrusion is switched between "union" and + "difference", its normal is flipped. +* Groups can be added in the middle of the stack. Note that this results + in files incompatible with version 2.0. +* Active group can be removed. +* Removing an imported group does not cause all subsequent groups to also + be removed. +* When a new group with a solid is created, the color is taken from + a previous group with a solid, if any. +* Entities in a newly active group do not become visible. +* When entities are selected, "Zoom to fit" zooms to fit only these + entities and not the entire sketch. +* Zero-length edges are reported with a "zero-length error", not + "points not all coplanar". New constraint features: - * Height of the font used for drawing constraint labels can be changed. - * New constraint, length difference, placed with J. - (Patch by Peter Ruevski) - * Horizontal/vertical constraints are automatically added if a line segment - is close enough to being horizontal/vertical. This can be disabled by - holding Ctrl. - * Reference dimensions and angles can be placed with Shift+D and Shift+N. - * Copying and pasting entities duplicates any constraints that only involve - entities in the clipboard, as well as selected comments. - * Diameter constraints can be shown as radius. - * The "pi" identifier can be used in expressions. - * Constraint labels can be snapped to grid. - * Integer angles are displayed without trailing zeroes. - * Angle constraints have proper reference lines and arrowheads. - * Extension lines are drawn for point-line distance constraints. + +* Height of the font used for drawing constraint labels can be changed. +* New constraint, length difference, placed with J. + (Patch by Peter Ruevski) +* Horizontal/vertical constraints are automatically added if a line segment + is close enough to being horizontal/vertical. This can be disabled by + holding Ctrl. +* Reference dimensions and angles can be placed with Shift+D and Shift+N. +* Copying and pasting entities duplicates any constraints that only involve + entities in the clipboard, as well as selected comments. +* Diameter constraints can be shown as radius. +* The "pi" identifier can be used in expressions. +* Constraint labels can be snapped to grid. +* Integer angles are displayed without trailing zeroes. +* Angle constraints have proper reference lines and arrowheads. +* Extension lines are drawn for point-line distance constraints. New solver features: - * Sketches with redundant and unsolvable constraints are distinguished. - * New group setting, "allow redundant constraints". Note that it makes - the solver less stable. + +* Sketches with redundant and unsolvable constraints are distinguished. +* New group setting, "allow redundant constraints". Note that it makes + the solver less stable. New rendering and styling features: - * New line style parameter: stippling, based on ISO 128. - * Outlines of solids can be drawn in a particular style (by default, thick - lines) controlled by the "Show outline of solid model" button. - * Occluded edges can be drawn in a particular style (by default, stippled - with short dashes) controlled by the "Show hidden lines" button. - * Solids can be made transparent. + +* New line style parameter: stippling, based on ISO 128. +* Outlines of solids can be drawn in a particular style (by default, thick + lines) controlled by the "Show outline of solid model" button. +* Occluded edges can be drawn in a particular style (by default, stippled + with short dashes) controlled by the "Show hidden lines" button. +* Solids can be made transparent. New export/import features: - * The old "import" command (for .slvs files) is renamed to "link". - * If a linked .slvs file is not found, first the relative path recorded - in the .slvs file is checked and then the absolute path; this is - an inversion of the previously used order. If it is still not found, - a dialog appears offering to locate it. - * DXF and DWG files can be imported, with point-coincident, horizontal and - vertical constraints automatically inferred from geometry, and distance - and angle constraints created when a dimension placed against geometry - exists. - * Triangle mesh can be exported for viewing in the browser through WebGL. - * Export dialogs remember the last file format used, and preselect it. - * Exported DXF files have exact circles, arcs and splines instead of - a piecewise linear approximation (unless hidden line removal was needed). - * Exported DXF files preserve color and line thickness. - * In exported DXF files, constraints are represented as DXF dimensions, - instead of piecewise linear geometry. - * When exporting 2d views, overlapping lines are removed. + +* The old "import" command (for .slvs files) is renamed to "link". +* If a linked .slvs file is not found, first the relative path recorded + in the .slvs file is checked and then the absolute path; this is + an inversion of the previously used order. If it is still not found, + a dialog appears offering to locate it. +* DXF and DWG files can be imported, with point-coincident, horizontal and + vertical constraints automatically inferred from geometry, and distance + and angle constraints created when a dimension placed against geometry + exists. +* Triangle mesh can be exported for viewing in the browser through WebGL. +* Export dialogs remember the last file format used, and preselect it. +* Exported DXF files have exact circles, arcs and splines instead of + a piecewise linear approximation (unless hidden line removal was needed). +* Exported DXF files preserve color and line thickness. +* In exported DXF files, constraints are represented as DXF dimensions, + instead of piecewise linear geometry. +* When exporting 2d views, overlapping lines are removed. Other new features: - * Native Linux (GTK 2 and GTK 3) and Mac OS X ports. - * Automatically save and then restore sketches if SolveSpace crashes. - (Patch by Marc Britten) - * Unicode is supported everywhere (filenames, group names, TTF text, - comments), although RTL scripts and scripts making heavy use of ligatures - are not rendered correctly. - * The vector font is grid-fitted when rendered on screen to make it easier - to read regardless of its size. + +* Native Linux (GTK 2 and GTK 3) and Mac OS X ports. +* Automatically save and then restore sketches if SolveSpace crashes. + (Patch by Marc Britten) +* Unicode is supported everywhere (filenames, group names, TTF text, + comments), although RTL scripts and scripts making heavy use of ligatures + are not rendered correctly. +* The vector font is grid-fitted when rendered on screen to make it easier + to read regardless of its size. 2.0 --- From 65e09037ded85d23543242b311e30d44953a8d0c Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 23 Apr 2021 16:07:51 +0300 Subject: [PATCH 293/646] Remove reference to SketchUp in the changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c6d0fe701..c21b5d9a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -103,7 +103,8 @@ Other new features: * Ambient light source added in text window to allow flat shaded renderings. * New command-line interface, for batch exporting and more. * The graphical interface now supports HiDPI screens on every OS. -* New option to lock Z axis to be always vertical, like in SketchUp. +* New option to lock Z axis to be always vertical when rotating the view, + a.k.a. "turntable navigation". * New button to hide all construction entities. * New link to match the on-screen size of the sketch with its actual size, "view → set to full scale". From bdac8dc8eaa8aa6f6c019244885b7f40ebbce179 Mon Sep 17 00:00:00 2001 From: robnee Date: Sun, 25 Apr 2021 09:24:35 -0400 Subject: [PATCH 294/646] Fix lookup of stipple pattern before config is available Fix a bug with the lookup of stipple pattern for default styles when the config settings are not yet available (install/upgrade/first run). This caused hidden lines to display as continuous rather than dashed. --- src/sketch.h | 1 + src/style.cpp | 12 ++++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/sketch.h b/src/sketch.h index bda0a983c..74111d18c 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -924,6 +924,7 @@ class Style { static double StippleScale(hStyle hs); static double StippleScaleMm(hStyle hs); static std::string StipplePatternName(hStyle hs); + static std::string StipplePatternName(StipplePattern stippleType); static StipplePattern StipplePatternFromString(std::string name); std::string DescriptionString() const; diff --git a/src/style.cpp b/src/style.cpp index b4ed841e4..b1070cdc0 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -114,7 +114,8 @@ void Style::FillDefaultStyle(Style *s, const Default *d, bool factory) { s->stippleType = (factory) ? d->stippleType : Style::StipplePatternFromString( - settings->ThawString(CnfStippleType(d->cnfPrefix), "")); + settings->ThawString(CnfStippleType(d->cnfPrefix), + StipplePatternName(d->stippleType))); s->stippleScale = (factory) ? 15.0 : settings->ThawFloat(CnfStippleScale(d->cnfPrefix), 15.0); @@ -397,7 +398,11 @@ StipplePattern Style::PatternType(hStyle hs) { std::string Style::StipplePatternName(hStyle hs) { Style *s = Get(hs); - switch(s->stippleType) { + return StipplePatternName(s->stippleType); +} + +std::string Style::StipplePatternName(StipplePattern stippleType) { + switch(stippleType) { case StipplePattern::CONTINUOUS: return "Continuous"; case StipplePattern::SHORT_DASH: return "ShortDash"; case StipplePattern::DASH: return "Dash"; @@ -409,10 +414,9 @@ std::string Style::StipplePatternName(hStyle hs) { case StipplePattern::ZIGZAG: return "ZigZag"; } - return "CONTINUOUS"; + return "Continuous"; } - double Style::StippleScale(hStyle hs) { Style *s = Get(hs); return s->stippleScale; From 87d2386259c1bbee12a4fdf27459e8872ab6b10d Mon Sep 17 00:00:00 2001 From: robnee Date: Sun, 11 Apr 2021 10:04:28 -0400 Subject: [PATCH 295/646] Update property browser display live when dragging Keep items in selected state while dragging so that property browser will track them until the left mouse button is released. Also, trigger a property browser update on mouse move while dragging to make the display "live" --- src/mouse.cpp | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/mouse.cpp b/src/mouse.cpp index b8a191f77..e46acae82 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -10,6 +10,8 @@ void GraphicsWindow::UpdateDraggedPoint(hEntity hp, double mx, double my) { Vector pos = p->PointGetNum(); UpdateDraggedNum(&pos, mx, my); p->PointForceTo(pos); + + SS.ScheduleShowTW(); } void GraphicsWindow::UpdateDraggedNum(Vector *pos, double mx, double my) { @@ -188,32 +190,23 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, hEntity dragEntity = ChooseFromHoverToDrag().entity; if(dragEntity.v) e = SK.GetEntity(dragEntity); if(e && e->type != Entity::Type::WORKPLANE) { - Entity *e = SK.GetEntity(dragEntity); + if(!hoverWasSelectedOnMousedown) { + // The user clicked an unselected entity, which + // means they're dragging just the hovered thing, + // not the full selection. So clear all the selection + // except that entity. + ClearSelection(); + MakeSelected(dragEntity); + } if(e->type == Entity::Type::CIRCLE && selection.n <= 1) { // Drag the radius. - ClearSelection(); pending.circle = dragEntity; pending.operation = Pending::DRAGGING_RADIUS; } else if(e->IsNormal()) { - ClearSelection(); pending.normal = dragEntity; pending.operation = Pending::DRAGGING_NORMAL; } else { - if(!hoverWasSelectedOnMousedown) { - // The user clicked an unselected entity, which - // means they're dragging just the hovered thing, - // not the full selection. So clear all the selection - // except that entity. - ClearSelection(); - MakeSelected(e->h); - } StartDraggingBySelection(); - if(!hoverWasSelectedOnMousedown) { - // And then clear the selection again, since they - // probably didn't want that selected if they just - // were dragging it. - ClearSelection(); - } hover.Clear(); pending.operation = Pending::DRAGGING_POINTS; } @@ -425,6 +418,7 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, SK.GetEntity(circle->distance)->DistanceForceTo(r); SS.MarkGroupDirtyByEntity(pending.circle); + SS.ScheduleShowTW(); break; } @@ -1311,15 +1305,20 @@ void GraphicsWindow::MouseLeftDown(double mx, double my, bool shiftDown, bool ct void GraphicsWindow::MouseLeftUp(double mx, double my, bool shiftDown, bool ctrlDown) { orig.mouseDown = false; - hoverWasSelectedOnMousedown = false; switch(pending.operation) { case Pending::DRAGGING_POINTS: - SS.extraLine.draw = false; - // fall through case Pending::DRAGGING_CONSTRAINT: case Pending::DRAGGING_NORMAL: case Pending::DRAGGING_RADIUS: + if(!hoverWasSelectedOnMousedown) { + // And then clear the selection again, since they + // probably didn't want that selected if they just + // were dragging it. + ClearSelection(); + } + hoverWasSelectedOnMousedown = false; + SS.extraLine.draw = false; ClearPending(); Invalidate(); break; From 0a95824335c494292fcf70b2692ef7ae3102ea2e Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 11 May 2021 11:03:16 +0300 Subject: [PATCH 296/646] Allow comments to be associated with point entities If a single point is selected when a "Constrain | Comment" (`;`) is added then the comment is associated with the point and its position becomes relative to the point. In this way the comment will move with the point. If nothing is selected or more than a single point is selected then the behaviour is as before and the comment is "floating". Closes #1032 --- src/constraint.cpp | 17 +++++++++++++---- src/drawconstraint.cpp | 9 +++++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/constraint.cpp b/src/constraint.cpp index 435fc3acb..c1da398d5 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -767,10 +767,19 @@ void Constraint::MenuConstrain(Command id) { break; case Command::COMMENT: - SS.GW.pending.operation = GraphicsWindow::Pending::COMMAND; - SS.GW.pending.command = Command::COMMENT; - SS.GW.pending.description = _("click center of comment text"); - SS.ScheduleShowTW(); + if(gs.points == 1 && gs.n == 1) { + c.type = Type::COMMENT; + c.ptA = gs.point[0]; + c.group = SS.GW.activeGroup; + c.workplane = SS.GW.ActiveWorkplane(); + c.comment = _("NEW COMMENT -- DOUBLE-CLICK TO EDIT"); + AddConstraint(&c); + } else { + SS.GW.pending.operation = GraphicsWindow::Pending::COMMAND; + SS.GW.pending.command = Command::COMMENT; + SS.GW.pending.description = _("click center of comment text"); + SS.ScheduleShowTW(); + } break; default: ssassert(false, "Unexpected menu ID"); diff --git a/src/drawconstraint.cpp b/src/drawconstraint.cpp index 2cdb9afce..d6a6f3fbb 100644 --- a/src/drawconstraint.cpp +++ b/src/drawconstraint.cpp @@ -1189,8 +1189,13 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } hcs = canvas->GetStroke(stroke); } - DoLabel(canvas, hcs, disp.offset, labelPos, u, v); - if(refs) refs->push_back(disp.offset); + Vector ref = disp.offset; + if(ptA.v) { + Vector a = SK.GetEntity(ptA)->PointGetNum(); + ref = a.Plus(disp.offset); + } + DoLabel(canvas, hcs, ref, labelPos, u, v); + if(refs) refs->push_back(ref); return; } } From 4d8249c02df0bc698399b0bd4ebcad3ea0dc99f3 Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 31 Mar 2021 01:29:05 +0300 Subject: [PATCH 297/646] IdList: Optimize IdList by Using an Index and Add a Proper Iterator - Use `std::vector elemstore` to store elements. Avoids manual memory management. - Add and index (`std::vector elemidx`) that avoids moving large objects when adding elements. - Add a free element list (`std::vector freelist`) that speeds up element removal by avoiding rearranging the element storage. It also avoids reallocations when adding elements later. - Add a proper iterator. It will be used to remove NextAfter - which is a performance bottleneck. --- src/dsc.h | 288 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 189 insertions(+), 99 deletions(-) diff --git a/src/dsc.h b/src/dsc.h index 34190e620..f4a7933c9 100644 --- a/src/dsc.h +++ b/src/dsc.h @@ -10,6 +10,7 @@ #include "solvespace.h" #include +#include /// Trait indicating which types are handle types and should get the associated operators. /// Specialize for each handle type and inherit from std::true_type. @@ -371,15 +372,28 @@ class List { } }; +template class IdList; + // Comparison functor used by IdList and related classes template struct CompareId { - bool operator()(T const& lhs, T const& rhs) const { - return lhs.h.v < rhs.h.v; + + CompareId(const IdList *list) { + idlist = list; + } + + bool operator()(int lhs, T const& rhs) const { + return idlist->elemstore[lhs].h.v < rhs.h.v; + } + bool operator()(int lhs, H rhs) const { + return idlist->elemstore[lhs].h.v < rhs.v; } - bool operator()(T const& lhs, H rhs) const { - return lhs.h.v < rhs.v; + bool operator()(T *lhs, int rhs) const { + return lhs->h.v < idlist->elemstore[rhs].h.v; } + +private: + const IdList *idlist; }; // A list, where each element has an integer identifier. The list is kept @@ -387,21 +401,87 @@ struct CompareId { // id. template class IdList { - T *elem = nullptr; - int elemsAllocated = 0; + std::vector elemstore; + std::vector elemidx; + std::vector freelist; public: - int n = 0; + int n = 0; // PAR@@@@@ make this private to see all interesting and suspicious places in SoveSpace ;-) + friend struct CompareId; using Compare = CompareId; - bool IsEmpty() const { - return n == 0; - } + struct iterator { + typedef std::random_access_iterator_tag iterator_category; + typedef T value_type; + typedef int difference_type; + typedef T *pointer; + typedef T &reference; - void AllocForOneMore() { - if(n >= elemsAllocated) { - ReserveMore((elemsAllocated + 32)*2 - n); + public: + T &operator*() const noexcept { return *elem; } + const T *operator->() const noexcept { return elem; } + + T &operator=(const T &e) const noexcept { + *elem = e; + return *this; } + T &operator=(const H h) const noexcept { + elem->h = e; + return *this; + } + + bool operator==(const iterator &p) const { return p.position == position; } + bool operator<(const iterator &p) const { return position < p.position; } + bool operator!=(const iterator &p) const { return !operator==(p); } + bool operator>(const iterator &p) const { return operator!=(p) && !operator<(p); } + bool operator>=(const iterator &p) const { return !operator<(p); } + bool operator<=(const iterator &p) const { return !operator>(p); } + + iterator &operator++() { + ++position; + if(position >= (int)list->elemidx.size()) { + elem = nullptr; // PAR@@@@ Remove just debugging + } else if(0 <= position) { + elem = &(list->elemstore[list->elemidx[position]]); + } + return *this; + } + iterator &operator--() { + --position; + if(0 > position) { + elem = nullptr; // PAR@@@@ Remove just debugging + } else if(position < list->elemidx.size()) { + elem = &(list->elemstore[list->elemidx[position]]); + } + return *this; + } + + iterator(IdList *l) : list(l), position(0) { + if(list) { + if(list->elemstore.size() && list->elemidx.size()) { + elem = &(list->elemstore[list->elemidx[position]]); + } + } + }; + iterator(const iterator &iter) + : list(iter.list), position(iter.position), elem(iter.elem){}; + iterator(IdList *l, int pos) : list(l), position(pos) { + if(position >= (int)list->elemidx.size()) { + elem = nullptr; + } else if(0 <= position) { + elem = &((list->elemstore)[list->elemidx[position]]); + } + }; + + private: + int position; + T *elem; + IdList *list; + }; + + + bool IsEmpty() const { + return n == 0; } uint32_t MaximumId() { @@ -414,75 +494,65 @@ class IdList { H AddAndAssignId(T *t) { t->h.v = (MaximumId() + 1); - AllocForOneMore(); - // Copy-construct at the end of the list. - new(&elem[n]) T(*t); + // Add at the end of the list. + elemstore.push_back(*t); + elemidx.push_back(elemstore.size()-1); ++n; return t->h; } - T * LowerBound(T const& t) { - if(IsEmpty()) { - return nullptr; - } - auto it = std::lower_bound(begin(), end(), t, Compare()); - return it; - } - - T * LowerBound(H const& h) { - if(IsEmpty()) { - return nullptr; - } - auto it = std::lower_bound(begin(), end(), h, Compare()); - return it; - } - int LowerBoundIndex(T const& t) { if(IsEmpty()) { return 0; } - auto it = LowerBound(t); - auto idx = std::distance(begin(), it); + auto it = std::lower_bound(elemptr.begin(), elemptr.end(), t, Compare(this)); + auto idx = std::distance(elemidx.begin(), it); auto i = static_cast(idx); return i; } + void ReserveMore(int howMuch) { - if(n + howMuch > elemsAllocated) { - elemsAllocated = n + howMuch; - T *newElem = (T *)::operator new[]((size_t)elemsAllocated*sizeof(T)); - for(int i = 0; i < n; i++) { - new(&newElem[i]) T(std::move(elem[i])); - elem[i].~T(); - } - ::operator delete[](elem); - elem = newElem; - } + elemstore.reserve(n + howMuch); + elemidx.reserve(n + howMuch); +// freelist.reserve(n + howMuch); // PAR@@@@ maybe we should - not much more RAM } void Add(T *t) { - AllocForOneMore(); - // Look to see if we already have something with the same handle value. ssassert(FindByIdNoOops(t->h) == nullptr, "Handle isn't unique"); // Find out where the added element should be. - int pos = LowerBoundIndex(*t); - - // Shift everything from there to the end of the array. - new(&elem[n]) T(); - for (int i = n; i > pos; i--) - elem[i] = std::move(elem[i - 1]); + auto pos = std::lower_bound(elemidx.begin(), elemidx.end(), *t, Compare(this)); + + if(freelist.empty()) { // Add a new element to the store + elemstore.push_back(*t); + // Insert a pointer to the element at the correct position + if(elemidx.empty()) { + // The list is empty so pos, begin and end are all null. + // insert does not work in this case. + elemidx.push_back(elemstore.size()-1); + } else { + elemidx.insert(pos, elemstore.size() - 1); + } + } else { // Use the last element from the freelist + // Insert an index to the element at the correct position + elemidx.insert(pos, freelist.back()); + // Remove the element from the freelist + freelist.pop_back(); + + // Copy-construct to the element storage. + elemstore[*pos] = T(*t); + // *elemptr[pos] = *t; // PAR@@@@@@ maybe this? + } - // Copy-construct at the right place. - elem[pos] = T(*t); ++n; } T *FindById(H h) { T *t = FindByIdNoOops(h); - ssassert(t != NULL, "Cannot find handle"); + ssassert(t != nullptr, "Cannot find handle"); return t; } @@ -490,51 +560,63 @@ class IdList { if(IsEmpty()) { return -1; } - auto it = LowerBound(h); - auto idx = std::distance(begin(), it); - if (idx < n) { - return idx; + auto it = std::lower_bound(elemidx.begin(), elemidx.end(), h, Compare(this)); + if(it == elemidx.end()) { + return -1; + } else { + auto idx = std::distance(elemidx.begin(), it); + return static_cast(idx); } - return -1; } T *FindByIdNoOops(H h) { if(IsEmpty()) { return nullptr; } - auto it = LowerBound(h); - if (it == nullptr || it == end()) { + auto it = std::lower_bound(elemidx.begin(), elemidx.end(), h, Compare(this)); + if(it == elemidx.end()) { return nullptr; + } else { + if(elemstore[*it].h.v != h.v) { + return nullptr; + } + return &elemstore[*it]; } - if (it->h.v == h.v) { - return it; - } - return nullptr; } T *First() { - return (IsEmpty()) ? NULL : &(elem[0]); + return (IsEmpty()) ? nullptr : &(elemstore[0]); } T *Last() { - return (IsEmpty()) ? NULL : &(elem[n-1]); + return (IsEmpty()) ? nullptr : &(elemstore[elemidx.back()]); } + + // Remove this entirely?!? 199 places in the code mostly for loops? T *NextAfter(T *prev) { - if(IsEmpty() || !prev) return NULL; - if(prev - First() == (n - 1)) return NULL; - return prev + 1; + if(IsEmpty() || !prev) { + return nullptr; + } + + // PAR@@@@ This is slower than before now. O(log(n)) was O(1) + auto it = std::upper_bound(elemidx.begin(), elemidx.end(), prev, Compare(this)); + if(it == elemidx.end()) { + return nullptr; + } else { + return &elemstore[*it]; + } } - T &Get(size_t i) { return elem[i]; } - T const &Get(size_t i) const { return elem[i]; } + T &Get(size_t i) { return elemstore[elemidx[i]]; } + T const &Get(size_t i) const { return elemstore[elemidx[i]]; } T &operator[](size_t i) { return Get(i); } T const &operator[](size_t i) const { return Get(i); } - T *begin() { return IsEmpty() ? nullptr : &elem[0]; } - T *end() { return IsEmpty() ? nullptr : &elem[0] + n; } - const T *begin() const { return IsEmpty() ? nullptr : &elem[0]; } - const T *end() const { return IsEmpty() ? nullptr : &elem[0] + n; } - const T *cbegin() const { return begin(); } - const T *cend() const { return end(); } + iterator begin() { return IsEmpty() ? nullptr : iterator(this); } + iterator end() { return IsEmpty() ? nullptr : iterator(this, elemidx.size()); } + const iterator begin() const { return IsEmpty() ? nullptr : iterator(this); } + const iterator end() const { return IsEmpty() ? nullptr : iterator(this, elemidx.size()); } + const iterator cbegin() const { return begin(); } + const iterator cend() const { return end(); } void ClearTags() { for(auto &elt : *this) { elt.tag = 0; } @@ -551,22 +633,23 @@ class IdList { int src, dest; dest = 0; for(src = 0; src < n; src++) { - if(elem[src].tag) { + if(elemstore[elemidx[src]].tag) { // this item should be deleted - elem[src].Clear(); + elemstore[elemidx[src]].Clear(); +// elemstore[elemidx[src]].~T(); // Clear below calls the destructors + freelist.push_back(elemidx[src]); + elemidx[src] = 0xDEADBEEF; // PAR@@@@@ just for debugging, not needed, remove later } else { if(src != dest) { - elem[dest] = elem[src]; + elemidx[dest] = elemidx[src]; } dest++; } } - for(int i = dest; i < n; i++) - elem[i].~T(); n = dest; - // and elemsAllocated is untouched, because we didn't resize + elemidx.resize(n); // Clear left over elements at the end. } - void RemoveById(H h) { + void RemoveById(H h) { // PAR@@@@@ this can be optimized ClearTags(); FindById(h)->tag = 1; RemoveTagged(); @@ -574,28 +657,35 @@ class IdList { void MoveSelfInto(IdList *l) { l->Clear(); - std::swap(l->elem, elem); - std::swap(l->elemsAllocated, elemsAllocated); + std::swap(l->elemstore, elemstore); + std::swap(l->elemidx, elemidx); + std::swap(l->freelist, freelist); std::swap(l->n, n); } void DeepCopyInto(IdList *l) { l->Clear(); - l->elem = (T *)::operator new[](elemsAllocated * sizeof(elem[0])); - for(int i = 0; i < n; i++) - new(&l->elem[i]) T(elem[i]); - l->elemsAllocated = elemsAllocated; - l->n = n; + + for(auto const &it : elemstore) { + l->elemstore.push_back(it); + } + + for(auto const &it : elemidx) { + l->elemidx.push_back(it); + } + + l->n = n; } void Clear() { - for(int i = 0; i < n; i++) { - elem[i].Clear(); - elem[i].~T(); + for(auto &it : elemidx) { + elemstore[it].Clear(); +// elemstore[it].~T(); // clear below calls the destructors } - if(elem) ::operator delete[](elem); - elem = NULL; - elemsAllocated = n = 0; + freelist.clear(); + elemidx.clear(); + elemstore.clear(); + n = 0; } }; From 8c6d91337caa28a44da2beea1588b0773e4d7b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Eric=20Janouch?= Date: Sat, 3 Apr 2021 19:07:53 +0200 Subject: [PATCH 298/646] Use Range-based for Loops Instead of NextAfter for all IdList Objects Based on commit '3b395bb5a7' by pjanx Resolves a performance regression of iteration being O(n * log n) rather than O(n). --- src/clipboard.cpp | 19 ++++++------- src/draw.cpp | 17 ++++++----- src/exportstep.cpp | 11 ++++---- src/exportvector.cpp | 57 +++++++++++++++++++------------------ src/file.cpp | 30 ++++++++++---------- src/graphicswin.cpp | 50 +++++++++++++++------------------ src/groupmesh.cpp | 20 ++++++------- src/modify.cpp | 48 +++++++++++++++----------------- src/mouse.cpp | 18 ++++++------ src/srf/boolean.cpp | 65 ++++++++++++++++++++----------------------- src/srf/merge.cpp | 7 ++--- src/srf/raycast.cpp | 34 +++++++++++----------- src/srf/surface.cpp | 32 +++++++++------------ src/srf/surfinter.cpp | 34 +++++++++++----------- src/style.cpp | 9 +++--- 15 files changed, 210 insertions(+), 241 deletions(-) diff --git a/src/clipboard.cpp b/src/clipboard.cpp index d43ec4582..962650088 100644 --- a/src/clipboard.cpp +++ b/src/clipboard.cpp @@ -138,18 +138,17 @@ void GraphicsWindow::CopySelection() { } } - Constraint *c; - for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) { - if(!SS.clipboard.ContainsEntity(c->ptA) || - !SS.clipboard.ContainsEntity(c->ptB) || - !SS.clipboard.ContainsEntity(c->entityA) || - !SS.clipboard.ContainsEntity(c->entityB) || - !SS.clipboard.ContainsEntity(c->entityC) || - !SS.clipboard.ContainsEntity(c->entityD) || - c->type == Constraint::Type::COMMENT) { + for(Constraint &c : SK.constraint) { + if(!SS.clipboard.ContainsEntity(c.ptA) || + !SS.clipboard.ContainsEntity(c.ptB) || + !SS.clipboard.ContainsEntity(c.entityA) || + !SS.clipboard.ContainsEntity(c.entityB) || + !SS.clipboard.ContainsEntity(c.entityC) || + !SS.clipboard.ContainsEntity(c.entityD) || + c.type == Constraint::Type::COMMENT) { continue; } - SS.clipboard.c.Add(c); + SS.clipboard.c.Add(&c); } } diff --git a/src/draw.cpp b/src/draw.cpp index ccaeb961d..3610f2018 100644 --- a/src/draw.cpp +++ b/src/draw.cpp @@ -210,16 +210,15 @@ void GraphicsWindow::SelectByMarquee() { BBox marqueeBBox = BBox::From(Vector::From(marqueePoint.x, marqueePoint.y, VERY_NEGATIVE), Vector::From(orig.mouse.x, orig.mouse.y, VERY_POSITIVE)); - Entity *e; - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(e->group != SS.GW.activeGroup) continue; - if(e->IsFace() || e->IsDistance()) continue; - if(!e->IsVisible()) continue; + for(Entity &e : SK.entity) { + if(e.group != SS.GW.activeGroup) continue; + if(e.IsFace() || e.IsDistance()) continue; + if(!e.IsVisible()) continue; bool entityHasBBox; - BBox entityBBox = e->GetOrGenerateScreenBBox(&entityHasBBox); + BBox entityBBox = e.GetOrGenerateScreenBBox(&entityHasBBox); if(entityHasBBox && entityBBox.Overlaps(marqueeBBox)) { - MakeSelected(e->h); + MakeSelected(e.h); } } } @@ -412,8 +411,8 @@ void GraphicsWindow::HitTestMakeSelection(Point2d mp) { cached.projRight = projRight; cached.projUp = projUp; cached.scale = scale; - for(Entity *e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - e->screenBBoxValid = false; + for(Entity &e : SK.entity) { + e.screenBBoxValid = false; } } diff --git a/src/exportstep.cpp b/src/exportstep.cpp index db42dc085..5bfa57f67 100644 --- a/src/exportstep.cpp +++ b/src/exportstep.cpp @@ -353,22 +353,21 @@ void StepFileWriter::ExportSurfacesTo(const Platform::Path &filename) { advancedFaces = {}; - SSurface *ss; - for(ss = shell->surface.First(); ss; ss = shell->surface.NextAfter(ss)) { - if(ss->trim.IsEmpty()) + for(SSurface &ss : shell->surface) { + if(ss.trim.IsEmpty()) continue; // Get all of the loops of Beziers that trim our surface (with each // Bezier split so that we use the section as t goes from 0 to 1), and // the piecewise linearization of those loops in xyz space. SBezierList sbl = {}; - ss->MakeSectionEdgesInto(shell, NULL, &sbl); + ss.MakeSectionEdgesInto(shell, NULL, &sbl); // Apply the export scale factor. - ss->ScaleSelfBy(1.0/SS.exportScale); + ss.ScaleSelfBy(1.0/SS.exportScale); sbl.ScaleSelfBy(1.0/SS.exportScale); - ExportSurface(ss, &sbl); + ExportSurface(&ss, &sbl); sbl.Clear(); } diff --git a/src/exportvector.cpp b/src/exportvector.cpp index 977309976..5a3c5d36f 100644 --- a/src/exportvector.cpp +++ b/src/exportvector.cpp @@ -170,22 +170,21 @@ class DxfWriteInterface : public DRW_Interface { } if(writer->constraint) { - Constraint *c; - for(c = writer->constraint->First(); c; c = writer->constraint->NextAfter(c)) { - if(!writer->NeedToOutput(c)) continue; - switch(c->type) { + for(Constraint &c : *writer->constraint) { + if(!writer->NeedToOutput(&c)) continue; + switch(c.type) { case Constraint::Type::PT_PT_DISTANCE: { - Vector ap = SK.GetEntity(c->ptA)->PointGetNum(); - Vector bp = SK.GetEntity(c->ptB)->PointGetNum(); - Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(c->disp.offset); + Vector ap = SK.GetEntity(c.ptA)->PointGetNum(); + Vector bp = SK.GetEntity(c.ptB)->PointGetNum(); + Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(c.disp.offset); writeAlignedDimension(xfrm(ap), xfrm(bp), xfrm(ref), - xfrm(ref), c->Label(), c->GetStyle(), c->valA); + xfrm(ref), c.Label(), c.GetStyle(), c.valA); break; } case Constraint::Type::PT_LINE_DISTANCE: { - Vector pt = SK.GetEntity(c->ptA)->PointGetNum(); - Entity *line = SK.GetEntity(c->entityA); + Vector pt = SK.GetEntity(c.ptA)->PointGetNum(); + Entity *line = SK.GetEntity(c.entityA); Vector lA = SK.GetEntity(line->point[0])->PointGetNum(); Vector lB = SK.GetEntity(line->point[1])->PointGetNum(); Vector dl = lB.Minus(lA); @@ -194,7 +193,7 @@ class DxfWriteInterface : public DRW_Interface { if(pt.Equals(closest)) break; - Vector ref = ((closest.Plus(pt)).ScaledBy(0.5)).Plus(c->disp.offset); + Vector ref = ((closest.Plus(pt)).ScaledBy(0.5)).Plus(c.disp.offset); Vector refClosest = ref.ClosestPointOnLine(lA, dl); double ddl = dl.Dot(dl); @@ -209,54 +208,54 @@ class DxfWriteInterface : public DRW_Interface { Vector xdl = xfrm(lB).Minus(xfrm(lA)); writeLinearDimension(xfrm(pt), xfrm(refClosest), xfrm(ref), - xfrm(ref), c->Label(), + xfrm(ref), c.Label(), atan2(xdl.y, xdl.x) / PI * 180.0 + 90.0, 0.0, - c->GetStyle(), c->valA); + c.GetStyle(), c.valA); break; } case Constraint::Type::DIAMETER: { - Entity *circle = SK.GetEntity(c->entityA); + Entity *circle = SK.GetEntity(c.entityA); Vector center = SK.GetEntity(circle->point[0])->PointGetNum(); Quaternion q = SK.GetEntity(circle->normal)->NormalGetNum(); Vector n = q.RotationN().WithMagnitude(1); double r = circle->CircleGetRadiusNum(); - Vector ref = center.Plus(c->disp.offset); + Vector ref = center.Plus(c.disp.offset); // Force the label into the same plane as the circle. ref = ref.Minus(n.ScaledBy(n.Dot(ref) - n.Dot(center))); Vector rad = ref.Minus(center).WithMagnitude(r); - if(/*isRadius*/c->other) { + if(/*isRadius*/c.other) { writeRadialDimension( xfrm(center), xfrm(center.Plus(rad)), - xfrm(ref), c->Label(), c->GetStyle(), c->valA); + xfrm(ref), c.Label(), c.GetStyle(), c.valA); } else { writeDiametricDimension( xfrm(center.Minus(rad)), xfrm(center.Plus(rad)), - xfrm(ref), c->Label(), c->GetStyle(), c->valA); + xfrm(ref), c.Label(), c.GetStyle(), c.valA); } break; } case Constraint::Type::ANGLE: { - Entity *a = SK.GetEntity(c->entityA); - Entity *b = SK.GetEntity(c->entityB); + Entity *a = SK.GetEntity(c.entityA); + Entity *b = SK.GetEntity(c.entityB); Vector a0 = a->VectorGetStartPoint(); Vector b0 = b->VectorGetStartPoint(); Vector da = a->VectorGetNum(); Vector db = b->VectorGetNum(); - if(/*otherAngle*/c->other) { + if(/*otherAngle*/c.other) { a0 = a0.Plus(da); da = da.ScaledBy(-1); } bool skew = false; - Vector ref = c->disp.offset; + Vector ref = c.disp.offset; Vector pi = Vector::AtIntersectionOfLines(a0, a0.Plus(da), b0, b0.Plus(db), &skew); - if(!skew) ref = pi.Plus(c->disp.offset); + if(!skew) ref = pi.Plus(c.disp.offset); Vector norm = da.Cross(db); Vector dna = norm.Cross(da).WithMagnitude(1.0); @@ -277,7 +276,7 @@ class DxfWriteInterface : public DRW_Interface { Vector bisect = da.WithMagnitude(1.0).ScaledBy(cos(thetaf / 2.0)).Plus( dna.ScaledBy(sin(thetaf / 2.0))); - ref = pi.Plus(bisect.WithMagnitude(c->disp.offset.Magnitude())); + ref = pi.Plus(bisect.WithMagnitude(c.disp.offset.Magnitude())); // Get lines again to write exact line. a0 = a->VectorGetStartPoint(); @@ -287,15 +286,15 @@ class DxfWriteInterface : public DRW_Interface { writeAngularDimension( xfrm(a0), xfrm(a0.Plus(da)), xfrm(b0), xfrm(b0.Plus(db)), xfrm(ref), - xfrm(ref), c->Label(), c->GetStyle(), c->valA); + xfrm(ref), c.Label(), c.GetStyle(), c.valA); break; } case Constraint::Type::COMMENT: { - Style *st = SK.style.FindById(c->GetStyle()); - writeText(xfrm(c->disp.offset), c->Label(), - Style::TextHeight(c->GetStyle()) / SS.GW.scale, - st->textAngle, st->textOrigin, c->GetStyle()); + Style *st = SK.style.FindById(c.GetStyle()); + writeText(xfrm(c.disp.offset), c.Label(), + Style::TextHeight(c.GetStyle()) / SS.GW.scale, + st->textAngle, st->textOrigin, c.GetStyle()); break; } diff --git a/src/file.cpp b/src/file.cpp index 160b5ec7b..4e3b50d38 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -354,19 +354,18 @@ bool SolveSpaceUI::SaveToFile(const Platform::Path &filename) { } SShell *s = &g->runningShell; - SSurface *srf; - for(srf = s->surface.First(); srf; srf = s->surface.NextAfter(srf)) { + for(SSurface &srf : s->surface) { fprintf(fh, "Surface %08x %08x %08x %d %d\n", - srf->h.v, srf->color.ToPackedInt(), srf->face, srf->degm, srf->degn); - for(i = 0; i <= srf->degm; i++) { - for(j = 0; j <= srf->degn; j++) { + srf.h.v, srf.color.ToPackedInt(), srf.face, srf.degm, srf.degn); + for(i = 0; i <= srf.degm; i++) { + for(j = 0; j <= srf.degn; j++) { fprintf(fh, "SCtrl %d %d %.20f %.20f %.20f Weight %20.20f\n", - i, j, CO(srf->ctrl[i][j]), srf->weight[i][j]); + i, j, CO(srf.ctrl[i][j]), srf.weight[i][j]); } } STrimBy *stb; - for(stb = srf->trim.First(); stb; stb = srf->trim.NextAfter(stb)) { + for(stb = srf.trim.First(); stb; stb = srf.trim.NextAfter(stb)) { fprintf(fh, "TrimBy %08x %d %.20f %.20f %.20f %.20f %.20f %.20f\n", stb->curve.v, stb->backwards ? 1 : 0, CO(stb->start), CO(stb->finish)); @@ -374,21 +373,20 @@ bool SolveSpaceUI::SaveToFile(const Platform::Path &filename) { fprintf(fh, "AddSurface\n"); } - SCurve *sc; - for(sc = s->curve.First(); sc; sc = s->curve.NextAfter(sc)) { + for(SCurve &sc : s->curve) { fprintf(fh, "Curve %08x %d %d %08x %08x\n", - sc->h.v, - sc->isExact ? 1 : 0, sc->exact.deg, - sc->surfA.v, sc->surfB.v); + sc.h.v, + sc.isExact ? 1 : 0, sc.exact.deg, + sc.surfA.v, sc.surfB.v); - if(sc->isExact) { - for(i = 0; i <= sc->exact.deg; i++) { + if(sc.isExact) { + for(i = 0; i <= sc.exact.deg; i++) { fprintf(fh, "CCtrl %d %.20f %.20f %.20f Weight %.20f\n", - i, CO(sc->exact.ctrl[i]), sc->exact.weight[i]); + i, CO(sc.exact.ctrl[i]), sc.exact.weight[i]); } } SCurvePt *scpt; - for(scpt = sc->pts.First(); scpt; scpt = sc->pts.NextAfter(scpt)) { + for(scpt = sc.pts.First(); scpt; scpt = sc.pts.NextAfter(scpt)) { fprintf(fh, "CurvePt %d %.20f %.20f %.20f\n", scpt->vertex ? 1 : 0, CO(scpt->p)); } diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 8427fa1e9..5422a5796 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -968,20 +968,19 @@ void GraphicsWindow::ForceTextWindowShown() { } void GraphicsWindow::DeleteTaggedRequests() { - Request *r; // Delete any requests that were affected by this deletion. - for(r = SK.request.First(); r; r = SK.request.NextAfter(r)) { - if(r->workplane == Entity::FREE_IN_3D) continue; - if(!r->workplane.isFromRequest()) continue; - Request *wrkpl = SK.GetRequest(r->workplane.request()); + for(Request &r : SK.request) { + if(r.workplane == Entity::FREE_IN_3D) continue; + if(!r.workplane.isFromRequest()) continue; + Request *wrkpl = SK.GetRequest(r.workplane.request()); if(wrkpl->tag) - r->tag = 1; + r.tag = 1; } // Rewrite any point-coincident constraints that were affected by this // deletion. - for(r = SK.request.First(); r; r = SK.request.NextAfter(r)) { - if(!r->tag) continue; - FixConstraintsForRequestBeingDeleted(r->h); + for(Request &r : SK.request) { + if(!r.tag) continue; + FixConstraintsForRequestBeingDeleted(r.h); } // and then delete the tagged requests. SK.request.RemoveTagged(); @@ -1045,9 +1044,8 @@ void GraphicsWindow::MenuEdit(Command id) { SS.centerOfMass.draw = false; // This clears the marks drawn to indicate which points are // still free to drag. - Param *p; - for(p = SK.param.First(); p; p = SK.param.NextAfter(p)) { - p->free = false; + for(Param &p : SK.param) { + p.free = false; } if(SS.exportMode) { SS.exportMode = false; @@ -1057,13 +1055,12 @@ void GraphicsWindow::MenuEdit(Command id) { break; case Command::SELECT_ALL: { - Entity *e; - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(e->group != SS.GW.activeGroup) continue; - if(e->IsFace() || e->IsDistance()) continue; - if(!e->IsVisible()) continue; + for(Entity &e : SK.entity) { + if(e.group != SS.GW.activeGroup) continue; + if(e.IsFace() || e.IsDistance()) continue; + if(!e.IsVisible()) continue; - SS.GW.MakeSelected(e->h); + SS.GW.MakeSelected(e.h); } SS.GW.Invalidate(); SS.ScheduleShowTW(); @@ -1071,24 +1068,23 @@ void GraphicsWindow::MenuEdit(Command id) { } case Command::SELECT_CHAIN: { - Entity *e; int newlySelected = 0; bool didSomething; do { didSomething = false; - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(e->group != SS.GW.activeGroup) continue; - if(!e->HasEndpoints()) continue; - if(!e->IsVisible()) continue; + for(Entity &e : SK.entity) { + if(e.group != SS.GW.activeGroup) continue; + if(!e.HasEndpoints()) continue; + if(!e.IsVisible()) continue; - Vector st = e->EndpointStart(), - fi = e->EndpointFinish(); + Vector st = e.EndpointStart(), + fi = e.EndpointFinish(); bool onChain = false, alreadySelected = false; List *ls = &(SS.GW.selection); for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) { if(!s->entity.v) continue; - if(s->entity == e->h) { + if(s->entity == e.h) { alreadySelected = true; continue; } @@ -1105,7 +1101,7 @@ void GraphicsWindow::MenuEdit(Command id) { } } if(onChain && !alreadySelected) { - SS.GW.MakeSelected(e->h); + SS.GW.MakeSelected(e.h); newlySelected++; didSomething = true; } diff --git a/src/groupmesh.cpp b/src/groupmesh.cpp index f1041d632..11add4f11 100644 --- a/src/groupmesh.cpp +++ b/src/groupmesh.cpp @@ -83,13 +83,12 @@ void Group::GenerateLoops() { } void SShell::RemapFaces(Group *g, int remap) { - SSurface *ss; - for(ss = surface.First(); ss; ss = surface.NextAfter(ss)){ - hEntity face = { ss->face }; + for(SSurface &ss : surface){ + hEntity face = { ss.face }; if(face == Entity::NO_ENTITY) continue; face = g->Remap(face, remap); - ss->face = face.v; + ss.face = face.v; } } @@ -292,13 +291,12 @@ void Group::GenerateShellAndMesh() { // So these are the sides if(ss->degm != 1 || ss->degn != 1) continue; - Entity *e; - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(e->group != opA) continue; - if(e->type != Entity::Type::LINE_SEGMENT) continue; + for(Entity &e : SK.entity) { + if(e.group != opA) continue; + if(e.type != Entity::Type::LINE_SEGMENT) continue; - Vector a = SK.GetEntity(e->point[0])->PointGetNum(), - b = SK.GetEntity(e->point[1])->PointGetNum(); + Vector a = SK.GetEntity(e.point[0])->PointGetNum(), + b = SK.GetEntity(e.point[1])->PointGetNum(); a = a.Plus(ttop); b = b.Plus(ttop); // Could get taken backwards, so check all cases. @@ -307,7 +305,7 @@ void Group::GenerateShellAndMesh() { (a.Equals(ss->ctrl[0][1]) && b.Equals(ss->ctrl[1][1])) || (b.Equals(ss->ctrl[0][1]) && a.Equals(ss->ctrl[1][1]))) { - face = Remap(e->h, REMAP_LINE_TO_FACE); + face = Remap(e.h, REMAP_LINE_TO_FACE); ss->face = face.v; break; } diff --git a/src/modify.cpp b/src/modify.cpp index 94b247878..99cb48bbe 100644 --- a/src/modify.cpp +++ b/src/modify.cpp @@ -50,38 +50,36 @@ void GraphicsWindow::FixConstraintsForRequestBeingDeleted(hRequest hr) { Request *r = SK.GetRequest(hr); if(r->group != SS.GW.activeGroup) return; - Entity *e; - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(!(e->h.isFromRequest())) continue; - if(e->h.request() != hr) continue; + for(Entity &e : SK.entity) { + if(!(e.h.isFromRequest())) continue; + if(e.h.request() != hr) continue; - if(e->type != Entity::Type::POINT_IN_2D && - e->type != Entity::Type::POINT_IN_3D) + if(e.type != Entity::Type::POINT_IN_2D && + e.type != Entity::Type::POINT_IN_3D) { continue; } // This is a point generated by the request being deleted; so fix // the constraints for that. - FixConstraintsForPointBeingDeleted(e->h); + FixConstraintsForPointBeingDeleted(e.h); } } void GraphicsWindow::FixConstraintsForPointBeingDeleted(hEntity hpt) { List ld = {}; - Constraint *c; SK.constraint.ClearTags(); - for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) { - if(c->type != Constraint::Type::POINTS_COINCIDENT) continue; - if(c->group != SS.GW.activeGroup) continue; + for(Constraint &c : SK.constraint) { + if(c.type != Constraint::Type::POINTS_COINCIDENT) continue; + if(c.group != SS.GW.activeGroup) continue; - if(c->ptA == hpt) { - ld.Add(&(c->ptB)); - c->tag = 1; + if(c.ptA == hpt) { + ld.Add(&(c.ptB)); + c.tag = 1; } - if(c->ptB == hpt) { - ld.Add(&(c->ptA)); - c->tag = 1; + if(c.ptB == hpt) { + ld.Add(&(c.ptA)); + c.tag = 1; } } // Remove constraints without waiting for regeneration; this way @@ -225,21 +223,21 @@ void GraphicsWindow::ParametricCurve::CreateRequestTrimmedTo(double t, // happens to exist, then constrain that point coincident to hpt. //----------------------------------------------------------------------------- void GraphicsWindow::ParametricCurve::ConstrainPointIfCoincident(hEntity hpt) { - Entity *e, *pt; + Entity *pt; pt = SK.GetEntity(hpt); Vector ev, ptv; ptv = pt->PointGetNum(); - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(e->h == pt->h) continue; - if(!e->IsPoint()) continue; - if(e->group != pt->group) continue; - if(e->workplane != pt->workplane) continue; + for(Entity &e : SK.entity) { + if(e.h == pt->h) continue; + if(!e.IsPoint()) continue; + if(e.group != pt->group) continue; + if(e.workplane != pt->workplane) continue; - ev = e->PointGetNum(); + ev = e.PointGetNum(); if(!ev.Equals(ptv)) continue; - Constraint::ConstrainCoincident(hpt, e->h); + Constraint::ConstrainCoincident(hpt, e.h); break; } } diff --git a/src/mouse.cpp b/src/mouse.cpp index e46acae82..2e1c75a86 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -713,11 +713,12 @@ void GraphicsWindow::MouseRightUp(double x, double y) { if(gs.points == 1) { Entity *p = SK.GetEntity(gs.point[0]); - Constraint *c; + Constraint *c = nullptr; IdList *lc = &(SK.constraint); - for(c = lc->First(); c; c = lc->NextAfter(c)) { - if(c->type != Constraint::Type::POINTS_COINCIDENT) continue; - if(c->ptA == p->h || c->ptB == p->h) { + for(Constraint &ci : *lc) { + if(ci.type != Constraint::Type::POINTS_COINCIDENT) continue; + if(ci.ptA == p->h || ci.ptB == p->h) { + c = &ci; break; } } @@ -727,11 +728,10 @@ void GraphicsWindow::MouseRightUp(double x, double y) { SS.UndoRemember(); SK.constraint.ClearTags(); - Constraint *c; - for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) { - if(c->type != Constraint::Type::POINTS_COINCIDENT) continue; - if(c->ptA == p->h || c->ptB == p->h) { - c->tag = 1; + for(Constraint &c : SK.constraint) { + if(c.type != Constraint::Type::POINTS_COINCIDENT) continue; + if(c.ptA == p->h || c.ptB == p->h) { + c.tag = 1; } } SK.constraint.RemoveTagged(); diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 1edf46ed5..4586cb58a 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -521,20 +521,19 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, SEdgeList inter = {}; SSurface *ss; - SCurve *sc; - for(sc = into->curve.First(); sc; sc = into->curve.NextAfter(sc)) { - if(sc->source != SCurve::Source::INTERSECTION) continue; + for(SCurve &sc : into->curve) { + if(sc.source != SCurve::Source::INTERSECTION) continue; if(opA) { - if(sc->surfA != h) continue; - ss = shb->surface.FindById(sc->surfB); + if(sc.surfA != h) continue; + ss = shb->surface.FindById(sc.surfB); } else { - if(sc->surfB != h) continue; - ss = sha->surface.FindById(sc->surfA); + if(sc.surfB != h) continue; + ss = sha->surface.FindById(sc.surfA); } int i; - for(i = 1; i < sc->pts.n; i++) { - Vector a = sc->pts[i-1].p, - b = sc->pts[i].p; + for(i = 1; i < sc.pts.n; i++) { + Vector a = sc.pts[i-1].p, + b = sc.pts[i].p; Point2d auv, buv; ss->ClosestPointTo(a, &(auv.x), &(auv.y)); @@ -560,9 +559,9 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, bkwds = !bkwds; } if(bkwds) { - inter.AddEdge(tb, ta, sc->h.v, 1); + inter.AddEdge(tb, ta, sc.h.v, 1); } else { - inter.AddEdge(ta, tb, sc->h.v, 0); + inter.AddEdge(ta, tb, sc.h.v, 0); } } } @@ -711,20 +710,18 @@ void SShell::MakeIntersectionCurvesAgainst(SShell *agnst, SShell *into) { for(int i = 0; i< surface.n; i++) { SSurface *sa = &surface[i]; - SSurface *sb; - for(sb = agnst->surface.First(); sb; sb = agnst->surface.NextAfter(sb)){ + for(SSurface &sb : agnst->surface){ // Intersect every surface from our shell against every surface // from agnst; this will add zero or more curves to the curve // list for into. - sa->IntersectAgainst(sb, this, agnst, into); + sa->IntersectAgainst(&sb, this, agnst, into); } } } void SShell::CleanupAfterBoolean() { - SSurface *ss; - for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { - ss->edges.Clear(); + for(SSurface &ss : surface) { + ss.edges.Clear(); } } @@ -734,10 +731,9 @@ void SShell::CleanupAfterBoolean() { // by their new IDs. //----------------------------------------------------------------------------- void SShell::RewriteSurfaceHandlesForCurves(SShell *a, SShell *b) { - SCurve *sc; - for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) { - sc->surfA = sc->GetSurfaceA(a, b)->newH, - sc->surfB = sc->GetSurfaceB(a, b)->newH; + for(SCurve &sc : curve) { + sc.surfA = sc.GetSurfaceA(a, b)->newH, + sc.surfB = sc.GetSurfaceB(a, b)->newH; } } @@ -759,32 +755,32 @@ void SShell::MakeFromAssemblyOf(SShell *a, SShell *b) { // First, copy over all the curves. Note which shell (a or b) each curve // came from, but assign it a new ID. curve.ReserveMore(a->curve.n + b->curve.n); - SCurve *c, cn; + SCurve cn; for(i = 0; i < 2; i++) { ab = (i == 0) ? a : b; - for(c = ab->curve.First(); c; c = ab->curve.NextAfter(c)) { - cn = SCurve::FromTransformationOf(c, t, q, 1.0); + for(SCurve &c : ab->curve) { + cn = SCurve::FromTransformationOf(&c, t, q, 1.0); cn.source = (i == 0) ? SCurve::Source::A : SCurve::Source::B; // surfA and surfB are wrong now, and we can't fix them until // we've assigned IDs to the surfaces. So we'll get that later. - c->newH = curve.AddAndAssignId(&cn); + c.newH = curve.AddAndAssignId(&cn); } } // Likewise copy over all the surfaces. surface.ReserveMore(a->surface.n + b->surface.n); - SSurface *s, sn; + SSurface sn; for(i = 0; i < 2; i++) { ab = (i == 0) ? a : b; - for(s = ab->surface.First(); s; s = ab->surface.NextAfter(s)) { - sn = SSurface::FromTransformationOf(s, t, q, 1.0, /*includingTrims=*/true); + for(SSurface &s : ab->surface) { + sn = SSurface::FromTransformationOf(&s, t, q, 1.0, /*includingTrims=*/true); // All the trim curve IDs get rewritten; we know the new handles // to the curves since we recorded them in the previous step. STrimBy *stb; for(stb = sn.trim.First(); stb; stb = sn.trim.NextAfter(stb)) { stb->curve = ab->curve.FindById(stb->curve)->newH; } - s->newH = surface.AddAndAssignId(&sn); + s.newH = surface.AddAndAssignId(&sn); } } @@ -809,12 +805,11 @@ void SShell::MakeFromBoolean(SShell *a, SShell *b, SSurface::CombineAs type) { // the surfaces in B (which is all of the intersection curves). a->MakeIntersectionCurvesAgainst(b, this); - SCurve *sc; - for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) { - SSurface *srfA = sc->GetSurfaceA(a, b), - *srfB = sc->GetSurfaceB(a, b); + for(SCurve &sc : curve) { + SSurface *srfA = sc.GetSurfaceA(a, b), + *srfB = sc.GetSurfaceB(a, b); - sc->RemoveShortSegments(srfA, srfB); + sc.RemoveShortSegments(srfA, srfB); } // And clean up the piecewise linear things we made as a calculation aid diff --git a/src/srf/merge.cpp b/src/srf/merge.cpp index a91a307fa..42ae55906 100644 --- a/src/srf/merge.cpp +++ b/src/srf/merge.cpp @@ -58,10 +58,9 @@ void SShell::MergeCoincidentSurfaces() { // All the references to this surface get replaced with the // new srf - SCurve *sc; - for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) { - if(sc->surfA == sj->h) sc->surfA = si->h; - if(sc->surfB == sj->h) sc->surfB = si->h; + for(SCurve &sc : curve) { + if(sc.surfA == sj->h) sc.surfA = si->h; + if(sc.surfB == sj->h) sc.surfB = si->h; } } diff --git a/src/srf/raycast.cpp b/src/srf/raycast.cpp index 587792821..f1c0d2bd6 100644 --- a/src/srf/raycast.cpp +++ b/src/srf/raycast.cpp @@ -381,9 +381,8 @@ void SShell::AllPointsIntersecting(Vector a, Vector b, List *il, bool asSegment, bool trimmed, bool inclTangent) { - SSurface *ss; - for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { - ss->AllPointsIntersecting(a, b, il, + for(SSurface &ss : surface) { + ss.AllPointsIntersecting(a, b, il, asSegment, trimmed, inclTangent); } } @@ -434,11 +433,10 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, // First, check for edge-on-edge int edge_inters = 0; Vector inter_surf_n[2], inter_edge_n[2]; - SSurface *srf; - for(srf = surface.First(); srf; srf = surface.NextAfter(srf)) { - if(srf->LineEntirelyOutsideBbox(ea, eb, /*asSegment=*/true)) continue; + for(SSurface &srf : surface) { + if(srf.LineEntirelyOutsideBbox(ea, eb, /*asSegment=*/true)) continue; - SEdgeList *sel = &(srf->edges); + SEdgeList *sel = &(srf.edges); SEdge *se; for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) { if((ea.Equals(se->a) && eb.Equals(se->b)) || @@ -448,9 +446,9 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, if(edge_inters < 2) { // Edge-on-edge case Point2d pm; - srf->ClosestPointTo(p, &pm, /*mustConverge=*/false); + srf.ClosestPointTo(p, &pm, /*mustConverge=*/false); // A vector normal to the surface, at the intersection point - inter_surf_n[edge_inters] = srf->NormalAt(pm); + inter_surf_n[edge_inters] = srf.NormalAt(pm); // A vector normal to the intersecting edge (but within the // intersecting surface) at the intersection point, pointing // out. @@ -520,25 +518,25 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, // are on surface) and for numerical stability, so we don't pick up // the additional error from the line intersection. - for(srf = surface.First(); srf; srf = surface.NextAfter(srf)) { - if(srf->LineEntirelyOutsideBbox(ea, eb, /*asSegment=*/true)) continue; + for(SSurface &srf : surface) { + if(srf.LineEntirelyOutsideBbox(ea, eb, /*asSegment=*/true)) continue; Point2d puv; - srf->ClosestPointTo(p, &(puv.x), &(puv.y), /*mustConverge=*/false); - Vector pp = srf->PointAt(puv); + srf.ClosestPointTo(p, &(puv.x), &(puv.y), /*mustConverge=*/false); + Vector pp = srf.PointAt(puv); if((pp.Minus(p)).Magnitude() > LENGTH_EPS) continue; Point2d dummy = { 0, 0 }; - SBspUv::Class c = (srf->bsp) ? srf->bsp->ClassifyPoint(puv, dummy, srf) : SBspUv::Class::OUTSIDE; + SBspUv::Class c = (srf.bsp) ? srf.bsp->ClassifyPoint(puv, dummy, &srf) : SBspUv::Class::OUTSIDE; if(c == SBspUv::Class::OUTSIDE) continue; // Edge-on-face (unless edge-on-edge above superceded) Point2d pin, pout; - srf->ClosestPointTo(p.Plus(edge_n_in), &pin, /*mustConverge=*/false); - srf->ClosestPointTo(p.Plus(edge_n_out), &pout, /*mustConverge=*/false); + srf.ClosestPointTo(p.Plus(edge_n_in), &pin, /*mustConverge=*/false); + srf.ClosestPointTo(p.Plus(edge_n_out), &pout, /*mustConverge=*/false); - Vector surf_n_in = srf->NormalAt(pin), - surf_n_out = srf->NormalAt(pout); + Vector surf_n_in = srf.NormalAt(pin), + surf_n_out = srf.NormalAt(pout); *indir = ClassifyRegion(edge_n_in, surf_n_in, surf_n); *outdir = ClassifyRegion(edge_n_out, surf_n_out, surf_n); diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp index 815aedad2..c63875e5a 100644 --- a/src/srf/surface.cpp +++ b/src/srf/surface.cpp @@ -1038,35 +1038,31 @@ void SShell::MakeFromTransformationOf(SShell *a, { booleanFailed = false; surface.ReserveMore(a->surface.n); - SSurface *s; - for(s = a->surface.First(); s; s = a->surface.NextAfter(s)) { + for(SSurface &s : a->surface) { SSurface n; - n = SSurface::FromTransformationOf(s, t, q, scale, /*includingTrims=*/true); + n = SSurface::FromTransformationOf(&s, t, q, scale, /*includingTrims=*/true); surface.Add(&n); // keeping the old ID } curve.ReserveMore(a->curve.n); - SCurve *c; - for(c = a->curve.First(); c; c = a->curve.NextAfter(c)) { + for(SCurve &c : a->curve) { SCurve n; - n = SCurve::FromTransformationOf(c, t, q, scale); + n = SCurve::FromTransformationOf(&c, t, q, scale); curve.Add(&n); // keeping the old ID } } void SShell::MakeEdgesInto(SEdgeList *sel) { - SSurface *s; - for(s = surface.First(); s; s = surface.NextAfter(s)) { - s->MakeEdgesInto(this, sel, SSurface::MakeAs::XYZ); + for(SSurface &s : surface) { + s.MakeEdgesInto(this, sel, SSurface::MakeAs::XYZ); } } void SShell::MakeSectionEdgesInto(Vector n, double d, SEdgeList *sel, SBezierList *sbl) { - SSurface *s; - for(s = surface.First(); s; s = surface.NextAfter(s)) { - if(s->CoincidentWithPlane(n, d)) { - s->MakeSectionEdgesInto(this, sel, sbl); + for(SSurface &s : surface) { + if(s.CoincidentWithPlane(n, d)) { + s.MakeSectionEdgesInto(this, sel, sbl); } } } @@ -1088,15 +1084,13 @@ bool SShell::IsEmpty() const { } void SShell::Clear() { - SSurface *s; - for(s = surface.First(); s; s = surface.NextAfter(s)) { - s->Clear(); + for(SSurface &s : surface) { + s.Clear(); } surface.Clear(); - SCurve *c; - for(c = curve.First(); c; c = curve.NextAfter(c)) { - c->Clear(); + for(SCurve &c : curve) { + c.Clear(); } curve.Clear(); } diff --git a/src/srf/surfinter.cpp b/src/srf/surfinter.cpp index 0a827761b..9e03a83c1 100644 --- a/src/srf/surfinter.cpp +++ b/src/srf/surfinter.cpp @@ -23,20 +23,20 @@ void SSurface::AddExactIntersectionCurve(SBezier *sb, SSurface *srfB, // Now we have to piecewise linearize the curve. If there's already an // identical curve in the shell, then follow that pwl exactly, otherwise // calculate from scratch. - SCurve split, *existing = NULL, *se; + SCurve split, *existing = NULL; SBezier sbrev = *sb; sbrev.Reverse(); bool backwards = false; #pragma omp critical(into) { - for(se = into->curve.First(); se; se = into->curve.NextAfter(se)) { - if(se->isExact) { - if(sb->Equals(&(se->exact))) { - existing = se; + for(SCurve &se : into->curve) { + if(se.isExact) { + if(sb->Equals(&(se.exact))) { + existing = &se; break; } - if(sbrev.Equals(&(se->exact))) { - existing = se; + if(sbrev.Equals(&(se.exact))) { + existing = &se; backwards = true; break; } @@ -332,15 +332,14 @@ void SSurface::IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB, shext = agnstA; } bool foundExact = false; - SCurve *sc; - for(sc = shext->curve.First(); sc; sc = shext->curve.NextAfter(sc)) { - if(sc->source == SCurve::Source::INTERSECTION) continue; - if(!sc->isExact) continue; - if((sc->surfA != sext->h) && (sc->surfB != sext->h)) continue; + for(SCurve &sc : shext->curve) { + if(sc.source == SCurve::Source::INTERSECTION) continue; + if(!sc.isExact) continue; + if((sc.surfA != sext->h) && (sc.surfB != sext->h)) continue; // we have a curve belonging to the curved surface and not the plane. // does it lie completely in the plane? - if(splane->ContainsPlaneCurve(sc)) { - SBezier bezier = sc->exact; + if(splane->ContainsPlaneCurve(&sc)) { + SBezier bezier = sc.exact; AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into); foundExact = true; } @@ -571,10 +570,9 @@ bool SSurface::ContainsPlaneCurve(SCurve *sc) const { void SShell::MakeCoincidentEdgesInto(SSurface *proto, bool sameNormal, SEdgeList *el, SShell *useCurvesFrom) { - SSurface *ss; - for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { - if(proto->CoincidentWith(ss, sameNormal)) { - ss->MakeEdgesInto(this, el, SSurface::MakeAs::XYZ, useCurvesFrom); + for(SSurface &ss : surface) { + if(proto->CoincidentWith(&ss, sameNormal)) { + ss.MakeEdgesInto(this, el, SSurface::MakeAs::XYZ, useCurvesFrom); } } diff --git a/src/style.cpp b/src/style.cpp index b1070cdc0..6ca61e560 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -470,14 +470,13 @@ void TextWindow::ShowListOfStyles() { Printf(true, "%Ft color style-name"); bool darkbg = false; - Style *s; - for(s = SK.style.First(); s; s = SK.style.NextAfter(s)) { + for(Style &s : SK.style) { Printf(false, "%Bp %Bz %Bp %Fl%Ll%f%D%s%E", darkbg ? 'd' : 'a', - &s->color, + &s.color, darkbg ? 'd' : 'a', - ScreenShowStyleInfo, s->h.v, - s->DescriptionString().c_str()); + ScreenShowStyleInfo, s.h.v, + s.DescriptionString().c_str()); darkbg = !darkbg; } From 67f7cbae726a14b80b25581123cc18eaa5cb191b Mon Sep 17 00:00:00 2001 From: ruevs Date: Mon, 5 Apr 2021 18:05:08 +0300 Subject: [PATCH 299/646] IdList: Remove Unused IndexOf, First, Last and NextAfter Methods --- src/dsc.h | 45 +++++---------------------------------------- 1 file changed, 5 insertions(+), 40 deletions(-) diff --git a/src/dsc.h b/src/dsc.h index f4a7933c9..1599484c0 100644 --- a/src/dsc.h +++ b/src/dsc.h @@ -488,7 +488,7 @@ class IdList { if(IsEmpty()) { return 0; } else { - return Last()->h.v; + return elemstore[elemidx.back()].h.v; } } @@ -514,9 +514,9 @@ class IdList { } void ReserveMore(int howMuch) { - elemstore.reserve(n + howMuch); - elemidx.reserve(n + howMuch); -// freelist.reserve(n + howMuch); // PAR@@@@ maybe we should - not much more RAM + elemstore.reserve(elemstore.size() + howMuch); + elemidx.reserve(elemidx.size() + howMuch); + // freelist.reserve(freelist.size() + howMuch); // PAR@@@@ maybe we should - not much more RAM } void Add(T *t) { @@ -556,19 +556,6 @@ class IdList { return t; } - int IndexOf(H h) { - if(IsEmpty()) { - return -1; - } - auto it = std::lower_bound(elemidx.begin(), elemidx.end(), h, Compare(this)); - if(it == elemidx.end()) { - return -1; - } else { - auto idx = std::distance(elemidx.begin(), it); - return static_cast(idx); - } - } - T *FindByIdNoOops(H h) { if(IsEmpty()) { return nullptr; @@ -584,28 +571,6 @@ class IdList { } } - T *First() { - return (IsEmpty()) ? nullptr : &(elemstore[0]); - } - T *Last() { - return (IsEmpty()) ? nullptr : &(elemstore[elemidx.back()]); - } - - // Remove this entirely?!? 199 places in the code mostly for loops? - T *NextAfter(T *prev) { - if(IsEmpty() || !prev) { - return nullptr; - } - - // PAR@@@@ This is slower than before now. O(log(n)) was O(1) - auto it = std::upper_bound(elemidx.begin(), elemidx.end(), prev, Compare(this)); - if(it == elemidx.end()) { - return nullptr; - } else { - return &elemstore[*it]; - } - } - T &Get(size_t i) { return elemstore[elemidx[i]]; } T const &Get(size_t i) const { return elemstore[elemidx[i]]; } T &operator[](size_t i) { return Get(i); } @@ -674,7 +639,7 @@ class IdList { l->elemidx.push_back(it); } - l->n = n; + l->n = n; } void Clear() { From bb6c75bda02b758d4c2c559d3aa9f651a99d83b6 Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 6 Apr 2021 15:55:47 +0300 Subject: [PATCH 300/646] Remove all unused methods from IdList and its iterator Fix gcc warning -Wreorder-ctor https://stackoverflow.com/questions/1828037/whats-the-point-of-g-wreorder --- src/dsc.h | 47 ++++++----------------------------------------- 1 file changed, 6 insertions(+), 41 deletions(-) diff --git a/src/dsc.h b/src/dsc.h index 1599484c0..19f08686b 100644 --- a/src/dsc.h +++ b/src/dsc.h @@ -421,21 +421,8 @@ class IdList { T &operator*() const noexcept { return *elem; } const T *operator->() const noexcept { return elem; } - T &operator=(const T &e) const noexcept { - *elem = e; - return *this; - } - T &operator=(const H h) const noexcept { - elem->h = e; - return *this; - } - bool operator==(const iterator &p) const { return p.position == position; } - bool operator<(const iterator &p) const { return position < p.position; } bool operator!=(const iterator &p) const { return !operator==(p); } - bool operator>(const iterator &p) const { return operator!=(p) && !operator<(p); } - bool operator>=(const iterator &p) const { return !operator<(p); } - bool operator<=(const iterator &p) const { return !operator>(p); } iterator &operator++() { ++position; @@ -446,26 +433,20 @@ class IdList { } return *this; } - iterator &operator--() { - --position; - if(0 > position) { - elem = nullptr; // PAR@@@@ Remove just debugging - } else if(position < list->elemidx.size()) { - elem = &(list->elemstore[list->elemidx[position]]); - } - return *this; + + // Needed for std:find_if of gcc used in entity.cpp GenerateEquations + difference_type operator-(const iterator &rhs) const noexcept { + return position - rhs.position; } - iterator(IdList *l) : list(l), position(0) { + iterator(IdList *l) : position(0), list(l) { if(list) { if(list->elemstore.size() && list->elemidx.size()) { elem = &(list->elemstore[list->elemidx[position]]); } } }; - iterator(const iterator &iter) - : list(iter.list), position(iter.position), elem(iter.elem){}; - iterator(IdList *l, int pos) : list(l), position(pos) { + iterator(IdList *l, int pos) : position(pos), list(l) { if(position >= (int)list->elemidx.size()) { elem = nullptr; } else if(0 <= position) { @@ -503,16 +484,6 @@ class IdList { return t->h; } - int LowerBoundIndex(T const& t) { - if(IsEmpty()) { - return 0; - } - auto it = std::lower_bound(elemptr.begin(), elemptr.end(), t, Compare(this)); - auto idx = std::distance(elemidx.begin(), it); - auto i = static_cast(idx); - return i; - } - void ReserveMore(int howMuch) { elemstore.reserve(elemstore.size() + howMuch); elemidx.reserve(elemidx.size() + howMuch); @@ -572,16 +543,10 @@ class IdList { } T &Get(size_t i) { return elemstore[elemidx[i]]; } - T const &Get(size_t i) const { return elemstore[elemidx[i]]; } T &operator[](size_t i) { return Get(i); } - T const &operator[](size_t i) const { return Get(i); } iterator begin() { return IsEmpty() ? nullptr : iterator(this); } iterator end() { return IsEmpty() ? nullptr : iterator(this, elemidx.size()); } - const iterator begin() const { return IsEmpty() ? nullptr : iterator(this); } - const iterator end() const { return IsEmpty() ? nullptr : iterator(this, elemidx.size()); } - const iterator cbegin() const { return begin(); } - const iterator cend() const { return end(); } void ClearTags() { for(auto &elt : *this) { elt.tag = 0; } From 799f4eee6b2ebd866cb75658bf9766916406e9fb Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 12 May 2021 20:02:21 -0400 Subject: [PATCH 301/646] fix a compiler warning on GTK builds --- src/platform/guigtk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index 94eb6b5e6..46a7df350 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -1345,7 +1345,7 @@ class FileDialogImplGtk : public FileDialog { return; Platform::Path path = GetFilename(); - if(gtkChooser->get_action() != GTK_FILE_CHOOSER_ACTION_OPEN) { + if(gtkChooser->get_action() != Gtk::FILE_CHOOSER_ACTION_OPEN) { SetCurrentName(path.WithExtension(extension).FileName()); } } From f72a43fd578daed586551a76f28b82b8e646ee4c Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 16 May 2021 11:13:14 -0400 Subject: [PATCH 302/646] Show IDF keepout regions as construction entities. --- src/importidf.cpp | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/src/importidf.cpp b/src/importidf.cpp index 1789e5cc1..101feff1e 100644 --- a/src/importidf.cpp +++ b/src/importidf.cpp @@ -77,7 +77,7 @@ static hEntity newPoint(EntityList *el, int *id, Vector p, bool visible = true) return en.h; } -static hEntity newLine(EntityList *el, int *id, hEntity p0, hEntity p1) { +static hEntity newLine(EntityList *el, int *id, hEntity p0, hEntity p1, bool keepout) { Entity en = {}; en.type = Entity::Type::LINE_SEGMENT; en.point[0] = p0; @@ -85,8 +85,8 @@ static hEntity newLine(EntityList *el, int *id, hEntity p0, hEntity p1) { en.extraPoints = 0; en.timesApplied = 0; en.group.v = 493; - en.construction = false; - en.style.v = Style::ACTIVE_GRP; + en.construction = keepout; + en.style.v = keepout? Style::CONSTRUCTION : Style::ACTIVE_GRP; en.actVisible = true; en.forceHidden = false; @@ -117,7 +117,7 @@ static hEntity newNormal(EntityList *el, int *id, Quaternion normal) { return en.h; } -static hEntity newArc(EntityList *el, int *id, hEntity p0, hEntity p1, hEntity pc, hEntity hnorm) { +static hEntity newArc(EntityList *el, int *id, hEntity p0, hEntity p1, hEntity pc, hEntity hnorm, bool keepout) { Entity en = {}; en.type = Entity::Type::ARC_OF_CIRCLE; en.point[0] = pc; @@ -127,8 +127,8 @@ static hEntity newArc(EntityList *el, int *id, hEntity p0, hEntity p1, hEntity p en.extraPoints = 0; en.timesApplied = 0; en.group.v = 403; - en.construction = false; - en.style.v = Style::ACTIVE_GRP; + en.construction = keepout; + en.style.v = keepout? Style::CONSTRUCTION : Style::ACTIVE_GRP; en.actVisible = true; en.forceHidden = false; *id = *id+1; @@ -158,7 +158,7 @@ static hEntity newDistance(EntityList *el, int *id, double distance) { return en.h; } -static hEntity newCircle(EntityList *el, int *id, hEntity p0, hEntity hdist, hEntity hnorm) { +static hEntity newCircle(EntityList *el, int *id, hEntity p0, hEntity hdist, hEntity hnorm, bool keepout) { Entity en = {}; en.type = Entity::Type::CIRCLE; en.point[0] = p0; @@ -167,8 +167,8 @@ static hEntity newCircle(EntityList *el, int *id, hEntity p0, hEntity hdist, hEn en.extraPoints = 0; en.timesApplied = 0; en.group.v = 399; - en.construction = false; - en.style.v = Style::ACTIVE_GRP; + en.construction = keepout; + en.style.v = keepout? Style::CONSTRUCTION : Style::ACTIVE_GRP; en.actVisible = true; en.forceHidden = false; @@ -196,18 +196,18 @@ static Vector ArcCenter(Vector p0, Vector p1, double angle) { // Positive angles are counter clockwise, negative are clockwise. An angle of 360 // indicates a circle centered at x1,y1 passing through x2,y2 and is a complete loop. static void CreateEntity(EntityList *el, int *id, hEntity h0, hEntity h1, hEntity hnorm, - Vector p0, Vector p1, double angle) { + Vector p0, Vector p1, double angle, bool keepout) { if (angle == 0.0) { //line if(p0.Equals(p1)) return; - newLine(el, id, h0, h1); + newLine(el, id, h0, h1, keepout); } else if(angle == 360.0) { // circle double d = p1.Minus(p0).Magnitude(); hEntity hd = newDistance(el, id, d); - newCircle(el, id, h1, hd, hnorm); + newCircle(el, id, h1, hd, hnorm, keepout); } else { // arc @@ -226,7 +226,7 @@ static void CreateEntity(EntityList *el, int *id, hEntity h0, hEntity h1, hEntit } Vector c = m.Minus(perp.ScaledBy(dist)); hEntity hc = newPoint(el, id, c, /*visible=*/false); - newArc(el, id, h0, h1, hc, hnorm); + newArc(el, id, h0, h1, hc, hnorm, keepout); } } @@ -355,10 +355,9 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s } else if (line.find(".BOARD_OUTLINE") == 0) { section = board_outline; record_number = 1; -// no keepouts for now - they should also be shown as construction? -// } else if (line.find(".ROUTE_KEEPOUT") == 0) { -// section = routing_keepout; -// record_number = 1; + } else if (line.find(".ROUTE_KEEPOUT") == 0) { + section = routing_keepout; + record_number = 1; } else if(line.find(".DRILLED_HOLES") == 0) { section = drilled_holes; record_number = 1; @@ -433,13 +432,15 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s bool vis = (ang == 360.0); if (bottomEntities) { hEntity hp = newPoint(el, &entityCount, point, /*visible=*/vis); - CreateEntity(el, &entityCount, hprev, hp, hnorm, pprev, point, ang); + CreateEntity(el, &entityCount, hprev, hp, hnorm, pprev, point, ang, + (section == routing_keepout) ); pprev = point; hprev = hp; } if (topEntities) { hEntity hp = newPoint(el, &entityCount, pTop, /*visible=*/vis); - CreateEntity(el, &entityCount, hprevTop, hp, hnorm, pprevTop, pTop, ang); + CreateEntity(el, &entityCount, hprevTop, hp, hnorm, pprevTop, pTop, + ang, (section == routing_keepout) ); pprevTop = pTop; hprevTop = hp; } @@ -467,12 +468,12 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s Vector cent = Vector::From(x,y,0.0); hEntity hcent = newPoint(el, &entityCount, cent); hEntity hdist = newDistance(el, &entityCount, d/2); - newCircle(el, &entityCount, hcent, hdist, hnorm); + newCircle(el, &entityCount, hcent, hdist, hnorm, false); // and again for the top Vector cTop = Vector::From(x,y,board_thickness); hcent = newPoint(el, &entityCount, cTop); hdist = newDistance(el, &entityCount, d/2); - newCircle(el, &entityCount, hcent, hdist, hnorm); + newCircle(el, &entityCount, hcent, hdist, hnorm, false); // create the curves for the extrusion Vector pt = Vector::From(x+d/2, y, 0.0); MakeBeziersForArcs(&sbl, cent, pt, pt, normal, 360.0); From cba1839ad263508cba9f939b56b427bc4a6da201 Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Fri, 21 May 2021 07:54:24 +0200 Subject: [PATCH 303/646] Drop XPM app icons They were added with commit a98cdeeb16038cc386c9d329ac30d3b2d124f578 and they were only useful for the old Debian menu system, which was deprecated almost 6 years ago [1]. As the old Debian menu file is no more provided in the Debian packaging, the XPM versions of the application icon can be safely removed, as there are already icons in the XDG hicolor icon theme. [1] https://lists.debian.org/debian-devel-announce/2015/09/msg00000.html --- res/CMakeLists.txt | 5 --- res/freedesktop/solvespace-16x16.xpm | 27 ------------- res/freedesktop/solvespace-24x24.xpm | 35 ----------------- res/freedesktop/solvespace-32x32.xpm | 43 -------------------- res/freedesktop/solvespace-48x48.xpm | 59 ---------------------------- 5 files changed, 169 deletions(-) delete mode 100644 res/freedesktop/solvespace-16x16.xpm delete mode 100644 res/freedesktop/solvespace-24x24.xpm delete mode 100644 res/freedesktop/solvespace-32x32.xpm delete mode 100644 res/freedesktop/solvespace-48x48.xpm diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index 3bd63d8be..e702a5685 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -209,11 +209,6 @@ else() DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}/mimetypes RENAME application.x-solvespace.png) endforeach() - - foreach(SIZE 16x16 24x24 32x32 48x48) - install(FILES freedesktop/solvespace-${SIZE}.xpm - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps) - endforeach() endif() endif() diff --git a/res/freedesktop/solvespace-16x16.xpm b/res/freedesktop/solvespace-16x16.xpm deleted file mode 100644 index 3cd06622d..000000000 --- a/res/freedesktop/solvespace-16x16.xpm +++ /dev/null @@ -1,27 +0,0 @@ -/* XPM */ -static char *solvespace_16x16[] = { -/* columns rows colors chars-per-pixel */ -"16 16 5 1 ", -" c black", -". c #1ED500", -"X c #DE00D6", -"o c #CBCBCB", -"O c None", -/* pixels */ -"OOO OOOOOOOOOOOO", -"OOO OOOOOOOOOOOO", -"OOO OOOOOOOOOOOO", -"OOO OOOOOXOOOOOO", -"OOO OOOOOXoOOOOO", -"OOO OOOOOXoOOOOO", -"OOO OOOOOXoOOOOO", -"OOO OOOOOXoOOOOO", -"OOO OOOOOXoOOOOO", -"OOO OOXXXXXXXOOO", -"OOO OOOoooooooOO", -"OO...OOOOOOOOOOO", -" ... ", -"OO...OOOOOOOOOOO", -"OOO OOOOOOOOOOOO", -"OOO OOOOOOOOOOOO" -}; diff --git a/res/freedesktop/solvespace-24x24.xpm b/res/freedesktop/solvespace-24x24.xpm deleted file mode 100644 index 9d1c02e69..000000000 --- a/res/freedesktop/solvespace-24x24.xpm +++ /dev/null @@ -1,35 +0,0 @@ -/* XPM */ -static char *solvespace_24x24[] = { -/* columns rows colors chars-per-pixel */ -"24 24 5 1 ", -" c black", -". c #1ED500", -"X c #DE00D6", -"o c #CBCBCB", -"O c None", -/* pixels */ -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOO OOOOOOOOOOOOOOOO", -"OOOOOOO OOOOOOOOOOOOOOOO", -"OOOOOOO OOOOOOOOOOOOOOOO", -"OOOOOOO OOOOOXOOOOOOOOOO", -"OOOOOOO OOOOOXoOOOOOOOOO", -"OOOOOOO OOOOOXoOOOOOOOOO", -"OOOOOOO OOOOOXoOOOOOOOOO", -"OOOOOOO OOOOOXoOOOOOOOOO", -"OOOOOOO OOOOOXoOOOOOOOOO", -"OOOOOOO OOXXXXXXXOOOOOOO", -"OOOOOOO OOOoooooooOOOOOO", -"OOOOOO...OOOOOOOOOOOOOOO", -"OOOO ... OOOO", -"OOOOOO...OOOOOOOOOOOOOOO", -"OOOOOOO OOOOOOOOOOOOOOOO", -"OOOOOOO OOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO" -}; diff --git a/res/freedesktop/solvespace-32x32.xpm b/res/freedesktop/solvespace-32x32.xpm deleted file mode 100644 index 0d7c59872..000000000 --- a/res/freedesktop/solvespace-32x32.xpm +++ /dev/null @@ -1,43 +0,0 @@ -/* XPM */ -static char *solvespace_32x32[] = { -/* columns rows colors chars-per-pixel */ -"32 32 5 1 ", -" c black", -". c #1ED500", -"X c #DE00D6", -"o c #CBCBCB", -"O c None", -/* pixels */ -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOXXXXXXXXXXXXOOOOOOOO", -"OOOOOO OOOOXXXXXXXXXXXXOOOOOOOO", -"OOOOOO OOOOOooooooooooooOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOO......OOOOOOOOOOOOOOOOOOOOOO", -"OOOO......OOOOOOOOOOOOOOOOOOOOOO", -" ...... ", -" ...... ", -"OOOO......OOOOOOOOOOOOOOOOOOOOOO", -"OOOO......OOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO" -}; diff --git a/res/freedesktop/solvespace-48x48.xpm b/res/freedesktop/solvespace-48x48.xpm deleted file mode 100644 index c5adf53b4..000000000 --- a/res/freedesktop/solvespace-48x48.xpm +++ /dev/null @@ -1,59 +0,0 @@ -/* XPM */ -static char *solvespace_48x48[] = { -/* columns rows colors chars-per-pixel */ -"48 48 5 1 ", -" c black", -". c #1ED500", -"X c #DE00D6", -"o c #CBCBCB", -"O c None", -/* pixels */ -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOXXXXXXXXXXXXOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOXXXXXXXXXXXXOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOooooooooooooOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOO ...... OOOOOOOO", -"OOOOOOOO ...... OOOOOOOO", -"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" -}; From c965dfbbd91cc22ff2c1f6acd124843922d019b9 Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Fri, 21 May 2021 08:07:16 +0200 Subject: [PATCH 304/646] Fix icon name for XDG mimetypes The default icon for XDG mimetypes is the name of the mime with '/' replaced with '-', unless the mimetype has an 'icon' attribute (and solvespace-mime.xml does not have it). So the right icon name for application/x-solvespace is 'application-x-solvespace', not 'application.x-solvespace'. Hence, properly rename the mimetype icons in non-flatpak and non-snap installations. --- res/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index e702a5685..3b4216c1d 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -199,7 +199,7 @@ else() RENAME solvespace.svg) install(FILES freedesktop/solvespace-scalable.svg DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/mimetypes - RENAME application.x-solvespace.svg) + RENAME application-x-solvespace.svg) foreach(SIZE 16x16 24x24 32x32 48x48) install(FILES freedesktop/solvespace-${SIZE}.png @@ -207,7 +207,7 @@ else() RENAME solvespace.png) install(FILES freedesktop/solvespace-${SIZE}.png DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}/mimetypes - RENAME application.x-solvespace.png) + RENAME application-x-solvespace.png) endforeach() endif() endif() From 8401a4dc9c9be9de97cce7dfe1afc839053f411d Mon Sep 17 00:00:00 2001 From: Olivier JANIN Date: Sun, 6 Jun 2021 15:27:55 +0200 Subject: [PATCH 305/646] Improve "Sketch in New Workplane" by adding two way of construction - point and normal - point and face --- src/group.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/group.cpp b/src/group.cpp index 1539e68c7..cfe573e77 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -138,12 +138,26 @@ void Group::MenuGroup(Command id, Platform::Path linkFile) { g.predef.q = wrkplg->predef.q; } else ssassert(false, "Unexpected workplane subtype"); } + } else if(gs.anyNormals == 1 && gs.points == 1 && gs.n == 2) { + g.subtype = Subtype::WORKPLANE_BY_POINT_ORTHO; + Vector direction = SK.GetEntity(gs.anyNormal[0])->VectorGetNum(); + g.predef.q = Quaternion::From(direction, 0); + g.predef.origin = gs.point[0]; + } else if(gs.faces == 1 && gs.points == 1 && gs.n == 2) { + g.subtype = Subtype::WORKPLANE_BY_POINT_ORTHO; + Vector direction = SK.GetEntity(gs.face[0])->FaceGetNormalNum(); + g.predef.q = Quaternion::From(direction, 0); + g.predef.origin = gs.point[0]; } else { Error(_("Bad selection for new sketch in workplane. This " "group can be created with:\n\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, " - "parallel to the lines)\n" + "parallel to the lines)\n" + " * a point and a normal (through the point, " + "orthogonal to the normal)\n" + " * a point and a face (through the point, " + "parallel to the face)\n" " * a workplane (copy of the workplane)\n")); return; } From 4d9506e14ff6596ff51957c9691a0528787c3dd0 Mon Sep 17 00:00:00 2001 From: Maxipaille Date: Mon, 7 Jun 2021 15:59:19 +0200 Subject: [PATCH 306/646] Fix "Sketch in New Workplane" point & normal to set correct orientation of workplane Temporary disable other ways because of wrong implementation --- src/group.cpp | 23 +++++++++++------------ src/sketch.h | 3 +++ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/group.cpp b/src/group.cpp index cfe573e77..0f4580459 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -139,15 +139,13 @@ void Group::MenuGroup(Command id, Platform::Path linkFile) { } else ssassert(false, "Unexpected workplane subtype"); } } else if(gs.anyNormals == 1 && gs.points == 1 && gs.n == 2) { - g.subtype = Subtype::WORKPLANE_BY_POINT_ORTHO; - Vector direction = SK.GetEntity(gs.anyNormal[0])->VectorGetNum(); - g.predef.q = Quaternion::From(direction, 0); - g.predef.origin = gs.point[0]; - } else if(gs.faces == 1 && gs.points == 1 && gs.n == 2) { - g.subtype = Subtype::WORKPLANE_BY_POINT_ORTHO; - Vector direction = SK.GetEntity(gs.face[0])->FaceGetNormalNum(); - g.predef.q = Quaternion::From(direction, 0); - g.predef.origin = gs.point[0]; + g.subtype = Subtype::WORKPLANE_BY_POINT_NORMAL; + 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) { + // g.subtype = Subtype::WORKPLANE_BY_POINT_FACE; + // g.predef.q = SK.GetEntity(gs.face[0])->NormalGetNum(); + // g.predef.origin = gs.point[0]; } else { Error(_("Bad selection for new sketch in workplane. This " "group can be created with:\n\n" @@ -156,8 +154,8 @@ void Group::MenuGroup(Command id, Platform::Path linkFile) { "parallel to the lines)\n" " * a point and a normal (through the point, " "orthogonal to the normal)\n" - " * a point and a face (through the point, " - "parallel to the face)\n" + /*" * a point and a face (through the point, " + "parallel to the face)\n"*/ " * a workplane (copy of the workplane)\n")); return; } @@ -454,7 +452,7 @@ void Group::Generate(IdList *entity, if(predef.negateU) u = u.ScaledBy(-1); if(predef.negateV) v = v.ScaledBy(-1); q = Quaternion::From(u, v); - } else if(subtype == Subtype::WORKPLANE_BY_POINT_ORTHO) { + } else if(subtype == Subtype::WORKPLANE_BY_POINT_ORTHO || subtype == Subtype::WORKPLANE_BY_POINT_NORMAL /*|| subtype == Subtype::WORKPLANE_BY_POINT_FACE*/) { // Already given, numerically. q = predef.q; } else ssassert(false, "Unexpected workplane subtype"); @@ -462,6 +460,7 @@ void Group::Generate(IdList *entity, Entity normal = {}; normal.type = Entity::Type::NORMAL_N_COPY; normal.numNormal = q; + normal.point[0] = h.entity(2); normal.group = h; normal.h = h.entity(1); diff --git a/src/sketch.h b/src/sketch.h index 74111d18c..0aa75988b 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -198,6 +198,9 @@ class Group { // For drawings in 2d WORKPLANE_BY_POINT_ORTHO = 6000, WORKPLANE_BY_LINE_SEGMENTS = 6001, + WORKPLANE_BY_POINT_NORMAL = 6002, + //WORKPLANE_BY_POINT_FACE = 6003, + //WORKPLANE_BY_FACE = 6004, // For extrudes, translates, and rotates ONE_SIDED = 7000, TWO_SIDED = 7001 From 0ca563935db987c0bddcd7d4d02b535400de4755 Mon Sep 17 00:00:00 2001 From: Eric Chan Date: Fri, 25 Jun 2021 13:25:53 -0700 Subject: [PATCH 307/646] Addition of ArcLength Ratio and ArcLength Difference constraints to Constraints list --- include/slvs.h | 4 + src/constraint.cpp | 42 +++++++- src/constrainteq.cpp | 220 ++++++++++++++++++++++++++++++++++++++++- src/drawconstraint.cpp | 42 +++++++- src/graphicswin.cpp | 4 +- src/lib.cpp | 4 + src/mouse.cpp | 8 +- src/sketch.h | 5 +- src/solvespace.cpp | 6 +- 9 files changed, 324 insertions(+), 11 deletions(-) diff --git a/include/slvs.h b/include/slvs.h index 1c97fbf82..458f8c0d8 100644 --- a/include/slvs.h +++ b/include/slvs.h @@ -113,6 +113,10 @@ typedef struct { #define SLVS_C_WHERE_DRAGGED 100031 #define SLVS_C_CURVE_CURVE_TANGENT 100032 #define SLVS_C_LENGTH_DIFFERENCE 100033 +#define SLVS_C_ARC_ARC_LEN_RATIO 100034 +#define SLVS_C_ARC_LINE_LEN_RATIO 100035 +#define SLVS_C_ARC_ARC_DIFFERENCE 100036 +#define SLVS_C_ARC_LINE_DIFFERENCE 100037 typedef struct { Slvs_hConstraint h; diff --git a/src/constraint.cpp b/src/constraint.cpp index c1da398d5..6a25c2652 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -22,7 +22,11 @@ std::string Constraint::DescriptionString() const { case Type::EQ_LEN_PT_LINE_D: s = C_("constr-name", "eq-length-and-pt-ln-dist"); break; case Type::EQ_PT_LN_DISTANCES: s = C_("constr-name", "eq-pt-line-distances"); break; case Type::LENGTH_RATIO: s = C_("constr-name", "length-ratio"); break; + case Type::ARC_ARC_LEN_RATIO: s = C_("constr-name", "arc-arc-length-ratio"); break; + case Type::ARC_LINE_LEN_RATIO: s = C_("constr-name", "arc-line-length-ratio"); break; case Type::LENGTH_DIFFERENCE: s = C_("constr-name", "length-difference"); break; + case Type::ARC_ARC_DIFFERENCE: s = C_("constr-name", "arc-arc-len-difference"); break; + case Type::ARC_LINE_DIFFERENCE: s = C_("constr-name", "arc-line-len-difference"); break; case Type::SYMMETRIC: s = C_("constr-name", "symmetric"); break; case Type::SYMMETRIC_HORIZ: s = C_("constr-name", "symmetric-h"); break; case Type::SYMMETRIC_VERT: s = C_("constr-name", "symmetric-v"); break; @@ -384,10 +388,27 @@ void Constraint::MenuConstrain(Command id) { c.type = Type::LENGTH_RATIO; c.entityA = gs.entity[0]; c.entityB = gs.entity[1]; + } + else if(gs.arcs == 2 && gs.n == 2) { + c.type = Type::ARC_ARC_LEN_RATIO; + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } + else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) { + c.type = Type::ARC_LINE_LEN_RATIO; + if(SK.GetEntity(gs.entity[0])->type == Entity::Type::ARC_OF_CIRCLE) { + c.entityA = gs.entity[1]; + c.entityB = gs.entity[0]; + } else { + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } } else { Error(_("Bad selection for length ratio constraint. This " "constraint can apply to:\n\n" - " * two line segments\n")); + " * two line segments\n" + " * two arcs\n" + " * one arc and one line segment\n")); return; } @@ -401,10 +422,27 @@ void Constraint::MenuConstrain(Command id) { c.type = Type::LENGTH_DIFFERENCE; c.entityA = gs.entity[0]; c.entityB = gs.entity[1]; + } + else if(gs.arcs == 2 && gs.n == 2) { + c.type = Type::ARC_ARC_DIFFERENCE; + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } + else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) { + c.type = Type::ARC_LINE_DIFFERENCE; + if(SK.GetEntity(gs.entity[0])->type == Entity::Type::ARC_OF_CIRCLE) { + c.entityA = gs.entity[1]; + c.entityB = gs.entity[0]; + } else { + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } } else { Error(_("Bad selection for length difference constraint. This " "constraint can apply to:\n\n" - " * two line segments\n")); + " * two line segments\n" + " * two arcs\n" + " * one arc and one line segment\n")); return; } diff --git a/src/constrainteq.cpp b/src/constrainteq.cpp index 965a13d07..c21d10721 100644 --- a/src/constrainteq.cpp +++ b/src/constrainteq.cpp @@ -18,7 +18,11 @@ bool ConstraintBase::HasLabel() const { case Type::PROJ_PT_DISTANCE: case Type::DIAMETER: case Type::LENGTH_RATIO: + case Type::ARC_ARC_LEN_RATIO: + case Type::ARC_LINE_LEN_RATIO: case Type::LENGTH_DIFFERENCE: + case Type::ARC_ARC_DIFFERENCE: + case Type::ARC_LINE_DIFFERENCE: case Type::ANGLE: case Type::COMMENT: return true; @@ -39,7 +43,11 @@ bool ConstraintBase::IsProjectible() const { case Type::EQ_PT_LN_DISTANCES: case Type::EQUAL_ANGLE: case Type::LENGTH_RATIO: + case Type::ARC_ARC_LEN_RATIO: + case Type::ARC_LINE_LEN_RATIO: case Type::LENGTH_DIFFERENCE: + case Type::ARC_ARC_DIFFERENCE: + case Type::ARC_LINE_DIFFERENCE: case Type::SYMMETRIC: case Type::SYMMETRIC_HORIZ: case Type::SYMMETRIC_VERT: @@ -334,6 +342,110 @@ void ConstraintBase::GenerateEquations(IdList *l, AddEq(l, (la->Div(lb))->Minus(exA), 0); return; } + + case Type::ARC_ARC_LEN_RATIO: { + EntityBase *arc1 = SK.GetEntity(entityA), + *arc2 = SK.GetEntity(entityB); + + // And get the arc1 radius, and the cosine of its angle + EntityBase *ao1 = SK.GetEntity(arc1->point[0]), + *as1 = SK.GetEntity(arc1->point[1]), + *af1 = SK.GetEntity(arc1->point[2]); + + ExprVector aos1 = (as1->PointGetExprs()).Minus(ao1->PointGetExprs()), + aof1 = (af1->PointGetExprs()).Minus(ao1->PointGetExprs()); + Expr *r1 = aof1.Magnitude(); + + ExprVector n1 = arc1->Normal()->NormalExprsN(); + ExprVector u1 = aos1.WithMagnitude(Expr::From(1.0)); + ExprVector v1 = n1.Cross(u1); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta1 = aof1.Dot(u1)->Div(r1); + Expr *sintheta1 = aof1.Dot(v1)->Div(r1); + + double thetas1, thetaf1, dtheta1; + arc1->ArcGetAngles(&thetas1, &thetaf1, &dtheta1); + Expr *theta1; + if(dtheta1 < 3*PI/4) { + theta1 = costheta1->ACos(); + } else if(dtheta1 < 5*PI/4) { + // As the angle crosses pi, cos theta1 is not invertible; + // so use the sine to stop blowing up + theta1 = Expr::From(PI)->Minus(sintheta1->ASin()); + } else { + theta1 = (Expr::From(2*PI))->Minus(costheta1->ACos()); + } + + // And get the arc2 radius, and the cosine of its angle + EntityBase *ao2 = SK.GetEntity(arc2->point[0]), + *as2 = SK.GetEntity(arc2->point[1]), + *af2 = SK.GetEntity(arc2->point[2]); + + ExprVector aos2 = (as2->PointGetExprs()).Minus(ao2->PointGetExprs()), + aof2 = (af2->PointGetExprs()).Minus(ao2->PointGetExprs()); + Expr *r2 = aof2.Magnitude(); + + ExprVector n2 = arc2->Normal()->NormalExprsN(); + ExprVector u2 = aos2.WithMagnitude(Expr::From(1.0)); + ExprVector v2 = n2.Cross(u2); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta2 = aof2.Dot(u2)->Div(r2); + Expr *sintheta2 = aof2.Dot(v2)->Div(r2); + + double thetas2, thetaf2, dtheta2; + arc2->ArcGetAngles(&thetas2, &thetaf2, &dtheta2); + Expr *theta2; + if(dtheta2 < 3*PI/4) { + theta2 = costheta2->ACos(); + } else if(dtheta2 < 5*PI/4) { + // As the angle crosses pi, cos theta2 is not invertible; + // so use the sine to stop blowing up + theta2 = Expr::From(PI)->Minus(sintheta2->ASin()); + } else { + theta2 = (Expr::From(2*PI))->Minus(costheta2->ACos()); + } + // And write the equation; (r1*theta1) / ( r2*theta2) = some ratio + AddEq(l, (r1->Times(theta1))->Div(r2->Times(theta2))->Minus(exA), 0); + return; + } + + case Type::ARC_LINE_LEN_RATIO: { + EntityBase *line = SK.GetEntity(entityA), + *arc1 = SK.GetEntity(entityB); + + Expr *ll = Distance(workplane, line->point[0], line->point[1]); + + // And get the arc1 radius, and the cosine of its angle + EntityBase *ao1 = SK.GetEntity(arc1->point[0]), + *as1 = SK.GetEntity(arc1->point[1]), + *af1 = SK.GetEntity(arc1->point[2]); + + ExprVector aos1 = (as1->PointGetExprs()).Minus(ao1->PointGetExprs()), + aof1 = (af1->PointGetExprs()).Minus(ao1->PointGetExprs()); + Expr *r1 = aof1.Magnitude(); + ExprVector n1 = arc1->Normal()->NormalExprsN(); + ExprVector u1 = aos1.WithMagnitude(Expr::From(1.0)); + ExprVector v1 = n1.Cross(u1); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta1 = aof1.Dot(u1)->Div(r1); + Expr *sintheta1 = aof1.Dot(v1)->Div(r1); + + double thetas1, thetaf1, dtheta1; + arc1->ArcGetAngles(&thetas1, &thetaf1, &dtheta1); + Expr *theta1; + if(dtheta1 < 3*PI/4) { + theta1 = costheta1->ACos(); + } else if(dtheta1 < 5*PI/4) { + // As the angle crosses pi, cos theta1 is not invertible; + // so use the sine to stop blowing up + theta1 = Expr::From(PI)->Minus(sintheta1->ASin()); + } else { + theta1 = (Expr::From(2*PI))->Minus(costheta1->ACos()); + } + // And write the equation; (r1*theta1) / ( length) = some ratio + AddEq(l, (r1->Times(theta1))->Div(ll)->Minus(exA), 0); + return; + } case Type::LENGTH_DIFFERENCE: { EntityBase *a = SK.GetEntity(entityA); @@ -343,7 +455,111 @@ void ConstraintBase::GenerateEquations(IdList *l, AddEq(l, (la->Minus(lb))->Minus(exA), 0); return; } - + + case Type::ARC_ARC_DIFFERENCE: { + EntityBase *arc1 = SK.GetEntity(entityA), + *arc2 = SK.GetEntity(entityB); + + // And get the arc1 radius, and the cosine of its angle + EntityBase *ao1 = SK.GetEntity(arc1->point[0]), + *as1 = SK.GetEntity(arc1->point[1]), + *af1 = SK.GetEntity(arc1->point[2]); + + ExprVector aos1 = (as1->PointGetExprs()).Minus(ao1->PointGetExprs()), + aof1 = (af1->PointGetExprs()).Minus(ao1->PointGetExprs()); + Expr *r1 = aof1.Magnitude(); + + ExprVector n1 = arc1->Normal()->NormalExprsN(); + ExprVector u1 = aos1.WithMagnitude(Expr::From(1.0)); + ExprVector v1 = n1.Cross(u1); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta1 = aof1.Dot(u1)->Div(r1); + Expr *sintheta1 = aof1.Dot(v1)->Div(r1); + + double thetas1, thetaf1, dtheta1; + arc1->ArcGetAngles(&thetas1, &thetaf1, &dtheta1); + Expr *theta1; + if(dtheta1 < 3*PI/4) { + theta1 = costheta1->ACos(); + } else if(dtheta1 < 5*PI/4) { + // As the angle crosses pi, cos theta1 is not invertible; + // so use the sine to stop blowing up + theta1 = Expr::From(PI)->Minus(sintheta1->ASin()); + } else { + theta1 = (Expr::From(2*PI))->Minus(costheta1->ACos()); + } + + // And get the arc2 radius, and the cosine of its angle + EntityBase *ao2 = SK.GetEntity(arc2->point[0]), + *as2 = SK.GetEntity(arc2->point[1]), + *af2 = SK.GetEntity(arc2->point[2]); + + ExprVector aos2 = (as2->PointGetExprs()).Minus(ao2->PointGetExprs()), + aof2 = (af2->PointGetExprs()).Minus(ao2->PointGetExprs()); + Expr *r2 = aof2.Magnitude(); + + ExprVector n2 = arc2->Normal()->NormalExprsN(); + ExprVector u2 = aos2.WithMagnitude(Expr::From(1.0)); + ExprVector v2 = n2.Cross(u2); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta2 = aof2.Dot(u2)->Div(r2); + Expr *sintheta2 = aof2.Dot(v2)->Div(r2); + + double thetas2, thetaf2, dtheta2; + arc2->ArcGetAngles(&thetas2, &thetaf2, &dtheta2); + Expr *theta2; + if(dtheta2 < 3*PI/4) { + theta2 = costheta2->ACos(); + } else if(dtheta2 < 5*PI/4) { + // As the angle crosses pi, cos theta2 is not invertible; + // so use the sine to stop blowing up + theta2 = Expr::From(PI)->Minus(sintheta2->ASin()); + } else { + theta2 = (Expr::From(2*PI))->Minus(costheta2->ACos()); + } + // And write the equation; (r1*theta1) - ( r2*theta2) = some difference + AddEq(l, (r1->Times(theta1))->Minus(r2->Times(theta2))->Minus(exA), 0); + return; + } + + case Type::ARC_LINE_DIFFERENCE: { + EntityBase *line = SK.GetEntity(entityA), + *arc1 = SK.GetEntity(entityB); + + Expr *ll = Distance(workplane, line->point[0], line->point[1]); + + // And get the arc1 radius, and the cosine of its angle + EntityBase *ao1 = SK.GetEntity(arc1->point[0]), + *as1 = SK.GetEntity(arc1->point[1]), + *af1 = SK.GetEntity(arc1->point[2]); + + ExprVector aos1 = (as1->PointGetExprs()).Minus(ao1->PointGetExprs()), + aof1 = (af1->PointGetExprs()).Minus(ao1->PointGetExprs()); + Expr *r1 = aof1.Magnitude(); + ExprVector n1 = arc1->Normal()->NormalExprsN(); + ExprVector u1 = aos1.WithMagnitude(Expr::From(1.0)); + ExprVector v1 = n1.Cross(u1); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta1 = aof1.Dot(u1)->Div(r1); + Expr *sintheta1 = aof1.Dot(v1)->Div(r1); + + double thetas1, thetaf1, dtheta1; + arc1->ArcGetAngles(&thetas1, &thetaf1, &dtheta1); + Expr *theta1; + if(dtheta1 < 3*PI/4) { + theta1 = costheta1->ACos(); + } else if(dtheta1 < 5*PI/4) { + // As the angle crosses pi, cos theta1 is not invertible; + // so use the sine to stop blowing up + theta1 = Expr::From(PI)->Minus(sintheta1->ASin()); + } else { + theta1 = (Expr::From(2*PI))->Minus(costheta1->ACos()); + } + // And write the equation; (r1*theta1) - ( length) = some difference + AddEq(l, (r1->Times(theta1))->Minus(ll)->Minus(exA), 0); + return; + } + case Type::DIAMETER: { EntityBase *circle = SK.GetEntity(entityA); Expr *r = circle->CircleGetRadiusExpr(); @@ -511,7 +727,7 @@ void ConstraintBase::GenerateEquations(IdList *l, } } return; - + case Type::SYMMETRIC: if(workplane == EntityBase::FREE_IN_3D) { EntityBase *plane = SK.GetEntity(entityA); diff --git a/src/drawconstraint.cpp b/src/drawconstraint.cpp index d6a6f3fbb..4952d3627 100644 --- a/src/drawconstraint.cpp +++ b/src/drawconstraint.cpp @@ -12,7 +12,7 @@ std::string Constraint::Label() const { std::string result; if(type == Type::ANGLE) { result = SS.DegreeToString(valA) + "°"; - } else if(type == Type::LENGTH_RATIO) { + } else if(type == Type::LENGTH_RATIO || type == Type::ARC_ARC_LEN_RATIO || type == Type::ARC_LINE_LEN_RATIO) { result = ssprintf("%.3f:1", valA); } else if(type == Type::COMMENT) { result = comment; @@ -1000,7 +1000,43 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } return; } + case Type::ARC_ARC_LEN_RATIO: + case Type::ARC_ARC_DIFFERENCE: { + Entity *circle = SK.GetEntity(entityA); + Vector center = SK.GetEntity(circle->point[0])->PointGetNum(); + Quaternion q = SK.GetEntity(circle->normal)->NormalGetNum(); + Vector n = q.RotationN().WithMagnitude(1); + double r = circle->CircleGetRadiusNum(); + Vector ref2; + DoEqualRadiusTicks(canvas, hcs, entityA, &ref2); + DoEqualRadiusTicks(canvas, hcs, entityB, &ref2); + + Vector ref = center.Plus(disp.offset); + // Force the label into the same plane as the circle. + ref = ref.Minus(n.ScaledBy(n.Dot(ref) - n.Dot(center))); + if(refs) refs->push_back(ref); + Vector topLeft; + DoLabel(canvas, hcs, ref, &topLeft, gr, gu); + if(labelPos) *labelPos = topLeft; + return; + } + case Type::ARC_LINE_LEN_RATIO: + case Type::ARC_LINE_DIFFERENCE: { + Vector a, b = Vector::From(0, 0, 0); + Vector ref; + Entity *e = SK.GetEntity(entityA); + a = SK.GetEntity(e->point[0])->PointGetNum(); + b = SK.GetEntity(e->point[1])->PointGetNum(); + DoEqualLenTicks(canvas, hcs, a, b, gn, &ref); + if(refs) refs->push_back(ref); + DoEqualRadiusTicks(canvas, hcs, entityB, &ref); + if(refs) refs->push_back(ref); + ref = ((a.Plus(b)).ScaledBy(0.5)).Plus(disp.offset); + DoLabel(canvas, hcs, ref, labelPos, gr, gu); + return; + } + case Type::EQ_LEN_PT_LINE_D: { Entity *forLen = SK.GetEntity(entityA); Vector a = SK.GetEntity(forLen->point[0])->PointGetNum(), @@ -1243,7 +1279,11 @@ bool Constraint::HasLabel() const { case Type::PT_FACE_DISTANCE: case Type::PROJ_PT_DISTANCE: case Type::LENGTH_RATIO: + case Type::ARC_ARC_LEN_RATIO: + case Type::ARC_LINE_LEN_RATIO: case Type::LENGTH_DIFFERENCE: + case Type::ARC_ARC_DIFFERENCE: + case Type::ARC_LINE_DIFFERENCE: case Type::DIAMETER: case Type::ANGLE: return true; diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 5422a5796..0b8fb64f2 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -153,8 +153,8 @@ const MenuEntry Menu[] = { { 1, NULL, Command::NONE, 0, KN, NULL }, { 1, N_("&On Point / Curve / Plane"), Command::ON_ENTITY, 'o', KN, mCon }, { 1, N_("E&qual Length / Radius / Angle"), Command::EQUAL, 'q', KN, mCon }, -{ 1, N_("Length Ra&tio"), Command::RATIO, 'z', KN, mCon }, -{ 1, N_("Length Diff&erence"), Command::DIFFERENCE, 'j', KN, mCon }, +{ 1, N_("Length / Arc Ra&tio"), Command::RATIO, 'z', KN, mCon }, +{ 1, N_("Length / Arc Diff&erence"), Command::DIFFERENCE, 'j', KN, mCon }, { 1, N_("At &Midpoint"), Command::AT_MIDPOINT, 'm', KN, mCon }, { 1, N_("S&ymmetric"), Command::SYMMETRIC, 'y', KN, mCon }, { 1, N_("Para&llel / Tangent"), Command::PARALLEL, 'l', KN, mCon }, diff --git a/src/lib.cpp b/src/lib.cpp index b0d8e1d6c..9da18b047 100644 --- a/src/lib.cpp +++ b/src/lib.cpp @@ -131,11 +131,15 @@ case SLVS_C_PT_ON_LINE: t = Constraint::Type::PT_ON_LINE; break; case SLVS_C_PT_ON_FACE: t = Constraint::Type::PT_ON_FACE; break; case SLVS_C_EQUAL_LENGTH_LINES: t = Constraint::Type::EQUAL_LENGTH_LINES; break; case SLVS_C_LENGTH_RATIO: t = Constraint::Type::LENGTH_RATIO; break; +case SLVS_C_ARC_ARC_LEN_RATIO: t = Constraint::Type::ARC_ARC_LEN_RATIO; break; +case SLVS_C_ARC_LINE_LEN_RATIO: t = Constraint::Type::ARC_LINE_LEN_RATIO; break; case SLVS_C_EQ_LEN_PT_LINE_D: t = Constraint::Type::EQ_LEN_PT_LINE_D; break; case SLVS_C_EQ_PT_LN_DISTANCES: t = Constraint::Type::EQ_PT_LN_DISTANCES; break; case SLVS_C_EQUAL_ANGLE: t = Constraint::Type::EQUAL_ANGLE; break; case SLVS_C_EQUAL_LINE_ARC_LEN: t = Constraint::Type::EQUAL_LINE_ARC_LEN; break; case SLVS_C_LENGTH_DIFFERENCE: t = Constraint::Type::LENGTH_DIFFERENCE; break; +case SLVS_C_ARC_ARC_DIFFERENCE: t = Constraint::Type::ARC_ARC_DIFFERENCE; break; +case SLVS_C_ARC_LINE_DIFFERENCE:t = Constraint::Type::ARC_LINE_DIFFERENCE; break; case SLVS_C_SYMMETRIC: t = Constraint::Type::SYMMETRIC; break; case SLVS_C_SYMMETRIC_HORIZ: t = Constraint::Type::SYMMETRIC_HORIZ; break; case SLVS_C_SYMMETRIC_VERT: t = Constraint::Type::SYMMETRIC_VERT; break; diff --git a/src/mouse.cpp b/src/mouse.cpp index 2e1c75a86..a88d34f8c 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -1373,7 +1373,7 @@ void GraphicsWindow::EditConstraint(hConstraint constraint) { value /= 2; // Try showing value with default number of digits after decimal first. - if(c->type == Constraint::Type::LENGTH_RATIO) { + if(c->type == Constraint::Type::LENGTH_RATIO || c->type == Constraint::Type::ARC_ARC_LEN_RATIO || c->type == Constraint::Type::ARC_LINE_LEN_RATIO) { editValue = ssprintf("%.3f", value); } else if(c->type == Constraint::Type::ANGLE) { editValue = SS.DegreeToString(value); @@ -1434,7 +1434,9 @@ void GraphicsWindow::EditControlDone(const std::string &s) { case Constraint::Type::PT_LINE_DISTANCE: case Constraint::Type::PT_FACE_DISTANCE: case Constraint::Type::PT_PLANE_DISTANCE: - case Constraint::Type::LENGTH_DIFFERENCE: { + case Constraint::Type::LENGTH_DIFFERENCE: + case Constraint::Type::ARC_ARC_DIFFERENCE: + case Constraint::Type::ARC_LINE_DIFFERENCE: { // The sign is not displayed to the user, but this is a signed // distance internally. To flip the sign, the user enters a // negative distance. @@ -1448,6 +1450,8 @@ void GraphicsWindow::EditControlDone(const std::string &s) { } case Constraint::Type::ANGLE: case Constraint::Type::LENGTH_RATIO: + case Constraint::Type::ARC_ARC_LEN_RATIO: + case Constraint::Type::ARC_LINE_LEN_RATIO: // These don't get the units conversion for distance, and // they're always positive c->valA = fabs(e->Eval()); diff --git a/src/sketch.h b/src/sketch.h index 0aa75988b..9f73a32a2 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -676,7 +676,10 @@ class ConstraintBase { CURVE_CURVE_TANGENT = 125, EQUAL_RADIUS = 130, WHERE_DRAGGED = 200, - + ARC_ARC_LEN_RATIO = 210, + ARC_LINE_LEN_RATIO = 211, + ARC_ARC_DIFFERENCE = 212, + ARC_LINE_DIFFERENCE = 213, COMMENT = 1000 }; diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 4e458cf48..0f0a0ec98 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -764,7 +764,11 @@ void SolveSpaceUI::MenuAnalyze(Command id) { SS.TW.stepDim.isDistance = (c->type != Constraint::Type::ANGLE) && (c->type != Constraint::Type::LENGTH_RATIO) && - (c->type != Constraint::Type::LENGTH_DIFFERENCE); + (c->type != Constraint::Type::ARC_ARC_LEN_RATIO) && + (c->type != Constraint::Type::ARC_LINE_LEN_RATIO) && + (c->type != Constraint::Type::LENGTH_DIFFERENCE) && + (c->type != Constraint::Type::ARC_ARC_DIFFERENCE) && + (c->type != Constraint::Type::ARC_LINE_DIFFERENCE) ; SS.TW.shown.constraint = c->h; SS.TW.shown.screen = TextWindow::Screen::STEP_DIMENSION; From 8618b05321f49125c4c0688b7d3d052aa06f7a67 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 30 Jun 2021 21:21:45 -0400 Subject: [PATCH 308/646] Update CHANGELOG.md Add some post 3.0 improvements --- CHANGELOG.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c21b5d9a7..de3d2f53d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,27 @@ Changelog ========= +3.x - since the 3.0 release, only available in edge builds +--- + +New Constraints: + +* Arc-length ratio and difference. +* Arc & line lenfth ratio and difference. + +Sketching: + +* Allow a point and normal to define sketch-in-new-workplane +* update property browser live while dragging the sketch + +MISC: + +* When linking ciruit boards (IDF .emn files) show keepout regions as construction entites. + +Performance: + +* more changes to the ID list implementation + 3.0 --- From 4609a8466b39caa0ff36814d9d9f39d8229e67ea Mon Sep 17 00:00:00 2001 From: app4soft Date: Thu, 1 Jul 2021 13:06:33 +0300 Subject: [PATCH 309/646] Update CHANGELOG.md Fix typo --- CHANGELOG.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de3d2f53d..8532370ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,21 +6,21 @@ Changelog New Constraints: -* Arc-length ratio and difference. -* Arc & line lenfth ratio and difference. +* Arcs length ratio and difference. +* Arc & Line length ratio and difference. Sketching: -* Allow a point and normal to define sketch-in-new-workplane -* update property browser live while dragging the sketch +* Allow use of Point & Normal to define "sketch-in-new-workplane". +* Update "Property Browser" live while dragging the sketch. MISC: -* When linking ciruit boards (IDF .emn files) show keepout regions as construction entites. +* When linking circuit boards (IDF .emn files) show keepout regions as construction entites. Performance: -* more changes to the ID list implementation +* More changes to the ID list implementation. 3.0 --- From 2898f2dc01077ce5ec22b40123139e94533b25e5 Mon Sep 17 00:00:00 2001 From: luz paz Date: Mon, 5 Jul 2021 12:29:14 -0400 Subject: [PATCH 310/646] Fix various typos Found via `codespell -q 3 -S ./res/locales,./extlib -L asign,ba,hsi,mata,tothe` --- CHANGELOG.md | 2 +- developer_docs/IdLists_Entities_and_Remap.txt | 16 ++++++++-------- developer_docs/Solver_Transforms.txt | 4 ++-- src/clipboard.cpp | 2 +- src/graphicswin.cpp | 2 +- src/importidf.cpp | 6 +++--- src/platform/guiwin.cpp | 2 +- src/solvespace.cpp | 2 +- src/srf/boolean.cpp | 4 ++-- src/srf/curve.cpp | 2 +- src/srf/triangulate.cpp | 8 ++++---- src/textscreens.cpp | 2 +- src/textwin.cpp | 4 ++-- 13 files changed, 28 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8532370ce..e2e22b4b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ Sketching: MISC: -* When linking circuit boards (IDF .emn files) show keepout regions as construction entites. +* When linking circuit boards (IDF .emn files) show keepout regions as construction entities. Performance: diff --git a/developer_docs/IdLists_Entities_and_Remap.txt b/developer_docs/IdLists_Entities_and_Remap.txt index 03ea9d7f3..5fe17916e 100644 --- a/developer_docs/IdLists_Entities_and_Remap.txt +++ b/developer_docs/IdLists_Entities_and_Remap.txt @@ -9,25 +9,25 @@ by pointers from the entity (font, extra points, etc...) Entities in a sketch are kept in a global array (IdList) referenced by a unique Id (handle) and can be looked up by Id in log(n) time via binary search. In -order to use binary seach the array must be kept in order sorted by Id. One +order to use binary search the array must be kept in order sorted by Id. One problem is that insertion takes O(n) time because half the list (on average) must be shifted to make room for a new item. -The IdList class is a template and is used for more than entites. +The IdList class is a template and is used for more than entities. EntityMap: ========== Another important structure is the EntityMap and EntityKey defined in sketch.h This is what allows SovleSpace to update groups when earlier groups in the sketch are changed. If a rectangle is extruded to a box and items are -constrained to entites on that box, the user can go back to the sketch and -modify it. Entites can be added, modified an even deleted. So long as the -entites that are later used to build upon are kept the later extrude group will +constrained to entities on that box, the user can go back to the sketch and +modify it. Entities can be added, modified an even deleted. So long as the +entities that are later used to build upon are kept the later extrude group will pick up the changes from the 2D sketch and anything build on it will remain. The way this works is that each group has a member called remap, which is one of these maps. This is where my understanding is fuzzy. At the end of Group.cpp is -a function called Group::CopyEntity() which is used to make new sketch entites +a function called Group::CopyEntity() which is used to make new sketch entities when a group is created. These are generally copies of entities in the previous group, but there are exceptions. A point will be used to generate a line when extruding a 2D sketch. A point will also be "copied" to a circle for a Lathe @@ -35,7 +35,7 @@ group. For this reason, the entity key is derived by combining its previous key with something often called the CopyNumber or just remap (unfortunate). When a group is regenerated (the first time, or after a previous one is -modified) entites are copied from the old group to the new one. For Step +modified) entities are copied from the old group to the new one. For Step Translating and Rotating there may be many copies, and the copy number is literally N for the Nth copy except for the last one which gets an enum - it is common to constrain the last item, so it gets a large unique number so that @@ -45,5 +45,5 @@ Remap that was created the same way. This is how constructions are preserved across underlying changes. There are some hard limits used in the hash table for the remap mechanism which -limit the number of entites in a group (but not the global sketch). +limit the number of entities in a group (but not the global sketch). diff --git a/developer_docs/Solver_Transforms.txt b/developer_docs/Solver_Transforms.txt index 1ea3ae5f2..98300f8b1 100644 --- a/developer_docs/Solver_Transforms.txt +++ b/developer_docs/Solver_Transforms.txt @@ -46,7 +46,7 @@ POINT_N_ROT_TRANS: Rotates a point via quaternion param[3],param[4],param[5],par POINT_N_COPY: A non-transformed copy of a point - numeric copy? -POINT_N_ROT_AA: A point rotated arount point param[0],param[1],param[2] Where the +POINT_N_ROT_AA: A point rotated around point param[0],param[1],param[2] Where the angle is given by param[3]*timesApplied (times 2?) and the axis of rotation defined by param[4],param[5],param[6] @@ -130,7 +130,7 @@ the entity itself. The ForceTo() functions are shortcuts for using the solver. They are passed the desired location of a point (or orientation of a normal...) and have the opportunity to back-calculate what the group parameters should be to place it there. This is -used for mouse dragging of copied entites. It is notable that the constraints will +used for mouse dragging of copied entities. It is notable that the constraints will still be applied afterward, but this is a good shortcut. When creating a new entity transformation, the first thing to do is define the diff --git a/src/clipboard.cpp b/src/clipboard.cpp index 962650088..69a624c37 100644 --- a/src/clipboard.cpp +++ b/src/clipboard.cpp @@ -281,7 +281,7 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { } case Constraint::Type::HORIZONTAL: case Constraint::Type::VERTICAL: - // When rotating 90 or 270 degrees, swap the vertical / horizontal constaints + // When rotating 90 or 270 degrees, swap the vertical / horizontal constraints if (EXACT(fmod(theta + (PI/2), PI) == 0)) { if(c.type == Constraint::Type::HORIZONTAL) { c.type = Constraint::Type::VERTICAL; diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 0b8fb64f2..16846d256 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -370,7 +370,7 @@ static void PopulateMenuWithPathnames(Platform::MenuRef menu, void GraphicsWindow::PopulateRecentFiles() { PopulateMenuWithPathnames(openRecentMenu, SS.recentFiles, [](const Platform::Path &path) { // OkayToStartNewFile could mutate recentFiles, which will invalidate path (which is a - // refererence into the recentFiles vector), so take a copy of it here. + // reference into the recentFiles vector), so take a copy of it here. Platform::Path pathCopy(path); if(!SS.OkayToStartNewFile()) return; SS.Load(pathCopy); diff --git a/src/importidf.cpp b/src/importidf.cpp index 101feff1e..8ca3432a5 100644 --- a/src/importidf.cpp +++ b/src/importidf.cpp @@ -54,7 +54,7 @@ static std::vector splitString(const std::string line) { } ////////////////////////////////////////////////////////////////////////////// -// Functions for linking an IDF file - we need to create entites that +// Functions for linking an IDF file - we need to create entities that // get remapped into a linked group similar to linking .slvs files ////////////////////////////////////////////////////////////////////////////// @@ -291,9 +291,9 @@ static void MakeBeziersForArcs(SBezierList *sbl, Vector center, Vector pa, Vecto namespace SolveSpace { // Here we read the important section of an IDF file. SolveSpace Entities are directly created by -// the funcions above, which is only OK because of the way linking works. For example points do +// the functions above, which is only OK because of the way linking works. For example points do // not have handles for solver parameters (coordinates), they only have their actPoint values -// set (or actNormal or actDistance). These are incompete entites and would be a problem if +// set (or actNormal or actDistance). These are incomplete entities and would be a problem if // they were part of the sketch, but they are not. After making a list of them here, a new group // gets created from copies of these. Those copies are complete and part of the sketch group. bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *sh) { diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index e98e87388..ba9e18cf6 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1229,7 +1229,7 @@ class WindowImplWin32 final : public Window { sscheck(GetMonitorInfo(MonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST), &mi)); // If it somehow ended up off-screen, then put it back. - // and make it visible by at least this portion of the scrren + // and make it visible by at least this portion of the screen const LONG movein = 40; RECT mrc = mi.rcMonitor; diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 0f0a0ec98..ccea271a0 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -349,7 +349,7 @@ static const char *DimToString(int dim) { } static std::pair SelectSIPrefixMm(int ord, int dim) { // decide what units to use depending on the order of magnitude of the -// measure in meters and the dimmension (1,2,3 lenear, area, volume) +// measure in meters and the dimension (1,2,3 lenear, area, volume) switch(dim) { case 0: case 1: diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 4586cb58a..7700e1b65 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -29,7 +29,7 @@ void SCurve::GetAxisAlignedBounding(Vector *ptMax, Vector *ptMin) const { } } -// We will be inserting other curve verticies into our curves to split them. +// We will be inserting other curve vertices into our curves to split them. // This is helpful when curved surfaces become tangent along a trim and the // usual tests for curve-surface intersection don't split the curve at a vertex. // This is faster than the previous version that split at surface corners and @@ -796,7 +796,7 @@ void SShell::MakeFromBoolean(SShell *a, SShell *b, SSurface::CombineAs type) { b->MakeClassifyingBsps(NULL); // Copy over all the original curves, splitting them so that a - // piecwise linear segment never crosses a surface from the other + // piecewise linear segment never crosses a surface from the other // shell. a->CopyCurvesSplitAgainst(/*opA=*/true, b, this); b->CopyCurvesSplitAgainst(/*opA=*/false, a, this); diff --git a/src/srf/curve.cpp b/src/srf/curve.cpp index 55496b670..382415b17 100644 --- a/src/srf/curve.cpp +++ b/src/srf/curve.cpp @@ -817,7 +817,7 @@ void SCurve::RemoveShortSegments(SSurface *srfA, SSurface *srfB) { continue; } - // if the curve is exact and points are >0.05 appart wrt t, point is there + // if the curve is exact and points are >0.05 apart wrt t, point is there // deliberately regardless of chord tolerance (ex: small circles) tprev = t = tnext = 0; if (isExact) { diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index d02f96380..464bce624 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -426,7 +426,7 @@ void SContour::UvTriangulateInto(SMesh *m, SSurface *srf) { if (i == l.n-1) { end = true; } - if (end) { // triangulate the fan and tag the verticies + if (end) { // triangulate the fan and tag the vertices if (j > 3) { Vector center = l[pstart+1].p.Plus(l[pstart+j-1].p).ScaledBy(0.5); for (int x=0; xMakeTriangulationGridInto(&lj, 0, 1, /*swapped=*/false, 0); // force 2nd order grid to have at least 4 segments in each direction - if ((li.n < 5) && (srf->degm>1)) { // 4 segments minimun + if ((li.n < 5) && (srf->degm>1)) { // 4 segments minimum li.Clear(); li.Add(&v[0]);li.Add(&v[1]);li.Add(&v[2]);li.Add(&v[3]);li.Add(&v[4]); } - if ((lj.n < 5) && (srf->degn>1)) { // 4 segments minimun + if ((lj.n < 5) && (srf->degn>1)) { // 4 segments minimum lj.Clear(); lj.Add(&v[0]);lj.Add(&v[1]);lj.Add(&v[2]);lj.Add(&v[3]);lj.Add(&v[4]); } @@ -681,7 +681,7 @@ void SPolygon::UvGridTriangulateInto(SMesh *mesh, SSurface *srf) { if (!bottom[j]) // add our own bottom edge holes.AddEdge(a, b); } else { - if (prev_flag) // add our left neighbots right edge + if (prev_flag) // add our left neighbors right edge holes.AddEdge(a, d); if (bottom[j]) // add our bottom neighbors top edge holes.AddEdge(b, a); diff --git a/src/textscreens.cpp b/src/textscreens.cpp index 07d5cdeea..884d963d3 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -579,7 +579,7 @@ void TextWindow::ShowGroupSolveInfo() { } if(g->solved.timeout) { - Printf(true, "%FxSome items in list have been ommitted%Fd"); + Printf(true, "%FxSome items in list have been omitted%Fd"); Printf(false, "%Fxbecause the operation timed out.%Fd"); } diff --git a/src/textwin.cpp b/src/textwin.cpp index 3e3392261..599844ccf 100644 --- a/src/textwin.cpp +++ b/src/textwin.cpp @@ -348,8 +348,8 @@ void TextWindow::ClearScreen() { rows = 0; } -// This message was addded when someone had too many fonts for the text window -// Scrolling seemed to be broken, but was actaully at the MAX_ROWS. +// This message was added when someone had too many fonts for the text window +// Scrolling seemed to be broken, but was actually at the MAX_ROWS. static const char* endString = " **** End of Text Screen ****"; void TextWindow::Printf(bool halfLine, const char *fmt, ...) { From df167d925cabb0c91e18bf2bef80188d6f0f9afe Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 17 Jul 2021 18:38:57 -0400 Subject: [PATCH 311/646] Update CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2e22b4b7..3df5b20bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,11 @@ Changelog 3.x - since the 3.0 release, only available in edge builds --- -New Constraints: +Constraints: * Arcs length ratio and difference. * Arc & Line length ratio and difference. +* Allow comments to be associated with point entities. Sketching: From c6e4eb1bdf1336118953fe9f7abc853bcee9ecc4 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 1 Oct 2020 00:05:33 -0400 Subject: [PATCH 312/646] Add STL linking with bounding box and edge verticies. Experimental. --- src/CMakeLists.txt | 1 + src/file.cpp | 4 +- src/importmesh.cpp | 222 +++++++++++++++++++++++++++++++++++++++++++ src/platform/gui.cpp | 1 + src/solvespace.h | 1 + 5 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 src/importmesh.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5ac7b41d0..ec39939ce 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -176,6 +176,7 @@ set(solvespace_core_SOURCES groupmesh.cpp importdxf.cpp importidf.cpp + importmesh.cpp mesh.cpp modify.cpp mouse.cpp diff --git a/src/file.cpp b/src/file.cpp index 4e3b50d38..c8989728f 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -710,7 +710,9 @@ bool SolveSpaceUI::LoadEntitiesFromFile(const Platform::Path &filename, EntityLi SMesh *m, SShell *sh) { if(strcmp(filename.Extension().c_str(), "emn")==0) { - return LinkIDF(filename, le, m, sh); + return LinkIDF(filename, le, m, sh); + } else if(strcmp(filename.Extension().c_str(), "stl")==0) { + return LinkStl(filename, le, m, sh); } else { return LoadEntitiesFromSlvs(filename, le, m, sh); } diff --git a/src/importmesh.cpp b/src/importmesh.cpp new file mode 100644 index 000000000..211517531 --- /dev/null +++ b/src/importmesh.cpp @@ -0,0 +1,222 @@ +//----------------------------------------------------------------------------- +// Triangle mesh file reader. Reads an STL file triangle mesh and creates +// a SovleSpace SMesh from it. Supports only Linking, not import. +// +// Copyright 2020 Paul Kahler. +//----------------------------------------------------------------------------- +#include "solvespace.h" +#include "sketch.h" +#include + +#define MIN_POINT_DISTANCE 0.001 + +// we will check for duplicate verticies and keep all their normals +class vertex { +public: + Vector p; + std::vector normal; +}; + +static bool isEdgeVertex(vertex &v) { + unsigned int i,j; + bool result = false; + for(i=0;i &lv, Vector &p, Vector &n) { + unsigned int i; + for(i=0; iAdd(&en); + return en.h; +} + +// 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); + } +} + +static hEntity newLine(EntityList *el, int id, hEntity p0, hEntity p1) { + Entity en = {}; + en.type = Entity::Type::LINE_SEGMENT; + en.point[0] = p0; + en.point[1] = p1; + en.extraPoints = 0; + en.timesApplied = 0; + en.group.v = 493; + en.construction = true; + en.style.v = Style::CONSTRUCTION; + en.actVisible = true; + en.forceHidden = false; + + en.h.v = id + en.group.v*65536; + el->Add(&en); + return en.h; +} + +namespace SolveSpace { + +bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *sh) { + dbp("\nLink STL triangle mesh."); + el->Clear(); + std::string data; + if(!ReadFile(filename, &data)) { + Error("Couldn't read from '%s'", filename.raw.c_str()); + return false; + } + + std::stringstream f(data); + + char str[80] = {}; + f.read(str, 80); + + uint32_t n; + uint32_t color; + + f.read((char*)&n, 4); + dbp("%d triangles", n); + + float x,y,z; + float xn,yn,zn; + + //add the STL origin as an entity + addVertex(el, Vector::From(0.0, 0.0, 0.0)); + + std::vector verts = {}; + + for(uint32_t i = 0; i> 7) & 0xf8; + tr.meta.color.green = (color >> 2) & 0xf8; + tr.meta.color.blue = (color << 3); + tr.meta.color.alpha = 255; + } else { + tr.meta.color.red = 90; + tr.meta.color.green = 120; + tr.meta.color.blue = 140; + tr.meta.color.alpha = 255; + } + + m->AddTriangle(&tr); + Vector normal = tr.Normal().WithMagnitude(1.0); + addUnique(verts, tr.a, normal); + addUnique(verts, tr.b, normal); + addUnique(verts, tr.c, normal); + } + SK.GetGroup(SS.GW.activeGroup)->forceToMesh = true; + dbp("%d verticies", verts.size()); + + BBox box = {}; + box.minp = verts[0].p; + box.maxp = verts[0].p; + + // determine the bounding box for all vertexes + for(unsigned int i=1; in+2; + p[0] = newPoint(el, id++, Vector::From(box.minp.x, box.minp.y, box.minp.z)); + p[1] = newPoint(el, id++, Vector::From(box.maxp.x, box.minp.y, box.minp.z)); + p[2] = newPoint(el, id++, Vector::From(box.minp.x, box.maxp.y, box.minp.z)); + p[3] = newPoint(el, id++, Vector::From(box.maxp.x, box.maxp.y, box.minp.z)); + p[4] = newPoint(el, id++, Vector::From(box.minp.x, box.minp.y, box.maxp.z)); + p[5] = newPoint(el, id++, Vector::From(box.maxp.x, box.minp.y, box.maxp.z)); + p[6] = newPoint(el, id++, Vector::From(box.minp.x, box.maxp.y, box.maxp.z)); + p[7] = newPoint(el, id++, Vector::From(box.maxp.x, box.maxp.y, box.maxp.z)); + + 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[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 SolveSpaceModelFileFilters = { std::vector SolveSpaceLinkFileFilters = { { CN_("file-type", "SolveSpace models"), { "slvs" } }, { CN_("file-type", "IDF circuit board"), { "emn" } }, + { CN_("file-type", "STL triangle mesh"), { "stl" } }, }; std::vector RasterFileFilters = { diff --git a/src/solvespace.h b/src/solvespace.h index e64a1ab86..d4caab2b8 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -812,6 +812,7 @@ class SolveSpaceUI { void ImportDxf(const Platform::Path &file); void ImportDwg(const Platform::Path &file); bool LinkIDF(const Platform::Path &filename, EntityList *le, SMesh *m, SShell *sh); +bool LinkStl(const Platform::Path &filename, EntityList *le, SMesh *m, SShell *sh); extern SolveSpaceUI SS; extern Sketch SK; From 4aa4245969acbdc482d60bacd142c8e320d78a86 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 28 Jul 2021 21:01:46 -0400 Subject: [PATCH 313/646] Add an ALL filter for linking files that includes slvs, emn, and stl --- src/platform/gui.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform/gui.cpp b/src/platform/gui.cpp index a685e8663..0c9637ff4 100644 --- a/src/platform/gui.cpp +++ b/src/platform/gui.cpp @@ -86,6 +86,7 @@ std::vector SolveSpaceModelFileFilters = { }; std::vector SolveSpaceLinkFileFilters = { + { CN_("file-type", "ALL"), { "slvs", "emn", "stl" } }, { CN_("file-type", "SolveSpace models"), { "slvs" } }, { CN_("file-type", "IDF circuit board"), { "emn" } }, { CN_("file-type", "STL triangle mesh"), { "stl" } }, From 88ee7a02430c52144ba307c09f3cd55170d785b5 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 24 Jul 2021 21:55:54 -0400 Subject: [PATCH 314/646] Add optional helix pitch constraint. --- src/group.cpp | 6 ++++++ src/textscreens.cpp | 46 +++++++++++++++++++++++++++++++++++++++++++++ src/ui.h | 6 +++++- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/src/group.cpp b/src/group.cpp index 0f4580459..438d5108c 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -813,6 +813,12 @@ void Group::GenerateEquations(IdList *l) { AddEq(l, (EC(axis.z))->Minus(EP(6)), 5); #undef EC #undef EP + if(type == Type::HELIX) { + if(valB != 0.0) { + AddEq(l, Expr::From(h.param(7))->Times(Expr::From(PI))-> + Minus(Expr::From(h.param(3))->Times(Expr::From(valB))), 6); + } + } } else if(type == Type::EXTRUDE) { if(predef.entityB != Entity::FREE_IN_3D) { // The extrusion path is locked along a line, normal to the diff --git a/src/textscreens.cpp b/src/textscreens.cpp index 884d963d3..ee6d90eac 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -299,6 +299,23 @@ void TextWindow::ScreenChangeGroupScale(int link, uint32_t v) { SS.TW.edit.meaning = Edit::GROUP_SCALE; SS.TW.edit.group.v = v; } +void TextWindow::ScreenChangeHelixPitch(int link, uint32_t v) { + Group *g = SK.GetGroup(SS.TW.shown.group); + double pitch = g->valB/SS.MmPerUnit(); + SS.TW.ShowEditControl(3, ssprintf("%.8f", pitch)); + SS.TW.edit.meaning = Edit::HELIX_PITCH; + SS.TW.edit.group.v = v; +} +void TextWindow::ScreenChangePitchOption(int link, uint32_t v) { + Group *g = SK.GetGroup(SS.TW.shown.group); + if(g->valB == 0.0) { + g->valB = SK.GetParam(g->h.param(7))->val * PI / + (SK.GetParam(g->h.param(3))->val); + } else { + g->valB = 0.0; + } + SS.GW.Invalidate(); +} void TextWindow::ScreenDeleteGroup(int link, uint32_t v) { SS.UndoRemember(); @@ -398,6 +415,26 @@ void TextWindow::ShowGroupInfo() { } Printf(false, ""); + if(g->type == Group::Type::HELIX) { + Printf(false, "%Ft pitch - length per turn%E"); + + if (fabs(g->valB) != 0.0) { + Printf(false, " %Ba %# %Fl%Ll%f%D[change]%E", + g->valB / SS.MmPerUnit(), + &TextWindow::ScreenChangeHelixPitch, g->h.v); + } else { + Printf(false, " %Ba %# %E", + SK.GetParam(g->h.param(7))->val * PI / + ( (SK.GetParam(g->h.param(3))->val) * SS.MmPerUnit() ), + &TextWindow::ScreenChangeHelixPitch, g->h.v); + } + Printf(false, " %Fd%f%LP%s fixed", + &TextWindow::ScreenChangePitchOption, + g->valB != 0 ? CHECK_TRUE : CHECK_FALSE); + + Printf(false, ""); // blank line + } + if(g->type == Group::Type::EXTRUDE || g->type == Group::Type::LATHE || g->type == Group::Type::REVOLVE || g->type == Group::Type::LINKED || g->type == Group::Type::HELIX) { @@ -789,6 +826,15 @@ void TextWindow::EditControlDone(std::string s) { } break; + case Edit::HELIX_PITCH: // stored in valB + if(Expr *e = Expr::From(s, /*popUpError=*/true)) { + double ev = e->Eval(); + Group *g = SK.GetGroup(edit.group); + g->valB = ev * SS.MmPerUnit(); + SS.MarkGroupDirty(g->h); + } + break; + case Edit::GROUP_COLOR: { Vector rgb; if(sscanf(s.c_str(), "%lf, %lf, %lf", &rgb.x, &rgb.y, &rgb.z)==3) { diff --git a/src/ui.h b/src/ui.h index 026d57de7..359ad4014 100644 --- a/src/ui.h +++ b/src/ui.h @@ -342,7 +342,9 @@ class TextWindow { VIEW_PROJ_RIGHT = 702, VIEW_PROJ_UP = 703, // For tangent arc - TANGENT_ARC_RADIUS = 800 + TANGENT_ARC_RADIUS = 800, + // For helix pitch + HELIX_PITCH = 802 }; struct { bool showAgain; @@ -473,6 +475,8 @@ class TextWindow { static void ScreenChangeExprA(int link, uint32_t v); static void ScreenChangeGroupName(int link, uint32_t v); static void ScreenChangeGroupScale(int link, uint32_t v); + static void ScreenChangeHelixPitch(int link, uint32_t v); + static void ScreenChangePitchOption(int link, uint32_t v); static void ScreenChangeLightDirection(int link, uint32_t v); static void ScreenChangeLightIntensity(int link, uint32_t v); static void ScreenChangeLightAmbient(int link, uint32_t v); From e47e5daf04de3a76eaab875d5bfc951b1f740d94 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 31 Jul 2021 13:22:40 -0400 Subject: [PATCH 315/646] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3df5b20bb..2bba8defd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,11 +12,13 @@ Constraints: Sketching: +* Added an optional "pitch" parameter to helix extrusions (in the text window) * Allow use of Point & Normal to define "sketch-in-new-workplane". * Update "Property Browser" live while dragging the sketch. MISC: +* Added the ability to Link STL files. * When linking circuit boards (IDF .emn files) show keepout regions as construction entities. Performance: From 3417f98ab85ee176ee175c7a613c782ee8a3f3fd Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Sun, 1 Aug 2021 11:34:55 +0100 Subject: [PATCH 316/646] Don't reset showFaces every time a group is activated Instead store the state separately for drawing and non-drawing group types, and set showFaces to one of those, whenever a group is activated. --- src/graphicswin.cpp | 10 ++++++++++ src/group.cpp | 7 +++---- src/ui.h | 2 ++ 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 16846d256..84e83d6f3 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -407,6 +407,8 @@ void GraphicsWindow::Init() { showEdges = true; showMesh = false; showOutlines = false; + showFacesDrawing = false; + showFacesNonDrawing = true; drawOccludedAs = DrawOccludedAs::INVISIBLE; showTextWindow = true; @@ -1366,6 +1368,14 @@ void GraphicsWindow::ToggleBool(bool *v) { SS.GenerateAll(SolveSpaceUI::Generate::UNTIL_ACTIVE); } + if(v == &showFaces) { + if(g->type == Group::Type::DRAWING_WORKPLANE || g->type == Group::Type::DRAWING_3D) { + showFacesDrawing = showFaces; + } else { + showFacesNonDrawing = showFaces; + } + } + Invalidate(/*clearPersistent=*/true); SS.ScheduleShowTW(); } diff --git a/src/group.cpp b/src/group.cpp index 438d5108c..1fcbdedab 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -416,11 +416,10 @@ std::string Group::DescriptionString() { } void Group::Activate() { - if(type == Type::EXTRUDE || type == Type::LINKED || type == Type::LATHE || - type == Type::REVOLVE || type == Type::HELIX || type == Type::TRANSLATE || type == Type::ROTATE) { - SS.GW.showFaces = true; + if(type == Type::DRAWING_WORKPLANE || type == Type::DRAWING_3D) { + SS.GW.showFaces = SS.GW.showFacesDrawing; } else { - SS.GW.showFaces = false; + SS.GW.showFaces = SS.GW.showFacesNonDrawing; } SS.MarkGroupDirty(h); // for good measure; shouldn't be needed SS.ScheduleShowTW(); diff --git a/src/ui.h b/src/ui.h index 359ad4014..ace4ddd83 100644 --- a/src/ui.h +++ b/src/ui.h @@ -802,6 +802,8 @@ class GraphicsWindow { bool showEdges; bool showOutlines; bool showFaces; + bool showFacesDrawing; + bool showFacesNonDrawing; bool showMesh; void ToggleBool(bool *v); From 21c0b6b008eb92bff33d9857001dd247c7a7eabd Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Sun, 11 Apr 2021 15:53:22 +0100 Subject: [PATCH 317/646] Fix/silence mac build warnings As per Xcode 12.4 you can at least do a warning-free incremental build with these changes. There are still plenty of warnings in a full build (mostly from thirdparty components) but with these changes you can at least develop on mac and see if/when you've added any new warnings when doing incremental builds. --- src/CMakeLists.txt | 1 + src/platform/guimac.mm | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ec39939ce..7bc5a7cd1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -117,6 +117,7 @@ if(WIN32) ${SPACEWARE_LIBRARIES}) elseif(APPLE) add_compile_options( + -DGL_SILENCE_DEPRECATION -fobjc-arc) list(APPEND platform_SOURCES diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index b2b07a8bf..f9a95fcbd 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -286,7 +286,8 @@ void AddSeparator() override { } void PopUp() override { - [NSMenu popUpContextMenu:nsMenu withEvent:[NSApp currentEvent] forView:nil]; + NSEvent* event = [NSApp currentEvent]; + [NSMenu popUpContextMenu:nsMenu withEvent:event forView:event.window.contentView]; } void Clear() override { From bf93b3465811b6632bfcc0f13176119b266d69f5 Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Sat, 14 Aug 2021 11:54:12 +0100 Subject: [PATCH 318/646] Remove unused variable --- src/drawconstraint.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/drawconstraint.cpp b/src/drawconstraint.cpp index 4952d3627..249a54291 100644 --- a/src/drawconstraint.cpp +++ b/src/drawconstraint.cpp @@ -1006,7 +1006,6 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, Vector center = SK.GetEntity(circle->point[0])->PointGetNum(); Quaternion q = SK.GetEntity(circle->normal)->NormalGetNum(); Vector n = q.RotationN().WithMagnitude(1); - double r = circle->CircleGetRadiusNum(); Vector ref2; DoEqualRadiusTicks(canvas, hcs, entityA, &ref2); From 5ef73cf089feb72fe8262811db09f816626f3bcc Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Sun, 15 Aug 2021 11:22:56 +0100 Subject: [PATCH 319/646] Set OSX minimum supported version --- CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index bdd36705d..38e1bcf7a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,11 @@ if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() +if (APPLE) + # Docs say this must be set before the first project() call + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "macOS minimum supported version") +endif() + # project # NOTE TO PACKAGERS: The embedded git commit hash is critical for rapid bug triage when the builds From 7ddcd568234a4b78a487007f4ba9809af0b79664 Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Thu, 12 Aug 2021 12:35:44 +0100 Subject: [PATCH 320/646] Add option for displaying dimensions in feet and inches --- src/graphicswin.cpp | 11 +++++++++++ src/mouse.cpp | 2 +- src/solvespace.cpp | 42 +++++++++++++++++++++++++++++++++++------- src/solvespace.h | 5 +++-- src/ui.h | 2 ++ 5 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 84e83d6f3..bae48438f 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -98,6 +98,7 @@ const MenuEntry Menu[] = { { 2, N_("Dimensions in &Millimeters"), Command::UNITS_MM, 0, KR, mView }, { 2, N_("Dimensions in M&eters"), Command::UNITS_METERS, 0, KR, mView }, { 2, N_("Dimensions in &Inches"), Command::UNITS_INCHES, 0, KR, mView }, +{ 2, N_("Dimensions in &Feet and Inches"), Command::UNITS_FEET_INCHES, 0, KR, mView }, { 1, NULL, Command::NONE, 0, KN, NULL }, { 1, N_("Show &Toolbar"), Command::SHOW_TOOLBAR, 0, KC, mView }, { 1, N_("Show Property Bro&wser"), Command::SHOW_TEXT_WND, '\t', KC, mView }, @@ -329,6 +330,8 @@ void GraphicsWindow::PopulateMainMenu() { unitsMetersMenuItem = menuItem; } else if(Menu[i].cmd == Command::UNITS_INCHES) { unitsInchesMenuItem = menuItem; + } else if(Menu[i].cmd == Command::UNITS_FEET_INCHES) { + unitsFeetInchesMenuItem = menuItem; } else if(Menu[i].cmd == Command::SEL_WORKPLANE) { inWorkplaneMenuItem = menuItem; } else if(Menu[i].cmd == Command::FREE_IN_3D) { @@ -843,6 +846,12 @@ void GraphicsWindow::MenuView(Command id) { SS.GW.EnsureValidActives(); break; + case Command::UNITS_FEET_INCHES: + SS.viewUnits = Unit::FEET_INCHES; + SS.ScheduleShowTW(); + SS.GW.EnsureValidActives(); + break; + case Command::UNITS_MM: SS.viewUnits = Unit::MM; SS.ScheduleShowTW(); @@ -925,6 +934,7 @@ void GraphicsWindow::EnsureValidActives() { case Unit::MM: case Unit::METERS: case Unit::INCHES: + case Unit::FEET_INCHES: break; default: SS.viewUnits = Unit::MM; @@ -933,6 +943,7 @@ void GraphicsWindow::EnsureValidActives() { unitsMmMenuItem->SetActive(SS.viewUnits == Unit::MM); unitsMetersMenuItem->SetActive(SS.viewUnits == Unit::METERS); unitsInchesMenuItem->SetActive(SS.viewUnits == Unit::INCHES); + unitsFeetInchesMenuItem->SetActive(SS.viewUnits == Unit::FEET_INCHES); if(SS.TW.window) SS.TW.window->SetVisible(SS.GW.showTextWindow); showTextWndMenuItem->SetActive(SS.GW.showTextWindow); diff --git a/src/mouse.cpp b/src/mouse.cpp index a88d34f8c..373e6ea28 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -1378,7 +1378,7 @@ void GraphicsWindow::EditConstraint(hConstraint constraint) { } else if(c->type == Constraint::Type::ANGLE) { editValue = SS.DegreeToString(value); } else { - editValue = SS.MmToString(value); + editValue = SS.MmToString(value, true); value /= SS.MmPerUnit(); } // If that's not enough to represent it exactly, show the value with as many diff --git a/src/solvespace.cpp b/src/solvespace.cpp index ccea271a0..7d63403c4 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -315,6 +315,7 @@ void SolveSpaceUI::ScheduleAutosave() { double SolveSpaceUI::MmPerUnit() { switch(viewUnits) { case Unit::INCHES: return 25.4; + case Unit::FEET_INCHES: return 25.4; // The 'unit' is still inches case Unit::METERS: return 1000.0; case Unit::MM: return 1.0; } @@ -323,21 +324,41 @@ double SolveSpaceUI::MmPerUnit() { const char *SolveSpaceUI::UnitName() { switch(viewUnits) { case Unit::INCHES: return "in"; + case Unit::FEET_INCHES: return "in"; case Unit::METERS: return "m"; case Unit::MM: return "mm"; } return ""; } -std::string SolveSpaceUI::MmToString(double v) { +std::string SolveSpaceUI::MmToString(double v, bool editable) { v /= MmPerUnit(); + int feet = 0; + // The syntax 2' 6" for feet and inches is not something we can (currently) + // parse back from a string so if editable is true, we treat FEET_INCHES the + // same as INCHES and just return the unadorned decimal number of inches. + if(viewUnits == Unit::FEET_INCHES && !editable) { + // v is in inches at this point + feet = (int)(v / 12.0); + v = v - (feet * 12.0); + // v is now the remainder in inches + } int digits = UnitDigitsAfterDecimal(); double minimum = 0.5 * pow(10,-digits); - while ((v < minimum) && (v > LENGTH_EPS)) { + while ((feet == 0) && (v < minimum) && (v > LENGTH_EPS)) { digits++; minimum *= 0.1; } - return ssprintf("%.*f", digits, v); + + if(viewUnits == Unit::FEET_INCHES && !editable) { + if(feet != 0) { + return ssprintf("%d' %.*f\"", feet, digits, v); + } else { + return ssprintf("%.*f\"", digits, v); + } + } else { + return ssprintf("%.*f", digits, v); + } } static const char *DimToString(int dim) { switch(dim) { @@ -394,17 +415,22 @@ std::string SolveSpaceUI::MmToStringSI(double v, int dim) { dim = 1; } - v /= pow((viewUnits == Unit::INCHES) ? 25.4 : 1000, dim); + bool inches = (viewUnits == Unit::INCHES) || (viewUnits == Unit::FEET_INCHES); + v /= pow(inches ? 25.4 : 1000, dim); int vdeg = (int)(log10(fabs(v))); std::string unit; if(fabs(v) > 0.0) { int sdeg = 0; std::tie(sdeg, unit) = - (viewUnits == Unit::INCHES) + inches ? SelectSIPrefixInch(vdeg/dim) : SelectSIPrefixMm(vdeg, dim); v /= pow(10.0, sdeg * dim); } + if(viewUnits == Unit::FEET_INCHES && fabs(v) > pow(12.0, dim)) { + unit = "ft"; + v /= pow(12.0, dim); + } int pdeg = (int)ceil(log10(fabs(v) + 1e-10)); return ssprintf("%.*g%s%s%s", pdeg + UnitDigitsAfterDecimal(), v, compact ? "" : " ", unit.c_str(), DimToString(dim)); @@ -434,10 +460,11 @@ int SolveSpaceUI::GetMaxSegments() { return maxSegments; } int SolveSpaceUI::UnitDigitsAfterDecimal() { - return (viewUnits == Unit::INCHES) ? afterDecimalInch : afterDecimalMm; + return (viewUnits == Unit::INCHES || viewUnits == Unit::FEET_INCHES) ? + afterDecimalInch : afterDecimalMm; } void SolveSpaceUI::SetUnitDigitsAfterDecimal(int v) { - if(viewUnits == Unit::INCHES) { + if(viewUnits == Unit::INCHES || viewUnits == Unit::FEET_INCHES) { afterDecimalInch = v; } else { afterDecimalMm = v; @@ -1036,6 +1063,7 @@ void SolveSpaceUI::Clear() { GW.unitsMmMenuItem = NULL; GW.unitsMetersMenuItem = NULL; GW.unitsInchesMenuItem = NULL; + GW.unitsFeetInchesMenuItem = NULL; GW.inWorkplaneMenuItem = NULL; GW.in3dMenuItem = NULL; GW.undoMenuItem = NULL; diff --git a/src/solvespace.h b/src/solvespace.h index d4caab2b8..212977126 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -138,7 +138,8 @@ enum class Command : uint32_t; enum class Unit : uint32_t { MM = 0, INCHES, - METERS + METERS, + FEET_INCHES }; template @@ -609,7 +610,7 @@ class SolveSpaceUI { bool useSIPrefixes; int autosaveInterval; // in minutes - std::string MmToString(double v); + std::string MmToString(double v, bool editable=false); std::string MmToStringSI(double v, int dim = 0); std::string DegreeToString(double v); double ExprToMm(Expr *e); diff --git a/src/ui.h b/src/ui.h index ace4ddd83..90cef9f11 100644 --- a/src/ui.h +++ b/src/ui.h @@ -89,6 +89,7 @@ enum class Command : uint32_t { SHOW_TOOLBAR, SHOW_TEXT_WND, UNITS_INCHES, + UNITS_FEET_INCHES, UNITS_MM, UNITS_METERS, FULL_SCREEN, @@ -546,6 +547,7 @@ class GraphicsWindow { Platform::MenuItemRef unitsMmMenuItem; Platform::MenuItemRef unitsMetersMenuItem; Platform::MenuItemRef unitsInchesMenuItem; + Platform::MenuItemRef unitsFeetInchesMenuItem; Platform::MenuItemRef inWorkplaneMenuItem; Platform::MenuItemRef in3dMenuItem; From bc81e998f1771c6d5ae094edcc94941b247d6ca2 Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Fri, 13 Aug 2021 13:09:13 +0100 Subject: [PATCH 321/646] Make feet and inches show fractions of an inch, rounded to nearest 1/64 Taking care to round appropriately so you don't end up with things like 35.999 coming out as 2' 12" and similar. --- src/solvespace.cpp | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 7d63403c4..b63c9b526 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -333,32 +333,45 @@ const char *SolveSpaceUI::UnitName() { std::string SolveSpaceUI::MmToString(double v, bool editable) { v /= MmPerUnit(); - int feet = 0; // The syntax 2' 6" for feet and inches is not something we can (currently) // parse back from a string so if editable is true, we treat FEET_INCHES the // same as INCHES and just return the unadorned decimal number of inches. if(viewUnits == Unit::FEET_INCHES && !editable) { - // v is in inches at this point - feet = (int)(v / 12.0); - v = v - (feet * 12.0); - // v is now the remainder in inches + // Now convert v from inches to 64'ths of an inch, to make rounding easier. + v = floor((v + (1.0 / 128.0)) * 64.0); + int feet = (int)(v / (12.0 * 64.0)); + v = v - (feet * 12.0 * 64.0); + // v is now the feet-less remainder in 1/64 inches + int inches = (int)(v / 64.0); + int numerator = (int)(v - ((double)inches * 64.0)); + int denominator = 64; + // Divide down to smallest denominator where the numerator is still a whole number + while ((numerator != 0) && ((numerator & 1) == 0)) { + numerator /= 2; + denominator /= 2; + } + std::ostringstream str; + if(feet != 0) { + str << feet << "' "; + } + // For something like 0.5, show 1/2" rather than 0 1/2" + if(!(feet == 0 && inches == 0 && numerator != 0)) { + str << inches; + } + if(numerator != 0) { + str << " " << numerator << "/" << denominator; + } + str << "\""; + return str.str(); } + int digits = UnitDigitsAfterDecimal(); double minimum = 0.5 * pow(10,-digits); - while ((feet == 0) && (v < minimum) && (v > LENGTH_EPS)) { + while ((v < minimum) && (v > LENGTH_EPS)) { digits++; minimum *= 0.1; } - - if(viewUnits == Unit::FEET_INCHES && !editable) { - if(feet != 0) { - return ssprintf("%d' %.*f\"", feet, digits, v); - } else { - return ssprintf("%.*f\"", digits, v); - } - } else { - return ssprintf("%.*f", digits, v); - } + return ssprintf("%.*f", digits, v); } static const char *DimToString(int dim) { switch(dim) { From bc8bcaf42f828c97a9505cb41b9eb95e73ab77a9 Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Fri, 13 Aug 2021 13:10:21 +0100 Subject: [PATCH 322/646] Fix MmToString calls that should have editable=true set --- src/confscreen.cpp | 12 ++++++------ src/style.cpp | 2 +- src/textscreens.cpp | 4 ++-- src/view.cpp | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/confscreen.cpp b/src/confscreen.cpp index 4a4b7b23d..9c4610b3b 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -64,7 +64,7 @@ void TextWindow::ScreenChangeCameraTangent(int link, uint32_t v) { } void TextWindow::ScreenChangeGridSpacing(int link, uint32_t v) { - SS.TW.ShowEditControl(3, SS.MmToString(SS.gridSpacing)); + SS.TW.ShowEditControl(3, SS.MmToString(SS.gridSpacing, true)); SS.TW.edit.meaning = Edit::GRID_SPACING; } @@ -89,7 +89,7 @@ void TextWindow::ScreenChangeExportScale(int link, uint32_t v) { } void TextWindow::ScreenChangeExportOffset(int link, uint32_t v) { - SS.TW.ShowEditControl(3, SS.MmToString(SS.exportOffset)); + SS.TW.ShowEditControl(3, SS.MmToString(SS.exportOffset, true)); SS.TW.edit.meaning = Edit::EXPORT_OFFSET; } @@ -171,7 +171,7 @@ void TextWindow::ScreenChangeCanvasSize(int link, uint32_t v) { } int col = 13; if(v < 10) col = 11; - SS.TW.ShowEditControl(col, SS.MmToString(d)); + SS.TW.ShowEditControl(col, SS.MmToString(d, true)); SS.TW.edit.meaning = Edit::CANVAS_SIZE; SS.TW.edit.i = v; } @@ -181,7 +181,7 @@ void TextWindow::ScreenChangeGCodeParameter(int link, uint32_t v) { switch(link) { case 'd': SS.TW.edit.meaning = Edit::G_CODE_DEPTH; - buf += SS.MmToString(SS.gCode.depth); + buf += SS.MmToString(SS.gCode.depth, true); break; case 's': @@ -191,12 +191,12 @@ void TextWindow::ScreenChangeGCodeParameter(int link, uint32_t v) { case 'F': SS.TW.edit.meaning = Edit::G_CODE_FEED; - buf += SS.MmToString(SS.gCode.feed); + buf += SS.MmToString(SS.gCode.feed, true); break; case 'P': SS.TW.edit.meaning = Edit::G_CODE_PLUNGE_FEED; - buf += SS.MmToString(SS.gCode.plungeFeed); + buf += SS.MmToString(SS.gCode.plungeFeed, true); break; } SS.TW.ShowEditControl(14, buf); diff --git a/src/style.cpp b/src/style.cpp index 6ca61e560..4349eb36e 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -563,7 +563,7 @@ void TextWindow::ScreenChangeStyleMetric(int link, uint32_t v) { if(units == Style::UnitsAs::PIXELS) { edit_value = ssprintf("%.2f", val); } else { - edit_value = SS.MmToString(val); + edit_value = SS.MmToString(val, true); } SS.TW.ShowEditControl(col, edit_value); SS.TW.edit.style = hs; diff --git a/src/textscreens.cpp b/src/textscreens.cpp index ee6d90eac..3474b5191 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -640,7 +640,7 @@ void TextWindow::ScreenStepDimFinish(int link, uint32_t v) { SS.TW.edit.meaning = Edit::STEP_DIM_FINISH; std::string edit_value; if(SS.TW.stepDim.isDistance) { - edit_value = SS.MmToString(SS.TW.stepDim.finish); + edit_value = SS.MmToString(SS.TW.stepDim.finish, true); } else { edit_value = ssprintf("%.3f", SS.TW.stepDim.finish); } @@ -727,7 +727,7 @@ void TextWindow::ScreenChangeTangentArc(int link, uint32_t v) { switch(link) { case 'r': { SS.TW.edit.meaning = Edit::TANGENT_ARC_RADIUS; - SS.TW.ShowEditControl(3, SS.MmToString(SS.tangentArcRadius)); + SS.TW.ShowEditControl(3, SS.MmToString(SS.tangentArcRadius, true)); break; } diff --git a/src/view.cpp b/src/view.cpp index 14d09ba35..9c85ce6b8 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -51,9 +51,9 @@ void TextWindow::ScreenChangeViewToFullScale(int link, uint32_t v) { void TextWindow::ScreenChangeViewOrigin(int link, uint32_t v) { std::string edit_value = ssprintf("%s, %s, %s", - SS.MmToString(-SS.GW.offset.x).c_str(), - SS.MmToString(-SS.GW.offset.y).c_str(), - SS.MmToString(-SS.GW.offset.z).c_str()); + SS.MmToString(-SS.GW.offset.x, true).c_str(), + SS.MmToString(-SS.GW.offset.y, true).c_str(), + SS.MmToString(-SS.GW.offset.z, true).c_str()); SS.TW.edit.meaning = Edit::VIEW_ORIGIN; SS.TW.ShowEditControl(3, edit_value); From 368ca55a0976761e2314d6fef5a34981b3427640 Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Fri, 13 Aug 2021 14:14:55 +0100 Subject: [PATCH 323/646] Update feet and inches format to match architectural convention --- src/solvespace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index b63c9b526..89b4a00d0 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -352,7 +352,7 @@ std::string SolveSpaceUI::MmToString(double v, bool editable) { } std::ostringstream str; if(feet != 0) { - str << feet << "' "; + str << feet << "'-"; } // For something like 0.5, show 1/2" rather than 0 1/2" if(!(feet == 0 && inches == 0 && numerator != 0)) { From 7efaf7f7eb87f081424ff8146709f98bbb120486 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 15 Aug 2021 18:22:12 -0400 Subject: [PATCH 324/646] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bba8defd..b6f1f57ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ Constraints: Sketching: +* Added Feet-Inches as a unit of measure. Inputs are still in inches. + But the display shows feet, inches, and fraction of an inch. * Added an optional "pitch" parameter to helix extrusions (in the text window) * Allow use of Point & Normal to define "sketch-in-new-workplane". * Update "Property Browser" live while dragging the sketch. From d3b6e51914105c42c8c2591c2ed32b60a0cb4472 Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Sun, 4 Apr 2021 14:14:37 +0100 Subject: [PATCH 325/646] Add "Show Exploded View" menu option Where each entity in the active workplane sketch is projected a different amount normal to the workplane, to allow inspection and easier selection of entities that entirely overlap each other and are thus otherwise difficult to see or select. The distance between the exploded "layers" can be controlled in the configuration page. Negative distances mean the layers are projected in the opposite direction, relative to the workplane normal. --- src/confscreen.cpp | 14 +++++ src/drawconstraint.cpp | 120 ++++++++++++++++++++++++++++++++--------- src/drawentity.cpp | 71 +++++++++++++++++++----- src/generate.cpp | 2 + src/graphicswin.cpp | 10 ++++ src/group.cpp | 3 ++ src/sketch.h | 10 +++- src/solvespace.cpp | 2 + src/solvespace.h | 2 + src/ui.h | 4 ++ 10 files changed, 200 insertions(+), 38 deletions(-) diff --git a/src/confscreen.cpp b/src/confscreen.cpp index 9c4610b3b..29a435910 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -68,6 +68,11 @@ void TextWindow::ScreenChangeGridSpacing(int link, uint32_t v) { SS.TW.edit.meaning = Edit::GRID_SPACING; } +void TextWindow::ScreenChangeExplodeDistance(int link, uint32_t v) { + SS.TW.ShowEditControl(3, SS.MmToString(SS.explodeDistance, true)); + SS.TW.edit.meaning = Edit::EXPLODE_DISTANCE; +} + void TextWindow::ScreenChangeDigitsAfterDecimal(int link, uint32_t v) { SS.TW.ShowEditControl(14, ssprintf("%d", SS.UnitDigitsAfterDecimal())); SS.TW.edit.meaning = Edit::DIGITS_AFTER_DECIMAL; @@ -269,6 +274,10 @@ void TextWindow::ShowConfiguration() { Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E", SS.MmToString(SS.gridSpacing).c_str(), &ScreenChangeGridSpacing, 0); + Printf(false, "%Ft explode distance%E"); + Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.explodeDistance).c_str(), + &ScreenChangeExplodeDistance, 0); Printf(false, ""); Printf(false, "%Ft digits after decimal point to show%E"); @@ -459,6 +468,11 @@ bool TextWindow::EditControlDoneForConfiguration(const std::string &s) { SS.GW.Invalidate(); break; } + case Edit::EXPLODE_DISTANCE: { + SS.explodeDistance = min(1e4, max(-1e4, SS.StringToMm(s))); + SS.MarkGroupDirty(SS.GW.activeGroup, true); + break; + } case Edit::DIGITS_AFTER_DECIMAL: { int v = atoi(s.c_str()); if(v < 0 || v > 8) { diff --git a/src/drawconstraint.cpp b/src/drawconstraint.cpp index 249a54291..02aababbc 100644 --- a/src/drawconstraint.cpp +++ b/src/drawconstraint.cpp @@ -267,7 +267,7 @@ void Constraint::DoEqualRadiusTicks(Canvas *canvas, Canvas::hStroke hcs, const Camera &camera = canvas->GetCamera(); Entity *circ = SK.GetEntity(he); - Vector center = SK.GetEntity(circ->point[0])->PointGetNum(); + Vector center = SK.GetEntity(circ->point[0])->PointGetDrawNum(); double r = circ->CircleGetRadiusNum(); Quaternion q = circ->Normal()->NormalGetNum(); Vector u = q.RotationU(), v = q.RotationV(); @@ -291,7 +291,8 @@ void Constraint::DoEqualRadiusTicks(Canvas *canvas, Canvas::hStroke hcs, void Constraint::DoArcForAngle(Canvas *canvas, Canvas::hStroke hcs, Vector a0, Vector da, Vector b0, Vector db, - Vector offset, Vector *ref, bool trim) + Vector offset, Vector *ref, bool trim, + Vector explodeOffset) { const Camera &camera = canvas->GetCamera(); double pixels = 1.0 / camera.scale; @@ -305,6 +306,9 @@ void Constraint::DoArcForAngle(Canvas *canvas, Canvas::hStroke hcs, db = db.ProjectVectorInto(workplane); } + a0 = a0.Plus(explodeOffset); + b0 = b0.Plus(explodeOffset); + Vector a1 = a0.Plus(da); Vector b1 = b0.Plus(db); @@ -534,6 +538,15 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, DoProjectedPoint(canvas, hcs, &bp); } + if(ShouldDrawExploded()) { + // Offset A and B by the same offset so the constraint is drawn + // in the plane of one of the exploded points (rather than at an + // angle) + Vector offset = SK.GetEntity(ptA)->ExplodeOffset(); + ap = ap.Plus(offset); + bp = bp.Plus(offset); + } + Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(disp.offset); if(refs) refs->push_back(ref); @@ -548,6 +561,19 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, dp = (bp.Minus(ap)), pp = SK.GetEntity(entityA)->VectorGetNum(); + if(ShouldDrawExploded()) { + // explode for whichever point is in the workplane (or the first if both are) + Entity *pt = SK.GetEntity(ptA); + if(pt->group != group) { + pt = SK.GetEntity(ptB); + } + if(pt->group == group) { + Vector offset = pt->ExplodeOffset(); + ap = ap.Plus(offset); + bp = bp.Plus(offset); + } + } + Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(disp.offset); if(refs) refs->push_back(ref); @@ -564,7 +590,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, case Type::PT_FACE_DISTANCE: case Type::PT_PLANE_DISTANCE: { - Vector pt = SK.GetEntity(ptA)->PointGetNum(); + Vector pt = SK.GetEntity(ptA)->PointGetDrawNum(); Entity *enta = SK.GetEntity(entityA); Vector n, p; if(type == Type::PT_PLANE_DISTANCE) { @@ -590,7 +616,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } case Type::PT_LINE_DISTANCE: { - Vector pt = SK.GetEntity(ptA)->PointGetNum(); + Entity *ptEntity = SK.GetEntity(ptA); + Vector pt = ptEntity->PointGetNum(); Entity *line = SK.GetEntity(entityA); Vector lA = SK.GetEntity(line->point[0])->PointGetNum(); Vector lB = SK.GetEntity(line->point[1])->PointGetNum(); @@ -602,6 +629,19 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, DoProjectedPoint(canvas, hcs, &pt); } + // Only explode if the point and line are in the same group (and that group is a sketch + // with explode enabled) otherwise it's too visually confusing to figure out what the + // correct projections should be. + bool shouldExplode = ShouldDrawExploded() + && ptEntity->group == group + && line->group == group; + if(shouldExplode) { + Vector explodeOffset = ptEntity->ExplodeOffset(); + pt = pt.Plus(explodeOffset); + lA = lA.Plus(explodeOffset); + lB = lB.Plus(explodeOffset); + } + // Find the closest point on the line Vector closest = pt.ClosestPointOnLine(lA, dl); @@ -655,7 +695,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, case Type::DIAMETER: { Entity *circle = SK.GetEntity(entityA); - Vector center = SK.GetEntity(circle->point[0])->PointGetNum(); + Vector center = SK.GetEntity(circle->point[0])->PointGetDrawNum(); Quaternion q = SK.GetEntity(circle->normal)->NormalGetNum(); Vector n = q.RotationN().WithMagnitude(1); double r = circle->CircleGetRadiusNum(); @@ -697,7 +737,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, Vector r = camera.projRight.ScaledBy((a+1)/camera.scale); Vector d = camera.projUp.ScaledBy((2-a)/camera.scale); for(int i = 0; i < 2; i++) { - Vector p = SK.GetEntity(i == 0 ? ptA : ptB)-> PointGetNum(); + Vector p = SK.GetEntity(i == 0 ? ptA : ptB)->PointGetDrawNum(); if(refs) refs->push_back(p); canvas->DrawQuad(p.Plus (r).Plus (d), p.Plus (r).Minus(d), @@ -715,7 +755,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, case Type::PT_ON_FACE: case Type::PT_IN_PLANE: { double s = 8/camera.scale; - Vector p = SK.GetEntity(ptA)->PointGetNum(); + Vector p = SK.GetEntity(ptA)->PointGetDrawNum(); if(refs) refs->push_back(p); Vector r, d; if(type == Type::PT_ON_FACE) { @@ -740,7 +780,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } case Type::WHERE_DRAGGED: { - Vector p = SK.GetEntity(ptA)->PointGetNum(); + Vector p = SK.GetEntity(ptA)->PointGetDrawNum(); if(refs) refs->push_back(p); Vector u = p.Plus(gu.WithMagnitude(8/camera.scale)).Plus( gr.WithMagnitude(8/camera.scale)), @@ -797,10 +837,10 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } DoArcForAngle(canvas, hcs, a0, da, b0, db, - da.WithMagnitude(40/camera.scale), &ref, /*trim=*/false); + da.WithMagnitude(40/camera.scale), &ref, /*trim=*/false, a->ExplodeOffset()); if(refs) refs->push_back(ref); DoArcForAngle(canvas, hcs, c0, dc, d0, dd, - dc.WithMagnitude(40/camera.scale), &ref, /*trim=*/false); + dc.WithMagnitude(40/camera.scale), &ref, /*trim=*/false, c->ExplodeOffset()); if(refs) refs->push_back(ref); return; @@ -820,7 +860,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } Vector ref; - DoArcForAngle(canvas, hcs, a0, da, b0, db, disp.offset, &ref, /*trim=*/true); + DoArcForAngle(canvas, hcs, a0, da, b0, db, disp.offset, &ref, /*trim=*/true, a->ExplodeOffset()); DoLabel(canvas, hcs, ref, labelPos, gr, gu); if(refs) refs->push_back(ref); return; @@ -855,7 +895,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, if(u.Dot(ru) < 0) u = u.ScaledBy(-1); } - Vector p = e->VectorGetRefPoint(); + Vector p = e->VectorGetRefPoint().Plus(e->ExplodeOffset()); Vector s = p.Plus(u).Plus(v); DoLine(canvas, hcs, s, s.Plus(v)); Vector m = s.Plus(v.ScaledBy(0.5)); @@ -873,9 +913,9 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, if(type == Type::ARC_LINE_TANGENT) { Entity *arc = SK.GetEntity(entityA); Entity *norm = SK.GetEntity(arc->normal); - Vector c = SK.GetEntity(arc->point[0])->PointGetNum(); + Vector c = SK.GetEntity(arc->point[0])->PointGetDrawNum(); Vector p = - SK.GetEntity(arc->point[other ? 2 : 1])->PointGetNum(); + SK.GetEntity(arc->point[other ? 2 : 1])->PointGetDrawNum(); Vector r = p.Minus(c); textAt = p.Plus(r.WithMagnitude(14/camera.scale)); u = norm->NormalU(); @@ -896,6 +936,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, Entity *cubic = SK.GetEntity(entityA); Vector p = other ? cubic->CubicGetFinishNum() : cubic->CubicGetStartNum(); + p = p.Plus(cubic->ExplodeOffset()); Vector dir = SK.GetEntity(entityB)->VectorGetNum(); Vector out = n.Cross(dir); textAt = p.Plus(out.WithMagnitude(14/camera.scale)); @@ -905,12 +946,12 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, u = wn->NormalU(); v = wn->NormalV(); n = wn->NormalN(); - EntityBase *eA = SK.GetEntity(entityA); + Entity *eA = SK.GetEntity(entityA); // Big pain; we have to get a vector tangent to the curve // at the shared point, which could be from either a cubic // or an arc. if(other) { - textAt = eA->EndpointFinish(); + textAt = eA->EndpointFinish().Plus(eA->ExplodeOffset()); if(eA->type == Entity::Type::CUBIC) { dir = eA->CubicGetFinishTangentNum(); } else { @@ -919,7 +960,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, dir = n.Cross(dir); } } else { - textAt = eA->EndpointStart(); + textAt = eA->EndpointStart().Plus(eA->ExplodeOffset()); if(eA->type == Entity::Type::CUBIC) { dir = eA->CubicGetStartTangentNum(); } else { @@ -947,6 +988,10 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, Vector u = (gn.Cross(n)).WithMagnitude(4/camera.scale); Vector p = e->VectorGetRefPoint(); + if(ShouldDrawExploded()) { + p = p.Plus(e->ExplodeOffset()); + } + DoLine(canvas, hcs, p.Plus(u), p.Plus(u).Plus(n)); DoLine(canvas, hcs, p.Minus(u), p.Minus(u).Plus(n)); if(refs) refs->push_back(p.Plus(n.ScaledBy(0.5))); @@ -967,8 +1012,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, Entity *line = SK.GetEntity(entityA); Vector ref; DoEqualLenTicks(canvas, hcs, - SK.GetEntity(line->point[0])->PointGetNum(), - SK.GetEntity(line->point[1])->PointGetNum(), + SK.GetEntity(line->point[0])->PointGetDrawNum(), + SK.GetEntity(line->point[1])->PointGetDrawNum(), gn, &ref); if(refs) refs->push_back(ref); DoEqualRadiusTicks(canvas, hcs, entityB, &ref); @@ -990,6 +1035,12 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, DoProjectedPoint(canvas, hcs, &b); } + if(ShouldDrawExploded()) { + Vector offset = e->ExplodeOffset(); + a = a.Plus(offset); + b = b.Plus(offset); + } + Vector ref; DoEqualLenTicks(canvas, hcs, a, b, gn, &ref); if(refs) refs->push_back(ref); @@ -1044,6 +1095,11 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, DoProjectedPoint(canvas, hcs, &a); DoProjectedPoint(canvas, hcs, &b); } + if(ShouldDrawExploded()) { + Vector offset = forLen->ExplodeOffset(); + a = a.Plus(offset); + b = b.Plus(offset); + } Vector refa; DoEqualLenTicks(canvas, hcs, a, b, gn, &refa); if(refs) refs->push_back(refa); @@ -1059,6 +1115,11 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } Vector closest = pt.ClosestPointOnLine(la, lb.Minus(la)); + if(ShouldDrawExploded()) { + Vector offset = SK.GetEntity(ptA)->ExplodeOffset(); + pt = pt.Plus(offset); + closest = closest.Plus(offset); + } DoLine(canvas, hcs, pt, closest); Vector refb; DoEqualLenTicks(canvas, hcs, pt, closest, gn, &refb); @@ -1081,6 +1142,11 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } Vector closest = pt.ClosestPointOnLine(la, lb.Minus(la)); + if(ShouldDrawExploded()) { + Vector offset = pte->ExplodeOffset(); + pt = pt.Plus(offset); + closest = closest.Plus(offset); + } DoLine(canvas, hcs, pt, closest); Vector ref; @@ -1110,8 +1176,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, goto s; } s: - Vector a = SK.GetEntity(ptA)->PointGetNum(); - Vector b = SK.GetEntity(ptB)->PointGetNum(); + Vector a = SK.GetEntity(ptA)->PointGetDrawNum(); + Vector b = SK.GetEntity(ptB)->PointGetDrawNum(); for(int i = 0; i < 2; i++) { Vector tail = (i == 0) ? a : b; @@ -1148,8 +1214,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } // For "at midpoint", this branch is always taken. Entity *e = SK.GetEntity(entityA); - Vector a = SK.GetEntity(e->point[0])->PointGetNum(); - Vector b = SK.GetEntity(e->point[1])->PointGetNum(); + Vector a = SK.GetEntity(e->point[0])->PointGetDrawNum(); + Vector b = SK.GetEntity(e->point[1])->PointGetDrawNum(); Vector m = (a.ScaledBy(0.5)).Plus(b.ScaledBy(0.5)); Vector offset = (a.Minus(b)).Cross(n); offset = offset.WithMagnitude(textHeight); @@ -1173,8 +1239,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, r.WithMagnitude(1), u.WithMagnitude(1), hcs); if(refs) refs->push_back(o); } else { - Vector a = SK.GetEntity(ptA)->PointGetNum(); - Vector b = SK.GetEntity(ptB)->PointGetNum(); + Vector a = SK.GetEntity(ptA)->PointGetDrawNum(); + Vector b = SK.GetEntity(ptB)->PointGetDrawNum(); Entity *w = SK.GetEntity(workplane); Vector cu = w->Normal()->NormalU(); @@ -1291,3 +1357,7 @@ bool Constraint::HasLabel() const { return false; } } + +bool Constraint::ShouldDrawExploded() const { + return SK.GetGroup(group)->ShouldDrawExploded(); +} diff --git a/src/drawentity.cpp b/src/drawentity.cpp index 5e1122ad3..d00925449 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -88,7 +88,7 @@ void Entity::GetReferencePoints(std::vector *refs) { case Type::POINT_N_ROT_AXIS_TRANS: case Type::POINT_IN_3D: case Type::POINT_IN_2D: - refs->push_back(PointGetNum()); + refs->push_back(PointGetDrawNum()); break; case Type::NORMAL_N_COPY: @@ -103,12 +103,12 @@ void Entity::GetReferencePoints(std::vector *refs) { case Type::CUBIC_PERIODIC: case Type::TTF_TEXT: case Type::IMAGE: - refs->push_back(SK.GetEntity(point[0])->PointGetNum()); + refs->push_back(SK.GetEntity(point[0])->PointGetDrawNum()); break; case Type::LINE_SEGMENT: { - Vector a = SK.GetEntity(point[0])->PointGetNum(), - b = SK.GetEntity(point[1])->PointGetNum(); + Vector a = SK.GetEntity(point[0])->PointGetDrawNum(), + b = SK.GetEntity(point[1])->PointGetDrawNum(); refs->push_back(b.Plus(a.Minus(b).ScaledBy(0.5))); break; } @@ -466,6 +466,26 @@ void Entity::GenerateBezierCurves(SBezierList *sbl) const { } } +bool Entity::ShouldDrawExploded() const { + return SK.GetGroup(group)->ShouldDrawExploded(); +} + +Vector Entity::ExplodeOffset() const { + if(ShouldDrawExploded() && workplane.v != 0) { + int requestIdx = SK.GetRequest(h.request())->groupRequestIndex; + double offset = SS.explodeDistance * (requestIdx + 1); + return SK.GetEntity(workplane)->Normal()->NormalN().ScaledBy(offset); + } else { + return Vector::From(0, 0, 0); + } +} + +Vector Entity::PointGetDrawNum() const { + // As per EntityBase::PointGetNum but specifically for when drawing/rendering the point + // (and not when solving), so we can potentially draw it somewhere different + return PointGetNum().Plus(ExplodeOffset()); +} + void Entity::Draw(DrawAs how, Canvas *canvas) { if(!(how == DrawAs::HOVERED || how == DrawAs::SELECTED) && !IsVisible()) return; @@ -557,16 +577,17 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { pointStroke.unit = Canvas::Unit::PX; Canvas::hStroke hcsPoint = canvas->GetStroke(pointStroke); + Vector p = PointGetDrawNum(); if(free) { Canvas::Stroke analyzeStroke = Style::Stroke(Style::ANALYZE); analyzeStroke.width = 14.0; analyzeStroke.layer = Canvas::Layer::FRONT; Canvas::hStroke hcsAnalyze = canvas->GetStroke(analyzeStroke); - canvas->DrawPoint(PointGetNum(), hcsAnalyze); + canvas->DrawPoint(p, hcsAnalyze); } - canvas->DrawPoint(PointGetNum(), hcsPoint); + canvas->DrawPoint(p, hcsPoint); return; } @@ -621,7 +642,7 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { tail = camera.projRight.ScaledBy(w/s).Plus( camera.projUp. ScaledBy(h/s)).Minus(camera.offset); } else { - tail = SK.GetEntity(point[0])->PointGetNum(); + tail = SK.GetEntity(point[0])->PointGetDrawNum(); } tail = camera.AlignToPixelGrid(tail); @@ -709,8 +730,32 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { case Type::TTF_TEXT: { // Generate the rational polynomial curves, then piecewise linearize // them, and display those. - if(!canvas->DrawBeziers(*GetOrGenerateBezierCurves(), hcs)) { - canvas->DrawEdges(*GetOrGenerateEdges(), hcs); + // Calculating the draw offset, if necessary. + const bool shouldExplode = ShouldDrawExploded(); + Vector explodeOffset; + SBezierList offsetBeziers = {}; + SBezierList *beziers = GetOrGenerateBezierCurves(); + if(shouldExplode) { + explodeOffset = ExplodeOffset(); + for(const SBezier& b : beziers->l) { + SBezier offset = b.TransformedBy(explodeOffset, Quaternion::IDENTITY, 1.0); + offsetBeziers.l.Add(&offset); + } + beziers = &offsetBeziers; + } + + SEdgeList *edges = nullptr; + SEdgeList offsetEdges = {}; + + if(!canvas->DrawBeziers(*beziers, hcs)) { + edges = GetOrGenerateEdges(); + if(shouldExplode) { + for(const SEdge &e : edges->l) { + offsetEdges.AddEdge(e.a.Plus(explodeOffset), e.b.Plus(explodeOffset), e.auxA, e.auxB, e.tag); + } + edges = &offsetEdges; + } + canvas->DrawEdges(*edges, hcs); } if(type == Type::CIRCLE) { Entity *dist = SK.GetEntity(distance); @@ -720,12 +765,14 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { Canvas::Stroke analyzeStroke = Style::Stroke(Style::ANALYZE); analyzeStroke.layer = Canvas::Layer::FRONT; Canvas::hStroke hcsAnalyze = canvas->GetStroke(analyzeStroke); - if(!canvas->DrawBeziers(*GetOrGenerateBezierCurves(), hcsAnalyze)) { - canvas->DrawEdges(*GetOrGenerateEdges(), hcsAnalyze); + if(!canvas->DrawBeziers(*beziers, hcsAnalyze)) { + canvas->DrawEdges(*edges, hcsAnalyze); } } } } + offsetBeziers.Clear(); + offsetEdges.Clear(); return; } case Type::IMAGE: { @@ -757,7 +804,7 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { Canvas::hFill hf = canvas->GetFill(fill); Vector v[4] = {}; for(int i = 0; i < 4; i++) { - v[i] = SK.GetEntity(point[i])->PointGetNum(); + v[i] = SK.GetEntity(point[i])->PointGetDrawNum(); } Vector iu = v[3].Minus(v[0]); Vector iv = v[1].Minus(v[0]); diff --git a/src/generate.cpp b/src/generate.cpp index fdda99462..ec8f82ebb 100644 --- a/src/generate.cpp +++ b/src/generate.cpp @@ -224,9 +224,11 @@ void SolveSpaceUI::GenerateAll(Generate type, bool andFindFree, bool genForBBox) if(PruneGroups(hg)) goto pruned; + int groupRequestIndex = 0; for(auto &req : SK.request) { Request *r = &req; if(r->group != hg) continue; + r->groupRequestIndex = groupRequestIndex++; r->Generate(&(SK.entity), &(SK.param)); } diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index bae48438f..17e04dce0 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -94,6 +94,7 @@ const MenuEntry Menu[] = { { 1, N_("Show Snap &Grid"), Command::SHOW_GRID, '>', KC, mView }, { 1, N_("Darken Inactive Solids"), Command::DIM_SOLID_MODEL, 0, KC, mView }, { 1, N_("Use &Perspective Projection"), Command::PERSPECTIVE_PROJ, '`', KC, mView }, +{ 1, N_("Show E&xploded View"), Command::EXPLODE_SKETCH, '\\', KC, mView }, { 1, N_("Dimension &Units"), Command::NONE, 0, KN, NULL }, { 2, N_("Dimensions in &Millimeters"), Command::UNITS_MM, 0, KR, mView }, { 2, N_("Dimensions in M&eters"), Command::UNITS_METERS, 0, KR, mView }, @@ -318,6 +319,8 @@ void GraphicsWindow::PopulateMainMenu() { dimSolidModelMenuItem = menuItem; } else if(Menu[i].cmd == Command::PERSPECTIVE_PROJ) { perspectiveProjMenuItem = menuItem; + } else if(Menu[i].cmd == Command::EXPLODE_SKETCH) { + explodeMenuItem = menuItem; } else if(Menu[i].cmd == Command::SHOW_TOOLBAR) { showToolbarMenuItem = menuItem; } else if(Menu[i].cmd == Command::SHOW_TEXT_WND) { @@ -753,6 +756,12 @@ void GraphicsWindow::MenuView(Command id) { } break; + case Command::EXPLODE_SKETCH: + SS.explode = !SS.explode; + SS.GW.EnsureValidActives(); + SS.MarkGroupDirty(SS.GW.activeGroup, true); + break; + case Command::ONTO_WORKPLANE: if(SS.GW.LockedInWorkplane()) { SS.GW.AnimateOntoWorkplane(); @@ -951,6 +960,7 @@ void GraphicsWindow::EnsureValidActives() { showGridMenuItem->SetActive(SS.GW.showSnapGrid); dimSolidModelMenuItem->SetActive(SS.GW.dimSolidModel); perspectiveProjMenuItem->SetActive(SS.usePerspectiveProj); + explodeMenuItem->SetActive(SS.explode); showToolbarMenuItem->SetActive(SS.showToolbar); fullScreenMenuItem->SetActive(SS.GW.window->IsFullScreen()); diff --git a/src/group.cpp b/src/group.cpp index 1fcbdedab..0f5a9e6a0 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -1190,3 +1190,6 @@ void Group::CopyEntity(IdList *el, el->Add(&en); } +bool Group::ShouldDrawExploded() const { + return SS.explode && h == SS.GW.activeGroup && type == Type::DRAWING_WORKPLANE && !SS.exportMode; +} diff --git a/src/sketch.h b/src/sketch.h index 9f73a32a2..6b58bb8ca 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -326,6 +326,7 @@ class Group { void DrawPolyError(Canvas *canvas); void DrawFilledPaths(Canvas *canvas); void DrawContourAreaLabels(Canvas *canvas); + bool ShouldDrawExploded() const; SPolygon GetPolygon(); @@ -371,6 +372,7 @@ class Request { std::string font; Platform::Path file; double aspectRatio; + int groupRequestIndex; static hParam AddParam(ParamList *param, hParam hp); void Generate(EntityList *entity, ParamList *param); @@ -594,6 +596,10 @@ class Entity : public EntityBase { beziers.l.Clear(); edges.l.Clear(); } + + bool ShouldDrawExploded() const; + Vector ExplodeOffset() const; + Vector PointGetDrawNum() const; }; class EntReqTable { @@ -763,7 +769,7 @@ class Constraint : public ConstraintBase { Vector p0, Vector p1, Vector pt, double salient); void DoArcForAngle(Canvas *canvas, Canvas::hStroke hcs, Vector a0, Vector da, Vector b0, Vector db, - Vector offset, Vector *ref, bool trim); + Vector offset, Vector *ref, bool trim, Vector explodeOffset); void DoArrow(Canvas *canvas, Canvas::hStroke hcs, Vector p, Vector dir, Vector n, double width, double angle, double da); void DoLineWithArrows(Canvas *canvas, Canvas::hStroke hcs, @@ -785,6 +791,8 @@ class Constraint : public ConstraintBase { std::string DescriptionString() const; + bool ShouldDrawExploded() const; + static hConstraint AddConstraint(Constraint *c, bool rememberForUndo = true); static void MenuConstrain(Command id); static void DeleteAllConstraintsFor(Constraint::Type type, hEntity entityA, hEntity ptA); diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 89b4a00d0..5d6d7b27f 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -19,6 +19,7 @@ void SolveSpaceUI::Init() { Platform::SettingsRef settings = Platform::GetSettings(); SS.tangentArcRadius = 10.0; + SS.explodeDistance = 1.0; // Then, load the registry settings. // Default list of colors for the model material @@ -1070,6 +1071,7 @@ void SolveSpaceUI::Clear() { GW.showGridMenuItem = NULL; GW.dimSolidModelMenuItem = NULL; GW.perspectiveProjMenuItem = NULL; + GW.explodeMenuItem = NULL; GW.showToolbarMenuItem = NULL; GW.showTextWndMenuItem = NULL; GW.fullScreenMenuItem = NULL; diff --git a/src/solvespace.h b/src/solvespace.h index 212977126..348a8e667 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -609,6 +609,8 @@ class SolveSpaceUI { int afterDecimalDegree; bool useSIPrefixes; int autosaveInterval; // in minutes + bool explode; + double explodeDistance; std::string MmToString(double v, bool editable=false); std::string MmToStringSI(double v, int dim = 0); diff --git a/src/ui.h b/src/ui.h index 90cef9f11..0700653af 100644 --- a/src/ui.h +++ b/src/ui.h @@ -82,6 +82,7 @@ enum class Command : uint32_t { SHOW_GRID, DIM_SOLID_MODEL, PERSPECTIVE_PROJ, + EXPLODE_SKETCH, ONTO_WORKPLANE, NEAREST_ORTHO, NEAREST_ISO, @@ -319,6 +320,7 @@ class TextWindow { AUTOSAVE_INTERVAL = 116, LIGHT_AMBIENT = 117, FIND_CONSTRAINT_TIMEOUT = 118, + EXPLODE_DISTANCE = 119, // For TTF text TTF_TEXT = 300, // For the step dimension screen @@ -488,6 +490,7 @@ class TextWindow { static void ScreenChangeExportMaxSegments(int link, uint32_t v); static void ScreenChangeCameraTangent(int link, uint32_t v); static void ScreenChangeGridSpacing(int link, uint32_t v); + static void ScreenChangeExplodeDistance(int link, uint32_t v); static void ScreenChangeDigitsAfterDecimal(int link, uint32_t v); static void ScreenChangeDigitsAfterDecimalDegree(int link, uint32_t v); static void ScreenChangeUseSIPrefixes(int link, uint32_t v); @@ -540,6 +543,7 @@ class GraphicsWindow { Platform::MenuItemRef showGridMenuItem; Platform::MenuItemRef dimSolidModelMenuItem; Platform::MenuItemRef perspectiveProjMenuItem; + Platform::MenuItemRef explodeMenuItem; Platform::MenuItemRef showToolbarMenuItem; Platform::MenuItemRef showTextWndMenuItem; Platform::MenuItemRef fullScreenMenuItem; From c729a7cc6097b4e1d09792fffa7dcc5b6e17ac50 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Wed, 18 Aug 2021 12:19:02 +0200 Subject: [PATCH 326/646] CI, NFC: Update libomp installation approach on macOS in the GitHub action (#1094) --- .github/scripts/build-macos.sh | 4 ++-- .github/scripts/install-macos.sh | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/scripts/build-macos.sh b/.github/scripts/build-macos.sh index fae7e27ff..3394a8af2 100755 --- a/.github/scripts/build-macos.sh +++ b/.github/scripts/build-macos.sh @@ -14,13 +14,13 @@ CMAKE_GENERATOR="Unix Makefiles" CMAKE_PREFIX_PATH="" if [ "$2" = "arm64" ]; then OSX_ARCHITECTURE="arm64" - CMAKE_PREFIX_PATH="/tmp/libomp-arm64/libomp/11.0.1" + CMAKE_PREFIX_PATH=$(find /tmp/libomp-arm64/libomp -depth 1) git apply cmake/libpng-macos-arm64.patch || echo "Could not apply patch, probably already patched..." mkdir build-arm64 || true cd build-arm64 elif [ "$2" = "x86_64" ]; then OSX_ARCHITECTURE="x86_64" - CMAKE_PREFIX_PATH="/tmp/libomp-x86_64/libomp/11.0.1" + CMAKE_PREFIX_PATH=$(find /tmp/libomp-x86_64/libomp -depth 1) mkdir build || true cd build else diff --git a/.github/scripts/install-macos.sh b/.github/scripts/install-macos.sh index c6ec104d4..be4b13ac8 100755 --- a/.github/scripts/install-macos.sh +++ b/.github/scripts/install-macos.sh @@ -1,10 +1,12 @@ #!/bin/sh -xe if [ "$1" = "ci" ]; then - curl -L https://bintray.com/homebrew/bottles/download_file?file_path=libomp-11.0.1.arm64_big_sur.bottle.tar.gz --output /tmp/libomp-arm64.tar.gz + armloc=$(brew fetch --bottle-tag=arm64_big_sur libomp | grep -i downloaded | grep tar.gz | cut -f2 -d:) + x64loc=$(brew fetch --bottle-tag=big_sur libomp | grep -i downloaded | grep tar.gz | cut -f2 -d:) + cp $armloc /tmp/libomp-arm64.tar.gz mkdir /tmp/libomp-arm64 || true tar -xzvf /tmp/libomp-arm64.tar.gz -C /tmp/libomp-arm64 - curl -L https://bintray.com/homebrew/bottles/download_file?file_path=libomp-11.0.1.big_sur.bottle.tar.gz --output /tmp/libomp-x86_64.tar.gz + cp $x64loc /tmp/libomp-x86_64.tar.gz mkdir /tmp/libomp-x86_64 || true tar -xzvf /tmp/libomp-x86_64.tar.gz -C /tmp/libomp-x86_64 else From 03391573d609c446a8dfbcc59b4676628923f5e0 Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Fri, 20 Aug 2021 18:55:30 +0100 Subject: [PATCH 327/646] Show suppressed groups in gray in the text window --- src/textscreens.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/textscreens.cpp b/src/textscreens.cpp index 3474b5191..8a43f3de1 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -129,7 +129,7 @@ void TextWindow::ShowListOfGroups() { "%Ft%s%Fb%D%f%Ll%s%E " "%Fb%s%D%f%Ll%s%E " "%Fp%D%f%s%Ll%s%E " - "%Fl%Ll%D%f%s", + "%Fp%Ll%D%f%s", // Alternate between light and dark backgrounds, for readability backgroundParity ? 'd' : 'a', // Link that activates the group @@ -146,6 +146,7 @@ void TextWindow::ShowListOfGroups() { ok ? ((warn && SS.checkClosedContour) ? "err" : sdof) : "", ok ? "" : "ERR", // Link to a screen that gives more details on the group + g->suppress ? 'g' : 'l', g->h.v, (&TextWindow::ScreenSelectGroup), s.c_str()); if(active) afterActive = true; From 4338c07fd92082176de4dceb3ea7eb53599c7d42 Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Sat, 21 Aug 2021 16:27:42 +0100 Subject: [PATCH 328/646] Darken disabled gray to 50% and document it. --- src/textwin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/textwin.cpp b/src/textwin.cpp index 599844ccf..d0755b07d 100644 --- a/src/textwin.cpp +++ b/src/textwin.cpp @@ -203,7 +203,7 @@ const TextWindow::Color TextWindow::fgColors[] = { { 'r', RGBi( 0, 0, 0) }, // Reverse : black { 'x', RGBi(255, 20, 20) }, // Error : red { 'i', RGBi( 0, 255, 255) }, // Info : cyan - { 'g', RGBi(160, 160, 160) }, + { 'g', RGBi(128, 128, 128) }, // Disabled : gray { 'b', RGBi(200, 200, 200) }, { 0, RGBi( 0, 0, 0) } }; From a7c2639d569f663b0bd3df86c193079eb9be5052 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 21 Aug 2021 20:27:47 -0400 Subject: [PATCH 329/646] Update CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6f1f57ff..e26f14bcf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,9 @@ Constraints: Sketching: +* Gray the group name in the text window for groups with suppressed solid model. +* Add "exploded view" to sketches via "\\" key. Shows sketch elements separated + by a configurable distance perpendicular to the sketch plane. * Added Feet-Inches as a unit of measure. Inputs are still in inches. But the display shows feet, inches, and fraction of an inch. * Added an optional "pitch" parameter to helix extrusions (in the text window) From 48a822b291a7085fbe94f030e98327a0ca767342 Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Sun, 22 Aug 2021 13:53:56 +0100 Subject: [PATCH 330/646] =?UTF-8?q?Add=20a=20"=E2=88=86"=20suffix=20to=20g?= =?UTF-8?q?roups=20which=20have=20"force=20to=20triangle=20mesh"=20ticked.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/textscreens.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/textscreens.cpp b/src/textscreens.cpp index 8a43f3de1..628aff39c 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -123,13 +123,18 @@ void TextWindow::ShowListOfGroups() { sprintf(sdof, "%-3d", dof); } } + std::string suffix; + if(g->forceToMesh) { + suffix = " (∆)"; + } + bool ref = (g->h == Group::HGROUP_REFERENCES); Printf(false, "%Bp%Fd " "%Ft%s%Fb%D%f%Ll%s%E " "%Fb%s%D%f%Ll%s%E " "%Fp%D%f%s%Ll%s%E " - "%Fp%Ll%D%f%s", + "%Fp%Ll%D%f%s%E%s", // Alternate between light and dark backgrounds, for readability backgroundParity ? 'd' : 'a', // Link that activates the group @@ -147,7 +152,8 @@ void TextWindow::ShowListOfGroups() { ok ? "" : "ERR", // Link to a screen that gives more details on the group g->suppress ? 'g' : 'l', - g->h.v, (&TextWindow::ScreenSelectGroup), s.c_str()); + g->h.v, (&TextWindow::ScreenSelectGroup), s.c_str(), + suffix.c_str()); if(active) afterActive = true; backgroundParity = !backgroundParity; From b7e3bea9014f37b4b8bd2d4d4c8314838a75919b Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Tue, 24 Aug 2021 20:44:51 +0100 Subject: [PATCH 331/646] Correct which group is forced to mesh when linking an STL file MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By making IsForcedToMesh() always return true for STL link groups, rather than trying to set forceToMesh=true during the import phase. STL link groups are now always shown as "model already forced to triangle mesh" in the details screen, but also (unlike when the model is forced to mesh by a parent group) show the '∆' icon in the group list. --- src/group.cpp | 6 +++++- src/importmesh.cpp | 1 - src/sketch.h | 1 + src/textscreens.cpp | 4 ++-- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/group.cpp b/src/group.cpp index 0f5a9e6a0..1cb1a1b8f 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -404,7 +404,11 @@ bool Group::IsForcedToMeshBySource() const { } bool Group::IsForcedToMesh() const { - return forceToMesh || IsForcedToMeshBySource(); + return forceToMesh || IsTriangleMeshAssembly() || IsForcedToMeshBySource(); +} + +bool Group::IsTriangleMeshAssembly() const { + return type == Type::LINKED && linkFile.Extension() == "stl"; } std::string Group::DescriptionString() { diff --git a/src/importmesh.cpp b/src/importmesh.cpp index 211517531..df9a65bfc 100644 --- a/src/importmesh.cpp +++ b/src/importmesh.cpp @@ -171,7 +171,6 @@ bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s addUnique(verts, tr.b, normal); addUnique(verts, tr.c, normal); } - SK.GetGroup(SS.GW.activeGroup)->forceToMesh = true; dbp("%d verticies", verts.size()); BBox box = {}; diff --git a/src/sketch.h b/src/sketch.h index 6b58bb8ca..812375f4f 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -269,6 +269,7 @@ class Group { void Generate(EntityList *entity, ParamList *param); bool IsSolvedOkay(); void TransformImportedBy(Vector t, Quaternion q); + bool IsTriangleMeshAssembly() const; bool IsForcedToMeshBySource() const; bool IsForcedToMesh() const; // When a request generates entities from entities, and the source diff --git a/src/textscreens.cpp b/src/textscreens.cpp index 628aff39c..22553827b 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -124,7 +124,7 @@ void TextWindow::ShowListOfGroups() { } } std::string suffix; - if(g->forceToMesh) { + if(g->forceToMesh || g->IsTriangleMeshAssembly()) { suffix = " (∆)"; } @@ -495,7 +495,7 @@ void TextWindow::ShowGroupInfo() { &TextWindow::ScreenChangeGroupOption, g->visible ? CHECK_TRUE : CHECK_FALSE); - if(!g->IsForcedToMeshBySource()) { + if(!g->IsForcedToMeshBySource() && !g->IsTriangleMeshAssembly()) { Printf(false, " %f%Lf%Fd%s force NURBS surfaces to triangle mesh", &TextWindow::ScreenChangeGroupOption, g->forceToMesh ? CHECK_TRUE : CHECK_FALSE); From 01f3bca90a0e25fc878cdfa0a83b9b4c11b99b15 Mon Sep 17 00:00:00 2001 From: tomsci Date: Thu, 26 Aug 2021 13:03:28 +0100 Subject: [PATCH 332/646] mac: Support external quit requests (#1099) By no longer always returning NSTerminateCancel in applicationShouldTerminate. And implement applicationWillTerminate to ensure the cleanup code in SolveSpaceUI::Exit() is always called. --- src/platform/guimac.mm | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index f9a95fcbd..588d92bff 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -1427,9 +1427,22 @@ @interface SSApplicationDelegate : NSObject - (IBAction)preferences:(id)sender; - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename; - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; + +@property BOOL exiting; + @end @implementation SSApplicationDelegate + +@synthesize exiting; + +- (id)init { + if (self = [super init]) { + self.exiting = false; + } + return self; +} + - (IBAction)preferences:(id)sender { if (!SS.GW.showTextWindow) { SolveSpace::SS.GW.MenuView(SolveSpace::Command::SHOW_TEXT_WND); @@ -1444,12 +1457,27 @@ - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filenam } - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { - [[[NSApp mainWindow] delegate] windowShouldClose:[NSApp mainWindow]]; - return NSTerminateCancel; + if(!SS.unsaved) { + return NSTerminateNow; + } else { + [self performSelectorOnMainThread:@selector(applicationTerminatePrompt) withObject:nil + waitUntilDone:NO modes:@[NSDefaultRunLoopMode, NSModalPanelRunLoopMode]]; + return NSTerminateLater; + } +} + +- (void)applicationWillTerminate:(NSNotification *)notification { + if(!exiting) { + // Prevent the Platform::ExitGui() call from SolveSpaceUI::Exit() + // triggering another terminate + exiting = true; + // Now let SS save settings etc + SS.Exit(); + } } - (void)applicationTerminatePrompt { - SolveSpace::SS.MenuFile(SolveSpace::Command::EXIT); + [NSApp replyToApplicationShouldTerminate:SS.OkayToStartNewFile()]; } @end @@ -1488,8 +1516,10 @@ void RunGui() { } void ExitGui() { - [NSApp setDelegate:nil]; - [NSApp terminate:nil]; + if(!ssDelegate.exiting) { + ssDelegate.exiting = true; + [NSApp terminate:nil]; + } } void ClearGui() {} From deb7f59eedd3ce9723894c8943d4cf1f3d3e0e98 Mon Sep 17 00:00:00 2001 From: tomsci Date: Fri, 27 Aug 2021 00:58:33 +0100 Subject: [PATCH 333/646] mac: Support for pan, zoom and rotate trackpad gestures (#1093) * mac: Support for pan, zoom and rotate trackpad gestures Currently SolveSpace is nearly unusable on a mac if you only have a buttonless trackpad and not a mouse, because there's no way to pan (ie right-click-drag) or rotate (ie middle-click-drag). You can zoom, but only by using two-finger-drag up and down, which ends up getting interpreted as a scrollwheel event. This change makes the app behave much more like any other mac app, by adding 2-finger-drag pan gesture support and pinch-gesture zooming, and 3D rotate using shift-2-finger-drag. I've also added support for the rotate two-finger trackpad gesture, which rotates directly around the screen Z axis (rather than in all 3 dimensions) which is actually something I've found myself wanting to do with the mouse but afaik there's no equivalent way of achieving that. While I was there, I fixed a bugette in convertMouseEvent which was incorrectly translating the NSEvent coordinates, and then fixing up the fact that the sign of the y-coordinate was wrong as a result. Using the convertPoint API correctly means that fixup is not required because convertPoint handles it for you. * Don't do trackpad gestures on anything except the toplevel window * mac: Fix non-functional scrollbar on text window Which has not worked quite right since the last major refactor. * Don't pass right-button drags to the toolbar This improves the behaviour of trackpad pan/rotate on mac which uses simulated right-button events. * Don't pass cmd/ctrl modifier through on trackpad pan/rotate MouseEvents --- src/mouse.cpp | 5 +- src/platform/guimac.mm | 161 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 146 insertions(+), 20 deletions(-) diff --git a/src/mouse.cpp b/src/mouse.cpp index 373e6ea28..5e7cde269 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -103,7 +103,10 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, shiftDown = !shiftDown; } - if(SS.showToolbar) { + // Not passing right-button and middle-button drags to the toolbar avoids + // some cosmetic issues with trackpad pans/rotates implemented with + // simulated right-button drag events causing spurious hover events. + if(SS.showToolbar && !middleDown) { if(ToolbarMouseMoved((int)x, (int)y)) { hover.Clear(); return; diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index 588d92bff..530e0404d 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -359,18 +359,25 @@ - (void)stopEditing; - (void)didEdit:(NSString *)text; @property double scrollerMin; -@property double scrollerMax; +@property double scrollerSize; +@property double pageSize; + @end @implementation SSView { NSTrackingArea *trackingArea; NSTextField *editor; + double magnificationGestureCurrentZ; + double rotationGestureCurrent; + Point2d trackpadPositionShift; + bool inTrackpadScrollGesture; + Platform::Window::Kind kind; } @synthesize acceptsFirstResponder; -- (id)initWithFrame:(NSRect)frameRect { +- (id)initWithKind:(Platform::Window::Kind)aKind { NSOpenGLPixelFormatAttribute attrs[] = { NSOpenGLPFADoubleBuffer, NSOpenGLPFAColorSize, 24, @@ -378,7 +385,7 @@ - (id)initWithFrame:(NSRect)frameRect { 0 }; NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; - if(self = [super initWithFrame:frameRect pixelFormat:pixelFormat]) { + if(self = [super initWithFrame:NSMakeRect(0, 0, 0, 0) pixelFormat:pixelFormat]) { self.wantsBestResolutionOpenGLSurface = YES; self.wantsLayer = YES; editor = [[NSTextField alloc] init]; @@ -388,6 +395,18 @@ - (id)initWithFrame:(NSRect)frameRect { editor.bezeled = NO; editor.target = self; editor.action = @selector(didEdit:); + + inTrackpadScrollGesture = false; + kind = aKind; + if(kind == Platform::Window::Kind::TOPLEVEL) { + NSGestureRecognizer *mag = [[NSMagnificationGestureRecognizer alloc] initWithTarget:self + action:@selector(magnifyGesture:)]; + [self addGestureRecognizer:mag]; + + NSRotationGestureRecognizer* rot = [[NSRotationGestureRecognizer alloc] initWithTarget:self + action:@selector(rotateGesture:)]; + [self addGestureRecognizer:rot]; + } } return self; } @@ -428,9 +447,9 @@ - (void)updateTrackingAreas { - (Platform::MouseEvent)convertMouseEvent:(NSEvent *)nsEvent { Platform::MouseEvent event = {}; - NSPoint nsPoint = [self convertPoint:nsEvent.locationInWindow fromView:self]; + NSPoint nsPoint = [self convertPoint:nsEvent.locationInWindow fromView:nil]; event.x = nsPoint.x; - event.y = self.bounds.size.height - nsPoint.y; + event.y = nsPoint.y; NSUInteger nsFlags = [nsEvent modifierFlags]; if(nsFlags & NSEventModifierFlagShift) event.shiftDown = true; @@ -554,14 +573,57 @@ - (void)scrollWheel:(NSEvent *)nsEvent { using Platform::MouseEvent; MouseEvent event = [self convertMouseEvent:nsEvent]; + if(nsEvent.subtype == NSEventSubtypeTabletPoint && kind == Platform::Window::Kind::TOPLEVEL) { + // This is how Cocoa represents 2 finger trackpad drag gestures, rather than going via + // NSPanGestureRecognizer which is how you might expect this to work... We complicate this + // further by also handling shift-two-finger-drag to mean rotate. Fortunately we're using + // shift in the same way as right-mouse-button MouseEvent does (to converts a pan to a + // rotate) so we get the rotate support for free. It's a bit ugly having to fake mouse + // events and track the deviation from the actual mouse cursor with trackpadPositionShift, + // but in lieu of an event API that allows us to request a rotate/pan with relative + // coordinates, it's the best we can do. + event.button = MouseEvent::Button::RIGHT; + // Make sure control (actually cmd) isn't passed through, ctrl-right-click-drag has special + // meaning as rotate which we don't want to inadvertently trigger. + event.controlDown = false; + if(nsEvent.scrollingDeltaX == 0 && nsEvent.scrollingDeltaY == 0) { + // Cocoa represents the point where the user lifts their fingers off (and any inertial + // scrolling has finished) by an event with scrollingDeltaX and scrollingDeltaY both 0. + // Sometimes you also get a zero scroll at the start of a two-finger-rotate (probably + // reflecting the internal implementation of that being a cancelled possible pan + // gesture), which is why this conditional is structured the way it is. + if(inTrackpadScrollGesture) { + event.x += trackpadPositionShift.x; + event.y += trackpadPositionShift.y; + event.type = MouseEvent::Type::RELEASE; + receiver->onMouseEvent(event); + inTrackpadScrollGesture = false; + trackpadPositionShift = Point2d::From(0, 0); + } + return; + } else if(!inTrackpadScrollGesture) { + inTrackpadScrollGesture = true; + trackpadPositionShift = Point2d::From(0, 0); + event.type = MouseEvent::Type::PRESS; + receiver->onMouseEvent(event); + // And drop through + } + + trackpadPositionShift.x += nsEvent.scrollingDeltaX; + trackpadPositionShift.y += nsEvent.scrollingDeltaY; + event.type = MouseEvent::Type::MOTION; + event.x += trackpadPositionShift.x; + event.y += trackpadPositionShift.y; + receiver->onMouseEvent(event); + return; + } + event.type = MouseEvent::Type::SCROLL_VERT; bool isPrecise = [nsEvent hasPreciseScrollingDeltas]; event.scrollDelta = [nsEvent scrollingDeltaY] / (isPrecise ? 50 : 5); - if(receiver->onMouseEvent) { - receiver->onMouseEvent(event); - } + receiver->onMouseEvent(event); } - (void)mouseExited:(NSEvent *)nsEvent { @@ -639,6 +701,50 @@ - (void)keyUp:(NSEvent *)nsEvent { [super keyUp:nsEvent]; } +- (void)magnifyGesture:(NSMagnificationGestureRecognizer *)gesture { + // The onSixDofEvent API doesn't allow us to specify the scaling's origin, so for expediency + // we fake out a scrollwheel MouseEvent with a suitably-scaled scrollDelta with a bit of + // absolute-to-relative positioning conversion tracked using magnificationGestureCurrentZ. + + if(gesture.state == NSGestureRecognizerStateBegan) { + magnificationGestureCurrentZ = 0.0; + } + + // Magic number to make gesture.magnification align roughly with what scrollDelta expects + constexpr double kScale = 10.0; + double z = ((double)gesture.magnification * kScale); + double zdelta = z - magnificationGestureCurrentZ; + magnificationGestureCurrentZ = z; + + using Platform::MouseEvent; + MouseEvent event = {}; + event.type = MouseEvent::Type::SCROLL_VERT; + NSPoint nsPoint = [gesture locationInView:self]; + event.x = nsPoint.x; + event.y = nsPoint.y; + event.scrollDelta = zdelta; + if(receiver->onMouseEvent) { + receiver->onMouseEvent(event); + } +} + +- (void)rotateGesture:(NSRotationGestureRecognizer *)gesture { + if(gesture.state == NSGestureRecognizerStateBegan) { + rotationGestureCurrent = 0.0; + } + double rotation = gesture.rotation; + double rotationDelta = rotation - rotationGestureCurrent; + rotationGestureCurrent = rotation; + + using Platform::SixDofEvent; + SixDofEvent event = {}; + event.type = SixDofEvent::Type::MOTION; + event.rotationZ = rotationDelta; + if(receiver->onSixDofEvent) { + receiver->onSixDofEvent(event); + } +} + @synthesize editing; - (void)startEditing:(NSString *)text at:(NSPoint)origin withHeight:(double)fontHeight @@ -699,11 +805,27 @@ - (void)cancelOperation:(id)sender { } @synthesize scrollerMin; -@synthesize scrollerMax; +@synthesize scrollerSize; +@synthesize pageSize; - (void)didScroll:(NSScroller *)sender { + double pos; + switch(sender.hitPart) { + case NSScrollerKnob: + case NSScrollerKnobSlot: + pos = receiver->GetScrollbarPosition(); + break; + case NSScrollerDecrementPage: + pos = receiver->GetScrollbarPosition() - pageSize; + break; + case NSScrollerIncrementPage: + pos = receiver->GetScrollbarPosition() + pageSize; + break; + default: + return; + } + if(receiver->onScrollbarAdjusted) { - double pos = scrollerMin + [sender doubleValue] * (scrollerMax - scrollerMin); receiver->onScrollbarAdjusted(pos); } } @@ -770,7 +892,7 @@ - (void)windowDidExitFullScreen:(NSNotification *)notification { NSString *nsToolTip; WindowImplCocoa(Window::Kind kind, std::shared_ptr parentWindow) { - ssView = [[SSView alloc] init]; + ssView = [[SSView alloc] initWithKind:kind]; ssView.translatesAutoresizingMaskIntoConstraints = NO; ssView.receiver = this; @@ -963,21 +1085,22 @@ void SetScrollbarVisible(bool visible) override { void ConfigureScrollbar(double min, double max, double pageSize) override { ssView.scrollerMin = min; - ssView.scrollerMax = max - pageSize; - [nsScroller setKnobProportion:(pageSize / (ssView.scrollerMax - ssView.scrollerMin))]; + ssView.scrollerSize = max + 1 - min; + ssView.pageSize = pageSize; + nsScroller.knobProportion = pageSize / ssView.scrollerSize; + nsScroller.hidden = pageSize >= ssView.scrollerSize; } double GetScrollbarPosition() override { + // Platform::Window scrollbar positions are in the range [min, max+1 - pageSize] inclusive, + // and Cocoa scrollbars are from 0.0 to 1.0 inclusive, so we have to apply some scaling and + // transforming. (scrollerSize is max+1-min, see ConfigureScrollbar above) return ssView.scrollerMin + - [nsScroller doubleValue] * (ssView.scrollerMax - ssView.scrollerMin); + nsScroller.doubleValue * (ssView.scrollerSize - ssView.pageSize); } void SetScrollbarPosition(double pos) override { - if(pos > ssView.scrollerMax) - pos = ssView.scrollerMax; - if(GetScrollbarPosition() == pos) - return; - [nsScroller setDoubleValue:(pos / (ssView.scrollerMax - ssView.scrollerMin))]; + nsScroller.doubleValue = (pos - ssView.scrollerMin) / ( ssView.scrollerSize - ssView.pageSize); } void Invalidate() override { From 11961357f6dc4b0e590a45306db3b8dfd4c401a9 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 27 Aug 2021 19:38:26 -0400 Subject: [PATCH 334/646] Update CHANGELOG.md --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e26f14bcf..76eb5283c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ Constraints: Sketching: -* Gray the group name in the text window for groups with suppressed solid model. +* Support for pan, zoom and rotate trackpad gestures on macOS * Add "exploded view" to sketches via "\\" key. Shows sketch elements separated by a configurable distance perpendicular to the sketch plane. * Added Feet-Inches as a unit of measure. Inputs are still in inches. @@ -23,6 +23,8 @@ Sketching: MISC: +* 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. * When linking circuit boards (IDF .emn files) show keepout regions as construction entities. From 226ca0b84d530669be64316a3237415125866f8e Mon Sep 17 00:00:00 2001 From: tomsci Date: Sat, 28 Aug 2021 21:09:48 +0100 Subject: [PATCH 335/646] mac: Remove spurious view menu items (#1101) Which are either not applicable for SolveSpace (the tabs ones) or are already handled in the platform-independent code (the fullscreen item). --- src/platform/guimac.mm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index 530e0404d..67d1eb976 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -1621,6 +1621,14 @@ - (void)applicationTerminatePrompt { ssDelegate = [[SSApplicationDelegate alloc] init]; NSApplication.sharedApplication.delegate = ssDelegate; + // Setting this prevents "Show Tab Bar" and "Show All Tabs" items from being + // automagically added to the View menu + NSWindow.allowsAutomaticWindowTabbing = NO; + + // And this prevents the duplicate "Enter Full Screen" menu item, see + // https://stackoverflow.com/questions/52154977/how-to-get-rid-of-enter-full-screen-menu-item + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"NSFullScreenMenuItemEverywhere"]; + [NSBundle.mainBundle loadNibNamed:@"MainMenu" owner:nil topLevelObjects:nil]; NSArray *languages = NSLocale.preferredLanguages; From 409ea843813a0c552f70805a29d8e5973eac7610 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 29 Aug 2021 13:17:54 -0400 Subject: [PATCH 336/646] move perspective, lighting, and explode distance from configuration screen to view screen. --- src/confscreen.cpp | 49 ------------------------------------------ src/view.cpp | 53 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 51 insertions(+), 51 deletions(-) diff --git a/src/confscreen.cpp b/src/confscreen.cpp index 29a435910..2eb9534ff 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -9,24 +9,6 @@ #include #endif -void TextWindow::ScreenChangeLightDirection(int link, uint32_t v) { - SS.TW.ShowEditControl(8, ssprintf("%.2f, %.2f, %.2f", CO(SS.lightDir[v]))); - SS.TW.edit.meaning = Edit::LIGHT_DIRECTION; - SS.TW.edit.i = v; -} - -void TextWindow::ScreenChangeLightIntensity(int link, uint32_t v) { - SS.TW.ShowEditControl(31, ssprintf("%.2f", SS.lightIntensity[v])); - SS.TW.edit.meaning = Edit::LIGHT_INTENSITY; - SS.TW.edit.i = v; -} - -void TextWindow::ScreenChangeLightAmbient(int link, uint32_t v) { - SS.TW.ShowEditControl(31, ssprintf("%.2f", SS.ambientIntensity)); - SS.TW.edit.meaning = Edit::LIGHT_AMBIENT; - SS.TW.edit.i = 0; -} - void TextWindow::ScreenChangeColor(int link, uint32_t v) { SS.TW.ShowEditControlWithColorPicker(13, SS.modelColor[v]); @@ -58,21 +40,11 @@ void TextWindow::ScreenChangeExportMaxSegments(int link, uint32_t v) { SS.TW.edit.i = 1; } -void TextWindow::ScreenChangeCameraTangent(int link, uint32_t v) { - SS.TW.ShowEditControl(3, ssprintf("%.3f", 1000*SS.cameraTangent)); - SS.TW.edit.meaning = Edit::CAMERA_TANGENT; -} - void TextWindow::ScreenChangeGridSpacing(int link, uint32_t v) { SS.TW.ShowEditControl(3, SS.MmToString(SS.gridSpacing, true)); SS.TW.edit.meaning = Edit::GRID_SPACING; } -void TextWindow::ScreenChangeExplodeDistance(int link, uint32_t v) { - SS.TW.ShowEditControl(3, SS.MmToString(SS.explodeDistance, true)); - SS.TW.edit.meaning = Edit::EXPLODE_DISTANCE; -} - void TextWindow::ScreenChangeDigitsAfterDecimal(int link, uint32_t v) { SS.TW.ShowEditControl(14, ssprintf("%d", SS.UnitDigitsAfterDecimal())); SS.TW.edit.meaning = Edit::DIGITS_AFTER_DECIMAL; @@ -232,18 +204,6 @@ void TextWindow::ShowConfiguration() { &ScreenChangeColor, i); } - Printf(false, ""); - Printf(false, "%Ft light direction intensity"); - for(i = 0; i < 2; i++) { - Printf(false, "%Bp #%d (%2,%2,%2)%Fl%D%f%Ll[c]%E " - "%2 %Fl%D%f%Ll[c]%E", - (i & 1) ? 'd' : 'a', i, - CO(SS.lightDir[i]), i, &ScreenChangeLightDirection, - SS.lightIntensity[i], i, &ScreenChangeLightIntensity); - } - Printf(false, "%Ba ambient lighting %2 %Fl%f%Ll[c]%E", - SS.ambientIntensity, &ScreenChangeLightAmbient); - Printf(false, ""); Printf(false, "%Ft chord tolerance (in percents)%E"); Printf(false, "%Ba %@ %% %Fl%Ll%f%D[change]%E; %@ mm, %d triangles", @@ -265,19 +225,10 @@ void TextWindow::ShowConfiguration() { SS.exportMaxSegments, &ScreenChangeExportMaxSegments); - Printf(false, ""); - Printf(false, "%Ft perspective factor (0 for parallel)%E"); - Printf(false, "%Ba %# %Fl%Ll%f%D[change]%E", - SS.cameraTangent*1000, - &ScreenChangeCameraTangent, 0); Printf(false, "%Ft snap grid spacing%E"); Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E", SS.MmToString(SS.gridSpacing).c_str(), &ScreenChangeGridSpacing, 0); - Printf(false, "%Ft explode distance%E"); - Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E", - SS.MmToString(SS.explodeDistance).c_str(), - &ScreenChangeExplodeDistance, 0); Printf(false, ""); Printf(false, "%Ft digits after decimal point to show%E"); diff --git a/src/view.cpp b/src/view.cpp index 9c85ce6b8..99067bc53 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -35,8 +35,29 @@ void TextWindow::ShowEditView() { Printf(false, "%Ba %Ftout%E (%3, %3, %3)", CO(n)); Printf(false, ""); - Printf(false, "The perspective may be changed in the"); - Printf(false, "configuration screen."); + Printf(false, "%Ft perspective factor (0 for parallel)%E"); + Printf(false, "%Ba %# %Fl%Ll%f%D[change]%E", + SS.cameraTangent*1000, + &ScreenChangeCameraTangent, 0); + + Printf(false, ""); + Printf(false, "%Ft light direction intensity"); + for(int i = 0; i < 2; i++) { + Printf(false, "%Bp #%d (%2,%2,%2)%Fl%D%f%Ll[c]%E " + "%2 %Fl%D%f%Ll[c]%E", + (i & 1) ? 'd' : 'a', i, + CO(SS.lightDir[i]), i, &ScreenChangeLightDirection, + SS.lightIntensity[i], i, &ScreenChangeLightIntensity); + } + Printf(false, "%Ba ambient lighting %2 %Fl%f%Ll[c]%E", + SS.ambientIntensity, &ScreenChangeLightAmbient); + + Printf(false, ""); + Printf(false, "%Ft explode distance%E"); + Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.explodeDistance).c_str(), + &ScreenChangeExplodeDistance, 0); + } void TextWindow::ScreenChangeViewScale(int link, uint32_t v) { @@ -66,6 +87,34 @@ void TextWindow::ScreenChangeViewProjection(int link, uint32_t v) { SS.TW.ShowEditControl(10, edit_value); } +void TextWindow::ScreenChangeLightDirection(int link, uint32_t v) { + SS.TW.ShowEditControl(8, ssprintf("%.2f, %.2f, %.2f", CO(SS.lightDir[v]))); + SS.TW.edit.meaning = Edit::LIGHT_DIRECTION; + SS.TW.edit.i = v; +} + +void TextWindow::ScreenChangeLightIntensity(int link, uint32_t v) { + SS.TW.ShowEditControl(31, ssprintf("%.2f", SS.lightIntensity[v])); + SS.TW.edit.meaning = Edit::LIGHT_INTENSITY; + SS.TW.edit.i = v; +} + +void TextWindow::ScreenChangeLightAmbient(int link, uint32_t v) { + SS.TW.ShowEditControl(31, ssprintf("%.2f", SS.ambientIntensity)); + SS.TW.edit.meaning = Edit::LIGHT_AMBIENT; + SS.TW.edit.i = 0; +} + +void TextWindow::ScreenChangeCameraTangent(int link, uint32_t v) { + SS.TW.ShowEditControl(3, ssprintf("%.3f", 1000*SS.cameraTangent)); + SS.TW.edit.meaning = Edit::CAMERA_TANGENT; +} + +void TextWindow::ScreenChangeExplodeDistance(int link, uint32_t v) { + SS.TW.ShowEditControl(3, SS.MmToString(SS.explodeDistance, true)); + SS.TW.edit.meaning = Edit::EXPLODE_DISTANCE; +} + bool TextWindow::EditControlDoneForView(const std::string &s) { switch(edit.meaning) { case Edit::VIEW_SCALE: { From 7139f099fdc7b0652bf886ea475c58b562b9fdea Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Mon, 19 Apr 2021 14:48:16 +0200 Subject: [PATCH 337/646] snap: Fetch tags for snap builds in CI & mention stable channel in README The snaps use git describe to determine their grade (stable/devel). Fetch the tags to make this possible. Point users to the official release in the stable channel in README.md. --- .github/workflows/cd.yml | 4 ++++ README.md | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index dde06b802..0d3b975cf 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -118,6 +118,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - name: Fetch Tags + run: git fetch --force --tags - name: Set Up Source run: rsync --filter=":- .gitignore" -r ./ pkg/snap/solvespace-snap-src - name: Build Snap @@ -149,6 +151,8 @@ jobs: with: image: tonistiigi/binfmt@sha256:df15403e06a03c2f461c1f7938b171fda34a5849eb63a70e2a2109ed5a778bde - uses: actions/checkout@v2 + - name: Fetch Tags + run: git fetch --force --tags - name: Set Up Source run: rsync --filter=":- .gitignore" -r ./ pkg/snap/solvespace-snap-src - name: Build Snap diff --git a/README.md b/README.md index 9b6cb2253..b3c409475 100644 --- a/README.md +++ b/README.md @@ -37,16 +37,19 @@ the SolveSpace maintainers for each stable release. ### Via Snap Store -Builds from master are automatically released to the `edge` channel in the Snap Store. Those packages contain the latest improvements, but receive less testing than release builds. +Official releases can be installed from the `stable` channel. -Future official releases will appear in the `stable` channel. +Builds from master are automatically released to the `edge` channel in the Snap Store. Those packages contain the latest improvements, but receive less testing than release builds. [![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/solvespace) Or install from a terminal: ``` -snap install --edge solvespace +# for the latest stable release: +snap install solvespace +# for the bleeding edge builds from master: +snap install solvespace --edge ``` ### Via third-party binary packages From cc8c80e839690044542598901e931dd33156cd14 Mon Sep 17 00:00:00 2001 From: andesfreedesign <81501376+andesfreedesign@users.noreply.github.com> Date: Fri, 17 Sep 2021 16:15:56 -0300 Subject: [PATCH 338/646] Add Spanish / Argentina translation --- res/locales/es_AR.po | 2177 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2177 insertions(+) create mode 100644 res/locales/es_AR.po diff --git a/res/locales/es_AR.po b/res/locales/es_AR.po new file mode 100644 index 000000000..82fd1b90a --- /dev/null +++ b/res/locales/es_AR.po @@ -0,0 +1,2177 @@ +# Spanish/Argentina translations for SolveSpace package. +# Copyright (C) 2017 the SolveSpace authors +# This file is distributed under the same license as the SolveSpace package. +# Maxi , 2021. +# +msgid "" +msgstr "" +"Project-Id-Version: SolveSpace 3.0\n" +"Report-Msgid-Bugs-To: whitequark@whitequark.org\n" +"POT-Creation-Date: 2021-09-17 \n" +"PO-Revision-Date: 2021-09-17 \n" +"Last-Translator: andesfreedesign@gmail.com\n" +"Language-Team: AndesFreeDesign\n" +"Language: es_AR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: clipboard.cpp:310 +msgid "" +"Cut, paste, and copy work only in a workplane.\n" +"\n" +"Activate one with Sketch -> In Workplane." +msgstr "" +"Cortar, pegar y copiar trabajo\n" +"solo en un plano de trabajo.\n" +"Activar uno con Croquis-> En Plano de trabajo" + +#: clipboard.cpp:327 +msgid "Clipboard is empty; nothing to paste." +msgstr "El portapapeles está vacío; nada que pegar." + +#: clipboard.cpp:374 +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:390 textscreens.cpp:783 +msgid "Scale cannot be zero." +msgstr "La escala no puede ser cero." + +#: clipboard.cpp:432 +msgid "Select one point to define origin of rotation." +msgstr "Seleccione un punto para definir el origen de la rotación." + +#: clipboard.cpp:444 +msgid "Select two points to define translation vector." +msgstr "Seleccione dos puntos para definir el vector de traslación." + +#: clipboard.cpp:454 +msgid "" +"Transformation is identity. So all copies will be exactly on top of each " +"other." +msgstr "" +"No se especificó ninguna transformación. Todas las copias estarán ubicadas en el mismo lugar." + +#: clipboard.cpp:458 +msgid "Too many items to paste; split this into smaller pastes." +msgstr "Demasiados elementos para pegar; divida esto en partes más pequeñas." + +#: clipboard.cpp:463 +msgid "No workplane active." +msgstr "Ningún plano de trabajo activo." + +#: confscreen.cpp:418 +msgid "Bad format: specify coordinates as x, y, z" +msgstr "Formato incorrecto: especifique las coordenadas como x, y, z" + +#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +msgid "Bad format: specify color as r, g, b" +msgstr "Formato incorrecto: especifique color como r, g, b" + +#: confscreen.cpp:454 +msgid "" +"The perspective factor will have no effect until you enable View -> Use " +"Perspective Projection." +msgstr "" +"El factor de perspectiva no tendrá ningún efecto hasta que habilite Ver -> Usar" +"Proyección Perspectiva." + +#: confscreen.cpp:467 confscreen.cpp:477 +#, 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:489 +msgid "Export scale must not be zero!" +msgstr "¡La escala de exportación no debe ser cero!" + +#: confscreen.cpp:501 +msgid "Cutter radius offset must not be negative!" +msgstr "¡El desfase del radio de corte no debe ser negativo!" + +#: confscreen.cpp:555 +msgid "Bad value: autosave interval should be positive" +msgstr "" +"Valor incorrecto: el intervalo de autoguardado debe ser positivo" + +#: confscreen.cpp:558 +msgid "Bad format: specify interval in integral minutes" +msgstr "" +"Formato incorrecto: especifique el intervalo en minutos integrales" + +#: constraint.cpp:12 +msgctxt "constr-name" +msgid "pts-coincident" +msgstr "ps-coincidente" + +#: constraint.cpp:13 +msgctxt "constr-name" +msgid "pt-pt-distance" +msgstr "p-p-distancia" + +#: constraint.cpp:14 +msgctxt "constr-name" +msgid "pt-line-distance" +msgstr "p-línea-distancia" + +#: constraint.cpp:15 +msgctxt "constr-name" +msgid "pt-plane-distance" +msgstr "p-plano-distancia" + +#: constraint.cpp:16 +msgctxt "constr-name" +msgid "pt-face-distance" +msgstr "p-cara-distancia" + +#: constraint.cpp:17 +msgctxt "constr-name" +msgid "proj-pt-pt-distance" +msgstr "proy-p-p-distancia" + +#: constraint.cpp:18 +msgctxt "constr-name" +msgid "pt-in-plane" +msgstr "p-en-plano" + +#: constraint.cpp:19 +msgctxt "constr-name" +msgid "pt-on-line" +msgstr "p-sobre-línea" + +#: constraint.cpp:20 +msgctxt "constr-name" +msgid "pt-on-face" +msgstr "p-sobre-cara" + +#: constraint.cpp:21 +msgctxt "constr-name" +msgid "eq-length" +msgstr "igual-longitud" + +#: constraint.cpp:22 +msgctxt "constr-name" +msgid "eq-length-and-pt-ln-dist" +msgstr "igual-longitud-y-p-línea-dist" + +#: constraint.cpp:23 +msgctxt "constr-name" +msgid "eq-pt-line-distances" +msgstr "igual-p-línea-distancias" + +#: constraint.cpp:24 +msgctxt "constr-name" +msgid "length-ratio" +msgstr "longitud-radio" + +#: constraint.cpp:25 +msgctxt "constr-name" +msgid "length-difference" +msgstr "longitud-diferencia" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "symmetric" +msgstr "simetría" + +#: constraint.cpp:27 +msgctxt "constr-name" +msgid "symmetric-h" +msgstr "simetría-h" + +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "symmetric-v" +msgstr "simetría-v" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "symmetric-line" +msgstr "simetría-línea" + +#: constraint.cpp:30 +msgctxt "constr-name" +msgid "at-midpoint" +msgstr "en-puntoMedio" + +#: constraint.cpp:31 +msgctxt "constr-name" +msgid "horizontal" +msgstr "horizontal" + +#: constraint.cpp:32 +msgctxt "constr-name" +msgid "vertical" +msgstr "vertical" + +#: constraint.cpp:33 +msgctxt "constr-name" +msgid "diameter" +msgstr "diámetro" + +#: constraint.cpp:34 +msgctxt "constr-name" +msgid "pt-on-circle" +msgstr "p-sobre-círculo" + +#: constraint.cpp:35 +msgctxt "constr-name" +msgid "same-orientation" +msgstr "misma-orientación" + +#: constraint.cpp:36 +msgctxt "constr-name" +msgid "angle" +msgstr "ángulo" + +#: constraint.cpp:37 +msgctxt "constr-name" +msgid "parallel" +msgstr "paralela" + +#: constraint.cpp:38 +msgctxt "constr-name" +msgid "arc-line-tangent" +msgstr "arco-línea-tangente" + +#: constraint.cpp:39 +msgctxt "constr-name" +msgid "cubic-line-tangent" +msgstr "cúbica-línea-tangente" + +#: constraint.cpp:40 +msgctxt "constr-name" +msgid "curve-curve-tangent" +msgstr "curva-curva-tangente" + +#: constraint.cpp:41 +msgctxt "constr-name" +msgid "perpendicular" +msgstr "perpendicular" + +#: constraint.cpp:42 +msgctxt "constr-name" +msgid "eq-radius" +msgstr "igual-radio" + +#: constraint.cpp:43 +msgctxt "constr-name" +msgid "eq-angle" +msgstr "igual-ángulo" + +#: constraint.cpp:44 +msgctxt "constr-name" +msgid "eq-line-len-arc-len" +msgstr "igual-línea-long-arco-long" + +#: constraint.cpp:45 +msgctxt "constr-name" +msgid "lock-where-dragged" +msgstr "fijación" + +#: constraint.cpp:46 +msgctxt "constr-name" +msgid "comment" +msgstr "comentario" + +#: constraint.cpp:140 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "" +"El arco tangente y la línea deben compartir un punto final. Restringirlos con " +"Restringir -> En el punto antes de restringir la tangente." + +#: constraint.cpp:158 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." +msgstr "" +"La tangente cúbica y la línea deben compartir un punto final. Restringirlos con " +"Restringir -> En el punto antes de restringir la tangente." + +#: constraint.cpp:183 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." +msgstr "" +"Las curvas deben compartir un punto final. Restringirlos con " +"Restringir -> En el punto antes de restringir la tangente." + +#: constraint.cpp:231 +msgid "" +"Bad selection for distance / diameter constraint. This constraint can apply " +"to:\n" +"\n" +" * two points (distance between points)\n" +" * a line segment (length)\n" +" * two points and a line segment or normal (projected distance)\n" +" * a workplane and a point (minimum distance)\n" +" * a line segment and a point (minimum distance)\n" +" * a plane face and a point (minimum distance)\n" +" * a circle or an arc (diameter)\n" +msgstr "" +"Mala selección para la restricción de distancia / diámetro. Esta restricción puede aplicarse " +"a:\n" +"\n" +" * dos puntos (distancia entre puntos) \n" +" * un segmento de línea (longitud) \n" +" * dos puntos y un segmento de línea o normal (distancia proyectada) \n" +" * un plano de trabajo y un punto (distancia mínima) \n" +" * un segmento de línea y un punto (distancia mínima) \n" +" * una cara plana y un punto (distancia mínima) \n" +" * un círculo o un arco (diámetro) \n" + +#: constraint.cpp:284 +msgid "" +"Bad selection for on point / curve / plane constraint. This constraint can " +"apply to:\n" +"\n" +" * two points (points coincident)\n" +" * a point and a workplane (point in plane)\n" +" * a point and a line segment (point on line)\n" +" * a point and a circle or arc (point on curve)\n" +" * a point and a plane face (point on face)\n" +msgstr "" +"Mala selección para una restricción de punto / curva / plano. Esta restricción puede" +"aplicar a: \n" +"\n" +" * dos puntos (puntos coincidentes) \n" +" * un punto y un plano de trabajo (punto en el plano) \n" +" * un punto y un segmento de línea (punto en la línea) \n" +" * un punto y un círculo o arco (punto en la curva) \n" +" * un punto y una cara plana (punto en la cara) \n" + +#: constraint.cpp:346 +msgid "" +"Bad selection for equal length / radius constraint. This constraint can " +"apply to:\n" +"\n" +" * two line segments (equal length)\n" +" * two line segments and two points (equal point-line distances)\n" +" * a line segment and two points (equal point-line distances)\n" +" * a line segment, and a point and line segment (point-line distance " +"equals length)\n" +" * four line segments or normals (equal angle between A,B and C,D)\n" +" * three line segments or normals (equal angle between A,B and B,C)\n" +" * two circles or arcs (equal radius)\n" +" * a line segment and an arc (line segment length equals arc length)\n" +msgstr "" +"Mala selección para restricción de igualdad longitud / radio. Esta restricción puede " +"aplicar a:\n" +"\n" +" * dos segmentos de línea (igual longitud)\n" +" * dos segmentos de línea y dos puntos (distancias de línea-punto iguales)\n" +" * un segmento de línea y dos puntos (distancias punto-línea iguales)\n" +" * un segmento de línea, y un punto y un segmento de línea (distancia punto-línea " +"igual a la longitud)\n" +" * cuatro segmentos de línea o normales (ángulo igual entre A,B y C,D)\n" +" * tres segmentos de línea o normales (ángulo igual entre A,B y B,C)\n" +" * 2 círculos o arcos (igual radio)\n" +" * un segmento de línea y un arco (la longitud del segmento de línea es igual a la longitud del arco)\n" + +#: constraint.cpp:385 +msgid "" +"Bad selection for length ratio constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +msgstr "" +"Mala selección por restricción de la relación de longitud. Esta restricción se puede aplicar a:\n" +"\n" +" * dos segmentos de línea\n" + +#: constraint.cpp:402 +msgid "" +"Bad selection for length difference constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments\n" +msgstr "" +"Mala selección por restricción de diferencia de longitud. Esta restricción puede aplicar " +"a:\n" +"\n" +" * dos segmentos de línea\n" + +#: constraint.cpp:428 +msgid "" +"Bad selection for at midpoint constraint. This constraint can apply to:\n" +"\n" +" * a line segment and a point (point at midpoint)\n" +" * a line segment and a workplane (line's midpoint on plane)\n" +msgstr "" +"Mala selección para una restricción de punto medio. Esta restricción se puede aplicar a:\n" +"\n" +" * un segmento de línea y un punto (punto en el punto medio)\n" +" * un segmento de línea y un plano de trabajo (punto medio de la línea en el plano)\n" + +#: constraint.cpp:486 +msgid "" +"Bad selection for symmetric constraint. This constraint can apply to:\n" +"\n" +" * two points or a line segment (symmetric about workplane's coordinate " +"axis)\n" +" * line segment, and two points or a line segment (symmetric about line " +"segment)\n" +" * workplane, and two points or a line segment (symmetric about " +"workplane)\n" +msgstr "" +"Mala selección por restricción simétrica. Esta restricción se puede aplicar a:\n" +"\n" +" * dos puntos o un segmento de línea (simétrico con respecto al eje de coordenadas del " +"plano de trabajo)\n" +" * segmento de línea, y dos puntos o un segmento de línea (simétrico con respecto al segmento " +"de línea)\n" +" * plano de trabajo, y dos puntos o un segmento de recta (simétrico sobre " +"plano de trabajo)\n" + +#: constraint.cpp:500 +msgid "" +"A workplane must be active when constraining symmetric without an explicit " +"symmetry plane." +msgstr "" +"Un plano de trabajo debe estar activo al restringir simétrico sin un plano de " +"simetría explícito." + +#: constraint.cpp:530 +msgid "" +"Activate a workplane (with Sketch -> In Workplane) before applying a " +"horizontal or vertical constraint." +msgstr "" +"Active un plano de trabajo (con Croquis -> En plano de trabajo) antes de aplicar una " +"restricción horizontal o vertical." + +#: constraint.cpp:543 +msgid "" +"Bad selection for horizontal / vertical constraint. This constraint can " +"apply to:\n" +"\n" +" * two points\n" +" * a line segment\n" +msgstr "" +"Mala selección por restricción horizontal / vertical. Esta restricción puede " +"aplicar a:\n" +"\n" +" * dos puntos\n" +" * un segmento de línea\n" + +#: constraint.cpp:564 +msgid "" +"Bad selection for same orientation constraint. This constraint can apply " +"to:\n" +"\n" +" * two normals\n" +msgstr "" +"Mala selección para la misma restricción de orientación. Esta restricción puede aplicarse " +"a:\n" +"\n" +" * dos normales\n" + +#: constraint.cpp:614 +msgid "Must select an angle constraint." +msgstr "Debe seleccionar una restricción de ángulo." + +#: constraint.cpp:627 +msgid "Must select a constraint with associated label." +msgstr "Debe seleccionar una restricción con etiqueta asociada." + +#: constraint.cpp:638 +msgid "" +"Bad selection for angle constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"Mala selección por restricción de ángulo. Esta restricción se puede aplicar a:\n" +"\n" +" * dos segmentos de línea\n" +" * un segmento de linea y una normal\n" +" * dos normales\n" + +#: constraint.cpp:701 +msgid "Curve-curve tangency must apply in workplane." +msgstr "La tangencia curva-curva debe aplicarse en el plano de trabajo." + +#: constraint.cpp:711 +msgid "" +"Bad selection for parallel / tangent constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments (parallel)\n" +" * a line segment and a normal (parallel)\n" +" * two normals (parallel)\n" +" * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" +msgstr "" +"Mala selección para restricción de paralelo / tangente. Esta restricción puede aplicarse " +"a:\n" +"\n" +" * dos segmentos de línea (paralelos)\n" +" * un segmento de línea y una normal (paralelas)\n" +" * dos normales (paralelas)\n" +" * dos segmentos de línea, arcos, o beziers, que comparten un punto final (tangente)\n" + +#: constraint.cpp:729 +msgid "" +"Bad selection for perpendicular constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"Mala selección por restricción perpendicular. Esta restricción se puede aplicar a:\n" +"\n" +" * dos segmentos de línea\n" +" * un segmento de línea y una normal\n" +" * dos normales\n" + +#: constraint.cpp:744 +msgid "" +"Bad selection for lock point where dragged constraint. This constraint can " +"apply to:\n" +"\n" +" * a point\n" +msgstr "" +"Mala selección para el punto de bloqueo donde se arrastró la restricción. Esta restricción puede " +"aplicar a:\n" +"\n" +" * un punto\n" + +#: constraint.cpp:755 +msgid "click center of comment text" +msgstr "clic en el centro del texto del comentario" + +#: export.cpp:19 +msgid "" +"No solid model present; draw one with extrudes and revolves, or use Export " +"2d View to export bare lines and curves." +msgstr "" +"No hay un modelo sólido presente; dibuje uno con extrusiones y revoluciones, o use Exportar " +"Vista 2d para exportar líneas y curvas desnudas." + +#: export.cpp:61 +msgid "" +"Bad selection for export section. Please select:\n" +"\n" +" * nothing, with an active workplane (workplane is section plane)\n" +" * a face (section plane through face)\n" +" * a point and two line segments (plane through point and parallel to " +"lines)\n" +msgstr "" +"Mala selección para la sección de exportación. Por favor seleccione:\n" +"\n" +" * nada, con un plano de trabajo activo (el plano de trabajo es un plano de sección)\n" +" * una cara (plano de sección a través de la cara)\n" +" * un punto y dos segmentos de línea (plano que pasa por el punto y paralelo a las " +"líneas)\n" + +#: export.cpp:822 +msgid "Active group mesh is empty; nothing to export." +msgstr "La malla del grupo activo está vacía; nada para exportar." + +#: exportvector.cpp:337 +msgid "freehand lines were replaced with continuous lines" +msgstr "Las líneas a mano alzada fueron reemplazadas por líneas continuas." + +#: exportvector.cpp:339 +msgid "zigzag lines were replaced with continuous lines" +msgstr "Las líneas en zigzag fueron reemplazadas por líneas continuas." + +#: exportvector.cpp:593 +msgid "" +"Some aspects of the drawing have no DXF equivalent and were not exported:\n" +msgstr "" +"Algunos aspectos del dibujo no tienen equivalente DXF y no se exportaron:\n" + +#: exportvector.cpp:839 +msgid "" +"PDF page size exceeds 200 by 200 inches; many viewers may reject this file." +msgstr "" +"El tamaño de la página PDF supera las 5080mm x 5080mm; " +"muchos usuarios pueden rechazar este archivo." + +#: file.cpp:44 group.cpp:91 +msgctxt "group-name" +msgid "sketch-in-plane" +msgstr "croquis-en-plano" + +#: file.cpp:62 +msgctxt "group-name" +msgid "#references" +msgstr "#referencias" + +#: file.cpp:552 +msgid "The file is empty. It may be corrupt." +msgstr "El archivo esta vacío. Puede estar corrupto." + +#: file.cpp:557 +msgid "" +"Unrecognized data in file. This file may be corrupt, or from a newer version " +"of the program." +msgstr "" +"Datos no reconocidos en el archivo. Este archivo puede estar dañado o ser de una versión más reciente " +" del programa." + +#: file.cpp:867 +msgctxt "title" +msgid "Missing File" +msgstr "Archivo perdido" + +#: file.cpp:868 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "El archivo vinculado “%s” no esta presente." + +#: file.cpp:870 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." +msgstr "" +"¿Quieres localizarlo manualmente?\n" +"\n" +"Si lo rechaza, cualquier geometría que dependa del archivo faltante " +"se eliminará permanentemente." + +#: file.cpp:873 +msgctxt "button" +msgid "&Yes" +msgstr "&Si" + +#: file.cpp:875 +msgctxt "button" +msgid "&No" +msgstr "&No" + +#: file.cpp:877 solvespace.cpp:569 +msgctxt "button" +msgid "&Cancel" +msgstr "&Cancelar" + +#: graphicswin.cpp:41 +msgid "&File" +msgstr "&Archivo" + +#: graphicswin.cpp:42 +msgid "&New" +msgstr "&Nuevo" + +#: graphicswin.cpp:43 +msgid "&Open..." +msgstr "&Abrir..." + +#: graphicswin.cpp:44 +msgid "Open &Recent" +msgstr "Abrir &Reciente" + +#: graphicswin.cpp:45 +msgid "&Save" +msgstr "&Guardar" + +#: graphicswin.cpp:46 +msgid "Save &As..." +msgstr "Guardar &Como..." + +#: graphicswin.cpp:48 +msgid "Export &Image..." +msgstr "Exportar &Imagen..." + +#: graphicswin.cpp:49 +msgid "Export 2d &View..." +msgstr "Exportar 2d &Vista..." + +#: graphicswin.cpp:50 +msgid "Export 2d &Section..." +msgstr "Exportar 2d &Corte..." + +#: graphicswin.cpp:51 +msgid "Export 3d &Wireframe..." +msgstr "Exportar 3d &Estructura alámbrica..." + +#: graphicswin.cpp:52 +msgid "Export Triangle &Mesh..." +msgstr "Exportar Triángulo &Malla..." + +#: graphicswin.cpp:53 +msgid "Export &Surfaces..." +msgstr "Exportar &Superficies..." + +#: graphicswin.cpp:54 +msgid "Im&port..." +msgstr "Im&portar..." + +#: graphicswin.cpp:57 +msgid "E&xit" +msgstr "S&alir" + +#: graphicswin.cpp:60 +msgid "&Edit" +msgstr "&Editar" + +#: graphicswin.cpp:61 +msgid "&Undo" +msgstr "&Deshacer" + +#: graphicswin.cpp:62 +msgid "&Redo" +msgstr "&Rehacer" + +#: graphicswin.cpp:63 +msgid "Re&generate All" +msgstr "Re&generar Todo" + +#: graphicswin.cpp:65 +msgid "Snap Selection to &Grid" +msgstr "Selección Enganche a &Cuadrícula" + +#: graphicswin.cpp:66 +msgid "Rotate Imported &90°" +msgstr "Rotar importado a &90°" + +#: graphicswin.cpp:68 +msgid "Cu&t" +msgstr "Cor&tar" + +#: graphicswin.cpp:69 +msgid "&Copy" +msgstr "&Copiar" + +#: graphicswin.cpp:70 +msgid "&Paste" +msgstr "&Pegar" + +#: graphicswin.cpp:71 +msgid "Paste &Transformed..." +msgstr "Pegar &Тransformar..." + +#: graphicswin.cpp:72 +msgid "&Delete" +msgstr "&Borrar" + +#: graphicswin.cpp:74 +msgid "Select &Edge Chain" +msgstr "Seleccionar Cadena de &Aristas" + +#: graphicswin.cpp:75 +msgid "Select &All" +msgstr "Seleccionar &Todo" + +#: graphicswin.cpp:76 +msgid "&Unselect All" +msgstr "&Deseleccionar Todo" + +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "Estilos de Línea..." + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "&Ver Proyección..." + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "Con&figuración..." + +#: graphicswin.cpp:84 +msgid "&View" +msgstr "&Vista" + +#: graphicswin.cpp:85 +msgid "Zoom &In" +msgstr "Acer&car" + +#: graphicswin.cpp:86 +msgid "Zoom &Out" +msgstr "Ale&jar" + +#: graphicswin.cpp:87 +msgid "Zoom To &Fit" +msgstr " Enfoque para ajustar" + +#: graphicswin.cpp:89 +msgid "Align View to &Workplane" +msgstr "Alinear Vista a &Plano de trabajo" + +#: graphicswin.cpp:90 +msgid "Nearest &Ortho View" +msgstr "Vista &Ortogonal mas cercana" + +#: graphicswin.cpp:91 +msgid "Nearest &Isometric View" +msgstr "Vista &Isometrica mas cercana" + +#: graphicswin.cpp:92 +msgid "&Center View At Point" +msgstr "&Vista Central en Punto" + +#: graphicswin.cpp:94 +msgid "Show Snap &Grid" +msgstr "Mostrar Enganches &Cuadrícula" + +#: graphicswin.cpp:95 +msgid "Darken Inactive Solids" +msgstr "Oscurecer Sólidos Inactivos" + +#: graphicswin.cpp:96 +msgid "Use &Perspective Projection" +msgstr "Usar Proyección &Perspectiva" + +#: graphicswin.cpp:97 +msgid "Dimension &Units" +msgstr "&Unidades de Cota" + +#: graphicswin.cpp:98 +msgid "Dimensions in &Millimeters" +msgstr "Cotas en &Milímetros" + +#: graphicswin.cpp:99 +msgid "Dimensions in M&eters" +msgstr "Cotas en M&etros" + +#: graphicswin.cpp:100 +msgid "Dimensions in &Inches" +msgstr "Cotas en &Pulgadas" + +#: graphicswin.cpp:102 +msgid "Show &Toolbar" +msgstr "Mostrar &Barra de herramientas" + +#: graphicswin.cpp:103 +msgid "Show Property Bro&wser" +msgstr "Mostrar Nave&gador de Propiedades" + +#: graphicswin.cpp:105 +msgid "&Full Screen" +msgstr "&Pantalla Completa" + +#: graphicswin.cpp:107 +msgid "&New Group" +msgstr "&Nuevo Grupo" + +#: graphicswin.cpp:108 +msgid "Sketch In &3d" +msgstr "Сroquis En &3d" + +#: graphicswin.cpp:109 +msgid "Sketch In New &Workplane" +msgstr "Сroquis En Nuevo &Plano de trabajo" + +#: graphicswin.cpp:111 +msgid "Step &Translating" +msgstr "Paso &Traslación" + +#: graphicswin.cpp:112 +msgid "Step &Rotating" +msgstr "Paso &Giratorio" + +#: graphicswin.cpp:114 +msgid "E&xtrude" +msgstr "E&xtrusión" + +#: graphicswin.cpp:115 +msgid "&Helix" +msgstr "&Hélice" + +#: graphicswin.cpp:116 +msgid "&Lathe" +msgstr "&Torno" + +#: graphicswin.cpp:117 +msgid "Re&volve" +msgstr "Re&volución" + +#: graphicswin.cpp:119 +msgid "Link / Assemble..." +msgstr "Enlace / Ensamblar..." + +#: graphicswin.cpp:120 +msgid "Link Recent" +msgstr "Enlace Reciente" + +#: graphicswin.cpp:122 +msgid "&Sketch" +msgstr "&Croquis" + +#: graphicswin.cpp:123 +msgid "In &Workplane" +msgstr "En &Plano de trabajo" + +#: graphicswin.cpp:124 +msgid "Anywhere In &3d" +msgstr "En cualquier lugar en &3d" + +#: graphicswin.cpp:126 +msgid "Datum &Point" +msgstr "Referencia &Punto" + +#: graphicswin.cpp:127 +msgid "&Workplane" +msgstr "&Plano de trabajo" + +#: graphicswin.cpp:129 +msgid "Line &Segment" +msgstr "Línea &Segmento" + +#: graphicswin.cpp:130 +msgid "C&onstruction Line Segment" +msgstr "S&egmento de Línea de Construcción" + +#: graphicswin.cpp:131 +msgid "&Rectangle" +msgstr "&Rectángulo" + +#: graphicswin.cpp:132 +msgid "&Circle" +msgstr "&Círculo" + +#: graphicswin.cpp:133 +msgid "&Arc of a Circle" +msgstr "&Arco de un Círculo" + +#: graphicswin.cpp:134 +msgid "&Bezier Cubic Spline" +msgstr "&Spline Cúbico de Bezier" + +#: graphicswin.cpp:136 +msgid "&Text in TrueType Font" +msgstr "&Texto en Fuente TrueType" + +#: graphicswin.cpp:137 +msgid "&Image" +msgstr "&Imagen" + +#: graphicswin.cpp:139 +msgid "To&ggle Construction" +msgstr "Al&ternar Construcción" + +#: graphicswin.cpp:140 +msgid "Tangent &Arc at Point" +msgstr "Tangente &Arco en el Punto" + +#: graphicswin.cpp:141 +msgid "Split Curves at &Intersection" +msgstr "Dividir Curvas en &Intersección" + +#: graphicswin.cpp:143 +msgid "&Constrain" +msgstr "&Restricción" + +#: graphicswin.cpp:144 +msgid "&Distance / Diameter" +msgstr "&Distancia / Diámetro" + +#: graphicswin.cpp:145 +msgid "Re&ference Dimension" +msgstr "Co&ta de Referencia" + +#: graphicswin.cpp:146 +msgid "A&ngle" +msgstr "Á&ngulo" + +#: graphicswin.cpp:147 +msgid "Reference An&gle" +msgstr "Ángulo de Re&ferencia" + +#: graphicswin.cpp:148 +msgid "Other S&upplementary Angle" +msgstr "Otro Á&ngulo Suplementario" + +#: graphicswin.cpp:149 +msgid "Toggle R&eference Dim" +msgstr "Alternar C&ota Referencia" + +#: graphicswin.cpp:151 +msgid "&Horizontal" +msgstr "&Horizontal" + +#: graphicswin.cpp:152 +msgid "&Vertical" +msgstr "&Vertical" + +#: graphicswin.cpp:154 +msgid "&On Point / Curve / Plane" +msgstr "&Sobre Punto / Curva / Plano" + +#: graphicswin.cpp:155 +msgid "E&qual Length / Radius / Angle" +msgstr "I&gual Longitud / Radio / Ángulo" + +#: graphicswin.cpp:156 +msgid "Length Ra&tio" +msgstr "Relación Lo&ngitud" + +#: graphicswin.cpp:157 +msgid "Length Diff&erence" +msgstr "Diferencia Long&itud" + +#: graphicswin.cpp:158 +msgid "At &Midpoint" +msgstr "En &PuntoMedio" + +#: graphicswin.cpp:159 +msgid "S&ymmetric" +msgstr "S&imetría" + +#: graphicswin.cpp:160 +msgid "Para&llel / Tangent" +msgstr "Para&lela / Tangente" + +#: graphicswin.cpp:161 +msgid "&Perpendicular" +msgstr "&Perpendicular" + +#: graphicswin.cpp:162 +msgid "Same Orient&ation" +msgstr "Misma Orient&ación" + +#: graphicswin.cpp:163 +msgid "Lock Point Where &Dragged" +msgstr "Punto de Bloqueo Donde &Arrastrado" + +#: graphicswin.cpp:165 +msgid "Comment" +msgstr "Comentario" + +#: graphicswin.cpp:167 +msgid "&Analyze" +msgstr "&Analizar" + +#: graphicswin.cpp:168 +msgid "Measure &Volume" +msgstr "Medición &Volumen" + +#: graphicswin.cpp:169 +msgid "Measure A&rea" +msgstr "Medición Á&rea" + +#: graphicswin.cpp:170 +msgid "Measure &Perimeter" +msgstr "Medición &Perímetro" + +#: graphicswin.cpp:171 +msgid "Show &Interfering Parts" +msgstr "Mostrar &Piezas que Interfieren" + +#: graphicswin.cpp:172 +msgid "Show &Naked Edges" +msgstr "Mostrar &Aristas Desnudas" + +#: graphicswin.cpp:173 +msgid "Show &Center of Mass" +msgstr "Mostrar &Centro de Masa" + +#: graphicswin.cpp:175 +msgid "Show &Underconstrained Points" +msgstr "Mostrar &Puntos Subrestringidos" + +#: graphicswin.cpp:177 +msgid "&Trace Point" +msgstr "&Punto de Rastro" + +#: graphicswin.cpp:178 +msgid "&Stop Tracing..." +msgstr "&Dejar de rastrear..." + +#: graphicswin.cpp:179 +msgid "Step &Dimension..." +msgstr "Cota &Paso..." + +#: graphicswin.cpp:181 +msgid "&Help" +msgstr "&Ayuda" + +#: graphicswin.cpp:182 +msgid "&Language" +msgstr "&Lenguaje" + +#: graphicswin.cpp:183 +msgid "&Website / Manual" +msgstr "&Sitio Web / Manual" + +#: graphicswin.cpp:185 +msgid "&About" +msgstr "&Acerca" + +#: graphicswin.cpp:355 +msgid "(no recent files)" +msgstr "(no hay archivos recientes)" + +#: graphicswin.cpp:363 +#, c-format +msgid "File '%s' does not exist." +msgstr "El archivo '%s' no existe." + +#: graphicswin.cpp:725 +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:740 +msgid "" +"The perspective factor is set to zero, so the view will always be a parallel " +"projection.\n" +"\n" +"For a perspective projection, modify the perspective factor in the " +"configuration screen. A value around 0.3 is typical." +msgstr "" +"El factor de perspectiva se establece en cero, por lo que la vista siempre será una proyección " +"paralela.\n" +"\n" +"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:819 +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:1114 +msgid "No additional entities share endpoints with the selected entities." +msgstr "Ninguna entidad adicional comparte puntos finales con las entidades seleccionadas." + +#: graphicswin.cpp:1132 +msgid "" +"To use this command, select a point or other entity from an linked part, or " +"make a link group the active group." +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:1155 +msgid "" +"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " +"to define the plane for the snap grid." +msgstr "" +"No hay ningún plano de trabajo activo. Activar un plano de trabajo (con Croquis -> En plano de trabajo) " +"para definir el plano para el enganche a la cuadrícula." + +#: graphicswin.cpp:1162 +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 "" +"No se pueden enganchar estos elementos a la cuadrícula; seleccionar puntos, comentarios de texto o restricciones " +"con una etiqueta. Para enganchar una línea, seleccione sus puntos finales." + +#: graphicswin.cpp:1247 +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:1250 +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 "" +"No se selecciona ningún plano de trabajo y el grupo activo no tiene un " +"plano de trabajo. Intente seleccionar un plano de trabajo o activar un croquis-en-nuevo-" +"grupo de plano de trabajo." + +#: graphicswin.cpp:1271 +msgid "" +"Bad selection for tangent arc at point. Select a single point, or select " +"nothing to set up arc parameters." +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:1282 +msgid "click point on arc (draws anti-clockwise)" +msgstr "clic en el punto en el arco (dibuja en sentido antihorario)" + +#: graphicswin.cpp:1283 +msgid "click to place datum point" +msgstr "clic para colocar el punto de referencia" + +#: graphicswin.cpp:1284 +msgid "click first point of line segment" +msgstr "clic en el primer punto del segmento de línea" + +#: graphicswin.cpp:1286 +msgid "click first point of construction line segment" +msgstr "clic en el primer punto del segmento de línea de construcción" + +#: graphicswin.cpp:1287 +msgid "click first point of cubic segment" +msgstr "clic en el primer punto del segmento cúbico" + +#: graphicswin.cpp:1288 +msgid "click center of circle" +msgstr "clic en el centro del círculo" + +#: graphicswin.cpp:1289 +msgid "click origin of workplane" +msgstr "clic en origen del plano de trabajo" + +#: graphicswin.cpp:1290 +msgid "click one corner of rectangle" +msgstr "clic en una esquina del rectángulo" + +#: graphicswin.cpp:1291 +msgid "click top left of text" +msgstr "clic en la parte superior izquierda del texto" + +#: graphicswin.cpp:1297 +msgid "click top left of image" +msgstr "clic en la parte superior izquierda de la imagen" + +#: graphicswin.cpp:1309 +msgid "" +"No entities are selected. Select entities before trying to toggle their " +"construction state." +msgstr "" +"No se seleccionaron entidades. Seleccione entidades antes de intentar alternar su " +"estado de construcción." + +#: group.cpp:86 +msgctxt "group-name" +msgid "sketch-in-3d" +msgstr "croquis-en-3d" + +#: group.cpp:142 +msgid "" +"Bad selection for new sketch in workplane. This group can be created with:\n" +"\n" +" * a point (through the point, orthogonal to coordinate axes)\n" +" * a point and two line segments (through the point, parallel to the " +"lines)\n" +" * a workplane (copy of the workplane)\n" +msgstr "" +"Mala selección para un nuevo croquis en el plano de trabajo. Este grupo se puede crear con:\n" +"\n" +" * un punto (a través del punto, ortogonal a los ejes de coordenadas)\n" +" * un punto y dos segmentos de línea (a través del punto, paralelo a " +"líneas)\n" +" * un plano de trabajo (copia de un plano de trabajo)\n" + +#: group.cpp:154 +msgid "" +"Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " +"will be extruded normal to the workplane." +msgstr "" +"Active un plano de trabajo (Croquis -> En plano de trabajo) antes de extruir. El croquis " +"se extruirá normal al plano de trabajo." + +#: group.cpp:163 +msgctxt "group-name" +msgid "extrude" +msgstr "extruir" + +#: group.cpp:168 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "La operación de torno solo se puede aplicar a croquis planos." + +#: group.cpp:179 +msgid "" +"Bad selection for new lathe group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Mala selección para el nuevo grupo de torno. Este grupo se puede crear con:\n" +"\n" +" * un punto y un segmento de línea o normal (revolucionado alrededor de un eje paralelo " +"a la línea / normal, a través del punto)\n" +" * un segmento de línea (revolucionado sobre un segmento de línea)\n" + +#: group.cpp:189 +msgctxt "group-name" +msgid "lathe" +msgstr "torno" + +#: group.cpp:194 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "La operación de revolución solo se puede aplicar a croquis planos." + +#: group.cpp:205 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Mala selección para el nuevo grupo de revolución. Este grupo se puede crear con:\n" +"\n" +" * un punto y un segmento de línea o normal (revolucionado alrededor de un eje paralelo " +"a la línea / normal, a través del punto)\n" +" * un segmento de línea (revolucionado sobre un segmento de línea)\n" + +#: group.cpp:217 +msgctxt "group-name" +msgid "revolve" +msgstr "revolución" + +#: group.cpp:222 +msgid "Helix operation can only be applied to planar sketches." +msgstr "La operación de hélice solo se puede aplicar a croquis planos." + +#: group.cpp:233 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Mala selección para el nuevo grupo de hélice. Este grupo se puede crear con:\n" +"\n" +" * un punto y un segmento de recta o normal (girado alrededor de un eje paralelo " +"a la línea / normal, a través del punto)\n" +" * un segmento de línea (girado sobre un segmento de línea)\n" + +#: group.cpp:245 +msgctxt "group-name" +msgid "helix" +msgstr "hélice" + +#: group.cpp:258e +msgid "" +"Bad selection for new rotation. This group can be created with:\n" +"\n" +" * a point, while locked in workplane (rotate in plane, about that " +"point)\n" +" * a point and a line or a normal (rotate about an axis through the " +"point, and parallel to line / normal)\n" +msgstr "" +"Mala selección para nueva rotación. Este grupo se puede crear con:\n" +"\n" +" * un punto, mientras está bloqueado en el plano de trabajo (girar en el plano, sobre ese " +"punto)\n" +" * un punto y una línea o una normal (rotar alrededor de un eje a través de un " +"punto y paralela a la línea / normal)\n" + +#: group.cpp:271 +msgctxt "group-name" +msgid "rotate" +msgstr "rotar" + +#: group.cpp:282 +msgctxt "group-name" +msgid "translate" +msgstr "trasladar" + +#: group.cpp:400 +msgid "(unnamed)" +msgstr "(sin nombre)" + +#: groupmesh.cpp:709 +msgid "not closed contour, or not all same style!" +msgstr "¡Contorno no cerrado, o no todos del mismo estilo!" + +#: groupmesh.cpp:722 +msgid "points not all coplanar!" +msgstr "¡No todos los puntos son coplanares!" + +#: groupmesh.cpp:724 +msgid "contour is self-intersecting!" +msgstr "¡El contorno se intersecta a sí mismo!" + +#: groupmesh.cpp:726 +msgid "zero-length edge!" +msgstr "¡arista de longitud cero!" + +#: modify.cpp:254 +msgid "Must be sketching in workplane to create tangent arc." +msgstr "Debe estar dibujando en el plano de trabajo para crear un arco tangente." + +#: modify.cpp:301 +msgid "" +"To create a tangent arc, select a point where two non-construction lines or " +"circles in this group and workplane join." +msgstr "" +"Para crear un arco tangente, seleccione un punto donde dos líneas que no sean de construcción o " +"los círculos de este grupo y el plano de trabajo se unen." + +#: modify.cpp:388 +msgid "" +"Couldn't round this corner. Try a smaller radius, or try creating the " +"desired geometry by hand with tangency constraints." +msgstr "" +"No pude redondear esta esquina. Pruebe con un radio más pequeño o intente crear la " +"geometría deseada a mano con restricciones de tangencia." + +#: modify.cpp:597 +msgid "Couldn't split this entity; lines, circles, or cubics only." +msgstr "No se pudo dividir esta entidad; solo líneas, círculos o cúbicos." + +#: modify.cpp:624 +msgid "Must be sketching in workplane to split." +msgstr "Debe estar dibujando en el plano de trabajo para dividir." + +#: modify.cpp:631 +msgid "" +"Select two entities that intersect each other (e.g. two lines/circles/arcs " +"or a line/circle/arc and a point)." +msgstr "" +"Seleccione dos entidades que se crucen entre sí (por ejemplo, dos líneas / círculos / arcos " +"o una línea / círculo / arco y un punto)." + +#: modify.cpp:736 +msgid "Can't split; no intersection found." +msgstr "No se puede dividir; no se encontró ninguna intersección." + +#: mouse.cpp:559 +msgid "Assign to Style" +msgstr "Asignar a Estilo" + +#: mouse.cpp:575 +msgid "No Style" +msgstr "Sin Estilo" + +#: mouse.cpp:578 +msgid "Newly Created Custom Style..." +msgstr "Estilo Personalizado Recién Creado..." + +#: mouse.cpp:585 +msgid "Group Info" +msgstr "Información de Grupo" + +#: mouse.cpp:605 +msgid "Style Info" +msgstr "Información de Estilo" + +#: mouse.cpp:625 +msgid "Select Edge Chain" +msgstr "Seleccionar Cadena de Arista" + +#: mouse.cpp:631 +msgid "Toggle Reference Dimension" +msgstr "Alternar Cota de Referencia" + +#: mouse.cpp:637 +msgid "Other Supplementary Angle" +msgstr "Otro Ángulo Suplementario" + +#: mouse.cpp:642 +msgid "Snap to Grid" +msgstr "Enganchar a la cuadrícula" + +#: mouse.cpp:651 +msgid "Remove Spline Point" +msgstr "Remover Punto de Spline" + +#: mouse.cpp:686 +msgid "Add Spline Point" +msgstr "Agregar Punto de Spline" + +#: mouse.cpp:690 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "No se puede agregar un punto de spline: se alcanzó el número máximo de puntos." + +#: mouse.cpp:715 +msgid "Toggle Construction" +msgstr "Alternar Construcción" + +#: mouse.cpp:730 +msgid "Delete Point-Coincident Constraint" +msgstr "Eliminar restricción de punto-coincidente" + +#: mouse.cpp:749 +msgid "Cut" +msgstr "Cortar" + +#: mouse.cpp:751 +msgid "Copy" +msgstr "Copiar" + +#: mouse.cpp:755 +msgid "Select All" +msgstr "Seleccionar Todo " + +#: mouse.cpp:760 +msgid "Paste" +msgstr "Pegar" + +#: mouse.cpp:762 +msgid "Paste Transformed..." +msgstr "Pegar Transformado ..." + +#: mouse.cpp:767 +msgid "Delete" +msgstr "Eliminar" + +#: mouse.cpp:770 +msgid "Unselect All" +msgstr "Deseleccionar Todo" + +#: mouse.cpp:777 +msgid "Unselect Hovered" +msgstr "Deselección Flotante" + +#: mouse.cpp:786 +msgid "Zoom to Fit" +msgstr "Zoom para ajustar" + +#: mouse.cpp:988 mouse.cpp:1275 +msgid "click next point of line, or press Esc" +msgstr "clic en el siguiente punto de la línea o presione Esc" + +#: mouse.cpp:994 +msgid "" +"Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"No se puede dibujar un rectángulo en 3d; primero, active un plano de trabajo con Croquis -> En " +"Plano de trabajo." + +#: mouse.cpp:1028 +msgid "click to place other corner of rectangle" +msgstr "clic para colocar la otra esquina del rectángulo" + +#: mouse.cpp:1048 +msgid "click to set radius" +msgstr "clic para establecer el radio" + +#: mouse.cpp:1053 +msgid "" +"Can't draw arc in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"No se puede dibujar un arco en 3d; primero, active un plano de trabajo con Croquis -> En " +"Plano de trabajo." + +#: mouse.cpp:1072 +msgid "click to place point" +msgstr "clic para colocar el punto" + +#: mouse.cpp:1088 +msgid "click next point of cubic, or press Esc" +msgstr "clic en el siguiente punto del cúbico, o presione Esc" + +#: mouse.cpp:1093 +msgid "" +"Sketching in a workplane already; sketch in 3d before creating new workplane." +msgstr "" +"Dibujando en un plano de trabajo ya; croquis en 3d antes de crear un nuevo plano de trabajo." + +#: mouse.cpp:1109 +msgid "" +"Can't draw text in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"No se puede dibujar texto en 3D; primero, active un plano de trabajo con Croquis -> En " +"Plano de trabajo." + +#: mouse.cpp:1126 +msgid "click to place bottom right of text" +msgstr "clic para colocar la parte inferior derecha del texto" + +#: mouse.cpp:1132 +msgid "" +"Can't draw image in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"No se puede dibujar una imagen en 3D; primero, active un plano de trabajo con Croquis -> En " +"Plano de Trabajo." + +#: mouse.cpp:1159 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "NUEVO COMENTARIO -- DOBLE-CLIC PARA EDITAR" + +#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +msgctxt "file-type" +msgid "SolveSpace models" +msgstr "SolveSpace modelos" + +#: platform/gui.cpp:90 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "placa circuito IDF" + +#: platform/gui.cpp:94 +msgctxt "file-type" +msgid "PNG image" +msgstr "imagen PNG" + +#: platform/gui.cpp:98 +msgctxt "file-type" +msgid "STL mesh" +msgstr "STL malla" + +#: platform/gui.cpp:99 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" +msgstr "Wavefront OBJ malla" + +#: platform/gui.cpp:100 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" +msgstr "Three.js-malla compatible, con visor" + +#: platform/gui.cpp:101 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "Three.js-malla compatible, solo malla" + +#: platform/gui.cpp:102 +msgctxt "file-type" +msgid "VRML text file" +msgstr "Archivo texto VRML" + +#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +msgctxt "file-type" +msgid "STEP file" +msgstr "Archivo STEP" + +#: platform/gui.cpp:110 +msgctxt "file-type" +msgid "PDF file" +msgstr "Archivo PDF" + +#: platform/gui.cpp:111 +msgctxt "file-type" +msgid "Encapsulated PostScript" +msgstr "Encapsulado PostScript" + +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "Gráficos Vectoriales Escalables" + +#: platform/gui.cpp:114 platform/gui.cpp:121 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" +msgstr "Archivo DXF (AutoCAD 2007)" + +#: platform/gui.cpp:115 +msgctxt "file-type" +msgid "HPGL file" +msgstr "Archivo HPGL" + +#: platform/gui.cpp:116 +msgctxt "file-type" +msgid "G Code" +msgstr "G Code" + +#: platform/gui.cpp:125 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" +msgstr "Archivos AutoCAD DXF y DWG" + +#: platform/gui.cpp:129 +msgctxt "file-type" +msgid "Comma-separated values" +msgstr "Valores separados por comas" + +#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +msgid "untitled" +msgstr "sin título" + +#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 +#: platform/guiwin.cpp:1582 +msgctxt "title" +msgid "Save File" +msgstr "Guardar Archivo" + +#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 +#: platform/guiwin.cpp:1584 +msgctxt "title" +msgid "Open File" +msgstr "Abrir Archivo" + +#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +msgctxt "button" +msgid "_Cancel" +msgstr "_Cancelar" + +#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +msgctxt "button" +msgid "_Save" +msgstr "_Guardar" + +#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +msgctxt "button" +msgid "_Open" +msgstr "_Abrir" + +#: solvespace.cpp:169 +msgctxt "title" +msgid "Autosave Available" +msgstr "Autoguardado Disponible" + +#: solvespace.cpp:170 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "Un archivo de autoguardado está disponible para este croquis." + +#: solvespace.cpp:171 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "¿Desea cargar el archivo de autoguardado en su lugar?" + +#: solvespace.cpp:172 +msgctxt "button" +msgid "&Load autosave" +msgstr "&Cargar autoguardado" + +#: solvespace.cpp:174 +msgctxt "button" +msgid "Do&n't Load" +msgstr "No Cargar" + +#: solvespace.cpp:557 +msgctxt "title" +msgid "Modified File" +msgstr "Archivo Modificado" + +#: solvespace.cpp:559 +#, 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:562 +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:565 +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:566 +msgctxt "button" +msgid "&Save" +msgstr "&Guardar" + +#: solvespace.cpp:568 +msgctxt "button" +msgid "Do&n't Save" +msgstr "No& Guardar" + +#: solvespace.cpp:589 +msgctxt "title" +msgid "(new sketch)" +msgstr "(nuevo croquis)" + +#: solvespace.cpp:596 +msgctxt "title" +msgid "Property Browser" +msgstr "Explorador de Propiedades" + +#: solvespace.cpp:658 +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 "" +"Las restricciones se muestran actualmente y se exportarán en la trayectoria." +"Probablemente esto no sea lo que quieres; ocultarlos haciendo clic en el enlace en la parte superior de " +"la ventana de texto." + +#: solvespace.cpp:730 +#, c-format +msgid "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." +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:778 +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:782 +msgid "Bad selection for step dimension; select a constraint." +msgstr "Mala selección para la cota del paso; seleccione una restricción." + +#: solvespace.cpp:806 +msgid "The assembly does not interfere, good." +msgstr "El ensamble no interfiere, bien." + +#: solvespace.cpp:822 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" +"El volumen del modelo sólido es:\n" +"\n" +" %s" + +#: solvespace.cpp:831 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" +"\n" +"El volumen de la malla del grupo actual es:\n" +"\n" +" %s" + +#: solvespace.cpp:836 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" +"\n" +"\n" +"Las superficies curvas se han aproximado como triángulos.\n" +"Esto introduce un error, normalmente alrededor del 1%." + +#: solvespace.cpp:851 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"El área de la superficie de las caras seleccionadas es:\n" +"\n" +" %s\n" +"\n" +"Las curvas se han aproximado como lineales por partes.\n" +"Esto introduce un error, normalmente alrededor del 1%%." + +#: solvespace.cpp:860 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." +msgstr "" +"Este grupo no contiene un área cerrada 2d correctamente formada. Está abierta, " +"no coplanares, ni auto-intersectantes." + +#: solvespace.cpp:872 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"El área de la región croquizada en este grupo es:\n" +"\n" +" %s\n" +"\n" +"Las curvas se han aproximado como lineales por partes.\n" +"Esto introduce un error, normalmente alrededor del 1%%." + +#: solvespace.cpp:892 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"La longitud total de las entidades seleccionadas es:\n" +"\n" +" %s\n" +"\n" +"Las curvas se han aproximado como lineales por partes.\n" +"Esto introduce un error, normalmente alrededor del 1%%." + +#: solvespace.cpp:898 +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:914 +msgid "Bad selection for trace; select a single point." +msgstr "Mala selección de rastreo; seleccione un solo punto." + +#: solvespace.cpp:941 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "No pude escribir a '%s'" + +#: solvespace.cpp:971 +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:972 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "La malla no se intersecta (está bien, es válida)." + +#: solvespace.cpp:974 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "La malla tiene bordes desnudos (NO está bien, no es válida)." + +#: solvespace.cpp:975 +msgid "The mesh is watertight (okay, valid)." +msgstr "La malla es estanca (está bien, es válida)." + +#: solvespace.cpp:978 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" +"\n" +"\n" +"El modelo contiene %d triángulos, desde %d superficies." + +#: solvespace.cpp:982 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"Cero aristas problemáticas, bien.%s" + +#: solvespace.cpp:985 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d aristas problemáticas, mal.%s" + +#: solvespace.cpp:998 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" +"Esta es la versión de SolveSpace %s.\n" +"\n" +"Para más información, ver http://solvespace.com/\n" +"\n" +"SolveSpace es software libre: eres libre de modificarlo\n" +"y/o redistribuirlo bajo los términos de la GNU\n" +"Licencia Pública General (GPL) version 3 o posterior.\n" +"\n" +"NO HAY GARANTÍA, en la medida permitida por\n" +"ley. Para detalles, visita http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues y otros autores.\n" + +#: style.cpp:166 +msgid "" +"Can't assign style to an entity that's derived from another entity; try " +"assigning a style to this entity's parent." +msgstr "" +"No se puede asignar estilo a una entidad derivada de otra entidad;; intente " +"asignar un estilo al padre de esta entidad." + +#: style.cpp:665 +msgid "Style name cannot be empty" +msgstr "El nombre del estilo no puede estar vacío" + +#: textscreens.cpp:741 +msgid "Can't repeat fewer than 1 time." +msgstr "No se puede repetir menos de 1 vez." + +#: textscreens.cpp:745 +msgid "Can't repeat more than 999 times." +msgstr "No se puede repetir más de 999 veces." + +#: textscreens.cpp:770 +msgid "Group name cannot be empty" +msgstr "El nombre del grupo no puede estar vacío" + +#: textscreens.cpp:813 +msgid "Opacity must be between zero and one." +msgstr "La opacidad debe estar entre cero y uno." + +#: textscreens.cpp:848 +msgid "Radius cannot be zero or negative." +msgstr "El radio no puede ser cero o negativo." + +#: toolbar.cpp:18 +msgid "Sketch line segment" +msgstr "Croquizar segmento de línea" + +#: toolbar.cpp:20 +msgid "Sketch rectangle" +msgstr "Croquizar rectángulo" + +#: toolbar.cpp:22 +msgid "Sketch circle" +msgstr "Croquizar círculo" + +#: toolbar.cpp:24 +msgid "Sketch arc of a circle" +msgstr "Croquizar arco de un círculo" + +#: toolbar.cpp:26 +msgid "Sketch curves from text in a TrueType font" +msgstr "Croquizar curvas desde texto en fuente TrueType" + +#: toolbar.cpp:28 +msgid "Sketch image from a file" +msgstr "Croquizar imagen desde un archivo" + +#: toolbar.cpp:30 +msgid "Create tangent arc at selected point" +msgstr "Crear arco tangente en el punto seleccionado" + +#: toolbar.cpp:32 +msgid "Sketch cubic Bezier spline" +msgstr "Croquizar spline de Bezier cúbico" + +#: toolbar.cpp:34 +msgid "Sketch datum point" +msgstr "Croquizar punto de referencia" + +#: toolbar.cpp:36 +msgid "Toggle construction" +msgstr "Alternar construcción" + +#: toolbar.cpp:38 +msgid "Split lines / curves where they intersect" +msgstr "Dividir líneas / curvas donde se intersectan" + +#: toolbar.cpp:42 +msgid "Constrain distance / diameter / length" +msgstr "Restringir distancia / diámetro / longitud" + +#: toolbar.cpp:44 +msgid "Constrain angle" +msgstr "Restringir ángulo" + +#: toolbar.cpp:46 +msgid "Constrain to be horizontal" +msgstr "Restringir para ser horizontal" + +#: toolbar.cpp:48 +msgid "Constrain to be vertical" +msgstr "Restringir para ser vertical" + +#: toolbar.cpp:50 +msgid "Constrain to be parallel or tangent" +msgstr "Restringir para ser paralela o tangente" + +#: toolbar.cpp:52 +msgid "Constrain to be perpendicular" +msgstr "Restringir para ser perpendicular" + +#: toolbar.cpp:54 +msgid "Constrain point on line / curve / plane / point" +msgstr "Restringir punto en línea / curva / plano / punto" + +#: toolbar.cpp:56 +msgid "Constrain symmetric" +msgstr "Restringir simétrico" + +#: toolbar.cpp:58 +msgid "Constrain equal length / radius / angle" +msgstr "Restringir igualdad longitud / radio / ángulo" + +#: toolbar.cpp:60 +msgid "Constrain normals in same orientation" +msgstr "Restringir normales en la misma orientación" + +#: toolbar.cpp:62 +msgid "Other supplementary angle" +msgstr "Otro ángulo suplementario" + +#: toolbar.cpp:64 +msgid "Toggle reference dimension" +msgstr "Alternar cota de referencia" + +#: toolbar.cpp:68 +msgid "New group extruding active sketch" +msgstr "Nuevo grupo de extrusión de croquis activo" + +#: toolbar.cpp:70 +msgid "New group rotating active sketch" +msgstr "Nuevo croquis activo giratorio de grupo" + +#: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "Nueva hélice de grupo a partir del croquis activo" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "Nuevo croquis activo de revolución de grupo" + +#: toolbar.cpp:76 +msgid "New group step and repeat rotating" +msgstr "Nuevo paso de grupo y rotación repetida" + +#: toolbar.cpp:78 +msgid "New group step and repeat translating" +msgstr "Nuevo paso de grupo y traslación repetida" + +#: toolbar.cpp:80 +msgid "New group in new workplane (thru given entities)" +msgstr "Nuevo grupo en nuevo plano de trabajo (a través de entidades dadas)" + +#: toolbar.cpp:82 +msgid "New group in 3d" +msgstr "Nuevo grupo en 3d" + +#: toolbar.cpp:84 +msgid "New group linking / assembling file" +msgstr "Nuevo enlace de grupo / archivo de ensamble" + +#: toolbar.cpp:88 +msgid "Nearest isometric view" +msgstr "Vista isométrica más cercana" + +#: toolbar.cpp:90 +msgid "Align view to active workplane" +msgstr "Alinear vista al plano de trabajo activo" + +#: util.cpp:165 +msgctxt "title" +msgid "Error" +msgstr "Error" + +#: util.cpp:165 +msgctxt "title" +msgid "Message" +msgstr "Mensaje" + +#: util.cpp:170 +msgctxt "button" +msgid "&OK" +msgstr "&Aceptar" + +#: view.cpp:78 +msgid "Scale cannot be zero or negative." +msgstr "La escala no debe ser cero o negativa." + +#: view.cpp:90 view.cpp:99 +msgid "Bad format: specify x, y, z" +msgstr "Formato incorrecto: especifica x, y, z" + +#~ msgctxt "file-type" +#~ msgid "Q3D Object file" +#~ msgstr "Archivo Objeto Q3D" From 9ce49765382b99d91e7fda954ec04db5f73f7e08 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 26 Sep 2021 16:27:22 -0400 Subject: [PATCH 339/646] update pot file and locales.txt and CMakeLists.txt for spanish. --- res/CMakeLists.txt | 1 + res/locales.txt | 1 + res/locales/de_DE.po | 698 +++++++++++++++++-------------- res/locales/en_US.po | 696 +++++++++++++++++-------------- res/locales/es_AR.po | 949 ++++++++++++++++++++++++------------------- res/locales/fr_FR.po | 698 +++++++++++++++++-------------- res/locales/ru_RU.po | 702 ++++++++++++++++++-------------- res/locales/tr_TR.po | 697 +++++++++++++++++-------------- res/locales/uk_UA.po | 647 +++++++++++++++-------------- res/locales/zh_CN.po | 690 +++++++++++++++++-------------- res/messages.pot | 633 +++++++++++++++-------------- 11 files changed, 3532 insertions(+), 2880 deletions(-) diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index 3b4216c1d..7303c6f7a 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -266,6 +266,7 @@ add_resources( locales/en_US.po locales/fr_FR.po locales/uk_UA.po + locales/es_AR.po locales/tr_TR.po locales/ru_RU.po locales/zh_CN.po diff --git a/res/locales.txt b/res/locales.txt index daedc309c..d94e2c041 100644 --- a/res/locales.txt +++ b/res/locales.txt @@ -3,6 +3,7 @@ de-DE,0407,Deutsch en-US,0409,English (US) fr-FR,040C,Français +es-AR,2C0A,español (AR) ru-RU,0419,Русский tr-TR,041F,Türkçe uk-UA,0422,Українська diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index bbd3fcda6..4a5ccb57f 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: 2018-07-19 06:55+0000\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" @@ -17,7 +17,7 @@ msgstr "" "X-Generator: Zanata 4.5.0\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -28,27 +28,27 @@ msgstr "" "\n" "Aktivieren Sie eine mit Skizze -> In Arbeitsebene" -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "Zwischenablage ist leer; es gibt nichts einzufügen." -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "Die Anzahl der einzufügenden Kopien muss mind. 1 sein." -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "Maßstab kann nicht Null sein." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "Wählen Sie einen Punkt, um den Drehmittelpunkt zu definieren." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "Wählen Sie zwei Punkte, um den Verschiebungsvektor zu definieren." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -56,25 +56,25 @@ msgstr "" "Die Transformation ist die Identität. Alle Kopien werden deckungsgleich " "übereinanderliegen." -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "" "Zuviele Objekte zum Einfügen; teilen Sie diese in kleinere " "Einfügeoperationen auf." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "Es ist keine Arbeitsebene aktiv." -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "Ungültiges Format: geben Sie Koordinaten als x, y, z an" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "Ungültiges Format: geben Sie Farben als r, g, b an" -#: confscreen.cpp:454 +#: confscreen.cpp:412 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:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, 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:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "Der Exportmaßstab darf nicht Null sein!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "Der Werkzeugradialabstand darf nicht negativ sein!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "" "Ungültiger Wert: Interval für automatisches Speichern muss positiv sein" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "Ungültiges Format: geben Sie das Interval in ganzen Minuten an" @@ -171,115 +171,135 @@ msgstr "Längenverhältnis" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "Längendifferenz" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "Symmetrisch" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "Symmetrisch-H" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "Symmetrisch-V" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "Symmetrisch-Linie" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "auf-Mittelpunkt" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "Horizontal" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "Vertikal" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "Durchmesser" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "Pkt-auf-Kreis" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "gl-Orientierung" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "Winkel" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "Parallel" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "Bogen-Linie-Tangente" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "Kub-Linie-Tangente" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "Kurve-Kurve-Tangente" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "Rechtwinklig" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "gl-Radius" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "gl-Winkel" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "gl-Linie-Länge-Bogen-Länge" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "Fix-an-Position" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "Kommentar" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -288,7 +308,7 @@ msgstr "" "haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " "Tangente einschränken. -> Sc" -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -297,7 +317,7 @@ msgstr "" "haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " "Tangente einschränken. -> Sc" -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -305,7 +325,7 @@ msgstr "" "Die Kurven müssen einen gemeinsamen Endpunkt haben. Schränken Sie mit " "\"Einschränkung / Auf Punkt\" ein, bevor Sie die Tangente einschränken. -> Sc" -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -329,7 +349,7 @@ msgstr "" " * eine Seitenfläche und ein Punkt [minimaler Abstand]\n" " * ein Kreis oder ein Bogen [Durchmesser]\n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -349,7 +369,7 @@ msgstr "" " * einen Punkt und einen Kreis oder Bogen [Punkt auf Kurve]\n" " * einen Punkt und eine Seitenfläche [Punkt auf Fläche]\n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -380,30 +400,26 @@ msgstr "" " * ein Liniensegment und ein Bogen [Länge des Liniensegments gleich " "Bogenlänge]\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Ungültige Auswahl für Einschränkung \"Längenverhältnis\". Diese " -"Einschränkung ist anwendbar auf:\n" -"\n" -" * zwei Liniensegmente\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Ungültige Auswahl für Einschränkung \"Längendifferenz\". Diese Einschränkung " -"ist anwendbar auf:\n" -"\n" -" * zwei Liniensegmente\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -417,7 +433,7 @@ msgstr "" " * ein Liniensegment und eine Arbeitsebene [Mittelpunkt der Linie auf " "Ebene]\n" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -438,7 +454,7 @@ msgstr "" " * eine Arbeitsebene und zwei Punkte oder ein Liniensegment [symmetrisch " "zu Arbeitsebene]\n" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -446,7 +462,7 @@ msgstr "" "Eine Arbeitsebene muss aktiv sein, um die Symmetrie ohne explizite " "Symmetrieebene einzuschränken." -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -454,7 +470,7 @@ msgstr "" "Aktivieren Sie eine Arbeitsebene (mit Skizze -> In Arbeitsebene), bevor Sie " "horizontal oder vertikal einschränken." -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -468,7 +484,7 @@ msgstr "" " * zwei Punkte\n" " * ein Liniensegment\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -480,15 +496,15 @@ msgstr "" "\n" " * zwei Normale\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "Sie müssen einen eingeschränkten Winkel auswählen." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "Sie müssen eine Einschränkung mit zugeordneter Kennzeichnung angeben." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -503,12 +519,12 @@ msgstr "" " * ein Liniensegment und eine Normale\n" " * zwei Normale\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "" "Die Kurven-Kurven-Tangente muss in der Arbeitsebene eingeschränkt werden." -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -527,7 +543,7 @@ msgstr "" " * zwei Liniensegmente, Bögen oder Beziers mit gemeinsamem Endpunkt " "[Tangente]\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -542,7 +558,7 @@ msgstr "" " * ein Liniensegment und eine Normale\n" " * zwei Normale\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -554,7 +570,11 @@ msgstr "" "\n" " * einen Punkt\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "NEUER KOMMENTAR -- DOPPELKLICKEN ZUM BEARBEITEN" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "Klicken Sie auf die Mitte des Kommentartextes" @@ -583,26 +603,26 @@ msgstr "" " * einen Punkt und zwei Liniensegmente [Schnittebene durch Punkt und " "parallel zu Linien]\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "Das Netz der aktiven Gruppe ist leer; es gibt nichts zu exportieren." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "Freihandlinien wurden mit durchgehenden Linien ersetzt" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "Zickzacklinien wurden mit durchgehenden Linien ersetzt" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Teile der Zeichnung haben keine Entsprechung in DXF und wurden nicht " "exportiert:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -619,11 +639,11 @@ msgctxt "group-name" msgid "#references" msgstr "#Referenzen" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "Die Datei ist leer. Es kann beschädigt sein." -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -664,7 +684,7 @@ msgctxt "button" msgid "&No" msgstr "&Nein" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "&Abbrechen" @@ -838,296 +858,304 @@ msgid "Use &Perspective Projection" msgstr "Perspektivische Projektion" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "Maßeinheit" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "Maße in Millimeter" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "Masse in M&etern" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "Maße in Zoll" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "Werkzeugleiste anzeigen" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "Attributbrowser anzeigen" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "Vollbildschirm" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "Neue Gruppe" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "In 3D skizzieren" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "In neuer Arbeitsebene skizzieren" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "Kopieren und verschieben" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "Kopieren und drehen" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "E&xtrudieren" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "&Helix" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "R&otieren" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "D&rehen" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "Verknüpfen / Zusammensetzen" -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "Letzte verknüpfen" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Skizze" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "In Arbeitsebene" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "Im 3D-Raum" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "Bezugspunkt" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "Arbeits&ebene" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "&Linie" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "K&onstruktionslinie" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "&Rechteck" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "&Kreis" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "Kreisbogen" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "Kubischer &Bezier-Spline" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "&Text in Truetype-Font" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "B&ild" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "Konstruktionselement an/aus" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "Bogentangente an Punkt" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Kurven im Schnittpunkt trennen" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Einschränkung" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "Abstand / Durchmesser" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "Referenzangabe" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "Winkel" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "Referenzwinkel" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Komplementärwinkel" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Referenzangabe ein/aus" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "Horizontal" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Vertikal" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "Auf Punkt / Kurve / Ebene" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "Gleicher Abstand / Radius / Winkel" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "Längenverhältnis" +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "Längendifferenz" +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" -#: graphicswin.cpp:158 +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "Auf &Mittelpunkt" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "Symmetrisch" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "Paral&llel / Tangente" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "Rechtwinklig" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Gleiche Orientierung" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "Punkt an Position fixieren" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Kommentar" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Analyse" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "&Volumen bestimmen" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "Fläche bestimmen" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "Umfang bestimmen" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "Überlagernde Teile anzeigen" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "Freiliegende Kanten anzeigen" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "Massenmittelpunkt anzeigen" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "&Unterbeschränkte Punkte anzeigen" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "Punkt nachzeichnen" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "Nachzeichnen beenden" -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Schrittgröße…" -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Hilfe" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "Sprache" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "&Website / Anleitung" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "Über" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(keine vorhergehenden Dateien)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "Datei '%s' existiert nicht." -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 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:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1141,20 +1169,20 @@ msgstr "" "Ändern Sie den Faktor für die Perspektivprojektion in der " "Konfigurationsmaske. Ein typischer Wert ist ca. 0,3." -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 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:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "" "Die ausgewählten Objekte teilen keine gemeinsamen Endpunkte mit anderen " "Objekten." -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1162,7 +1190,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:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1171,7 +1199,7 @@ msgstr "" "(mit Skizze -> In Arbeitsebene), um die Ebene für das Gitterraster zu " "definieren." -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1180,13 +1208,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:1247 +#: graphicswin.cpp:1269 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:1250 +#: graphicswin.cpp:1272 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-" @@ -1196,7 +1224,7 @@ msgstr "" "standardmäßige Arbeitsebene. Wählen Sie eine Arbeitsebene aus, oder " "erstellen Sie eine Gruppe in einer neuen Arbeitsebene." -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1204,48 +1232,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:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "" "Erstellen Sie einen Punkt auf dem Bogen (zeichnet im Gegenuhrzeigersinn)" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "Klicken Sie, um einen Bezugspunkt zu platzieren" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "Klicken Sie auf den ersten Punkt des Liniensegments" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "Klicken Sie auf den ersten Punkt der Konstruktionslinie" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "Klicken Sie auf den ersten Punkt der kubischen Linie" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "Klicken Sie auf den Kreismittelpunkt" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "Klicken Sie auf den Ursprungspunkt der Arbeitsebene" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "Klicken Sie auf eine Ecke des Rechtecks" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "Klicken Sie auf die obere linke Ecke des Texts" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "Klicken Sie auf die obere linke Ecke des Bilds" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1258,24 +1286,18 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "Skizze-in-3D" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -"Ungültige Auswahl für Skizze in neuer Arbeitsebene. Diese Gruppe kann " -"erstellt werden mit:\n" -"\n" -" * einem Punkt (durch den Punkt, orthogonal zu den Koordinatenachsen)\n" -" * einem Punkt und zwei Liniensegmenten (durch den Punkt, parallel zu den " -"Linien)\n" -" * einer Arbeitsebene (Kopie der Arbeitsebene)\n" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1283,16 +1305,16 @@ msgstr "" "Aktivieren Sie vor der Extrusion eine Arbeitsebene (mit Skizze -> In " "Arbeitsebene). Die Skizze wird senkrecht zur Arbeitsebene extrudiert" -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "Extrusion" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "Rotieren kann nur mit planaren Skizzen ausgeführt werden." -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1307,16 +1329,16 @@ msgstr "" "eine Achse parallel zur Linie/Normalen, durch den Punkt)\n" " * einem Liniensegment (Drehung um das Liniensegment)\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "Drehung" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "Revolve kann nur mit planaren Skizzen ausgeführt werden." -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1331,16 +1353,16 @@ msgstr "" "Achse parallel zu Linie / Normale, durch Punkt)\n" " * einem Liniensegment (gedreht um Liniensegment)\n" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "Revolve" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "Helix kann nur mit planaren Skizzen ausgeführt werden." -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1355,12 +1377,12 @@ msgstr "" "Achse parallel zu Linie / Normale, durch Punkt)\n" " * einem Liniensegment (gedreht um Liniensegment)\n" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "Helix" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1376,41 +1398,41 @@ msgstr "" " * einem Punkt und einer Linie oder einer Normale (gedreht um eine Achse " "durch den Punkt, parallel zur Linie / Normale)\n" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "Drehen" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "Versetzen" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "unbenannt" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "Kontur nicht geschlossen, oder kein einheitlicher Linientyp!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "Punkte sind nicht alle koplanar!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "Kontur überschneidet sich selbst!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "Kante mit Länge Null!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Eine Bogentangente kann nur in einer Arbeitsebene erstellt werden." -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1419,7 +1441,7 @@ msgstr "" "nicht-Konstruktionslinien oder -kreise in dieser Gruppe und Arbeitsebene " "treffen. " -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1428,17 +1450,17 @@ msgstr "" "Radius, oder erstellen Sie die gewünschte Geometrie von Hand mit \"Tangente" "\"-Einschränkungen." -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" "Dieses Objekt konnte nicht geteilt werden. Dies geht nur für Linien, Kreise " "oder kubische Splines." -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "Trennen ist nur in einer Arbeitsebene möglich." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." @@ -1446,109 +1468,109 @@ msgstr "" "Wählen Sie zwei Objekte aus, die sich schneiden (z.B. zwei Linien/Kreise/" "Bögen, oder eine Linie/Kreis/Bogen und ein Punkt)." -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "Trennen nicht möglich; keine Überschneidung gefunden." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Linientyp zuordnen" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "Kein Linientyp" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Neu erstellter benutzerdefinierter Linientyp…" -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Info zu Gruppe" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Info zu Linientyp" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Kantenverlauf auswählen" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Von/zu Referenzangabe wechseln" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Anderer Komplementärwinkel" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Auf Raster ausrichten" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Spline-Punkt löschen" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Spline-Punkt hinzufügen" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "" "Spline-Punkt kann nicht hinzugefügt werden: maximale Anzahl der Punkte " "erreicht." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Konstruktionselement an/aus" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Einschränkung \"Punkte deckungsgleich\" löschen" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Ausschneiden" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Kopieren" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Alle auswählen" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Einfügen" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Einfügen und transformieren…" -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Löschen" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Alle deselektieren" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Aktive deselektieren" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Zoom an Bildschirm anpassen" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "Klicken Sie auf den nächsten Punkt der Linie, oder drücken Sie Esc" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1556,15 +1578,15 @@ msgstr "" "Ein Rechteck kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "Klicken Sie auf die gegenüberliegende Ecke des Rechtecks" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "Klicken Sie, um den Radius festzulegen" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1572,23 +1594,23 @@ msgstr "" "Ein Kreisbogen kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "Klicken Sie, um einen Punkt zu platzieren" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "" "Klicken Sie auf den nächsten Punkt der kubischen Linie, oder drücken Sie Esc" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Eine Arbeitsebene ist bereits aktiv. Skizzieren Sie in 3D, bevor Sie eine " "neue Arbeitsebene erstellen." -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1596,11 +1618,11 @@ msgstr "" "Text kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "Klicken Sie auf die untere rechte Ecke des Texts" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1608,194 +1630,200 @@ msgstr "" "Das Bild kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "NEUER KOMMENTAR -- DOPPELKLICKEN ZUM BEARBEITEN" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace-Modelle" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "IDF Leiterplatte" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "PNG-Datei" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "STL-Netz" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ-Netz" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-kompatibles Netz, mit Ansicht" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-kompatibles Netz, nur Netz" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "VRML Textdatei" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "STEP-Datei" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "PDF-Datei" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Eingebettetes Postscript" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "Skalierbare Vektorgrafik" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF-Datei (AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL-Datei" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "G-Code" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF- und DWG-Dateien" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "Werte durch Komma getrennt (CSV)" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "unbenannt" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Datei speichern" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Datei öffnen" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "_Abbrechen" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "_Speichern" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "_Öffnen" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "Automatische Sicherungsdatei verfügbar" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Eine automatische Sicherung ist für diese Skizze verfügbar." -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Wollen Sie die automatische Sicherungsdatei stattdessen laden?" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "AutoDatei &öffnen" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "&Nicht laden" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "Geänderte Datei" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, 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:562 +#: solvespace.cpp:603 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:565 +#: solvespace.cpp:606 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:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "&Sichern" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "&Verwerfen" # solvespace.cpp:557 -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "(Neue Skizze)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "Attribut-Browser" -#: solvespace.cpp:658 +#: solvespace.cpp:699 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 " @@ -1805,7 +1833,7 @@ msgstr "" "wahrscheinlich nicht. Verstecken Sie sie in dem auf den Link oben im " "Textfenster klicken." -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1814,23 +1842,23 @@ msgstr "" "Kann den Dateityp der Datei '%s' nicht auf Grund der Dateierweiterung " "erkennen. Versuchen Sie .dxf oder .dwg." -#: solvespace.cpp:778 +#: solvespace.cpp:823 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:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "" "Falsche Auswahl für die Schrittdimensionierung. Wählen Sie eine " "Einschränkung." -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "Der Zusammenbau funktioniert, gut." -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1841,7 +1869,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1854,7 +1882,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1866,7 +1894,7 @@ msgstr "" "Gekrümmte Flächen wurden als Dreiecksnetz angenähert.\n" "Das verursacht Fehler, typischerweise um 1%." -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1883,7 +1911,7 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1891,7 +1919,7 @@ msgstr "" "Diese Gruppe beinhaltet keine korrekt geschlossene 2D Fläche. Sie ist offen, " "nicht koplanar, oder überschneidet sich selbst." -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1908,7 +1936,7 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1925,36 +1953,36 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:898 +#: solvespace.cpp:943 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:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "Falsche Auswahl für Punkt nachzeichnen. Wähle einen einzelnen Punkt." -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "Konnte '%s' nicht schreiben" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Das Netz schneidet sich selbst: Falsch, ungültig." -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Das Netz schneidet sich nicht: Gut, gültig." -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Das Netz hat lose Kanten: Falsch, ungültig." -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "Das Netz hat keine lose Kanten: Gut, gültig." -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1965,7 +1993,7 @@ msgstr "" "\n" "Das Modell hat %d Dreiecke, von %d Flächen." -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1980,7 +2008,7 @@ msgstr "" "\n" "Keine problematischen Kanten, gut.%s" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1995,7 +2023,7 @@ msgstr "" "\n" "%d problematische Kanten, schlecht.%s" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2025,7 +2053,7 @@ msgstr "" "\n" "© 2008-%d Jonathan Westhues und andere.\n" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -2034,27 +2062,27 @@ msgstr "" "Objekt abgeleitet wurde. Versuchen Sie, dem übergeordneten Objekt einen Typ " "zuzuordnen." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "Name des Linientyps kann nicht leer sein." -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "Nicht weniger als 1 Wiederholung möglich." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "Nicht mehr als 999 Wiederholungen möglich." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "Der Name der Gruppe darf nicht leer sein." -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "Durchsichtigkeit muss zwischen Null und Eins sein." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "Radius darf nicht null oder negativ sein." @@ -2210,14 +2238,58 @@ msgctxt "button" msgid "&OK" msgstr "&OK" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "Der Maßstab kann nicht Null oder negativ sein." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "Ungültiges Format: geben Sie x, y, z ein" +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Ungültige Auswahl für Einschränkung \"Längenverhältnis\". Diese " +#~ "Einschränkung ist anwendbar auf:\n" +#~ "\n" +#~ " * zwei Liniensegmente\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Ungültige Auswahl für Einschränkung \"Längendifferenz\". Diese " +#~ "Einschränkung ist anwendbar auf:\n" +#~ "\n" +#~ " * zwei Liniensegmente\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "Längenverhältnis" + +#~ msgid "Length Diff&erence" +#~ msgstr "Längendifferenz" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Ungültige Auswahl für Skizze in neuer Arbeitsebene. Diese Gruppe kann " +#~ "erstellt werden mit:\n" +#~ "\n" +#~ " * einem Punkt (durch den Punkt, orthogonal zu den Koordinatenachsen)\n" +#~ " * einem Punkt und zwei Liniensegmenten (durch den Punkt, parallel zu " +#~ "den Linien)\n" +#~ " * einer Arbeitsebene (Kopie der Arbeitsebene)\n" + #~ msgctxt "file-type" #~ msgid "Q3D Object file" #~ msgstr "Q3D Objektdatei" diff --git a/res/locales/en_US.po b/res/locales/en_US.po index 27f024442..385d8d767 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -2,12 +2,12 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # Automatically generated, 2017. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,27 +27,27 @@ msgstr "" "\n" "Activate one with Sketch -> In Workplane." -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "Clipboard is empty; nothing to paste." -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "Number of copies to paste must be at least one." -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "Scale cannot be zero." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "Select one point to define origin of rotation." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "Select two points to define translation vector." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -55,23 +55,23 @@ msgstr "" "Transformation is identity. So all copies will be exactly on top of each " "other." -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "Too many items to paste; split this into smaller pastes." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "No workplane active." -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "Bad format: specify coordinates as x, y, z" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "Bad format: specify color as r, g, b" -#: confscreen.cpp:454 +#: confscreen.cpp:412 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:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Specify between 0 and %d digits after the decimal." -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "Export scale must not be zero!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "Cutter radius offset must not be negative!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "Bad value: autosave interval should be positive" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "Bad format: specify interval in integral minutes" @@ -167,115 +167,135 @@ msgstr "length-ratio" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "arc-arc-length-ratio" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "arc-line-length-ratio" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "length-difference" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "arc-arc-len-difference" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "arc-line-len-difference" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "symmetric" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "symmetric-h" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "symmetric-v" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "symmetric-line" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "at-midpoint" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "horizontal" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "vertical" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "diameter" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "pt-on-circle" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "same-orientation" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "angle" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "parallel" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "arc-line-tangent" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "cubic-line-tangent" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "curve-curve-tangent" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "perpendicular" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "eq-radius" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "eq-angle" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "eq-line-len-arc-len" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "lock-where-dragged" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "comment" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -283,7 +303,7 @@ msgstr "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -291,7 +311,7 @@ msgstr "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -299,7 +319,7 @@ msgstr "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -323,7 +343,7 @@ msgstr "" " * a plane face and a point (minimum distance)\n" " * a circle or an arc (diameter)\n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -343,7 +363,7 @@ msgstr "" " * a point and a circle or arc (point on curve)\n" " * a point and a plane face (point on face)\n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -371,29 +391,37 @@ msgstr "" " * two circles or arcs (equal radius)\n" " * a line segment and an arc (line segment length equals arc length)\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -405,7 +433,7 @@ msgstr "" " * a line segment and a point (point at midpoint)\n" " * a line segment and a workplane (line's midpoint on plane)\n" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -425,7 +453,7 @@ msgstr "" " * workplane, and two points or a line segment (symmetric about " "workplane)\n" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -433,7 +461,7 @@ msgstr "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -441,7 +469,7 @@ msgstr "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -455,7 +483,7 @@ msgstr "" " * two points\n" " * a line segment\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -467,15 +495,15 @@ msgstr "" "\n" " * two normals\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "Must select an angle constraint." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "Must select a constraint with associated label." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -489,11 +517,11 @@ msgstr "" " * a line segment and a normal\n" " * two normals\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "Curve-curve tangency must apply in workplane." -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -511,7 +539,7 @@ msgstr "" " * two normals (parallel)\n" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -525,7 +553,7 @@ msgstr "" " * a line segment and a normal\n" " * two normals\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -537,7 +565,11 @@ msgstr "" "\n" " * a point\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "NEW COMMENT -- DOUBLE-CLICK TO EDIT" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "click center of comment text" @@ -565,25 +597,25 @@ msgstr "" " * a point and two line segments (plane through point and parallel to " "lines)\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "Active group mesh is empty; nothing to export." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "freehand lines were replaced with continuous lines" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "zigzag lines were replaced with continuous lines" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -599,11 +631,11 @@ msgctxt "group-name" msgid "#references" msgstr "#references" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "The file is empty. It may be corrupt." -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -645,7 +677,7 @@ msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "&Cancel" @@ -819,295 +851,303 @@ msgid "Use &Perspective Projection" msgstr "Use &Perspective Projection" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "Show E&xploded View" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "Dimension &Units" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "Dimensions in &Millimeters" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "Dimensions in M&eters" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "Dimensions in &Inches" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "Dimensions in &Feet and Inches" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "Show &Toolbar" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "Show Property Bro&wser" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "&Full Screen" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "&New Group" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "Sketch In &3d" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "Sketch In New &Workplane" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "Step &Translating" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "Step &Rotating" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "E&xtrude" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "&Helix" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "&Lathe" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "Re&volve" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "Link / Assemble..." -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "Link Recent" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Sketch" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "In &Workplane" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "Anywhere In &3d" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "Datum &Point" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "&Workplane" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "Line &Segment" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "C&onstruction Line Segment" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "&Rectangle" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "&Circle" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "&Arc of a Circle" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "&Bezier Cubic Spline" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "&Text in TrueType Font" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "&Image" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "To&ggle Construction" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "Tangent &Arc at Point" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Split Curves at &Intersection" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Constrain" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "&Distance / Diameter" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "Re&ference Dimension" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "A&ngle" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "Reference An&gle" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Other S&upplementary Angle" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Toggle R&eference Dim" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "&Horizontal" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Vertical" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "&On Point / Curve / Plane" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "E&qual Length / Radius / Angle" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "Length Ra&tio" +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "Length / Arc Ra&tio" -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "Length Diff&erence" +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "Length / Arc Diff&erence" -#: graphicswin.cpp:158 +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "At &Midpoint" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "S&ymmetric" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "Para&llel / Tangent" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "&Perpendicular" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Same Orient&ation" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "Lock Point Where &Dragged" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Comment" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Analyze" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "Measure &Volume" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "Measure A&rea" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "Measure &Perimeter" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "Show &Interfering Parts" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "Show &Naked Edges" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "Show &Center of Mass" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "Show &Underconstrained Points" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "&Trace Point" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "&Stop Tracing..." -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Step &Dimension..." -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Help" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "&Language" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "&Website / Manual" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "&About" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(no recent files)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "File '%s' does not exist." -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "No workplane is active, so the grid will not appear." -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1121,17 +1161,17 @@ msgstr "" "For a perspective projection, modify the perspective factor in the " "configuration screen. A value around 0.3 is typical." -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 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:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "No additional entities share endpoints with the selected entities." -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1139,7 +1179,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:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1147,7 +1187,7 @@ msgstr "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1155,11 +1195,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:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "No workplane selected. Activating default workplane for this group." -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 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-" @@ -1169,7 +1209,7 @@ msgstr "" "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1177,47 +1217,47 @@ msgstr "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "click point on arc (draws anti-clockwise)" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "click to place datum point" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "click first point of line segment" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "click first point of construction line segment" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "click first point of cubic segment" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "click center of circle" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "click origin of workplane" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "click one corner of rectangle" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "click top left of text" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "click top left of image" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1230,13 +1270,14 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "sketch-in-3d" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" "Bad selection for new sketch in workplane. This group can be created with:\n" @@ -1244,9 +1285,10 @@ msgstr "" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1254,16 +1296,16 @@ msgstr "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "extrude" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "Lathe operation can only be applied to planar sketches." -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1277,16 +1319,16 @@ msgstr "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "lathe" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "Revolve operation can only be applied to planar sketches." -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1300,16 +1342,16 @@ msgstr "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "revolve" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "Helix operation can only be applied to planar sketches." -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1323,12 +1365,12 @@ msgstr "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "helix" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1344,41 +1386,41 @@ msgstr "" " * a point and a line or a normal (rotate about an axis through the " "point, and parallel to line / normal)\n" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "rotate" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "translate" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "(unnamed)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "not closed contour, or not all same style!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "points not all coplanar!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "contour is self-intersecting!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "zero-length edge!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Must be sketching in workplane to create tangent arc." -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1386,7 +1428,7 @@ msgstr "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1394,15 +1436,15 @@ msgstr "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "Couldn't split this entity; lines, circles, or cubics only." -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "Must be sketching in workplane to split." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." @@ -1410,107 +1452,107 @@ msgstr "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "Can't split; no intersection found." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Assign to Style" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "No Style" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Newly Created Custom Style..." -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Group Info" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Style Info" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Select Edge Chain" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Toggle Reference Dimension" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Other Supplementary Angle" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Snap to Grid" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Remove Spline Point" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Add Spline Point" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "Cannot add spline point: maximum number of points reached." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Toggle Construction" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Delete Point-Coincident Constraint" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Cut" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Copy" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Select All" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Paste" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Paste Transformed..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Delete" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Unselect All" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Unselect Hovered" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Zoom to Fit" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "click next point of line, or press Esc" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1518,15 +1560,15 @@ msgstr "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "click to place other corner of rectangle" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "click to set radius" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1534,21 +1576,21 @@ msgstr "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "click to place point" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "click next point of cubic, or press Esc" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Sketching in a workplane already; sketch in 3d before creating new workplane." -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1556,11 +1598,11 @@ msgstr "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "click to place bottom right of text" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1568,193 +1610,199 @@ msgstr "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "NEW COMMENT -- DOUBLE-CLICK TO EDIT" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace models" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "ALL" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "IDF circuit board" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "STL triangle mesh" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "PNG image" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "STL mesh" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ mesh" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-compatible mesh, with viewer" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-compatible mesh, mesh only" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "VRML text file" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "STEP file" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "PDF file" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Encapsulated PostScript" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "Scalable Vector Graphics" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF file (AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL file" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF and DWG files" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "untitled" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Save File" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Open File" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "_Cancel" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "_Save" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "_Open" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "Autosave Available" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "An autosave file is available for this sketch." -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Do you want to load the autosave file instead?" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "&Load autosave" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "Do&n't Load" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "Modified File" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, 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:562 +#: solvespace.cpp:603 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:565 +#: solvespace.cpp:606 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:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "&Save" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "Do&n't Save" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "(new sketch)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "Property Browser" -#: solvespace.cpp:658 +#: solvespace.cpp:699 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 " @@ -1764,7 +1812,7 @@ msgstr "" "is probably not what you want; hide them by clicking the link at the top of " "the text window." -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1773,19 +1821,19 @@ msgstr "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." -#: solvespace.cpp:778 +#: solvespace.cpp:823 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:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "Bad selection for step dimension; select a constraint." -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "The assembly does not interfere, good." -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1796,7 +1844,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1809,7 +1857,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1821,7 +1869,7 @@ msgstr "" "Curved surfaces have been approximated as triangles.\n" "This introduces error, typically of around 1%." -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1838,7 +1886,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1846,7 +1894,7 @@ msgstr "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1863,7 +1911,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1880,36 +1928,36 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Bad selection for perimeter; select line segments, arcs, and curves." -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "Bad selection for trace; select a single point." -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "Couldn't write to '%s'" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "The mesh is self-intersecting (NOT okay, invalid)." -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "The mesh is not self-intersecting (okay, valid)." -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "The mesh has naked edges (NOT okay, invalid)." -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "The mesh is watertight (okay, valid)." -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1920,7 +1968,7 @@ msgstr "" "\n" "The model contains %d triangles, from %d surfaces." -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1935,7 +1983,7 @@ msgstr "" "\n" "Zero problematic edges, good.%s" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1950,7 +1998,7 @@ msgstr "" "\n" "%d problematic edges, bad.%s" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1979,7 +2027,7 @@ msgstr "" "\n" "© 2008-%d Jonathan Westhues and other authors.\n" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -1987,27 +2035,27 @@ msgstr "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "Style name cannot be empty" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "Can't repeat fewer than 1 time." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "Can't repeat more than 999 times." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "Group name cannot be empty" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "Opacity must be between zero and one." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "Radius cannot be zero or negative." @@ -2162,14 +2210,64 @@ msgctxt "button" msgid "&OK" msgstr "&OK" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "Scale cannot be zero or negative." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "Bad format: specify x, y, z" +#~ msgid "&Mirror" +#~ msgstr "&Mirror" + +#~ msgctxt "group-name" +#~ msgid "mirror" +#~ msgstr "mirror" + +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "Length Ra&tio" + +#~ msgid "Length Diff&erence" +#~ msgstr "Length Diff&erence" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" + #~ msgctxt "file-type" #~ msgid "Q3D Object file" #~ msgstr "Q3D Object file" diff --git a/res/locales/es_AR.po b/res/locales/es_AR.po index 82fd1b90a..74638f0ab 100644 --- a/res/locales/es_AR.po +++ b/res/locales/es_AR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-17 \n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: 2021-09-17 \n" "Last-Translator: andesfreedesign@gmail.com\n" "Language-Team: AndesFreeDesign\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,79 +27,78 @@ msgstr "" "solo en un plano de trabajo.\n" "Activar uno con Croquis-> En Plano de trabajo" -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "El portapapeles está vacío; nada que pegar." -#: clipboard.cpp:374 +#: clipboard.cpp:373 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:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "La escala no puede ser cero." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "Seleccione un punto para definir el origen de la rotación." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "Seleccione dos puntos para definir el vector de traslación." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "" -"No se especificó ninguna transformación. Todas las copias estarán ubicadas en el mismo lugar." +"No se especificó ninguna transformación. Todas las copias estarán ubicadas " +"en el mismo lugar." -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "Demasiados elementos para pegar; divida esto en partes más pequeñas." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "Ningún plano de trabajo activo." -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "Formato incorrecto: especifique las coordenadas como x, y, z" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "Formato incorrecto: especifique color como r, g, b" -#: confscreen.cpp:454 +#: confscreen.cpp:412 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." msgstr "" -"El factor de perspectiva no tendrá ningún efecto hasta que habilite Ver -> Usar" -"Proyección Perspectiva." +"El factor de perspectiva no tendrá ningún efecto hasta que habilite Ver -> " +"UsarProyección Perspectiva." -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, 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:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "¡La escala de exportación no debe ser cero!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "¡El desfase del radio de corte no debe ser negativo!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" -msgstr "" -"Valor incorrecto: el intervalo de autoguardado debe ser positivo" +msgstr "Valor incorrecto: el intervalo de autoguardado debe ser positivo" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" -msgstr "" -"Formato incorrecto: especifique el intervalo en minutos integrales" +msgstr "Formato incorrecto: especifique el intervalo en minutos integrales" #: constraint.cpp:12 msgctxt "constr-name" @@ -168,139 +167,159 @@ msgstr "longitud-radio" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "longitud-diferencia" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "simetría" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "simetría-h" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "simetría-v" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "simetría-línea" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "en-puntoMedio" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "horizontal" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "vertical" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "diámetro" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "p-sobre-círculo" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "misma-orientación" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "ángulo" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "paralela" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "arco-línea-tangente" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "cúbica-línea-tangente" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "curva-curva-tangente" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "perpendicular" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "igual-radio" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "igual-ángulo" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "igual-línea-long-arco-long" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "fijación" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "comentario" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." msgstr "" -"El arco tangente y la línea deben compartir un punto final. Restringirlos con " -"Restringir -> En el punto antes de restringir la tangente." +"El arco tangente y la línea deben compartir un punto final. Restringirlos " +"con Restringir -> En el punto antes de restringir la tangente." -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." msgstr "" -"La tangente cúbica y la línea deben compartir un punto final. Restringirlos con " -"Restringir -> En el punto antes de restringir la tangente." +"La tangente cúbica y la línea deben compartir un punto final. Restringirlos " +"con Restringir -> En el punto antes de restringir la tangente." -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." msgstr "" -"Las curvas deben compartir un punto final. Restringirlos con " -"Restringir -> En el punto antes de restringir la tangente." +"Las curvas deben compartir un punto final. Restringirlos con Restringir -> " +"En el punto antes de restringir la tangente." -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -313,8 +332,8 @@ msgid "" " * a plane face and a point (minimum distance)\n" " * a circle or an arc (diameter)\n" msgstr "" -"Mala selección para la restricción de distancia / diámetro. Esta restricción puede aplicarse " -"a:\n" +"Mala selección para la restricción de distancia / diámetro. Esta restricción " +"puede aplicarse a:\n" "\n" " * dos puntos (distancia entre puntos) \n" " * un segmento de línea (longitud) \n" @@ -324,7 +343,7 @@ msgstr "" " * una cara plana y un punto (distancia mínima) \n" " * un círculo o un arco (diámetro) \n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -335,8 +354,8 @@ msgid "" " * a point and a circle or arc (point on curve)\n" " * a point and a plane face (point on face)\n" msgstr "" -"Mala selección para una restricción de punto / curva / plano. Esta restricción puede" -"aplicar a: \n" +"Mala selección para una restricción de punto / curva / plano. Esta " +"restricción puedeaplicar a: \n" "\n" " * dos puntos (puntos coincidentes) \n" " * un punto y un plano de trabajo (punto en el plano) \n" @@ -344,7 +363,7 @@ msgstr "" " * un punto y un círculo o arco (punto en la curva) \n" " * un punto y una cara plana (punto en la cara) \n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -359,54 +378,55 @@ msgid "" " * two circles or arcs (equal radius)\n" " * a line segment and an arc (line segment length equals arc length)\n" msgstr "" -"Mala selección para restricción de igualdad longitud / radio. Esta restricción puede " -"aplicar a:\n" +"Mala selección para restricción de igualdad longitud / radio. Esta " +"restricción puede aplicar a:\n" "\n" " * dos segmentos de línea (igual longitud)\n" -" * dos segmentos de línea y dos puntos (distancias de línea-punto iguales)\n" +" * dos segmentos de línea y dos puntos (distancias de línea-punto " +"iguales)\n" " * un segmento de línea y dos puntos (distancias punto-línea iguales)\n" -" * un segmento de línea, y un punto y un segmento de línea (distancia punto-línea " -"igual a la longitud)\n" +" * un segmento de línea, y un punto y un segmento de línea (distancia " +"punto-línea igual a la longitud)\n" " * cuatro segmentos de línea o normales (ángulo igual entre A,B y C,D)\n" " * tres segmentos de línea o normales (ángulo igual entre A,B y B,C)\n" " * 2 círculos o arcos (igual radio)\n" -" * un segmento de línea y un arco (la longitud del segmento de línea es igual a la longitud del arco)\n" +" * un segmento de línea y un arco (la longitud del segmento de línea es " +"igual a la longitud del arco)\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Mala selección por restricción de la relación de longitud. Esta restricción se puede aplicar a:\n" -"\n" -" * dos segmentos de línea\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Mala selección por restricción de diferencia de longitud. Esta restricción puede aplicar " -"a:\n" -"\n" -" * dos segmentos de línea\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" " * a line segment and a point (point at midpoint)\n" " * a line segment and a workplane (line's midpoint on plane)\n" msgstr "" -"Mala selección para una restricción de punto medio. Esta restricción se puede aplicar a:\n" +"Mala selección para una restricción de punto medio. Esta restricción se " +"puede aplicar a:\n" "\n" " * un segmento de línea y un punto (punto en el punto medio)\n" -" * un segmento de línea y un plano de trabajo (punto medio de la línea en el plano)\n" +" * un segmento de línea y un plano de trabajo (punto medio de la línea en " +"el plano)\n" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -417,32 +437,33 @@ msgid "" " * workplane, and two points or a line segment (symmetric about " "workplane)\n" msgstr "" -"Mala selección por restricción simétrica. Esta restricción se puede aplicar a:\n" +"Mala selección por restricción simétrica. Esta restricción se puede aplicar " +"a:\n" "\n" -" * dos puntos o un segmento de línea (simétrico con respecto al eje de coordenadas del " -"plano de trabajo)\n" -" * segmento de línea, y dos puntos o un segmento de línea (simétrico con respecto al segmento " -"de línea)\n" +" * dos puntos o un segmento de línea (simétrico con respecto al eje de " +"coordenadas del plano de trabajo)\n" +" * segmento de línea, y dos puntos o un segmento de línea (simétrico con " +"respecto al segmento de línea)\n" " * plano de trabajo, y dos puntos o un segmento de recta (simétrico sobre " "plano de trabajo)\n" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." msgstr "" -"Un plano de trabajo debe estar activo al restringir simétrico sin un plano de " -"simetría explícito." +"Un plano de trabajo debe estar activo al restringir simétrico sin un plano " +"de simetría explícito." -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." msgstr "" -"Active un plano de trabajo (con Croquis -> En plano de trabajo) antes de aplicar una " -"restricción horizontal o vertical." +"Active un plano de trabajo (con Croquis -> En plano de trabajo) antes de " +"aplicar una restricción horizontal o vertical." -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -456,27 +477,27 @@ msgstr "" " * dos puntos\n" " * un segmento de línea\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" "\n" " * two normals\n" msgstr "" -"Mala selección para la misma restricción de orientación. Esta restricción puede aplicarse " -"a:\n" +"Mala selección para la misma restricción de orientación. Esta restricción " +"puede aplicarse a:\n" "\n" " * dos normales\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "Debe seleccionar una restricción de ángulo." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "Debe seleccionar una restricción con etiqueta asociada." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -484,17 +505,18 @@ msgid "" " * a line segment and a normal\n" " * two normals\n" msgstr "" -"Mala selección por restricción de ángulo. Esta restricción se puede aplicar a:\n" +"Mala selección por restricción de ángulo. Esta restricción se puede aplicar " +"a:\n" "\n" " * dos segmentos de línea\n" " * un segmento de linea y una normal\n" " * dos normales\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "La tangencia curva-curva debe aplicarse en el plano de trabajo." -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -504,15 +526,16 @@ msgid "" " * two normals (parallel)\n" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" -"Mala selección para restricción de paralelo / tangente. Esta restricción puede aplicarse " -"a:\n" +"Mala selección para restricción de paralelo / tangente. Esta restricción " +"puede aplicarse a:\n" "\n" " * dos segmentos de línea (paralelos)\n" " * un segmento de línea y una normal (paralelas)\n" " * dos normales (paralelas)\n" -" * dos segmentos de línea, arcos, o beziers, que comparten un punto final (tangente)\n" +" * dos segmentos de línea, arcos, o beziers, que comparten un punto final " +"(tangente)\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -520,25 +543,30 @@ msgid "" " * a line segment and a normal\n" " * two normals\n" msgstr "" -"Mala selección por restricción perpendicular. Esta restricción se puede aplicar a:\n" +"Mala selección por restricción perpendicular. Esta restricción se puede " +"aplicar a:\n" "\n" " * dos segmentos de línea\n" " * un segmento de línea y una normal\n" " * dos normales\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" "\n" " * a point\n" msgstr "" -"Mala selección para el punto de bloqueo donde se arrastró la restricción. Esta restricción puede " -"aplicar a:\n" +"Mala selección para el punto de bloqueo donde se arrastró la restricción. " +"Esta restricción puede aplicar a:\n" "\n" " * un punto\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "NUEVO COMENTARIO -- DOBLE-CLIC PARA EDITAR" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "clic en el centro del texto del comentario" @@ -547,8 +575,8 @@ msgid "" "No solid model present; draw one with extrudes and revolves, or use Export " "2d View to export bare lines and curves." msgstr "" -"No hay un modelo sólido presente; dibuje uno con extrusiones y revoluciones, o use Exportar " -"Vista 2d para exportar líneas y curvas desnudas." +"No hay un modelo sólido presente; dibuje uno con extrusiones y revoluciones, " +"o use Exportar Vista 2d para exportar líneas y curvas desnudas." #: export.cpp:61 msgid "" @@ -561,35 +589,36 @@ msgid "" msgstr "" "Mala selección para la sección de exportación. Por favor seleccione:\n" "\n" -" * nada, con un plano de trabajo activo (el plano de trabajo es un plano de sección)\n" +" * nada, con un plano de trabajo activo (el plano de trabajo es un plano " +"de sección)\n" " * una cara (plano de sección a través de la cara)\n" -" * un punto y dos segmentos de línea (plano que pasa por el punto y paralelo a las " -"líneas)\n" +" * un punto y dos segmentos de línea (plano que pasa por el punto y " +"paralelo a las líneas)\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "La malla del grupo activo está vacía; nada para exportar." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "Las líneas a mano alzada fueron reemplazadas por líneas continuas." -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "Las líneas en zigzag fueron reemplazadas por líneas continuas." -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Algunos aspectos del dibujo no tienen equivalente DXF y no se exportaron:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" -"El tamaño de la página PDF supera las 5080mm x 5080mm; " -"muchos usuarios pueden rechazar este archivo." +"El tamaño de la página PDF supera las 5080mm x 5080mm; muchos usuarios " +"pueden rechazar este archivo." #: file.cpp:44 group.cpp:91 msgctxt "group-name" @@ -601,17 +630,17 @@ msgctxt "group-name" msgid "#references" msgstr "#referencias" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "El archivo esta vacío. Puede estar corrupto." -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." msgstr "" -"Datos no reconocidos en el archivo. Este archivo puede estar dañado o ser de una versión más reciente " -" del programa." +"Datos no reconocidos en el archivo. Este archivo puede estar dañado o ser de " +"una versión más reciente del programa." #: file.cpp:867 msgctxt "title" @@ -634,8 +663,8 @@ msgid "" msgstr "" "¿Quieres localizarlo manualmente?\n" "\n" -"Si lo rechaza, cualquier geometría que dependa del archivo faltante " -"se eliminará permanentemente." +"Si lo rechaza, cualquier geometría que dependa del archivo faltante se " +"eliminará permanentemente." #: file.cpp:873 msgctxt "button" @@ -647,7 +676,7 @@ msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "&Cancelar" @@ -821,295 +850,304 @@ msgid "Use &Perspective Projection" msgstr "Usar Proyección &Perspectiva" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "&Unidades de Cota" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "Cotas en &Milímetros" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "Cotas en M&etros" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "Cotas en &Pulgadas" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "Mostrar &Barra de herramientas" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "Mostrar Nave&gador de Propiedades" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "&Pantalla Completa" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "&Nuevo Grupo" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "Сroquis En &3d" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "Сroquis En Nuevo &Plano de trabajo" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "Paso &Traslación" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "Paso &Giratorio" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "E&xtrusión" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "&Hélice" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "&Torno" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "Re&volución" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "Enlace / Ensamblar..." -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "Enlace Reciente" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Croquis" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "En &Plano de trabajo" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "En cualquier lugar en &3d" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "Referencia &Punto" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "&Plano de trabajo" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "Línea &Segmento" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "S&egmento de Línea de Construcción" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "&Rectángulo" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "&Círculo" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "&Arco de un Círculo" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "&Spline Cúbico de Bezier" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "&Texto en Fuente TrueType" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "&Imagen" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "Al&ternar Construcción" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "Tangente &Arco en el Punto" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Dividir Curvas en &Intersección" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Restricción" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "&Distancia / Diámetro" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "Co&ta de Referencia" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "Á&ngulo" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "Ángulo de Re&ferencia" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Otro Á&ngulo Suplementario" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Alternar C&ota Referencia" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "&Horizontal" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Vertical" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "&Sobre Punto / Curva / Plano" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "I&gual Longitud / Radio / Ángulo" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "Relación Lo&ngitud" +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "Diferencia Long&itud" +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" -#: graphicswin.cpp:158 +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "En &PuntoMedio" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "S&imetría" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "Para&lela / Tangente" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "&Perpendicular" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Misma Orient&ación" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "Punto de Bloqueo Donde &Arrastrado" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Comentario" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Analizar" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "Medición &Volumen" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "Medición Á&rea" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "Medición &Perímetro" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "Mostrar &Piezas que Interfieren" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "Mostrar &Aristas Desnudas" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "Mostrar &Centro de Masa" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "Mostrar &Puntos Subrestringidos" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "&Punto de Rastro" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "&Dejar de rastrear..." -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Cota &Paso..." -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Ayuda" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "&Lenguaje" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "&Sitio Web / Manual" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "&Acerca" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(no hay archivos recientes)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "El archivo '%s' no existe." -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 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á." +msgstr "" +"No hay ningún plano de trabajo activo, por lo que la cuadrícula no aparecerá." -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1117,155 +1155,157 @@ msgid "" "For a perspective projection, modify the perspective factor in the " "configuration screen. A value around 0.3 is typical." msgstr "" -"El factor de perspectiva se establece en cero, por lo que la vista siempre será una proyección " -"paralela.\n" +"El factor de perspectiva se establece en cero, por lo que la vista siempre " +"será una proyección paralela.\n" "\n" -"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." +"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:819 +#: graphicswin.cpp:836 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." +"Seleccione un punto; este punto se convertirá en el centro de la vista en " +"pantalla." -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." -msgstr "Ninguna entidad adicional comparte puntos finales con las entidades seleccionadas." +msgstr "" +"Ninguna entidad adicional comparte puntos finales con las entidades " +"seleccionadas." -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." 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." +"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:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -"No hay ningún plano de trabajo activo. Activar un plano de trabajo (con Croquis -> En plano de trabajo) " -"para definir el plano para el enganche a la cuadrícula." +"No hay ningún plano de trabajo activo. Activar un plano de trabajo (con " +"Croquis -> En plano de trabajo) para definir el plano para el enganche a la " +"cuadrícula." -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 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 "" -"No se pueden enganchar estos elementos a la cuadrícula; seleccionar puntos, comentarios de texto o restricciones " -"con una etiqueta. Para enganchar una línea, seleccione sus puntos finales." +"No se pueden enganchar estos elementos a la cuadrícula; seleccionar puntos, " +"comentarios de texto o restricciones con una etiqueta. Para enganchar una " +"línea, seleccione sus puntos finales." -#: graphicswin.cpp:1247 +#: graphicswin.cpp:1269 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." +msgstr "" +"No se seleccionó ningún plano de trabajo. Activando el plano de trabajo " +"predeterminado para este grupo." -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 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 "" -"No se selecciona ningún plano de trabajo y el grupo activo no tiene un " -"plano de trabajo. Intente seleccionar un plano de trabajo o activar un croquis-en-nuevo-" -"grupo de plano de trabajo." +"No se selecciona ningún plano de trabajo y el grupo activo no tiene un plano " +"de trabajo. Intente seleccionar un plano de trabajo o activar un croquis-en-" +"nuevo-grupo de plano de trabajo." -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." 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." +"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:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "clic en el punto en el arco (dibuja en sentido antihorario)" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "clic para colocar el punto de referencia" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "clic en el primer punto del segmento de línea" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "clic en el primer punto del segmento de línea de construcción" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "clic en el primer punto del segmento cúbico" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "clic en el centro del círculo" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "clic en origen del plano de trabajo" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "clic en una esquina del rectángulo" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "clic en la parte superior izquierda del texto" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "clic en la parte superior izquierda de la imagen" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." msgstr "" -"No se seleccionaron entidades. Seleccione entidades antes de intentar alternar su " -"estado de construcción." +"No se seleccionaron entidades. Seleccione entidades antes de intentar " +"alternar su estado de construcción." #: group.cpp:86 msgctxt "group-name" msgid "sketch-in-3d" msgstr "croquis-en-3d" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -"Mala selección para un nuevo croquis en el plano de trabajo. Este grupo se puede crear con:\n" -"\n" -" * un punto (a través del punto, ortogonal a los ejes de coordenadas)\n" -" * un punto y dos segmentos de línea (a través del punto, paralelo a " -"líneas)\n" -" * un plano de trabajo (copia de un plano de trabajo)\n" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." msgstr "" -"Active un plano de trabajo (Croquis -> En plano de trabajo) antes de extruir. El croquis " -"se extruirá normal al plano de trabajo." +"Active un plano de trabajo (Croquis -> En plano de trabajo) antes de " +"extruir. El croquis se extruirá normal al plano de trabajo." -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "extruir" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "La operación de torno solo se puede aplicar a croquis planos." -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1275,20 +1315,20 @@ msgid "" msgstr "" "Mala selección para el nuevo grupo de torno. Este grupo se puede crear con:\n" "\n" -" * un punto y un segmento de línea o normal (revolucionado alrededor de un eje paralelo " -"a la línea / normal, a través del punto)\n" +" * un punto y un segmento de línea o normal (revolucionado alrededor de " +"un eje paralelo a la línea / normal, a través del punto)\n" " * un segmento de línea (revolucionado sobre un segmento de línea)\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "torno" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "La operación de revolución solo se puede aplicar a croquis planos." -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1296,22 +1336,23 @@ msgid "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" msgstr "" -"Mala selección para el nuevo grupo de revolución. Este grupo se puede crear con:\n" +"Mala selección para el nuevo grupo de revolución. Este grupo se puede crear " +"con:\n" "\n" -" * un punto y un segmento de línea o normal (revolucionado alrededor de un eje paralelo " -"a la línea / normal, a través del punto)\n" +" * un punto y un segmento de línea o normal (revolucionado alrededor de " +"un eje paralelo a la línea / normal, a través del punto)\n" " * un segmento de línea (revolucionado sobre un segmento de línea)\n" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "revolución" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "La operación de hélice solo se puede aplicar a croquis planos." -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1319,18 +1360,19 @@ msgid "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" msgstr "" -"Mala selección para el nuevo grupo de hélice. Este grupo se puede crear con:\n" +"Mala selección para el nuevo grupo de hélice. Este grupo se puede crear " +"con:\n" "\n" -" * un punto y un segmento de recta o normal (girado alrededor de un eje paralelo " -"a la línea / normal, a través del punto)\n" +" * un punto y un segmento de recta o normal (girado alrededor de un eje " +"paralelo a la línea / normal, a través del punto)\n" " * un segmento de línea (girado sobre un segmento de línea)\n" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "hélice" -#: group.cpp:258e +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1341,453 +1383,465 @@ msgid "" msgstr "" "Mala selección para nueva rotación. Este grupo se puede crear con:\n" "\n" -" * un punto, mientras está bloqueado en el plano de trabajo (girar en el plano, sobre ese " -"punto)\n" -" * un punto y una línea o una normal (rotar alrededor de un eje a través de un " -"punto y paralela a la línea / normal)\n" +" * un punto, mientras está bloqueado en el plano de trabajo (girar en el " +"plano, sobre ese punto)\n" +" * un punto y una línea o una normal (rotar alrededor de un eje a través " +"de un punto y paralela a la línea / normal)\n" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "rotar" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "trasladar" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "(sin nombre)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "¡Contorno no cerrado, o no todos del mismo estilo!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "¡No todos los puntos son coplanares!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "¡El contorno se intersecta a sí mismo!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "¡arista de longitud cero!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." -msgstr "Debe estar dibujando en el plano de trabajo para crear un arco tangente." +msgstr "" +"Debe estar dibujando en el plano de trabajo para crear un arco tangente." -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." msgstr "" -"Para crear un arco tangente, seleccione un punto donde dos líneas que no sean de construcción o " -"los círculos de este grupo y el plano de trabajo se unen." +"Para crear un arco tangente, seleccione un punto donde dos líneas que no " +"sean de construcción o los círculos de este grupo y el plano de trabajo se " +"unen." -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." msgstr "" -"No pude redondear esta esquina. Pruebe con un radio más pequeño o intente crear la " -"geometría deseada a mano con restricciones de tangencia." +"No pude redondear esta esquina. Pruebe con un radio más pequeño o intente " +"crear la geometría deseada a mano con restricciones de tangencia." -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "No se pudo dividir esta entidad; solo líneas, círculos o cúbicos." -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "Debe estar dibujando en el plano de trabajo para dividir." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" -"Seleccione dos entidades que se crucen entre sí (por ejemplo, dos líneas / círculos / arcos " -"o una línea / círculo / arco y un punto)." +"Seleccione dos entidades que se crucen entre sí (por ejemplo, dos líneas / " +"círculos / arcos o una línea / círculo / arco y un punto)." -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "No se puede dividir; no se encontró ninguna intersección." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Asignar a Estilo" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "Sin Estilo" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Estilo Personalizado Recién Creado..." -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Información de Grupo" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Información de Estilo" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Seleccionar Cadena de Arista" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Alternar Cota de Referencia" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Otro Ángulo Suplementario" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Enganchar a la cuadrícula" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Remover Punto de Spline" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Agregar Punto de Spline" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." -msgstr "No se puede agregar un punto de spline: se alcanzó el número máximo de puntos." +msgstr "" +"No se puede agregar un punto de spline: se alcanzó el número máximo de " +"puntos." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Alternar Construcción" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Eliminar restricción de punto-coincidente" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Cortar" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Copiar" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Seleccionar Todo " -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Pegar" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Pegar Transformado ..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Eliminar" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Deseleccionar Todo" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Deselección Flotante" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Zoom para ajustar" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "clic en el siguiente punto de la línea o presione Esc" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -"No se puede dibujar un rectángulo en 3d; primero, active un plano de trabajo con Croquis -> En " -"Plano de trabajo." +"No se puede dibujar un rectángulo en 3d; primero, active un plano de trabajo " +"con Croquis -> En Plano de trabajo." -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "clic para colocar la otra esquina del rectángulo" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "clic para establecer el radio" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -"No se puede dibujar un arco en 3d; primero, active un plano de trabajo con Croquis -> En " -"Plano de trabajo." +"No se puede dibujar un arco en 3d; primero, active un plano de trabajo con " +"Croquis -> En Plano de trabajo." -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "clic para colocar el punto" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "clic en el siguiente punto del cúbico, o presione Esc" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" -"Dibujando en un plano de trabajo ya; croquis en 3d antes de crear un nuevo plano de trabajo." +"Dibujando en un plano de trabajo ya; croquis en 3d antes de crear un nuevo " +"plano de trabajo." -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -"No se puede dibujar texto en 3D; primero, active un plano de trabajo con Croquis -> En " -"Plano de trabajo." +"No se puede dibujar texto en 3D; primero, active un plano de trabajo con " +"Croquis -> En Plano de trabajo." -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "clic para colocar la parte inferior derecha del texto" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -"No se puede dibujar una imagen en 3D; primero, active un plano de trabajo con Croquis -> En " -"Plano de Trabajo." +"No se puede dibujar una imagen en 3D; primero, active un plano de trabajo " +"con Croquis -> En Plano de Trabajo." -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "NUEVO COMENTARIO -- DOBLE-CLIC PARA EDITAR" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace modelos" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "placa circuito IDF" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "imagen PNG" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "STL malla" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ malla" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-malla compatible, con visor" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-malla compatible, solo malla" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "Archivo texto VRML" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "Archivo STEP" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "Archivo PDF" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Encapsulado PostScript" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "Gráficos Vectoriales Escalables" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "Archivo DXF (AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "Archivo HPGL" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "Archivos AutoCAD DXF y DWG" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "Valores separados por comas" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "sin título" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Guardar Archivo" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Abrir Archivo" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "_Cancelar" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "_Guardar" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "_Abrir" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "Autoguardado Disponible" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Un archivo de autoguardado está disponible para este croquis." -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "¿Desea cargar el archivo de autoguardado en su lugar?" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "&Cargar autoguardado" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "No Cargar" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "Archivo Modificado" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, 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:562 +#: solvespace.cpp:603 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:565 +#: solvespace.cpp:606 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:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "&Guardar" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "No& Guardar" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "(nuevo croquis)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "Explorador de Propiedades" -#: solvespace.cpp:658 +#: solvespace.cpp:699 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 "" "Las restricciones se muestran actualmente y se exportarán en la trayectoria." -"Probablemente esto no sea lo que quieres; ocultarlos haciendo clic en el enlace en la parte superior de " -"la ventana de texto." +"Probablemente esto no sea lo que quieres; ocultarlos haciendo clic en el " +"enlace en la parte superior de la ventana de texto." -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -"No se puede identificar el tipo de archivo a partir de la extensión del nombre del archivo '%s'; intente .dxf o ." -"dwg." +"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:778 +#: solvespace.cpp:823 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." +msgstr "" +"La restricción debe tener una etiqueta y no debe ser una cota de referencia." -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "Mala selección para la cota del paso; seleccione una restricción." -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "El ensamble no interfiere, bien." -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1798,7 +1852,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1811,7 +1865,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1823,7 +1877,7 @@ msgstr "" "Las superficies curvas se han aproximado como triángulos.\n" "Esto introduce un error, normalmente alrededor del 1%." -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1840,15 +1894,15 @@ msgstr "" "Las curvas se han aproximado como lineales por partes.\n" "Esto introduce un error, normalmente alrededor del 1%%." -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -"Este grupo no contiene un área cerrada 2d correctamente formada. Está abierta, " -"no coplanares, ni auto-intersectantes." +"Este grupo no contiene un área cerrada 2d correctamente formada. Está " +"abierta, no coplanares, ni auto-intersectantes." -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1865,7 +1919,7 @@ msgstr "" "Las curvas se han aproximado como lineales por partes.\n" "Esto introduce un error, normalmente alrededor del 1%%." -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1882,36 +1936,37 @@ msgstr "" "Las curvas se han aproximado como lineales por partes.\n" "Esto introduce un error, normalmente alrededor del 1%%." -#: solvespace.cpp:898 +#: solvespace.cpp:943 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." +msgstr "" +"Mala selección de perímetro; seleccione segmentos de línea, arcos y curvas." -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "Mala selección de rastreo; seleccione un solo punto." -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "No pude escribir a '%s'" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 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:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "La malla no se intersecta (está bien, es válida)." -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "La malla tiene bordes desnudos (NO está bien, no es válida)." -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "La malla es estanca (está bien, es válida)." -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1922,7 +1977,7 @@ msgstr "" "\n" "El modelo contiene %d triángulos, desde %d superficies." -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1937,7 +1992,7 @@ msgstr "" "\n" "Cero aristas problemáticas, bien.%s" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1952,7 +2007,7 @@ msgstr "" "\n" "%d aristas problemáticas, mal.%s" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1981,7 +2036,7 @@ msgstr "" "\n" "© 2008-%d Jonathan Westhues y otros autores.\n" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -1989,27 +2044,27 @@ msgstr "" "No se puede asignar estilo a una entidad derivada de otra entidad;; intente " "asignar un estilo al padre de esta entidad." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "El nombre del estilo no puede estar vacío" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "No se puede repetir menos de 1 vez." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "No se puede repetir más de 999 veces." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "El nombre del grupo no puede estar vacío" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "La opacidad debe estar entre cero y uno." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "El radio no puede ser cero o negativo." @@ -2164,14 +2219,58 @@ msgctxt "button" msgid "&OK" msgstr "&Aceptar" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "La escala no debe ser cero o negativa." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "Formato incorrecto: especifica x, y, z" +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Mala selección por restricción de la relación de longitud. Esta " +#~ "restricción se puede aplicar a:\n" +#~ "\n" +#~ " * dos segmentos de línea\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Mala selección por restricción de diferencia de longitud. Esta " +#~ "restricción puede aplicar a:\n" +#~ "\n" +#~ " * dos segmentos de línea\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "Relación Lo&ngitud" + +#~ msgid "Length Diff&erence" +#~ msgstr "Diferencia Long&itud" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Mala selección para un nuevo croquis en el plano de trabajo. Este grupo " +#~ "se puede crear con:\n" +#~ "\n" +#~ " * un punto (a través del punto, ortogonal a los ejes de coordenadas)\n" +#~ " * un punto y dos segmentos de línea (a través del punto, paralelo a " +#~ "líneas)\n" +#~ " * un plano de trabajo (copia de un plano de trabajo)\n" + #~ msgctxt "file-type" #~ msgid "Q3D Object file" #~ msgstr "Archivo Objeto Q3D" diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index 50c302012..6b5845a74 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" @@ -17,7 +17,7 @@ msgstr "" "X-Generator: Zanata 4.4.5\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,27 +27,27 @@ msgstr "" "\n" "Activez un plan avec \"Dessin -> Dans plan de travail\"." -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "Presse papier vide; rien à coller." -#: clipboard.cpp:374 +#: clipboard.cpp:373 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:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "L'échelle ne peut pas être zéro." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "Sélectionnez un point pour définir l'origine de la rotation." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "Sélectionnez deux points pour définir le vecteur de translation." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -55,23 +55,23 @@ msgstr "" "Transformation identique. Donc, toutes les copies seront exactement les unes " "au-dessus des autres." -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "Trop d'éléments à coller; Divisez-les en plus petits groupes." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "Pas d'espace de travail actif." -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "Mauvais format: spécifiez les coordonnées comme x, y, z" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "Mauvais format; spécifiez la couleur comme r, v, b" -#: confscreen.cpp:454 +#: confscreen.cpp:412 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:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "L'échelle d'export ne doit pas être zéro!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "Le décalage du rayon de coupe ne doit pas être négatif!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "" "Mauvaise valeur: l'intervalle d'enregistrement automatique devrait être " "positif" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "Mauvais format: spécifiez un nombre entier de minutes" @@ -169,115 +169,135 @@ msgstr "longueur-ratio" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "longueur-difference" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "symétrique" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "symétrique-h" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "symétrique-v" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "symétrique-ligne" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "au-point-milieu" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "horizontal" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "vertical" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "diamètre" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "pt-sur-cercle" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "même-orientation" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "angle" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "parallèle" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "arc-ligne-tangente" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "cubique-ligne-tangente" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "courbe-courbe-tangente" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "perpendiculaire" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "eg-rayon" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "eg-angle" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "eg-ligne-long-arc-long" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "verrouillé-où-déplacé" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "commentaire" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -286,7 +306,7 @@ msgstr "" "Contraignez-les avec \"Contrainte -> Sur point avant de contraindre la " "tangente\"." -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -295,7 +315,7 @@ msgstr "" "Contraignez-les avec \"Contrainte -> Sur point avant de contraindre la " "tangente\"." -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -303,7 +323,7 @@ msgstr "" "Les courbes doivent partager un point final. Contraignez-les avec " "\"Contrainte -> Sur point avant de contraindre la tangente\"." -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -327,7 +347,7 @@ msgstr "" "    * Une face plane et un point (distance minimale)\n" "    * Un cercle ou un arc (diamètre)\n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -347,7 +367,7 @@ msgstr "" "    * Un point et un cercle ou un arc (point sur courbe)\n" "    * Un point et une face plane (point sur une face)\n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -378,30 +398,26 @@ msgstr "" "    * Un segment de ligne et un arc (la longueur de segment de ligne est " "égale à la longueur d'arc)\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Mauvaise sélection pour la contrainte du rapport de longueur. Cette " -"contrainte peut s'appliquer à:\n" -"\n" -"    * Deux segments de ligne\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Mauvaise sélection pour la contrainte de différence de longueur. Cette " -"contrainte peut s'appliquer à:\n" -"\n" -"    * Deux segments de ligne\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -414,7 +430,7 @@ msgstr "" "    * Un segment de ligne et un point (point au milieu)\n" "    * Un segment de ligne et un plan de travail (point médian dans le plan)\n" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -435,7 +451,7 @@ msgstr "" "    * Plan de travail, et deux points ou un segment de ligne (symétrique au " "plan de travail)\n" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -443,7 +459,7 @@ msgstr "" "Un plan de travail doit être actif lors d'une contrainte de symétrie sans " "plan de symétrie explicite." -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -451,7 +467,7 @@ msgstr "" "Activez un plan de travail (avec Dessin -> Dans plan de travail) avant " "d'appliquer une contrainte horizontale ou verticale." -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -465,7 +481,7 @@ msgstr "" "    * deux points\n" "    * Un segment de ligne\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -477,15 +493,15 @@ msgstr "" "\n" " * Deux normales\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "Vous devez sélectionner une contrainte d'angle." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "Vous devez sélectionner une contrainte avec une étiquette associée." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -500,11 +516,11 @@ msgstr "" "    * Un segment de ligne et une normale\n" "    * Deux normales\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "Courbe-Courbe tangence doit s'appliquer dans le plan de travail." -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -523,7 +539,7 @@ msgstr "" "    * Deux segments de ligne, des arcs ou des Béziers, qui partagent un " "point final (tangent)\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -538,7 +554,7 @@ msgstr "" "    * Un segment de ligne et une normale\n" "    * Deux normales\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -550,7 +566,11 @@ msgstr "" "\n" "    * un point\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "NOUVEAU COMMENTAIRE - DOUBLE-CLIQUE POUR EDITER" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "cliquez le centre du texte de commentaire" @@ -580,26 +600,26 @@ msgstr "" "    * Un point et deux segments de ligne (plan au-travers d'un point et " "parallèle aux lignes)\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "Le maillage du groupe actif est vide; Rien à exporter." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "les lignes à main levée ont été remplacées par des lignes continues" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "les lignes en zigzag ont été remplacées par des lignes continues" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Certains aspects du dessin n'ont pas d'équivalent DXF et n'ont pas été " "exportés:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -616,11 +636,11 @@ msgctxt "group-name" msgid "#references" msgstr "#références" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "" -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -658,7 +678,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "" @@ -832,295 +852,303 @@ msgid "Use &Perspective Projection" msgstr "Utiliser la vue en &Perspective" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "&Unités de dimensions" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "Dimensions en &Millimètres" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "Dimensions en &Mètres" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "Dimensions en &Pouces" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "Affichage &Barre d'outils" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "Affichage du &Navigateur de Propriété" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "&Plein Ecran" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "&Nouveau Groupe" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "Dessin en &3d" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "Dessin dans un nouveau &Plan de travail" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "Espacement &Linéaire" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "Espacement &Circulaire" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "E&xtruder" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "&Helix" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "&Lathe" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "Ré&volution" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "Lié / Assembler..." -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "Lié Récent" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Dessin" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "Dans le &Plan de travail" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "N'importe où dans la &3d" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "&Point" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "&Plan de travail" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "Ligne - &Polyligne" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "Ligne de C&onstruction" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "&Rectangle" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "&Cercle" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "&Arc de Cercle" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "Spline Cubique de &Beziers" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "&Texte en Police TrueType" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "&Image" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "&Basculer en mode \"Construction\"" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "&Arc Tangent au Point" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Diviser les Courbes à l'&Intersection" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Constraintes" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "&Distance / Diamètre" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "Dimension Maîtresse / Indicative" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "A&ngle" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "An&gle Maître / Indicatif" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Autre angle S&upplémentaire" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Basculer cote Maîtresse / cote Indicative" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "&Horizontal" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Vertical" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "&Sur Point / Courbe / Plan" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "&Egale Longueur / Rayon / Angle" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "R&apport de Longueur" +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "D&ifférence de Longueur" +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" -#: graphicswin.cpp:158 +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "Au &Milieu" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "&Symétrique" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "Para&llèle / Tangent" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "&Perpendiculaire" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Même Orient&ation" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "Accrocher le point à l'&Emplacement" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Commentaire" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Analyse" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "Mesure &Volume" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "Mesure &Aire" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "Mesure &Périmètre" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "Montrer les Pièces &Interférentes" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "Montrer les Arêtes &Nues" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "Montrer le &Centre de Gravité" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "Montrer les &sous-contraintes Points" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "&Tracer Point" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "&Arrêt Tracé..." -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Espacement &Dimension..." -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Aide" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "&Langue" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "&Site web / Manuel" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "&A propos" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(pas de fichier récent)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 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:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1134,19 +1162,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:819 +#: graphicswin.cpp:836 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:1114 +#: graphicswin.cpp:1136 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:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1154,7 +1182,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:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1162,7 +1190,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:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1171,13 +1199,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:1247 +#: graphicswin.cpp:1269 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:1250 +#: graphicswin.cpp:1272 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-" @@ -1187,7 +1215,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:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1195,49 +1223,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:1282 +#: graphicswin.cpp:1304 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:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "cliquez pour placer un point" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "cliquez le premier point du segment de ligne" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "cliquez le premier point de la ligne de construction" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "cliquez le premier point du segment cubique" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "cliquez pour placer le centre du cercle" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "cliquez pour placer l'origine du plan de travail" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "cliquez un coin du rectangle" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "cliquez le haut à gauche du texte" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "cliquez le haut à gauche de l'image" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1250,24 +1278,18 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "dessin-en-3d" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -"Mauvaise sélection pour un nouveau dessin dans le plan de travail. Ce groupe " -"peut être créé avec:\n" -"\n" -"    * Un point (par le point, orthogonal aux axes de coordonnées)\n" -"    * Un point et deux segments de ligne (par le point, parallèle aux " -"lignes)\n" -"    * Un plan de travail (copie du plan de travail)\n" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1275,16 +1297,16 @@ msgstr "" "Activez un plan de travail (Dessin -> Dans plan de travail) avant " "l'extrusion. Le croquis sera extrudé normalement au plan de travail." -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "extruder" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "" -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1299,16 +1321,16 @@ msgstr "" "parallèle à la ligne / point normal, par le point)\n" "    * Un segment de ligne (révolution sur le segment de ligne)\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "révolution" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "" -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1317,16 +1339,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "" -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1335,12 +1357,12 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1357,41 +1379,41 @@ msgstr "" "    * Un point et une ligne ou une normale (tourner autour d'un axe par le " "point et parallèle à la ligne / normale)\n" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "rotation" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "translation" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "(sans nom)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "contour non fermé ou tout n'est pas du même style!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "les points ne sont pas tous coplanaires!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "le contour s'entrecroise!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "arête de longueur nulle!" -#: modify.cpp:254 +#: 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." -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1399,7 +1421,7 @@ msgstr "" "Pour créer un arc tangent, sélectionnez un point où deux lignes (pas de " "construction) ou cercles de ce groupe et de ce plan se joignent." -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1407,123 +1429,123 @@ msgstr "" "Impossible d'arrondir ce coin. Essayez un rayon plus petit, ou essayez de " "créer la géométrie souhaitée à la main avec des contraintes tangentielles." -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" "Impossible de diviser cette entité; Lignes, cercles ou cubiques uniquement." -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "Vous devez dessiner dans un plan de travail pour diviser." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "Impossible de diviser; pas d'intersection trouvée." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Appliquer au style" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "Pas de style" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Style personnalisé nouvellement créé ..." -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Info Groupe" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Info Style" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Sélection Chaîne d'arêtes" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Basculer cote maîtresse / cote indicative" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Autre angle supplémentaire" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Accrocher à la grille" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Effacer le point de la Spline" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Ajouter un point à la Spline" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "" "Impossible d'ajouter le point spline: nombre maximum de points atteints." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Basculer en mode \"construction\"." -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Effacer la contraint Point-Coïncident" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Couper" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Copier" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Sélectionner tout" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Coller" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Coller transformé..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Effacer" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Désélectionner tout" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Désélectionner survolé" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Zoom pour ajuster" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "cliquez pou le prochain point de ligne or appuyez sur Esc" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1531,15 +1553,15 @@ msgstr "" "Impossible de dessiner un rectangle en 3d; D'abord, activez un plan de " "travail avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "cliquez pour placer un autre coin de rectangle" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "cliquez pour ajuster le rayon" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1547,22 +1569,22 @@ msgstr "" "Ne peut pas dessiner l'arc en 3d; D'abord, activez un plan de travail avec " "\"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "cliquez pour placer un point" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "cliquez le prochain point cubique ou appuyez sur Esc" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Vous dessinez déjà dans un plan de travail; Sélectionner \"Dessiner en 3d\" " "avant de créer un nouveau plan de travail." -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1570,11 +1592,11 @@ msgstr "" "Impossible de dessiner du texte en 3d; D'abord, activer un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1582,219 +1604,225 @@ msgstr "" "Impossible de dessiner l'image en 3d; D'abord, activez un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "NOUVEAU COMMENTAIRE - DOUBLE-CLIQUE POUR EDITER" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "sans nom" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Sauver fichier" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Ouvrir Fichier" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "_Annuler" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "_Sauver" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "Sauvegarde automatique existante" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "Fichier modifié" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "(nouveau dessin)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "Navigateur de propriété" -#: solvespace.cpp:658 +#: solvespace.cpp:699 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:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1802,7 +1830,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1811,7 +1839,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1819,7 +1847,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1830,13 +1858,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1847,7 +1875,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1858,36 +1886,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1895,7 +1923,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1905,7 +1933,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1915,7 +1943,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1932,7 +1960,7 @@ msgid "" "© 2008-%d Jonathan Westhues and other authors.\n" msgstr "" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -1940,27 +1968,27 @@ msgstr "" "Impossible d'attribuer le style à une entité dérivée d'une autre entité; " "Essayez d'attribuer un style au parent de cette entité." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "Le nom d'un style ne peut pas être vide" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "Je ne peux pas répéter moins de 1 fois." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "Je ne peux pas répéter plus de 999 fois." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "Un nom de groupe ne peut pas être vide" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "L'opacité doit être entre 0 et 1." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "Le rayon ne peut pas être zéro ou négatif." @@ -2116,14 +2144,58 @@ msgctxt "button" msgid "&OK" msgstr "" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "L'échelle ne peut pas être zéro ou négative." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "Mauvais format: Spécifiez x, y, z" +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Mauvaise sélection pour la contrainte du rapport de longueur. Cette " +#~ "contrainte peut s'appliquer à:\n" +#~ "\n" +#~ "    * Deux segments de ligne\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Mauvaise sélection pour la contrainte de différence de longueur. Cette " +#~ "contrainte peut s'appliquer à:\n" +#~ "\n" +#~ "    * Deux segments de ligne\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "R&apport de Longueur" + +#~ msgid "Length Diff&erence" +#~ msgstr "D&ifférence de Longueur" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Mauvaise sélection pour un nouveau dessin dans le plan de travail. Ce " +#~ "groupe peut être créé avec:\n" +#~ "\n" +#~ "    * Un point (par le point, orthogonal aux axes de coordonnées)\n" +#~ "    * Un point et deux segments de ligne (par le point, parallèle aux " +#~ "lignes)\n" +#~ "    * Un plan de travail (copie du plan de travail)\n" + #~ msgid "Specify between 0 and 8 digits after the decimal." #~ msgstr "Spécifiez entre 0 et 8 chiffres après la virgule." diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index 42a3fa3a6..6ffc7f89b 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: 2021-01-22 18:50+0700\n" "Last-Translator: evilspirit@evilspirit.org\n" "Language-Team: EvilSpirit\n" @@ -17,7 +17,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.4.2\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,50 +27,50 @@ msgstr "" "можно только находясь в рабочей плоскости.\n" "Активируйте рабочую плоскость через Эскиз->В Рабочей Плоскости" -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "Буфер обмена пуст; нечего вставлять." -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "Укажите в поле 'количество' хотя бы одну копию для вставки." -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "Масштабный коэффициент не может быть нулевым." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "Выберите одну точку в качестве центра вращения." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "Выберите две точки, чтобы задать вектор смещения." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "" "Трансформация не задана. Все копии будут расположены в одном и том же месте." -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "Слишком много элементов для вставки; разбейте на несколько частей." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "Рабочая плоскость не активна" -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "Неверный формат: введите координаты как x, y, z" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "Неверный формат: введите цвет как r, g, b" -#: confscreen.cpp:454 +#: confscreen.cpp:412 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -78,25 +78,25 @@ msgstr "" "Коэффициент перспективы не будет иметь эффект, пока вы не включите Вид-" ">Перспективная Проекция." -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Введите число от 0 до %d." -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "Масштабный коэффициент не может быть нулевым!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "Радиус режущего инструмента не может быть отрицательным!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "" "Неверное значение: интервал автосохранения должен быть положительным числом" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "" "Неверный формат: введите целое число, чтобы задать интервал автосохранения" @@ -168,115 +168,135 @@ msgstr "отношение-длин" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "разность-длин" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "симметричность" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "симметричность-гориз" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "симметричность-верт" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "симметричность-по-оси" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "на-середине" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "горизонтальность" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "вертикальность" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "диаметр" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "тчк-на-окружности" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "идентичная-ориентация" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "угол" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "параллельность" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "кас-дуга-линия" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "кас-сплайн-линия" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "кас-кривых" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "перпендикулярность" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "равенство-радиусов" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "равенство-углов" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "равен-длины-линии-длины-дуги" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "фиксация" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "комментарий" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -285,7 +305,7 @@ msgstr "" "'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " "касательности." -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -294,7 +314,7 @@ msgstr "" "'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " "касательности." -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -303,7 +323,7 @@ msgstr "" "'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " "касательности." -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -328,7 +348,7 @@ msgstr "" " * грань и точку (расстояние от точки до плоскости грани)\n" " * окружность или дугу (диаметр / радиус)\n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -348,7 +368,7 @@ msgstr "" " * точку и окружность / дугу / сплайн (точка на кривой)\n" " * точку и грань (точка на грани)\n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -376,30 +396,26 @@ msgstr "" " * две окружности / дуги (равенство радиусов)\n" " * отрезок и дугу (равенство длины отрезка и длины дуги)\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Неправильное выделение для ограничения 'отношение длин'.\n" -"Ограничение может принимать в качестве выделения следующие примитивы:\n" -"\n" -" * два отрезка\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Неправильное выделение для ограничения 'разница длин'.\n" -"Ограничение может принимать в качестве выделения следующие примитивы:\n" -"\n" -" * два отрезка\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -412,7 +428,7 @@ msgstr "" " * точку и отрезок (точка на середине отрезка)\n" " * отрезок и рабочую плоскость (середина отрезка на плоскости)\n" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -432,7 +448,7 @@ msgstr "" " * рабочую плоскость и две точки / отрезок (симметричность относительно " "рабочей плоскости\n" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -440,7 +456,7 @@ msgstr "" "Рабочая плоскость должна быть активна для того, чтобы создать\n" "ограничение симметричности без явного указания плоскости симметрии." -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -448,7 +464,7 @@ msgstr "" "Рабочая плоскость должна быть активирована (Эскиз -> В рабочей плоскости)\n" "перед тем, как накладывать ограничения горизонтальности / вертикальности." -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -462,7 +478,7 @@ msgstr "" " * две точки\n" " * отрезок\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -474,18 +490,18 @@ msgstr "" "\n" " * два координатных базиса('нормали')\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "" "Переключатся между смежными углами можно только выбрав ограничение угла." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "" "Переключать режим 'размера для справок' возможно только для ограничений, " "имеющих размерное значение." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -500,12 +516,12 @@ msgstr "" " * отрезок и координатный базис (нормаль)\n" " * два координатных базиса (нормали)\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "" "Ограничение касательности может быть наложено только в рабочей плоскости." -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -524,7 +540,7 @@ msgstr "" " * два отрезка, две дуги или два сплайна, соединенных крайними точками " "(касательность)\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -539,7 +555,7 @@ msgstr "" " * отрезок и координатный базис (нормаль)\n" " * два координатных базиса (нормали)\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -551,7 +567,11 @@ msgstr "" "\n" " * точку\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "КОММЕНТАРИЙ -- ДВОЙНОЙ ЩЕЛЧОК ДЛЯ РЕДАКТИРОВАНИЯ" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "кликните мышью там, где будет расположен текстовый комментарий" @@ -579,26 +599,26 @@ msgstr "" " * точку и два отрезка (сечение плоскостью, заданной двумя отрезками, " "построенной через указанную точку)\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "Активная группа не содержит тел; нечего экспортировать." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "Стили линии 'от руки' были заменены сплошными линиями" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "Стили линии 'зиг-заг' были заменены сплошными линиями" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Некоторые элементы чертежа не имеют аналогов в DXF-представлении и не были " "экспортированы:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -615,11 +635,11 @@ msgctxt "group-name" msgid "#references" msgstr "система-координат" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "Файл пуст. Возможно он поврежден." -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -660,7 +680,7 @@ msgctxt "button" msgid "&No" msgstr "Нет" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "Отменить" @@ -834,295 +854,303 @@ msgid "Use &Perspective Projection" msgstr "Перспективная Прое&кция" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "Единицы Измерения" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "Размеры в Ми&ллиметрах" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "Размеры в Метрах" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "Размеры в Дю&ймах" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "Показывать Па&нель Инструментов" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "Показывать Брау&зер" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "Полно&экранный Режим" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "&Группа" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "Создать Эскиз в &3d" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "Создать Эскиз в Новой &Рабочей Плоскости" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "&Линейный Массив" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "&Круговой Массив" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "Тело &Выдавливания" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "Тело Винтовое" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "Тело В&ращения" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "Тело В&ращения" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "&Импорт Детали / Сборка..." -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "Последние &Детали" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Эскиз" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "В &Рабочей Плоскости" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "Режим &3d" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "Опорная &Точка" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "Рабочая &Плоскость" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "&Отрезок" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "&Вспомогательный Отрезок" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "Прямоу&гольник" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "О&кружность" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "Д&уга Окружности" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "Кубический &Сплайн Безье" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "Т&екст TrueType" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "И&зображение" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "Переключить Режим Вс&помогательных Построений" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "Кас&ательная в Точке" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Ра&збить Кривые Пересечением" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Ограничения" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "&Расстояние / Диаметр" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "&Справочный Размер" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "&Угол" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "С&правочный Угол" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Переключить Сме&жный Угол" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Переключить Режим Размера Для Спра&вок" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "&Горизонтальность" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Вертикальность" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "&Точка на Примитиве" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "&Равенство Длин / Радиусов / Углов" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "Отно&шение Длин" +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "Ра&зница Длин" +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" -#: graphicswin.cpp:158 +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "&На Середине" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "С&имметричность" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "Пара&ллельность / Касательность" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "Перпендикул&ярность" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Идентичная &Ориентация" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "За&фиксировать" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Текстовый &Комментарий" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Анализ" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "Измерить &Объем" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "Измерить П&лощадь" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "Измерить П&ериметр" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "Показать Пе&ресекающиеся Детали" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "Показать Про&блемные Ребра" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "Показать Центр Масс" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "Показать Свободные Точки" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "Включить &Трассировку Точки" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "Остановить Тра&ссировку..." -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Плавное Из&менение Размера..." -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Помощь" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "&Язык" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "Вебсайт / &Справка" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "О &Программе" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(пусто)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "Файл '%s' не существует." -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "Сетку не будет видно, пока рабочая плоскость не активирована." -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1136,16 +1164,16 @@ msgstr "" "перспективы на конфигурационной странице браузера.\n" "Значение по умолчанию 0.3." -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "Выделите точку. Вид будет отцентрован по этой точке." -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "Нет дополнительных объектов, соединенных с выбранными примитивами." -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1154,7 +1182,7 @@ msgstr "" "принадлежащий импортированной детали или активируйте группу импортированной " "детали." -#: graphicswin.cpp:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1162,7 +1190,7 @@ msgstr "" "Рабочая плоскость не активна. Активируйте ее через Эскиз -> В Рабочей " "Плоскости чтобы определить плоскость для сетки." -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1171,13 +1199,13 @@ msgstr "" "текстовые комментарии или ограничения с размерными значениями. Чтобы " "привязать отрезок или другой примитив, выбирайте его точки." -#: graphicswin.cpp:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Рабочая плоскость не активна. Активирована рабочая плоскость по умолчанию " "для данной группы." -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 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-" @@ -1187,7 +1215,7 @@ msgstr "" "по умолчанию. Попробуйте выделить рабочую плоскость или создать новую с " "помощью Группа -> Создать Эскиз в Новой Рабочей Плоскости." -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1196,54 +1224,54 @@ msgstr "" "точку, либо запустите команду без выделения, чтобы перейти к окну настроек " "этой команды." -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "" "кликните мышью там, где хотите создать дугу окружности (дуга будет " "нарисована против часовой стрелки)" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "кликните мышью там, где хотите создать опорную точку" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "кликните мышью там, где хотите создать первую точку отрезка" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "" "кликните мышью там, где хотите создать первую точку вспомогательного отрезка" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "" "кликните мышью там, где хотите создать первую точку кубического сплайна Безье" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "кликните мышью там, где будет находиться центр окружности" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "" "кликните мышью там, где будет находиться точка, через которую будет " "построена рабочая плоскость" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "кликните мышью там, где будет находиться один из углов прямоугольника" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "кликните мышью там, где хотите создать текст" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "" "кликните мышью там, где будет расположен левый верхний угол изображения" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1256,26 +1284,18 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "эскиз-в-3d" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * 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" -" * рабочую плоскость (копия рабочей плоскости)\n" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1283,18 +1303,18 @@ msgstr "" "Выберите рабочую плоскость (Эскиз -> В Рабочей Плоскости) перед созданием " "группы выдавливания. Эскиз будет выдавлен по нормали к рабочей плоскости." -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "тело-выдавливания" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "" "Операция создания тела вращения может быть применена только к плоским " "эскизам." -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1311,18 +1331,18 @@ msgstr "" " * отрезок (тело вращения вокруг оси, проходящей через отрезок)\n" "\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "тело-вращения" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "" "Операция создания тела вращения может быть применена только к плоским " "эскизам." -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1339,18 +1359,18 @@ msgstr "" " * отрезок (тело вращения вокруг оси, проходящей через отрезок)\n" "\n" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "тело-вращения" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "" "Операция создания винтового тела может быть применена только к плоским " "эскизам." -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1367,12 +1387,12 @@ msgstr "" "точку)\n" " * отрезок (вращение вокруг отрезка)\n" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "тело-винтовое" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1391,43 +1411,43 @@ msgstr "" "проходящей через точку и параллельной отрезку / нормали)\n" "\n" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "круговой-массив" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "линейный-массив" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "(без имени)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "незамкнутый контур или несовпадение стилей!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "не все точки лежат в одной плоскости!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "контур имеет самопересечения!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "вырожденный отрезок!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" "Скругления эскиза можно создавать только когда рабочая плоскость " "активирована." -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1435,7 +1455,7 @@ msgstr "" "Чтобы создать скругление эскиза, выберите точку, где соединяются два " "примитива, не принадлежащих к вспомогательной геометрии." -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1443,18 +1463,18 @@ msgstr "" "Невозможно скруглить угол. Попробуйте радиус поменьше или создайте требуемую " "геометрию с помощью Ограничения -> Параллельность / Касательность." -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" "Невозможно разделить такие примитивы. Выберите линии, окружности или " "кубические сплайны." -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "" "Пересечение примитивов работает только когда рабочая плоскость активна." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." @@ -1462,349 +1482,355 @@ msgstr "" "Выберите два пересекающихся примитива (два отрезка/окружности/дуги или " "отрезок/окружность/дугу и точку)" -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "Невозможно разделить пересекаемые примитивы: пересечений нет." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Применить Стиль" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "Стиль по Умолчанию" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Создать Новый Стиль..." -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Настройки Группы" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Настройки Стиля" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Выделить Последовательность Примитивов" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Переключить Режим Размера Для Справок" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Переключить Смежный Угол" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Привязать к Сетке" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Удалить Точку Сплайна" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Добавить Точку Сплайна" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "" "Невозможно добавить точку сплайна: достигнуто ограничение максимального " "количества точек для сплайна." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Переключить Режим 'Дополнительные Построения'." -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Удалить Ограничение Совпадения Точек" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Вырезать" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Копировать" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Выделить Все" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Вставить" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Вставить с Трансформацией..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Удалить" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Сбросить Выделение" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Снять Выделение с Выбранного" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Показать Все" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "кликните мышью там, где хотите расположить следующую точку" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" "Невозможно начертить прямоугольник, когда рабочая плоскость не активна." -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "кликните мышью там, где хотите расположить другой угол прямоугольника" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "кликните, чтобы задать радиус" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать дугу, когда нет активной рабочей плоскости." -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "кликните мышью там, где хотите создать точку" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "" "кликните мышью там, где хотите создать следующую точку сплайна или нажмите " "Esc для завершения операции." -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Рабочая плоскость уже активна. Перейдите в режим 3d перед созданием новой " "рабочей плоскости." -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать текст, когда нет активной рабочей плоскости." -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "кликните, чтобы расположить правый нижний угол текста" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать изображение. Активируйте рабочую плоскость." -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "КОММЕНТАРИЙ -- ДВОЙНОЙ ЩЕЛЧОК ДЛЯ РЕДАКТИРОВАНИЯ" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "проекты SolveSpace" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "IDF печатная плата" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "PNG изображение" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "STL полигональная сетка" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ полигональная сетка" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-совместимая полигональная сетка с просмторщиком" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-совместимая полигональная сетка" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "VRML файл" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "STEP файл" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "PDF документ" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Encapsulated PostScript" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "SVG изображение" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF файл (AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL файл" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF и DWG файлы" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "CSV файлы (значения, разделенные запятой)" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "без имени" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Сохранить Файл" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Открыть Файл" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "Отменить" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "Сохранить" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "_Открыть" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "Автосохранение Доступно" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Автоматически сохраненный файл доступен для данного проекта." -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Хотите загрузить автосохраненный файл вместо исходного?" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "&Загрузить Автосохранение" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "&Не Загружать" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "Измененный Файл" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Сохранить изменения, сделанные в файле “%s”?" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Сохранить изменения, сделанные в новом проекте?" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Изменения будут утеряны, если их не сохранить." -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "&Сохранить" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "&Не Сохранять" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "(новый проект)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "Браузер" -#: solvespace.cpp:658 +#: solvespace.cpp:699 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 " @@ -1814,7 +1840,7 @@ msgstr "" "это не то, что требуется, если так, необходимо спрятать их, нажав ссылку " "вверху окна Браузера." -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1823,21 +1849,21 @@ msgstr "" "Неподдерживаемый тип файла '%s'; Поддерживаются файлы с расширением .dxf и ." "dwg." -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "У ограничения должно быть значение и оно не должно быть справочным." -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "" "Неправильное выделение для операции изменения значения с заданным шагом; " "необходимо выбрать ограничение со значением." -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "Сборка не содержит пересечения деталей - это хорошо." -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1848,7 +1874,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1861,7 +1887,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1873,7 +1899,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%." -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1890,7 +1916,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1898,7 +1924,7 @@ msgstr "" "Эта группа не содержит замкнутых областей. В ней нет замкнутых контуров, " "примитивы не лежат в одной плоскости или самопересекаются." -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1915,7 +1941,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1932,38 +1958,38 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" "Неправильное выделение для расчета периметра; необходимо выбирать только " "отрезки, дуги и кривые в качестве исходных данных" -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "Неправильное выделение для трассировки; необходимо выбрать одну точку." -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "Невозможно записать в '%s'" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Полигональная стека содержит самопересечения (это плохо)" -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Полигональная стека не содержит самопересечений (это хорошо)" -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Полигональная сетка содержит \"оголенные\" ребра (это плохо)" -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "Полигональная сетка герметична (это хорошо)" -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1974,7 +2000,7 @@ msgstr "" "\n" "Модель содержит %d треугольников, содержащихся в %d поверхностях." -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1989,7 +2015,7 @@ msgstr "" "\n" "Нет проблемных ребер - это хорошо.%s" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -2004,7 +2030,7 @@ msgstr "" "\n" "%d найдены проблемные ребра - это плохо.%s" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2035,7 +2061,7 @@ msgstr "" "\n" "© 2008-%d Джонатан Вэстью и другие авторы.\n" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -2043,27 +2069,27 @@ msgstr "" "Невозможно применить стиль к примитиву, который произошел от другого " "примитива. Попробуйте применить стиль к исходному примитиву." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "Имя стиля не может быть пустым." -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "Невозможно сделать повторение меньше, чем 1 раз." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "Невозможно сделать повтор больше, чем 999 раз." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "Имя группы не может быть пустым." -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "Прозрачность должна быть числом от нуля до единицы." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "Радиус не может быть нулевым или отрицательным." @@ -2218,14 +2244,60 @@ msgctxt "button" msgid "&OK" msgstr "ХОРОШО" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "Масштабный коэффициент не может быть нулевым или отрицательным." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "Неверный формат: введите данные как x, y, z" +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Неправильное выделение для ограничения 'отношение длин'.\n" +#~ "Ограничение может принимать в качестве выделения следующие примитивы:\n" +#~ "\n" +#~ " * два отрезка\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Неправильное выделение для ограничения 'разница длин'.\n" +#~ "Ограничение может принимать в качестве выделения следующие примитивы:\n" +#~ "\n" +#~ " * два отрезка\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "Отно&шение Длин" + +#~ msgid "Length Diff&erence" +#~ msgstr "Ра&зница Длин" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Неправильное выделение для создания эскиза.\n" +#~ "Группа может быть создана, используя в качестве выделения следующие " +#~ "примитивы:\n" +#~ "\n" +#~ " * точку (рабочая плоскость, ориентированная к ближайшему виду, " +#~ "проходящая через точку)\n" +#~ " * точку и два отрезка (рабочая плоскость, проходящая через точку и " +#~ "параллельная отрезкам)\n" +#~ " * рабочую плоскость (копия рабочей плоскости)\n" + #~ msgid "Specify between 0 and 8 digits after the decimal." #~ msgstr "Введите число от 0 до 8." diff --git a/res/locales/tr_TR.po b/res/locales/tr_TR.po index 9e46b0dde..de82270f1 100644 --- a/res/locales/tr_TR.po +++ b/res/locales/tr_TR.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: 2021-03-09 22:58+0300\n" "Last-Translator: Mustafa Halil GÖRENTAŞ \n" "Language-Team: app4soft\n" @@ -19,7 +19,7 @@ msgstr "" "X-Generator: Poedit 2.4.2\n" "X-Poedit-SourceCharset: UTF-8\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -29,49 +29,49 @@ msgstr "" "\n" "Çizim -> Çalışma Düzleminde menüsü ile bir düzlemi etkinleştirin." -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "Pano boş; yapıştırılacak bir şey yok." -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "Yapıştırılacak kopya sayısı en az bir olmalıdır." -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "Ölçek sıfır olamaz." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "Dönüşün başlangıç noktasını tanımlamak için bir nokta seçin." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "Öteleme vektörünü tanımlamak için iki nokta seçin." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "Dönüşüm özdeştir. Yani tüm kopyalar tam olarak üst üste gelecek." -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "Yapıştırılamayacak kadar çok öğe; bunu daha küçük yapıştımalara bölün." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "Etkin Çalışma Düzlemi yok." -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "Hatalı biçim: koordinatları x, y, z olarak belirtin" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "Hatalı biçim: rengi r, g, b olarak belirtin" -#: confscreen.cpp:454 +#: confscreen.cpp:412 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,24 +79,24 @@ msgstr "" "Görünüm -> Perspektif Projeksiyonu Kullan'ı etkinleştirene kadar perspektif " "çarpanının hiçbir etkisi olmayacaktır." -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Ondalık basamak sonra 0 ile %d arasında basamak belirtin." -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "Dışa aktarma ölçeği sıfır olmamalıdır!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "Kesici yarıçap ofseti negatif olmamalıdır!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "Hatalı değer: otomatik kaydetme süresi pozitif olmalıdır" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "Hatalı biçim: süre aralığını dakika cinsinden belirtin" @@ -167,115 +167,135 @@ msgstr "uzunluk-oranı" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "uzunluk-farkı" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "simetrik" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "simetrik-y" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "simetrik-d" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "simetrik-çizgi" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "orta noktada" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "yatay" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "dikey" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "çap" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "nkt-çemberde" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "aynı-yön" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "açı" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "paralel" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "yay-çizgi-teğet" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "kubik-çizgi-teğet" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "eğri-eğri-teğet" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "dik" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "eş-yarıçap" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "eş-açı" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "eş-çizgi-uzn-yay-uzn" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "sürüklendiği-yerde-kilitli" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "yorum" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -283,7 +303,7 @@ msgstr "" "Teğet, yay ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğeti " "sınırlandırmadan önce bunları Sınırlandır -> Noktada ile sınırlandırın." -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -291,7 +311,7 @@ msgstr "" "Teğet kübik ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğeti " "sınırlandırmadan önce onları Sınırlandır -> Noktada ile sınırlandırın." -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -299,7 +319,7 @@ msgstr "" "Eğriler bir uç noktayı paylaşmalıdır. Teğeti sınırlandırmadan önce onları " "Sınırlandır -> Noktada ile sınırlandırın." -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -323,7 +343,7 @@ msgstr "" " * bir düzlem yüzeyi ve bir nokta (minimum mesafe)\n" " * bir daire veya yay (çap)\n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -343,7 +363,7 @@ msgstr "" " * bir nokta ve bir daire veya yay (eğri üzerinde nokta)\n" " * bir nokta ve bir düzlem yüzeyi (yüzeyin üzerine gelin)\n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -372,30 +392,26 @@ msgstr "" " * bir çizgi parçası ve bir yay (çizgi parçası uzunluğu yay uzunluğuna " "eşittir)\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Uzunluk oranı sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " -"uygulanabilir:\n" -"\n" -" * iki çizgi parçası\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Uzunluk farkı sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " -"uygulanabilir:\n" -"\n" -" * iki çizgi parçası\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -409,7 +425,7 @@ msgstr "" " * bir çizgi parçası ve bir çalışma düzlemi (düzlemdeki çizginin orta " "noktası)\n" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -430,7 +446,7 @@ msgstr "" " * çalışma düzlemi ve iki nokta veya bir çizgi parçası (çalışma düzlemi " "etrafında simetrik)\n" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -438,7 +454,7 @@ msgstr "" "Açık bir simetri düzlemi olmadan simetriyi sınırlandırırken bir çalışma " "düzlemi etkin olmalıdır." -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -446,7 +462,7 @@ msgstr "" "Yatay veya dikey bir sınırlandırma uygulamadan önce bir çalışma düzlemini " "(Çizim -> Çalışma Düzleminde menüsü) etkinleştirin." -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -460,7 +476,7 @@ msgstr "" " * iki nokta\n" " * bir çizgi parçası\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -472,15 +488,15 @@ msgstr "" "\n" " * iki normal\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "Bir açı sınırlaması seçilmelidir." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "İlişkili etikete sahip bir sınırlama seçilmelidir." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -494,11 +510,11 @@ msgstr "" " * bir çizgi parçası ve normal\n" " * iki normal\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "Eğri-eğri teğetliği çalışma düzlemine uygulanmalıdır." -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -517,7 +533,7 @@ msgstr "" " * bir uç noktayı paylaşan(teğet) iki çizgi parçası, yay veya " "bezier'ler\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -531,7 +547,7 @@ msgstr "" " * bir çizgi parçası ve normal\n" " * iki normal\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -543,7 +559,11 @@ msgstr "" "\n" "* bir nokta\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "YENİ YORUM - DÜZENLEMEK İÇİN ÇİFT TIKLAYIN" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "yorum metninin merkezine tıklayın" @@ -573,24 +593,24 @@ msgstr "" " * bir nokta ve iki çizgi parçası (nokta boyunca düzlem ve çizgilere " "paralel)\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "Etkin Mesh grubu boş; dışa aktarılacak bir şey yok." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "serbest çizgiler, sürekli çizgilerle değiştirildi" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "zikzak çizgiler sürekli çizgilerle değiştirildi" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "Çizimin bazı yönlerinin DXF eşdeğeri yoktur ve dışa aktarılmamıştır:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -607,11 +627,11 @@ msgctxt "group-name" msgid "#references" msgstr "#referanslar" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "Dosya boş. Bozuk olabilir." -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -653,7 +673,7 @@ msgctxt "button" msgid "&No" msgstr "&Hayır" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "&İptal" @@ -827,295 +847,303 @@ msgid "Use &Perspective Projection" msgstr "&Perspektif Projeksiyonu Kullanın" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "Ölçü &Birimleri" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "&Milimetre cinsinden ölçü" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "M&etre cinsinden ölçü" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "&İnç cinsinden ölçü" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "&Araç Çubuğunu Göster" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "&Özellik Tarayıcısını Göster" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "&Tam Ekran" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "Yeni &Grup" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "&3d'de Çizim Yap" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "&Yeni Çalışma Düzleminde Çizim Yap" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "Adım &Ötele" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "Adım &Döndür" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "&Katıla" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "&Helis" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "&Çark" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "Dö&ndür" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "Bağla / Montajla..." -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "Son Erişilenden Bağla" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Çizim" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "Ç&alışma Düzleminde" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "&3d'de Herhangi Bir Yerde" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "Referasn &Noktası" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "Ça&lışma Düzlemi" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "Çizgi &Parçası" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "&Yapı Çizgisi Parçası" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "&Dikdörtgen" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "&Çember" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "Çember &Yayı" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "Bezier Kübik &Eğri" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "TrueType Yazı Tipinde &Metin" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "&Resim" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "Yap&ıyı Değiştir" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "Noktada &Teğet Yay" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Kesişim yerinde Eğrileri &Böl" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Sınırlandır" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "&Mesafe / Çap" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "&Referans Ölçü" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "&Açı" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "Referans A&çı" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Diğer &Bütünler Açı" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Ölçüyü Re&ferans Yap / Yapma" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "&Yatay" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Dikey" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "&Noktada / Eğride / Düzlemde" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "&Eşit Uzunluk / Yarıçap / Açı" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "&Uzunluk Oranı" +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "U&zunluk Farkı" +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" -#: graphicswin.cpp:158 +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "&Orta Noktada" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "&Simetrik" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "&Paralel / Teğet" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "D&ik" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Aynı &Yön" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "Sürüklendiği Yerde Noktayı &Kilitle" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Y&orum" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Analiz Et" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "&Hacmi Ölçün" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "&Alanı Ölçün" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "&Çevre Uzunluğunu Ölçün" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "&Engelleyen Parçaları Göster" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "A&çık Kenarları Göster" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "&Kütle Merkezini Göster" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "&Sınırlanmamış Noktaları Göster" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "&Noktayı İzle" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "&İzlemeyi &Durdur..." -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Adım &Ölçüsü..." -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Yardım" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "&Dil" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "&Web sitesi / Kılavuz" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "&Hakkında" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(yeni dosyalar yok)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "'%s' dosyası mevcut değil." -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "Etkin çalışma düzlemi yok, bu nedenle ızgara görünmeyecektir." -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1129,17 +1157,17 @@ msgstr "" "Perspektif bir projeksiyon için, konfigürasyon ekranındaki perspektif " "çarpanını değiştirin. 0,3 civarında bir değer tipiktir." -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Bir nokta seçin; bu nokta ekrandaki görüntünün merkezi haline gelecektir." -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "Hiçbir ek öğe, seçili öğeler ile uç noktaları paylaşmaz." -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1147,7 +1175,7 @@ msgstr "" "Bu komutu kullanmak için, bağlantılı bir parçadan bir nokta veya başka bir " "öğe seçin veya bir bağlantı grubunu etkin grup haline getirin." -#: graphicswin.cpp:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1155,7 +1183,7 @@ msgstr "" "Etkin çalışma düzlemi yok. Tutturma ızgarasının düzlemini tanımlamak için " "bir çalışma düzlemini (Çizim -> Çalışma Düzleminde menüsü ile) etkinleştirin." -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1164,13 +1192,13 @@ msgstr "" "sınırlamaları bir etiketle seçin. Bir çizgiyi tutturmak için uç noktalarını " "seçin." -#: graphicswin.cpp:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Çalışma düzlemi seçilmedi. Bu grup için varsayılan çalışma düzlemi " "etkinleştiriliyor." -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 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-" @@ -1180,7 +1208,7 @@ msgstr "" "düzlemi yoktur. Bir çalışma düzlemi seçmeyi veya yeni çalışma düzleminde " "çizim grubunu etkinleştirmeyi deneyin." -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1188,47 +1216,47 @@ msgstr "" "Noktada teğet yay oluşturmak için hatalı seçim. Tek bir nokta seçin veya yay " "parametrelerini ayarlamak için hiçbir şey seçmeyin." -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "yayın ilk noktası için tıklayın (saat yönünün tersine çizilir)" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "referans noktasını yerleştirmek için tıklayın" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "çizgi parçasının ilk noktası için tıklayın" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "yapı çizgisinin ilk noktası için tıklayın" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "kübik segmentin ilk noktası için tıklayın" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "çemberin merkezi için tıklayın" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "çalışma düzleminin merkezi için tıklayın" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "dikdörtgenin bir köşesi için tıklayın" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "metnin sol üst köşesi için tıklayın" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "resmin sol üst köşesi için tıklayın" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1241,23 +1269,18 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "3d-içinde-çizim" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -"Çalışma düzleminde yeni taslak çizmek için hatalı seçim. Bu grup şunlarla " -"oluşturulabilir:\n" -"\n" -" * bir nokta (nokta boyunca, eksenleri koordine etmek için ortogonal)\n" -" * bir nokta ve iki çizgi parçası (noktadan, çizgilere paralel)\n" -" * bir çalışma düzlemi (çalışma düzleminin kopyası)\n" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1266,16 +1289,16 @@ msgstr "" "Çalışma Düzleminde menüsü). Çizim, çalışma düzlemine dik olarak " "katılanacaktır." -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "katıla" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "Çark işlemi yalnızca düzlemsel çizimlere uygulanabilir." -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1289,16 +1312,16 @@ msgstr "" "bir eksen etrafında, nokta boyunca döndürülür )\n" " * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "çark" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "Döndürme işlemi yalnızca düzlemsel çizimlere uygulanabilir." -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1312,16 +1335,16 @@ msgstr "" "noktadan geçen bir eksen etrafında döndürülür)\n" " * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "döndür" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "Helis işlemi yalnızca düzlemsel çizimlere uygulanabilir." -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1335,12 +1358,12 @@ msgstr "" "noktadan geçen bir eksen etrafında döndürülür)\n" " * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "helis" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1356,41 +1379,41 @@ msgstr "" " * bir nokta ve bir çizgi veya bir normal (nokta boyunca bir eksen " "etrafında ve çizgiye / normale paralel çevirin)\n" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "çevir" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "ötele" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "(isimsiz)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "kapalı olmayan kontur veya tümü aynı biçimde değil!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "noktaların hepsi aynı düzlemde değil!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "kontur kendisiyle kesişiyor!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "sıfır-uzunlukta kenar!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Teğet yay oluşturmak için çalışma düzleminde çizim yapılmalıdır." -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1398,7 +1421,7 @@ msgstr "" "Bir teğet yay oluşturmak için, bu gruptaki iki yapı-dışı çizginin veya " "dairenin ve çalışma düzleminin birleştiği bir nokta seçin." -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1406,15 +1429,15 @@ msgstr "" "Bu köşe yuvarlatılamadı. Daha küçük bir yarıçap deneyin veya teğet " "sınırlamaları ile istenen geometriyi elle oluşturmayı deneyin." -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "Bu öğeler bölünemedi; yalnızca çizgiler, çemberler veya küpler." -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "Bölmek için çalışma düzleminde çizim olmalı." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." @@ -1422,107 +1445,107 @@ msgstr "" "Birbiriyle kesişen iki öğe seçin (örneğin iki çizgi / çember / yay veya bir " "çizgi / çember / yay ve bir nokta)." -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "Bölünemez; kesişim bulunamadı." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Biçime Ata" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "Biçim Yok" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Yeni Oluşturulan Özel Biçim ..." -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Grup Bilgisi" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Biçim Bİlgisi" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Kenar Zinciri Seçin" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Ölçü Referansını Değiştir" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Diğer Bütünler Açı" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Izgaraya Tuttur" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Eğri Noktasını Sil" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Eğri Noktası Ekle" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "Eğri noktası eklenemiyor: en fazla nokta sayısına ulaşıldı." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Yapıyı değiştir" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Çakışan-Nokta Sınırlamasını Sil" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Kes" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Kopyala" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Tümünü Seç" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Yapıştır" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Dönüştürerek Yapıştır..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Sil" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Tüm Seçimi Kaldır" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Fareyle Üzerine Gelinen Seçimi Kaldır" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Sığdırmak için Yakınlaştır" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "çizginin sonraki noktası için tıklayın veya Esc tuşuna basın" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1530,15 +1553,15 @@ msgstr "" "3d'de dikdörtgen çizilemez; önce Çizim -> Çalışma Düzleminde menüsü ile bir " "çalışma düzlemini etkinleştirin." -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "dikdörtgenin diğer köşesini yerleştirmek için tıklayın" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "yarıçapı ayarlamak için tıklayın" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1546,22 +1569,22 @@ msgstr "" "3d'de yay çizemez; önce Çizim -> Çalışma Düzleminde menüsü ile bir çalışma " "düzlemini etkinleştirin." -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "noktayı yerleştirmek için tıklayın" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "sonraki kübik noktayı tıklayın veya Esc tuşuna basın" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Zaten bir çalışma düzleminde çizim yapılıyor; 3d'de çizim yapmadan önce yeni " "çalışma düzlemi oluşturun." -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1569,11 +1592,11 @@ msgstr "" "3d'de metin yazılamaz; önce Çizim -> Çalışma Düzleminde menüsü ile bir " "çalışma düzlemini etkinleştirin." -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "metnin sağ alt konumunu yerleştirmek için tıklayın" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1581,193 +1604,199 @@ msgstr "" "3d'de resim eklenemez; önce Çizim -> Çalışma Düzleminde menüsü ile bir " "çalışma düzlemini etkinleştirin." -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "YENİ YORUM - DÜZENLEMEK İÇİN ÇİFT TIKLAYIN" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace Modelleri" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "IDF devre kartı" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "PNG Resmi" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "STL mesh" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ mesh" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Görüntüleyicili, Three.js-uyumlu mesh" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-uyumlu mesh, yalnızca mesh" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "VRML metin dosyası" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "STEP dosyası" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "PDF dosyası" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Kapsüllenmiş PostScript" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "Ölçeklenebilir Vektör Grafikleri (SVG)" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF dosyası (AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL dosyası" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "G Kodu" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF ve DWG dosyaları" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "Virgülle ayrılmış değerler (CSV)" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "isimsiz" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Dosyayı Kaydet" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Dosyayı Aç" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "_İptal" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "_Kaydet" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "_Aç" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "Otomatik Kaydetme Kullanılabilir" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Bu çizim için otomatik kaydetme dosyası kullanılabilir." -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Bunun yerine otomatik kaydetme dosyasını yüklemek istiyor musunuz?" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "&Otomatik kaydetmeyi yükle" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "&Yükleme" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "Değiştirilen Dosya" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "\"%s\" çiziminde yaptığınız değişiklikleri kaydetmek istiyor musunuz?" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Yeni çizimde yaptığınız değişiklikleri kaydetmek istiyor musunuz?" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Bunları kaydetmezseniz değişiklikleriniz kaybolur." -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "&Kaydet" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "K&aydetme" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "(yeni çizim)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "Özellik Tarayıcısı" -#: solvespace.cpp:658 +#: solvespace.cpp:699 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 " @@ -1777,7 +1806,7 @@ msgstr "" "Muhtemelen istediğiniz bu değil; metin penceresinin üst kısmındaki " "bağlantıya tıklayarak bunları gizleyin." -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1785,21 +1814,21 @@ msgid "" msgstr "" "Dosya türü '%s' dosya uzantısından tanımlanamıyor; .dxf veya .dwg'yi deneyin." -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "Sınırlamanın bir etiketi olmalı ve bir referans ölçüsü olmamalıdır." -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "" "Adım ölçüsü için hatalı seçim; bir nokta boyunca, eksenleri koordine etmek " "için ortogonal seçin." -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "Montaj engel değil, iyi." -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1810,7 +1839,7 @@ msgstr "" "\n" " % s" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1823,7 +1852,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1835,7 +1864,7 @@ msgstr "" "Eğri yüzeyler, üçgenler olarak yaklaştırılmıştır.\n" "Bu, tipik olarak yaklaşık 1% hataya neden olur." -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1852,7 +1881,7 @@ msgstr "" "Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" "Bu, tipik olarak yaklaşık 1%% hataya neden olur." -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1860,7 +1889,7 @@ msgstr "" "Bu grup, doğru biçimlendirilmiş 2d kapalı alan içermiyor. Açık, eş düzlemli " "değil veya kendisiyle kesişiyor." -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1877,7 +1906,7 @@ msgstr "" "Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" "Bu, tipik olarak yaklaşık 1%% hataya neden olur." -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1894,38 +1923,38 @@ msgstr "" "Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" "Bu, tipik olarak yaklaşık 1%% hataya neden olur." -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" "Çevre uzunluğu için hatalı seçim; çizgi parçalarını, yayları ve eğrileri " "seçin." -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "İzleme için hatalı seçim; tek bir nokta seçin." -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "\"%s\" ye yazılamadı" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Mesh kendisiyle kesişiyor (TAMAM değil, geçersiz)." -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Mesh kendi kendine kesişmiyor (tamam, geçerli)." -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Mesh'in açık kenarları var (tamam DEĞİL, geçersiz)." -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "Mesh çok sıkı (tamam, geçerli)" -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1936,7 +1965,7 @@ msgstr "" "\n" "Model, %d yüzeylerden %d üçgen içerir." -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1951,7 +1980,7 @@ msgstr "" "\n" "Sıfır sorunlu kenar, iyi.%s" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1966,7 +1995,7 @@ msgstr "" "\n" "%d sorunlu kenar, kötü.%s" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1995,7 +2024,7 @@ msgstr "" "\n" "© 2008-% d Jonathan Westhues ve diğer yazarlar.\n" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -2003,27 +2032,27 @@ msgstr "" "Başka bir öğeden türetilen bir öğeye biçim atayamazsınız; bu öğenin üst " "öğesine bir biçim atamayı deneyin." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "Biçim adı boş olamaz" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "1 defadan az tekrar edilemez." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "999 defadan fazla tekrar edilemez." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "Grup adı boş olamaz" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "Şeffaflık değeri sıfır ile bir arasında olmalıdır." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "Yarıçap sıfır veya negatif değer olamaz." @@ -2179,14 +2208,58 @@ msgctxt "button" msgid "&OK" msgstr "&Tamam" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "Ölçek sıfır veya negatif olamaz." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "Kötü biçim: x, y, z'yi belirtin" +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Uzunluk oranı sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +#~ "uygulanabilir:\n" +#~ "\n" +#~ " * iki çizgi parçası\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Uzunluk farkı sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +#~ "uygulanabilir:\n" +#~ "\n" +#~ " * iki çizgi parçası\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "&Uzunluk Oranı" + +#~ msgid "Length Diff&erence" +#~ msgstr "U&zunluk Farkı" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Çalışma düzleminde yeni taslak çizmek için hatalı seçim. Bu grup şunlarla " +#~ "oluşturulabilir:\n" +#~ "\n" +#~ " * bir nokta (nokta boyunca, eksenleri koordine etmek için " +#~ "ortogonal)\n" +#~ " * bir nokta ve iki çizgi parçası (noktadan, çizgilere paralel)\n" +#~ " * bir çalışma düzlemi (çalışma düzleminin kopyası)\n" + #~ msgctxt "file-type" #~ msgid "Q3D Object file" #~ msgstr "Q3D Object file" diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index e71069a9e..8192a6b6d 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" -"Report-Msgid-Bugs-To: https://github.com/solvespace/solvespace/issues\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"Report-Msgid-Bugs-To: whitequark@whitequark.org\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: 2021-04-14 01:42+0300\n" "Last-Translator: https://github.com/Symbian9\n" "Language-Team: app4soft\n" @@ -17,7 +17,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.4.2\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,50 +27,50 @@ msgstr "" "\n" "Активуйте одну через Креслення -> У площині." -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "Буфер обміну порожній; немає чого вставляти." -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "Кількість копій для вставки має бути не менше одної." -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "Масштаб не може бути нульовим." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "Оберіть одну точку для визначення центру обертання." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "Оберіть дві точки для визначення вектору розміщення." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "" -#: clipboard.cpp:458 +#: clipboard.cpp:457 #, fuzzy msgid "Too many items to paste; split this into smaller pastes." msgstr "Забагато об'єктів для вставки; рзділіть копіювання на кілька етапів." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "Немає активної площини." -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "Некоректний формат: визначте координати X, Y, Z" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "Некоректний формат: визначте колір як R, G, B" -#: confscreen.cpp:454 +#: confscreen.cpp:412 #, fuzzy msgid "" "The perspective factor will have no effect until you enable View -> Use " @@ -79,24 +79,24 @@ msgstr "" "Значення перспективи не матиме ефекту допоки не ввімкнено Вигляд -> " "Використовувати Перспективну проєкцію." -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Визначте кількість десяткових знаків від 0 до %d." -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "Масштаб експорту не може бути нульовим!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "Радіус відступу різання не може бути від'ємним!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "Некоректне значення: інтервал автозбереження має бути додатнім" -#: confscreen.cpp:558 +#: confscreen.cpp:521 #, fuzzy msgid "Bad format: specify interval in integral minutes" msgstr "Некоректний формат: визначте цілим числом інтервал у хвилинах" @@ -168,133 +168,153 @@ msgstr "пропорція-довжин" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "різниця-довжин" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "симетрія" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "симетрія-вертикально" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "симетрія-горизонтально" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "симетрія-відносно-лінії" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "на-середині" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "горизонталь" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "вертикаль" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "діаметр" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "тчк-на-колі" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "співнаправленість" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "кут" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "паралель" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "дотичні-дуга-лінія" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "дотичні-сплайн-лінія" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "дотичні-крива-крива" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "перпендикуляр" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "рівнозначні-радіуси" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "рівнозначні-кути" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "рівнозначні-лінія-дуга" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "фіксоване-положення" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "коментар" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." msgstr "" -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." msgstr "" -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." msgstr "" -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -308,7 +328,7 @@ msgid "" " * a circle or an arc (diameter)\n" msgstr "" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -320,7 +340,7 @@ msgid "" " * a point and a plane face (point on face)\n" msgstr "" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -336,22 +356,26 @@ msgid "" " * a line segment and an arc (line segment length equals arc length)\n" msgstr "" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -359,7 +383,7 @@ msgid "" " * a line segment and a workplane (line's midpoint on plane)\n" msgstr "" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -371,19 +395,19 @@ msgid "" "workplane)\n" msgstr "" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." msgstr "" -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." msgstr "" -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -392,7 +416,7 @@ msgid "" " * a line segment\n" msgstr "" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -400,16 +424,16 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:614 +#: constraint.cpp:663 #, fuzzy msgid "Must select an angle constraint." msgstr "Необхідно обрати кут." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "Необхідно обрати обмежувач з відповідною міткою." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -418,11 +442,11 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "" -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -433,7 +457,7 @@ msgid "" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -442,7 +466,7 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -450,7 +474,11 @@ msgid "" " * a point\n" msgstr "" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "КОМЕНТАР -- ДВІЧІ КЛІКНІТЬ ДЛЯ РЕДАГУВАННЯ" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "клікніть в місце де буде центр коментаря" @@ -473,26 +501,26 @@ msgid "" "lines)\n" msgstr "" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "Активна група не містить меш; немає чого експортувати." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Деякі аспекти креслення на мають відповідників у форматі DXF і не будуть " "експортовані:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -509,11 +537,11 @@ msgctxt "group-name" msgid "#references" msgstr "#базові-площини" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "Файл порожній. Він може бути пошкодженим." -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -551,7 +579,7 @@ msgctxt "button" msgid "&No" msgstr "&Ні" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "&Відмінити" @@ -725,295 +753,303 @@ msgid "Use &Perspective Projection" msgstr "Використовувати &Перспективну Проекцію" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "Розмірні &Одиниці" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "Розміри у &Міліметрах" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "Розміри у &Метрах" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "Розміри у &Дюймах" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "Показати Панель &Інструментів" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "Показати Вікно Власти&востей" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "&Повний Екран" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "&Нова Група" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "Креслення у &3D" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "Креслення у Новій &Площині" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "Покрокове &Переміщення" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "Покрокове &Обертання" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "Ви&давити" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "&Спіраль" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "&Виточити" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "&Обертати" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "Приєднати / Зібрати..." -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "Приєднати Нещодавні" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Креслення" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "У Робочій &Площині" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "Будь-де в &3D" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "Опорна &Точка" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "Робоча &Площина" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "&Відрізок Прямої" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "Контсрук&ційний Відрізок Прямої" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "&Прямокутник" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "&Коло" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "&Дуга Кола" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "Кубічний Сплайн &Без'є" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "&Текст із TrueType Шрифтом" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "&Зображення" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "Пере&мкнути Конструктивність" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "Дотична &Дуга на Точці" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Розрізати Криві на &Перетині" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Обмежити" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "&Відстань / Діаметр" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "Від&носний Розмір" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "К&ут" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "Відносний К&ут" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Інший Су&міжний Кут" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Перемкнути Від&носність Розмірів" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "&Горизонтально" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Вертикально" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "&На точці / Кривій / Площині" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "Рі&вні Довжина / Радіус / Кут" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "Про&порція Довжин" +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "Рі&зниця Довжин" +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" -#: graphicswin.cpp:158 +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "До &Середини" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "Си&метрично" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "Пара&лельно / Дотична" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "&Препендикулярно" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Однакова Орієн&тація" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "Фіксувати Точку Після &Переміщення" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Коментар" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Аналізувати" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "Обрахувати &Об'єм" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "Обрахувати Пл&ощу" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "Обрахувати &Периметр" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "Показати &Дотичні Частини" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "Показати &Приховані Ребра" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "Показати &Центр Масс" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "Показати &Надмірно Обмежені Точки" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "&Трасувати Точку" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "&Зупити Трасування..." -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Прорахувати &Розмір..." -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Довідка" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "&Мова" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "&Вебсайт / Посібник" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "&Про програму" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(нємає нещодавніх файлів)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "Файл '%s' відсутній." -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "Відсутня активна площина - сітка не відображатиметься." -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1022,91 +1058,91 @@ msgid "" "configuration screen. A value around 0.3 is typical." msgstr "" -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 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:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 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:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 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:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "клікніть для встановлення вихідної точки" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "клікніть першу точку прямої лінії" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "клікніть першу точку конструктивної прямої лінії" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "клікніть першу точку кривої" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "клікніть в місце де буде центр коментаря" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "клікніть в центр відліку площини" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "клікніть для встановлення першого кута прямокутника" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "клікніть для встановлення верхньої лівої межі тексту" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "клікніть для встановлення верхньої лівої межі зображення" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1117,17 +1153,18 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "ескіз-в-3D" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1135,16 +1172,16 @@ msgstr "" "Активуйте робочу площину ( Ескіз -> У Площині) перед екструдуванням. Ескіз " "буде екструдовано перпендикулярно до робочої площини." -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "видавлювання" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "" -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1153,16 +1190,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "проточування" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "" -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1171,16 +1208,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "прокручування" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "Спіраль може бути створена лише на основі площинного ескізу." -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1189,12 +1226,12 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "спіраль" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1204,430 +1241,436 @@ msgid "" "point, and parallel to line / normal)\n" msgstr "" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "крутіння" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "перекладання" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "(безіменне)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "не замкнений контур або не все в єдиному стилі!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "контур самоперетинається!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "ребро нульової довжини!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." msgstr "" -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." msgstr "" -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" -#: modify.cpp:624 +#: modify.cpp:622 #, fuzzy msgid "Must be sketching in workplane to split." msgstr "Має бути накреслений у робочій площині для розділеня." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "Неможливо розділити; відсутній перетин." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Встановити Стиль" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "Без Стилю" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Створити Користувацький Стиль..." -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Параметри Групи" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Параметри Стилю" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Виділити Ланцюг Ребер" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Перемкнути Відносність Розміру" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Інший Суміжний Кут" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Прикріпити до Сітки" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Видалити Точку Сплайну" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Додати Точку Сплайну" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "" "Неможливо додати точку сплайна: перевищено максимальну кількість точок." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Пермкнути Конструктивність" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Роз'єднати З'єднання Точок" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Вирізати" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Копіювати" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Виділити Усе" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Вставити" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Вставити Трансформованим..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Видалити" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Зняти Виділення з Усього" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Зняти Виділення з Наведеного" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Умістити на Екрані" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "клікніть наступну точку лінії або натисніть Esc" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "клікніть для встановлення іншого кута прямокутника" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "клікніть для визначення радіусу" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "клікніть для встановлення точки" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "клікніть наступну точку кривої або натисніть Esc" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "клікніть для встановлення нижньої правої межі тексту" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "КОМЕНТАР -- ДВІЧІ КЛІКНІТЬ ДЛЯ РЕДАГУВАННЯ" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace модель" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "IDF друкована плата" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "PNG зображення" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "STL меш" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ меш" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-сумісний меш, з переглядачем" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-сумісний меш, лише меш" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "VRML меш, текстовий формат" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "STEP файл" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "PDF файл" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Encapsulated PostScript" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "Scalable Vector Graphics, векторний формат" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF файл (AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL файл" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF та DWG файли" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "без імені" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Зберегти Файл" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Відкрити Файл" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "_Скасувати" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "_Зберегти" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "_Відкрити" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "Наявні автозбереження" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Наявні автозбереження для цього креслення." -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Завантажити файл автозбереження?" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "&Завантажити автозбереження" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "&Не Завантажувати" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "Файл Змінено" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Чи хочете ви зберегти зміни зроблені вами у ескізі “%s”?" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Чи хочете ви зберегти зміни зроблені вами у новому ескізі?" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Ваші зміни буде втрачено якщо ви не збережете їх." -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "&Зберегти" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "&Не Зберігати" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "(нове креслення)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "Браузер Властивостей" -#: solvespace.cpp:658 +#: solvespace.cpp:699 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:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "Обмежувач має містити мітку і бути не відносним розміром." -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "Поганий вибір для крокової зміни розміру; оберіть обмежувач." -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1638,7 +1681,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1651,7 +1694,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1659,7 +1702,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1670,7 +1713,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1678,7 +1721,7 @@ msgstr "" "Ця група не місить коректно сформованого замкненої 2D площини. Вона " "відкрита, не компланарна, або ж самоперетинається." -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1695,7 +1738,7 @@ msgstr "" "Криві наближено до ламаних ліній.\n" "Це вносить похибку, зазвичай близько 1%%." -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1712,36 +1755,36 @@ msgstr "" "Криві наближено до ламаних ліній.\n" "Це вносить похибку, зазвичай близько 1%%." -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Поганий вибір для периметру; оберіть відрізки, дуги та криві." -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "Поганий вибір для вістежування шляху; оберіть одну точку." -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "Неможливо записати у '%s'" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Меш самоперетинається (НЕ добре, недійсний)." -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Меш самоперетинається (добре, дійсний)." -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Меш містить оголені ребра (НЕ добре, недійсний)." -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "Меш водонепроникний (добре, дійсний)." -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1749,7 +1792,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1764,7 +1807,7 @@ msgstr "" "\n" "Відсутні проблемні ребра, добре.%s" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1779,7 +1822,7 @@ msgstr "" "\n" "%d проблемних ребер, погано.%s" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1808,7 +1851,7 @@ msgstr "" "\n" "© 2008-%d Jonathan Westhues та інші автори.\n" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -1816,27 +1859,27 @@ msgstr "" "Неможливо призначити стиль елементу який походить від іншого елемента; " "спробуйте призначити стиль батьківському елементу." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "Стиль не може містити порожнє ім'я" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "Не можливо повторити менше 1 разу." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "Не можливо повторити понад 999 разів." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "Група не може містити порожнє ім'я" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "Непрозорість має бути між 0 та 1." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "Радіус не може бути нульовим чи від'ємним." @@ -1991,14 +2034,20 @@ msgctxt "button" msgid "&OK" msgstr "&OK" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "Масштаб не може бути нульовим чи від'ємним." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "Некоректний формат: визначте X, Y, Z" +#~ msgid "Length Ra&tio" +#~ msgstr "Про&порція Довжин" + +#~ msgid "Length Diff&erence" +#~ msgstr "Рі&зниця Довжин" + #~ msgid "Show Degrees of &Freedom" #~ msgstr "Показати Степені &Свободи" diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index 6cc88cdde..7768124ee 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: 2021-04-03 13:10-0400\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.2\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,72 +27,72 @@ msgstr "" "\n" "使用\"工作平面中的草图 -+\"激活一个。" -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "剪贴板为空;没有要粘贴的内容。" -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "要粘贴的副本数必须至少为 1 个。" -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "缩放不能为零。" -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "选择一个点以定义旋转原点。" -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "选择两个点来定义转换向量。" -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "转换就是标识,因此所有的复制在彼此之上。" -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "要粘贴的项目太多; 请把他们拆分。" -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "没有工作平面处于活动状态。" -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "格式错误:将坐标指定为 x、y、z" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "格式错误:将颜色指定为 r、g、b" -#: confscreen.cpp:454 +#: confscreen.cpp:412 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." msgstr "在启用\"视图 -= 使用透视投影\"之前,透视因子将不起作用。" -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "在十进制之后指定 0 和 %d 数字之间。" -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "输出比例不能为零!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "刀具半径偏移不能为负数!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "坏值:自动保存间隔应为正" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "格式错误:以整数分钟为单位指定间隔" @@ -163,134 +163,154 @@ msgstr "长度比率" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "长度不同" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "对称的" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "水平对称" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "纵向对称" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "线对称" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "在中点" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "水平约束" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "垂直约束" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "直径约束" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "圆点约束" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "相同原点" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "角度约束" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "平行约束" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "弧切线" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "立方体切线" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "曲线间切线" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "垂直约束" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "等于半径" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "等于角度" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "等于线长或弧长" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "锁定位置" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "备注" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." msgstr "切线弧和线段必须共享一个端点。在约束切线之前,使用约束 -= 点约束它们。" -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." msgstr "" "切线立方段和线段必须共享终结点。在约束切线之前,使用约束 -= 点约束它们。" -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." msgstr "曲线必须共享一个终结点。在约束切线之前,使用约束 -= 点约束它们。" -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -313,7 +333,7 @@ msgstr "" " * 平面面和点(最小距离)\n" " * 圆或弧(直径)\n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -332,7 +352,7 @@ msgstr "" " * 一个点和一个圆或圆(曲线上的点)\n" " * 点和平面面(点在脸上)\n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -358,28 +378,26 @@ msgstr "" " * 两个圆或圆(相等半径)\n" " * 线段和圆弧(线段长度等于弧长)\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"长度比率约束的选择错误。此约束可应用于:\n" -"\n" -"* 两个线段\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"长度差异约束的选择错误。此约束可应用于:\n" -"\n" -"* 两个线段\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -391,7 +409,7 @@ msgstr "" "* 线段和点(点在中点)\n" " * 线段和工作平面(平面上的线中点)\n" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -408,19 +426,19 @@ msgstr "" " * 线段,和两个点或线段(对称的线段)\n" " * 工作平面和两个点或线段(工作平面对称)\n" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." msgstr "在没有显式对称平面约束对称时,工作平面必须处于活动状态。" -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." msgstr "在应用水平或垂直约束之前,激活工作平面(使用草图 -= 在工作平面中)。" -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -433,7 +451,7 @@ msgstr "" "• 两点\n" " • 线段\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -444,15 +462,15 @@ msgstr "" "\n" "• 两个法线\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "必须选择角度约束。" -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "必须选择具有关联标签的约束。" -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -466,11 +484,11 @@ msgstr "" " * 线段和法线\n" " • 两个法线\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "曲线曲线切线必须应用于工作平面。" -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -487,7 +505,7 @@ msgstr "" " * 两个法线(平行)\n" " * 共享端点的两条线段、弧线或贝塞尔(切线)\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -501,7 +519,7 @@ msgstr "" " * 线段和法线\n" " • 两个法线\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -512,7 +530,11 @@ msgstr "" "\n" "• 一点\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "新备注 - 双击编辑" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "单击注释文本的中心" @@ -538,24 +560,24 @@ msgstr "" " * 脸(通过面的剖面)\n" " * 一个点和两个线段(平面穿过点和平行线)\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "活动组网格为空;没有要导出的。" -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "徒手线替换为连续线" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "锯齿线替换为连续线" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "绘图的某些方面没有 DXF 等效项,并且未导出:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "PDF 页面大小超过 200 英寸或 200 英寸;许多查看器可能会拒绝此文件。" @@ -570,11 +592,11 @@ msgctxt "group-name" msgid "#references" msgstr "#参考" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "" -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -610,7 +632,7 @@ msgctxt "button" msgid "&No" msgstr "否(&N)" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "取消(&C)" @@ -784,295 +806,303 @@ msgid "Use &Perspective Projection" msgstr "使用远景透视(&P)" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "标注单位(&U)" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "标注单位 mm (&M)" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "标注单位m (&E)" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "标准单位英寸 (&I)" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "显示工具条(&T)" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "显示属性浏览器(&W)" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "全屏(&F)" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "新组合(&N)" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "在三维内绘制(&3)" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "在新工作面绘制(&W)" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "移动(&T)" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "旋转(&R)" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "挤出(&E)" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "螺旋(&H)" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "扫略(&L)" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "旋转(&V)" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "链接/装配..." -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "连接最近文件" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "绘图(&S)" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "在工作平面(&W)" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "在3D的任何位置(&3)" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "基准点(&P)" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "工作面(&W)" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "线段(&S)" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "构造线段(&C)" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "矩形(&R)" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "圆线(&C)" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "圆弧(&A)" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "立方体线的贝塞尔曲线(&B)" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "TrueTyoe字体文字(&T)" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "图片(&I)" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "切换构造(&G)" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "弧线切线点(&A)" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "在交叉处拆分曲线(&I)" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "约束(&C)" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "距离/直径(&D)" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "参考标注(&F)" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "角度(&A)" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "参考角度(&G)" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "其它增补角度(&U)" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "切换参考标注(&E)" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "水平约束(&H)" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "垂直约束(&V)" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "在点线面(&O)" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "等于/长度/半径/角度(&Q)" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "长度比例(&T)" +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "长度偏差(&E)" +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" -#: graphicswin.cpp:158 +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "在中点(&M)" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "对称(&Y)" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "水平/切线(&L)" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "垂直的(&P)" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "相同方向(&A)" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "锁定点位置(&D)" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "备注" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "分析(&A)" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "测量体积(&V)" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "测量面积(&R)" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "测量周长(&P)" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "显示干涉零件(&I)" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "显示孤立边(&N)" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "显示中心(&C)" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "显示无效约束点(&U)" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "跟踪点(&T)" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "停止跟踪(&S)" -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "逐步标注(&D)" -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "帮助(&H)" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "语言(&L)" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "网页/手册(&W)" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "关于(&A)" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(无文件)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "文件不存在: \"%s\"。" -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "没有激活的工作面,因此无法显示轴网。" -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1081,91 +1111,91 @@ msgid "" "configuration screen. A value around 0.3 is typical." msgstr "" -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 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:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 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:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 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:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "点击弧线的点(逆时针方向绘制)" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "点击放置基准点" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "点击线条的起点" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "点击构造线的起点" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "点击立方体的起点" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "点击圆弧的中心" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "点击工作面的原点" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "点击一个矩形倒角" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "点击文字左上角" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "点击图片左上角" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1176,37 +1206,33 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "3D草图" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * 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" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." msgstr "挤出前先激活工作面(草图->在工作面),该草图将由工作面的法线方向挤出。" -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "挤出" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "扫略操作仅可用于二维草图。" -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1219,16 +1245,16 @@ msgstr "" " * 一个点和一个线段或法线(围绕坐标轴至线或法线的平行线,通过点)\n" " * 一个线段(围绕线段)\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "扫略" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "" -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1237,16 +1263,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "旋转" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "" -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1255,12 +1281,12 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "螺旋" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1270,428 +1296,434 @@ msgid "" "point, and parallel to line / normal)\n" msgstr "" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "旋转" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "移动" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "(未命名)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "未闭合轮廓 , 或样式不一致!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "点不在相同平面!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "轮廓自相交!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "边缘长度为零!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." msgstr "" -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." msgstr "" -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "" -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "无法拆分;未发现较差点。" -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "指定样式" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "无样式" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "新组样式。" -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "组信息" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "样式信息" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "选择边缘链" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "切换参考标注" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "其它补充角度" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "捕捉至轴网" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "删除样条线的点" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "增加样条线的点" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "无法增加样条线点:超过最大限制。" -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "切换构造" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "删除点一致约束" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "剪切" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "复制" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "全选" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "粘贴" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "粘贴移动的..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "删除" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "取消全选" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "取消覆盖区域的全选" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "自动缩放" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "点击下一个点或取消(ESC)" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在3D内绘制矩形; 首先,激活工作面,草图->在工作面。" -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "点击放置其它矩形倒角" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "点击设置半径" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在3D空间内绘制弧线,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "点击放置点" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "点击下一个点或取消(ESC)" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "已经在工作面绘制;在新建工作面前在三维空间绘制。" -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在三维空间内绘制文字,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "点击文字的右下角放置" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "新备注 - 双击编辑" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace模型" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "PNG图片" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "STL网格" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ网格" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-网格及查看视图" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-仅网格" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "VRML文本文件" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "STEP文件" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "PDF文件" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "封装好的PostScript" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "SVG矢量图" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF文件(AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL文件" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF/DWG文件" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "逗号分隔数据" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "未命名" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "保存文件" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "打开文件" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "取消_C" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "保存_S" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "打开_O" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:658 +#: solvespace.cpp:699 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:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1699,7 +1731,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1708,7 +1740,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1716,7 +1748,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1727,13 +1759,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1744,7 +1776,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1755,36 +1787,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1792,7 +1824,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1802,7 +1834,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1812,7 +1844,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1829,33 +1861,33 @@ msgid "" "© 2008-%d Jonathan Westhues and other authors.\n" msgstr "" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." msgstr "无法将样式分配给派生自其他实体的实体;尝试将样式分配给此实体的父级。" -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "样式名称不能为空" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "不能重复少于 1 次。" -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "重复不超过 999 次。" -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "组名称不能为空" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "不透明度必须在零和 1 之间。" -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "半径偏移不能为负数。" @@ -2010,14 +2042,54 @@ msgctxt "button" msgid "&OK" msgstr "&OK" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "缩放不能为零。" -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "格式错误: 需指定 x, y, z" +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "长度比率约束的选择错误。此约束可应用于:\n" +#~ "\n" +#~ "* 两个线段\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "长度差异约束的选择错误。此约束可应用于:\n" +#~ "\n" +#~ "* 两个线段\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "长度比例(&T)" + +#~ msgid "Length Diff&erence" +#~ msgstr "长度偏差(&E)" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "在新工作面内绘图选择失败,该组可以使用:\n" +#~ "\n" +#~ " * 一个点(通过该点,正交至坐标轴)\n" +#~ " * 一个点和二个线段(通过点,绘制平行线至线段)\n" +#~ " * 一个工作面(复制工作面)\n" + #~ msgctxt "file-type" #~ msgid "Q3D Object file" #~ msgstr "Q3D对象文件" diff --git a/res/messages.pot b/res/messages.pot index 534faa40f..25a6c1cf3 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,76 +17,76 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" "Activate one with Sketch -> In Workplane." msgstr "" -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "" -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "" -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "" -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "" -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "" -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "Transformation is identity. So all copies will be exactly on top of each other." msgstr "" -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "" -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "" -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "" -#: confscreen.cpp:454 +#: confscreen.cpp:412 msgid "" "The perspective factor will have no effect until you enable View -> Use Perspective Projection." msgstr "" -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "" @@ -157,133 +157,153 @@ msgstr "" #: constraint.cpp:25 msgctxt "constr-name" -msgid "length-difference" +msgid "arc-arc-length-ratio" msgstr "" #: constraint.cpp:26 msgctxt "constr-name" -msgid "symmetric" +msgid "arc-line-length-ratio" msgstr "" #: constraint.cpp:27 msgctxt "constr-name" -msgid "symmetric-h" +msgid "length-difference" msgstr "" #: constraint.cpp:28 msgctxt "constr-name" -msgid "symmetric-v" +msgid "arc-arc-len-difference" msgstr "" #: constraint.cpp:29 msgctxt "constr-name" -msgid "symmetric-line" +msgid "arc-line-len-difference" msgstr "" #: constraint.cpp:30 msgctxt "constr-name" -msgid "at-midpoint" +msgid "symmetric" msgstr "" #: constraint.cpp:31 msgctxt "constr-name" -msgid "horizontal" +msgid "symmetric-h" msgstr "" #: constraint.cpp:32 msgctxt "constr-name" -msgid "vertical" +msgid "symmetric-v" msgstr "" #: constraint.cpp:33 msgctxt "constr-name" -msgid "diameter" +msgid "symmetric-line" msgstr "" #: constraint.cpp:34 msgctxt "constr-name" -msgid "pt-on-circle" +msgid "at-midpoint" msgstr "" #: constraint.cpp:35 msgctxt "constr-name" -msgid "same-orientation" +msgid "horizontal" msgstr "" #: constraint.cpp:36 msgctxt "constr-name" -msgid "angle" +msgid "vertical" msgstr "" #: constraint.cpp:37 msgctxt "constr-name" -msgid "parallel" +msgid "diameter" msgstr "" #: constraint.cpp:38 msgctxt "constr-name" -msgid "arc-line-tangent" +msgid "pt-on-circle" msgstr "" #: constraint.cpp:39 msgctxt "constr-name" -msgid "cubic-line-tangent" +msgid "same-orientation" msgstr "" #: constraint.cpp:40 msgctxt "constr-name" -msgid "curve-curve-tangent" +msgid "angle" msgstr "" #: constraint.cpp:41 msgctxt "constr-name" -msgid "perpendicular" +msgid "parallel" msgstr "" #: constraint.cpp:42 msgctxt "constr-name" -msgid "eq-radius" +msgid "arc-line-tangent" msgstr "" #: constraint.cpp:43 msgctxt "constr-name" -msgid "eq-angle" +msgid "cubic-line-tangent" msgstr "" #: constraint.cpp:44 msgctxt "constr-name" -msgid "eq-line-len-arc-len" +msgid "curve-curve-tangent" msgstr "" #: constraint.cpp:45 msgctxt "constr-name" -msgid "lock-where-dragged" +msgid "perpendicular" msgstr "" #: constraint.cpp:46 msgctxt "constr-name" +msgid "eq-radius" +msgstr "" + +#: constraint.cpp:47 +msgctxt "constr-name" +msgid "eq-angle" +msgstr "" + +#: constraint.cpp:48 +msgctxt "constr-name" +msgid "eq-line-len-arc-len" +msgstr "" + +#: constraint.cpp:49 +msgctxt "constr-name" +msgid "lock-where-dragged" +msgstr "" + +#: constraint.cpp:50 +msgctxt "constr-name" msgid "comment" msgstr "" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with Constrain -> On " "Point before constraining tangent." msgstr "" -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them with Constrain -> On " "Point before constraining tangent." msgstr "" -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point before constraining " "tangent." msgstr "" -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply to:\n" "\n" @@ -296,7 +316,7 @@ msgid "" " * a circle or an arc (diameter)\n" msgstr "" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can apply to:\n" "\n" @@ -307,7 +327,7 @@ msgid "" " * a point and a plane face (point on face)\n" msgstr "" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can apply to:\n" "\n" @@ -321,21 +341,25 @@ msgid "" " * a line segment and an arc (line segment length equals arc length)\n" msgstr "" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -343,7 +367,7 @@ msgid "" " * a line segment and a workplane (line's midpoint on plane)\n" msgstr "" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -352,17 +376,17 @@ msgid "" " * workplane, and two points or a line segment (symmetric about workplane)\n" msgstr "" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "A workplane must be active when constraining symmetric without an explicit symmetry plane." msgstr "" -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a horizontal or vertical " "constraint." msgstr "" -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can apply to:\n" "\n" @@ -370,22 +394,22 @@ msgid "" " * a line segment\n" msgstr "" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply to:\n" "\n" " * two normals\n" msgstr "" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "" -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "" -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -394,11 +418,11 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "" -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply to:\n" "\n" @@ -408,7 +432,7 @@ msgid "" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -417,14 +441,18 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can apply to:\n" "\n" " * a point\n" msgstr "" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "" @@ -443,23 +471,23 @@ msgid "" " * a point and two line segments (plane through point and parallel to lines)\n" msgstr "" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "" -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -473,11 +501,11 @@ msgctxt "group-name" msgid "#references" msgstr "" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "" -#: file.cpp:557 +#: file.cpp:555 msgid "Unrecognized data in file. This file may be corrupt, or from a newer version of the program." msgstr "" @@ -510,7 +538,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "" @@ -684,295 +712,303 @@ msgid "Use &Perspective Projection" msgstr "" #: graphicswin.cpp:97 -msgid "Dimension &Units" +msgid "Show E&xploded View" msgstr "" #: graphicswin.cpp:98 -msgid "Dimensions in &Millimeters" +msgid "Dimension &Units" msgstr "" #: graphicswin.cpp:99 -msgid "Dimensions in M&eters" +msgid "Dimensions in &Millimeters" msgstr "" #: graphicswin.cpp:100 +msgid "Dimensions in M&eters" +msgstr "" + +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "" -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" msgstr "" -#: graphicswin.cpp:157 -msgid "Length Diff&erence" +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" msgstr "" -#: graphicswin.cpp:158 +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "" -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "" -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "" -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel projection.\n" "\n" @@ -980,89 +1016,89 @@ msgid "" "around 0.3 is typical." msgstr "" -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 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:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) to define the plane " "for the snap grid." msgstr "" -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 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:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 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:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select nothing to set up arc " "parameters." msgstr "" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "No entities are selected. Select entities before trying to toggle their construction state." msgstr "" @@ -1071,31 +1107,32 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch will be extruded " "normal to the workplane." msgstr "" -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "" -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1104,16 +1141,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "" -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1122,16 +1159,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "" -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1140,12 +1177,12 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1154,416 +1191,422 @@ msgid "" "line / normal)\n" msgstr "" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or circles in this group " "and workplane join." msgstr "" -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the desired geometry by hand " "with tangency constraints." msgstr "" -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "" -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs or a line/circle/arc " "and a point)." msgstr "" -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "" -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "" -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "" -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "" -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "Can't draw arc in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "Can't draw text in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "Can't draw image in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +msgctxt "file-type" +msgid "SolveSpace models" msgstr "" -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:89 msgctxt "file-type" -msgid "SolveSpace models" +msgid "ALL" msgstr "" -#: platform/gui.cpp:90 +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:658 +#: solvespace.cpp:699 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:730 +#: solvespace.cpp:771 #, c-format msgid "Can't identify file type from file extension of filename '%s'; try .dxf or .dwg." msgstr "" -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1571,7 +1614,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1580,7 +1623,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1588,7 +1631,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1599,13 +1642,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, not coplanar, or self-" "intersecting." msgstr "" -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1616,7 +1659,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1627,36 +1670,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1664,7 +1707,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1674,7 +1717,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1684,7 +1727,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1701,33 +1744,33 @@ msgid "" "© 2008-%d Jonathan Westhues and other authors.\n" msgstr "" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try assigning a style to this " "entity's parent." msgstr "" -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "" -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "" -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "" -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "" @@ -1882,10 +1925,10 @@ msgctxt "button" msgid "&OK" msgstr "" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "" -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "" From dee233af6ae0c49149713bdd501af5498ea6cf70 Mon Sep 17 00:00:00 2001 From: OlesyaGerasimenko <53296253+OlesyaGerasimenko@users.noreply.github.com> Date: Mon, 4 Oct 2021 16:42:01 +0300 Subject: [PATCH 340/646] Update Russian translation --- res/locales/ru_RU.po | 71 ++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index 6ffc7f89b..d688a75c6 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -2,20 +2,21 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # EvilSpirit , 2017. +# Olesya Gerasimenko , 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" -"PO-Revision-Date: 2021-01-22 18:50+0700\n" -"Last-Translator: evilspirit@evilspirit.org\n" -"Language-Team: EvilSpirit\n" +"PO-Revision-Date: 2021-10-04 15:33+0300\n" +"Last-Translator: Olesya Gerasimenko \n" +"Language-Team: Basealt Translation Team\n" "Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Lokalize 21.08.1\n" #: clipboard.cpp:309 msgid "" @@ -169,12 +170,12 @@ msgstr "отношение-длин" #: constraint.cpp:25 msgctxt "constr-name" msgid "arc-arc-length-ratio" -msgstr "" +msgstr "отношение-длин-дуга-дуга" #: constraint.cpp:26 msgctxt "constr-name" msgid "arc-line-length-ratio" -msgstr "" +msgstr "отношение-длин-дуга-отрезок" #: constraint.cpp:27 msgctxt "constr-name" @@ -184,12 +185,12 @@ msgstr "разность-длин" #: constraint.cpp:28 msgctxt "constr-name" msgid "arc-arc-len-difference" -msgstr "" +msgstr "разность-длин-дуга-дуга" #: constraint.cpp:29 msgctxt "constr-name" msgid "arc-line-len-difference" -msgstr "" +msgstr "разность-длин-дуга-отрезок" #: constraint.cpp:30 msgctxt "constr-name" @@ -404,6 +405,12 @@ msgid "" " * two arcs\n" " * one arc and one line segment\n" msgstr "" +"Неправильное выделение для ограничения 'отношение длин'. Ограничение может" +" принимать в качестве выделения следующие примитивы:\n" +"\n" +" * два отрезка\n" +" * две дуги\n" +" * дугу и отрезок\n" #: constraint.cpp:441 msgid "" @@ -414,6 +421,12 @@ msgid "" " * two arcs\n" " * one arc and one line segment\n" msgstr "" +"Неправильное выделение для ограничения 'разность длин'. Ограничение может" +" принимать в качестве выделения следующие примитивы:\n" +"\n" +" * два отрезка\n" +" * две дуги\n" +" * дугу и отрезок\n" #: constraint.cpp:472 msgid "" @@ -485,7 +498,7 @@ msgid "" "\n" " * two normals\n" msgstr "" -"Неправильное выделение для ограничения \"идентичная ориентация\".\n" +"Неправильное выделение для ограничения 'идентичная ориентация'.\n" "Ограничение может принимать в качестве выделения следующие примитивы:\n" "\n" " * два координатных базиса('нормали')\n" @@ -562,7 +575,7 @@ msgid "" "\n" " * a point\n" msgstr "" -"Неправильное выделение для ограничения 'Фиксация'.\n" +"Неправильное выделение для ограничения 'фиксация'.\n" "Ограничение может принимать в качестве выделения следующие примитивы:\n" "\n" " * точку\n" @@ -803,7 +816,7 @@ msgstr "Стили Линий..." #: graphicswin.cpp:79 msgid "&View Projection..." -msgstr "&View Прое&кция..." +msgstr "&Проекция вида..." #: graphicswin.cpp:81 msgid "Con&figuration..." @@ -855,7 +868,7 @@ msgstr "Перспективная Прое&кция" #: graphicswin.cpp:97 msgid "Show E&xploded View" -msgstr "" +msgstr "Показать &Развернутый Вид" #: graphicswin.cpp:98 msgid "Dimension &Units" @@ -875,7 +888,7 @@ msgstr "Размеры в Дю&ймах" #: graphicswin.cpp:102 msgid "Dimensions in &Feet and Inches" -msgstr "" +msgstr "Размеры в &Футах и дюймах" #: graphicswin.cpp:104 msgid "Show &Toolbar" @@ -1043,11 +1056,11 @@ msgstr "&Равенство Длин / Радиусов / Углов" #: graphicswin.cpp:158 msgid "Length / Arc Ra&tio" -msgstr "" +msgstr "&Отношение длин (дуга)" #: graphicswin.cpp:159 msgid "Length / Arc Diff&erence" -msgstr "" +msgstr "Р&азность длин (дуга)" #: graphicswin.cpp:160 msgid "At &Midpoint" @@ -1179,7 +1192,7 @@ msgid "" "make a link group the active group." msgstr "" "Чтобы использовать эту команду, выделите точку или другой примитив, " -"принадлежащий импортированной детали или активируйте группу импортированной " +"принадлежащий импортированной детали, или активируйте группу импортированной " "детали." #: graphicswin.cpp:1177 @@ -1294,6 +1307,14 @@ 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" +" * рабочую плоскость (копию рабочей плоскости)\n" #: group.cpp:166 msgid "" @@ -1326,7 +1347,7 @@ msgstr "" "Группа может быть создана, используя в качестве выделения следующие " "примитивы:\n" "\n" -" * точку и отрезок / координатных базис (нормаль) (тело вращения вокруг " +" * точку и отрезок / координатный базис (нормаль) (тело вращения вокруг " "оси, проходящей через точку и параллельной отрезку / нормали)\n" " * отрезок (тело вращения вокруг оси, проходящей через отрезок)\n" "\n" @@ -1354,7 +1375,7 @@ msgstr "" "Группа может быть создана, используя в качестве выделения следующие " "примитивы:\n" "\n" -" * точку и отрезок / координатных базис (нормаль) (тело вращения вокруг " +" * точку и отрезок / координатный базис (нормаль) (тело вращения вокруг " "оси, проходящей через точку и параллельной отрезку / нормали)\n" " * отрезок (тело вращения вокруг оси, проходящей через отрезок)\n" "\n" @@ -1407,7 +1428,7 @@ msgstr "" "\n" " * точку при активной рабочей плоскости (вращение в плоскости вокруг " "выбранной точки)\n" -" * точку и отрезок / координатных базис (нормаль) (вращение вокруг оси, " +" * точку и отрезок / координатный базис (нормаль) (вращение вокруг оси, " "проходящей через точку и параллельной отрезку / нормали)\n" "\n" @@ -1646,7 +1667,7 @@ msgstr "проекты SolveSpace" #: platform/gui.cpp:89 msgctxt "file-type" msgid "ALL" -msgstr "" +msgstr "ВСЕ" #: platform/gui.cpp:91 msgctxt "file-type" @@ -1656,7 +1677,7 @@ msgstr "IDF печатная плата" #: platform/gui.cpp:92 msgctxt "file-type" msgid "STL triangle mesh" -msgstr "" +msgstr "STL треугольная сетка" #: platform/gui.cpp:96 msgctxt "file-type" @@ -1676,7 +1697,7 @@ msgstr "Wavefront OBJ полигональная сетка" #: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" -msgstr "Three.js-совместимая полигональная сетка с просмторщиком" +msgstr "Three.js-совместимая полигональная сетка с просмотрщиком" #: platform/gui.cpp:103 msgctxt "file-type" @@ -1846,7 +1867,7 @@ msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -"Неподдерживаемый тип файла '%s'; Поддерживаются файлы с расширением .dxf и ." +"Неподдерживаемый тип файла '%s'. Поддерживаются файлы с расширением .dxf и ." "dwg." #: solvespace.cpp:823 @@ -1975,11 +1996,11 @@ msgstr "Невозможно записать в '%s'" #: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." -msgstr "Полигональная стека содержит самопересечения (это плохо)" +msgstr "Полигональная сетка содержит самопересечения (это плохо)" #: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." -msgstr "Полигональная стека не содержит самопересечений (это хорошо)" +msgstr "Полигональная сетка не содержит самопересечений (это хорошо)" #: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." From 53b6af10ed9c8047354040cf4bf841cfb3c2ac59 Mon Sep 17 00:00:00 2001 From: MX_Master Date: Wed, 13 Oct 2021 23:16:55 +0600 Subject: [PATCH 341/646] + safe height gcode parameter --- src/confscreen.cpp | 10 ++++++++++ src/exportvector.cpp | 6 +++--- src/solvespace.cpp | 3 ++- src/solvespace.h | 1 + src/ui.h | 15 ++++++++------- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/confscreen.cpp b/src/confscreen.cpp index 2eb9534ff..1e2e82a69 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -161,6 +161,11 @@ void TextWindow::ScreenChangeGCodeParameter(int link, uint32_t v) { buf += SS.MmToString(SS.gCode.depth, true); break; + case 'h': + SS.TW.edit.meaning = Edit::G_CODE_SAFE_HEIGHT; + buf += SS.MmToString(SS.gCode.safeHeight, true); + break; + case 's': SS.TW.edit.meaning = Edit::G_CODE_PASSES; buf += std::to_string(SS.gCode.passes); @@ -492,6 +497,11 @@ bool TextWindow::EditControlDoneForConfiguration(const std::string &s) { if(e) SS.gCode.depth = (float)SS.ExprToMm(e); break; } + case Edit::G_CODE_SAFE_HEIGHT: { + Expr *e = Expr::From(s, /*popUpError=*/true); + if(e) SS.gCode.safeHeight = (float)SS.ExprToMm(e); + break; + } case Edit::G_CODE_PASSES: { Expr *e = Expr::From(s, /*popUpError=*/true); if(e) SS.gCode.passes = (int)(e->Eval()); diff --git a/src/exportvector.cpp b/src/exportvector.cpp index 5a3c5d36f..55abac685 100644 --- a/src/exportvector.cpp +++ b/src/exportvector.cpp @@ -1102,7 +1102,7 @@ void SvgFileWriter::StartFile() { fprintf(f, "stroke-dasharray:%s;\r\n", patternStr.c_str()); } if(s->filled) { - fprintf(f, "fill:#%02x%02x%02x;\r\n", fillRgb.red, fillRgb.green, fillRgb.blue); + fprintf(f, "fill:#%02x%02x%02x;\r\n", fillRgb.red, fillRgb.green, fillRgb.blue); } else { fprintf(f, "fill:none;\r\n"); @@ -1308,9 +1308,9 @@ void GCodeFileWriter::FinishAndCloseFile() { SS.MmToString(pt->p.x).c_str(), SS.MmToString(pt->p.y).c_str(), SS.MmToString(SS.gCode.feed).c_str()); } - // Move up to a clearance plane 5mm above the work. + // Move up to a clearance plane above the work. fprintf(f, "G00 Z%s\r\n", - SS.MmToString(SS.gCode.depth < 0 ? +5 : -5).c_str()); + SS.MmToString(SS.gCode.safeHeight).c_str()); } } diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 5d6d7b27f..787688719 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -105,6 +105,7 @@ void SolveSpaceUI::Init() { exportCanvas.dy = settings->ThawFloat("ExportCanvas_Dy", 5.0); // Extra parameters when exporting G code gCode.depth = settings->ThawFloat("GCode_Depth", 10.0); + gCode.safeHeight = settings->ThawFloat("GCode_SafeHeight", 5.0); gCode.passes = settings->ThawInt("GCode_Passes", 1); gCode.feed = settings->ThawFloat("GCode_Feed", 10.0); gCode.plungeFeed = settings->ThawFloat("GCode_PlungeFeed", 10.0); @@ -413,7 +414,7 @@ static std::pair SelectSIPrefixMm(int ord, int dim) { default: dbp ("dimensions over 3 not supported"); break; - } + } return {0, "m"}; } static std::pair SelectSIPrefixInch(int deg) { diff --git a/src/solvespace.h b/src/solvespace.h index 348a8e667..8a922167f 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -598,6 +598,7 @@ class SolveSpaceUI { } exportCanvas; struct { double depth; + double safeHeight; int passes; double feed; double plungeFeed; diff --git a/src/ui.h b/src/ui.h index 0700653af..21b00cd46 100644 --- a/src/ui.h +++ b/src/ui.h @@ -314,13 +314,14 @@ class TextWindow { EXPORT_OFFSET = 110, CANVAS_SIZE = 111, G_CODE_DEPTH = 112, - G_CODE_PASSES = 113, - G_CODE_FEED = 114, - G_CODE_PLUNGE_FEED = 115, - AUTOSAVE_INTERVAL = 116, - LIGHT_AMBIENT = 117, - FIND_CONSTRAINT_TIMEOUT = 118, - EXPLODE_DISTANCE = 119, + G_CODE_SAFE_HEIGHT = 113, + G_CODE_PASSES = 114, + G_CODE_FEED = 115, + G_CODE_PLUNGE_FEED = 116, + AUTOSAVE_INTERVAL = 117, + LIGHT_AMBIENT = 118, + FIND_CONSTRAINT_TIMEOUT = 119, + EXPLODE_DISTANCE = 120, // For TTF text TTF_TEXT = 300, // For the step dimension screen From 6820f05b2e1e3f46257c0b12068b691997f73613 Mon Sep 17 00:00:00 2001 From: Simon Wells Date: Sat, 23 Oct 2021 00:38:37 +1300 Subject: [PATCH 342/646] modify the spaceware code to also work on wayland use the recommended compile-time and run-time checks for x11 and wayland --- src/platform/guigtk.cpp | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index 46a7df350..6afb9c724 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -33,7 +33,12 @@ #if defined(HAVE_SPACEWARE) # include -# include +# if defined(GDK_WINDOWING_X11) +# include +# endif +# if defined(GDK_WINDOWING_WAYLAND) +# include +# endif # if GTK_CHECK_VERSION(3, 20, 0) # include # else @@ -1047,7 +1052,7 @@ WindowRef CreateWindow(Window::Kind kind, WindowRef parentWindow) { void Open3DConnexion() {} void Close3DConnexion() {} -#if defined(HAVE_SPACEWARE) && defined(GDK_WINDOWING_X11) +#if defined(HAVE_SPACEWARE) && (defined(GDK_WINDOWING_X11) || defined(GDK_WINDOWING_WAYLAND)) static void ProcessSpnavEvent(WindowImplGtk *window, const spnav_event &spnavEvent, bool shiftDown, bool controlDown) { switch(spnavEvent.type) { case SPNAV_EVENT_MOTION: { @@ -1129,17 +1134,26 @@ void Request3DConnexionEventsForWindow(WindowRef window) { std::static_pointer_cast(window); Glib::RefPtr gdkWindow = windowImpl->gtkWindow.get_window(); - if(!GDK_IS_X11_DISPLAY(gdkWindow->get_display()->gobj())) { - return; +#if defined(GDK_WINDOWING_X11) + if(GDK_IS_X11_DISPLAY(gdkWindow->get_display()->gobj())) { + if(spnav_x11_open(gdk_x11_get_default_xdisplay(), + gdk_x11_window_get_xid(gdkWindow->gobj())) != -1) { + gdkWindow->add_filter(GdkSpnavFilter, windowImpl.get()); + } else if(spnav_open() != -1) { + g_io_add_watch(g_io_channel_unix_new(spnav_fd()), G_IO_IN, + ConsumeSpnavQueue, windowImpl.get()); + } } - - if(spnav_x11_open(gdk_x11_get_default_xdisplay(), - gdk_x11_window_get_xid(gdkWindow->gobj())) != -1) { - gdkWindow->add_filter(GdkSpnavFilter, windowImpl.get()); - } else if(spnav_open() != -1) { - g_io_add_watch(g_io_channel_unix_new(spnav_fd()), G_IO_IN, - ConsumeSpnavQueue, windowImpl.get()); +#endif +#if defined(GDK_WINDOWING_WAYLAND) + if(GDK_IS_WAYLAND_DISPLAY(gdkWindow->get_display()->gobj())) { + if(spnav_open() != -1) { + g_io_add_watch(g_io_channel_unix_new(spnav_fd()), G_IO_IN, + ConsumeSpnavQueue, windowImpl.get()); + } } +#endif + } #else void Request3DConnexionEventsForWindow(WindowRef window) {} From 1e7be8f21c123475bf790ecbbaeb077f7873fbfb Mon Sep 17 00:00:00 2001 From: Simon Wells Date: Sun, 24 Oct 2021 13:29:51 +1300 Subject: [PATCH 343/646] add gdk.h for GDK_WINDOWING_ defines --- src/platform/guigtk.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index 6afb9c724..1a11582e1 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -33,6 +33,7 @@ #if defined(HAVE_SPACEWARE) # include +# include # if defined(GDK_WINDOWING_X11) # include # endif From 168ba0a1a7aa833d261df0f59245401eb523a8a7 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Fri, 29 Oct 2021 21:06:42 +0200 Subject: [PATCH 344/646] CI: Replace edge releases with links to artifacts Re-creating the edge release for every push to master creates many superfluous release notifications. Stop creating those releases and provide users with direct links to the workflow artifacts instead via the nightly.link GitHub app (https://github.com/apps/nightly-link). Fixes #1103 --- .github/workflows/cd.yml | 42 +++------------------------------------- README.md | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 39 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 0d3b975cf..abfaba331 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -176,40 +176,10 @@ jobs: snap: ${{ steps.build.outputs.snap }} release: edge,beta - update_edge_release: - name: Update Edge Release - needs: [build_release_windows, build_release_windows_openmp, build_release_macos] - if: github.event_name == 'push' && !cancelled() - runs-on: ubuntu-latest - outputs: - upload_url: ${{ steps.create_release.outputs.upload_url }} - steps: - - name: Delete Old Edge Release - uses: dev-drprasad/delete-tag-and-release@v0.2.0 - with: - delete_release: true - tag_name: edge - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Wait - shell: bash - run: sleep 60 - - name: Create New Edge Release - id: create_release - uses: softprops/action-gh-release@35d938cf01f60fbe522917c81be1e892074f6ad6 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: edge - name: Edge - prerelease: true - draft: false - body: ${{ github.event.head_commit.message }} - upload_release_assets: name: Upload Release Assets - needs: [build_release_windows, build_release_windows_openmp, build_release_macos, update_edge_release] - if: "!cancelled()" + needs: [build_release_windows, build_release_windows_openmp, build_release_macos] + if: "!cancelled() && github.event_name == 'release'" runs-on: ubuntu-latest steps: - name: Download All Workflow Artifacts @@ -217,15 +187,9 @@ jobs: - name: Get Release Upload URL id: get_upload_url env: - event_name: ${{ github.event_name }} event: ${{ toJson(github.event) }} - edge_upload_url: ${{ needs.update_edge_release.outputs.upload_url }} run: | - if [ "$event_name" = "release" ]; then - upload_url=$(echo "$event" | jq -r ".release.upload_url") - else - upload_url="$edge_upload_url" - fi + upload_url=$(echo "$event" | jq -r ".release.upload_url") echo "::set-output name=upload_url::$upload_url" echo "Upload URL: $upload_url" - name: Upload solvespace.exe diff --git a/README.md b/README.md index b3c409475..e9a9d38d9 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,20 @@ 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!** +> They are intended for experienced users to test new features or verify bugfixes. + +Cutting edge builds from the latest master commit are available as zip archives from the +following links: + +- [macOS](https://nightly.link/solvespace/solvespace/workflows/cd/master/macos.zip) +- [Windows](https://nightly.link/solvespace/solvespace/workflows/cd/master/windows.zip) +- [Windows with OpenMP enabled](https://nightly.link/solvespace/solvespace/workflows/cd/master/windows-openmp.zip) + +Extract the downloaded archive and install or execute the contained file as is appropriate for your platform. + ### Via source code See below. From 1f017a99eee70fd6d45e113dd2f802bb3dd3161f Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 4 Nov 2021 17:52:25 +0200 Subject: [PATCH 345/646] GUI: Flexible vertical space above the toolbar If the main window is not high enough allow the default 32 pixel padding between the menu bar and the toolbar to shrink down to zero. This allows the main window height to be a minimum of 688 pixels (on Windows 10) so it is possible to capture 720P video tutorials. Fixes #1130 --- src/graphicswin.cpp | 2 +- src/toolbar.cpp | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index 17e04dce0..cac542ae1 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -430,7 +430,7 @@ void GraphicsWindow::Init() { using namespace std::placeholders; // Do this first, so that if it causes an onRender event we don't try to paint without // a canvas. - window->SetMinContentSize(720, 670); + window->SetMinContentSize(720, /*ToolbarDrawOrHitTest 636*/ 32 * 18 + 3 * 16 + 8 + 4); window->onClose = std::bind(&SolveSpaceUI::MenuFile, Command::EXIT); window->onRender = std::bind(&GraphicsWindow::Paint, this); window->onKeyboardEvent = std::bind(&GraphicsWindow::KeyboardEvent, this, _1); diff --git a/src/toolbar.cpp b/src/toolbar.cpp index bf6b59c59..74764883a 100644 --- a/src/toolbar.cpp +++ b/src/toolbar.cpp @@ -153,11 +153,18 @@ bool GraphicsWindow::ToolbarDrawOrHitTest(int mx, int my, UiCanvas *canvas, double width, height; window->GetContentSize(&width, &height); - int x = 17, y = (int)(height - 52); + int x = 17, y = (int)(height - 21); // 20 is the menu bar height - // When changing these values, also change the asReference drawing code in drawentity.cpp. + // When changing these values, also change the asReference drawing code in drawentity.cpp + // as well as the "window->SetMinContentSize(720, 636);" in graphicswin.cpp int fudge = 8; - int h = 32*18 + 3*16 + fudge; + int h = 32*18 + 3*16 + fudge; // Toolbar height = 18 icons * 32 pixels + 3 dividers * 16 pixels + fudge + + if(h < y) { + // If there is enough vertical space leave up to 32 pixels between the menu bar and the toolbar. + y -= ((y - h) < 32) ? y - h : 32; + } + int aleft = 0, aright = 66, atop = y+16+fudge/2, abot = y+16-h; bool withinToolbar = From 0e918bbc6a67e4ec4f8139ed20014db3d4d1b254 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 20 Nov 2021 16:13:03 -0500 Subject: [PATCH 346/646] fix STL linking issue. Model was disappearing after the link group. --- src/file.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/file.cpp b/src/file.cpp index c8989728f..0b5806c06 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -909,6 +909,8 @@ bool SolveSpaceUI::ReloadAllLinked(const Platform::Path &saveFile, bool canCance return false; } } + if(g.IsTriangleMeshAssembly()) + g.forceToMesh = true; } else if(linkMap.count(g.linkFile) == 0) { dbp("Missing file for group: %s", g.name.c_str()); // The file was moved; prompt the user for its new location. From 24186c0fc25589a6e659400e7924a233ba2b3aab Mon Sep 17 00:00:00 2001 From: Tom Sutcliffe Date: Sun, 5 Sep 2021 13:59:45 +0100 Subject: [PATCH 347/646] mac: Don't interpret single-touch scroll events as pan gestures To handle the Magic Mouse, whose single-finger touch gestures should be interpreted as scrollwheel events rather than pan gestures. --- src/platform/guimac.mm | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index 67d1eb976..91a197d39 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -372,6 +372,7 @@ @implementation SSView double rotationGestureCurrent; Point2d trackpadPositionShift; bool inTrackpadScrollGesture; + int numTouches; Platform::Window::Kind kind; } @@ -397,6 +398,8 @@ - (id)initWithKind:(Platform::Window::Kind)aKind { editor.action = @selector(didEdit:); inTrackpadScrollGesture = false; + numTouches = 0; + self.acceptsTouchEvents = YES; kind = aKind; if(kind == Platform::Window::Kind::TOPLEVEL) { NSGestureRecognizer *mag = [[NSMagnificationGestureRecognizer alloc] initWithTarget:self @@ -573,7 +576,9 @@ - (void)scrollWheel:(NSEvent *)nsEvent { using Platform::MouseEvent; MouseEvent event = [self convertMouseEvent:nsEvent]; - if(nsEvent.subtype == NSEventSubtypeTabletPoint && kind == Platform::Window::Kind::TOPLEVEL) { + // Check for number of touches to exclude single-finger scrolling on Magic Mouse + bool isTrackpadEvent = numTouches >= 2 && nsEvent.subtype == NSEventSubtypeTabletPoint; + if(isTrackpadEvent && kind == Platform::Window::Kind::TOPLEVEL) { // This is how Cocoa represents 2 finger trackpad drag gestures, rather than going via // NSPanGestureRecognizer which is how you might expect this to work... We complicate this // further by also handling shift-two-finger-drag to mean rotate. Fortunately we're using @@ -626,6 +631,23 @@ - (void)scrollWheel:(NSEvent *)nsEvent { receiver->onMouseEvent(event); } +- (void)touchesBeganWithEvent:(NSEvent *)event { + numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count; + [super touchesBeganWithEvent:event]; +} +- (void)touchesMovedWithEvent:(NSEvent *)event { + numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count; + [super touchesMovedWithEvent:event]; +} +- (void)touchesEndedWithEvent:(NSEvent *)event { + numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count; + [super touchesEndedWithEvent:event]; +} +- (void)touchesCancelledWithEvent:(NSEvent *)event { + numTouches = 0; + [super touchesCancelledWithEvent:event]; +} + - (void)mouseExited:(NSEvent *)nsEvent { using Platform::MouseEvent; From 6e31a56ca018883dd584dae9a7e15d5c7c094b90 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 12 Dec 2021 20:12:20 +0200 Subject: [PATCH 348/646] Update REAMDE.md - point IRC to Libera chat. ... change Solvespace.com URL to https. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e9a9d38d9..890e5b4c4 100644 --- a/README.md +++ b/README.md @@ -9,20 +9,20 @@ SolveSpace This repository contains the source code of [SolveSpace][], a parametric 2d/3d CAD. -[solvespace]: http://solvespace.com +[solvespace]: https://solvespace.com Community --------- The official SolveSpace [website][sswebsite] has [tutorials][sstutorial], [reference manual][ssref] and a [forum][ssforum]; there is also an official -IRC channel [#solvespace at irc.freenode.net][ssirc]. +IRC channel [#solvespace at web.libera.chat][ssirc]. [sswebsite]: http://solvespace.com/ [ssref]: http://solvespace.com/ref.pl [sstutorial]: http://solvespace.com/tutorial.pl [ssforum]: http://solvespace.com/forum.pl -[ssirc]: https://webchat.freenode.net/?channels=solvespace +[ssirc]: https://web.libera.chat/#solvespace Installation ------------ From 9a82aa3ef15e50c5469fdaf16c0124303941300f Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 16 Dec 2021 18:51:27 +0200 Subject: [PATCH 349/646] Fix hang when trying to display characters missing from the embedded font MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When SolveSpace tries to display an Unicode code point (e.g. U+EA00 ) that does not exist in the embedded vector font (unifont.hex.gz) it hangs in an endless loop in `const BitmapFont::Glyph &BitmapFont::GetGlyph(char32_t codepoint)`. The reason is that the binary search through the text file unifont-8.0.01.hex that does the "lazy loading" of glyphs does not end. Here is a short excerpt from the file: ``` D7FE:00007FFE63866DF66DEE6DDE63DE7FFE7FFE61866FBE638E6FBE6F867FFE0000 D7FF:00007FFE63866DF66DEE6DDE63DE7FFE7FFE61866FBE638E6FBE6FBE7FFE0000 F900:0080108810881FF8100800007FFE00000FF008100FF00810042002447FFE0000 F901:00047FFE008010841FFE10841FFC10841FFC10840880050003000CC0703E0000 ``` When searching for `0xEA00` after some iterations of the while loop https://github.com/solvespace/solvespace/blob/2450010bbfa20a1ffbf5fd90b85c4b941f56cb16/src/resource.cpp#L567 both `first` and `last` end up pointing to F900. After that on each consecutive iteration of the loop `last` ends up pointing to the LF (0x0A) just before F900 https://github.com/solvespace/solvespace/blob/2450010bbfa20a1ffbf5fd90b85c4b941f56cb16/src/resource.cpp#L585 and then `mid` ends up back on F900 here https://github.com/solvespace/solvespace/blob/2450010bbfa20a1ffbf5fd90b85c4b941f56cb16/src/resource.cpp#L570 and this will repeat enlessly. The solution is to do ``` first++; ``` here https://github.com/solvespace/solvespace/blob/2450010bbfa20a1ffbf5fd90b85c4b941f56cb16/src/resource.cpp#L591, which will make `first==last` and change whe while loop contition to `while(first < last) {` thiw will allow the while loop to exit. Tested with - 0xEA00 - non existent, not found in 16 iterations. - 0xF900 - exists but takes exactly 16 iterations of the binary search to finish - 0x0000 - found in 16 iterations - 0xFFFD - the replacement Unicode code point for non-existing glyphs. Also the end of the font. - 0xFFFFF - a codepoint beyond the end, not found and does not cause an exception The lazy parsing of the vector front was introduced here. https://github.com/solvespace/solvespace/commit/645c2d90ace3e48c639c49512fe1d7a43beb1755 Fixes #1150 --- src/resource.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/resource.cpp b/src/resource.cpp index 7b19081e1..258c73a40 100644 --- a/src/resource.cpp +++ b/src/resource.cpp @@ -564,7 +564,7 @@ const BitmapFont::Glyph &BitmapFont::GetGlyph(char32_t codepoint) { // Find the hex representation in the (sorted) Unifont file. auto first = unifontData.cbegin(), last = unifontData.cend(); - while(first <= last) { + while(first < last) { auto mid = first + (last - first) / 2; while(mid != unifontData.cbegin()) { if(*mid == '\n') { @@ -588,7 +588,10 @@ const BitmapFont::Glyph &BitmapFont::GetGlyph(char32_t codepoint) { if(foundCodepoint < codepoint) { first = mid + 1; while(first != unifontData.cend()) { - if(*first == '\n') break; + if(*first == '\n') { + first++; + break; + } first++; } continue; // and last stays the same From bf7bbfd8d63e7c470fc8faf5f5d5c3692175f6c2 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 22 Dec 2021 10:58:25 -0600 Subject: [PATCH 350/646] readme: remove outdated build instructions --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 890e5b4c4..c2daac037 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ is built as `build/bin/solvespace-cli`. It is possible to build only the command Ubuntu will require 20.04 or above. Cross-compiling with WSL is also confirmed to work. -You will need the usual build tools, CMake, a Windows cross-compiler, and flatc. On a Debian derivative (e.g. Ubuntu) these can be installed with: +You will need the usual build tools, CMake, and a Windows cross-compiler. On a Debian derivative (e.g. Ubuntu) these can be installed with: apt-get install git build-essential cmake mingw-w64 @@ -140,8 +140,7 @@ Build 64-bit SolveSpace with the following: mkdir build cd build cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake \ - -DCMAKE_BUILD_TYPE=Release \ - -DFLATC=$(which flatc) + -DCMAKE_BUILD_TYPE=Release make The graphical interface is built as `build/bin/solvespace.exe`, and the command-line interface From bc8148fd4fbc286461d43b811c7481624dc677c3 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 22 Dec 2021 11:07:09 -0600 Subject: [PATCH 351/646] readme: Clean up, fix nearly all markdownlint complaints --- README.md | 246 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 139 insertions(+), 107 deletions(-) diff --git a/README.md b/README.md index c2daac037..554e4fca7 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ +# SolveSpace + SolveSpace Logo -SolveSpace -========== [![Build Status](https://github.com/solvespace/solvespace/workflows/CD/badge.svg)](https://github.com/solvespace/solvespace/actions) [![solvespace](https://snapcraft.io/solvespace/badge.svg)](https://snapcraft.io/solvespace) [![solvespace](https://snapcraft.io/solvespace/trending.svg?name=0)](https://snapcraft.io/solvespace) @@ -11,8 +11,7 @@ This repository contains the source code of [SolveSpace][], a parametric [solvespace]: https://solvespace.com -Community ---------- +## Community The official SolveSpace [website][sswebsite] has [tutorials][sstutorial], [reference manual][ssref] and a [forum][ssforum]; there is also an official @@ -24,14 +23,13 @@ IRC channel [#solvespace at web.libera.chat][ssirc]. [ssforum]: http://solvespace.com/forum.pl [ssirc]: https://web.libera.chat/#solvespace -Installation ------------- +## Installation ### Via official binary packages -_Official_ release binary 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. +_Official_ release binary 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. [rel]: https://github.com/solvespace/solvespace/releases @@ -39,150 +37,177 @@ the SolveSpace maintainers for each stable release. Official releases can be installed from the `stable` channel. -Builds from master are automatically released to the `edge` channel in the Snap Store. Those packages contain the latest improvements, but receive less testing than release builds. +Builds from master are automatically released to the `edge` channel in the Snap +Store. Those packages contain the latest improvements, but receive less testing +than release builds. [![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/solvespace) Or install from a terminal: -``` +```sh # for the latest stable release: -snap install solvespace +snap install solvespace + # for the bleeding edge builds from master: 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. +_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!** +> :warning: **Edge builds might be unstable or contain severe bugs!** > They are intended for experienced users to test new features or verify bugfixes. -Cutting edge builds from the latest master commit are available as zip archives from the -following links: +Cutting edge builds from the latest master commit are available as zip archives +from the following links: - [macOS](https://nightly.link/solvespace/solvespace/workflows/cd/master/macos.zip) - [Windows](https://nightly.link/solvespace/solvespace/workflows/cd/master/windows.zip) - [Windows with OpenMP enabled](https://nightly.link/solvespace/solvespace/workflows/cd/master/windows-openmp.zip) -Extract the downloaded archive and install or execute the contained file as is appropriate for your platform. +Extract the downloaded archive and install or execute the contained file as is +appropriate for your platform. ### Via source code See below. -Building on Linux ------------------ +## Building on Linux ### Building for Linux -You will need the usual build tools, CMake, zlib, libpng, cairo, freetype. -To build the GUI, you will need fontconfig, gtkmm 3.0 (version 3.16 or later), pangomm 1.4, -OpenGL and OpenGL GLU, and optionally, the Space Navigator client library. -On a Debian derivative (e.g. Ubuntu) these can be installed with: +You will need the usual build tools, CMake, zlib, libpng, cairo, freetype. To +build the GUI, you will need fontconfig, gtkmm 3.0 (version 3.16 or later), +pangomm 1.4, OpenGL and OpenGL GLU, and optionally, the Space Navigator client +library. On a Debian derivative (e.g. Ubuntu) these can be installed with: - sudo apt install git build-essential cmake zlib1g-dev libpng-dev \ - libcairo2-dev libfreetype6-dev libjson-c-dev \ - libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev \ - libgl-dev libglu-dev libspnav-dev +```sh +sudo apt install git build-essential cmake zlib1g-dev libpng-dev \ + libcairo2-dev libfreetype6-dev libjson-c-dev \ + libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev \ + libgl-dev libglu-dev libspnav-dev +``` -On a Redhat derivative (e.g. Fedora) the dependencies can be installed with: +On a RedHat derivative (e.g. Fedora) the dependencies can be installed with: - sudo dnf install git gcc-c++ cmake zlib-devel libpng-devel \ - cairo-devel freetype-devel json-c-devel \ - fontconfig-devel gtkmm30-devel pangomm-devel \ - mesa-libGL-devel mesa-libGLU-devel libspnav-devel +```sh +sudo dnf install git gcc-c++ cmake zlib-devel libpng-devel \ + cairo-devel freetype-devel json-c-devel \ + fontconfig-devel gtkmm30-devel pangomm-devel \ + mesa-libGL-devel mesa-libGLU-devel libspnav-devel +``` Before building, check out the project and the necessary submodules: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init extlib/libdxfrw extlib/mimalloc +```sh +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init extlib/libdxfrw extlib/mimalloc +``` After that, build SolveSpace as following: - mkdir build - cd build - cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON - make - sudo make install +```sh +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON +make -Link Time Optimization is supported by adding -DENABLE_LTO=ON to cmake at the +# Optionally +sudo make install +``` + +Link Time Optimization is supported by adding `-DENABLE_LTO=ON` to cmake at the expense of longer build time. -The graphical interface is built as `build/bin/solvespace`, and the command-line interface -is built as `build/bin/solvespace-cli`. It is possible to build only the command-line interface by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation. +The graphical interface is built as `build/bin/solvespace`, and the command-line +interface is built as `build/bin/solvespace-cli`. It is possible to build only +the command-line interface by passing the `-DENABLE_GUI=OFF` flag to the cmake +invocation. ### Building for Windows -Ubuntu will require 20.04 or above. Cross-compiling with WSL is also confirmed to work. +Ubuntu will require 20.04 or above. Cross-compiling with WSL is also confirmed +to work. -You will need the usual build tools, CMake, and a Windows cross-compiler. On a Debian derivative (e.g. Ubuntu) these can be installed with: +You will need the usual build tools, CMake, and a Windows cross-compiler. On a +Debian derivative (e.g. Ubuntu) these can be installed with: - apt-get install git build-essential cmake mingw-w64 +```sh +apt-get install git build-essential cmake mingw-w64 +``` Before building, check out the project and the necessary submodules: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init +```sh +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init +``` Build 64-bit SolveSpace with the following: - mkdir build - cd build - cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake \ - -DCMAKE_BUILD_TYPE=Release - make +```sh +mkdir build +cd build +cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-mingw64.cmake \ + -DCMAKE_BUILD_TYPE=Release +make +``` -The graphical interface is built as `build/bin/solvespace.exe`, and the command-line interface -is built as `build/bin/solvespace-cli.exe`. +The graphical interface is built as `build/bin/solvespace.exe`, and the +command-line interface is built as `build/bin/solvespace-cli.exe`. Space Navigator support will not be available. -If using Ubuntu to cross-compile, Ubuntu 17.10 or newer (or, alternatively, MinGW from the Ubuntu -17.10 repositories) is required. - -Building on macOS ------------------ +## Building on macOS You will need git, XCode tools and CMake. Git and CMake can be installed via [Homebrew][]: - brew install git cmake +```sh +brew install git cmake +``` XCode has to be installed via AppStore or [the Apple website][appledeveloper]; it requires a free Apple ID. Before building, check out the project and the necessary submodules: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init +```sh +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init +``` After that, build SolveSpace as following: - mkdir build - cd build - cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON - make +```sh +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_OPENMP=ON +make +``` -Link Time Optimization is supported by adding -DENABLE_LTO=ON to cmake at the +Link Time Optimization is supported by adding `-DENABLE_LTO=ON` to cmake at the expense of longer build time. Alternatively, generate an XCode project, open it, and build the "Release" scheme: - mkdir build - cd build - cmake .. -G Xcode +```sh +mkdir build +cd build +cmake .. -G Xcode +``` The application is built in `build/bin/SolveSpace.app`, the graphical interface executable is `build/bin/SolveSpace.app/Contents/MacOS/SolveSpace`, and the command-line interface executable @@ -191,26 +216,32 @@ is `build/bin/SolveSpace.app/Contents/MacOS/solvespace-cli`. [homebrew]: https://brew.sh/ [appledeveloper]: https://developer.apple.com/download/ -Building on OpenBSD -------------------- +## Building on OpenBSD You will need git, cmake, libexecinfo, libpng, gtk3mm and pangomm. These can be installed from the ports tree: - pkg_add -U git cmake libexecinfo png json-c gtk3mm pangomm +```sh +pkg_add -U git cmake libexecinfo png json-c gtk3mm pangomm +``` Before building, check out the project and the necessary submodules: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init extlib/libdxfrw extlib/mimalloc +```sh +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init extlib/libdxfrw extlib/mimalloc +``` After that, build SolveSpace as following: - mkdir build - cd build - cmake .. -DCMAKE_BUILD_TYPE=Release - make +```sh +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release +make +sudo make install +``` Unfortunately, on OpenBSD, the produced executables are not filesystem location independent and must be installed before use. By default, the graphical interface is installed to @@ -218,8 +249,7 @@ and must be installed before use. By default, the graphical interface is install `/usr/local/bin/solvespace-cli`. It is possible to build only the command-line interface by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation. -Building on Windows -------------------- +## Building on Windows You will need [git][gitwin], [cmake][cmakewin] and a C++ compiler (either Visual C++ or MinGW). If using Visual C++, Visual Studio 2015 @@ -234,17 +264,19 @@ Visual C++ and build it. ### Building with Visual Studio in a command prompt -First, ensure that git and cl (the Visual C++ compiler driver) are in your +First, ensure that `git` and `cl` (the Visual C++ compiler driver) are in your `%PATH%`; the latter is usually done by invoking `vcvarsall.bat` from your Visual Studio install. Then, run the following in cmd or PowerShell: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init - mkdir build - cd build - cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release - nmake +```bat +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init +mkdir build +cd build +cmake .. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release +nmake +``` ### Building with MinGW @@ -254,25 +286,25 @@ Space Navigator support will be disabled. First, ensure that git and gcc are in your `$PATH`. Then, run the following in bash: - git clone https://github.com/solvespace/solvespace - cd solvespace - git submodule update --init - mkdir build - cd build - cmake .. -DCMAKE_BUILD_TYPE=Release - make +```sh +git clone https://github.com/solvespace/solvespace +cd solvespace +git submodule update --init +mkdir build +cd build +cmake .. -DCMAKE_BUILD_TYPE=Release +make +``` [gitwin]: https://git-scm.com/download/win [cmakewin]: http://www.cmake.org/download/#latest [mingw]: http://www.mingw.org/ -Contributing ------------- +## Contributing See the [guide for contributors](CONTRIBUTING.md) for the best way to file issues, contribute code, and debug SolveSpace. -License -------- +## License SolveSpace is distributed under the terms of the [GPL v3](COPYING.txt) or later. From cb5200d9903d70805645358f5ef3f949906a1fc3 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 22 Dec 2021 14:00:53 -0600 Subject: [PATCH 352/646] importidf: Fix uninitialized variable --- src/importidf.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/importidf.cpp b/src/importidf.cpp index 8ca3432a5..3cd501c85 100644 --- a/src/importidf.cpp +++ b/src/importidf.cpp @@ -332,8 +332,9 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s double board_thickness = 10.0; double scale = 1.0; //mm - bool topEntities, bottomEntities; - + bool topEntities = false; + bool bottomEntities = false; + Quaternion normal = Quaternion::From(Vector::From(1,0,0), Vector::From(0,1,0)); hEntity hnorm = newNormal(el, &entityCount, normal); From 4650222d2e89c72bb21d580a6f0f6afc0bd3ad1e Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 22 Dec 2021 17:06:28 -0600 Subject: [PATCH 353/646] Normalize namespaces: includes all at global/root namespace. Should improve the quality of suggestions, etc. we get from tooling. --- src/platform/gui.h | 2 ++ src/platform/platform.h | 4 +++- src/resource.h | 13 +++++++++++++ src/solvespace.h | 7 ++++--- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/platform/gui.h b/src/platform/gui.h index 1608a6f21..f63fa80b6 100644 --- a/src/platform/gui.h +++ b/src/platform/gui.h @@ -7,6 +7,7 @@ #ifndef SOLVESPACE_GUI_H #define SOLVESPACE_GUI_H +namespace SolveSpace { class RgbaColor; namespace Platform { @@ -386,5 +387,6 @@ void ExitGui(); void ClearGui(); } +} // namespace SolveSpace #endif diff --git a/src/platform/platform.h b/src/platform/platform.h index 21c2b2bfa..1ad5e1758 100644 --- a/src/platform/platform.h +++ b/src/platform/platform.h @@ -7,6 +7,7 @@ #ifndef SOLVESPACE_PLATFORM_H #define SOLVESPACE_PLATFORM_H +namespace SolveSpace { namespace Platform { // UTF-8 ⟷ UTF-16 conversion, for Windows. @@ -80,6 +81,7 @@ void DebugPrint(const char *fmt, ...); void *AllocTemporary(size_t size); void FreeAllTemporary(); -} +} // namespace Platform +} // namespace SolveSpace #endif diff --git a/src/resource.h b/src/resource.h index 18c1e5821..d5c2e3f06 100644 --- a/src/resource.h +++ b/src/resource.h @@ -7,11 +7,23 @@ #ifndef SOLVESPACE_RESOURCE_H #define SOLVESPACE_RESOURCE_H +#include +#include +#include +#include +#include +#include + +namespace SolveSpace { + class Camera; class Point2d; class Pixmap; class Vector; class RgbaColor; +namespace Platform { + class Path; +} // namespace Platform std::string LoadString(const std::string &name); std::string LoadStringFromGzip(const std::string &name); @@ -109,4 +121,5 @@ class VectorFont { const std::function &traceEdge, const Camera &camera); }; +} #endif diff --git a/src/solvespace.h b/src/solvespace.h index 8a922167f..7305b8a83 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -7,6 +7,10 @@ #ifndef SOLVESPACE_H #define SOLVESPACE_H +#include "resource.h" +#include "platform/platform.h" +#include "platform/gui.h" + #include #include #include @@ -122,9 +126,6 @@ static constexpr double LENGTH_EPS = 1e-6; static constexpr double VERY_POSITIVE = 1e10; static constexpr double VERY_NEGATIVE = -1e10; -#include "platform/platform.h" -#include "platform/gui.h" -#include "resource.h" using Platform::AllocTemporary; using Platform::FreeAllTemporary; From eca422a9211914f6ab1614f60df3b5a46926926c Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 22 Dec 2021 11:53:03 -0600 Subject: [PATCH 354/646] Clean up/simplify build --- CMakeLists.txt | 12 ++- src/CMakeLists.txt | 234 +++++++++++++++++++-------------------------- 2 files changed, 108 insertions(+), 138 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 38e1bcf7a..70a44e3b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,7 +8,7 @@ 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) @@ -56,7 +56,7 @@ 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") set(OPENGL 3 CACHE STRING "OpenGL version to use (one of: 1 3)") @@ -114,7 +114,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() @@ -281,7 +286,6 @@ if(ENABLE_GUI) elseif(APPLE) find_package(OpenGL REQUIRED) find_library(APPKIT_LIBRARY AppKit REQUIRED) - set(util_LIBRARIES ${APPKIT_LIBRARY}) else() find_package(OpenGL REQUIRED) find_package(SpaceWare) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7bc5a7cd1..612045758 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -19,32 +19,62 @@ 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}) +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,12 +83,7 @@ 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 @@ -72,70 +97,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 +104,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 +117,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 +169,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}) @@ -323,52 +259,82 @@ endif() if(ENABLE_GUI) add_executable(solvespace WIN32 MACOSX_BUNDLE ${solvespace_core_gl_SOURCES} - ${platform_SOURCES} + platform/entrygui.cpp $) add_dependencies(solvespace resources) target_link_libraries(solvespace + PRIVATE solvespace-core - ${OPENGL_LIBRARIES} - ${platform_LIBRARIES} - ${COVERAGE_LIBRARY}) + ${OPENGL_LIBRARIES}) + + # 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() - if(MSVC) - set_target_properties(solvespace PROPERTIES - LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF") + # 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_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 - platform/guinone.cpp - render/rendercairo.cpp) - add_library(solvespace-headless STATIC EXCLUDE_FROM_ALL ${solvespace_core_gl_SOURCES} - ${headless_SOURCES}) + platform/guinone.cpp + render/rendercairo.cpp) 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 +398,4 @@ if(APPLE) COMMENT "Bundling executable solvespace-cli" VERBATIM) endif() -endif() \ No newline at end of file +endif() From 5058208844bf96442466e86b5ef0b65d221862a7 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 22 Dec 2021 12:53:28 -0600 Subject: [PATCH 355/646] Fix CMake warnings --- CMakeLists.txt | 7 +++---- cmake/FindSpaceWare.cmake | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 70a44e3b6..00069cb76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,6 @@ endif() 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") diff --git a/cmake/FindSpaceWare.cmake b/cmake/FindSpaceWare.cmake index fb6073c32..451063c67 100644 --- a/cmake/FindSpaceWare.cmake +++ b/cmake/FindSpaceWare.cmake @@ -16,7 +16,7 @@ if(UNIX) # Support the REQUIRED and QUIET arguments, and set SPACEWARE_FOUND if found. include(FindPackageHandleStandardArgs) - FIND_PACKAGE_HANDLE_STANDARD_ARGS(SPACEWARE DEFAULT_MSG + find_package_handle_standard_args(SpaceWare DEFAULT_MSG SPACEWARE_LIBRARY SPACEWARE_INCLUDE_DIR) if(SPACEWARE_FOUND) From 5a90f0573d093a70ea4ed19efe47d3db9046cb3f Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Wed, 12 Apr 2017 23:29:41 +0700 Subject: [PATCH 356/646] SolveBySubstitution of linear complexity. --- src/sketch.h | 2 +- src/solvespace.h | 3 ++ src/system.cpp | 104 ++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 94 insertions(+), 15 deletions(-) diff --git a/src/sketch.h b/src/sketch.h index 812375f4f..dc5a19e4e 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -622,7 +622,7 @@ class Param { bool free; // Used only in the solver - hParam substd; + Param *substd; static const hParam NO_PARAM; diff --git a/src/solvespace.h b/src/solvespace.h index 7305b8a83..934a50648 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -291,6 +291,9 @@ class System { bool andFindBad = false, bool andFindFree = false); void Clear(); + Param *GetLastParamSubstitution(Param *p); + void SubstituteParamsByLast(Expr *e); + void SortSubstitutionByDragged(Param *p); }; #include "ttf.h" diff --git a/src/system.cpp b/src/system.cpp index 1119c3431..71712b79a 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -85,6 +85,60 @@ bool System::IsDragged(hParam p) { return false; } +Param *System::GetLastParamSubstitution(Param *p) { + Param *current = p; + while(current->substd != NULL) { + current = current->substd; + if(current == p) { + // Break the loop + current->substd = NULL; + break; + } + } + return current; +} + +void System::SortSubstitutionByDragged(Param *p) { + std::vector subsParams; + Param *by = NULL; + Param *current = p; + while(current != NULL) { + subsParams.push_back(current); + if(IsDragged(current->h)) { + by = current; + } + current = current->substd; + } + if(by == NULL) by = p; + for(Param *p : subsParams) { + if(p == by) continue; + p->substd = by; + p->tag = VAR_SUBSTITUTED; + } + by->substd = NULL; + by->tag = 0; +} + +void System::SubstituteParamsByLast(Expr *e) { + ssassert(e->op != Expr::Op::PARAM_PTR, "Expected an expression that refer to params via handles"); + + if(e->op == Expr::Op::PARAM) { + Param *p = param.FindByIdNoOops(e->parh); + if(p != NULL) { + Param *s = GetLastParamSubstitution(p); + if(s != NULL) { + e->parh = s->h; + } + } + } else { + int c = e->Children(); + if(c >= 1) { + SubstituteParamsByLast(e->a); + if(c >= 2) SubstituteParamsByLast(e->b); + } + } +} + void System::SolveBySubstitution() { for(auto &teq : eq) { Expr *tex = teq.e; @@ -102,26 +156,48 @@ 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; } } + + // + for(Param &p : param) { + SortSubstitutionByDragged(&p); + } + + // 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); + } } //----------------------------------------------------------------------------- @@ -485,7 +561,7 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad, for(auto &p : param) { double val; if(p.tag == VAR_SUBSTITUTED) { - val = param.FindById(p.substd)->val; + val = p.substd->val; } else { val = p.val; } From 5c0361bf5314497ed1fb45b1a9dd7ad22a630d0b Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Thu, 11 May 2017 20:53:12 +0700 Subject: [PATCH 357/646] Dof calculation when redundant is allowed. --- src/generate.cpp | 5 ++++- src/solvespace.h | 3 +-- src/system.cpp | 37 ++++++++++++++++++------------------- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/generate.cpp b/src/generate.cpp index ec8f82ebb..aaca6844d 100644 --- a/src/generate.cpp +++ b/src/generate.cpp @@ -550,8 +550,11 @@ void SolveSpaceUI::SolveGroup(hGroup hg, bool andFindFree) { } SolveResult SolveSpaceUI::TestRankForGroup(hGroup hg, int *rank) { - WriteEqSystemForGroup(hg); Group *g = SK.GetGroup(hg); + // If redundant is allowed, there is + // no point to solve rank because this result is not meaningful + if(g->allowRedundant) return SolveResult::OKAY; + WriteEqSystemForGroup(hg); SolveResult result = sys.SolveRank(g, rank); FreeAllTemporary(); return result; diff --git a/src/solvespace.h b/src/solvespace.h index 934a50648..da0b827bf 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -261,7 +261,7 @@ class System { static const double RANK_MAG_TOLERANCE, CONVERGE_TOLERANCE; int CalculateRank(); - bool TestRank(int *rank = NULL); + bool TestRank(int *dof = NULL); static bool SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS], double B[], int N); bool SolveLeastSquares(); @@ -279,7 +279,6 @@ class System { bool NewtonSolve(int tag); void MarkParamsFree(bool findFree); - int CalculateDof(); SolveResult Solve(Group *g, int *rank = NULL, int *dof = NULL, List *bad = NULL, diff --git a/src/system.cpp b/src/system.cpp index 71712b79a..baed79c97 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -242,10 +242,12 @@ int System::CalculateRank() { return rank; } -bool System::TestRank(int *rank) { +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; } @@ -498,9 +500,9 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad, 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 allowing redundant, we + // don't want to catch result of dof checking without substitution + if(g->allowRedundant || !forceDofCheck) { SolveBySubstitution(); } @@ -538,22 +540,20 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad, if(!WriteJacobian(0)) { return SolveResult::TOO_MANY_UNKNOWNS; } - - rankOk = TestRank(rank); + // Clear dof value in order to have indication when dof is actually not calculated + if(dof != NULL) *dof = -1; + // We are allowing redundant, so we no need to catch unsolveable + redundant + rankOk = (!g->allowRedundant) ? TestRank(dof) : true; // And do the leftovers as one big system if(!NewtonSolve(0)) { goto didnt_converge; } - rankOk = TestRank(rank); + rankOk = TestRank(dof); 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 @@ -610,11 +610,14 @@ SolveResult System::SolveRank(Group *g, int *rank, int *dof, List * return SolveResult::TOO_MANY_UNKNOWNS; } - bool rankOk = TestRank(rank); + bool rankOk = TestRank(dof); if(!rankOk) { - if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad, /*forceDofCheck=*/true); + // When we are testing with redundant allowed, we don't want to have additional info + // about redundants since this test is working only for single redundant constraint + if(!g->allowRedundant) { + if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad, true); + } } else { - if(dof) *dof = CalculateDof(); MarkParamsFree(andFindFree); } return rankOk ? SolveResult::OKAY : SolveResult::REDUNDANT_OKAY; @@ -649,7 +652,3 @@ void System::MarkParamsFree(bool find) { } } -int System::CalculateDof() { - return mat.n - mat.m; -} - From f42e94f8be467b2ddc153033ab75a58ba6dc7c5c Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Thu, 11 May 2017 20:55:41 +0700 Subject: [PATCH 358/646] Suppress dof calculation flag --- src/generate.cpp | 4 ++-- src/sketch.h | 1 + src/system.cpp | 15 ++++++++------- src/textscreens.cpp | 6 ++++++ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/generate.cpp b/src/generate.cpp index aaca6844d..fdb19b803 100644 --- a/src/generate.cpp +++ b/src/generate.cpp @@ -551,9 +551,9 @@ void SolveSpaceUI::SolveGroup(hGroup hg, bool andFindFree) { SolveResult SolveSpaceUI::TestRankForGroup(hGroup hg, int *rank) { Group *g = SK.GetGroup(hg); - // If redundant is allowed, there is + // 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->allowRedundant) return SolveResult::OKAY; + if(g->suppressDofCalculation || g->allowRedundant) return SolveResult::OKAY; WriteEqSystemForGroup(hg); SolveResult result = sys.SolveRank(g, rank); FreeAllTemporary(); diff --git a/src/sketch.h b/src/sketch.h index dc5a19e4e..33853d96d 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -175,6 +175,7 @@ class Group { bool suppress; bool relaxConstraints; bool allowRedundant; + bool suppressDofCalculation; bool allDimsReference; double scale; diff --git a/src/system.cpp b/src/system.cpp index baed79c97..f1a3f67c8 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -500,9 +500,9 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad, param.ClearTags(); eq.ClearTags(); - // Since we are allowing redundant, we - // don't want to catch result of dof checking without substitution - if(g->allowRedundant || !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(); } @@ -542,15 +542,16 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad, } // Clear dof value in order to have indication when dof is actually not calculated if(dof != NULL) *dof = -1; - // We are allowing redundant, so we no need to catch unsolveable + redundant - rankOk = (!g->allowRedundant) ? TestRank(dof) : true; + // 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(dof); + // 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 { @@ -614,7 +615,7 @@ SolveResult System::SolveRank(Group *g, int *rank, int *dof, List * if(!rankOk) { // 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->allowRedundant) { + if(!g->suppressDofCalculation && !g->allowRedundant) { if(andFindBad) FindWhichToRemoveToFixJacobian(g, bad, true); } } else { diff --git a/src/textscreens.cpp b/src/textscreens.cpp index 22553827b..ba5d977c3 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -261,6 +261,8 @@ void TextWindow::ScreenChangeGroupOption(int link, uint32_t v) { case 'e': g->allowRedundant = !(g->allowRedundant); break; + case 'D': g->suppressDofCalculation = !(g->suppressDofCalculation); break; + case 'v': g->visible = !(g->visible); break; case 'd': g->allDimsReference = !(g->allDimsReference); break; @@ -511,6 +513,10 @@ void TextWindow::ShowGroupInfo() { &TextWindow::ScreenChangeGroupOption, g->allowRedundant ? CHECK_TRUE : CHECK_FALSE); + Printf(false, " %f%LD%Fd%s suppress dof calculation (improves solver performance)", + &TextWindow::ScreenChangeGroupOption, + g->suppressDofCalculation ? CHECK_TRUE : CHECK_FALSE); + Printf(false, " %f%Ld%Fd%s treat all dimensions as reference", &TextWindow::ScreenChangeGroupOption, g->allDimsReference ? CHECK_TRUE : CHECK_FALSE); From 9c696bc790745fa70ff1fb7bfaa4f355cc4e293d Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Fri, 12 May 2017 09:39:07 +0700 Subject: [PATCH 359/646] Decrease WriteJacobian complexity --- src/expr.cpp | 20 +++++++++++++------- src/expr.h | 2 +- src/system.cpp | 35 +++++++++++++++++++++-------------- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/expr.cpp b/src/expr.cpp index 99d68ec4a..6030cb1cc 100644 --- a/src/expr.cpp +++ b/src/expr.cpp @@ -400,15 +400,21 @@ 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(List *list) const { + if(op == Op::PARAM || op == Op::PARAM_PTR) { + hParam param = (op == Op::PARAM) ? parh : parp->h; + for(hParam &p : *list) { + if(p.v == param.v) return; + } + list->Add(¶m); + 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 { diff --git a/src/expr.h b/src/expr.h index 7109cf651..efd44a589 100644 --- a/src/expr.h +++ b/src/expr.h @@ -70,7 +70,7 @@ class Expr { Expr *PartialWrt(hParam p) const; double Eval() const; - uint64_t ParamsUsed() const; + void ParamsUsedList(List *list) const; bool DependsOn(hParam p) const; static bool Tol(double a, double b); Expr *FoldConstants(); diff --git a/src/system.cpp b/src/system.cpp index f1a3f67c8..0cfa27df0 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -33,8 +33,14 @@ bool System::WriteJacobian(int tag) { } mat.n = j; - int i = 0; + // Fill the param id to index map + std::map paramToIndex; + for(int j = 0; j < mat.n; j++) { + paramToIndex[mat.param[j].v] = j; + } + int i = 0; + Expr *zero = Expr::From(0.0); for(auto &e : eq) { if(i >= MAX_UNKNOWNS) return false; @@ -45,21 +51,22 @@ bool System::WriteJacobian(int tag) { Expr *f = e.e->DeepCopyWithParamsAsPointers(¶m, &(SK.param)); f = f->FoldConstants(); - // Hash table (61 bits) to accelerate generation of zero partials. - uint64_t scoreboard = f->ParamsUsed(); for(j = 0; j < mat.n; j++) { - Expr *pd; - if(scoreboard & ((uint64_t)1 << (mat.param[j].v % 61)) && - f->DependsOn(mat.param[j])) - { - pd = f->PartialWrt(mat.param[j]); - pd = pd->FoldConstants(); - pd = pd->DeepCopyWithParamsAsPointers(¶m, &(SK.param)); - } else { - pd = Expr::From(0.0); - } - mat.A.sym[i][j] = pd; + mat.A.sym[i][j] = zero; + } + + List paramsUsed = {}; + f->ParamsUsedList(¶msUsed); + + for(hParam &p : paramsUsed) { + auto j = paramToIndex.find(p.v); + if(j == paramToIndex.end()) continue; + Expr *pd = f->PartialWrt(p); + pd = pd->FoldConstants(); + pd = pd->DeepCopyWithParamsAsPointers(¶m, &(SK.param)); + mat.A.sym[i][j->second] = pd; } + paramsUsed.Clear(); mat.B.sym[i] = f; i++; } From b20178a5a64493740defaae575c57f8d118ce29e Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Fri, 12 May 2017 10:02:33 +0700 Subject: [PATCH 360/646] Some optimization 1. We are making FoldConstants first, so we are copying less amount of data in DeepCopyWithParamsAsPointers. 2. Since we already perform DeepCopyWithParamsAsPointers, PartialWrt already produces params as pointers --- src/system.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/system.cpp b/src/system.cpp index 0cfa27df0..c93b0a16d 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -48,8 +48,8 @@ bool System::WriteJacobian(int tag) { continue; mat.eq[i] = e.h; - Expr *f = e.e->DeepCopyWithParamsAsPointers(¶m, &(SK.param)); - f = f->FoldConstants(); + Expr *f = e.e->FoldConstants(); + f = f->DeepCopyWithParamsAsPointers(¶m, &(SK.param)); for(j = 0; j < mat.n; j++) { mat.A.sym[i][j] = zero; @@ -63,7 +63,6 @@ bool System::WriteJacobian(int tag) { if(j == paramToIndex.end()) continue; Expr *pd = f->PartialWrt(p); pd = pd->FoldConstants(); - pd = pd->DeepCopyWithParamsAsPointers(¶m, &(SK.param)); mat.A.sym[i][j->second] = pd; } paramsUsed.Clear(); From 67facf86a709b5c4ccece874da492a1fb12f3568 Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Thu, 24 Jun 2021 11:29:24 -0500 Subject: [PATCH 361/646] Add a method to Expr. (Split out from earlier "Eigen library integration" commit) --- src/expr.cpp | 5 +++++ src/expr.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/expr.cpp b/src/expr.cpp index 6030cb1cc..b612dd231 100644 --- a/src/expr.cpp +++ b/src/expr.cpp @@ -430,6 +430,11 @@ bool Expr::DependsOn(hParam p) const { bool Expr::Tol(double a, double b) { return fabs(a - b) < 0.001; } + +bool Expr::IsZeroConst() const { + return op == Op::CONSTANT && EXACT(v == 0.0); +} + Expr *Expr::FoldConstants() { Expr *n = AllocExpr(); *n = *this; diff --git a/src/expr.h b/src/expr.h index efd44a589..d59930b89 100644 --- a/src/expr.h +++ b/src/expr.h @@ -73,6 +73,7 @@ class Expr { void ParamsUsedList(List *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); From 3ccdcdd95adf35f59f0cd4e0ed0a77dff02df8d5 Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Thu, 23 Dec 2021 10:14:27 -0600 Subject: [PATCH 362/646] Add an early out in writing jacobian. Split from previous large 'Eigen library integration' commit. --- src/system.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/system.cpp b/src/system.cpp index c93b0a16d..00f84c457 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -63,6 +63,8 @@ bool System::WriteJacobian(int tag) { if(j == paramToIndex.end()) continue; Expr *pd = f->PartialWrt(p); pd = pd->FoldConstants(); + if(pd->IsZeroConst()) + continue; mat.A.sym[i][j->second] = pd; } paramsUsed.Clear(); From 400f92abc579592a77982533741c3a1df5cb0e96 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 9 Dec 2019 12:09:41 -0600 Subject: [PATCH 363/646] Add Eigen submodule at 3.4.0 tag --- .gitmodules | 3 +++ extlib/eigen | 1 + 2 files changed, 4 insertions(+) create mode 160000 extlib/eigen diff --git a/.gitmodules b/.gitmodules index 71384a1a8..cf428974f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,3 +23,6 @@ [submodule "extlib/mimalloc"] path = extlib/mimalloc url = https://github.com/microsoft/mimalloc +[submodule "extlib/eigen"] + path = extlib/eigen + url = https://gitlab.com/libeigen/eigen.git diff --git a/extlib/eigen b/extlib/eigen new file mode 160000 index 000000000..3147391d9 --- /dev/null +++ b/extlib/eigen @@ -0,0 +1 @@ +Subproject commit 3147391d946bb4b6c68edd901f2add6ac1f31f8c From f01d8bf32653eeb4227dadf5088e149249677a50 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 2 Jan 2018 14:35:27 -0600 Subject: [PATCH 364/646] Add Eigen to build. --- CMakeLists.txt | 15 +++++++++++++++ src/CMakeLists.txt | 3 ++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 00069cb76..80bf90dce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,6 +57,9 @@ set(ENABLE_OPENMP OFF CACHE BOOL "Whether geometric operations will be parallelized using OpenMP") 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)") @@ -190,6 +193,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 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 612045758..d812eb764 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,7 +27,8 @@ target_include_directories(slvs_deps INTERFACE SYSTEM ${PNG_PNG_INCLUDE_DIR} ${FREETYPE_INCLUDE_DIRS} ${CAIRO_INCLUDE_DIRS} - ${MIMALLOC_INCLUDE_DIR}) + ${MIMALLOC_INCLUDE_DIR} + ${EIGEN3_INCLUDE_DIRS}) target_link_libraries(slvs_deps INTERFACE dxfrw ${ZLIB_LIBRARY} From 3c7ccd02ce20a5c0fb259fb66758ecbcc04cc037 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 13 Dec 2020 16:28:02 +0100 Subject: [PATCH 365/646] Add eigen extlib to install command --- .github/scripts/install-ubuntu.sh | 4 ++-- README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/scripts/install-ubuntu.sh b/.github/scripts/install-ubuntu.sh index 53f88b273..6033f7351 100755 --- a/.github/scripts/install-ubuntu.sh +++ b/.github/scripts/install-ubuntu.sh @@ -5,6 +5,6 @@ sudo apt-get update -qq sudo apt-get install -q -y \ zlib1g-dev libpng-dev libcairo2-dev libfreetype6-dev libjson-c-dev \ libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev libgl-dev \ - libgl-dev libglu-dev libspnav-dev + libgl-dev libglu-dev libspnav-dev -git submodule update --init extlib/libdxfrw extlib/mimalloc +git submodule update --init extlib/libdxfrw extlib/mimalloc extlib/eigen diff --git a/README.md b/README.md index 554e4fca7..9c29d381b 100644 --- a/README.md +++ b/README.md @@ -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: @@ -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: From 763097347c5c94ee6e524b6c967e56d85c6f3728 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Thu, 24 Jun 2021 12:10:31 +0200 Subject: [PATCH 366/646] Add missing eigen submodule in some scripts --- .github/scripts/install-macos.sh | 2 +- pkg/snap/snap/snapcraft.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/scripts/install-macos.sh b/.github/scripts/install-macos.sh index be4b13ac8..bb39bcd42 100755 --- a/.github/scripts/install-macos.sh +++ b/.github/scripts/install-macos.sh @@ -13,4 +13,4 @@ else brew install libomp fi -git submodule update --init extlib/cairo extlib/freetype extlib/libdxfrw extlib/libpng extlib/mimalloc extlib/pixman extlib/zlib +git submodule update --init extlib/cairo extlib/freetype extlib/libdxfrw extlib/libpng extlib/mimalloc extlib/pixman extlib/zlib extlib/eigen diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index 5fe5f7be6..84ed2b2e2 100644 --- a/pkg/snap/snap/snapcraft.yaml +++ b/pkg/snap/snap/snapcraft.yaml @@ -45,7 +45,7 @@ parts: 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 + git submodule update --init extlib/libdxfrw extlib/mimalloc extlib/eigen configflags: - -DCMAKE_INSTALL_PREFIX=/usr - -DCMAKE_BUILD_TYPE=Release From d7c5117c5da19e4350114311237c90c38b21ce90 Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Sun, 14 May 2017 11:23:04 +0700 Subject: [PATCH 367/646] Eigen library integration into solver. Co-authored-by: Ryan Pavlik Co-authored-by: Koen Schmeets --- CMakeLists.txt | 3 + src/solvespace.h | 35 ++++--- src/system.cpp | 231 ++++++++++++++++------------------------------- 3 files changed, 97 insertions(+), 172 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 80bf90dce..ecef9c5b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -185,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 "") diff --git a/src/solvespace.h b/src/solvespace.h index da0b827bf..5f3552e4f 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -34,6 +34,10 @@ #include #include +#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 @@ -233,37 +237,32 @@ class System { // The system Jacobian matrix struct { // The corresponding equation for each row - hEquation eq[MAX_UNKNOWNS]; + std::vector eq; // The corresponding parameter for each column - hParam param[MAX_UNKNOWNS]; + std::vector param; // We're solving AX = B int m, n; struct { - Expr *sym[MAX_UNKNOWNS][MAX_UNKNOWNS]; - double num[MAX_UNKNOWNS][MAX_UNKNOWNS]; - } A; - - double scale[MAX_UNKNOWNS]; - - // Some helpers for the least squares solve - double AAt[MAX_UNKNOWNS][MAX_UNKNOWNS]; - double Z[MAX_UNKNOWNS]; + Eigen::SparseMatrix *sym; + Eigen::SparseMatrix *num; + } A; - double X[MAX_UNKNOWNS]; + Eigen::VectorXd scale; + Eigen::VectorXd X; struct { - Expr *sym[MAX_UNKNOWNS]; - double num[MAX_UNKNOWNS]; - } B; + std::vector sym; + Eigen::VectorXd num; + } B; } mat; - static const double RANK_MAG_TOLERANCE, CONVERGE_TOLERANCE; + static const double CONVERGE_TOLERANCE; int CalculateRank(); bool TestRank(int *dof = NULL); - static bool SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS], - double B[], int N); + static bool SolveLinearSystem(const Eigen::SparseMatrix &A, + const Eigen::VectorXd &B, Eigen::VectorXd *X); bool SolveLeastSquares(); bool WriteJacobian(int tag); diff --git a/src/system.cpp b/src/system.cpp index 00f84c457..a33275328 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -8,30 +8,32 @@ //----------------------------------------------------------------------------- #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 // 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)); bool System::WriteJacobian(int tag) { + // Clear all + mat.param.clear(); + mat.eq.clear(); + mat.B.sym.clear(); - int j = 0; - for(auto &p : param) { - if(j >= MAX_UNKNOWNS) - return false; + for(Param &p : param) { + if(p.tag != tag) continue; + mat.param.push_back(p.h); + } + mat.n = mat.param.size(); - if(p.tag != tag) - continue; - mat.param[j] = p.h; - j++; + for(Equation &e : eq) { + if(e.tag != tag) continue; + mat.eq.push_back(&e); } - mat.n = j; + mat.m = mat.eq.size(); + delete mat.A.sym; + mat.A.sym = new Eigen::SparseMatrix(mat.m, mat.n); + mat.A.sym->reserve(Eigen::VectorXi::Constant(mat.n, 10)); // Fill the param id to index map std::map paramToIndex; @@ -39,22 +41,15 @@ bool System::WriteJacobian(int tag) { paramToIndex[mat.param[j].v] = j; } - int i = 0; - Expr *zero = Expr::From(0.0); - for(auto &e : eq) { - if(i >= MAX_UNKNOWNS) return false; - - if(e.tag != tag) - continue; - - mat.eq[i] = e.h; - Expr *f = e.e->FoldConstants(); + if(mat.eq.size() >= MAX_UNKNOWNS) { + return false; + } + for(size_t i = 0; i < mat.eq.size(); i++) { + Equation *e = mat.eq[i]; + if(e->tag != tag) continue; + Expr *f = e->e->FoldConstants(); f = f->DeepCopyWithParamsAsPointers(¶m, &(SK.param)); - for(j = 0; j < mat.n; j++) { - mat.A.sym[i][j] = zero; - } - List paramsUsed = {}; f->ParamsUsedList(¶msUsed); @@ -65,24 +60,28 @@ bool System::WriteJacobian(int tag) { pd = pd->FoldConstants(); if(pd->IsZeroConst()) continue; - mat.A.sym[i][j->second] = pd; + mat.A.sym->insert(i, j->second) = pd; } paramsUsed.Clear(); - mat.B.sym[i] = f; - i++; + 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; + delete mat.A.num; + mat.A.num = new Eigen::SparseMatrix(mat.m, mat.n); + int size = mat.A.sym->outerSize(); + + for(int k = 0; k < size; k++) { + for(SparseMatrix ::InnerIterator it(*mat.A.sym, k); it; ++it) { + double value = it.value()->Eval(); + if(EXACT(value == 0.0)) continue; + mat.A.num->insert(it.row(), it.col()) = value; } } + mat.A.num->makeCompressed(); } bool System::IsDragged(hParam p) { @@ -209,45 +208,15 @@ void System::SolveBySubstitution() { } //----------------------------------------------------------------------------- -// 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. +// Calculate the rank of the Jacobian matrix //----------------------------------------------------------------------------- int System::CalculateRank() { - // Actually work with magnitudes squared, not the magnitudes - double rowMag[MAX_UNKNOWNS] = {}; - double tol = RANK_MAG_TOLERANCE*RANK_MAG_TOLERANCE; - - int i, iprev, j; - int rank = 0; - - for(i = 0; i < mat.m; i++) { - // Subtract off this row's component in the direction of any - // previous rows - for(iprev = 0; iprev < i; iprev++) { - if(rowMag[iprev] <= tol) continue; // ignore zero rows - - double dot = 0; - for(j = 0; j < mat.n; j++) { - dot += (mat.A.num[iprev][j]) * (mat.A.num[i][j]); - } - for(j = 0; j < mat.n; j++) { - mat.A.num[i][j] -= (dot/rowMag[iprev])*mat.A.num[iprev][j]; - } - } - // Our row is now normal to all previous rows; calculate the - // magnitude of what's left - double mag = 0; - for(j = 0; j < mat.n; j++) { - mag += (mat.A.num[i][j]) * (mat.A.num[i][j]); - } - if(mag > tol) { - rank++; - } - rowMag[i] = mag; - } - - return rank; + using namespace Eigen; + if(mat.n == 0 || mat.m == 0) return 0; + SparseQR , COLAMDOrdering> solver; + solver.compute(*mat.A.num); + int result = solver.rank(); + return result; } bool System::TestRank(int *dof) { @@ -259,69 +228,25 @@ bool System::TestRank(int *dof) { return jacobianRank == mat.m; } -bool System::SolveLinearSystem(double X[], double A[][MAX_UNKNOWNS], - double B[], int n) +bool System::SolveLinearSystem(const Eigen::SparseMatrix &A, + const Eigen::VectorXd &B, Eigen::VectorXd *X) { - // Gaussian elimination, with partial pivoting. It's an error if the - // matrix is singular, because that means two constraints are - // equivalent. - int i, j, ip, jp, imax = 0; - double max, temp; - - for(i = 0; i < n; i++) { - // We are trying eliminate the term in column i, for rows i+1 and - // greater. First, find a pivot (between rows i and N-1). - max = 0; - for(ip = i; ip < n; ip++) { - if(fabs(A[ip][i]) > max) { - imax = ip; - max = fabs(A[ip][i]); - } - } - // Don't give up on a singular matrix unless it's really bad; the - // assumption code is responsible for identifying that condition, - // so we're not responsible for reporting that error. - if(fabs(max) < 1e-20) continue; - - // Swap row imax with row i - for(jp = 0; jp < n; jp++) { - swap(A[i][jp], A[imax][jp]); - } - swap(B[i], B[imax]); - - // For rows i+1 and greater, eliminate the term in column i. - for(ip = i+1; ip < n; ip++) { - temp = A[ip][i]/A[i][i]; - - for(jp = i; jp < n; jp++) { - A[ip][jp] -= temp*(A[i][jp]); - } - B[ip] -= temp*B[i]; - } - } - - // We've put the matrix in upper triangular form, so at this point we - // can solve by back-substitution. - for(i = n - 1; i >= 0; i--) { - if(fabs(A[i][i]) < 1e-20) continue; - - temp = B[i]; - for(j = n - 1; j > i; j--) { - temp -= X[j]*A[i][j]; - } - X[i] = temp / A[i][i]; - } - - return true; + if(A.outerSize() == 0) return true; + using namespace Eigen; + SparseQR, COLAMDOrdering> solver; + //SimplicialLDLT> solver; + solver.compute(A); + *X = solver.solve(B); + return (solver.info() == Success); } bool System::SolveLeastSquares() { - int r, c, i; - + using namespace Eigen; // Scale the columns; this scale weights the parameters for the least // squares solve, so that we can encourage the solver to make bigger // changes in some parameters, and smaller in others. - for(c = 0; c < mat.n; c++) { + mat.scale = VectorXd(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. @@ -329,31 +254,25 @@ bool System::SolveLeastSquares() { } else { mat.scale[c] = 1; } - for(r = 0; r < mat.m; r++) { - mat.A.num[r][c] *= mat.scale[c]; } - } - // 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]; + int size = mat.A.sym->outerSize(); + for(int k = 0; k < size; k++) { + for(SparseMatrix::InnerIterator it(*mat.A.num, k); it; ++it) { + it.valueRef() *= mat.scale[it.col()]; } - mat.AAt[r][c] = sum; } - } - if(!SolveLinearSystem(mat.Z, mat.AAt, mat.B.num, mat.m)) return false; + SparseMatrix AAt = *mat.A.num * mat.A.num->transpose(); + AAt.makeCompressed(); + VectorXd z(mat.n); - // And multiply that by A' to get our solution. - for(c = 0; c < mat.n; c++) { - double sum = 0; - for(i = 0; i < mat.m; i++) { - sum += mat.A.num[i][c]*mat.Z[i]; - } - mat.X[c] = sum * mat.scale[c]; + if(!SolveLinearSystem(AAt, mat.B.num, &z)) return false; + + mat.X = mat.A.num->transpose() * z; + + for(int c = 0; c < mat.n; c++) { + mat.X[c] *= mat.scale[c]; } return true; } @@ -365,6 +284,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(); } @@ -583,13 +503,12 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad, didnt_converge: SK.constraint.ClearTags(); - // Not using range-for here because index is used in additional ways - for(i = 0; i < eq.n; i++) { + for(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 @@ -637,6 +556,10 @@ void System::Clear() { param.Clear(); eq.Clear(); dragged.Clear(); + delete mat.A.num; + mat.A.num = NULL; + delete mat.A.sym; + mat.A.sym = NULL; } void System::MarkParamsFree(bool find) { From 4320ec1a0d2e33c44dc85511c77f1e31e893092c Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Sun, 8 Aug 2021 15:13:30 -0500 Subject: [PATCH 368/646] Use unique_ptr in main system jacobian. --- src/solvespace.h | 8 +++++--- src/system.cpp | 15 +++++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/solvespace.h b/src/solvespace.h index 5f3552e4f..3aa716401 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -36,7 +36,7 @@ #define EIGEN_NO_DEBUG #undef Success -#include "Eigen/SparseCore" +#include // We declare these in advance instead of simply using FT_Library // (defined as typedef FT_LibraryRec_* FT_Library) because including @@ -245,14 +245,16 @@ class System { // We're solving AX = B int m, n; struct { - Eigen::SparseMatrix *sym; - Eigen::SparseMatrix *num; + // This only observes the Expr - does not own them! + std::unique_ptr> sym; + std::unique_ptr> num; } A; Eigen::VectorXd scale; Eigen::VectorXd X; struct { + // This only observes the Expr - does not own them! std::vector sym; Eigen::VectorXd num; } B; diff --git a/src/system.cpp b/src/system.cpp index a33275328..5003376f8 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -8,6 +8,8 @@ //----------------------------------------------------------------------------- #include "solvespace.h" +#include +#include #include // The solver will converge all unknowns to within this tolerance. This must @@ -31,8 +33,7 @@ bool System::WriteJacobian(int tag) { mat.eq.push_back(&e); } mat.m = mat.eq.size(); - delete mat.A.sym; - mat.A.sym = new Eigen::SparseMatrix(mat.m, mat.n); + mat.A.sym.reset(new Eigen::SparseMatrix(mat.m, mat.n)); mat.A.sym->reserve(Eigen::VectorXi::Constant(mat.n, 10)); // Fill the param id to index map @@ -70,8 +71,7 @@ bool System::WriteJacobian(int tag) { void System::EvalJacobian() { using namespace Eigen; - delete mat.A.num; - mat.A.num = new Eigen::SparseMatrix(mat.m, mat.n); + mat.A.num.reset(new Eigen::SparseMatrix(mat.m, mat.n)); int size = mat.A.sym->outerSize(); for(int k = 0; k < size; k++) { @@ -503,6 +503,7 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad, didnt_converge: SK.constraint.ClearTags(); + // Not using range-for here because index is used in additional ways for(i = 0; i < mat.eq.size(); i++) { if(fabs(mat.B.num[i]) > CONVERGE_TOLERANCE || IsReasonable(mat.B.num[i])) { // This constraint is unsatisfied. @@ -556,10 +557,8 @@ void System::Clear() { param.Clear(); eq.Clear(); dragged.Clear(); - delete mat.A.num; - mat.A.num = NULL; - delete mat.A.sym; - mat.A.sym = NULL; + mat.A.num.reset(); + mat.A.sym.reset(); } void System::MarkParamsFree(bool find) { From 527b5bbc2002608a0bca134960de7c367837593a Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 24 May 2021 22:38:18 +0200 Subject: [PATCH 369/646] Fix loop type --- src/system.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/system.cpp b/src/system.cpp index 5003376f8..0cdf8a37c 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -411,17 +411,17 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad, { WriteEquationsExceptFor(Constraint::NO_CONSTRAINT, g); - int i; bool rankOk; /* + int x; dbp("%d equations", eq.n); - for(i = 0; i < eq.n; i++) { - dbp(" %.3f = %s = 0", eq[i].e->Eval(), eq[i].e->Print()); + for(x = 0; x < eq.n; x++) { + dbp(" %.3f = %s = 0", eq[x].e->Eval(), eq[x].e->Print()); } dbp("%d parameters", param.n); - for(i = 0; i < param.n; i++) { - dbp(" param %08x at %.3f", param[i].h.v, param[i].val); + for(x = 0; x < param.n; x++) { + dbp(" param %08x at %.3f", param[x].h.v, param[x].val); } */ // All params and equations are assigned to group zero. @@ -504,7 +504,7 @@ SolveResult System::Solve(Group *g, int *rank, int *dof, List *bad, didnt_converge: SK.constraint.ClearTags(); // Not using range-for here because index is used in additional ways - for(i = 0; i < mat.eq.size(); 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]->h.isFromConstraint()) continue; From eee647babc1d8bc3d263927dc1a4b80adbd20377 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Dec 2021 11:17:40 -0600 Subject: [PATCH 370/646] Banish an unneeded use of our custom containers. --- src/expr.cpp | 11 +++++++---- src/expr.h | 2 +- src/system.cpp | 7 +++++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/expr.cpp b/src/expr.cpp index b612dd231..d5ed87b58 100644 --- a/src/expr.cpp +++ b/src/expr.cpp @@ -400,13 +400,16 @@ Expr *Expr::PartialWrt(hParam p) const { ssassert(false, "Unexpected operation"); } -void Expr::ParamsUsedList(List *list) const { +void Expr::ParamsUsedList(std::vector *list) const { if(op == Op::PARAM || op == Op::PARAM_PTR) { + // leaf: just add ourselves if we aren't already there hParam param = (op == Op::PARAM) ? parh : parp->h; - for(hParam &p : *list) { - if(p.v == param.v) return; + 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->Add(¶m); + list->push_back(param); return; } diff --git a/src/expr.h b/src/expr.h index d59930b89..7eef4e005 100644 --- a/src/expr.h +++ b/src/expr.h @@ -70,7 +70,7 @@ class Expr { Expr *PartialWrt(hParam p) const; double Eval() const; - void ParamsUsedList(List *list) const; + void ParamsUsedList(std::vector *list) const; bool DependsOn(hParam p) const; static bool Tol(double a, double b); bool IsZeroConst() const; diff --git a/src/system.cpp b/src/system.cpp index 0cdf8a37c..cc89d7f2a 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -45,13 +45,16 @@ bool System::WriteJacobian(int tag) { if(mat.eq.size() >= MAX_UNKNOWNS) { return false; } + std::vector paramsUsed; + // A single possibly-too-large allocation is probably preferred here? + 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; Expr *f = e->e->FoldConstants(); f = f->DeepCopyWithParamsAsPointers(¶m, &(SK.param)); - List paramsUsed = {}; + paramsUsed.clear(); f->ParamsUsedList(¶msUsed); for(hParam &p : paramsUsed) { @@ -63,7 +66,7 @@ bool System::WriteJacobian(int tag) { continue; mat.A.sym->insert(i, j->second) = pd; } - paramsUsed.Clear(); + paramsUsed.clear(); mat.B.sym.push_back(f); } return true; From 72fd858985263bfbbaf95650d6a9fadf03523ede Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Dec 2021 11:37:33 -0600 Subject: [PATCH 371/646] Don't hold the sparse matrices in a pointer at all. --- src/solvespace.h | 4 ++-- src/system.cpp | 40 ++++++++++++++++++++-------------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/solvespace.h b/src/solvespace.h index 3aa716401..83b868f36 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -246,8 +246,8 @@ class System { int m, n; struct { // This only observes the Expr - does not own them! - std::unique_ptr> sym; - std::unique_ptr> num; + Eigen::SparseMatrix sym; + Eigen::SparseMatrix num; } A; Eigen::VectorXd scale; diff --git a/src/system.cpp b/src/system.cpp index cc89d7f2a..b0cb63f9c 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -8,7 +8,6 @@ //----------------------------------------------------------------------------- #include "solvespace.h" -#include #include #include @@ -20,6 +19,7 @@ bool System::WriteJacobian(int tag) { // Clear all mat.param.clear(); mat.eq.clear(); + mat.A.sym.setZero(); mat.B.sym.clear(); for(Param &p : param) { @@ -33,8 +33,8 @@ bool System::WriteJacobian(int tag) { mat.eq.push_back(&e); } mat.m = mat.eq.size(); - mat.A.sym.reset(new Eigen::SparseMatrix(mat.m, mat.n)); - mat.A.sym->reserve(Eigen::VectorXi::Constant(mat.n, 10)); + mat.A.sym.resize(mat.m, mat.n); + mat.A.sym.reserve(Eigen::VectorXi::Constant(mat.n, 10)); // Fill the param id to index map std::map paramToIndex; @@ -64,7 +64,7 @@ bool System::WriteJacobian(int tag) { pd = pd->FoldConstants(); if(pd->IsZeroConst()) continue; - mat.A.sym->insert(i, j->second) = pd; + mat.A.sym.insert(i, j->second) = pd; } paramsUsed.clear(); mat.B.sym.push_back(f); @@ -74,25 +74,25 @@ bool System::WriteJacobian(int tag) { void System::EvalJacobian() { using namespace Eigen; - mat.A.num.reset(new Eigen::SparseMatrix(mat.m, mat.n)); - int size = mat.A.sym->outerSize(); + mat.A.num.setZero(); + mat.A.num.resize(mat.m, mat.n); + const int size = mat.A.sym.outerSize(); for(int k = 0; k < size; k++) { - for(SparseMatrix ::InnerIterator it(*mat.A.sym, k); it; ++it) { + for(SparseMatrix ::InnerIterator it(mat.A.sym, k); it; ++it) { double value = it.value()->Eval(); if(EXACT(value == 0.0)) continue; - mat.A.num->insert(it.row(), it.col()) = value; + mat.A.num.insert(it.row(), it.col()) = value; } } - mat.A.num->makeCompressed(); + 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; - } - return false; + const auto b = dragged.begin(); + const auto e = dragged.end(); + return e != std::find(b, e, p); } Param *System::GetLastParamSubstitution(Param *p) { @@ -217,7 +217,7 @@ int System::CalculateRank() { using namespace Eigen; if(mat.n == 0 || mat.m == 0) return 0; SparseQR , COLAMDOrdering> solver; - solver.compute(*mat.A.num); + solver.compute(mat.A.num); int result = solver.rank(); return result; } @@ -259,20 +259,20 @@ bool System::SolveLeastSquares() { } } - int size = mat.A.sym->outerSize(); + int size = mat.A.sym.outerSize(); for(int k = 0; k < size; k++) { - for(SparseMatrix::InnerIterator it(*mat.A.num, k); it; ++it) { + for(SparseMatrix::InnerIterator it(mat.A.num, k); it; ++it) { it.valueRef() *= mat.scale[it.col()]; } } - SparseMatrix AAt = *mat.A.num * mat.A.num->transpose(); + SparseMatrix AAt = mat.A.num * mat.A.num.transpose(); AAt.makeCompressed(); VectorXd z(mat.n); if(!SolveLinearSystem(AAt, mat.B.num, &z)) return false; - mat.X = mat.A.num->transpose() * z; + mat.X = mat.A.num.transpose() * z; for(int c = 0; c < mat.n; c++) { mat.X[c] *= mat.scale[c]; @@ -560,8 +560,8 @@ void System::Clear() { param.Clear(); eq.Clear(); dragged.Clear(); - mat.A.num.reset(); - mat.A.sym.reset(); + mat.A.num.setZero(); + mat.A.sym.setZero(); } void System::MarkParamsFree(bool find) { From e0319765cb335ad69cb615ca69094d0409ebef30 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Dec 2021 11:47:02 -0600 Subject: [PATCH 372/646] Fix formatting --- src/system.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/system.cpp b/src/system.cpp index b0cb63f9c..873a8c967 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -257,14 +257,14 @@ bool System::SolveLeastSquares() { } else { mat.scale[c] = 1; } - } + } int size = mat.A.sym.outerSize(); for(int k = 0; k < size; k++) { for(SparseMatrix::InnerIterator it(mat.A.num, k); it; ++it) { it.valueRef() *= mat.scale[it.col()]; - } } + } SparseMatrix AAt = mat.A.num * mat.A.num.transpose(); AAt.makeCompressed(); From df77831f3373a6e356ccca67b66a9253792441fe Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Dec 2021 11:47:50 -0600 Subject: [PATCH 373/646] Small simplifications --- src/system.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/system.cpp b/src/system.cpp index 873a8c967..d131f1191 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -15,6 +15,8 @@ // 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(); @@ -34,7 +36,7 @@ bool System::WriteJacobian(int tag) { } mat.m = mat.eq.size(); mat.A.sym.resize(mat.m, mat.n); - mat.A.sym.reserve(Eigen::VectorXi::Constant(mat.n, 10)); + mat.A.sym.reserve(Eigen::VectorXi::Constant(mat.n, LikelyPartialCountPerEq)); // Fill the param id to index map std::map paramToIndex; @@ -46,11 +48,13 @@ bool System::WriteJacobian(int tag) { return false; } std::vector paramsUsed; - // A single possibly-too-large allocation is probably preferred here? + // In some experimenting, this is almost always the right size. + // Value is usually between 0 and 20, comes from number of constraints? mat.B.sym.reserve(mat.eq.size()); for(size_t i = 0; i < mat.eq.size(); i++) { Equation *e = mat.eq[i]; if(e->tag != tag) continue; + // Simplify (fold) then deep-copy the current equation. Expr *f = e->e->FoldConstants(); f = f->DeepCopyWithParamsAsPointers(¶m, &(SK.param)); @@ -58,13 +62,17 @@ bool System::WriteJacobian(int tag) { f->ParamsUsedList(¶msUsed); for(hParam &p : paramsUsed) { - auto j = paramToIndex.find(p.v); - if(j == paramToIndex.end()) continue; + // 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->second) = pd; + mat.A.sym.insert(i, j) = pd; } paramsUsed.clear(); mat.B.sym.push_back(f); @@ -248,14 +256,12 @@ bool System::SolveLeastSquares() { // 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. - mat.scale = VectorXd(mat.n); + 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; + mat.scale[c] = 1 / 20.0; } } From 8d05172fed109c73cb9737fbbde5b1d12446322a Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 31 Dec 2021 15:05:17 -0500 Subject: [PATCH 374/646] Increase MAX_UNKNOWNS in the solver from 1024 to 2048 --- src/solvespace.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solvespace.h b/src/solvespace.h index 83b868f36..1c22db629 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -215,7 +215,7 @@ void Error(const char *fmt, ...); class System { public: - enum { MAX_UNKNOWNS = 1024 }; + enum { MAX_UNKNOWNS = 2048 }; EntityList entity; ParamList param; From f7d2b92d6dd0a14b0e3d8a5f4d2bee03df312ea6 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 1 Jan 2022 15:18:27 -0500 Subject: [PATCH 375/646] Update README.md --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 9c29d381b..36742c78a 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,9 @@ IRC channel [#solvespace at web.libera.chat][ssirc]. ## Installation -### Via official binary packages +### Via Official Packages -_Official_ release binary packages for macOS (>=10.6 64-bit) and Windows +_Official_ release packages for macOS (>=10.6 64-bit) and Windows (>=Vista 32-bit) are available via [GitHub releases][rel]. These packages are automatically built by the SolveSpace maintainers for each stable release. @@ -53,15 +53,6 @@ snap install solvespace snap install solvespace --edge ``` -### Via third-party binary packages - -_Third-party_ nightly binary packages for Debian and Ubuntu are available via -[notesalexp.org][notesalexp]. These packages are automatically built from -non-released source code. The SolveSpace maintainers do not control the contents -of these packages and cannot guarantee their functionality. - -[notesalexp]: https://notesalexp.org/packages/en/source/solvespace/ - ### Via automated edge builds > :warning: **Edge builds might be unstable or contain severe bugs!** @@ -77,6 +68,15 @@ from the following links: Extract the downloaded archive and install or execute the contained file as is appropriate for your platform. +### Via third-party packages + +_Third-party_ nightly binary packages for Debian and Ubuntu are available via +[notesalexp.org][notesalexp]. These packages are automatically built from +non-released source code. The SolveSpace maintainers do not control the contents +of these packages and cannot guarantee their functionality. + +[notesalexp]: https://notesalexp.org/packages/en/source/solvespace/ + ### Via source code See below. From 0930bed73bc8eec0390074d443400583e39dda40 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 2 Jan 2022 01:56:03 +0100 Subject: [PATCH 376/646] Fix build by removing unused var (and accepting new apple terms and conditions) --- src/system.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/system.cpp b/src/system.cpp index d131f1191..a39f69a5a 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -97,7 +97,6 @@ void System::EvalJacobian() { } bool System::IsDragged(hParam p) { - hParam *pp; const auto b = dragged.begin(); const auto e = dragged.end(); return e != std::find(b, e, p); From 74335b175d682351f6275c3173058d513b6eed80 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 2 Jan 2022 13:56:14 +0100 Subject: [PATCH 377/646] Try to fix snap release by adding libcairo2-dev dependency --- pkg/snap/snap/snapcraft.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index 84ed2b2e2..9695538e3 100644 --- a/pkg/snap/snap/snapcraft.yaml +++ b/pkg/snap/snap/snapcraft.yaml @@ -56,6 +56,7 @@ parts: build-packages: - zlib1g-dev - libpng-dev + - libcairo2-dev - libfreetype6-dev - libjson-c-dev - libgl-dev From e8cd6e79f13ee1013c20d91de9f2bd8cd8ceae38 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Sun, 2 Jan 2022 20:04:57 +0100 Subject: [PATCH 378/646] CMake Fixes + Snap port to core20 (#1174) * CMake: use PROJECT_VERSION instead of solvespace_*_VERSION In 006539b, solvespace_MAJOR_VERSION etc. were removed. However, these variables were still referenced in some places. Solution: Use PROJECT_VERSION instead. * CMake: re-add link directories for solvespace target 006539b removed the call to link_directories for gtkmm, jsonc & fontconfig. This leads to linking errors if those libraries are in "non-standard" paths. Fix this by introducing a target specific target_link_directories call. Fixes #1173 * snap: port to core20 & adapt to CMake changes Moving to core20 was long overdue anyway, and the recent CMake changes necessitated some fixes. Also switch to LZO compression for (way) better cold start performance. --- cmake/MacOSXBundleInfo.plist.in | 4 ++-- pkg/snap/snap/snapcraft.yaml | 37 +++++++++++++++++++-------------- res/win32/versioninfo.rc.in | 8 +++---- src/CMakeLists.txt | 8 +++++-- src/config.h.in | 2 +- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/cmake/MacOSXBundleInfo.plist.in b/cmake/MacOSXBundleInfo.plist.in index 668d1f7ed..1bf29a485 100644 --- a/cmake/MacOSXBundleInfo.plist.in +++ b/cmake/MacOSXBundleInfo.plist.in @@ -15,9 +15,9 @@ CFBundlePackageType APPL CFBundleVersion - ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR}~${solvespace_GIT_HASH} + ${PROJECT_VERSION}~${solvespace_GIT_HASH} CFBundleShortVersionString - ${solvespace_VERSION_MAJOR}.${solvespace_VERSION_MINOR} + ${PROJECT_VERSION} NSHumanReadableCopyright © 2008-2016 Jonathan Westhues and other authors NSPrincipalClass diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index 9695538e3..949c43b6f 100644 --- a/pkg/snap/snap/snapcraft.yaml +++ b/pkg/snap/snap/snapcraft.yaml @@ -1,5 +1,5 @@ name: solvespace -base: core18 +base: core20 summary: Parametric 2d/3d CAD adopt-info: solvespace description: | @@ -14,6 +14,7 @@ description: | confinement: strict license: GPL-3.0 +compression: lzo layout: /usr/share/solvespace: @@ -23,13 +24,11 @@ apps: solvespace: command: usr/bin/solvespace desktop: solvespace.desktop - extensions: [gnome-3-34] + extensions: [gnome-3-38] plugs: [opengl, unity7, home, removable-media, gsettings, network] - environment: - __EGL_VENDOR_LIBRARY_DIRS: $SNAP/gnome-platform/usr/share/glvnd/egl_vendor.d:$SNAP/usr/share/glvnd/egl_vendor.d cli: command: usr/bin/solvespace-cli - extensions: [gnome-3-34] + extensions: [gnome-3-38] plugs: [home, removable-media, network] parts: @@ -39,20 +38,24 @@ 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 extlib/eigen - 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 @@ -63,7 +66,6 @@ parts: - libsigc++-2.0-dev - libspnav-dev - git - - g++ stage-packages: - libspnav0 - libsigc++-2.0-0v5 @@ -71,11 +73,14 @@ parts: cleanup: after: [solvespace] plugin: nil - build-snaps: [core18, gnome-3-34-1804] + build-snaps: [gnome-3-38-2004] override-prime: | - # Remove all files from snap that are already included in the base snap or in - # any connected content snaps set -eux - for snap in "core18" "gnome-3-34-1804"; do # List all content-snaps and base snaps you're using here - cd "/snap/$snap/current" && find . -type f,l -exec rm -f "$SNAPCRAFT_PRIME/{}" \; + for snap in "gnome-3-38-2004"; do # List all content-snaps you're using here + cd "/snap/$snap/current" && find . -type f,l -exec rm -f "$SNAPCRAFT_PRIME/{}" "$SNAPCRAFT_PRIME/usr/{}" \; + done + for cruft in bug lintian man; do + rm -rf $SNAPCRAFT_PRIME/usr/share/$cruft done + find $SNAPCRAFT_PRIME/usr/share/doc/ -type f -not -name 'copyright' -delete + find $SNAPCRAFT_PRIME/usr/share -type d -empty -delete diff --git a/res/win32/versioninfo.rc.in b/res/win32/versioninfo.rc.in index e6e90056a..ba50233d5 100644 --- a/res/win32/versioninfo.rc.in +++ b/res/win32/versioninfo.rc.in @@ -1,6 +1,6 @@ 1 VERSIONINFO -FILEVERSION ${solvespace_VERSION_MAJOR},${solvespace_VERSION_MINOR},0,0 -PRODUCTVERSION ${solvespace_VERSION_MAJOR},${solvespace_VERSION_MINOR},0,0 +FILEVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},0,0 +PRODUCTVERSION ${PROJECT_VERSION_MAJOR},${PROJECT_VERSION_MINOR},0,0 FILEFLAGSMASK 0 FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 @@ -13,9 +13,9 @@ 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" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d812eb764..a6af09a95 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -88,7 +88,7 @@ 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) @@ -204,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} @@ -308,6 +308,10 @@ if(ENABLE_GUI) ${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} diff --git a/src/config.h.in b/src/config.h.in index 144c46d04..5a125f4e9 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -1,7 +1,7 @@ #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@" /* Non-OS X *nix only */ #define UNIX_DATADIR "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATAROOTDIR@/solvespace" From dc5a3b6bb5ae3601743654ab09a4230b25aaf714 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Sun, 2 Jan 2022 20:50:02 +0100 Subject: [PATCH 379/646] snap: add g++ as build package (#1175) It got dropped in 34efb6de77 by mistake. --- pkg/snap/snap/snapcraft.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index 949c43b6f..b01b25cff 100644 --- a/pkg/snap/snap/snapcraft.yaml +++ b/pkg/snap/snap/snapcraft.yaml @@ -66,6 +66,7 @@ parts: - libsigc++-2.0-dev - libspnav-dev - git + - g++ stage-packages: - libspnav0 - libsigc++-2.0-0v5 From 1c777a178bf542e50480ed35579d8d675644a7c4 Mon Sep 17 00:00:00 2001 From: luzpaz Date: Tue, 4 Jan 2022 05:28:19 -0500 Subject: [PATCH 380/646] Fix various typos (#1178) Found via `codespell -q 3 -S ./res/locales,./extlib -L asign,ba,hsi,mata,pinter,tothe,wser` Co-authored-by: Maximilian Federle --- src/importmesh.cpp | 4 ++-- src/ttf.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/importmesh.cpp b/src/importmesh.cpp index df9a65bfc..4b7e343a5 100644 --- a/src/importmesh.cpp +++ b/src/importmesh.cpp @@ -10,7 +10,7 @@ #define MIN_POINT_DISTANCE 0.001 -// we will check for duplicate verticies and keep all their normals +// we will check for duplicate vertices and keep all their normals class vertex { public: Vector p; @@ -171,7 +171,7 @@ 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()); BBox box = {}; box.minp = verts[0].p; diff --git a/src/ttf.cpp b/src/ttf.cpp index ddb2aa175..e39afc795 100644 --- a/src/ttf.cpp +++ b/src/ttf.cpp @@ -11,7 +11,7 @@ #include FT_ADVANCES_H /* Yecch. Irritatingly, you need to do this nonsense to get the error string table, - since nobody thought to put this exact function into FreeType itsself. */ + since nobody thought to put this exact function into FreeType itself. */ #undef __FTERRORS_H__ #define FT_ERRORDEF(e, v, s) { (e), (s) }, #define FT_ERROR_START_LIST From a3191568651b1bff2cad8b067a130704431e47a2 Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 4 Jan 2022 12:14:50 +0200 Subject: [PATCH 381/646] Win32: Update the year in the Windows version resource --- res/win32/versioninfo.rc.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/res/win32/versioninfo.rc.in b/res/win32/versioninfo.rc.in index ba50233d5..1aba0522d 100644 --- a/res/win32/versioninfo.rc.in +++ b/res/win32/versioninfo.rc.in @@ -18,7 +18,7 @@ BEGIN 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 From a007b0b8b448f689a6be9c7e88bfcd4e5c168198 Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 4 Jan 2022 12:16:21 +0200 Subject: [PATCH 382/646] Update the year in the About dialog --- src/solvespace.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 787688719..132ad85a4 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -1053,7 +1053,7 @@ 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; default: ssassert(false, "Unexpected menu ID"); From 524075a551807d8ddde2a28af1dfc20798ae2fa6 Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 6 Jan 2022 14:58:33 +0200 Subject: [PATCH 383/646] Load 16bit PNG images correctly by re-scaling to 8bit Fixes #1110 --- src/resource.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/resource.cpp b/src/resource.cpp index 258c73a40..d3fa4caab 100644 --- a/src/resource.cpp +++ b/src/resource.cpp @@ -179,7 +179,8 @@ void Pixmap::ConvertTo(Format newFormat) { static std::shared_ptr ReadPngIntoPixmap(png_struct *png_ptr, png_info *info_ptr, bool flip) { - png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_GRAY_TO_RGB, NULL); + png_read_png(png_ptr, info_ptr, + PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_GRAY_TO_RGB | PNG_TRANSFORM_SCALE_16, NULL); std::shared_ptr pixmap = std::make_shared(); pixmap->width = png_get_image_width(png_ptr, info_ptr); From c01c7a4e3b77a2227f7bec54c08951965eda256a Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 6 Jan 2022 12:37:12 +0200 Subject: [PATCH 384/646] Hide edit boxes before closing the property browser. When the text window/property browser is closed while and edit box is active its window remained open. This is incorrect and probably causes a hang on Linux described in #1168. So hide the edit control when closing. --- src/textwin.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/textwin.cpp b/src/textwin.cpp index d0755b07d..b68c06808 100644 --- a/src/textwin.cpp +++ b/src/textwin.cpp @@ -235,6 +235,7 @@ void TextWindow::Init() { using namespace std::placeholders; window->onClose = []() { + SS.TW.HideEditControl(); SS.GW.showTextWindow = false; SS.GW.EnsureValidActives(); }; From c7ac2e8ece979ffb6f813811ea6682ed7b17856e Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Dec 2021 13:06:24 -0600 Subject: [PATCH 385/646] Fix which outer size we use. Should be the same right now, but this is clearer. --- src/system.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/system.cpp b/src/system.cpp index a39f69a5a..c513796f6 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -264,7 +264,7 @@ bool System::SolveLeastSquares() { } } - int size = mat.A.sym.outerSize(); + const int size = mat.A.num.outerSize(); for(int k = 0; k < size; k++) { for(SparseMatrix::InnerIterator it(mat.A.num, k); it; ++it) { it.valueRef() *= mat.scale[it.col()]; From 3658c67f864461d5c368cd61cb5d99a86735f74a Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 7 Jan 2022 00:17:57 +0200 Subject: [PATCH 386/646] Make all points shown in the Property Browser into active links This makes all points explorable/selectable and fixes #165 partially. This is a clean implementation that follows the style of the UI code for the text window. Previous unmerged attempts from the above issue are: https://github.com/Evil-Spirit/solvespace-master/commit/eb3db32059bc5b3a4264aba7524ea1cd3e39b8f3 https://github.com/wpwrak/solvespace/commit/782a5bbbe61c0a1e5326d55218de33e6a7682f26 https://github.com/wpwrak/solvespace/commit/a77cedbfd8dedd147fb59ebf9af936f4259ff31b https://github.com/wpwrak/solvespace/commit/41e55b3d79f7d2df61fb9db0b494ff09a37d6add --- src/describescreen.cpp | 56 ++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/src/describescreen.cpp b/src/describescreen.cpp index 2c36d9881..9dfdac963 100644 --- a/src/describescreen.cpp +++ b/src/describescreen.cpp @@ -69,12 +69,16 @@ 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_STR_NO_LINK "(%Fi%s%Fd, %Fi%s%Fd, %Fi%s%Fd)" #define PT_AS_NUM "(%Fi%3%E, %Fi%3%E, %Fi%3%E)" +#define 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" switch(e->type) { case Entity::Type::POINT_IN_3D: case Entity::Type::POINT_IN_2D: @@ -83,7 +87,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,7 +108,7 @@ 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)); @@ -114,10 +118,10 @@ void TextWindow::DescribeSelection() { 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 +141,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 +164,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 +179,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 +319,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 +333,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,19 +344,19 @@ 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)); @@ -363,11 +367,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(); @@ -400,12 +404,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); From 16adb649791d3c7c9a56f9d7d5a0d87f60e07313 Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 7 Jan 2022 01:04:07 +0200 Subject: [PATCH 387/646] Make vectors/normals shown in the Property Browser into active links This makes appropriate vectors/normals explorable/selectable and closes #165. This is a clean implementation that follows the style of the UI code for the text window. Previous unmerged attempts from the above issue are: https://github.com/Evil-Spirit/solvespace-master/commit/eb3db32059bc5b3a4264aba7524ea1cd3e39b8f3 https://github.com/wpwrak/solvespace/commit/782a5bbbe61c0a1e5326d55218de33e6a7682f26 https://github.com/wpwrak/solvespace/commit/a77cedbfd8dedd147fb59ebf9af936f4259ff31b https://github.com/wpwrak/solvespace/commit/41e55b3d79f7d2df61fb9db0b494ff09a37d6add --- src/describescreen.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/describescreen.cpp b/src/describescreen.cpp index 9dfdac963..d2f94503d 100644 --- a/src/describescreen.cpp +++ b/src/describescreen.cpp @@ -74,11 +74,14 @@ void TextWindow::DescribeSelection() { SS.MmToString((p).y).c_str(), \ SS.MmToString((p).z).c_str() #define PT_AS_STR_NO_LINK "(%Fi%s%Fd, %Fi%s%Fd, %Fi%s%Fd)" -#define PT_AS_NUM "(%Fi%3%E, %Fi%3%E, %Fi%3%E)" +#define PT_AS_NUM "(%Fi%3%Fd, %Fi%3%Fd, %Fi%3%Fd)" #define COSTR(e, p) \ e->h, (&TextWindow::ScreenSelectEntity), (&TextWindow::ScreenHoverEntity), \ COSTR_NO_LINK(p) #define PT_AS_STR "%Ll%D%f%h" PT_AS_STR_NO_LINK "%E" +#define CO_LINK(e, p) e->h, (&TextWindow::ScreenSelectEntity), (&TextWindow::ScreenHoverEntity), CO(p) +#define PT_AS_NUM_LINK "%Ll%D%f%h" PT_AS_NUM "%E" + switch(e->type) { case Entity::Type::POINT_IN_3D: case Entity::Type::POINT_IN_2D: @@ -111,7 +114,7 @@ void TextWindow::DescribeSelection() { 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: { @@ -359,7 +362,7 @@ void TextWindow::DescribeSelection() { 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) { @@ -390,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); From f2eec2e3bd011b431162b3f490c1032565ae3f1a Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Sat, 8 Jan 2022 09:25:57 -0600 Subject: [PATCH 388/646] Add some gitignore stuff --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 4f76b2668..59755d77c 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,8 @@ /obj-*/ /*.slvs .vscode/ + +# Visual Studio +out/ +.vs/ +CMakeSettings.json From a8a40b3ca16beab58a7ed65df03af72fd0868e33 Mon Sep 17 00:00:00 2001 From: herrgahr <0xfd000000@gmail.com> Date: Sun, 9 Jan 2022 13:09:50 +0100 Subject: [PATCH 389/646] CMake: use git rev-parse to get GIT_COMMIT_HASH The old approach of reading .git/HEAD does not work when using git worktrees, where the folder layout looks roughly like: solvespace.git/ - bare clone (.git dir) solvespace.git/work - example worktree containing master solvespage.git/worktrees/work/ - .git dir of worktree solvespage.git/worktrees/work/HEAD - actual HEAD ref for master First attempt was to just get GIT_ROOT from `git rev-parse --git-dir` but that wasn't enough, since: 1. GIT_ROOT points to solvespage.git/worktrees/work/ 2. GIT_ROOT/HEAD points to refs/heads/master 3. GIT_ROOT/refs/heads/master does not exist but the old implementation would want to use this to get the sha so we need two invocations of git rev-parse 1. `git rev-parse --git-dir` to get GIT_DIR needed for setting GIT_DEPENDS 2. `git rev-parse HEAD` to get the sha of the worktree's HEAD --- cmake/GetGitCommitHash.cmake | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/cmake/GetGitCommitHash.cmake b/cmake/GetGitCommitHash.cmake index f67a844a4..674c7a0d2 100644 --- a/cmake/GetGitCommitHash.cmake +++ b/cmake/GetGitCommitHash.cmake @@ -1,31 +1,11 @@ function(get_git_commit_hash) - get_filename_component(GIT_DESCRIBE_CMAKE_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) - get_filename_component(GIT_ROOT ${GIT_DESCRIBE_CMAKE_DIR} PATH) - set(GIT_DIR "${GIT_ROOT}/.git") + execute_process(COMMAND git rev-parse --git-dir OUTPUT_VARIABLE GIT_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) + execute_process(COMMAND git rev-parse HEAD OUTPUT_VARIABLE HEAD_REF OUTPUT_STRIP_TRAILING_WHITESPACE) # Add a CMake configure dependency to the currently checked out revision. set(GIT_DEPENDS ${GIT_DIR}/HEAD) - file(READ ${GIT_DIR}/HEAD HEAD_REF) - if(HEAD_REF MATCHES "ref: (.+)\n") - set(HEAD_REF ${CMAKE_MATCH_1}) - if(EXISTS "${GIT_DIR}/${HEAD_REF}") - list(APPEND GIT_DEPENDS ${GIT_DIR}/${HEAD_REF}) - file(READ ${GIT_DIR}/${HEAD_REF} HEAD_REF) - elseif(EXISTS "${GIT_DIR}/packed-refs") - list(APPEND GIT_DEPENDS ${GIT_DIR}/packed-refs) - file(READ "${GIT_DIR}/packed-refs" PACKED_REFS) - if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") - set(HEAD_REF ${CMAKE_MATCH_1}) - else() - set(HEAD_REF "") - endif() - else() - set(HEAD_REF "") - endif() - endif() set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${GIT_DEPENDS}) - string(STRIP ${HEAD_REF} HEAD_REF) if(HEAD_REF STREQUAL "") message(WARNING "Cannot determine git HEAD") else() From 872cdd1aca02a788e090ab361cac78ffde4ab2e2 Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 13 Jan 2022 12:41:49 +0200 Subject: [PATCH 390/646] Revert "CMake: use git rev-parse to get GIT_COMMIT_HASH" This reverts commit f1e47e6554b469ebe2cbac849e6264a3012e4c31. Since unfortunately it breaks the addition of the git commit hash to the version string when building from the VisualStudio IDE. I presume this happens because `git` is not of the "path" of the build environment. The version string ends up "3.0~" only. --- cmake/GetGitCommitHash.cmake | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/cmake/GetGitCommitHash.cmake b/cmake/GetGitCommitHash.cmake index 674c7a0d2..f67a844a4 100644 --- a/cmake/GetGitCommitHash.cmake +++ b/cmake/GetGitCommitHash.cmake @@ -1,11 +1,31 @@ function(get_git_commit_hash) - execute_process(COMMAND git rev-parse --git-dir OUTPUT_VARIABLE GIT_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) - execute_process(COMMAND git rev-parse HEAD OUTPUT_VARIABLE HEAD_REF OUTPUT_STRIP_TRAILING_WHITESPACE) + get_filename_component(GIT_DESCRIBE_CMAKE_DIR ${CMAKE_CURRENT_LIST_FILE} PATH) + get_filename_component(GIT_ROOT ${GIT_DESCRIBE_CMAKE_DIR} PATH) + set(GIT_DIR "${GIT_ROOT}/.git") # Add a CMake configure dependency to the currently checked out revision. set(GIT_DEPENDS ${GIT_DIR}/HEAD) + file(READ ${GIT_DIR}/HEAD HEAD_REF) + if(HEAD_REF MATCHES "ref: (.+)\n") + set(HEAD_REF ${CMAKE_MATCH_1}) + if(EXISTS "${GIT_DIR}/${HEAD_REF}") + list(APPEND GIT_DEPENDS ${GIT_DIR}/${HEAD_REF}) + file(READ ${GIT_DIR}/${HEAD_REF} HEAD_REF) + elseif(EXISTS "${GIT_DIR}/packed-refs") + list(APPEND GIT_DEPENDS ${GIT_DIR}/packed-refs) + file(READ "${GIT_DIR}/packed-refs" PACKED_REFS) + if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") + set(HEAD_REF ${CMAKE_MATCH_1}) + else() + set(HEAD_REF "") + endif() + else() + set(HEAD_REF "") + endif() + endif() set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${GIT_DEPENDS}) + string(STRIP ${HEAD_REF} HEAD_REF) if(HEAD_REF STREQUAL "") message(WARNING "Cannot determine git HEAD") else() From c9b1d23a3dc4b4c87c9f58a01e0fd5ef6cacdbe0 Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 13 Jan 2022 19:48:46 +0200 Subject: [PATCH 391/646] UI: Add a link to the GitHub commit in the Help menu The "Go to GitHub commit" item in the Help menu opens the URL https://github.com/solvespace/solvespace/commits/5efc148 and allows the user to see the date of the commit that SolveSpace was built from. Closes #1172 --- src/config.h.in | 1 + src/graphicswin.cpp | 1 + src/solvespace.cpp | 4 ++++ src/ui.h | 1 + 4 files changed, 7 insertions(+) diff --git a/src/config.h.in b/src/config.h.in index 5a125f4e9..187b9cbce 100644 --- a/src/config.h.in +++ b/src/config.h.in @@ -2,6 +2,7 @@ #define SOLVESPACE_CONFIG_H #define PACKAGE_VERSION "@PROJECT_VERSION@~@solvespace_GIT_HASH@" +#define GIT_HASH_URL "https://github.com/solvespace/solvespace/commit/@solvespace_GIT_HASH@" /* Non-OS X *nix only */ #define UNIX_DATADIR "@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_DATAROOTDIR@/solvespace" diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index cac542ae1..c7c74d98b 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -183,6 +183,7 @@ const MenuEntry Menu[] = { { 0, N_("&Help"), Command::NONE, 0, KN, mHelp }, { 1, N_("&Language"), Command::LOCALE, 0, KN, mHelp }, { 1, N_("&Website / Manual"), Command::WEBSITE, 0, KN, mHelp }, +{ 1, N_("&Go to GitHub commit"), Command::GITHUB, 0, KN, mHelp }, #ifndef __APPLE__ { 1, N_("&About"), Command::ABOUT, 0, KN, mHelp }, #endif diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 132ad85a4..a8d1a151e 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -1056,6 +1056,10 @@ void SolveSpaceUI::MenuHelp(Command id) { PACKAGE_VERSION, 2022); break; + case Command::GITHUB: + Platform::OpenInBrowser(GIT_HASH_URL); + break; + default: ssassert(false, "Unexpected menu ID"); } } diff --git a/src/ui.h b/src/ui.h index 21b00cd46..0d121b64f 100644 --- a/src/ui.h +++ b/src/ui.h @@ -172,6 +172,7 @@ enum class Command : uint32_t { // Help LOCALE, WEBSITE, + GITHUB, ABOUT, }; From c0f04393b8b19712c9740e11c3fd9297cb5d9a01 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 16 Jan 2022 22:10:43 +0200 Subject: [PATCH 392/646] Update CHANGELOG.md --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76eb5283c..7f6a4af0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,17 @@ Sketching: MISC: +* Add a link to the GitHub commit from which SolveSpace was built in the Help + menu. +* Make all points, vectors and normals shown in the Property Browser into + active links. This makes them explorable and selectable. +* Load 16bit PNG images correctly by re-scaling to 8bit. +* Fixed hang when trying to display characters missing from the embedded font. +* The main window vertical size can be as small as the toolbar. +* Configurable "SafeHeight" parameter instead of the fixed 5mm for G-code export. +* Add Spanish / Argentina translation. +* Move "perspective factor", "lighting direction" and "explode distance" from + the "configuration" screen to the "view" screen. * Add a "∆" suffix to groups which have "force to triangle mesh" ticked * Gray the group name in the text window for groups with suppressed solid model. * Added the ability to Link STL files. @@ -30,6 +41,10 @@ MISC: Performance: +* Speed up sketches with many constraints by roughly 8x by using the Eigen + library in the solver. The maximum unknowns increased from 1024 to 2048. +* Add a "suppress dof calculation" setting to groups - increases performance for + complex sketches. * More changes to the ID list implementation. 3.0 From b9e9e2dd34df99ab4e3fd60136d94992ab81a5f6 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 1 Jan 2022 14:44:08 -0500 Subject: [PATCH 393/646] add normals to linked STLs --- src/importmesh.cpp | 96 ++++++++++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 34 deletions(-) diff --git a/src/importmesh.cpp b/src/importmesh.cpp index 4b7e343a5..7b5bf438f 100644 --- a/src/importmesh.cpp +++ b/src/importmesh.cpp @@ -47,7 +47,7 @@ static void addUnique(std::vector &lv, Vector &p, Vector &n) { }; // Make a new point - type doesn't matter since we will make a copy later -static hEntity newPoint(EntityList *el, int id, Vector p) { +static hEntity newPoint(EntityList *el, int *id, Vector p) { Entity en = {}; en.type = Entity::Type::POINT_N_COPY; en.extraPoints = 0; @@ -59,7 +59,8 @@ static hEntity newPoint(EntityList *el, int id, Vector p) { en.actVisible = true; en.forceHidden = false; - en.h.v = id + en.group.v*65536; + en.h.v = *id + en.group.v*65536; + *id = *id+1; el->Add(&en); return en.h; } @@ -67,12 +68,34 @@ static hEntity newPoint(EntityList *el, int id, Vector p) { // check if a vertex is unique and add it via newPoint if it is. static void addVertex(EntityList *el, Vector v) { if(el->n < 15000) { - int id = el->n+2; - newPoint(el, id, v); + int id = el->n; + newPoint(el, &id, v); } } -static hEntity newLine(EntityList *el, int id, hEntity p0, hEntity p1) { +static hEntity newNormal(EntityList *el, int *id, Quaternion normal, hEntity p) { + // normals have parameters, but we don't need them to make a NORMAL_N_COPY from this + Entity en = {}; + en.type = Entity::Type::NORMAL_N_COPY; + en.extraPoints = 0; + en.timesApplied = 0; + en.group.v = 472; + en.actNormal = normal; + en.construction = false; + en.style.v = Style::NORMALS; + // to be visible we need to add a point. +// en.point[0] = newPoint(el, id, Vector::From(0,0,0)); + en.point[0] = p; + en.actVisible = true; + en.forceHidden = false; + + *id = *id+1; + en.h.v = *id + en.group.v*65536; + el->Add(&en); + return en.h; +} + +static hEntity newLine(EntityList *el, int *id, hEntity p0, hEntity p1) { Entity en = {}; en.type = Entity::Type::LINE_SEGMENT; en.point[0] = p0; @@ -85,7 +108,8 @@ static hEntity newLine(EntityList *el, int id, hEntity p0, hEntity p1) { en.actVisible = true; en.forceHidden = false; - en.h.v = id + en.group.v*65536; + en.h.v = *id + en.group.v*65536; + *id = *id + 1; el->Add(&en); return en.h; } @@ -115,9 +139,6 @@ bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s float x,y,z; float xn,yn,zn; - //add the STL origin as an entity - addVertex(el, Vector::From(0.0, 0.0, 0.0)); - std::vector verts = {}; for(uint32_t i = 0; in+2; - p[0] = newPoint(el, id++, Vector::From(box.minp.x, box.minp.y, box.minp.z)); - p[1] = newPoint(el, id++, Vector::From(box.maxp.x, box.minp.y, box.minp.z)); - p[2] = newPoint(el, id++, Vector::From(box.minp.x, box.maxp.y, box.minp.z)); - p[3] = newPoint(el, id++, Vector::From(box.maxp.x, box.maxp.y, box.minp.z)); - p[4] = newPoint(el, id++, Vector::From(box.minp.x, box.minp.y, box.maxp.z)); - p[5] = newPoint(el, id++, Vector::From(box.maxp.x, box.minp.y, box.maxp.z)); - p[6] = newPoint(el, id++, Vector::From(box.minp.x, box.maxp.y, box.maxp.z)); - p[7] = newPoint(el, id++, Vector::From(box.maxp.x, box.maxp.y, box.maxp.z)); - - 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[0], p[4]); - newLine(el, id++, p[1], p[5]); - newLine(el, id++, p[2], p[6]); - newLine(el, id++, p[3], p[7]); + 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[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]); for(unsigned int i=0; i Date: Mon, 24 Jan 2022 19:19:00 +0200 Subject: [PATCH 394/646] README: add libomp dependency for building on macOS --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 36742c78a..14bb49ffc 100644 --- a/README.md +++ b/README.md @@ -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]; From 5905fed25ec261a1bd7e292579c9839cecbf06ed Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 27 Jan 2022 13:20:35 -0500 Subject: [PATCH 395/646] Check for text STL when linking (#1197) * Check for text STL when linking * Use memcmp in STL import when checking for ASCII format * Add message box for unsupported STL file type. Co-authored-by: ruevs --- src/importmesh.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/importmesh.cpp b/src/importmesh.cpp index 7b5bf438f..f06a8f1b9 100644 --- a/src/importmesh.cpp +++ b/src/importmesh.cpp @@ -130,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; From d8205b1ddda5a328525a35ea68605db50a80ae85 Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 1 Feb 2022 16:28:52 +0200 Subject: [PATCH 396/646] Translations update Two new strings: "&Go to GitHub commit" "Text-formated STL files are not currently supported" --- res/locales/de_DE.po | 174 +++++++++++++++++++++------------------- res/locales/en_US.po | 176 +++++++++++++++++++++------------------- res/locales/es_AR.po | 176 +++++++++++++++++++++------------------- res/locales/fr_FR.po | 174 +++++++++++++++++++++------------------- res/locales/ru_RU.po | 187 ++++++++++++++++++++++--------------------- res/locales/tr_TR.po | 176 +++++++++++++++++++++------------------- res/locales/uk_UA.po | 174 +++++++++++++++++++++------------------- res/locales/zh_CN.po | 176 +++++++++++++++++++++------------------- res/messages.pot | 174 +++++++++++++++++++++------------------- 9 files changed, 829 insertions(+), 758 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index 4a5ccb57f..9791a5383 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2018-07-19 06:55+0000\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" @@ -36,7 +36,7 @@ msgstr "Zwischenablage ist leer; es gibt nichts einzufügen." msgid "Number of copies to paste must be at least one." msgstr "Die Anzahl der einzufügenden Kopien muss mind. 1 sein." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "Maßstab kann nicht Null sein." @@ -66,15 +66,15 @@ msgstr "" msgid "No workplane active." msgstr "Es ist keine Arbeitsebene aktiv." -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Ungültiges Format: geben Sie Koordinaten als x, y, z an" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Ungültiges Format: geben Sie Farben als r, g, b an" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -82,25 +82,25 @@ msgstr "" "Der Perspektivfaktor wird sich nicht auswirken, bis Sie Ansicht -> " "Perspektive Projektion aktivieren." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Geben Sie 0 bis %d Ziffern nach dem Dezimalzeichen an." -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "Der Exportmaßstab darf nicht Null sein!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "Der Werkzeugradialabstand darf nicht negativ sein!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "" "Ungültiger Wert: Interval für automatisches Speichern muss positiv sein" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "Ungültiges Format: geben Sie das Interval in ganzen Minuten an" @@ -684,7 +684,7 @@ msgctxt "button" msgid "&No" msgstr "&Nein" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "&Abbrechen" @@ -1137,25 +1137,29 @@ msgstr "Sprache" msgid "&Website / Manual" msgstr "&Website / Anleitung" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "Über" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(keine vorhergehenden Dateien)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "Datei '%s' existiert nicht." -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "" "Das Raster wird nicht angezeigt, weil keine Arbeitsebene ausgewählt ist." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1169,20 +1173,20 @@ msgstr "" "Ändern Sie den Faktor für die Perspektivprojektion in der " "Konfigurationsmaske. Ein typischer Wert ist ca. 0,3." -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Wählen Sie einen Punkt aus; dieser Punkt wird im Mittelpunkt der " "Bildschirmansicht sein." -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" "Die ausgewählten Objekte teilen keine gemeinsamen Endpunkte mit anderen " "Objekten." -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1190,7 +1194,7 @@ msgstr "" "Für diesen Befehl wählen Sie einen Punkt oder ein anderes Objekt von einem " "verknüpften Teil aus, oder aktivieren Sie eine verknüpfte Gruppe." -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1199,7 +1203,7 @@ msgstr "" "(mit Skizze -> In Arbeitsebene), um die Ebene für das Gitterraster zu " "definieren." -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1208,13 +1212,13 @@ msgstr "" "für Punkte, Textkommentare, oder Einschränkungen mit einer Bezeichnung. Um " "eine Linie auf das Raster auszurichten, wählen Sie deren Endpunkte aus." -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Es wurde keine Arbeitsebene ausgewählt. Die Standard-Arbeitsebene für diese " "Gruppe wird aktiviert." -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1224,7 +1228,7 @@ msgstr "" "standardmäßige Arbeitsebene. Wählen Sie eine Arbeitsebene aus, oder " "erstellen Sie eine Gruppe in einer neuen Arbeitsebene." -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1232,48 +1236,48 @@ msgstr "" "Ungültige Auswahl für Bogentangente an Punkt. Wählen Sie einen einzelnen " "Punkt. Um die Bogenparameter anzugeben, wählen Sie nichts aus." -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "" "Erstellen Sie einen Punkt auf dem Bogen (zeichnet im Gegenuhrzeigersinn)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "Klicken Sie, um einen Bezugspunkt zu platzieren" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "Klicken Sie auf den ersten Punkt des Liniensegments" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "Klicken Sie auf den ersten Punkt der Konstruktionslinie" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "Klicken Sie auf den ersten Punkt der kubischen Linie" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "Klicken Sie auf den Kreismittelpunkt" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "Klicken Sie auf den Ursprungspunkt der Arbeitsebene" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "Klicken Sie auf eine Ecke des Rechtecks" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "Klicken Sie auf die obere linke Ecke des Texts" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "Klicken Sie auf die obere linke Ecke des Bilds" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1428,6 +1432,10 @@ msgstr "Kontur überschneidet sich selbst!" msgid "zero-length edge!" msgstr "Kante mit Länge Null!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Eine Bogentangente kann nur in einer Arbeitsebene erstellt werden." @@ -1630,7 +1638,7 @@ msgstr "" "Das Bild kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace-Modelle" @@ -1725,105 +1733,105 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Werte durch Komma getrennt (CSV)" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "unbenannt" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Datei speichern" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Datei öffnen" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "_Abbrechen" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "_Speichern" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "_Öffnen" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Automatische Sicherungsdatei verfügbar" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Eine automatische Sicherung ist für diese Skizze verfügbar." -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Wollen Sie die automatische Sicherungsdatei stattdessen laden?" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "AutoDatei &öffnen" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "&Nicht laden" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Geänderte Datei" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Wollen Sie die Änderungen an der Skizze “%s” sichern?" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Wollen Sie die Änderungen an der Skizze sichern?" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Ihre Änderungen werden verworfen, wenn sie nicht abgespeichert werden." -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "&Sichern" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "&Verwerfen" # solvespace.cpp:557 -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(Neue Skizze)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Attribut-Browser" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " @@ -1833,7 +1841,7 @@ msgstr "" "wahrscheinlich nicht. Verstecken Sie sie in dem auf den Link oben im " "Textfenster klicken." -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1842,23 +1850,23 @@ msgstr "" "Kann den Dateityp der Datei '%s' nicht auf Grund der Dateierweiterung " "erkennen. Versuchen Sie .dxf oder .dwg." -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" "Die Einschränkung muss einen Namen haben, und darf keine " "Referenzdimensionierung sein." -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "" "Falsche Auswahl für die Schrittdimensionierung. Wählen Sie eine " "Einschränkung." -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "Der Zusammenbau funktioniert, gut." -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1869,7 +1877,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1882,7 +1890,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1894,7 +1902,7 @@ msgstr "" "Gekrümmte Flächen wurden als Dreiecksnetz angenähert.\n" "Das verursacht Fehler, typischerweise um 1%." -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1911,7 +1919,7 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1919,7 +1927,7 @@ msgstr "" "Diese Gruppe beinhaltet keine korrekt geschlossene 2D Fläche. Sie ist offen, " "nicht koplanar, oder überschneidet sich selbst." -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1936,7 +1944,7 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1953,36 +1961,36 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Falsche Auswahl für Umfang. Wähle Liniensegmente, Bögen und Kurven." -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "Falsche Auswahl für Punkt nachzeichnen. Wähle einen einzelnen Punkt." -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "Konnte '%s' nicht schreiben" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Das Netz schneidet sich selbst: Falsch, ungültig." -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Das Netz schneidet sich nicht: Gut, gültig." -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Das Netz hat lose Kanten: Falsch, ungültig." -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "Das Netz hat keine lose Kanten: Gut, gültig." -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1993,7 +2001,7 @@ msgstr "" "\n" "Das Modell hat %d Dreiecke, von %d Flächen." -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -2008,7 +2016,7 @@ msgstr "" "\n" "Keine problematischen Kanten, gut.%s" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -2023,7 +2031,7 @@ msgstr "" "\n" "%d problematische Kanten, schlecht.%s" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2066,23 +2074,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "Name des Linientyps kann nicht leer sein." -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "Nicht weniger als 1 Wiederholung möglich." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "Nicht mehr als 999 Wiederholungen möglich." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "Der Name der Gruppe darf nicht leer sein." -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "Durchsichtigkeit muss zwischen Null und Eins sein." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "Radius darf nicht null oder negativ sein." diff --git a/res/locales/en_US.po b/res/locales/en_US.po index 385d8d767..1d00755eb 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -2,12 +2,12 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # Automatically generated, 2017. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -35,7 +35,7 @@ msgstr "Clipboard is empty; nothing to paste." msgid "Number of copies to paste must be at least one." msgstr "Number of copies to paste must be at least one." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "Scale cannot be zero." @@ -63,15 +63,15 @@ msgstr "Too many items to paste; split this into smaller pastes." msgid "No workplane active." msgstr "No workplane active." -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Bad format: specify coordinates as x, y, z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Bad format: specify color as r, g, b" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,24 +79,24 @@ msgstr "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Specify between 0 and %d digits after the decimal." -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "Export scale must not be zero!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "Cutter radius offset must not be negative!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "Bad value: autosave interval should be positive" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "Bad format: specify interval in integral minutes" @@ -677,7 +677,7 @@ msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "&Cancel" @@ -1130,24 +1130,28 @@ msgstr "&Language" msgid "&Website / Manual" msgstr "&Website / Manual" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "&Go to GitHub commit" + +#: graphicswin.cpp:188 msgid "&About" msgstr "&About" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(no recent files)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "File '%s' does not exist." -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "No workplane is active, so the grid will not appear." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1161,17 +1165,17 @@ msgstr "" "For a perspective projection, modify the perspective factor in the " "configuration screen. A value around 0.3 is typical." -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Select a point; this point will become the center of the view on screen." -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "No additional entities share endpoints with the selected entities." -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1179,7 +1183,7 @@ msgstr "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1187,7 +1191,7 @@ msgstr "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1195,11 +1199,11 @@ msgstr "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "No workplane selected. Activating default workplane for this group." -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1209,7 +1213,7 @@ msgstr "" "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1217,47 +1221,47 @@ msgstr "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "click point on arc (draws anti-clockwise)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "click to place datum point" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "click first point of line segment" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "click first point of construction line segment" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "click first point of cubic segment" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "click center of circle" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "click origin of workplane" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "click one corner of rectangle" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "click top left of text" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "click top left of image" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1416,6 +1420,10 @@ msgstr "contour is self-intersecting!" msgid "zero-length edge!" msgstr "zero-length edge!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "Text-formated STL files are not currently supported" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Must be sketching in workplane to create tangent arc." @@ -1610,7 +1618,7 @@ msgstr "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace models" @@ -1705,104 +1713,104 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "untitled" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Save File" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Open File" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "_Cancel" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "_Save" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "_Open" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Autosave Available" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "An autosave file is available for this sketch." -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Do you want to load the autosave file instead?" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "&Load autosave" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "Do&n't Load" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Modified File" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Do you want to save the changes you made to the sketch “%s”?" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Do you want to save the changes you made to the new sketch?" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Your changes will be lost if you don't save them." -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "&Save" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "Do&n't Save" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(new sketch)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Property Browser" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " @@ -1812,7 +1820,7 @@ msgstr "" "is probably not what you want; hide them by clicking the link at the top of " "the text window." -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1821,19 +1829,19 @@ msgstr "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "Constraint must have a label, and must not be a reference dimension." -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "Bad selection for step dimension; select a constraint." -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "The assembly does not interfere, good." -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1844,7 +1852,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1857,7 +1865,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1869,7 +1877,7 @@ msgstr "" "Curved surfaces have been approximated as triangles.\n" "This introduces error, typically of around 1%." -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1886,7 +1894,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1894,7 +1902,7 @@ msgstr "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1911,7 +1919,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1928,36 +1936,36 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Bad selection for perimeter; select line segments, arcs, and curves." -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "Bad selection for trace; select a single point." -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "Couldn't write to '%s'" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "The mesh is self-intersecting (NOT okay, invalid)." -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "The mesh is not self-intersecting (okay, valid)." -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "The mesh has naked edges (NOT okay, invalid)." -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "The mesh is watertight (okay, valid)." -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1968,7 +1976,7 @@ msgstr "" "\n" "The model contains %d triangles, from %d surfaces." -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1983,7 +1991,7 @@ msgstr "" "\n" "Zero problematic edges, good.%s" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -1998,7 +2006,7 @@ msgstr "" "\n" "%d problematic edges, bad.%s" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2039,23 +2047,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "Style name cannot be empty" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "Can't repeat fewer than 1 time." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "Can't repeat more than 999 times." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "Group name cannot be empty" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "Opacity must be between zero and one." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "Radius cannot be zero or negative." diff --git a/res/locales/es_AR.po b/res/locales/es_AR.po index 74638f0ab..ac9052f94 100644 --- a/res/locales/es_AR.po +++ b/res/locales/es_AR.po @@ -2,12 +2,12 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # Maxi , 2021. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2021-09-17 \n" "Last-Translator: andesfreedesign@gmail.com\n" "Language-Team: AndesFreeDesign\n" @@ -35,7 +35,7 @@ msgstr "El portapapeles está vacío; nada que pegar." msgid "Number of copies to paste must be at least one." msgstr "El número de copias para pegar debe ser al menos una." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "La escala no puede ser cero." @@ -63,15 +63,15 @@ msgstr "Demasiados elementos para pegar; divida esto en partes más pequeñas." msgid "No workplane active." msgstr "Ningún plano de trabajo activo." -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Formato incorrecto: especifique las coordenadas como x, y, z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Formato incorrecto: especifique color como r, g, b" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,24 +79,24 @@ msgstr "" "El factor de perspectiva no tendrá ningún efecto hasta que habilite Ver -> " "UsarProyección Perspectiva." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Especifique entre 0 y %d dígitos después del decimal." -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "¡La escala de exportación no debe ser cero!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "¡El desfase del radio de corte no debe ser negativo!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "Valor incorrecto: el intervalo de autoguardado debe ser positivo" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "Formato incorrecto: especifique el intervalo en minutos integrales" @@ -676,7 +676,7 @@ msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "&Cancelar" @@ -1129,25 +1129,29 @@ msgstr "&Lenguaje" msgid "&Website / Manual" msgstr "&Sitio Web / Manual" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "&Acerca" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(no hay archivos recientes)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "El archivo '%s' no existe." -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "" "No hay ningún plano de trabajo activo, por lo que la cuadrícula no aparecerá." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1161,20 +1165,20 @@ msgstr "" "Para una proyección en perspectiva, modifique el factor de perspectiva en la " "pantalla de configuración. Un valor de alrededor de 0,3 es típico." -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Seleccione un punto; este punto se convertirá en el centro de la vista en " "pantalla." -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" "Ninguna entidad adicional comparte puntos finales con las entidades " "seleccionadas." -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1182,7 +1186,7 @@ msgstr "" "Para usar este comando, seleccione un punto u otra entidad de una parte " "vinculada, o convertir un grupo de enlaces en el grupo activo." -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1191,7 +1195,7 @@ msgstr "" "Croquis -> En plano de trabajo) para definir el plano para el enganche a la " "cuadrícula." -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1200,13 +1204,13 @@ msgstr "" "comentarios de texto o restricciones con una etiqueta. Para enganchar una " "línea, seleccione sus puntos finales." -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "No se seleccionó ningún plano de trabajo. Activando el plano de trabajo " "predeterminado para este grupo." -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1216,7 +1220,7 @@ msgstr "" "de trabajo. Intente seleccionar un plano de trabajo o activar un croquis-en-" "nuevo-grupo de plano de trabajo." -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1224,47 +1228,47 @@ msgstr "" "Mala selección de arco tangente en el punto. Seleccione un solo punto o no " "seleccione nada para configurar los parámetros del arco." -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "clic en el punto en el arco (dibuja en sentido antihorario)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "clic para colocar el punto de referencia" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "clic en el primer punto del segmento de línea" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "clic en el primer punto del segmento de línea de construcción" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "clic en el primer punto del segmento cúbico" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "clic en el centro del círculo" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "clic en origen del plano de trabajo" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "clic en una esquina del rectángulo" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "clic en la parte superior izquierda del texto" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "clic en la parte superior izquierda de la imagen" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1418,6 +1422,10 @@ msgstr "¡El contorno se intersecta a sí mismo!" msgid "zero-length edge!" msgstr "¡arista de longitud cero!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" @@ -1617,7 +1625,7 @@ msgstr "" "No se puede dibujar una imagen en 3D; primero, active un plano de trabajo " "con Croquis -> En Plano de Trabajo." -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace modelos" @@ -1712,104 +1720,104 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Valores separados por comas" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "sin título" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Guardar Archivo" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Abrir Archivo" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "_Cancelar" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "_Guardar" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "_Abrir" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Autoguardado Disponible" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Un archivo de autoguardado está disponible para este croquis." -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "¿Desea cargar el archivo de autoguardado en su lugar?" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "&Cargar autoguardado" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "No Cargar" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Archivo Modificado" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "¿Desea guardar los cambios que realizó en el croquis “%s”?" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "¿Desea guardar los cambios que realizó en el nuevo croquis?" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Sus cambios se perderán si no los guarda." -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "&Guardar" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "No& Guardar" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(nuevo croquis)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Explorador de Propiedades" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " @@ -1819,7 +1827,7 @@ msgstr "" "Probablemente esto no sea lo que quieres; ocultarlos haciendo clic en el " "enlace en la parte superior de la ventana de texto." -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1828,20 +1836,20 @@ msgstr "" "No se puede identificar el tipo de archivo a partir de la extensión del " "nombre del archivo '%s'; intente .dxf o .dwg." -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" "La restricción debe tener una etiqueta y no debe ser una cota de referencia." -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "Mala selección para la cota del paso; seleccione una restricción." -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "El ensamble no interfiere, bien." -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1852,7 +1860,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1865,7 +1873,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1877,7 +1885,7 @@ msgstr "" "Las superficies curvas se han aproximado como triángulos.\n" "Esto introduce un error, normalmente alrededor del 1%." -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1894,7 +1902,7 @@ msgstr "" "Las curvas se han aproximado como lineales por partes.\n" "Esto introduce un error, normalmente alrededor del 1%%." -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1902,7 +1910,7 @@ msgstr "" "Este grupo no contiene un área cerrada 2d correctamente formada. Está " "abierta, no coplanares, ni auto-intersectantes." -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1919,7 +1927,7 @@ msgstr "" "Las curvas se han aproximado como lineales por partes.\n" "Esto introduce un error, normalmente alrededor del 1%%." -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1936,37 +1944,37 @@ msgstr "" "Las curvas se han aproximado como lineales por partes.\n" "Esto introduce un error, normalmente alrededor del 1%%." -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" "Mala selección de perímetro; seleccione segmentos de línea, arcos y curvas." -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "Mala selección de rastreo; seleccione un solo punto." -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "No pude escribir a '%s'" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "La malla se intersecta a si misma (NO está bien, no es válida)." -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "La malla no se intersecta (está bien, es válida)." -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "La malla tiene bordes desnudos (NO está bien, no es válida)." -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "La malla es estanca (está bien, es válida)." -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1977,7 +1985,7 @@ msgstr "" "\n" "El modelo contiene %d triángulos, desde %d superficies." -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1992,7 +2000,7 @@ msgstr "" "\n" "Cero aristas problemáticas, bien.%s" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -2007,7 +2015,7 @@ msgstr "" "\n" "%d aristas problemáticas, mal.%s" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2048,23 +2056,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "El nombre del estilo no puede estar vacío" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "No se puede repetir menos de 1 vez." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "No se puede repetir más de 999 veces." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "El nombre del grupo no puede estar vacío" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "La opacidad debe estar entre cero y uno." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "El radio no puede ser cero o negativo." diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index 6b5845a74..ec6d3bac1 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" @@ -35,7 +35,7 @@ msgstr "Presse papier vide; rien à coller." msgid "Number of copies to paste must be at least one." msgstr "Le nombre de copies à coller doit être d'au moins un." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "L'échelle ne peut pas être zéro." @@ -63,15 +63,15 @@ msgstr "Trop d'éléments à coller; Divisez-les en plus petits groupes." msgid "No workplane active." msgstr "Pas d'espace de travail actif." -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Mauvais format: spécifiez les coordonnées comme x, y, z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Mauvais format; spécifiez la couleur comme r, v, b" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,26 +79,26 @@ msgstr "" "Le facteur de perspective n'aura aucun effet tant que vous n'aurez pas " "activé \"Affichage -> Utiliser la projection de perspective\"." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "L'échelle d'export ne doit pas être zéro!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "Le décalage du rayon de coupe ne doit pas être négatif!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "" "Mauvaise valeur: l'intervalle d'enregistrement automatique devrait être " "positif" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "Mauvais format: spécifiez un nombre entier de minutes" @@ -678,7 +678,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1131,24 +1131,28 @@ msgstr "&Langue" msgid "&Website / Manual" msgstr "&Site web / Manuel" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "&A propos" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(pas de fichier récent)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "Pas de plan de travail actif, donc la grille ne va pas apparaître." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1162,19 +1166,19 @@ msgstr "" "Pour une projection en perspective, modifiez le facteur de perspective dans " "l'écran de configuration. Une valeur d'environ 0,3 est typique." -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Sélectionnez un point. Ce point deviendra le centre de la vue à l'écran." -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" "Aucune entité supplémentaire ne partage des points d'extrémité avec les " "entités sélectionnées." -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1182,7 +1186,7 @@ msgstr "" "Pour utiliser cette commande, sélectionnez un point ou une autre entité à " "partir d'une pièce liée ou créez un groupe de liens dans le groupe actif." -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1190,7 +1194,7 @@ msgstr "" "Aucun plan de travail n'est actif. Activez un plan de travail (avec Dessin -" "> Dans plan de travail) pour définir le plan pour la grille d'accrochage." -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1199,13 +1203,13 @@ msgstr "" "des textes de commentaires ou des contraintes avec une étiquette. Pour " "accrocher une ligne, sélectionnez ses points d'extrémité." -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Aucun plan de travail sélectionné. Activation du plan de travail par défaut " "pour ce groupe." -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1215,7 +1219,7 @@ msgstr "" "de travail par défaut. Essayez de sélectionner un plan de travail ou " "d'activer un groupe de \"Dessin dans nouveau plan travail\"." -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1223,49 +1227,49 @@ msgstr "" "Mauvaise sélection pour l'arc tangent au point. Sélectionnez un seul point, " "ou ne sélectionnez rien pour configurer les paramètres de l'arc." -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "" "cliquez un point sur l'arc (dessine dans le sens inverse des aiguilles d'une " "montre)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "cliquez pour placer un point" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "cliquez le premier point du segment de ligne" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "cliquez le premier point de la ligne de construction" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "cliquez le premier point du segment cubique" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "cliquez pour placer le centre du cercle" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "cliquez pour placer l'origine du plan de travail" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "cliquez un coin du rectangle" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "cliquez le haut à gauche du texte" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "cliquez le haut à gauche de l'image" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1409,6 +1413,10 @@ msgstr "le contour s'entrecroise!" msgid "zero-length edge!" msgstr "arête de longueur nulle!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Vous devez dessiner dans un plan pour créer un arc tangent." @@ -1604,7 +1612,7 @@ msgstr "" "Impossible de dessiner l'image en 3d; D'abord, activez un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1699,130 +1707,130 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "sans nom" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Sauver fichier" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Ouvrir Fichier" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "_Annuler" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "_Sauver" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Sauvegarde automatique existante" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Fichier modifié" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(nouveau dessin)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Navigateur de propriété" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " "the text window." msgstr "" -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1830,7 +1838,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1839,7 +1847,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1847,7 +1855,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1858,13 +1866,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1875,7 +1883,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1886,36 +1894,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1923,7 +1931,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1933,7 +1941,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -1943,7 +1951,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1972,23 +1980,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "Le nom d'un style ne peut pas être vide" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "Je ne peux pas répéter moins de 1 fois." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "Je ne peux pas répéter plus de 999 fois." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "Un nom de groupe ne peut pas être vide" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "L'opacité doit être entre 0 et 1." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "Le rayon ne peut pas être zéro ou négatif." diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index d688a75c6..bf9bbfbb1 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2021-10-04 15:33+0300\n" "Last-Translator: Olesya Gerasimenko \n" "Language-Team: Basealt Translation Team\n" @@ -36,7 +36,7 @@ msgstr "Буфер обмена пуст; нечего вставлять." msgid "Number of copies to paste must be at least one." msgstr "Укажите в поле 'количество' хотя бы одну копию для вставки." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "Масштабный коэффициент не может быть нулевым." @@ -63,15 +63,15 @@ msgstr "Слишком много элементов для вставки; ра msgid "No workplane active." msgstr "Рабочая плоскость не активна" -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Неверный формат: введите координаты как x, y, z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Неверный формат: введите цвет как r, g, b" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,25 +79,25 @@ msgstr "" "Коэффициент перспективы не будет иметь эффект, пока вы не включите Вид-" ">Перспективная Проекция." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Введите число от 0 до %d." -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "Масштабный коэффициент не может быть нулевым!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "Радиус режущего инструмента не может быть отрицательным!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "" "Неверное значение: интервал автосохранения должен быть положительным числом" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "" "Неверный формат: введите целое число, чтобы задать интервал автосохранения" @@ -405,8 +405,8 @@ msgid "" " * two arcs\n" " * one arc and one line segment\n" msgstr "" -"Неправильное выделение для ограничения 'отношение длин'. Ограничение может" -" принимать в качестве выделения следующие примитивы:\n" +"Неправильное выделение для ограничения 'отношение длин'. Ограничение может " +"принимать в качестве выделения следующие примитивы:\n" "\n" " * два отрезка\n" " * две дуги\n" @@ -421,8 +421,8 @@ msgid "" " * two arcs\n" " * one arc and one line segment\n" msgstr "" -"Неправильное выделение для ограничения 'разность длин'. Ограничение может" -" принимать в качестве выделения следующие примитивы:\n" +"Неправильное выделение для ограничения 'разность длин'. Ограничение может " +"принимать в качестве выделения следующие примитивы:\n" "\n" " * два отрезка\n" " * две дуги\n" @@ -693,7 +693,7 @@ msgctxt "button" msgid "&No" msgstr "Нет" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "Отменить" @@ -1146,24 +1146,28 @@ msgstr "&Язык" msgid "&Website / Manual" msgstr "Вебсайт / &Справка" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "О &Программе" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(пусто)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "Файл '%s' не существует." -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "Сетку не будет видно, пока рабочая плоскость не активирована." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1177,16 +1181,16 @@ msgstr "" "перспективы на конфигурационной странице браузера.\n" "Значение по умолчанию 0.3." -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "Выделите точку. Вид будет отцентрован по этой точке." -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "Нет дополнительных объектов, соединенных с выбранными примитивами." -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1195,7 +1199,7 @@ msgstr "" "принадлежащий импортированной детали, или активируйте группу импортированной " "детали." -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1203,7 +1207,7 @@ msgstr "" "Рабочая плоскость не активна. Активируйте ее через Эскиз -> В Рабочей " "Плоскости чтобы определить плоскость для сетки." -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1212,13 +1216,13 @@ msgstr "" "текстовые комментарии или ограничения с размерными значениями. Чтобы " "привязать отрезок или другой примитив, выбирайте его точки." -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Рабочая плоскость не активна. Активирована рабочая плоскость по умолчанию " "для данной группы." -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1228,7 +1232,7 @@ msgstr "" "по умолчанию. Попробуйте выделить рабочую плоскость или создать новую с " "помощью Группа -> Создать Эскиз в Новой Рабочей Плоскости." -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1237,54 +1241,54 @@ msgstr "" "точку, либо запустите команду без выделения, чтобы перейти к окну настроек " "этой команды." -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "" "кликните мышью там, где хотите создать дугу окружности (дуга будет " "нарисована против часовой стрелки)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "кликните мышью там, где хотите создать опорную точку" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "кликните мышью там, где хотите создать первую точку отрезка" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "" "кликните мышью там, где хотите создать первую точку вспомогательного отрезка" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "" "кликните мышью там, где хотите создать первую точку кубического сплайна Безье" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "кликните мышью там, где будет находиться центр окружности" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "" "кликните мышью там, где будет находиться точка, через которую будет " "построена рабочая плоскость" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "кликните мышью там, где будет находиться один из углов прямоугольника" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "кликните мышью там, где хотите создать текст" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "" "кликните мышью там, где будет расположен левый верхний угол изображения" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1307,9 +1311,8 @@ msgid "" " * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -"Неправильное выделение для создания эскиза в рабочей плоскости. Группа может" -" быть создана, используя в качестве выделения следующие " -"примитивы:\n" +"Неправильное выделение для создания эскиза в рабочей плоскости. Группа может " +"быть создана, используя в качестве выделения следующие примитивы:\n" "\n" " * точку (через точку, ортогонально осям координат)\n" " * точку и два отрезка (через точку, параллельно отрезкам)\n" @@ -1462,6 +1465,10 @@ msgstr "контур имеет самопересечения!" msgid "zero-length edge!" msgstr "вырожденный отрезок!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" @@ -1659,7 +1666,7 @@ msgid "" "Workplane." msgstr "Невозможно создать изображение. Активируйте рабочую плоскость." -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "проекты SolveSpace" @@ -1754,104 +1761,104 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "CSV файлы (значения, разделенные запятой)" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "без имени" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Сохранить Файл" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Открыть Файл" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "Отменить" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "Сохранить" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "_Открыть" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Автосохранение Доступно" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Автоматически сохраненный файл доступен для данного проекта." -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Хотите загрузить автосохраненный файл вместо исходного?" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "&Загрузить Автосохранение" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "&Не Загружать" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Измененный Файл" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Сохранить изменения, сделанные в файле “%s”?" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Сохранить изменения, сделанные в новом проекте?" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Изменения будут утеряны, если их не сохранить." -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "&Сохранить" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "&Не Сохранять" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(новый проект)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Браузер" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " @@ -1861,7 +1868,7 @@ msgstr "" "это не то, что требуется, если так, необходимо спрятать их, нажав ссылку " "вверху окна Браузера." -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1870,21 +1877,21 @@ msgstr "" "Неподдерживаемый тип файла '%s'. Поддерживаются файлы с расширением .dxf и ." "dwg." -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "У ограничения должно быть значение и оно не должно быть справочным." -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "" "Неправильное выделение для операции изменения значения с заданным шагом; " "необходимо выбрать ограничение со значением." -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "Сборка не содержит пересечения деталей - это хорошо." -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1895,7 +1902,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1908,7 +1915,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1920,7 +1927,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%." -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1937,7 +1944,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1945,7 +1952,7 @@ msgstr "" "Эта группа не содержит замкнутых областей. В ней нет замкнутых контуров, " "примитивы не лежат в одной плоскости или самопересекаются." -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1962,7 +1969,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1979,38 +1986,38 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" "Неправильное выделение для расчета периметра; необходимо выбирать только " "отрезки, дуги и кривые в качестве исходных данных" -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "Неправильное выделение для трассировки; необходимо выбрать одну точку." -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "Невозможно записать в '%s'" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Полигональная сетка содержит самопересечения (это плохо)" -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Полигональная сетка не содержит самопересечений (это хорошо)" -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Полигональная сетка содержит \"оголенные\" ребра (это плохо)" -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "Полигональная сетка герметична (это хорошо)" -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -2021,7 +2028,7 @@ msgstr "" "\n" "Модель содержит %d треугольников, содержащихся в %d поверхностях." -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -2036,7 +2043,7 @@ msgstr "" "\n" "Нет проблемных ребер - это хорошо.%s" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -2051,7 +2058,7 @@ msgstr "" "\n" "%d найдены проблемные ребра - это плохо.%s" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2094,23 +2101,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "Имя стиля не может быть пустым." -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "Невозможно сделать повторение меньше, чем 1 раз." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "Невозможно сделать повтор больше, чем 999 раз." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "Имя группы не может быть пустым." -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "Прозрачность должна быть числом от нуля до единицы." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "Радиус не может быть нулевым или отрицательным." diff --git a/res/locales/tr_TR.po b/res/locales/tr_TR.po index de82270f1..aa55f1cdf 100644 --- a/res/locales/tr_TR.po +++ b/res/locales/tr_TR.po @@ -2,12 +2,12 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # Automatically generated, 2017. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2021-03-09 22:58+0300\n" "Last-Translator: Mustafa Halil GÖRENTAŞ \n" "Language-Team: app4soft\n" @@ -37,7 +37,7 @@ msgstr "Pano boş; yapıştırılacak bir şey yok." msgid "Number of copies to paste must be at least one." msgstr "Yapıştırılacak kopya sayısı en az bir olmalıdır." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "Ölçek sıfır olamaz." @@ -63,15 +63,15 @@ msgstr "Yapıştırılamayacak kadar çok öğe; bunu daha küçük yapıştıma msgid "No workplane active." msgstr "Etkin Çalışma Düzlemi yok." -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Hatalı biçim: koordinatları x, y, z olarak belirtin" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Hatalı biçim: rengi r, g, b olarak belirtin" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,24 +79,24 @@ msgstr "" "Görünüm -> Perspektif Projeksiyonu Kullan'ı etkinleştirene kadar perspektif " "çarpanının hiçbir etkisi olmayacaktır." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Ondalık basamak sonra 0 ile %d arasında basamak belirtin." -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "Dışa aktarma ölçeği sıfır olmamalıdır!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "Kesici yarıçap ofseti negatif olmamalıdır!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "Hatalı değer: otomatik kaydetme süresi pozitif olmalıdır" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "Hatalı biçim: süre aralığını dakika cinsinden belirtin" @@ -673,7 +673,7 @@ msgctxt "button" msgid "&No" msgstr "&Hayır" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "&İptal" @@ -1126,24 +1126,28 @@ msgstr "&Dil" msgid "&Website / Manual" msgstr "&Web sitesi / Kılavuz" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "&Hakkında" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(yeni dosyalar yok)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "'%s' dosyası mevcut değil." -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "Etkin çalışma düzlemi yok, bu nedenle ızgara görünmeyecektir." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1157,17 +1161,17 @@ msgstr "" "Perspektif bir projeksiyon için, konfigürasyon ekranındaki perspektif " "çarpanını değiştirin. 0,3 civarında bir değer tipiktir." -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Bir nokta seçin; bu nokta ekrandaki görüntünün merkezi haline gelecektir." -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "Hiçbir ek öğe, seçili öğeler ile uç noktaları paylaşmaz." -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1175,7 +1179,7 @@ msgstr "" "Bu komutu kullanmak için, bağlantılı bir parçadan bir nokta veya başka bir " "öğe seçin veya bir bağlantı grubunu etkin grup haline getirin." -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1183,7 +1187,7 @@ msgstr "" "Etkin çalışma düzlemi yok. Tutturma ızgarasının düzlemini tanımlamak için " "bir çalışma düzlemini (Çizim -> Çalışma Düzleminde menüsü ile) etkinleştirin." -#: 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." @@ -1192,13 +1196,13 @@ msgstr "" "sınırlamaları bir etiketle seçin. Bir çizgiyi tutturmak için uç noktalarını " "seçin." -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Çalışma düzlemi seçilmedi. Bu grup için varsayılan çalışma düzlemi " "etkinleştiriliyor." -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1208,7 +1212,7 @@ msgstr "" "düzlemi yoktur. Bir çalışma düzlemi seçmeyi veya yeni çalışma düzleminde " "çizim grubunu etkinleştirmeyi deneyin." -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1216,47 +1220,47 @@ msgstr "" "Noktada teğet yay oluşturmak için hatalı seçim. Tek bir nokta seçin veya yay " "parametrelerini ayarlamak için hiçbir şey seçmeyin." -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "yayın ilk noktası için tıklayın (saat yönünün tersine çizilir)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "referans noktasını yerleştirmek için tıklayın" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "çizgi parçasının ilk noktası için tıklayın" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "yapı çizgisinin ilk noktası için tıklayın" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "kübik segmentin ilk noktası için tıklayın" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "çemberin merkezi için tıklayın" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "çalışma düzleminin merkezi için tıklayın" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "dikdörtgenin bir köşesi için tıklayın" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "metnin sol üst köşesi için tıklayın" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "resmin sol üst köşesi için tıklayın" -#: 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 "kontur kendisiyle kesişiyor!" msgid "zero-length edge!" msgstr "sıfır-uzunlukta kenar!" +#: 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 "Teğet yay oluşturmak için çalışma düzleminde çizim yapılmalıdır." @@ -1604,7 +1612,7 @@ msgstr "" "3d'de resim eklenemez; önce Çizim -> Çalışma Düzleminde menüsü ile bir " "çalışma düzlemini etkinleştirin." -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace Modelleri" @@ -1699,104 +1707,104 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Virgülle ayrılmış değerler (CSV)" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "isimsiz" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Dosyayı Kaydet" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Dosyayı Aç" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "_İptal" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "_Kaydet" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "_Aç" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Otomatik Kaydetme Kullanılabilir" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Bu çizim için otomatik kaydetme dosyası kullanılabilir." -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Bunun yerine otomatik kaydetme dosyasını yüklemek istiyor musunuz?" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "&Otomatik kaydetmeyi yükle" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "&Yükleme" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Değiştirilen Dosya" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "\"%s\" çiziminde yaptığınız değişiklikleri kaydetmek istiyor musunuz?" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Yeni çizimde yaptığınız değişiklikleri kaydetmek istiyor musunuz?" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Bunları kaydetmezseniz değişiklikleriniz kaybolur." -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "&Kaydet" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "K&aydetme" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(yeni çizim)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Özellik Tarayıcısı" -#: 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 " @@ -1806,7 +1814,7 @@ msgstr "" "Muhtemelen istediğiniz bu değil; metin penceresinin üst kısmındaki " "bağlantıya tıklayarak bunları gizleyin." -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1814,21 +1822,21 @@ msgid "" msgstr "" "Dosya türü '%s' dosya uzantısından tanımlanamıyor; .dxf veya .dwg'yi deneyin." -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "Sınırlamanın bir etiketi olmalı ve bir referans ölçüsü olmamalıdır." -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "" "Adım ölçüsü için hatalı seçim; bir nokta boyunca, eksenleri koordine etmek " "için ortogonal seçin." -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "Montaj engel değil, iyi." -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1839,7 +1847,7 @@ msgstr "" "\n" " % s" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1852,7 +1860,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1864,7 +1872,7 @@ msgstr "" "Eğri yüzeyler, üçgenler olarak yaklaştırılmıştır.\n" "Bu, tipik olarak yaklaşık 1% hataya neden olur." -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1881,7 +1889,7 @@ msgstr "" "Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" "Bu, tipik olarak yaklaşık 1%% hataya neden olur." -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1889,7 +1897,7 @@ msgstr "" "Bu grup, doğru biçimlendirilmiş 2d kapalı alan içermiyor. Açık, eş düzlemli " "değil veya kendisiyle kesişiyor." -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1906,7 +1914,7 @@ msgstr "" "Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" "Bu, tipik olarak yaklaşık 1%% hataya neden olur." -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1923,38 +1931,38 @@ msgstr "" "Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" "Bu, tipik olarak yaklaşık 1%% hataya neden olur." -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" "Çevre uzunluğu için hatalı seçim; çizgi parçalarını, yayları ve eğrileri " "seçin." -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "İzleme için hatalı seçim; tek bir nokta seçin." -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "\"%s\" ye yazılamadı" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Mesh kendisiyle kesişiyor (TAMAM değil, geçersiz)." -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Mesh kendi kendine kesişmiyor (tamam, geçerli)." -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Mesh'in açık kenarları var (tamam DEĞİL, geçersiz)." -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "Mesh çok sıkı (tamam, geçerli)" -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1965,7 +1973,7 @@ msgstr "" "\n" "Model, %d yüzeylerden %d üçgen içerir." -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1980,7 +1988,7 @@ msgstr "" "\n" "Sıfır sorunlu kenar, iyi.%s" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -1995,7 +2003,7 @@ msgstr "" "\n" "%d sorunlu kenar, kötü.%s" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2036,23 +2044,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "Biçim adı boş olamaz" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "1 defadan az tekrar edilemez." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "999 defadan fazla tekrar edilemez." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "Grup adı boş olamaz" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "Şeffaflık değeri sıfır ile bir arasında olmalıdır." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "Yarıçap sıfır veya negatif değer olamaz." diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index 8192a6b6d..ee4c8fb21 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2021-04-14 01:42+0300\n" "Last-Translator: https://github.com/Symbian9\n" "Language-Team: app4soft\n" @@ -35,7 +35,7 @@ msgstr "Буфер обміну порожній; немає чого встав msgid "Number of copies to paste must be at least one." msgstr "Кількість копій для вставки має бути не менше одної." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "Масштаб не може бути нульовим." @@ -62,15 +62,15 @@ msgstr "Забагато об'єктів для вставки; рзділіть msgid "No workplane active." msgstr "Немає активної площини." -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Некоректний формат: визначте координати X, Y, Z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Некоректний формат: визначте колір як R, G, B" -#: confscreen.cpp:412 +#: confscreen.cpp:417 #, fuzzy msgid "" "The perspective factor will have no effect until you enable View -> Use " @@ -79,24 +79,24 @@ msgstr "" "Значення перспективи не матиме ефекту допоки не ввімкнено Вигляд -> " "Використовувати Перспективну проєкцію." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Визначте кількість десяткових знаків від 0 до %d." -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "Масштаб експорту не може бути нульовим!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "Радіус відступу різання не може бути від'ємним!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "Некоректне значення: інтервал автозбереження має бути додатнім" -#: confscreen.cpp:521 +#: confscreen.cpp:531 #, fuzzy msgid "Bad format: specify interval in integral minutes" msgstr "Некоректний формат: визначте цілим числом інтервал у хвилинах" @@ -579,7 +579,7 @@ msgctxt "button" msgid "&No" msgstr "&Ні" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "&Відмінити" @@ -1032,24 +1032,28 @@ msgstr "&Мова" msgid "&Website / Manual" msgstr "&Вебсайт / Посібник" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "&Про програму" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(нємає нещодавніх файлів)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "Файл '%s' відсутній." -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "Відсутня активна площина - сітка не відображатиметься." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1058,91 +1062,91 @@ msgid "" "configuration screen. A value around 0.3 is typical." msgstr "" -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." msgstr "" -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." msgstr "" -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." msgstr "" -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "клікніть для встановлення вихідної точки" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "клікніть першу точку прямої лінії" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "клікніть першу точку конструктивної прямої лінії" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "клікніть першу точку кривої" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "клікніть в місце де буде центр коментаря" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "клікніть в центр відліку площини" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "клікніть для встановлення першого кута прямокутника" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "клікніть для встановлення верхньої лівої межі тексту" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "клікніть для встановлення верхньої лівої межі зображення" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1271,6 +1275,10 @@ msgstr "контур самоперетинається!" msgid "zero-length edge!" msgstr "ребро нульової довжини!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" @@ -1452,7 +1460,7 @@ msgid "" "Workplane." msgstr "" -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace модель" @@ -1547,130 +1555,130 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "без імені" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Зберегти Файл" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Відкрити Файл" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "_Скасувати" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "_Зберегти" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "_Відкрити" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Наявні автозбереження" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Наявні автозбереження для цього креслення." -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Завантажити файл автозбереження?" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "&Завантажити автозбереження" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "&Не Завантажувати" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Файл Змінено" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Чи хочете ви зберегти зміни зроблені вами у ескізі “%s”?" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Чи хочете ви зберегти зміни зроблені вами у новому ескізі?" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Ваші зміни буде втрачено якщо ви не збережете їх." -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "&Зберегти" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "&Не Зберігати" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(нове креслення)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Браузер Властивостей" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " "the text window." msgstr "" -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "Обмежувач має містити мітку і бути не відносним розміром." -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "Поганий вибір для крокової зміни розміру; оберіть обмежувач." -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1681,7 +1689,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1694,7 +1702,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1702,7 +1710,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1713,7 +1721,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1721,7 +1729,7 @@ msgstr "" "Ця група не місить коректно сформованого замкненої 2D площини. Вона " "відкрита, не компланарна, або ж самоперетинається." -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1738,7 +1746,7 @@ msgstr "" "Криві наближено до ламаних ліній.\n" "Це вносить похибку, зазвичай близько 1%%." -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1755,36 +1763,36 @@ msgstr "" "Криві наближено до ламаних ліній.\n" "Це вносить похибку, зазвичай близько 1%%." -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Поганий вибір для периметру; оберіть відрізки, дуги та криві." -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "Поганий вибір для вістежування шляху; оберіть одну точку." -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "Неможливо записати у '%s'" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Меш самоперетинається (НЕ добре, недійсний)." -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Меш самоперетинається (добре, дійсний)." -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Меш містить оголені ребра (НЕ добре, недійсний)." -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "Меш водонепроникний (добре, дійсний)." -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1792,7 +1800,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1807,7 +1815,7 @@ msgstr "" "\n" "Відсутні проблемні ребра, добре.%s" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -1822,7 +1830,7 @@ msgstr "" "\n" "%d проблемних ребер, погано.%s" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1863,23 +1871,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "Стиль не може містити порожнє ім'я" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "Не можливо повторити менше 1 разу." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "Не можливо повторити понад 999 разів." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "Група не може містити порожнє ім'я" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "Непрозорість має бути між 0 та 1." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "Радіус не може бути нульовим чи від'ємним." diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index 7768124ee..5cbf6997e 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -2,12 +2,12 @@ # Copyright (C) 2020 the PACKAGE authors # This file is distributed under the same license as the SolveSpace package. # , 2020. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2021-04-03 13:10-0400\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" @@ -35,7 +35,7 @@ msgstr "剪贴板为空;没有要粘贴的内容。" msgid "Number of copies to paste must be at least one." msgstr "要粘贴的副本数必须至少为 1 个。" -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "缩放不能为零。" @@ -61,38 +61,38 @@ msgstr "要粘贴的项目太多; 请把他们拆分。" msgid "No workplane active." msgstr "没有工作平面处于活动状态。" -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "格式错误:将坐标指定为 x、y、z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "格式错误:将颜色指定为 r、g、b" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." msgstr "在启用\"视图 -= 使用透视投影\"之前,透视因子将不起作用。" -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "在十进制之后指定 0 和 %d 数字之间。" -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "输出比例不能为零!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "刀具半径偏移不能为负数!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "坏值:自动保存间隔应为正" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "格式错误:以整数分钟为单位指定间隔" @@ -632,7 +632,7 @@ msgctxt "button" msgid "&No" msgstr "否(&N)" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "取消(&C)" @@ -1085,24 +1085,28 @@ msgstr "语言(&L)" msgid "&Website / Manual" msgstr "网页/手册(&W)" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "关于(&A)" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(无文件)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "文件不存在: \"%s\"。" -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "没有激活的工作面,因此无法显示轴网。" -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1111,91 +1115,91 @@ msgid "" "configuration screen. A value around 0.3 is typical." msgstr "" -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." msgstr "" -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." msgstr "" -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." msgstr "" -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "点击弧线的点(逆时针方向绘制)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "点击放置基准点" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "点击线条的起点" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "点击构造线的起点" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "点击立方体的起点" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "点击圆弧的中心" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "点击工作面的原点" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "点击一个矩形倒角" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "点击文字左上角" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "点击图片左上角" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1326,6 +1330,10 @@ msgstr "轮廓自相交!" msgid "zero-length edge!" msgstr "边缘长度为零!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" @@ -1505,7 +1513,7 @@ msgid "" "Workplane." msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 激活工作面。" -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace模型" @@ -1600,130 +1608,130 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "逗号分隔数据" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "未命名" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "保存文件" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "打开文件" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "取消_C" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "保存_S" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "打开_O" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " "the text window." msgstr "" -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1731,7 +1739,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1740,7 +1748,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1748,7 +1756,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1759,13 +1767,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1776,7 +1784,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1787,36 +1795,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1824,7 +1832,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1834,7 +1842,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -1844,7 +1852,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1871,23 +1879,23 @@ msgstr "无法将样式分配给派生自其他实体的实体;尝试将样式 msgid "Style name cannot be empty" msgstr "样式名称不能为空" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "不能重复少于 1 次。" -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "重复不超过 999 次。" -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "组名称不能为空" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "不透明度必须在零和 1 之间。" -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "半径偏移不能为负数。" diff --git a/res/messages.pot b/res/messages.pot index 25a6c1cf3..bf8c9803e 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -32,7 +32,7 @@ msgstr "" msgid "Number of copies to paste must be at least one." msgstr "" -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "" @@ -56,37 +56,37 @@ msgstr "" msgid "No workplane active." msgstr "" -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use Perspective Projection." msgstr "" -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "" @@ -538,7 +538,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "" @@ -991,24 +991,28 @@ msgstr "" msgid "&Website / Manual" msgstr "" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "" -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel projection.\n" "\n" @@ -1016,89 +1020,89 @@ msgid "" "around 0.3 is typical." msgstr "" -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or make a link group the " "active group." msgstr "" -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) to define the plane " "for the snap grid." msgstr "" -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints with a label. To " "snap a line, select its endpoints." msgstr "" -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default workplane. Try selecting a " "workplane, or activating a sketch-in-new-workplane group." msgstr "" -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select nothing to set up arc " "parameters." msgstr "" -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "No entities are selected. Select entities before trying to toggle their construction state." msgstr "" @@ -1221,6 +1225,10 @@ msgstr "" msgid "zero-length edge!" msgstr "" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" @@ -1391,7 +1399,7 @@ msgstr "" msgid "Can't draw image in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1486,127 +1494,127 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This is probably not what " "you want; hide them by clicking the link at the top of the text window." msgstr "" -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "Can't identify file type from file extension of filename '%s'; try .dxf or .dwg." msgstr "" -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1614,7 +1622,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1623,7 +1631,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1631,7 +1639,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1642,13 +1650,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, not coplanar, or self-" "intersecting." msgstr "" -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1659,7 +1667,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1670,36 +1678,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1707,7 +1715,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1717,7 +1725,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -1727,7 +1735,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1754,23 +1762,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "" -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "" -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "" -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "" From 14455d6c064bdb27e3b6bd498c77fec5276bcf47 Mon Sep 17 00:00:00 2001 From: Mustafa Halil <80210006+mhalil@users.noreply.github.com> Date: Wed, 2 Feb 2022 21:52:14 +0300 Subject: [PATCH 397/646] Turkish translation tr_TR.po updated (#1203) --- res/locales/tr_TR.po | 563 +++++++++++++++++++++++-------------------- 1 file changed, 296 insertions(+), 267 deletions(-) diff --git a/res/locales/tr_TR.po b/res/locales/tr_TR.po index aa55f1cdf..71558fce4 100644 --- a/res/locales/tr_TR.po +++ b/res/locales/tr_TR.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" "POT-Creation-Date: 2022-02-01 16:24+0200\n" -"PO-Revision-Date: 2021-03-09 22:58+0300\n" +"PO-Revision-Date: 2022-02-01 23:02+0300\n" "Last-Translator: Mustafa Halil GÖRENTAŞ \n" "Language-Team: app4soft\n" "Language: tr\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Poedit 3.0\n" "X-Poedit-SourceCharset: UTF-8\n" #: clipboard.cpp:309 @@ -25,7 +25,7 @@ msgid "" "\n" "Activate one with Sketch -> In Workplane." msgstr "" -"İşi yalnızca bir çalışma düzleminde kesin, yapıştır ve kopyalayın.\n" +"Çalışmayı yalnızca bir çalışma düzleminde kesin, yapıştırın ve kopyalayın.\n" "\n" "Çizim -> Çalışma Düzleminde menüsü ile bir düzlemi etkinleştirin." @@ -43,11 +43,11 @@ msgstr "Ölçek sıfır olamaz." #: clipboard.cpp:431 msgid "Select one point to define origin of rotation." -msgstr "Dönüşün başlangıç noktasını tanımlamak için bir nokta seçin." +msgstr "Çevirme merkezini tanımlamak için bir nokta seçin." #: clipboard.cpp:443 msgid "Select two points to define translation vector." -msgstr "Öteleme vektörünü tanımlamak için iki nokta seçin." +msgstr "Doğrusal kopyalama vektörünü tanımlamak için iki nokta seçin." #: clipboard.cpp:453 msgid "" @@ -57,11 +57,12 @@ msgstr "Dönüşüm özdeştir. Yani tüm kopyalar tam olarak üst üste gelecek #: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." -msgstr "Yapıştırılamayacak kadar çok öğe; bunu daha küçük yapıştımalara bölün." +msgstr "" +"Yapıştırılamayacak kadar çok öğe; bunu daha küçük yapıştıma şeklinde bölün." #: clipboard.cpp:462 msgid "No workplane active." -msgstr "Etkin Çalışma Düzlemi yok." +msgstr "Etkin çalışma düzlemi yok." #: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" @@ -77,12 +78,12 @@ msgid "" "Perspective Projection." msgstr "" "Görünüm -> Perspektif Projeksiyonu Kullan'ı etkinleştirene kadar perspektif " -"çarpanının hiçbir etkisi olmayacaktır." +"katsayısının hiçbir etkisi olmayacaktır." #: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." -msgstr "Ondalık basamak sonra 0 ile %d arasında basamak belirtin." +msgstr "Ondalık basamak sonrası 0 ile %d arasında rakam belirtin." #: confscreen.cpp:457 msgid "Export scale must not be zero!" @@ -103,7 +104,7 @@ msgstr "Hatalı biçim: süre aralığını dakika cinsinden belirtin" #: constraint.cpp:12 msgctxt "constr-name" msgid "pts-coincident" -msgstr "nktlar-kesişen" +msgstr "çakışık-nktlar" #: constraint.cpp:13 msgctxt "constr-name" @@ -138,7 +139,7 @@ msgstr "düzlemde-nkt" #: constraint.cpp:19 msgctxt "constr-name" msgid "pt-on-line" -msgstr "nkt-çizgide" +msgstr "çizgide-nkt" #: constraint.cpp:20 msgctxt "constr-name" @@ -148,17 +149,17 @@ msgstr "yüzeyde-nkt" #: constraint.cpp:21 msgctxt "constr-name" msgid "eq-length" -msgstr "eş-uzunluk" +msgstr "eşit-uzunluk" #: constraint.cpp:22 msgctxt "constr-name" msgid "eq-length-and-pt-ln-dist" -msgstr "eş-uzunluk-ve-çzg-nkt-mesafesi" +msgstr "eşit-uzunluk-ve-çzg-nkt-mesafesi" #: constraint.cpp:23 msgctxt "constr-name" msgid "eq-pt-line-distances" -msgstr "eş-nkt-çizgi-mesafesi" +msgstr "eşit-nkt-çizgi-mesafesi" #: constraint.cpp:24 msgctxt "constr-name" @@ -168,12 +169,12 @@ msgstr "uzunluk-oranı" #: constraint.cpp:25 msgctxt "constr-name" msgid "arc-arc-length-ratio" -msgstr "" +msgstr "yay-yay-uzunluk-oranı" #: constraint.cpp:26 msgctxt "constr-name" msgid "arc-line-length-ratio" -msgstr "" +msgstr "yay-çizgi-uzunluk-oranı" #: constraint.cpp:27 msgctxt "constr-name" @@ -183,12 +184,12 @@ msgstr "uzunluk-farkı" #: constraint.cpp:28 msgctxt "constr-name" msgid "arc-arc-len-difference" -msgstr "" +msgstr "yay-yay-uzunluk-farkı" #: constraint.cpp:29 msgctxt "constr-name" msgid "arc-line-len-difference" -msgstr "" +msgstr "yay-çizgi-uzunluk-farkı" #: constraint.cpp:30 msgctxt "constr-name" @@ -233,7 +234,7 @@ msgstr "çap" #: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" -msgstr "nkt-çemberde" +msgstr "çemberde-nkt" #: constraint.cpp:39 msgctxt "constr-name" @@ -258,7 +259,7 @@ msgstr "yay-çizgi-teğet" #: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" -msgstr "kubik-çizgi-teğet" +msgstr "k.eğri-çizgi-teğet" #: constraint.cpp:44 msgctxt "constr-name" @@ -273,17 +274,17 @@ msgstr "dik" #: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" -msgstr "eş-yarıçap" +msgstr "eşit-yarıçap" #: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" -msgstr "eş-açı" +msgstr "eşit-açı" #: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" -msgstr "eş-çizgi-uzn-yay-uzn" +msgstr "eşit-çizgi-uzn-yay-uzn" #: constraint.cpp:49 msgctxt "constr-name" @@ -300,24 +301,24 @@ msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." msgstr "" -"Teğet, yay ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğeti " -"sınırlandırmadan önce bunları Sınırlandır -> Noktada ile sınırlandırın." +"Teğet için yay ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğet " +"kısıtlamasından önce bunları Kısıtla -> Noktada ile kısıtlayın." #: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." msgstr "" -"Teğet kübik ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğeti " -"sınırlandırmadan önce onları Sınırlandır -> Noktada ile sınırlandırın." +"Teğet için eğri ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğet " +"kısıtlamasından önce onları Kısıtla -> Noktada ile kısıtlayın." #: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." msgstr "" -"Eğriler bir uç noktayı paylaşmalıdır. Teğeti sınırlandırmadan önce onları " -"Sınırlandır -> Noktada ile sınırlandırın." +"Eğriler bir uç noktayı paylaşmalıdır. Teğet kısıtlamasından önce onları " +"Kısıtla -> Noktada ile kısıtlayın." #: constraint.cpp:238 msgid "" @@ -332,16 +333,16 @@ msgid "" " * a plane face and a point (minimum distance)\n" " * a circle or an arc (diameter)\n" msgstr "" -"Mesafe / çap sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"Mesafe / çap kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama şunlara " "uygulanabilir:\n" "\n" -" * iki nokta (noktalar arasındaki mesafe)\n" -" * bir çizgi parçası (uzunluk)\n" -" * iki nokta ve bir çizgi parçası veya normal (öngörülen mesafe)\n" -" * bir çalışma düzlemi ve bir nokta (minimum mesafe)\n" -" * bir çizgi parçası ve bir nokta (minimum mesafe)\n" -" * bir düzlem yüzeyi ve bir nokta (minimum mesafe)\n" -" * bir daire veya yay (çap)\n" +" * iki nokta (noktalar arası mesafe)\n" +" * bir çizgi parçası (uzunluk)\n" +" * iki nokta ve bir çizgi parçası veya normal (izdüşüm mesafesi)\n" +" * bir çalışma düzlemi ve bir nokta (minimum mesafe)\n" +" * bir çizgi parçası ve bir nokta (minimum mesafe)\n" +" * bir düzlem yüzeyi ve bir nokta (minimum mesafe)\n" +" * bir daire veya yay (çap)\n" #: constraint.cpp:291 msgid "" @@ -354,14 +355,14 @@ msgid "" " * a point and a circle or arc (point on curve)\n" " * a point and a plane face (point on face)\n" msgstr "" -"Nokta / eğri / düzlem sınırlandırması için hatalı seçim. Bu sınırlandırma " -"şunlara uygulanabilir:\n" +"Noktada / Eğride / Düzlemde kısıtlaması oluşturmak için hatalı seçim. Bu " +"kısıtlama şunlara uygulanabilir:\n" "\n" -" * iki nokta (çakışan noktalar)\n" -" * bir nokta ve bir çalışma düzlemi (düzlemdeki nokta)\n" -" * bir nokta ve bir çizgi parçası (çizgi üzerinde nokta)\n" -" * bir nokta ve bir daire veya yay (eğri üzerinde nokta)\n" -" * bir nokta ve bir düzlem yüzeyi (yüzeyin üzerine gelin)\n" +" * iki nokta (çakışan noktalar)\n" +" * bir nokta ve bir çalışma düzlemi (nokta ile düzlem çakışır)\n" +" * bir nokta ve bir çizgi parçası (nokta ile çizgi çakışır)\n" +" * bir nokta ve bir daire veya yay (nokta ile eğri çakışır)\n" +" * bir nokta ve bir düzlem yüzeyi (nokta ile yüzey çakışır)\n" #: constraint.cpp:353 msgid "" @@ -378,19 +379,19 @@ msgid "" " * two circles or arcs (equal radius)\n" " * a line segment and an arc (line segment length equals arc length)\n" msgstr "" -"Eşit uzunluk / yarıçap sınırlandırması için hatalı seçim. Bu sınırlandırma " -"şunlara uygulanabilir:\n" +"Eşit uzunluk / yarıçap kısıtlaması oluşturmak için hatalı seçim. Bu " +"kısıtlama şunlara uygulanabilir:\n" "\n" -" * iki çizgi parçası (eşit uzunluk)\n" -" * iki çizgi parçası ve iki nokta (eşit nokta-çizgi mesafeleri)\n" -" * bir çizgi parçası ve iki nokta (eşit nokta-çizgi mesafeleri)\n" -" * bir çizgi parçası ve bir nokta ve çizgi parçası (nokta-çizgi mesafesi " -"uzunluğa eşittir)\n" -" * dört çizgi parçası veya normal (A, B ve C, D arasında eşit açı)\n" -" * üç çizgi parçası veya normal (A, B ve B, C arasında eşit açı)\n" -" * iki daire veya yay (eşit yarıçap)\n" -" * bir çizgi parçası ve bir yay (çizgi parçası uzunluğu yay uzunluğuna " -"eşittir)\n" +" * iki çizgi parçası (eşit uzunluk)\n" +" * iki çizgi parçası ve iki nokta (eşit nokta-çizgi arası mesafeler)\n" +" * bir çizgi parçası ve iki nokta (eşit nokta-çizgi arası mesafeler)\n" +" * bir çizgi parçası ve bir nokta ve çizgi parçası (nokta-çizgi arası " +"mesafe, çizgi uzunluğa eşittir)\n" +" * dört çizgi parçası veya normal (A, B ve C, D arasında eşit açı)\n" +" * üç çizgi parçası veya normal (A, B ve B, C arasında eşit açı)\n" +" * iki daire veya yay (eşit yarıçap)\n" +" * bir çizgi parçası ve bir yay (çizgi parçasının uzunluğu, yayın " +"uzunluğuna eşittir)\n" #: constraint.cpp:407 msgid "" @@ -400,6 +401,12 @@ msgid "" " * two arcs\n" " * one arc and one line segment\n" msgstr "" +"Uzunluk oranı kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama " +"aşağıdakiler için geçerli olabilir:\n" +"\n" +" * iki çizgi parçası\n" +" * iki yay\n" +" * bir yay ve bir çizgi parçası\n" #: constraint.cpp:441 msgid "" @@ -410,6 +417,12 @@ msgid "" " * two arcs\n" " * one arc and one line segment\n" msgstr "" +"Uzunluk farkı kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama " +"aşağıdakiler için geçerli olabilir:\n" +"\n" +" * iki çizgi parçası\n" +" * iki yay\n" +" * bir yay ve bir çizgi parçası\n" #: constraint.cpp:472 msgid "" @@ -418,12 +431,12 @@ msgid "" " * a line segment and a point (point at midpoint)\n" " * a line segment and a workplane (line's midpoint on plane)\n" msgstr "" -"Orta nokta sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"Orta nokta kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama şunlara " "uygulanabilir:\n" "\n" -" * bir çizgi parçası ve bir nokta (orta noktayı işaret edin)\n" -" * bir çizgi parçası ve bir çalışma düzlemi (düzlemdeki çizginin orta " -"noktası)\n" +" * bir çizgi parçası ve bir nokta (nokta çizgi ortasında)\n" +" * bir çizgi parçası ve bir çalışma düzlemi (çizgi düzlemin ortasına " +"taşınır )\n" #: constraint.cpp:530 msgid "" @@ -436,22 +449,22 @@ msgid "" " * workplane, and two points or a line segment (symmetric about " "workplane)\n" msgstr "" -"Simetrik sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"Simetri kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama şunlara " "uygulanabilir:\n" "\n" -" * iki nokta veya bir çizgi parçası (çalışma düzleminin koordinat ekseni " -"etrafında simetrik)\n" -" * çizgi parçası ve iki nokta veya bir çizgi parçası (çizgi parçası " -"etrafında simetrik)\n" -" * çalışma düzlemi ve iki nokta veya bir çizgi parçası (çalışma düzlemi " +" * iki nokta veya bir çizgi parçası (çalışma düzleminin koordinat " +"eksenine göre simetrik)\n" +" * çizgi parçası ve iki nokta veya bir çizgi parçası (çizgi parçası " "etrafında simetrik)\n" +" * çalışma düzlemi ve iki nokta veya bir çizgi parçası (çalışma düzlemine " +"göre simetrik)\n" #: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." msgstr "" -"Açık bir simetri düzlemi olmadan simetriyi sınırlandırırken bir çalışma " +"Simetri kısıtlamasında simetri düzlemini olarak kullanılacak bir çalışma " "düzlemi etkin olmalıdır." #: constraint.cpp:579 @@ -459,8 +472,8 @@ msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." msgstr "" -"Yatay veya dikey bir sınırlandırma uygulamadan önce bir çalışma düzlemini " -"(Çizim -> Çalışma Düzleminde menüsü) etkinleştirin." +"Yatay veya dikey bir kısıtlama uygulamadan önce bir çalışma düzlemini (Çizim " +"-> Çalışma Düzleminde menüsü ile) etkinleştirin." #: constraint.cpp:592 msgid "" @@ -470,11 +483,11 @@ msgid "" " * two points\n" " * a line segment\n" msgstr "" -"Yatay / dikey sınırlandırma için hatalı seçim. Bu sınırlandırma şunlara " +"Yatay / Dikey kısıtlama oluşturmak için hatalı seçim. Bu kısıtlama şunlara " "uygulanabilir:\n" "\n" -" * iki nokta\n" -" * bir çizgi parçası\n" +" * iki nokta\n" +" * bir çizgi parçası\n" #: constraint.cpp:613 msgid "" @@ -483,18 +496,18 @@ msgid "" "\n" " * two normals\n" msgstr "" -"Aynı yön sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"Aynı yön kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama şunlara " "uygulanabilir:\n" "\n" -" * iki normal\n" +" * iki normal\n" #: constraint.cpp:663 msgid "Must select an angle constraint." -msgstr "Bir açı sınırlaması seçilmelidir." +msgstr "Bir açı kısıtlaması seçilmelidir." #: constraint.cpp:676 msgid "Must select a constraint with associated label." -msgstr "İlişkili etikete sahip bir sınırlama seçilmelidir." +msgstr "İlgili etikete sahip bir kısıtlama seçilmelidir." #: constraint.cpp:687 msgid "" @@ -504,11 +517,12 @@ msgid "" " * a line segment and a normal\n" " * two normals\n" msgstr "" -"Açı sınırlaması için hatalı seçim. Bu sınırlandırma şunlara uygulanabilir:\n" +"Açı kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama şunlara " +"uygulanabilir:\n" "\n" -" * iki çizgi parçası\n" -" * bir çizgi parçası ve normal\n" -" * iki normal\n" +" * iki çizgi parçası\n" +" * bir çizgi parçası ve normal\n" +" * iki normal\n" #: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." @@ -524,14 +538,13 @@ msgid "" " * two normals (parallel)\n" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" -"Paralel / teğet sınırlaması için hatalı seçim. Bu sınırlandırma şunlara " -"uygulanabilir:\n" +"Paralel / Teğet kısıtlaması oluşturmak için hatalı seçim. Bu kısıtlama " +"şunlara uygulanabilir:\n" "\n" -" * iki çizgi parçası (paralel)\n" -" * bir çizgi parçası ve normal (paralel)\n" -" * iki normal (paralel)\n" -" * bir uç noktayı paylaşan(teğet) iki çizgi parçası, yay veya " -"bezier'ler\n" +" * iki çizgi parçası (paralel)\n" +" * bir çizgi parçası ve normal (paralel)\n" +" * iki normal (paralel)\n" +" * bir uç noktayı paylaşan(teğet) iki çizgi parçası, yay veya bezier'ler\n" #: constraint.cpp:784 msgid "" @@ -541,7 +554,8 @@ msgid "" " * a line segment and a normal\n" " * two normals\n" msgstr "" -"Dikey sınırlama için hatalı seçim. Bu sınırlandırma şunlara uygulanabilir:\n" +"Dikey kısıtlama oluşturmak için hatalı seçim. Bu kısıtlama şunlara " +"uygulanabilir:\n" "\n" " * iki çizgi parçası\n" " * bir çizgi parçası ve normal\n" @@ -554,18 +568,18 @@ msgid "" "\n" " * a point\n" msgstr "" -"Sürüklendiği yerde noktayı sınırlandırmak için hatalı seçim. Bu " -"sınırlandırma şunlara uygulanabilir:\n" +"Sürüklendiği yerde noktayı kısıtlamak için hatalı seçim. Bu kısıtlama " +"şunlara uygulanabilir:\n" "\n" "* bir nokta\n" #: constraint.cpp:813 mouse.cpp:1158 msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "YENİ YORUM - DÜZENLEMEK İÇİN ÇİFT TIKLAYIN" +msgstr "YENI YORUM -- DÜZENLEMEK ICIN CIFT-TIKLAYIN" #: constraint.cpp:818 msgid "click center of comment text" -msgstr "yorum metninin merkezine tıklayın" +msgstr "yorum metninin ortasını tıklatın" #: export.cpp:19 msgid "" @@ -590,12 +604,12 @@ msgstr "" " * aktif bir çalışma düzleminde iken hiçbir şey seçmeyin (çalışma " "düzlemi, kesit düzlemidir)\n" " * bir yüzey (yüzeyden kesit düzlemi)\n" -" * bir nokta ve iki çizgi parçası (nokta boyunca düzlem ve çizgilere " -"paralel)\n" +" * bir nokta ve iki çizgi parçası (nokta ve paralel çizgiler boyunca " +"düzlem)\n" #: export.cpp:818 msgid "Active group mesh is empty; nothing to export." -msgstr "Etkin Mesh grubu boş; dışa aktarılacak bir şey yok." +msgstr "Etkin grup ağı boş; dışa aktarılacak bir şey yok." #: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" @@ -642,7 +656,7 @@ msgstr "" #: file.cpp:867 msgctxt "title" msgid "Missing File" -msgstr "Eksik Dosya" +msgstr "Kayıp Dosya" #: file.cpp:868 #, c-format @@ -658,7 +672,7 @@ msgid "" "If you decline, any geometry that depends on the missing file will be " "permanently removed." msgstr "" -"Yerini manuel olarak mı bulmak istiyorsunuz?\n" +"Konumu El ile bulmak istiyor musunuz?\n" "\n" "Reddederseniz, eksik dosyaya bağlı olan geometri kalıcı olarak " "kaldırılacaktır." @@ -720,7 +734,7 @@ msgstr "3d &TelKafes olarak dışa aktar..." #: graphicswin.cpp:52 msgid "Export Triangle &Mesh..." -msgstr "&Üçgensel Mesh olarak dışa aktar..." +msgstr "&Üçgensel Ağ olarak dışa aktar..." #: graphicswin.cpp:53 msgid "Export &Surfaces..." @@ -780,7 +794,7 @@ msgstr "&Sil" #: graphicswin.cpp:74 msgid "Select &Edge Chain" -msgstr "Kenar &Zincirini Seçin" +msgstr "Kenar &Zincirini Seç" #: graphicswin.cpp:75 msgid "Select &All" @@ -824,7 +838,7 @@ msgstr "Görünümü &Çalışma Düzlemine Hizala" #: graphicswin.cpp:90 msgid "Nearest &Ortho View" -msgstr "En Yakın &Orto Görünüm" +msgstr "En Yakın &Dik Görünüm" #: graphicswin.cpp:91 msgid "Nearest &Isometric View" @@ -836,7 +850,7 @@ msgstr "&Noktayı Merkezde Görüntüle" #: graphicswin.cpp:94 msgid "Show Snap &Grid" -msgstr "&Izgarayı Göster" +msgstr "Yakalama &Izgarasını Göster" #: graphicswin.cpp:95 msgid "Darken Inactive Solids" @@ -844,11 +858,11 @@ msgstr "Aktif Olmayan Katıları &Koyulaştır" #: graphicswin.cpp:96 msgid "Use &Perspective Projection" -msgstr "&Perspektif Projeksiyonu Kullanın" +msgstr "&Perspektif Projeksiyonu Kullan" #: graphicswin.cpp:97 msgid "Show E&xploded View" -msgstr "" +msgstr "Pat&latılmış Görünümü Göster" #: graphicswin.cpp:98 msgid "Dimension &Units" @@ -868,7 +882,7 @@ msgstr "&İnç cinsinden ölçü" #: graphicswin.cpp:102 msgid "Dimensions in &Feet and Inches" -msgstr "" +msgstr "&Fit ve İnç cinsinden ölçü" #: graphicswin.cpp:104 msgid "Show &Toolbar" @@ -876,7 +890,7 @@ msgstr "&Araç Çubuğunu Göster" #: graphicswin.cpp:105 msgid "Show Property Bro&wser" -msgstr "&Özellik Tarayıcısını Göster" +msgstr "&Özellik Penceresini Göster" #: graphicswin.cpp:107 msgid "&Full Screen" @@ -896,15 +910,15 @@ msgstr "&Yeni Çalışma Düzleminde Çizim Yap" #: graphicswin.cpp:113 msgid "Step &Translating" -msgstr "Adım &Ötele" +msgstr "&Doğrusal Kopya" #: graphicswin.cpp:114 msgid "Step &Rotating" -msgstr "Adım &Döndür" +msgstr "D&airesel Kopya" #: graphicswin.cpp:116 msgid "E&xtrude" -msgstr "&Katıla" +msgstr "&Uzatarak Katıla" #: graphicswin.cpp:117 msgid "&Helix" @@ -912,11 +926,11 @@ msgstr "&Helis" #: graphicswin.cpp:118 msgid "&Lathe" -msgstr "&Çark" +msgstr "&Tam döndürerek katıla" #: graphicswin.cpp:119 msgid "Re&volve" -msgstr "Dö&ndür" +msgstr "&Kısmen döndürerek katıla" #: graphicswin.cpp:121 msgid "Link / Assemble..." @@ -948,11 +962,11 @@ msgstr "Ça&lışma Düzlemi" #: graphicswin.cpp:131 msgid "Line &Segment" -msgstr "Çizgi &Parçası" +msgstr "Ç&izgi" #: graphicswin.cpp:132 msgid "C&onstruction Line Segment" -msgstr "&Yapı Çizgisi Parçası" +msgstr "&Yardımcı Çizgi" #: graphicswin.cpp:133 msgid "&Rectangle" @@ -960,7 +974,7 @@ msgstr "&Dikdörtgen" #: graphicswin.cpp:134 msgid "&Circle" -msgstr "&Çember" +msgstr "D&aire" #: graphicswin.cpp:135 msgid "&Arc of a Circle" @@ -976,7 +990,7 @@ msgstr "TrueType Yazı Tipinde &Metin" #: graphicswin.cpp:139 msgid "&Image" -msgstr "&Resim" +msgstr "&Resim / Görüntü" #: graphicswin.cpp:141 msgid "To&ggle Construction" @@ -984,15 +998,15 @@ msgstr "Yap&ıyı Değiştir" #: graphicswin.cpp:142 msgid "Tangent &Arc at Point" -msgstr "Noktada &Teğet Yay" +msgstr "&Yuvarlat (Radyus)" #: graphicswin.cpp:143 msgid "Split Curves at &Intersection" -msgstr "Kesişim yerinde Eğrileri &Böl" +msgstr "Eğrileri Kesişim Yerinden &Böl" #: graphicswin.cpp:145 msgid "&Constrain" -msgstr "&Sınırlandır" +msgstr "&Kısıtla" #: graphicswin.cpp:146 msgid "&Distance / Diameter" @@ -1036,11 +1050,11 @@ msgstr "&Eşit Uzunluk / Yarıçap / Açı" #: graphicswin.cpp:158 msgid "Length / Arc Ra&tio" -msgstr "" +msgstr "&Uzunluk / Yay Oranı" #: graphicswin.cpp:159 msgid "Length / Arc Diff&erence" -msgstr "" +msgstr "Uzunluk / Yay &Farkı" #: graphicswin.cpp:160 msgid "At &Midpoint" @@ -1072,23 +1086,23 @@ msgstr "Y&orum" #: graphicswin.cpp:169 msgid "&Analyze" -msgstr "&Analiz Et" +msgstr "&Analiz" #: graphicswin.cpp:170 msgid "Measure &Volume" -msgstr "&Hacmi Ölçün" +msgstr "&Hacmi Hesapla" #: graphicswin.cpp:171 msgid "Measure A&rea" -msgstr "&Alanı Ölçün" +msgstr "&Alanı Hesapla" #: graphicswin.cpp:172 msgid "Measure &Perimeter" -msgstr "&Çevre Uzunluğunu Ölçün" +msgstr "&Çevre Uzunluğunu Hesapla" #: graphicswin.cpp:173 msgid "Show &Interfering Parts" -msgstr "&Engelleyen Parçaları Göster" +msgstr "&Engelleyici Parçaları Göster" #: graphicswin.cpp:174 msgid "Show &Naked Edges" @@ -1100,19 +1114,19 @@ msgstr "&Kütle Merkezini Göster" #: graphicswin.cpp:177 msgid "Show &Underconstrained Points" -msgstr "&Sınırlanmamış Noktaları Göster" +msgstr "Kı&sıtlanmamış Noktaları Göster" #: graphicswin.cpp:179 msgid "&Trace Point" -msgstr "&Noktayı İzle" +msgstr "&İzlenecek Nokta" #: graphicswin.cpp:180 msgid "&Stop Tracing..." -msgstr "&İzlemeyi &Durdur..." +msgstr "&İzlemeyi Durdur..." #: graphicswin.cpp:181 msgid "Step &Dimension..." -msgstr "Adım &Ölçüsü..." +msgstr "Adım &Ölçüsünü Ayarla..." #: graphicswin.cpp:183 msgid "&Help" @@ -1128,7 +1142,7 @@ msgstr "&Web sitesi / Kılavuz" #: graphicswin.cpp:186 msgid "&Go to GitHub commit" -msgstr "" +msgstr "GitHub Commitlere git" #: graphicswin.cpp:188 msgid "&About" @@ -1136,7 +1150,7 @@ msgstr "&Hakkında" #: graphicswin.cpp:362 msgid "(no recent files)" -msgstr "(yeni dosyalar yok)" +msgstr "(son dosyalar yok)" #: graphicswin.cpp:370 #, c-format @@ -1155,21 +1169,20 @@ msgid "" "For a perspective projection, modify the perspective factor in the " "configuration screen. A value around 0.3 is typical." msgstr "" -"Perspektif çarpanı sıfıra ayarlanmıştır, bu nedenle görünüm her zaman " +"Perspektif katsayısı sıfıra ayarlanmıştır, bu nedenle görünüm her zaman " "paralel bir projeksiyon olacaktır.\n" "\n" -"Perspektif bir projeksiyon için, konfigürasyon ekranındaki perspektif " -"çarpanını değiştirin. 0,3 civarında bir değer tipiktir." +"Perspektif bir projeksiyon için, yapılandırma ekranındaki perspektif " +"katsayısını değiştirin. 0.3 civarında bir değer normaldir." #: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." -msgstr "" -"Bir nokta seçin; bu nokta ekrandaki görüntünün merkezi haline gelecektir." +msgstr "Bir nokta seçin; bu nokta ekrandaki görüntünün merkezi olacaktır." #: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." -msgstr "Hiçbir ek öğe, seçili öğeler ile uç noktaları paylaşmaz." +msgstr "Hiçbir ek öğe, seçili öğeler ile uç noktaları paylaşmıyor." #: graphicswin.cpp:1155 msgid "" @@ -1184,17 +1197,17 @@ msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -"Etkin çalışma düzlemi yok. Tutturma ızgarasının düzlemini tanımlamak için " -"bir çalışma düzlemini (Çizim -> Çalışma Düzleminde menüsü ile) etkinleştirin." +"Hiçbir çalışma düzlemi etkin değil. Izgaranın yakalanacağı düzlemini " +"tanımlamak için bir çalışma düzlemini (Çizim -> Çalışma Düzleminde ile) " +"etkinleştirin." #: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." msgstr "" -"Bu öğeleri ızgaraya tutturamazsınız; noktaları, metin yorumlarını veya " -"sınırlamaları bir etiketle seçin. Bir çizgiyi tutturmak için uç noktalarını " -"seçin." +"Bu öğeler ızgaraya tutturulamıyor; etiketli noktaları, metin yorumlarını " +"veya kısıtlamaları seçin. Bir çizgiyi tutturmak için uç noktalarını seçin." #: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." @@ -1208,8 +1221,8 @@ msgid "" "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." msgstr "" -"Hiçbir çalışma düzlemi seçilmemiştir ve aktif grubun varsayılan bir çalışma " -"düzlemi yoktur. Bir çalışma düzlemi seçmeyi veya yeni çalışma düzleminde " +"Hiçbir çalışma düzlemi seçilmedi ve aktif grubun varsayılan bir çalışma " +"düzlemi yok. Bir çalışma düzlemi seçmeyi veya bir yeni çalışma düzleminde " "çizim grubunu etkinleştirmeyi deneyin." #: graphicswin.cpp:1294 @@ -1217,8 +1230,8 @@ msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -"Noktada teğet yay oluşturmak için hatalı seçim. Tek bir nokta seçin veya yay " -"parametrelerini ayarlamak için hiçbir şey seçmeyin." +"Noktada teğet yay (radyus) oluşturmak için hatalı seçim. Tek bir nokta seçin " +"veya yay parametrelerini ayarlamak için hiçbir şey seçmeyin." #: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" @@ -1226,7 +1239,7 @@ msgstr "yayın ilk noktası için tıklayın (saat yönünün tersine çizilir)" #: graphicswin.cpp:1306 msgid "click to place datum point" -msgstr "referans noktasını yerleştirmek için tıklayın" +msgstr "referans noktayı yerleştirmek için tıklayın" #: graphicswin.cpp:1307 msgid "click first point of line segment" @@ -1234,44 +1247,44 @@ msgstr "çizgi parçasının ilk noktası için tıklayın" #: graphicswin.cpp:1309 msgid "click first point of construction line segment" -msgstr "yapı çizgisinin ilk noktası için tıklayın" +msgstr "yardımcı çizginin ilk noktası için tıklayın" #: graphicswin.cpp:1310 msgid "click first point of cubic segment" -msgstr "kübik segmentin ilk noktası için tıklayın" +msgstr "kübik eğri parçanın ilk noktası için tıklayın" #: graphicswin.cpp:1311 msgid "click center of circle" -msgstr "çemberin merkezi için tıklayın" +msgstr "dairenin merkez konumu için tıklayın" #: graphicswin.cpp:1312 msgid "click origin of workplane" -msgstr "çalışma düzleminin merkezi için tıklayın" +msgstr "çalışma düzleminin merkez konumu için tıklayın" #: graphicswin.cpp:1313 msgid "click one corner of rectangle" -msgstr "dikdörtgenin bir köşesi için tıklayın" +msgstr "dikdörtgenin bir köşe noktası için tıklayın" #: graphicswin.cpp:1314 msgid "click top left of text" -msgstr "metnin sol üst köşesi için tıklayın" +msgstr "metnin sol üst köşe konumu için tıklayın" #: graphicswin.cpp:1320 msgid "click top left of image" -msgstr "resmin sol üst köşesi için tıklayın" +msgstr "görüntünün sol üst köşe konumu için tıklayın" #: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." msgstr "" -"Hiçbir öğe seçilmedi. Yapı durumlarını geçiş yapmaya çalışmadan önce öğeleri " +"Hiçbir öğe seçilmedi. Yapı durumlarını değiştirmeye çalışmadan önce öğeleri " "seçin." #: group.cpp:86 msgctxt "group-name" msgid "sketch-in-3d" -msgstr "3d-içinde-çizim" +msgstr "3d-de-çizim" #: group.cpp:150 msgid "" @@ -1283,24 +1296,32 @@ msgid "" " * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" +"Çalışma düzleminde yeni çizim oluşturmak için hatalı seçim. Bu grup " +"aşağıdakilerle oluşturulabilir:\n" +"\n" +" * bir nokta (noktadan geçen, koordinat eksenine dik)\n" +" * bir nokta ve iki doğru parçası (noktadan geçen, doğrulara paralel)\n" +" * bir nokta ve bir normal (noktadan normale dik)\n" +" * bir çalışma düzlemi (çalışma düzleminin kopyası)\n" #: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." msgstr "" -"Katılama işleminden önce bir çalışma düzlemini etkinleştirin (Çizim -> " -"Çalışma Düzleminde menüsü). Çizim, çalışma düzlemine dik olarak " -"katılanacaktır." +"Katılama işleminden önce bir çalışma düzlemini etkinleştirin. Çizim, " +"çalışma düzlemine dik olarak katılanacaktır." #: group.cpp:175 msgctxt "group-name" msgid "extrude" -msgstr "katıla" +msgstr "doğrusal katıla" #: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." -msgstr "Çark işlemi yalnızca düzlemsel çizimlere uygulanabilir." +msgstr "" +"Tam tur döndürerek katılama işlemi, yalnızca düzlemsel çizimlere " +"uygulanabilir." #: group.cpp:191 msgid "" @@ -1310,20 +1331,23 @@ msgid "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" msgstr "" -"Yeni çark grubu için hatalı seçim. Bu grup şu şekilde oluşturulabilir:\n" +"Tamamen döndürerek yeni katılama grubu oluşturmak için hatalı seçim. Bu grup " +"şu şekilde oluşturulabilir:\n" "\n" -" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel " +" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel " "bir eksen etrafında, nokta boyunca döndürülür )\n" -" * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n" +" * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n" #: group.cpp:201 msgctxt "group-name" msgid "lathe" -msgstr "çark" +msgstr "tamamen döndürerek katıla" #: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." -msgstr "Döndürme işlemi yalnızca düzlemsel çizimlere uygulanabilir." +msgstr "" +"Kısmen döndürerek katılama işlemi, yalnızca düzlemsel çizimlere " +"uygulanabilir." #: group.cpp:217 msgid "" @@ -1333,7 +1357,9 @@ msgid "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" msgstr "" -"Yeni döndürme grup için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n" +"Kısmen döndürerek yeni katılama grubu oluşturmak için hatalı seçim. Bu grup " +"şu şekilde oluşturulabilir:\n" +"\n" "\n" " * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel, " "noktadan geçen bir eksen etrafında döndürülür)\n" @@ -1342,7 +1368,7 @@ msgstr "" #: group.cpp:229 msgctxt "group-name" msgid "revolve" -msgstr "döndür" +msgstr "kısmen döndürerek katıla" #: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." @@ -1356,7 +1382,8 @@ msgid "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" msgstr "" -"Yeni helis grubu için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n" +"Yeni helis grubu oluşturmak için hatalı seçim. Bu grup şunlarla " +"oluşturulabilir:\n" "\n" " * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel, " "noktadan geçen bir eksen etrafında döndürülür)\n" @@ -1376,22 +1403,23 @@ msgid "" " * a point and a line or a normal (rotate about an axis through the " "point, and parallel to line / normal)\n" msgstr "" -"Yeni çevirme için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n" +"Yeni dairesel kopyalama/çoğaltma oluşturmak için hatalı seçim. Bu grup " +"şunlarla oluşturulabilir:\n" "\n" -" * çalışma düzleminde bir nokta, kilitli olduğu sürece (düzlemde o nokta " +" * bir nokta, çalışma düzleminde kilitli olduğu sürece (düzlemde o nokta " "etrafında çevirin)\n" -" * bir nokta ve bir çizgi veya bir normal (nokta boyunca bir eksen " -"etrafında ve çizgiye / normale paralel çevirin)\n" +" * bir nokta ve bir çizgi veya bir normal ( çizgiye / normale paralel ve " +"noktadan geçen bir eksen etrafında çevirin)\n" #: group.cpp:283 msgctxt "group-name" msgid "rotate" -msgstr "çevir" +msgstr "dairesel kopya" #: group.cpp:294 msgctxt "group-name" msgid "translate" -msgstr "ötele" +msgstr "doğrusal kopya" #: group.cpp:416 msgid "(unnamed)" @@ -1399,7 +1427,7 @@ msgstr "(isimsiz)" #: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" -msgstr "kapalı olmayan kontur veya tümü aynı biçimde değil!" +msgstr "kapali olmayan kontur veya tümü ayni bicimde degil!" #: groupmesh.cpp:720 msgid "points not all coplanar!" @@ -1407,15 +1435,15 @@ msgstr "noktaların hepsi aynı düzlemde değil!" #: groupmesh.cpp:722 msgid "contour is self-intersecting!" -msgstr "kontur kendisiyle kesişiyor!" +msgstr "kontur kendisiyle kesisiyor!" #: groupmesh.cpp:724 msgid "zero-length edge!" -msgstr "sıfır-uzunlukta kenar!" +msgstr "sıfır-uzunluklu kenar!" #: importmesh.cpp:136 msgid "Text-formated STL files are not currently supported" -msgstr "" +msgstr "Metin-biçimli STL dosyaları şu anda desteklenmiyor" #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." @@ -1426,8 +1454,8 @@ msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." msgstr "" -"Bir teğet yay oluşturmak için, bu gruptaki iki yapı-dışı çizginin veya " -"dairenin ve çalışma düzleminin birleştiği bir nokta seçin." +"Bir teğet yay oluşturmak için, bu gruptaki iki (yardımcı) referans-olmayan " +"çizginin veya dairenin ve çalışma düzleminin birleştiği bir nokta seçin." #: modify.cpp:386 msgid "" @@ -1435,23 +1463,25 @@ msgid "" "desired geometry by hand with tangency constraints." msgstr "" "Bu köşe yuvarlatılamadı. Daha küçük bir yarıçap deneyin veya teğet " -"sınırlamaları ile istenen geometriyi elle oluşturmayı deneyin." +"kısıtlamaları ile istenen geometriyi elle oluşturmayı deneyin." #: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." -msgstr "Bu öğeler bölünemedi; yalnızca çizgiler, çemberler veya küpler." +msgstr "" +"Bu öğe bölünemedi; yalnızca çizgiler, daireler veya kübik eğriler " +"bölünebilir." #: modify.cpp:622 msgid "Must be sketching in workplane to split." -msgstr "Bölmek için çalışma düzleminde çizim olmalı." +msgstr "Bölmek için çalışma düzleminde çizim yapılıyor olmalı." #: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" -"Birbiriyle kesişen iki öğe seçin (örneğin iki çizgi / çember / yay veya bir " -"çizgi / çember / yay ve bir nokta)." +"Birbiriyle kesişen iki öğe seçin (örneğin iki çizgi / daire / yay veya bir " +"çizgi / daire / yay ve bir nokta)." #: modify.cpp:734 msgid "Can't split; no intersection found." @@ -1459,7 +1489,7 @@ msgstr "Bölünemez; kesişim bulunamadı." #: mouse.cpp:557 msgid "Assign to Style" -msgstr "Biçime Ata" +msgstr "Biçim Ata" #: mouse.cpp:573 msgid "No Style" @@ -1479,11 +1509,11 @@ msgstr "Biçim Bİlgisi" #: mouse.cpp:623 msgid "Select Edge Chain" -msgstr "Kenar Zinciri Seçin" +msgstr "Kenar Zinciri Seç" #: mouse.cpp:629 msgid "Toggle Reference Dimension" -msgstr "Ölçü Referansını Değiştir" +msgstr "Referans Ölçüyü Değiştir" #: mouse.cpp:635 msgid "Other Supplementary Angle" @@ -1511,7 +1541,7 @@ msgstr "Yapıyı değiştir" #: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" -msgstr "Çakışan-Nokta Sınırlamasını Sil" +msgstr "Çakışık-Nokta Kısıtlamasını Sil" #: mouse.cpp:747 msgid "Cut" @@ -1543,7 +1573,7 @@ msgstr "Tüm Seçimi Kaldır" #: mouse.cpp:775 msgid "Unselect Hovered" -msgstr "Fareyle Üzerine Gelinen Seçimi Kaldır" +msgstr "Üzerine Gelinen Seçimi Kaldır" #: mouse.cpp:784 msgid "Zoom to Fit" @@ -1563,7 +1593,7 @@ msgstr "" #: mouse.cpp:1026 msgid "click to place other corner of rectangle" -msgstr "dikdörtgenin diğer köşesini yerleştirmek için tıklayın" +msgstr "dikdörtgenin diğer köşesini belirtmek için tıklayın" #: mouse.cpp:1047 msgid "click to set radius" @@ -1583,7 +1613,7 @@ msgstr "noktayı yerleştirmek için tıklayın" #: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" -msgstr "sonraki kübik noktayı tıklayın veya Esc tuşuna basın" +msgstr "sonraki kübik eğri noktasını tıklayın veya Esc tuşuna basın" #: mouse.cpp:1092 msgid "" @@ -1602,15 +1632,15 @@ msgstr "" #: mouse.cpp:1125 msgid "click to place bottom right of text" -msgstr "metnin sağ alt konumunu yerleştirmek için tıklayın" +msgstr "metnin sağ alt konumunu belirtmek için tıklayın" #: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -"3d'de resim eklenemez; önce Çizim -> Çalışma Düzleminde menüsü ile bir " -"çalışma düzlemini etkinleştirin." +"3d'de görüntü/resim eklenemez; önce Çizim -> Çalışma Düzleminde menüsü ile " +"bir çalışma düzlemini etkinleştirin." #: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" @@ -1620,7 +1650,7 @@ msgstr "SolveSpace Modelleri" #: platform/gui.cpp:89 msgctxt "file-type" msgid "ALL" -msgstr "" +msgstr "TÜMÜ" #: platform/gui.cpp:91 msgctxt "file-type" @@ -1630,32 +1660,32 @@ msgstr "IDF devre kartı" #: platform/gui.cpp:92 msgctxt "file-type" msgid "STL triangle mesh" -msgstr "" +msgstr "STL üçgensel mesh (ağ/kafes)" #: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" -msgstr "PNG Resmi" +msgstr "PNG Görüntüsü" #: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" -msgstr "STL mesh" +msgstr "STL mesh (ağ/kafes)" #: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" -msgstr "Wavefront OBJ mesh" +msgstr "Wavefront OBJ mesh (ağ/kafes)" #: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" -msgstr "Görüntüleyicili, Three.js-uyumlu mesh" +msgstr "Görüntüleyicili, Three.js-uyumlu mesh (ağ/kafes)" #: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" -msgstr "Three.js-uyumlu mesh, yalnızca mesh" +msgstr "Three.js-uyumlu mesh, sadece mesh (ağ/kafes)" #: platform/gui.cpp:104 msgctxt "file-type" @@ -1675,7 +1705,7 @@ msgstr "PDF dosyası" #: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" -msgstr "Kapsüllenmiş PostScript" +msgstr "Encapsulated PostScript (EPS)" #: platform/gui.cpp:114 msgctxt "file-type" @@ -1756,7 +1786,7 @@ msgstr "Bunun yerine otomatik kaydetme dosyasını yüklemek istiyor musunuz?" #: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" -msgstr "&Otomatik kaydetmeyi yükle" +msgstr "&Otomatik kaydı yükle" #: solvespace.cpp:176 msgctxt "button" @@ -1802,7 +1832,7 @@ msgstr "(yeni çizim)" #: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" -msgstr "Özellik Tarayıcısı" +msgstr "Özellik Penceresi" #: solvespace.cpp:700 msgid "" @@ -1810,8 +1840,8 @@ msgid "" "is probably not what you want; hide them by clicking the link at the top of " "the text window." msgstr "" -"Sınırlamalar şu anda gösterilmektedir ve takım yolunda dışa aktarılacaktır. " -"Muhtemelen istediğiniz bu değil; metin penceresinin üst kısmındaki " +"Kısıtlamalar şu anda gösterilmektedir ve takım yolunda dışa aktarılacaktır. " +"Muhtemelen istediğiniz bu değil; Özellik Penceresinin üst kısmındaki " "bağlantıya tıklayarak bunları gizleyin." #: solvespace.cpp:772 @@ -1820,21 +1850,20 @@ msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -"Dosya türü '%s' dosya uzantısından tanımlanamıyor; .dxf veya .dwg'yi deneyin." +"'%s' dosya adının dosya uzantısından dosya türü belirlenemiyor; .dxf veya ." +"dwg'yi deneyin." #: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." -msgstr "Sınırlamanın bir etiketi olmalı ve bir referans ölçüsü olmamalıdır." +msgstr "Kısıtlamanın bir etiketi olmalı ve bir referans ölçüsü olmamalıdır." #: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." -msgstr "" -"Adım ölçüsü için hatalı seçim; bir nokta boyunca, eksenleri koordine etmek " -"için ortogonal seçin." +msgstr "Adım ölçüsü ayarlamak için hatalı seçim; bir kısıtlama seçin." #: solvespace.cpp:852 msgid "The assembly does not interfere, good." -msgstr "Montaj engel değil, iyi." +msgstr "Montajda engel oluşturan parça yok, iyi." #: solvespace.cpp:868 #, c-format @@ -1845,7 +1874,7 @@ msgid "" msgstr "" "Katı modelin hacmi:\n" "\n" -" % s" +" % s" #: solvespace.cpp:877 #, c-format @@ -1856,7 +1885,7 @@ msgid "" " %s" msgstr "" "\n" -"Mevcut mesh grubunun hacmi:\n" +"Mevcut ağ (kafes) grubunun hacmi:\n" "\n" " %s" @@ -1869,8 +1898,8 @@ msgid "" msgstr "" "\n" "\n" -"Eğri yüzeyler, üçgenler olarak yaklaştırılmıştır.\n" -"Bu, tipik olarak yaklaşık 1% hataya neden olur." +"Kavisli (Eğri) yüzeyler üçgenler olarak yaklaştırılmıştır.\n" +"Bu, genel olarak yaklaşık 1% hataya neden olur." #: solvespace.cpp:897 #, c-format @@ -1882,19 +1911,19 @@ msgid "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." msgstr "" -"Seçilen yüzlerin yüzey alanı:\n" +"Seçili yüzlerin yüzey alanı:\n" "\n" " %s\n" "\n" -"Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" -"Bu, tipik olarak yaklaşık 1%% hataya neden olur." +"Eğriler, doğrusal parçalı olarak yaklaştırılmıştır.\n" +"Bu, genel olarak yaklaşık 1%% hataya neden olur." #: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -"Bu grup, doğru biçimlendirilmiş 2d kapalı alan içermiyor. Açık, eş düzlemli " +"Bu grup, doğru biçimlendirilmiş 2d kapalı alan içermiyor. Açık, eş-düzlemli " "değil veya kendisiyle kesişiyor." #: solvespace.cpp:918 @@ -1911,8 +1940,8 @@ msgstr "" "\n" " %s\n" "\n" -"Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" -"Bu, tipik olarak yaklaşık 1%% hataya neden olur." +"Eğriler, doğrusal parçalı olarak yaklaştırılmıştır.\n" +"Bu, genel olarak yaklaşık 1%% hataya neden olur." #: solvespace.cpp:938 #, c-format @@ -1929,38 +1958,38 @@ msgstr "" " %s\n" "\n" "Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" -"Bu, tipik olarak yaklaşık 1%% hataya neden olur." +"Bu, genel olarak yaklaşık 1%% hataya neden olur." #: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -"Çevre uzunluğu için hatalı seçim; çizgi parçalarını, yayları ve eğrileri " -"seçin." +"Çevre uzunluğunu hesabı için hatalı seçim; çizgi parçalarını, yayları ve " +"eğrileri seçin." #: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." -msgstr "İzleme için hatalı seçim; tek bir nokta seçin." +msgstr "Nokta izleme işlemi için hatalı seçim; tek bir nokta seçin." #: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" -msgstr "\"%s\" ye yazılamadı" +msgstr "\"%s\" öğesine yazılamadı" #: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." -msgstr "Mesh kendisiyle kesişiyor (TAMAM değil, geçersiz)." +msgstr "Ağ (Kafes) kendisiyle kesişiyor (İyi DEĞİL, geçersiz)." #: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." -msgstr "Mesh kendi kendine kesişmiyor (tamam, geçerli)." +msgstr "Ağ (Kafes) kendisi ile kesişmiyor (iyi, geçerli)." #: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." -msgstr "Mesh'in açık kenarları var (tamam DEĞİL, geçersiz)." +msgstr "Ağın (Kafesin) açık kenarları var (iyi DEĞİL, geçersiz)." #: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." -msgstr "Mesh çok sıkı (tamam, geçerli)" +msgstr "Ağ (Kafes) çok sıkı (iyi, geçerli)" #: solvespace.cpp:1024 #, c-format @@ -1971,7 +2000,7 @@ msgid "" msgstr "" "\n" "\n" -"Model, %d yüzeylerden %d üçgen içerir." +"Model, %d yüzeyden %d üçgen içeriyor." #: solvespace.cpp:1028 #, c-format @@ -2021,10 +2050,10 @@ msgid "" msgstr "" "Bu SolveSpace'in %s sürümüdür.\n" "\n" -"Daha fazla bilgi için, http://solvespace.com/ bkz.\n" +"Daha fazla bilgi için bkz., http://solvespace.com/\n" "\n" "SolveSpace ücretsiz bir yazılımdır: GNU Genel Kamu \n" -"Lisansı (GPL) sürüm 3 veya daha sonraki hükümler altında \n" +"Lisansı (GPL) sürüm 3 veya daha sonraki hükümleri altında \n" "onu değiştirmekte ve / veya yeniden dağıtmakta özgürsünüz.\n" "\n" "Yasaların izin verdiği ölçüde GARANTİ YOKTUR. \n" @@ -2046,11 +2075,11 @@ msgstr "Biçim adı boş olamaz" #: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." -msgstr "1 defadan az tekrar edilemez." +msgstr "1 defadan az tekrarlanamaz." #: textscreens.cpp:795 msgid "Can't repeat more than 999 times." -msgstr "999 defadan fazla tekrar edilemez." +msgstr "999 defadan fazla tekrarlanamaz." #: textscreens.cpp:820 msgid "Group name cannot be empty" @@ -2066,87 +2095,87 @@ msgstr "Yarıçap sıfır veya negatif değer olamaz." #: toolbar.cpp:18 msgid "Sketch line segment" -msgstr "Çizgi parçası ile taslak çizin" +msgstr "Çizgi parçası çiz" #: toolbar.cpp:20 msgid "Sketch rectangle" -msgstr "Dikdörtgen çizin" +msgstr "Dikdörtgen çiz" #: toolbar.cpp:22 msgid "Sketch circle" -msgstr "Çember çizin" +msgstr "Daire çiz" #: toolbar.cpp:24 msgid "Sketch arc of a circle" -msgstr "Bir çember yayı çizin" +msgstr "Bir çember yayı çiz" #: toolbar.cpp:26 msgid "Sketch curves from text in a TrueType font" -msgstr "TrueType yazı tipindeki metinden eğriler çizin" +msgstr "TrueType yazı tipindeki metinden eğriler çiz" #: toolbar.cpp:28 msgid "Sketch image from a file" -msgstr "Bir dosyadan resim ekleyin" +msgstr "Bir dosyadan görüntü (resim) ekle" #: toolbar.cpp:30 msgid "Create tangent arc at selected point" -msgstr "Seçilen noktada teğet yay oluşturun" +msgstr "Seçilen noktada radyus (teğet yay) oluştur" #: toolbar.cpp:32 msgid "Sketch cubic Bezier spline" -msgstr "Kübik Bezier Eğri Çizin" +msgstr "Kübik Bezier Eğri Çiz" #: toolbar.cpp:34 msgid "Sketch datum point" -msgstr "Referans Nokta Ekleyin" +msgstr "Referans Nokta Ekle" #: toolbar.cpp:36 msgid "Toggle construction" -msgstr "Yapıyı değiştirin" +msgstr "Yapıyı değiştir" #: toolbar.cpp:38 msgid "Split lines / curves where they intersect" -msgstr "Çizgileri / eğrileri kesiştikleri yerde bölün" +msgstr "Çizgileri / eğrileri kesiştikleri yerden böl" #: toolbar.cpp:42 msgid "Constrain distance / diameter / length" -msgstr "Mesafeyi / çapı / uzunluğu sınırlandırın" +msgstr "Mesafeyi / çapı / uzunluğu kısıtla" #: toolbar.cpp:44 msgid "Constrain angle" -msgstr "Açıyı sınırlandırın" +msgstr "Açıyı kısıtla" #: toolbar.cpp:46 msgid "Constrain to be horizontal" -msgstr "Yatay olarak sınırlandırın" +msgstr "Yatay olarak kısıtla" #: toolbar.cpp:48 msgid "Constrain to be vertical" -msgstr "Dikey olarak sınırlandırın" +msgstr "Dikey olarak kısıtla" #: toolbar.cpp:50 msgid "Constrain to be parallel or tangent" -msgstr "Paralel veya teğet olarak sınırlandırın" +msgstr "Paralel veya teğet olarak kısıtla" #: toolbar.cpp:52 msgid "Constrain to be perpendicular" -msgstr "Dik olarak sınırlandırın" +msgstr "Dik olarak kısıtla" #: toolbar.cpp:54 msgid "Constrain point on line / curve / plane / point" -msgstr "Noktayı çizgi / eğri / düzlem / nokta ile çakıştırarak sınırlandırın" +msgstr "Noktayı çizgi / eğri / düzlem / nokta ile çakıştırarak kısıtla" #: toolbar.cpp:56 msgid "Constrain symmetric" -msgstr "Simetrik olarak sınırlandırın" +msgstr "Simetrik olarak kısıtla" #: toolbar.cpp:58 msgid "Constrain equal length / radius / angle" -msgstr "Eşit uzunluk / yarıçap / açı olarak sınırlandırın" +msgstr "Eşit uzunluk / yarıçap / açı olarak kısıtla" #: toolbar.cpp:60 msgid "Constrain normals in same orientation" -msgstr "Normalleri aynı yönde sınırlandırın" +msgstr "Normalleri aynı yönde kısıtla" #: toolbar.cpp:62 msgid "Other supplementary angle" @@ -2158,11 +2187,11 @@ msgstr "Ölçüyü Referans Yap / Yapma" #: toolbar.cpp:68 msgid "New group extruding active sketch" -msgstr "Etkin çizimi katılayarak yeni grup oluşturun" +msgstr "Etkin çizimi uzatıp katılayarak yeni grup oluştur" #: toolbar.cpp:70 msgid "New group rotating active sketch" -msgstr "Etkin çizimi döndürerek yeni grup oluşturun" +msgstr "Etkin çizimi tam döndürerek yeni grup oluştur" #: toolbar.cpp:72 msgid "New group helix from active sketch" @@ -2170,28 +2199,28 @@ msgstr "Etkin çizimden sarmal yeni grup oluştur" #: toolbar.cpp:74 msgid "New group revolve active sketch" -msgstr "Etkin çizimi döndürülür yeni grup oluşturun" +msgstr "Etkin çizimi kısmen döndürerek yeni grup oluştur" #: toolbar.cpp:76 msgid "New group step and repeat rotating" -msgstr "Adımlayarak ve tekrarlayarak yeni dönüş grup oluşturun" +msgstr "Adım ve tekrar değeri belirterek dairesel kopya grubu oluştur" #: toolbar.cpp:78 msgid "New group step and repeat translating" -msgstr "Adımlayarak ve tekrarlayarak yeni öteleme grup oluşturun" +msgstr "Adım ve tekrar değeri belirterek yeni doğrusal kopyalama grup oluştur" #: toolbar.cpp:80 msgid "New group in new workplane (thru given entities)" msgstr "" -"Yeni çalışma düzleminde yeni grup oluşturun (verilen öğeler aracılığıyla)" +"Yeni çalışma düzleminde yeni grup oluştur (verilen öğeler aracılığıyla)" #: toolbar.cpp:82 msgid "New group in 3d" -msgstr "3d'de yeni grup oluşturun" +msgstr "3d'de yeni grup oluştur" #: toolbar.cpp:84 msgid "New group linking / assembling file" -msgstr "Bağlantı / Montaj dosyası ile yeni grup oluşturun" +msgstr "Bağlantı / Montaj dosyası ile yeni grup oluştur" #: toolbar.cpp:88 msgid "Nearest isometric view" @@ -2199,7 +2228,7 @@ msgstr "En yakın izometrik görünüm" #: toolbar.cpp:90 msgid "Align view to active workplane" -msgstr "Görünümü etkin çalışma düzlemine hizalayın" +msgstr "Görünümü etkin çalışma düzlemine hizala" #: util.cpp:165 msgctxt "title" From 8fadbd58f3a083c6875bcf1f9ae20610fd5d8936 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sun, 30 Jan 2022 15:06:13 -0500 Subject: [PATCH 398/646] Fix normal issue, when a workplane is created from a point and normal we were only storing the numeric normal so the plane (and subsequent extrusion) wouldn't follow if the sketch was on the face of a revolve. Now we store the handle to the defining normal it predef.entityB so it can update properly on regeneration. --- src/group.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/group.cpp b/src/group.cpp index 1cb1a1b8f..174bab585 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -140,6 +140,7 @@ void Group::MenuGroup(Command id, Platform::Path linkFile) { } } 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 +456,11 @@ void Group::Generate(IdList *entity, if(predef.negateU) u = u.ScaledBy(-1); if(predef.negateV) v = v.ScaledBy(-1); q = Quaternion::From(u, v); - } else if(subtype == Subtype::WORKPLANE_BY_POINT_ORTHO || subtype == Subtype::WORKPLANE_BY_POINT_NORMAL /*|| subtype == Subtype::WORKPLANE_BY_POINT_FACE*/) { + } else if(subtype == Subtype::WORKPLANE_BY_POINT_ORTHO) { // Already given, numerically. q = predef.q; + } else if(subtype == Subtype::WORKPLANE_BY_POINT_NORMAL) { + q = SK.GetEntity(predef.entityB)->NormalGetNum(); } else ssassert(false, "Unexpected workplane subtype"); Entity normal = {}; From d41801b2a845c80ff11f54a2b0b0c1ef5ed8b564 Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 1 Feb 2022 18:29:34 +0200 Subject: [PATCH 399/646] A workplane can now be defined from a workplane defined by point and normal It is now possible to create a "New Group | Sketch in New Workplane" from an existing workplane defined using a point and a nowmal. Before we used to hit the `ssassert(false, "Unexpected workplane subtype");`. This makes 4308dc136b03d6727da96ec75cc7ae27d169040a more complete and is related to #1120, #1048 and https://github.com/solvespace/solvespace/pull/1054 --- src/group.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/group.cpp b/src/group.cpp index 174bab585..529fce646 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -136,6 +136,9 @@ 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) { From b8f22c671085669b3af08f9d90d404471abb219a Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Fri, 4 Feb 2022 10:36:46 +0100 Subject: [PATCH 400/646] CI: Create tarballs with submodules included for releases Closes #1028 --- .github/workflows/source-tarball.yml | 51 ++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/source-tarball.yml diff --git a/.github/workflows/source-tarball.yml b/.github/workflows/source-tarball.yml new file mode 100644 index 000000000..8bc06221b --- /dev/null +++ b/.github/workflows/source-tarball.yml @@ -0,0 +1,51 @@ +name: Source Tarball + +on: + release: + types: + - created + +jobs: + create_tarball: + name: Create & Upload Tarball + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: true + fetch-depth: 0 + - name: Pack Tarball + id: pack_tarball + run: | + version="${GITHUB_REF#refs/tags/v}" + dir_name="solvespace-${version}" + archive_name="${dir_name}.tar.xz" + archive_path="${HOME}/${archive_name}" + + echo "::set-output name=archive_name::${archive_name}" + echo "::set-output name=archive_path::${archive_path}" + + cd .. + tar \ + --exclude-vcs \ + --transform "s:^solvespace:${dir_name}:" \ + -cvaf \ + ${archive_path} \ + solvespace + - name: Get Release Upload URL + id: get_upload_url + env: + event: ${{ toJson(github.event) }} + run: | + upload_url=$(echo "$event" | jq -r ".release.upload_url") + echo "::set-output name=upload_url::$upload_url" + echo "Upload URL: $upload_url" + - name: Upload Tarball + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.get_upload_url.outputs.upload_url }} + asset_path: ${{ steps.pack_tarball.outputs.archive_path }} + asset_name: ${{ steps.pack_tarball.outputs.archive_name }} + asset_content_type: binary/octet-stream From 32674a3965460a2d0d5ea200475d354503479fea Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 6 Feb 2022 23:40:45 +0200 Subject: [PATCH 401/646] MacOS: Update the year to 2022 in the About dialog. --- cmake/MacOSXBundleInfo.plist.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/MacOSXBundleInfo.plist.in b/cmake/MacOSXBundleInfo.plist.in index 1bf29a485..b39a9e210 100644 --- a/cmake/MacOSXBundleInfo.plist.in +++ b/cmake/MacOSXBundleInfo.plist.in @@ -19,7 +19,7 @@ CFBundleShortVersionString ${PROJECT_VERSION} NSHumanReadableCopyright - © 2008-2016 Jonathan Westhues and other authors + © 2008-2022 Jonathan Westhues and other authors NSPrincipalClass NSApplication NSMainNibFile From 78d2446d242c6deb09d511682bd4702fcea429f8 Mon Sep 17 00:00:00 2001 From: ruevs Date: Wed, 9 Feb 2022 10:27:54 +0200 Subject: [PATCH 402/646] UI: Display the circumference of a circle in the property browser Closes #1211 --- src/describescreen.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/describescreen.cpp b/src/describescreen.cpp index d2f94503d..3e054a1ab 100644 --- a/src/describescreen.cpp +++ b/src/describescreen.cpp @@ -167,10 +167,11 @@ 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(SK.GetEntity(e->point[0]), 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()); + Printf(true, " diameter = %Fi%s", SS.MmToString(r*2).c_str()); + Printf(false, " radius = %Fi%s", SS.MmToString(r).c_str()); + Printf(false, " circumference = %Fi%s", SS.MmToString(2*M_PI*r).c_str()); break; } case Entity::Type::FACE_NORMAL_PT: From b2130a730d6f106ff1a13d0e39617bf6b8b43cc3 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Mon, 14 Feb 2022 11:26:12 -0500 Subject: [PATCH 403/646] Move shell functions out of surface.cpp and into shell.cpp (#1220) --- src/CMakeLists.txt | 1 + src/srf/shell.cpp | 614 ++++++++++++++++++++++++++++++++++++++++++++ src/srf/surface.cpp | 604 ------------------------------------------- 3 files changed, 615 insertions(+), 604 deletions(-) create mode 100644 src/srf/shell.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a6af09a95..0c0277eef 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -166,6 +166,7 @@ add_library(solvespace-core STATIC srf/merge.cpp srf/ratpoly.cpp srf/raycast.cpp + srf/shell.cpp srf/surface.cpp srf/surfinter.cpp srf/triangulate.cpp) diff --git a/src/srf/shell.cpp b/src/srf/shell.cpp new file mode 100644 index 000000000..ca3b75ee9 --- /dev/null +++ b/src/srf/shell.cpp @@ -0,0 +1,614 @@ +//----------------------------------------------------------------------------- +// Anything involving NURBS shells (i.e., shells); except +// for the real math, which is in ratpoly.cpp. +// +// Copyright 2008-2013 Jonathan Westhues. +//----------------------------------------------------------------------------- +#include "../solvespace.h" + +typedef struct { + hSCurve hc; + hSSurface hs; +} TrimLine; + + +void SShell::MakeFromExtrusionOf(SBezierLoopSet *sbls, Vector t0, Vector t1, RgbaColor color) +{ + // Make the extrusion direction consistent with respect to the normal + // of the sketch we're extruding. + if((t0.Minus(t1)).Dot(sbls->normal) < 0) { + swap(t0, t1); + } + + // Define a coordinate system to contain the original sketch, and get + // a bounding box in that csys + Vector n = sbls->normal.ScaledBy(-1); + Vector u = n.Normal(0), v = n.Normal(1); + Vector orig = sbls->point; + double umax = VERY_NEGATIVE, umin = VERY_POSITIVE; + sbls->GetBoundingProjd(u, orig, &umin, &umax); + double vmax = VERY_NEGATIVE, vmin = VERY_POSITIVE; + sbls->GetBoundingProjd(v, orig, &vmin, &vmax); + // and now fix things up so that all u and v lie between 0 and 1 + orig = orig.Plus(u.ScaledBy(umin)); + orig = orig.Plus(v.ScaledBy(vmin)); + u = u.ScaledBy(umax - umin); + v = v.ScaledBy(vmax - vmin); + + // So we can now generate the top and bottom surfaces of the extrusion, + // planes within a translated (and maybe mirrored) version of that csys. + SSurface s0, s1; + s0 = SSurface::FromPlane(orig.Plus(t0), u, v); + s0.color = color; + s1 = SSurface::FromPlane(orig.Plus(t1).Plus(u), u.ScaledBy(-1), v); + s1.color = color; + hSSurface hs0 = surface.AddAndAssignId(&s0), + hs1 = surface.AddAndAssignId(&s1); + + // Now go through the input curves. For each one, generate its surface + // of extrusion, its two translated trim curves, and one trim line. We + // go through by loops so that we can assign the lines correctly. + SBezierLoop *sbl; + for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { + SBezier *sb; + List trimLines = {}; + + for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { + // Generate the surface of extrusion of this curve, and add + // it to the list + SSurface ss = SSurface::FromExtrusionOf(sb, t0, t1); + ss.color = color; + hSSurface hsext = surface.AddAndAssignId(&ss); + + // Translate the curve by t0 and t1 to produce two trim curves + SCurve sc = {}; + sc.isExact = true; + sc.exact = sb->TransformedBy(t0, Quaternion::IDENTITY, 1.0); + (sc.exact).MakePwlInto(&(sc.pts)); + sc.surfA = hs0; + sc.surfB = hsext; + hSCurve hc0 = curve.AddAndAssignId(&sc); + + sc = {}; + sc.isExact = true; + sc.exact = sb->TransformedBy(t1, Quaternion::IDENTITY, 1.0); + (sc.exact).MakePwlInto(&(sc.pts)); + sc.surfA = hs1; + sc.surfB = hsext; + hSCurve hc1 = curve.AddAndAssignId(&sc); + + STrimBy stb0, stb1; + // The translated curves trim the flat top and bottom surfaces. + stb0 = STrimBy::EntireCurve(this, hc0, /*backwards=*/false); + stb1 = STrimBy::EntireCurve(this, hc1, /*backwards=*/true); + (surface.FindById(hs0))->trim.Add(&stb0); + (surface.FindById(hs1))->trim.Add(&stb1); + + // The translated curves also trim the surface of extrusion. + stb0 = STrimBy::EntireCurve(this, hc0, /*backwards=*/true); + stb1 = STrimBy::EntireCurve(this, hc1, /*backwards=*/false); + (surface.FindById(hsext))->trim.Add(&stb0); + (surface.FindById(hsext))->trim.Add(&stb1); + + // And form the trim line + Vector pt = sb->Finish(); + sc = {}; + sc.isExact = true; + sc.exact = SBezier::From(pt.Plus(t0), pt.Plus(t1)); + (sc.exact).MakePwlInto(&(sc.pts)); + hSCurve hl = curve.AddAndAssignId(&sc); + // save this for later + TrimLine tl; + tl.hc = hl; + tl.hs = hsext; + trimLines.Add(&tl); + } + + int i; + for(i = 0; i < trimLines.n; i++) { + TrimLine *tl = &(trimLines[i]); + SSurface *ss = surface.FindById(tl->hs); + + TrimLine *tlp = &(trimLines[WRAP(i-1, trimLines.n)]); + + STrimBy stb; + stb = STrimBy::EntireCurve(this, tl->hc, /*backwards=*/true); + ss->trim.Add(&stb); + stb = STrimBy::EntireCurve(this, tlp->hc, /*backwards=*/false); + ss->trim.Add(&stb); + + (curve.FindById(tl->hc))->surfA = ss->h; + (curve.FindById(tlp->hc))->surfB = ss->h; + } + trimLines.Clear(); + } +} + +bool SShell::CheckNormalAxisRelationship(SBezierLoopSet *sbls, Vector pt, Vector axis, double da, double dx) +// Check that the direction of revolution/extrusion ends up parallel to the normal of +// the sketch, on the side of the axis where the sketch is. +{ + SBezierLoop *sbl; + Vector pto; + double md = VERY_NEGATIVE; + for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { + SBezier *sb; + for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { + // Choose the point farthest from the axis; we'll get garbage + // if we choose a point that lies on the axis, for example. + // (And our surface will be self-intersecting if the sketch + // spans the axis, so don't worry about that.) + for(int i = 0; i <= sb->deg; i++) { + Vector p = sb->ctrl[i]; + double d = p.DistanceToLine(pt, axis); + if(d > md) { + md = d; + pto = p; + } + } + } + } + Vector ptc = pto.ClosestPointOnLine(pt, axis), + up = axis.Cross(pto.Minus(ptc)).ScaledBy(da), + vp = up.Plus(axis.ScaledBy(dx)); + + return (vp.Dot(sbls->normal) > 0); +} + +// sketch must not contain the axis of revolution as a non-construction line for helix +void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector axis, + RgbaColor color, Group *group, double angles, + double anglef, double dists, double distf) { + int i0 = surface.n; // number of pre-existing surfaces + SBezierLoop *sbl; + // for testing - hard code the axial distance, and number of sections. + // distance will need to be parameters in the future. + double dist = distf - dists; + int sections = (int)(fabs(anglef - angles) / (PI / 2) + 1); + double wedge = (anglef - angles) / sections; + int startMapping = Group::REMAP_LATHE_START, endMapping = Group::REMAP_LATHE_END; + + if(CheckNormalAxisRelationship(sbls, pt, axis, anglef-angles, distf-dists)) { + swap(angles, anglef); + swap(dists, distf); + dist = -dist; + wedge = -wedge; + swap(startMapping, endMapping); + } + + // Define a coordinate system to contain the original sketch, and get + // a bounding box in that csys + Vector n = sbls->normal.ScaledBy(-1); + Vector u = n.Normal(0), v = n.Normal(1); + Vector orig = sbls->point; + double umax = VERY_NEGATIVE, umin = VERY_POSITIVE; + sbls->GetBoundingProjd(u, orig, &umin, &umax); + double vmax = VERY_NEGATIVE, vmin = VERY_POSITIVE; + sbls->GetBoundingProjd(v, orig, &vmin, &vmax); + // and now fix things up so that all u and v lie between 0 and 1 + orig = orig.Plus(u.ScaledBy(umin)); + orig = orig.Plus(v.ScaledBy(vmin)); + u = u.ScaledBy(umax - umin); + v = v.ScaledBy(vmax - vmin); + + // So we can now generate the end caps of the extrusion within + // a translated and rotated (and maybe mirrored) version of that csys. + SSurface s0, s1; + s0 = SSurface::FromPlane(orig.RotatedAbout(pt, axis, angles).Plus(axis.ScaledBy(dists)), + u.RotatedAbout(axis, angles), v.RotatedAbout(axis, angles)); + s0.color = color; + + hEntity face0 = group->Remap(Entity::NO_ENTITY, startMapping); + s0.face = face0.v; + + s1 = SSurface::FromPlane( + orig.Plus(u).RotatedAbout(pt, axis, anglef).Plus(axis.ScaledBy(distf)), + u.ScaledBy(-1).RotatedAbout(axis, anglef), v.RotatedAbout(axis, anglef)); + s1.color = color; + + hEntity face1 = group->Remap(Entity::NO_ENTITY, endMapping); + s1.face = face1.v; + + hSSurface hs0 = surface.AddAndAssignId(&s0); + hSSurface hs1 = surface.AddAndAssignId(&s1); + + // Now we actually build and trim the swept surfaces. One loop at a time. + for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { + int i, j; + SBezier *sb; + List> hsl = {}; + + // This is where all the NURBS are created and Remapped to the generating curve + for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { + std::vector revs(sections); + for(j = 0; j < sections; j++) { + if((dist == 0) && sb->deg == 1 && + (sb->ctrl[0]).DistanceToLine(pt, axis) < LENGTH_EPS && + (sb->ctrl[1]).DistanceToLine(pt, axis) < LENGTH_EPS) { + // This is a line on the axis of revolution; it does + // not contribute a surface. + revs[j].v = 0; + } else { + SSurface ss = SSurface::FromRevolutionOf( + sb, pt, axis, angles + (wedge)*j, angles + (wedge) * (j + 1), + dists + j * dist / sections, dists + (j + 1) * dist / sections); + ss.color = color; + if(sb->entity != 0) { + hEntity he; + he.v = sb->entity; + hEntity hface = group->Remap(he, Group::REMAP_LINE_TO_FACE); + if(SK.entity.FindByIdNoOops(hface) != NULL) { + ss.face = hface.v; + } + } + revs[j] = surface.AddAndAssignId(&ss); + } + } + hsl.Add(&revs); + } + // Still the same loop. Need to create trim curves + for(i = 0; i < sbl->l.n; i++) { + std::vector revs = hsl[i], revsp = hsl[WRAP(i - 1, sbl->l.n)]; + + sb = &(sbl->l[i]); + + // we will need the grid t-values for this entire row of surfaces + List t_values; + t_values = {}; + if (revs[0].v) { + double ps = 0.0; + t_values.Add(&ps); + (surface.FindById(revs[0]))->MakeTriangulationGridInto( + &t_values, 0.0, 1.0, true, 0); + } + // we generate one more curve than we did surfaces + for(j = 0; j <= sections; j++) { + SCurve sc; + Quaternion qs = Quaternion::From(axis, angles + wedge * j); + // we want Q*(x - p) + p = Q*x + (p - Q*p) + Vector ts = + pt.Minus(qs.Rotate(pt)).Plus(axis.ScaledBy(dists + j * dist / sections)); + + // If this input curve generated a surface, then trim that + // surface with the rotated version of the input curve. + if(revs[0].v) { // not d[j] because crash on j==sections + sc = {}; + sc.isExact = true; + sc.exact = sb->TransformedBy(ts, qs, 1.0); + // make the PWL for the curve based on t value list + for(int x = 0; x < t_values.n; x++) { + SCurvePt scpt; + scpt.tag = 0; + scpt.p = sc.exact.PointAt(t_values[x]); + scpt.vertex = (x == 0) || (x == (t_values.n - 1)); + sc.pts.Add(&scpt); + } + + // the surfaces already exists so trim with this curve + if(j < sections) { + sc.surfA = revs[j]; + } else { + sc.surfA = hs1; // end cap + } + + if(j > 0) { + sc.surfB = revs[j - 1]; + } else { + sc.surfB = hs0; // staring cap + } + + hSCurve hcb = curve.AddAndAssignId(&sc); + + STrimBy stb; + stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/true); + (surface.FindById(sc.surfA))->trim.Add(&stb); + stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/false); + (surface.FindById(sc.surfB))->trim.Add(&stb); + } else if(j == 0) { // curve was on the rotation axis and is shared by the end caps. + sc = {}; + sc.isExact = true; + sc.exact = sb->TransformedBy(ts, qs, 1.0); + (sc.exact).MakePwlInto(&(sc.pts)); + sc.surfA = hs1; // end cap + sc.surfB = hs0; // staring cap + hSCurve hcb = curve.AddAndAssignId(&sc); + + STrimBy stb; + stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/true); + (surface.FindById(sc.surfA))->trim.Add(&stb); + stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/false); + (surface.FindById(sc.surfB))->trim.Add(&stb); + } + + // And if this input curve and the one after it both generated + // surfaces, then trim both of those by the appropriate + // curve based on the control points. + if((j < sections) && revs[j].v && revsp[j].v) { + SSurface *ss = surface.FindById(revs[j]); + + sc = {}; + sc.isExact = true; + sc.exact = SBezier::From(ss->ctrl[0][0], ss->ctrl[0][1], ss->ctrl[0][2]); + sc.exact.weight[1] = ss->weight[0][1]; + double max_dt = 0.5; + if (sc.exact.deg > 1) max_dt = 0.125; + (sc.exact).MakePwlInto(&(sc.pts), 0.0, max_dt); + sc.surfA = revs[j]; + sc.surfB = revsp[j]; + + hSCurve hcc = curve.AddAndAssignId(&sc); + + STrimBy stb; + stb = STrimBy::EntireCurve(this, hcc, /*backwards=*/false); + (surface.FindById(sc.surfA))->trim.Add(&stb); + stb = STrimBy::EntireCurve(this, hcc, /*backwards=*/true); + (surface.FindById(sc.surfB))->trim.Add(&stb); + } + } + t_values.Clear(); + } + + hsl.Clear(); + } + + if(dist == 0) { + MakeFirstOrderRevolvedSurfaces(pt, axis, i0); + } +} + +void SShell::MakeFromRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector axis, RgbaColor color, + Group *group) { + int i0 = surface.n; // number of pre-existing surfaces + SBezierLoop *sbl; + + if(CheckNormalAxisRelationship(sbls, pt, axis, 1.0, 0.0)) { + axis = axis.ScaledBy(-1); + } + + // Now we actually build and trim the surfaces. + for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { + int i, j; + SBezier *sb; + List> hsl = {}; + + for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { + std::vector revs(4); + for(j = 0; j < 4; j++) { + if(sb->deg == 1 && + (sb->ctrl[0]).DistanceToLine(pt, axis) < LENGTH_EPS && + (sb->ctrl[1]).DistanceToLine(pt, axis) < LENGTH_EPS) + { + // This is a line on the axis of revolution; it does + // not contribute a surface. + revs[j].v = 0; + } else { + SSurface ss = SSurface::FromRevolutionOf(sb, pt, axis, (PI / 2) * j, + (PI / 2) * (j + 1), 0.0, 0.0); + ss.color = color; + if(sb->entity != 0) { + hEntity he; + he.v = sb->entity; + hEntity hface = group->Remap(he, Group::REMAP_LINE_TO_FACE); + if(SK.entity.FindByIdNoOops(hface) != NULL) { + ss.face = hface.v; + } + } + revs[j] = surface.AddAndAssignId(&ss); + } + } + hsl.Add(&revs); + } + + for(i = 0; i < sbl->l.n; i++) { + std::vector revs = hsl[i], + revsp = hsl[WRAP(i-1, sbl->l.n)]; + + sb = &(sbl->l[i]); + + for(j = 0; j < 4; j++) { + SCurve sc; + Quaternion qs = Quaternion::From(axis, (PI/2)*j); + // we want Q*(x - p) + p = Q*x + (p - Q*p) + Vector ts = pt.Minus(qs.Rotate(pt)); + + // If this input curve generate a surface, then trim that + // surface with the rotated version of the input curve. + if(revs[j].v) { + sc = {}; + sc.isExact = true; + sc.exact = sb->TransformedBy(ts, qs, 1.0); + (sc.exact).MakePwlInto(&(sc.pts)); + sc.surfA = revs[j]; + sc.surfB = revs[WRAP(j-1, 4)]; + + hSCurve hcb = curve.AddAndAssignId(&sc); + + STrimBy stb; + stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/true); + (surface.FindById(sc.surfA))->trim.Add(&stb); + stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/false); + (surface.FindById(sc.surfB))->trim.Add(&stb); + } + + // And if this input curve and the one after it both generated + // surfaces, then trim both of those by the appropriate + // circle. + if(revs[j].v && revsp[j].v) { + SSurface *ss = surface.FindById(revs[j]); + + sc = {}; + sc.isExact = true; + sc.exact = SBezier::From(ss->ctrl[0][0], + ss->ctrl[0][1], + ss->ctrl[0][2]); + sc.exact.weight[1] = ss->weight[0][1]; + (sc.exact).MakePwlInto(&(sc.pts)); + sc.surfA = revs[j]; + sc.surfB = revsp[j]; + + hSCurve hcc = curve.AddAndAssignId(&sc); + + STrimBy stb; + stb = STrimBy::EntireCurve(this, hcc, /*backwards=*/false); + (surface.FindById(sc.surfA))->trim.Add(&stb); + stb = STrimBy::EntireCurve(this, hcc, /*backwards=*/true); + (surface.FindById(sc.surfB))->trim.Add(&stb); + } + } + } + + hsl.Clear(); + } + + MakeFirstOrderRevolvedSurfaces(pt, axis, i0); +} + +void SShell::MakeFirstOrderRevolvedSurfaces(Vector pt, Vector axis, int i0) { + int i; + + for(i = i0; i < surface.n; i++) { + SSurface *srf = &(surface[i]); + + // Revolution of a line; this is potentially a plane, which we can + // rewrite to have degree (1, 1). + if(srf->degm == 1 && srf->degn == 2) { + // close start, far start, far finish + Vector cs, fs, ff; + double d0, d1; + d0 = (srf->ctrl[0][0]).DistanceToLine(pt, axis); + d1 = (srf->ctrl[1][0]).DistanceToLine(pt, axis); + + if(d0 > d1) { + cs = srf->ctrl[1][0]; + fs = srf->ctrl[0][0]; + ff = srf->ctrl[0][2]; + } else { + cs = srf->ctrl[0][0]; + fs = srf->ctrl[1][0]; + ff = srf->ctrl[1][2]; + } + + // origin close, origin far + Vector oc = cs.ClosestPointOnLine(pt, axis), + of = fs.ClosestPointOnLine(pt, axis); + + if(oc.Equals(of)) { + // This is a plane, not a (non-degenerate) cone. + Vector oldn = srf->NormalAt(0.5, 0.5); + + Vector u = fs.Minus(of), v; + + v = (axis.Cross(u)).WithMagnitude(1); + + double vm = (ff.Minus(of)).Dot(v); + v = v.ScaledBy(vm); + + srf->degm = 1; + srf->degn = 1; + srf->ctrl[0][0] = of; + srf->ctrl[0][1] = of.Plus(u); + srf->ctrl[1][0] = of.Plus(v); + srf->ctrl[1][1] = of.Plus(u).Plus(v); + srf->weight[0][0] = 1; + srf->weight[0][1] = 1; + srf->weight[1][0] = 1; + srf->weight[1][1] = 1; + + if(oldn.Dot(srf->NormalAt(0.5, 0.5)) < 0) { + swap(srf->ctrl[0][0], srf->ctrl[1][0]); + swap(srf->ctrl[0][1], srf->ctrl[1][1]); + } + continue; + } + + if(fabs(d0 - d1) < LENGTH_EPS) { + // This is a cylinder; so transpose it so that we'll recognize + // it as a surface of extrusion. + SSurface sn = *srf; + + // Transposing u and v flips the normal, so reverse u to + // flip it again and put it back where we started. + sn.degm = 2; + sn.degn = 1; + int dm, dn; + for(dm = 0; dm <= 1; dm++) { + for(dn = 0; dn <= 2; dn++) { + sn.ctrl [dn][dm] = srf->ctrl [1-dm][dn]; + sn.weight[dn][dm] = srf->weight[1-dm][dn]; + } + } + + *srf = sn; + continue; + } + } + } +} + +void SShell::MakeFromCopyOf(SShell *a) { + ssassert(this != a, "Can't make from copy of self"); + MakeFromTransformationOf(a, + Vector::From(0, 0, 0), Quaternion::IDENTITY, 1.0); +} + +void SShell::MakeFromTransformationOf(SShell *a, + Vector t, Quaternion q, double scale) +{ + booleanFailed = false; + surface.ReserveMore(a->surface.n); + for(SSurface &s : a->surface) { + SSurface n; + n = SSurface::FromTransformationOf(&s, t, q, scale, /*includingTrims=*/true); + surface.Add(&n); // keeping the old ID + } + + curve.ReserveMore(a->curve.n); + for(SCurve &c : a->curve) { + SCurve n; + n = SCurve::FromTransformationOf(&c, t, q, scale); + curve.Add(&n); // keeping the old ID + } +} + +void SShell::MakeEdgesInto(SEdgeList *sel) { + for(SSurface &s : surface) { + s.MakeEdgesInto(this, sel, SSurface::MakeAs::XYZ); + } +} + +void SShell::MakeSectionEdgesInto(Vector n, double d, SEdgeList *sel, SBezierList *sbl) +{ + for(SSurface &s : surface) { + if(s.CoincidentWithPlane(n, d)) { + s.MakeSectionEdgesInto(this, sel, sbl); + } + } +} + +void SShell::TriangulateInto(SMesh *sm) { +#pragma omp parallel for + for(int i=0; iTriangulateInto(this, &m); + #pragma omp critical + sm->MakeFromCopyOf(&m); + m.Clear(); + } +} + +bool SShell::IsEmpty() const { + return surface.IsEmpty(); +} + +void SShell::Clear() { + for(SSurface &s : surface) { + s.Clear(); + } + surface.Clear(); + + for(SCurve &c : curve) { + c.Clear(); + } + curve.Clear(); +} diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp index c63875e5a..18edabf61 100644 --- a/src/srf/surface.cpp +++ b/src/srf/surface.cpp @@ -489,608 +489,4 @@ void SSurface::Clear() { trim.Clear(); } -typedef struct { - hSCurve hc; - hSSurface hs; -} TrimLine; -void SShell::MakeFromExtrusionOf(SBezierLoopSet *sbls, Vector t0, Vector t1, RgbaColor color) -{ - // Make the extrusion direction consistent with respect to the normal - // of the sketch we're extruding. - if((t0.Minus(t1)).Dot(sbls->normal) < 0) { - swap(t0, t1); - } - - // Define a coordinate system to contain the original sketch, and get - // a bounding box in that csys - Vector n = sbls->normal.ScaledBy(-1); - Vector u = n.Normal(0), v = n.Normal(1); - Vector orig = sbls->point; - double umax = VERY_NEGATIVE, umin = VERY_POSITIVE; - sbls->GetBoundingProjd(u, orig, &umin, &umax); - double vmax = VERY_NEGATIVE, vmin = VERY_POSITIVE; - sbls->GetBoundingProjd(v, orig, &vmin, &vmax); - // and now fix things up so that all u and v lie between 0 and 1 - orig = orig.Plus(u.ScaledBy(umin)); - orig = orig.Plus(v.ScaledBy(vmin)); - u = u.ScaledBy(umax - umin); - v = v.ScaledBy(vmax - vmin); - - // So we can now generate the top and bottom surfaces of the extrusion, - // planes within a translated (and maybe mirrored) version of that csys. - SSurface s0, s1; - s0 = SSurface::FromPlane(orig.Plus(t0), u, v); - s0.color = color; - s1 = SSurface::FromPlane(orig.Plus(t1).Plus(u), u.ScaledBy(-1), v); - s1.color = color; - hSSurface hs0 = surface.AddAndAssignId(&s0), - hs1 = surface.AddAndAssignId(&s1); - - // Now go through the input curves. For each one, generate its surface - // of extrusion, its two translated trim curves, and one trim line. We - // go through by loops so that we can assign the lines correctly. - SBezierLoop *sbl; - for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { - SBezier *sb; - List trimLines = {}; - - for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { - // Generate the surface of extrusion of this curve, and add - // it to the list - SSurface ss = SSurface::FromExtrusionOf(sb, t0, t1); - ss.color = color; - hSSurface hsext = surface.AddAndAssignId(&ss); - - // Translate the curve by t0 and t1 to produce two trim curves - SCurve sc = {}; - sc.isExact = true; - sc.exact = sb->TransformedBy(t0, Quaternion::IDENTITY, 1.0); - (sc.exact).MakePwlInto(&(sc.pts)); - sc.surfA = hs0; - sc.surfB = hsext; - hSCurve hc0 = curve.AddAndAssignId(&sc); - - sc = {}; - sc.isExact = true; - sc.exact = sb->TransformedBy(t1, Quaternion::IDENTITY, 1.0); - (sc.exact).MakePwlInto(&(sc.pts)); - sc.surfA = hs1; - sc.surfB = hsext; - hSCurve hc1 = curve.AddAndAssignId(&sc); - - STrimBy stb0, stb1; - // The translated curves trim the flat top and bottom surfaces. - stb0 = STrimBy::EntireCurve(this, hc0, /*backwards=*/false); - stb1 = STrimBy::EntireCurve(this, hc1, /*backwards=*/true); - (surface.FindById(hs0))->trim.Add(&stb0); - (surface.FindById(hs1))->trim.Add(&stb1); - - // The translated curves also trim the surface of extrusion. - stb0 = STrimBy::EntireCurve(this, hc0, /*backwards=*/true); - stb1 = STrimBy::EntireCurve(this, hc1, /*backwards=*/false); - (surface.FindById(hsext))->trim.Add(&stb0); - (surface.FindById(hsext))->trim.Add(&stb1); - - // And form the trim line - Vector pt = sb->Finish(); - sc = {}; - sc.isExact = true; - sc.exact = SBezier::From(pt.Plus(t0), pt.Plus(t1)); - (sc.exact).MakePwlInto(&(sc.pts)); - hSCurve hl = curve.AddAndAssignId(&sc); - // save this for later - TrimLine tl; - tl.hc = hl; - tl.hs = hsext; - trimLines.Add(&tl); - } - - int i; - for(i = 0; i < trimLines.n; i++) { - TrimLine *tl = &(trimLines[i]); - SSurface *ss = surface.FindById(tl->hs); - - TrimLine *tlp = &(trimLines[WRAP(i-1, trimLines.n)]); - - STrimBy stb; - stb = STrimBy::EntireCurve(this, tl->hc, /*backwards=*/true); - ss->trim.Add(&stb); - stb = STrimBy::EntireCurve(this, tlp->hc, /*backwards=*/false); - ss->trim.Add(&stb); - - (curve.FindById(tl->hc))->surfA = ss->h; - (curve.FindById(tlp->hc))->surfB = ss->h; - } - trimLines.Clear(); - } -} - -bool SShell::CheckNormalAxisRelationship(SBezierLoopSet *sbls, Vector pt, Vector axis, double da, double dx) -// Check that the direction of revolution/extrusion ends up parallel to the normal of -// the sketch, on the side of the axis where the sketch is. -{ - SBezierLoop *sbl; - Vector pto; - double md = VERY_NEGATIVE; - for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { - SBezier *sb; - for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { - // Choose the point farthest from the axis; we'll get garbage - // if we choose a point that lies on the axis, for example. - // (And our surface will be self-intersecting if the sketch - // spans the axis, so don't worry about that.) - for(int i = 0; i <= sb->deg; i++) { - Vector p = sb->ctrl[i]; - double d = p.DistanceToLine(pt, axis); - if(d > md) { - md = d; - pto = p; - } - } - } - } - Vector ptc = pto.ClosestPointOnLine(pt, axis), - up = axis.Cross(pto.Minus(ptc)).ScaledBy(da), - vp = up.Plus(axis.ScaledBy(dx)); - - return (vp.Dot(sbls->normal) > 0); -} - -// sketch must not contain the axis of revolution as a non-construction line for helix -void SShell::MakeFromHelicalRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector axis, - RgbaColor color, Group *group, double angles, - double anglef, double dists, double distf) { - int i0 = surface.n; // number of pre-existing surfaces - SBezierLoop *sbl; - // for testing - hard code the axial distance, and number of sections. - // distance will need to be parameters in the future. - double dist = distf - dists; - int sections = (int)(fabs(anglef - angles) / (PI / 2) + 1); - double wedge = (anglef - angles) / sections; - int startMapping = Group::REMAP_LATHE_START, endMapping = Group::REMAP_LATHE_END; - - if(CheckNormalAxisRelationship(sbls, pt, axis, anglef-angles, distf-dists)) { - swap(angles, anglef); - swap(dists, distf); - dist = -dist; - wedge = -wedge; - swap(startMapping, endMapping); - } - - // Define a coordinate system to contain the original sketch, and get - // a bounding box in that csys - Vector n = sbls->normal.ScaledBy(-1); - Vector u = n.Normal(0), v = n.Normal(1); - Vector orig = sbls->point; - double umax = VERY_NEGATIVE, umin = VERY_POSITIVE; - sbls->GetBoundingProjd(u, orig, &umin, &umax); - double vmax = VERY_NEGATIVE, vmin = VERY_POSITIVE; - sbls->GetBoundingProjd(v, orig, &vmin, &vmax); - // and now fix things up so that all u and v lie between 0 and 1 - orig = orig.Plus(u.ScaledBy(umin)); - orig = orig.Plus(v.ScaledBy(vmin)); - u = u.ScaledBy(umax - umin); - v = v.ScaledBy(vmax - vmin); - - // So we can now generate the end caps of the extrusion within - // a translated and rotated (and maybe mirrored) version of that csys. - SSurface s0, s1; - s0 = SSurface::FromPlane(orig.RotatedAbout(pt, axis, angles).Plus(axis.ScaledBy(dists)), - u.RotatedAbout(axis, angles), v.RotatedAbout(axis, angles)); - s0.color = color; - - hEntity face0 = group->Remap(Entity::NO_ENTITY, startMapping); - s0.face = face0.v; - - s1 = SSurface::FromPlane( - orig.Plus(u).RotatedAbout(pt, axis, anglef).Plus(axis.ScaledBy(distf)), - u.ScaledBy(-1).RotatedAbout(axis, anglef), v.RotatedAbout(axis, anglef)); - s1.color = color; - - hEntity face1 = group->Remap(Entity::NO_ENTITY, endMapping); - s1.face = face1.v; - - hSSurface hs0 = surface.AddAndAssignId(&s0); - hSSurface hs1 = surface.AddAndAssignId(&s1); - - // Now we actually build and trim the swept surfaces. One loop at a time. - for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { - int i, j; - SBezier *sb; - List> hsl = {}; - - // This is where all the NURBS are created and Remapped to the generating curve - for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { - std::vector revs(sections); - for(j = 0; j < sections; j++) { - if((dist == 0) && sb->deg == 1 && - (sb->ctrl[0]).DistanceToLine(pt, axis) < LENGTH_EPS && - (sb->ctrl[1]).DistanceToLine(pt, axis) < LENGTH_EPS) { - // This is a line on the axis of revolution; it does - // not contribute a surface. - revs[j].v = 0; - } else { - SSurface ss = SSurface::FromRevolutionOf( - sb, pt, axis, angles + (wedge)*j, angles + (wedge) * (j + 1), - dists + j * dist / sections, dists + (j + 1) * dist / sections); - ss.color = color; - if(sb->entity != 0) { - hEntity he; - he.v = sb->entity; - hEntity hface = group->Remap(he, Group::REMAP_LINE_TO_FACE); - if(SK.entity.FindByIdNoOops(hface) != NULL) { - ss.face = hface.v; - } - } - revs[j] = surface.AddAndAssignId(&ss); - } - } - hsl.Add(&revs); - } - // Still the same loop. Need to create trim curves - for(i = 0; i < sbl->l.n; i++) { - std::vector revs = hsl[i], revsp = hsl[WRAP(i - 1, sbl->l.n)]; - - sb = &(sbl->l[i]); - - // we will need the grid t-values for this entire row of surfaces - List t_values; - t_values = {}; - if (revs[0].v) { - double ps = 0.0; - t_values.Add(&ps); - (surface.FindById(revs[0]))->MakeTriangulationGridInto( - &t_values, 0.0, 1.0, true, 0); - } - // we generate one more curve than we did surfaces - for(j = 0; j <= sections; j++) { - SCurve sc; - Quaternion qs = Quaternion::From(axis, angles + wedge * j); - // we want Q*(x - p) + p = Q*x + (p - Q*p) - Vector ts = - pt.Minus(qs.Rotate(pt)).Plus(axis.ScaledBy(dists + j * dist / sections)); - - // If this input curve generated a surface, then trim that - // surface with the rotated version of the input curve. - if(revs[0].v) { // not d[j] because crash on j==sections - sc = {}; - sc.isExact = true; - sc.exact = sb->TransformedBy(ts, qs, 1.0); - // make the PWL for the curve based on t value list - for(int x = 0; x < t_values.n; x++) { - SCurvePt scpt; - scpt.tag = 0; - scpt.p = sc.exact.PointAt(t_values[x]); - scpt.vertex = (x == 0) || (x == (t_values.n - 1)); - sc.pts.Add(&scpt); - } - - // the surfaces already exists so trim with this curve - if(j < sections) { - sc.surfA = revs[j]; - } else { - sc.surfA = hs1; // end cap - } - - if(j > 0) { - sc.surfB = revs[j - 1]; - } else { - sc.surfB = hs0; // staring cap - } - - hSCurve hcb = curve.AddAndAssignId(&sc); - - STrimBy stb; - stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/true); - (surface.FindById(sc.surfA))->trim.Add(&stb); - stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/false); - (surface.FindById(sc.surfB))->trim.Add(&stb); - } else if(j == 0) { // curve was on the rotation axis and is shared by the end caps. - sc = {}; - sc.isExact = true; - sc.exact = sb->TransformedBy(ts, qs, 1.0); - (sc.exact).MakePwlInto(&(sc.pts)); - sc.surfA = hs1; // end cap - sc.surfB = hs0; // staring cap - hSCurve hcb = curve.AddAndAssignId(&sc); - - STrimBy stb; - stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/true); - (surface.FindById(sc.surfA))->trim.Add(&stb); - stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/false); - (surface.FindById(sc.surfB))->trim.Add(&stb); - } - - // And if this input curve and the one after it both generated - // surfaces, then trim both of those by the appropriate - // curve based on the control points. - if((j < sections) && revs[j].v && revsp[j].v) { - SSurface *ss = surface.FindById(revs[j]); - - sc = {}; - sc.isExact = true; - sc.exact = SBezier::From(ss->ctrl[0][0], ss->ctrl[0][1], ss->ctrl[0][2]); - sc.exact.weight[1] = ss->weight[0][1]; - double max_dt = 0.5; - if (sc.exact.deg > 1) max_dt = 0.125; - (sc.exact).MakePwlInto(&(sc.pts), 0.0, max_dt); - sc.surfA = revs[j]; - sc.surfB = revsp[j]; - - hSCurve hcc = curve.AddAndAssignId(&sc); - - STrimBy stb; - stb = STrimBy::EntireCurve(this, hcc, /*backwards=*/false); - (surface.FindById(sc.surfA))->trim.Add(&stb); - stb = STrimBy::EntireCurve(this, hcc, /*backwards=*/true); - (surface.FindById(sc.surfB))->trim.Add(&stb); - } - } - t_values.Clear(); - } - - hsl.Clear(); - } - - if(dist == 0) { - MakeFirstOrderRevolvedSurfaces(pt, axis, i0); - } -} - -void SShell::MakeFromRevolutionOf(SBezierLoopSet *sbls, Vector pt, Vector axis, RgbaColor color, - Group *group) { - int i0 = surface.n; // number of pre-existing surfaces - SBezierLoop *sbl; - - if(CheckNormalAxisRelationship(sbls, pt, axis, 1.0, 0.0)) { - axis = axis.ScaledBy(-1); - } - - // Now we actually build and trim the surfaces. - for(sbl = sbls->l.First(); sbl; sbl = sbls->l.NextAfter(sbl)) { - int i, j; - SBezier *sb; - List> hsl = {}; - - for(sb = sbl->l.First(); sb; sb = sbl->l.NextAfter(sb)) { - std::vector revs(4); - for(j = 0; j < 4; j++) { - if(sb->deg == 1 && - (sb->ctrl[0]).DistanceToLine(pt, axis) < LENGTH_EPS && - (sb->ctrl[1]).DistanceToLine(pt, axis) < LENGTH_EPS) - { - // This is a line on the axis of revolution; it does - // not contribute a surface. - revs[j].v = 0; - } else { - SSurface ss = SSurface::FromRevolutionOf(sb, pt, axis, (PI / 2) * j, - (PI / 2) * (j + 1), 0.0, 0.0); - ss.color = color; - if(sb->entity != 0) { - hEntity he; - he.v = sb->entity; - hEntity hface = group->Remap(he, Group::REMAP_LINE_TO_FACE); - if(SK.entity.FindByIdNoOops(hface) != NULL) { - ss.face = hface.v; - } - } - revs[j] = surface.AddAndAssignId(&ss); - } - } - hsl.Add(&revs); - } - - for(i = 0; i < sbl->l.n; i++) { - std::vector revs = hsl[i], - revsp = hsl[WRAP(i-1, sbl->l.n)]; - - sb = &(sbl->l[i]); - - for(j = 0; j < 4; j++) { - SCurve sc; - Quaternion qs = Quaternion::From(axis, (PI/2)*j); - // we want Q*(x - p) + p = Q*x + (p - Q*p) - Vector ts = pt.Minus(qs.Rotate(pt)); - - // If this input curve generate a surface, then trim that - // surface with the rotated version of the input curve. - if(revs[j].v) { - sc = {}; - sc.isExact = true; - sc.exact = sb->TransformedBy(ts, qs, 1.0); - (sc.exact).MakePwlInto(&(sc.pts)); - sc.surfA = revs[j]; - sc.surfB = revs[WRAP(j-1, 4)]; - - hSCurve hcb = curve.AddAndAssignId(&sc); - - STrimBy stb; - stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/true); - (surface.FindById(sc.surfA))->trim.Add(&stb); - stb = STrimBy::EntireCurve(this, hcb, /*backwards=*/false); - (surface.FindById(sc.surfB))->trim.Add(&stb); - } - - // And if this input curve and the one after it both generated - // surfaces, then trim both of those by the appropriate - // circle. - if(revs[j].v && revsp[j].v) { - SSurface *ss = surface.FindById(revs[j]); - - sc = {}; - sc.isExact = true; - sc.exact = SBezier::From(ss->ctrl[0][0], - ss->ctrl[0][1], - ss->ctrl[0][2]); - sc.exact.weight[1] = ss->weight[0][1]; - (sc.exact).MakePwlInto(&(sc.pts)); - sc.surfA = revs[j]; - sc.surfB = revsp[j]; - - hSCurve hcc = curve.AddAndAssignId(&sc); - - STrimBy stb; - stb = STrimBy::EntireCurve(this, hcc, /*backwards=*/false); - (surface.FindById(sc.surfA))->trim.Add(&stb); - stb = STrimBy::EntireCurve(this, hcc, /*backwards=*/true); - (surface.FindById(sc.surfB))->trim.Add(&stb); - } - } - } - - hsl.Clear(); - } - - MakeFirstOrderRevolvedSurfaces(pt, axis, i0); -} - -void SShell::MakeFirstOrderRevolvedSurfaces(Vector pt, Vector axis, int i0) { - int i; - - for(i = i0; i < surface.n; i++) { - SSurface *srf = &(surface[i]); - - // Revolution of a line; this is potentially a plane, which we can - // rewrite to have degree (1, 1). - if(srf->degm == 1 && srf->degn == 2) { - // close start, far start, far finish - Vector cs, fs, ff; - double d0, d1; - d0 = (srf->ctrl[0][0]).DistanceToLine(pt, axis); - d1 = (srf->ctrl[1][0]).DistanceToLine(pt, axis); - - if(d0 > d1) { - cs = srf->ctrl[1][0]; - fs = srf->ctrl[0][0]; - ff = srf->ctrl[0][2]; - } else { - cs = srf->ctrl[0][0]; - fs = srf->ctrl[1][0]; - ff = srf->ctrl[1][2]; - } - - // origin close, origin far - Vector oc = cs.ClosestPointOnLine(pt, axis), - of = fs.ClosestPointOnLine(pt, axis); - - if(oc.Equals(of)) { - // This is a plane, not a (non-degenerate) cone. - Vector oldn = srf->NormalAt(0.5, 0.5); - - Vector u = fs.Minus(of), v; - - v = (axis.Cross(u)).WithMagnitude(1); - - double vm = (ff.Minus(of)).Dot(v); - v = v.ScaledBy(vm); - - srf->degm = 1; - srf->degn = 1; - srf->ctrl[0][0] = of; - srf->ctrl[0][1] = of.Plus(u); - srf->ctrl[1][0] = of.Plus(v); - srf->ctrl[1][1] = of.Plus(u).Plus(v); - srf->weight[0][0] = 1; - srf->weight[0][1] = 1; - srf->weight[1][0] = 1; - srf->weight[1][1] = 1; - - if(oldn.Dot(srf->NormalAt(0.5, 0.5)) < 0) { - swap(srf->ctrl[0][0], srf->ctrl[1][0]); - swap(srf->ctrl[0][1], srf->ctrl[1][1]); - } - continue; - } - - if(fabs(d0 - d1) < LENGTH_EPS) { - // This is a cylinder; so transpose it so that we'll recognize - // it as a surface of extrusion. - SSurface sn = *srf; - - // Transposing u and v flips the normal, so reverse u to - // flip it again and put it back where we started. - sn.degm = 2; - sn.degn = 1; - int dm, dn; - for(dm = 0; dm <= 1; dm++) { - for(dn = 0; dn <= 2; dn++) { - sn.ctrl [dn][dm] = srf->ctrl [1-dm][dn]; - sn.weight[dn][dm] = srf->weight[1-dm][dn]; - } - } - - *srf = sn; - continue; - } - } - } -} - -void SShell::MakeFromCopyOf(SShell *a) { - ssassert(this != a, "Can't make from copy of self"); - MakeFromTransformationOf(a, - Vector::From(0, 0, 0), Quaternion::IDENTITY, 1.0); -} - -void SShell::MakeFromTransformationOf(SShell *a, - Vector t, Quaternion q, double scale) -{ - booleanFailed = false; - surface.ReserveMore(a->surface.n); - for(SSurface &s : a->surface) { - SSurface n; - n = SSurface::FromTransformationOf(&s, t, q, scale, /*includingTrims=*/true); - surface.Add(&n); // keeping the old ID - } - - curve.ReserveMore(a->curve.n); - for(SCurve &c : a->curve) { - SCurve n; - n = SCurve::FromTransformationOf(&c, t, q, scale); - curve.Add(&n); // keeping the old ID - } -} - -void SShell::MakeEdgesInto(SEdgeList *sel) { - for(SSurface &s : surface) { - s.MakeEdgesInto(this, sel, SSurface::MakeAs::XYZ); - } -} - -void SShell::MakeSectionEdgesInto(Vector n, double d, SEdgeList *sel, SBezierList *sbl) -{ - for(SSurface &s : surface) { - if(s.CoincidentWithPlane(n, d)) { - s.MakeSectionEdgesInto(this, sel, sbl); - } - } -} - -void SShell::TriangulateInto(SMesh *sm) { -#pragma omp parallel for - for(int i=0; iTriangulateInto(this, &m); - #pragma omp critical - sm->MakeFromCopyOf(&m); - m.Clear(); - } -} - -bool SShell::IsEmpty() const { - return surface.IsEmpty(); -} - -void SShell::Clear() { - for(SSurface &s : surface) { - s.Clear(); - } - surface.Clear(); - - for(SCurve &c : curve) { - c.Clear(); - } - curve.Clear(); -} From 41ed0c9169f7720a09ba0aea6353bcf650d172fa Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sat, 12 Feb 2022 13:24:06 +0100 Subject: [PATCH 404/646] Revert "mac: Don't interpret single-touch scroll events as pan gestures" This reverts commit 91db627a81a1438ca4e02f0b27c6f17ceac1051c. --- src/platform/guimac.mm | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index 91a197d39..67d1eb976 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -372,7 +372,6 @@ @implementation SSView double rotationGestureCurrent; Point2d trackpadPositionShift; bool inTrackpadScrollGesture; - int numTouches; Platform::Window::Kind kind; } @@ -398,8 +397,6 @@ - (id)initWithKind:(Platform::Window::Kind)aKind { editor.action = @selector(didEdit:); inTrackpadScrollGesture = false; - numTouches = 0; - self.acceptsTouchEvents = YES; kind = aKind; if(kind == Platform::Window::Kind::TOPLEVEL) { NSGestureRecognizer *mag = [[NSMagnificationGestureRecognizer alloc] initWithTarget:self @@ -576,9 +573,7 @@ - (void)scrollWheel:(NSEvent *)nsEvent { using Platform::MouseEvent; MouseEvent event = [self convertMouseEvent:nsEvent]; - // Check for number of touches to exclude single-finger scrolling on Magic Mouse - bool isTrackpadEvent = numTouches >= 2 && nsEvent.subtype == NSEventSubtypeTabletPoint; - if(isTrackpadEvent && kind == Platform::Window::Kind::TOPLEVEL) { + if(nsEvent.subtype == NSEventSubtypeTabletPoint && kind == Platform::Window::Kind::TOPLEVEL) { // This is how Cocoa represents 2 finger trackpad drag gestures, rather than going via // NSPanGestureRecognizer which is how you might expect this to work... We complicate this // further by also handling shift-two-finger-drag to mean rotate. Fortunately we're using @@ -631,23 +626,6 @@ - (void)scrollWheel:(NSEvent *)nsEvent { receiver->onMouseEvent(event); } -- (void)touchesBeganWithEvent:(NSEvent *)event { - numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count; - [super touchesBeganWithEvent:event]; -} -- (void)touchesMovedWithEvent:(NSEvent *)event { - numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count; - [super touchesMovedWithEvent:event]; -} -- (void)touchesEndedWithEvent:(NSEvent *)event { - numTouches = [event touchesMatchingPhase:NSTouchPhaseTouching inView:self].count; - [super touchesEndedWithEvent:event]; -} -- (void)touchesCancelledWithEvent:(NSEvent *)event { - numTouches = 0; - [super touchesCancelledWithEvent:event]; -} - - (void)mouseExited:(NSEvent *)nsEvent { using Platform::MouseEvent; From eaabad1832ea4eed04ea494f90cbca9f6eac9958 Mon Sep 17 00:00:00 2001 From: dustinhartlyn <79132671+dustinhartlyn@users.noreply.github.com> Date: Mon, 28 Feb 2022 11:22:35 -0800 Subject: [PATCH 405/646] Fix for zoom in/out error (#1221) * minor fix open/save dialogue on windows On windows 10 the open/save dialogue box has an minor error, and I believe I fixed it. When "Open" is selected from the menu, the title of the dialogue box says "SolveSpace - Save File" and the entered file name is "united". My fix correctly titles the dialoged box, and leaves the address bar blank when a file is being opened because "united" is only needed as a default name when a file being saved. I found that class FileDialogImplWin32 from guiwin.cpp contains two if statements for "isSaveDialog". This is redundant. I removed the first where the title was originally set, but not working. I then set the title in the second if statement and moved the 'if isEmpty'' to this section. * Update guiwin.cpp replaced tabs with spaces * Created ZoomToMouse function in graphicswin.cpp which referances the mouse position directly. Simplified MouseScroll in mouse.cpp to point to this function instead of altering zoom directly. Also pointed zoom commpand from keyboard and menu to ZoomToMouse so that it works avoids different behavior. * clean up some comments --- src/graphicswin.cpp | 39 +++++++++++++++++++++++++++++++++++---- src/mouse.cpp | 29 ++++------------------------- src/ui.h | 3 ++- 3 files changed, 41 insertions(+), 30 deletions(-) diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index c7c74d98b..98ed54d68 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -712,16 +712,47 @@ double GraphicsWindow::ZoomToFit(const Camera &camera, return scale; } + +void GraphicsWindow::ZoomToMouse(double zoomMultiplyer) { + double offsetRight = offset.Dot(projRight); + double offsetUp = offset.Dot(projUp); + + double width, height; + window->GetContentSize(&width, &height); + + double righti = currentMousePosition.x / scale - offsetRight; + double upi = currentMousePosition.y / scale - offsetUp; + + // zoomMultiplyer of 1 gives a default zoom factor of 1.2x: zoomMultiplyer * 1.2 + // zoom = adjusted zoom negative zoomMultiplyer will zoom out, positive will zoom in + // + + scale *= exp(0.1823216 * zoomMultiplyer); // ln(1.2) = 0.1823216 + + double rightf = currentMousePosition.x / scale - offsetRight; + double upf = currentMousePosition.y / scale - offsetUp; + + offset = offset.Plus(projRight.ScaledBy(rightf - righti)); + offset = offset.Plus(projUp.ScaledBy(upf - upi)); + + if(SS.TW.shown.screen == TextWindow::Screen::EDIT_VIEW) { + if(havePainted) { + SS.ScheduleShowTW(); + } + } + havePainted = false; + Invalidate(); +} + + void GraphicsWindow::MenuView(Command id) { switch(id) { case Command::ZOOM_IN: - SS.GW.scale *= 1.2; - SS.ScheduleShowTW(); + SS.GW.ZoomToMouse(1); break; case Command::ZOOM_OUT: - SS.GW.scale /= 1.2; - SS.ScheduleShowTW(); + SS.GW.ZoomToMouse(-1); break; case Command::ZOOM_TO_FIT: diff --git a/src/mouse.cpp b/src/mouse.cpp index 5e7cde269..d183f58a0 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -914,7 +914,7 @@ bool GraphicsWindow::MouseEvent(Platform::MouseEvent event) { break; case MouseEvent::Type::SCROLL_VERT: - this->MouseScroll(event.x, event.y, event.shiftDown ? event.scrollDelta / 10 : event.scrollDelta); + this->MouseScroll(event.shiftDown ? event.scrollDelta / 10 : event.scrollDelta); break; case MouseEvent::Type::LEAVE: @@ -1478,17 +1478,10 @@ void GraphicsWindow::EditControlDone(const std::string &s) { } } -void GraphicsWindow::MouseScroll(double x, double y, double delta) { - double offsetRight = offset.Dot(projRight); - double offsetUp = offset.Dot(projUp); - - double righti = x/scale - offsetRight; - double upi = y/scale - offsetUp; - - // The default zoom factor is 1.2x for one scroll wheel click (delta==1). +void GraphicsWindow::MouseScroll(double zoomMultiplyer) { // To support smooth scrolling where scroll wheel events come in increments // smaller (or larger) than 1 we do: - // scale *= exp(ln(1.2) * delta); + // scale *= exp(ln(1.2) * zoomMultiplyer); // to ensure that the same total scroll delta always results in the same // total zoom irrespective of in how many increments the zoom was applied. // For example if we scroll a total delta of a+b in two events vs. one then @@ -1496,21 +1489,7 @@ void GraphicsWindow::MouseScroll(double x, double y, double delta) { // while // scale * a * b != scale * (a+b) // So this constant is ln(1.2) = 0.1823216 to make the default zoom 1.2x - scale *= exp(0.1823216 * delta); - - double rightf = x/scale - offsetRight; - double upf = y/scale - offsetUp; - - offset = offset.Plus(projRight.ScaledBy(rightf - righti)); - offset = offset.Plus(projUp.ScaledBy(upf - upi)); - - if(SS.TW.shown.screen == TextWindow::Screen::EDIT_VIEW) { - if(havePainted) { - SS.ScheduleShowTW(); - } - } - havePainted = false; - Invalidate(); + ZoomToMouse(zoomMultiplyer); } void GraphicsWindow::MouseLeave() { diff --git a/src/ui.h b/src/ui.h index 0d121b64f..c4ffff2ba 100644 --- a/src/ui.h +++ b/src/ui.h @@ -622,6 +622,7 @@ class GraphicsWindow { void HandlePointForZoomToFit(Vector p, Point2d *pmax, Point2d *pmin, double *wmin, bool usePerspective, const Camera &camera); + void ZoomToMouse(double delta); void LoopOverPoints(const std::vector &entities, const std::vector &constraints, const std::vector &faces, @@ -842,7 +843,7 @@ class GraphicsWindow { void MouseLeftDoubleClick(double x, double y); void MouseMiddleOrRightDown(double x, double y); void MouseRightUp(double x, double y); - void MouseScroll(double x, double y, double delta); + void MouseScroll(double delta); void MouseLeave(); bool KeyboardEvent(Platform::KeyboardEvent event); void EditControlDone(const std::string &s); From 714b6c04d1b8d8dc61e31fc3243b84c8affd7c42 Mon Sep 17 00:00:00 2001 From: Paul Kahler <14852918+phkahler@users.noreply.github.com> Date: Wed, 30 Mar 2022 09:39:28 -0400 Subject: [PATCH 406/646] Update README.md --- README.md | 9 --------- 1 file changed, 9 deletions(-) diff --git a/README.md b/README.md index 14bb49ffc..44176b09f 100644 --- a/README.md +++ b/README.md @@ -68,15 +68,6 @@ 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. From 50c4e46eda46eaea7e53d6a0ec00eaa7e847e1b2 Mon Sep 17 00:00:00 2001 From: Paul Kahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 31 Mar 2022 15:34:07 -0400 Subject: [PATCH 407/646] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 44176b09f..b44ce4adf 100644 --- a/README.md +++ b/README.md @@ -286,6 +286,8 @@ cd build cmake .. -DCMAKE_BUILD_TYPE=Release make ``` +If gawk is in your path be sure it is a proper Windows port that can handle CL/LF line endings. +If not CMake may fail in libpng due to some awk scripts - issue #1228. [gitwin]: https://git-scm.com/download/win [cmakewin]: http://www.cmake.org/download/#latest From 97aba82f85a94c4abbe23fafac6dee7c32833157 Mon Sep 17 00:00:00 2001 From: Paul Kahler <14852918+phkahler@users.noreply.github.com> Date: Fri, 1 Apr 2022 09:20:08 -0400 Subject: [PATCH 408/646] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b44ce4adf..55fe72dee 100644 --- a/README.md +++ b/README.md @@ -245,6 +245,8 @@ by passing the `-DENABLE_GUI=OFF` flag to the cmake invocation. You will need [git][gitwin], [cmake][cmakewin] and a C++ compiler (either Visual C++ or MinGW). If using Visual C++, Visual Studio 2015 or later is required. +If gawk is in your path be sure it is a proper Windows port that can handle CL LF line endings. +If not CMake may fail in libpng due to some awk scripts - issue #1228. ### Building with Visual Studio IDE @@ -286,8 +288,6 @@ cd build cmake .. -DCMAKE_BUILD_TYPE=Release make ``` -If gawk is in your path be sure it is a proper Windows port that can handle CL/LF line endings. -If not CMake may fail in libpng due to some awk scripts - issue #1228. [gitwin]: https://git-scm.com/download/win [cmakewin]: http://www.cmake.org/download/#latest From b3c030d40d6c748d66f86e482dd2f9970175c93a Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Wed, 13 Apr 2022 05:12:36 +0200 Subject: [PATCH 409/646] CI: Use upstream action to build snap & drop arm64 snap (#1232) Snapd stopped working in Docker containers in commit https://github.com/snapcore/snapd/commit/c6011693a816f7f8a5b0c7858ddce91c6ef1a352 Therefore, we cannot use the current build action, which relies on Docker to implement cross-compilation. Switching to the upstream build action avoids the problem at the cost of losing the arm64 builds on amd64 hardware. Those need to be reintroduced by some other mechanism, e.g. via Launchpad, in the future. Fixes #1229 --- .github/workflows/cd.yml | 36 +----------------------------------- 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index abfaba331..a14afc5cb 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -123,8 +123,8 @@ jobs: - name: Set Up Source run: rsync --filter=":- .gitignore" -r ./ pkg/snap/solvespace-snap-src - name: Build Snap + uses: snapcore/action-build@v1 id: build - uses: diddlesnaps/snapcraft-multiarch-action@v1 with: path: pkg/snap - name: Upload & Release to Edge @@ -142,40 +142,6 @@ jobs: snap: ${{ steps.build.outputs.snap }} release: edge,beta - deploy_snap_arm64: - needs: [test_ubuntu, test_windows, test_macos] - name: Deploy ARM64 Snap - runs-on: ubuntu-latest - steps: - - uses: docker/setup-qemu-action@v1 - with: - image: tonistiigi/binfmt@sha256:df15403e06a03c2f461c1f7938b171fda34a5849eb63a70e2a2109ed5a778bde - - uses: actions/checkout@v2 - - name: Fetch Tags - run: git fetch --force --tags - - name: Set Up Source - run: rsync --filter=":- .gitignore" -r ./ pkg/snap/solvespace-snap-src - - name: Build Snap - id: build - uses: diddlesnaps/snapcraft-multiarch-action@v1 - with: - path: pkg/snap - architecture: arm64 - - name: Upload & Release to Edge - if: github.event_name == 'push' - uses: snapcore/action-publish@v1 - with: - store_login: ${{ secrets.SNAPSTORE_LOGIN }} - snap: ${{ steps.build.outputs.snap }} - release: edge - - name: Upload & Release to Beta + Edge - if: github.event_name == 'release' - uses: snapcore/action-publish@v1 - with: - store_login: ${{ secrets.SNAPSTORE_LOGIN }} - snap: ${{ steps.build.outputs.snap }} - release: edge,beta - upload_release_assets: name: Upload Release Assets needs: [build_release_windows, build_release_windows_openmp, build_release_macos] From 391a86cbfe5fd51f399fc2c3962e2180159b33d0 Mon Sep 17 00:00:00 2001 From: carelinus <36591699+carelinus@users.noreply.github.com> Date: Sat, 30 Apr 2022 16:37:11 +0200 Subject: [PATCH 410/646] German translation completed --- res/locales/de_DE.po | 74 +++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 28 deletions(-) diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index 9791a5383..11d77fac8 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -7,15 +7,15 @@ msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" "POT-Creation-Date: 2022-02-01 16:24+0200\n" -"PO-Revision-Date: 2018-07-19 06:55+0000\n" +"PO-Revision-Date: 2022-04-30 16:44+0200\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Zanata 4.5.0\n" -"Plural-Forms: nplurals=2; plural=(n != 1)\n" +"X-Generator: Poedit 2.4.2\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #: clipboard.cpp:309 msgid "" @@ -26,7 +26,7 @@ msgstr "" "Ausschneiden, Einfügen und Kopieren sind nur in einer Arbeitsebene " "zulässig.\n" "\n" -"Aktivieren Sie eine mit Skizze -> In Arbeitsebene" +"Aktivieren Sie eine mit \"Skizze -> In Arbeitsebene\"." #: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." @@ -172,12 +172,12 @@ msgstr "Längenverhältnis" #: constraint.cpp:25 msgctxt "constr-name" msgid "arc-arc-length-ratio" -msgstr "" +msgstr "Bogen-Bogen-Längenverhältnis" #: constraint.cpp:26 msgctxt "constr-name" msgid "arc-line-length-ratio" -msgstr "" +msgstr "Bogen-Linien-Längenverhältnis" #: constraint.cpp:27 msgctxt "constr-name" @@ -187,12 +187,12 @@ msgstr "Längendifferenz" #: constraint.cpp:28 msgctxt "constr-name" msgid "arc-arc-len-difference" -msgstr "" +msgstr "Bogen-Bogen-Längendifferenz" #: constraint.cpp:29 msgctxt "constr-name" msgid "arc-line-len-difference" -msgstr "" +msgstr "Bogen-Linien-Längendifferenz" #: constraint.cpp:30 msgctxt "constr-name" @@ -306,7 +306,7 @@ msgid "" msgstr "" "Die Bogentangente und das Liniensegment müssen einen gemeinsamen Endpunkt " "haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " -"Tangente einschränken. -> Sc" +"Tangente einschränken." #: constraint.cpp:163 msgid "" @@ -315,7 +315,7 @@ msgid "" msgstr "" "Die Kurventangente und das Liniensegment müssen einen gemeinsamen Endpunkt " "haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " -"Tangente einschränken. -> Sc" +"Tangente einschränken." #: constraint.cpp:189 msgid "" @@ -323,7 +323,7 @@ msgid "" "before constraining tangent." msgstr "" "Die Kurven müssen einen gemeinsamen Endpunkt haben. Schränken Sie mit " -"\"Einschränkung / Auf Punkt\" ein, bevor Sie die Tangente einschränken. -> Sc" +"\"Einschränkung / Auf Punkt\" ein, bevor Sie die Tangente einschränken." #: constraint.cpp:238 msgid "" @@ -408,6 +408,12 @@ msgid "" " * two arcs\n" " * one arc and one line segment\n" msgstr "" +"Ungültige Auswahl für Einschränkung \"Längenverhältnis\". Diese " +"Einschränkung ist anwendbar auf:\n" +"\n" +" * zwei Liniensegmente\n" +" * zwei Bögen\n" +" * einen Bogen und ein Liniensegment\n" #: constraint.cpp:441 msgid "" @@ -418,6 +424,12 @@ msgid "" " * two arcs\n" " * one arc and one line segment\n" msgstr "" +"Ungültige Auswahl für Einschränkung \"Längendifferenz\". Diese Einschränkung " +"ist anwendbar auf:\n" +"\n" +" * zwei Liniensegmente\n" +" * zwei Bögen\n" +" * einen Bogen und ein Liniensegment\n" #: constraint.cpp:472 msgid "" @@ -584,7 +596,7 @@ msgid "" "2d View to export bare lines and curves." msgstr "" "Kein Festkörper vorhanden; zeichnen Sie eines mit Extrusionen und Drehungen, " -"oder exportieren Sie bloße Linien und Kurven mit \"2D-Ansicht exportieren\"" +"oder exportieren Sie bloße Linien und Kurven mit \"2D-Ansicht exportieren\"." #: export.cpp:61 msgid "" @@ -699,7 +711,7 @@ msgstr "&Neu" #: graphicswin.cpp:43 msgid "&Open..." -msgstr "&Öffnen" +msgstr "&Öffnen..." #: graphicswin.cpp:44 msgid "Open &Recent" @@ -727,7 +739,7 @@ msgstr "Exportiere 2D-Auswahl…" #: graphicswin.cpp:51 msgid "Export 3d &Wireframe..." -msgstr "Exportiere 3D-Drahtgittermodell" +msgstr "Exportiere 3D-Drahtgittermodell..." #: graphicswin.cpp:52 msgid "Export Triangle &Mesh..." @@ -859,7 +871,7 @@ msgstr "Perspektivische Projektion" #: graphicswin.cpp:97 msgid "Show E&xploded View" -msgstr "" +msgstr "Zeige e&xplodierte Ansicht" #: graphicswin.cpp:98 msgid "Dimension &Units" @@ -879,7 +891,7 @@ msgstr "Maße in Zoll" #: graphicswin.cpp:102 msgid "Dimensions in &Feet and Inches" -msgstr "" +msgstr "Maße in &Fuß und Inch" #: graphicswin.cpp:104 msgid "Show &Toolbar" @@ -931,7 +943,7 @@ msgstr "D&rehen" #: graphicswin.cpp:121 msgid "Link / Assemble..." -msgstr "Verknüpfen / Zusammensetzen" +msgstr "Verknüpfen / Zusammensetzen..." #: graphicswin.cpp:122 msgid "Link Recent" @@ -1047,11 +1059,11 @@ msgstr "Gleicher Abstand / Radius / Winkel" #: graphicswin.cpp:158 msgid "Length / Arc Ra&tio" -msgstr "" +msgstr "Länge / Bogen Verhäl&tnis" #: graphicswin.cpp:159 msgid "Length / Arc Diff&erence" -msgstr "" +msgstr "Länge / Bogen Diff&erenz" #: graphicswin.cpp:160 msgid "At &Midpoint" @@ -1119,7 +1131,7 @@ msgstr "Punkt nachzeichnen" #: graphicswin.cpp:180 msgid "&Stop Tracing..." -msgstr "Nachzeichnen beenden" +msgstr "Nachzeichnen beenden..." #: graphicswin.cpp:181 msgid "Step &Dimension..." @@ -1139,7 +1151,7 @@ msgstr "&Website / Anleitung" #: graphicswin.cpp:186 msgid "&Go to GitHub commit" -msgstr "" +msgstr "&Gehe zu GitHub commit" #: graphicswin.cpp:188 msgid "&About" @@ -1300,6 +1312,12 @@ msgid "" " * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" +"Ungültige Auswahl für neue Skizze in der Arbeitsebene. Diese Gruppe kann " +"erstellt werden mit:\n" +"\n" +" * einem Punkt (durch den Punkt, orthogonal zur Koordinatenachse)\n" +" * einem Punkt und zwei Linienabschnitten (durch den Punkt, parallel zu " +"den Linien)\n" #: group.cpp:166 msgid "" @@ -1307,7 +1325,7 @@ msgid "" "will be extruded normal to the workplane." msgstr "" "Aktivieren Sie vor der Extrusion eine Arbeitsebene (mit Skizze -> In " -"Arbeitsebene). Die Skizze wird senkrecht zur Arbeitsebene extrudiert" +"Arbeitsebene). Die Skizze wird senkrecht zur Arbeitsebene extrudiert." #: group.cpp:175 msgctxt "group-name" @@ -1434,7 +1452,7 @@ msgstr "Kante mit Länge Null!" #: importmesh.cpp:136 msgid "Text-formated STL files are not currently supported" -msgstr "" +msgstr "Text-formatierte STL Dateien werden aktuell nicht unterstützt" #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." @@ -1447,7 +1465,7 @@ msgid "" msgstr "" "Um eine Bogentangente zu erstellen, wählen Sie einen Punkt, in dem sich zwei " "nicht-Konstruktionslinien oder -kreise in dieser Gruppe und Arbeitsebene " -"treffen. " +"treffen." #: modify.cpp:386 msgid "" @@ -1646,7 +1664,7 @@ msgstr "SolveSpace-Modelle" #: platform/gui.cpp:89 msgctxt "file-type" msgid "ALL" -msgstr "" +msgstr "ALLE" #: platform/gui.cpp:91 msgctxt "file-type" @@ -1656,7 +1674,7 @@ msgstr "IDF Leiterplatte" #: platform/gui.cpp:92 msgctxt "file-type" msgid "STL triangle mesh" -msgstr "" +msgstr "STL-Dreiecks-Netz" #: platform/gui.cpp:96 msgctxt "file-type" @@ -2072,7 +2090,7 @@ msgstr "" #: style.cpp:735 msgid "Style name cannot be empty" -msgstr "Name des Linientyps kann nicht leer sein." +msgstr "Name des Linientyps kann nicht leer sein" #: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." @@ -2084,7 +2102,7 @@ msgstr "Nicht mehr als 999 Wiederholungen möglich." #: textscreens.cpp:820 msgid "Group name cannot be empty" -msgstr "Der Name der Gruppe darf nicht leer sein." +msgstr "Der Name der Gruppe darf nicht leer sein" #: textscreens.cpp:872 msgid "Opacity must be between zero and one." From 762ece5b34f43037766e747d1b10142064f3e430 Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 7 May 2022 17:11:49 -0400 Subject: [PATCH 411/646] Update mimalloc version to 2.0.6 --- extlib/mimalloc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extlib/mimalloc b/extlib/mimalloc index 4e643b6d3..f819dbb4e 160000 --- a/extlib/mimalloc +++ b/extlib/mimalloc @@ -1 +1 @@ -Subproject commit 4e643b6d3178e0ea2a093b7e14fe621631a91e4b +Subproject commit f819dbb4e4813fab464aee16770f39f11476bfea From a6e5da43ebd519f9fb8a37506893952c9d8664ef Mon Sep 17 00:00:00 2001 From: Paul Kahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 12 May 2022 09:57:47 -0400 Subject: [PATCH 412/646] Update CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ecef9c5b6..39972b668 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,7 @@ include(GetGitCommitHash) string(SUBSTRING "${GIT_COMMIT_HASH}" 0 8 solvespace_GIT_HASH) project(solvespace - VERSION 3.0 + VERSION 3.1~rc1 LANGUAGES C CXX ASM) set(ENABLE_GUI ON CACHE BOOL From 4327626543e8c35d1e7b5dd5a64e6d595d8ca606 Mon Sep 17 00:00:00 2001 From: Paul Kahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 12 May 2022 13:51:21 -0400 Subject: [PATCH 413/646] Update CMakeLists.txt --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 39972b668..7f08e95f2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,7 +40,7 @@ include(GetGitCommitHash) string(SUBSTRING "${GIT_COMMIT_HASH}" 0 8 solvespace_GIT_HASH) project(solvespace - VERSION 3.1~rc1 + VERSION 3.1 LANGUAGES C CXX ASM) set(ENABLE_GUI ON CACHE BOOL From ceb3b569b4f8376bde3c9c2da29ab9c00e9ccf31 Mon Sep 17 00:00:00 2001 From: Paul Kahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 12 May 2022 16:42:47 -0400 Subject: [PATCH 414/646] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f6a4af0a..251c5f98b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ Changelog ========= -3.x - since the 3.0 release, only available in edge builds +3.1 - Release Candidate 1 --- Constraints: From 951aa7147794abe1f85a2877127db871eeac8d55 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 13 May 2022 16:00:59 -0500 Subject: [PATCH 415/646] Eigen includes are needed in more places. Also remove erroneous redundant extlib/eigen mentions. --- CMakeLists.txt | 8 ++++---- src/CMakeLists.txt | 7 +++++-- test/CMakeLists.txt | 3 +++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7f08e95f2..399e2cae2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -185,9 +185,6 @@ 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 "") @@ -199,13 +196,16 @@ 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) +if(FORCE_VENDORED_Eigen3 OR NOT EIGEN3_INCLUDE_DIRS) 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(NOT EXISTS "${EIGEN3_INCLUDE_DIRS}") + message(FATAL_ERROR "Eigen 3 not found on system or in-tree") +endif() if(WIN32 OR APPLE) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0c0277eef..41c40d03a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -82,7 +82,9 @@ target_compile_definitions(slvs PRIVATE -DLIBRARY) target_include_directories(slvs - PUBLIC ${CMAKE_SOURCE_DIR}/include) + PUBLIC + ${CMAKE_SOURCE_DIR}/include + ${EIGEN3_INCLUDE_DIRS}) target_link_libraries(slvs PRIVATE slvs_deps) @@ -336,7 +338,8 @@ target_compile_definitions(solvespace-headless PRIVATE HEADLESS) target_include_directories(solvespace-headless - INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) + INTERFACE ${CMAKE_CURRENT_SOURCE_DIR} + PUBLIC ${EIGEN3_INCLUDE_DIRS}) target_link_libraries(solvespace-headless PRIVATE diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index db812bfab..eb6cf60b4 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -76,6 +76,9 @@ target_link_libraries(solvespace-testsuite solvespace-headless ${COVERAGE_LIBRARY}) +target_include_directories(solvespace-testsuite + PRIVATE + ${EIGEN3_INCLUDE_DIRS}) add_dependencies(solvespace-testsuite resources) From 8dee3e7ea387bb9578188592d261961c3735d668 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Fri, 13 May 2022 17:06:20 -0500 Subject: [PATCH 416/646] Fix Exec line of desktop files. They needed %f to indicate how to pass the file we're claiming to handle. --- res/freedesktop/solvespace-flatpak.desktop.in | 2 +- res/freedesktop/solvespace-snap.desktop | 2 +- res/freedesktop/solvespace.desktop.in | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/res/freedesktop/solvespace-flatpak.desktop.in b/res/freedesktop/solvespace-flatpak.desktop.in index c80b67ad6..f07f29342 100644 --- a/res/freedesktop/solvespace-flatpak.desktop.in +++ b/res/freedesktop/solvespace-flatpak.desktop.in @@ -2,7 +2,7 @@ Version=1.0 Name=SolveSpace Comment=A parametric 2d/3d CAD -Exec=${CMAKE_INSTALL_FULL_BINDIR}/solvespace +Exec=${CMAKE_INSTALL_FULL_BINDIR}/solvespace %f MimeType=application/x-solvespace Icon=com.solvespace.SolveSpace Type=Application diff --git a/res/freedesktop/solvespace-snap.desktop b/res/freedesktop/solvespace-snap.desktop index da0dda13a..7beceb045 100644 --- a/res/freedesktop/solvespace-snap.desktop +++ b/res/freedesktop/solvespace-snap.desktop @@ -2,7 +2,7 @@ Version=1.0 Name=SolveSpace Comment=A parametric 2d/3d CAD -Exec=solvespace +Exec=solvespace %f MimeType=application/x-solvespace Icon=${SNAP}/meta/icons/hicolor/scalable/apps/snap.solvespace.svg Type=Application diff --git a/res/freedesktop/solvespace.desktop.in b/res/freedesktop/solvespace.desktop.in index 87e6863c9..e9b78de23 100644 --- a/res/freedesktop/solvespace.desktop.in +++ b/res/freedesktop/solvespace.desktop.in @@ -2,7 +2,7 @@ Version=1.0 Name=SolveSpace Comment=A parametric 2d/3d CAD -Exec=${CMAKE_INSTALL_FULL_BINDIR}/solvespace +Exec=${CMAKE_INSTALL_FULL_BINDIR}/solvespace %f MimeType=application/x-solvespace Icon=solvespace Type=Application From c9d34f2048544e1f01d4aa0b80ce10ee3f35f900 Mon Sep 17 00:00:00 2001 From: Paul Kahler <14852918+phkahler@users.noreply.github.com> Date: Thu, 2 Jun 2022 12:14:16 -0400 Subject: [PATCH 417/646] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 251c5f98b..ce24e593b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ Changelog ========= -3.1 - Release Candidate 1 +3.1 --- Constraints: From a3bf48b5f8556ffd91899ec7754981fa4ec19c7c Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 11 Jun 2022 20:20:04 -0400 Subject: [PATCH 418/646] Add faces perpendicular and parallel constraints. --- src/constraint.cpp | 14 ++++++++++++-- src/entity.cpp | 9 +++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/constraint.cpp b/src/constraint.cpp index 6a25c2652..fbea9e273 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -721,7 +721,11 @@ void Constraint::MenuConstrain(Command id) { } case Command::PARALLEL: - if(gs.vectors == 2 && gs.n == 2) { + if(gs.faces == 2 && gs.n == 2) { + c.type = Type::PARALLEL; + c.entityA = gs.face[0]; + c.entityB = gs.face[1]; + } else if(gs.vectors == 2 && gs.n == 2) { c.type = Type::PARALLEL; c.entityA = gs.vector[0]; c.entityB = gs.vector[1]; @@ -765,6 +769,7 @@ void Constraint::MenuConstrain(Command id) { } else { Error(_("Bad selection for parallel / tangent constraint. This " "constraint can apply to:\n\n" + " * two faces\n" " * two line segments (parallel)\n" " * a line segment and a normal (parallel)\n" " * two normals (parallel)\n" @@ -776,13 +781,18 @@ void Constraint::MenuConstrain(Command id) { break; case Command::PERPENDICULAR: - if(gs.vectors == 2 && gs.n == 2) { + if(gs.faces == 2 && gs.n == 2) { + c.type = Type::PERPENDICULAR; + c.entityA = gs.face[0]; + c.entityB = gs.face[1]; + } else if(gs.vectors == 2 && gs.n == 2) { c.type = Type::PERPENDICULAR; c.entityA = gs.vector[0]; c.entityB = gs.vector[1]; } else { Error(_("Bad selection for perpendicular constraint. This " "constraint can apply to:\n\n" + " * two faces\n" " * two line segments\n" " * a line segment and a normal\n" " * two normals\n")); diff --git a/src/entity.cpp b/src/entity.cpp index a0f2f9461..dd42cba65 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -26,6 +26,9 @@ bool EntityBase::HasVector() const { } ExprVector EntityBase::VectorGetExprsInWorkplane(hEntity wrkpl) const { + if(IsFace()) { + return FaceGetNormalExprs(); + } switch(type) { case Type::LINE_SEGMENT: return (SK.GetEntity(point[0])->PointGetExprsInWorkplane(wrkpl)).Minus( @@ -62,6 +65,9 @@ ExprVector EntityBase::VectorGetExprs() const { } Vector EntityBase::VectorGetNum() const { + if(IsFace()) { + return FaceGetNormalNum(); + } switch(type) { case Type::LINE_SEGMENT: return (SK.GetEntity(point[0])->PointGetNum()).Minus( @@ -79,6 +85,9 @@ Vector EntityBase::VectorGetNum() const { } Vector EntityBase::VectorGetRefPoint() const { + if(IsFace()) { + return FaceGetPointNum(); + } switch(type) { case Type::LINE_SEGMENT: return ((SK.GetEntity(point[0])->PointGetNum()).Plus( From 748784bc69727def41539b0a5562afce597ac40b Mon Sep 17 00:00:00 2001 From: phkahler <14852918+phkahler@users.noreply.github.com> Date: Sat, 11 Jun 2022 20:27:36 -0400 Subject: [PATCH 419/646] Add some face and point types to describe screen --- src/describescreen.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/describescreen.cpp b/src/describescreen.cpp index 3e054a1ab..ca7995339 100644 --- a/src/describescreen.cpp +++ b/src/describescreen.cpp @@ -89,6 +89,7 @@ void TextWindow::DescribeSelection() { case Entity::Type::POINT_N_ROT_TRANS: case Entity::Type::POINT_N_COPY: case Entity::Type::POINT_N_ROT_AA: + case Entity::Type::POINT_N_ROT_AXIS_TRANS: p = e->PointGetNum(); Printf(false, "%FtPOINT%E at " PT_AS_STR, COSTR(e, p)); break; @@ -179,7 +180,9 @@ void TextWindow::DescribeSelection() { case Entity::Type::FACE_N_ROT_TRANS: case Entity::Type::FACE_N_ROT_AA: case Entity::Type::FACE_N_TRANS: - Printf(false, "%FtPLANE FACE%E"); + case Entity::Type::FACE_ROT_NORMAL_PT: + case Entity::Type::FACE_N_ROT_AXIS_TRANS: + Printf(false, "%FtPLANE FACE%E"); p = e->FaceGetNormalNum(); Printf(true, " normal = " PT_AS_NUM, CO(p)); p = e->FaceGetPointNum(); From 7dd5d709ccfd8be5126a4b605b77f101ab0c880e Mon Sep 17 00:00:00 2001 From: robnee Date: Sun, 7 Feb 2021 10:10:41 -0500 Subject: [PATCH 420/646] Make scheduled/deferred task order deterministic Fixes #920 #1143 Explanation from @robnee on Feb 7, 2021 in pull request #927 Solvespace uses two timers (generateAllTimer and showTWTimer) to defer tasks until the event loop processing finishes. This helps coalesce multiple calls into one. You can call scheduleGenerateAll multiple times while processing UI messages but only trigger one GenerateAll. scheduleGenerateAll and scheduleShowTW do their scheuduling by setting timers with durations of zero. These timers fire (at least on Linux and Windows) some time after all other events in the message queue have been processed. This works fine when scheduling either one of these tasks. However, there is no guarantee in what order the timers will fire (at least on Windows) regardless of which order the scheduling calls are made. It's pretty easy to demonstrate (on some platforms) by adding logging to the scheduling calls and timer callbacks. In many cases TextWindow::Show depends on generateAll happening first. This causes UI glitches where displays don't update and their contents are stale. Since this behavior is not deterministic it's easy to imagine how this problem could make certain bug reports difficult to reproduce and diagnose. #920 is a good example. It also makes syncing up UI behavior across all platforms a challenge. Solving this in the platform domain is tricky. This is PR endeavors to make the ordering of deferred calls to TextWindow::Show and generateAll deterministic. It does this by replacing generateAllTimer and showTWTimer with a single refreshTimer. Calls to scheduleGenerateAll and scheduleShowTW set flags to note the requested operations and schedule the refreshTimer. A new callback function SolveSpaceUI::Refresh can then check the flags and ensure that generateAll happens first. It fixes #920. Moreover, this PR makes it easy to observe and reproduce this problem reliably and across all platforms by simply reordering the calls in the Refresh callback. It's pretty clear that the ordering is important so some solution is needed, if for no other reason than the sanity of the devs. I think this is a pretty good solution as it spells out the ordering. If nothing else this PR is helpful in further investigations. @ruevs @phkahler I'd like to hear your thoughts. --- src/solvespace.cpp | 26 ++++++++++++++++++-------- src/solvespace.h | 6 ++++-- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/solvespace.cpp b/src/solvespace.cpp index a8d1a151e..ee30dbd4a 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -125,12 +125,8 @@ void SolveSpaceUI::Init() { SetLocale(locale); } - generateAllTimer = Platform::CreateTimer(); - generateAllTimer->onTimeout = std::bind(&SolveSpaceUI::GenerateAll, &SS, Generate::DIRTY, - /*andFindFree=*/false, /*genForBBox=*/false); - - showTWTimer = Platform::CreateTimer(); - showTWTimer->onTimeout = std::bind(&TextWindow::Show, &TW); + refreshTimer = Platform::CreateTimer(); + refreshTimer->onTimeout = std::bind(&SolveSpaceUI::Refresh, &SS); autosaveTimer = Platform::CreateTimer(); autosaveTimer->onTimeout = std::bind(&SolveSpaceUI::Autosave, &SS); @@ -302,12 +298,26 @@ void SolveSpaceUI::Exit() { Platform::ExitGui(); } +void SolveSpaceUI::Refresh() { + // generateAll must happen bfore updating displays + if(scheduledGenerateAll) { + GenerateAll(Generate::DIRTY, /*andFindFree=*/false, /*genForBBox=*/false); + scheduledGenerateAll = false; + } + if(scheduledShowTW) { + TW.Show(); + scheduledShowTW = false; + } +} + void SolveSpaceUI::ScheduleGenerateAll() { - generateAllTimer->RunAfterProcessingEvents(); + scheduledGenerateAll = true; + refreshTimer->RunAfterProcessingEvents(); } void SolveSpaceUI::ScheduleShowTW() { - showTWTimer->RunAfterProcessingEvents(); + scheduledShowTW = true; + refreshTimer->RunAfterProcessingEvents(); } void SolveSpaceUI::ScheduleAutosave() { diff --git a/src/solvespace.h b/src/solvespace.h index 1c22db629..fbae19e5e 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -793,9 +793,11 @@ class SolveSpaceUI { // the sketch! bool allConsistent; - Platform::TimerRef showTWTimer; - Platform::TimerRef generateAllTimer; + bool scheduledGenerateAll; + bool scheduledShowTW; + Platform::TimerRef refreshTimer; Platform::TimerRef autosaveTimer; + void Refresh(); void ScheduleShowTW(); void ScheduleGenerateAll(); void ScheduleAutosave(); From bb803b8cd58746a9c6cb519e73e6a031279d3dc8 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 12 Jun 2022 19:53:53 +0300 Subject: [PATCH 421/646] Show details for comments associated with points Since 7e08b02de1d91580f691dbe5eed08e2ccfd24eed comments can be attached to points. Now when such a comment is selected the point (entity) it is associated to will be shown in the text window together with it's coordinates and the distance (offset) from the point to the comment. Most of this was already prepared by Whitequark here https://github.com/solvespace/solvespace/commit/afa9e2890ef7ab46242d5f67f7bab1e58e80c2ba I just had to to remove the original 12 year old code by jwesthues that showed "SELECTED: comment text" for comments. (https://github.com/solvespace/solvespace/commit/6750995ef0b79c9ee83244fe34797f24e8aed582) Fixes #1072 --- src/describescreen.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/describescreen.cpp b/src/describescreen.cpp index ca7995339..db5274932 100644 --- a/src/describescreen.cpp +++ b/src/describescreen.cpp @@ -428,14 +428,19 @@ void TextWindow::DescribeSelection() { double d = (p1.Minus(p0)).Dot(n0); Printf(true, " distance = %Fi%s", SS.MmToString(d).c_str()); } - } else if(gs.n == 0 && gs.stylables > 0) { - Printf(false, "%FtSELECTED:%E comment text"); } else if(gs.n == 0 && gs.constraints == 1) { Constraint *c = SK.GetConstraint(gs.constraint[0]); const std::string &desc = c->DescriptionString().c_str(); if(c->type == Constraint::Type::COMMENT) { Printf(false, "%FtCOMMENT%E %s", desc.c_str()); + if(c->ptA != Entity::NO_ENTITY) { + Vector p = SK.GetEntity(c->ptA)->PointGetNum(); + Printf(true, " attached to point at: " PT_AS_STR, COSTR(SK.GetEntity(c->ptA), p)); + Vector dv = c->disp.offset; + Printf(false, " distance = %Fi%s", SS.MmToString(dv.Magnitude()).c_str()); + Printf(false, " d(x, y, z) = " PT_AS_STR_NO_LINK, COSTR_NO_LINK(dv)); + } } else if(c->HasLabel()) { if(c->reference) { Printf(false, "%FtREFERENCE%E %s", desc.c_str()); From 93a2ba91fb6cdcd014f7539dbdfd3b14587ca28d Mon Sep 17 00:00:00 2001 From: verylowfreq <60875431+verylowfreq@users.noreply.github.com> Date: Wed, 22 Jun 2022 14:24:23 +0900 Subject: [PATCH 422/646] Add ja-JP translation. --- res/CMakeLists.txt | 1 + res/locales.txt | 1 + res/locales/ja_JP.po | 2138 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 2140 insertions(+) create mode 100644 res/locales/ja_JP.po diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index 7303c6f7a..a75990034 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -270,6 +270,7 @@ add_resources( locales/tr_TR.po locales/ru_RU.po locales/zh_CN.po + locales/ja_JP.po fonts/unifont.hex.gz fonts/private/0-check-false.png fonts/private/1-check-true.png diff --git a/res/locales.txt b/res/locales.txt index d94e2c041..bcbb4a792 100644 --- a/res/locales.txt +++ b/res/locales.txt @@ -8,3 +8,4 @@ ru-RU,0419,Русский tr-TR,041F,Türkçe uk-UA,0422,Українська zh-CN,0804,简体中文 +ja-JP,0411,日本語 diff --git a/res/locales/ja_JP.po b/res/locales/ja_JP.po new file mode 100644 index 000000000..0e4559ebe --- /dev/null +++ b/res/locales/ja_JP.po @@ -0,0 +1,2138 @@ +# Japanese translations for SolveSpace package. +# Copyright (C) 2022 the Solvespace authors +# This file is distributed under the same license as the SolveSpace package. +# verylowfreq, 2022. +# +msgid "" +msgstr "" +"Project-Id-Version: SolveSpace 3.0\n" +"Report-Msgid-Bugs-To: whitequark@whitequark.org\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" +"PO-Revision-Date: 2022-06-13 20:47+0900\n" +"Last-Translator: https://github.com/verylowfreq\n" +"Language-Team: \n" +"Language: ja_JP\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.1\n" + +#: clipboard.cpp:309 +msgid "" +"Cut, paste, and copy work only in a workplane.\n" +"\n" +"Activate one with Sketch -> In Workplane." +msgstr "" +"切り取り・貼り付け・コピーは作業平面でのみ利用できます。\n" +"\n" +"作業平面は「スケッチ -> 作業平面上でスケッチする」から指定してください。" + +#: clipboard.cpp:326 +msgid "Clipboard is empty; nothing to paste." +msgstr "クリップボードは空です。貼り付けるものはありません。" + +#: clipboard.cpp:373 +msgid "Number of copies to paste must be at least one." +msgstr "貼り付ける個数は1以上でなければなりません。" + +#: clipboard.cpp:389 textscreens.cpp:833 +msgid "Scale cannot be zero." +msgstr "縮尺は0にできません。" + +#: clipboard.cpp:431 +msgid "Select one point to define origin of rotation." +msgstr "回転の原点を決めるために、点を1つ選択してください。" + +#: clipboard.cpp:443 +msgid "Select two points to define translation vector." +msgstr "移動方向を決めるために、点を2つ選択してください。" + +#: clipboard.cpp:453 +msgid "Transformation is identity. So all copies will be exactly on top of each other." +msgstr "移動量が 0 です。すべての複製は同一位置にあります。" + +#: clipboard.cpp:457 +msgid "Too many items to paste; split this into smaller pastes." +msgstr "複製の数が多すぎます。分割してください。" + +#: clipboard.cpp:462 +msgid "No workplane active." +msgstr "作業平面がアクティブでありません。" + +#: confscreen.cpp:381 +msgid "Bad format: specify coordinates as x, y, z" +msgstr "書式が誤っています。座標を \"x, y, z\" で指定してください。" + +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 +msgid "Bad format: specify color as r, g, b" +msgstr "書式が誤っています。色を \"r, g, b\" で指定してください。" + +#: confscreen.cpp:417 +msgid "" +"The perspective factor will have no effect until you enable View -> Use Perspective Projection." +msgstr "透視投影の拡大率は、「表示 -> 透視投影で表示」を有効にするまで反映されません。" + +#: confscreen.cpp:435 confscreen.cpp:445 +#, c-format +msgid "Specify between 0 and %d digits after the decimal." +msgstr "小数点以下の桁数は、0 から %d の範囲で指定してください。" + +#: confscreen.cpp:457 +msgid "Export scale must not be zero!" +msgstr "エクスポートの比率には0を指定できません。" + +#: confscreen.cpp:469 +msgid "Cutter radius offset must not be negative!" +msgstr "ドリル径は負の値にできません。" + +#: confscreen.cpp:528 +msgid "Bad value: autosave interval should be positive" +msgstr "値が誤っています。オートセーブの間隔は正の値を指定してください。" + +#: confscreen.cpp:531 +msgid "Bad format: specify interval in integral minutes" +msgstr "書式が誤っています。間隔は分単位で整数を指定してください。" + +#: constraint.cpp:12 +msgctxt "constr-name" +msgid "pts-coincident" +msgstr "" + +#: constraint.cpp:13 +msgctxt "constr-name" +msgid "pt-pt-distance" +msgstr "" + +#: constraint.cpp:14 +msgctxt "constr-name" +msgid "pt-line-distance" +msgstr "" + +#: constraint.cpp:15 +msgctxt "constr-name" +msgid "pt-plane-distance" +msgstr "" + +#: constraint.cpp:16 +msgctxt "constr-name" +msgid "pt-face-distance" +msgstr "" + +#: constraint.cpp:17 +msgctxt "constr-name" +msgid "proj-pt-pt-distance" +msgstr "" + +#: constraint.cpp:18 +msgctxt "constr-name" +msgid "pt-in-plane" +msgstr "" + +#: constraint.cpp:19 +msgctxt "constr-name" +msgid "pt-on-line" +msgstr "" + +#: constraint.cpp:20 +msgctxt "constr-name" +msgid "pt-on-face" +msgstr "" + +#: constraint.cpp:21 +msgctxt "constr-name" +msgid "eq-length" +msgstr "" + +#: constraint.cpp:22 +msgctxt "constr-name" +msgid "eq-length-and-pt-ln-dist" +msgstr "" + +#: constraint.cpp:23 +msgctxt "constr-name" +msgid "eq-pt-line-distances" +msgstr "" + +#: constraint.cpp:24 +msgctxt "constr-name" +msgid "length-ratio" +msgstr "" + +#: constraint.cpp:25 +msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" +msgid "length-difference" +msgstr "" + +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 +msgctxt "constr-name" +msgid "symmetric" +msgstr "" + +#: constraint.cpp:31 +msgctxt "constr-name" +msgid "symmetric-h" +msgstr "" + +#: constraint.cpp:32 +msgctxt "constr-name" +msgid "symmetric-v" +msgstr "" + +#: constraint.cpp:33 +msgctxt "constr-name" +msgid "symmetric-line" +msgstr "" + +#: constraint.cpp:34 +msgctxt "constr-name" +msgid "at-midpoint" +msgstr "" + +#: constraint.cpp:35 +msgctxt "constr-name" +msgid "horizontal" +msgstr "" + +#: constraint.cpp:36 +msgctxt "constr-name" +msgid "vertical" +msgstr "" + +#: constraint.cpp:37 +msgctxt "constr-name" +msgid "diameter" +msgstr "" + +#: constraint.cpp:38 +msgctxt "constr-name" +msgid "pt-on-circle" +msgstr "" + +#: constraint.cpp:39 +msgctxt "constr-name" +msgid "same-orientation" +msgstr "" + +#: constraint.cpp:40 +msgctxt "constr-name" +msgid "angle" +msgstr "" + +#: constraint.cpp:41 +msgctxt "constr-name" +msgid "parallel" +msgstr "" + +#: constraint.cpp:42 +msgctxt "constr-name" +msgid "arc-line-tangent" +msgstr "" + +#: constraint.cpp:43 +msgctxt "constr-name" +msgid "cubic-line-tangent" +msgstr "" + +#: constraint.cpp:44 +msgctxt "constr-name" +msgid "curve-curve-tangent" +msgstr "" + +#: constraint.cpp:45 +msgctxt "constr-name" +msgid "perpendicular" +msgstr "" + +#: constraint.cpp:46 +msgctxt "constr-name" +msgid "eq-radius" +msgstr "" + +#: constraint.cpp:47 +msgctxt "constr-name" +msgid "eq-angle" +msgstr "" + +#: constraint.cpp:48 +msgctxt "constr-name" +msgid "eq-line-len-arc-len" +msgstr "" + +#: constraint.cpp:49 +msgctxt "constr-name" +msgid "lock-where-dragged" +msgstr "" + +#: constraint.cpp:50 +msgctxt "constr-name" +msgid "comment" +msgstr "" + +#: constraint.cpp:144 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with Constrain -> On " +"Point before constraining tangent." +msgstr "" +"正接する円弧と線分は端点を共有している必要があります。正接拘束をする前に「拘束 -> 一致」で拘束して" +"ください。" + +#: constraint.cpp:163 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them with Constrain -> On " +"Point before constraining tangent." +msgstr "" +"ベジェ曲線と線分は端点を共有している必要があります。正接拘束をする前に「拘束 -> 一致」で拘束してく" +"ださい。" + +#: constraint.cpp:189 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point before constraining " +"tangent." +msgstr "" +"曲線同士は端点を共有している必要があります。正接拘束をする前に「拘束 -> 一致」で拘束してください。" + +#: constraint.cpp:238 +msgid "" +"Bad selection for distance / diameter constraint. This constraint can apply to:\n" +"\n" +" * two points (distance between points)\n" +" * a line segment (length)\n" +" * two points and a line segment or normal (projected distance)\n" +" * a workplane and a point (minimum distance)\n" +" * a line segment and a point (minimum distance)\n" +" * a plane face and a point (minimum distance)\n" +" * a circle or an arc (diameter)\n" +msgstr "" +"距離・直径拘束ができませんでした。次の要素に適用できます:\n" +"\n" +" * 2 つの点 (点同士の距離)\n" +" * 1 つの線分 (長さ)\n" +" * 2 つの点と、1 つの線分もしくは法線 (投影された距離)\n" +" * 1 つの作業平面と 1 つの点 (最小の距離)\n" +" * 1 つの線分と 1 つの点 (最小の距離)\n" +" * 1 つの平面フェイスと1つの点 (最小の距離)\n" +" * 1 つの円もしくは円弧 (直径)\n" +"\n" + +#: constraint.cpp:291 +msgid "" +"Bad selection for on point / curve / plane constraint. This constraint can apply to:\n" +"\n" +" * two points (points coincident)\n" +" * a point and a workplane (point in plane)\n" +" * a point and a line segment (point on line)\n" +" * a point and a circle or arc (point on curve)\n" +" * a point and a plane face (point on face)\n" +msgstr "" +"一致拘束ができませんでした。次の要素に適用できます:\n" +"\n" +" * 2 つの点 (点を同一位置に)\n" +" * 1 つの点と 1 つの作業平面 (点を平面上に)\n" +" * 1 つの点と 1 つの線分 (点を直線状に)\n" +" * 1 つの点と、1つの円もしくは円弧 (点を曲線上に)\n" +" * 1 つの点と 1 つの平面フェイス (点をフェイス上に)\n" + +#: constraint.cpp:353 +msgid "" +"Bad selection for equal length / radius constraint. This constraint can apply to:\n" +"\n" +" * two line segments (equal length)\n" +" * two line segments and two points (equal point-line distances)\n" +" * a line segment and two points (equal point-line distances)\n" +" * a line segment, and a point and line segment (point-line distance equals length)\n" +" * four line segments or normals (equal angle between A,B and C,D)\n" +" * three line segments or normals (equal angle between A,B and B,C)\n" +" * two circles or arcs (equal radius)\n" +" * a line segment and an arc (line segment length equals arc length)\n" +msgstr "" +"長さ・半径・角度の同値拘束ができませんでした。次の要素に適用できます:\n" +"\n" +" * 2 つの線分 (長さを同じに)\n" +" * 2 つの線分と 2 つの点 (それぞれ直線と点の距離を同じに)\n" +" * 1 つの線分と 2 つの点 (直線とそれぞれの点の距離を同じに)\n" +" * 1 つの線分と、1 つの点と 1 つの線分 (線分の長さと、直線と点の距離を同じに)\n" +" * 4つの線分もしくは法線 (直線A,B、直線C,Dそれぞれの交差する角度を同じに)\n" +" * 3 つの線分もしくは法線 (直線A,B、直線B,Cそれぞれの交差する角度を同じに)\n" +" * 2 つの円もしくは円弧 (半径を同じに)\n" +" * 1 つの線分と 1 つの円弧 (線分の長さと円弧の長さを同じに)\n" + +#: constraint.cpp:407 +msgid "" +"Bad selection for length ratio constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" +msgstr "" +"長さの比率の拘束ができませんでした。次の要素に適用できます:\n" +"\n" +" * 2 つの線分\n" +" * 2 つの円弧\n" +" * 円弧と線分\n" + +#: constraint.cpp:441 +msgid "" +"Bad selection for length difference constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" +msgstr "" +"長さの差の拘束ができませんでした。次の要素に適用できます:\n" +"\n" +" * 2 つの線分\n" +" * 2 つの円弧\n" +" * 円弧と線分\n" + +#: constraint.cpp:472 +msgid "" +"Bad selection for at midpoint constraint. This constraint can apply to:\n" +"\n" +" * a line segment and a point (point at midpoint)\n" +" * a line segment and a workplane (line's midpoint on plane)\n" +msgstr "" +"中点拘束できませんでした。次の要素に適用できます:\n" +"\n" +" * 線分と点 (点を直線の中点に置きます)\n" +" * 線分と作業平面 (直線の中点を作業平面上に置きます)\n" + +#: constraint.cpp:530 +msgid "" +"Bad selection for symmetric constraint. This constraint can apply to:\n" +"\n" +" * two points or a line segment (symmetric about workplane's coordinate axis)\n" +" * line segment, and two points or a line segment (symmetric about line segment)\n" +" * workplane, and two points or a line segment (symmetric about workplane)\n" +msgstr "" +"対象拘束ができませんでした。次の要素の適用できます:\n" +"\n" +" * 2 つの点、もしくは 1 つの線分 (作業平面の座標軸について対称をとります)\n" +" * 線分と、2 つの点もしくは 1 つの線分 (線分について対称をとります)\n" +" * 作業平面と、2 つの点もしくは 1 つの線分 (作業平面について対称をとります)\n" + +#: constraint.cpp:545 +msgid "A workplane must be active when constraining symmetric without an explicit symmetry plane." +msgstr "明示的に対称平面を指定しない場合は、対象拘束をするには作業平面をアクティブにしてください。" + +#: constraint.cpp:579 +msgid "" +"Activate a workplane (with Sketch -> In Workplane) before applying a horizontal or vertical " +"constraint." +msgstr "" +"垂直拘束や水平拘束をする前に、「スケッチ -> 作業平面上でスケッチする」で作業平面をアクティブにして" +"ください。" + +#: constraint.cpp:592 +msgid "" +"Bad selection for horizontal / vertical constraint. This constraint can apply to:\n" +"\n" +" * two points\n" +" * a line segment\n" +msgstr "" +"垂直・水平拘束ができませんでした。次の要素に適用できます:\n" +"\n" +" * 2 つの点\n" +" * 1 つの線分\n" + +#: constraint.cpp:613 +msgid "" +"Bad selection for same orientation constraint. This constraint can apply to:\n" +"\n" +" * two normals\n" +msgstr "" +"同じ方向の拘束ができませんでした。次の要素に適用できます。\n" +"\n" +" * 2 つの法線\n" + +#: constraint.cpp:663 +msgid "Must select an angle constraint." +msgstr "角度拘束を選択してください。" + +#: constraint.cpp:676 +msgid "Must select a constraint with associated label." +msgstr "値を持つ拘束を選択してください。" + +#: constraint.cpp:687 +msgid "" +"Bad selection for angle constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"角度拘束ができませんでした。次の要素に適用できます:\n" +"\n" +" * 2 つの線分\n" +" * 線分と法線\n" +" * 2 つの法線\n" + +#: constraint.cpp:754 +msgid "Curve-curve tangency must apply in workplane." +msgstr "曲線同士の正接は作業平面上で適用できます。" + +#: constraint.cpp:766 +msgid "" +"Bad selection for parallel / tangent constraint. This constraint can apply to:\n" +"\n" +" * two line segments (parallel)\n" +" * a line segment and a normal (parallel)\n" +" * two normals (parallel)\n" +" * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" +msgstr "" +"平行・正接拘束ができませんでした。次の要素に適用できます:\n" +"\n" +" * 2 つの線分 (平行)\n" +" * 1 つの線分と 1 つの法線 (平行)\n" +" * 2 つの法線 (平行)\n" +" * 片方の端点を共有する 2 つの線分、円弧、もしくはベジェ曲線 (正接)\n" + +#: constraint.cpp:784 +msgid "" +"Bad selection for perpendicular constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"垂線拘束ができませんでした。次の要素に適用できます:\n" +"\n" +" * 2 つの線分\n" +" * 1 つの線分と 1 つの法線\n" +" * 2 つの法線\n" + +#: constraint.cpp:799 +msgid "" +"Bad selection for lock point where dragged constraint. This constraint can apply to:\n" +"\n" +" * a point\n" +msgstr "" +"点の位置の拘束 (点を他のオブジェクトに連動して動かさない) ができませんでした。次の要素に適用できま" +"す:\n" +"\n" +" * 1 つの点\n" + +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "(コメント - ダブルクリックで編集)" + +#: constraint.cpp:818 +msgid "click center of comment text" +msgstr "コメントテキストの中心をクリックで指定" + +#: export.cpp:19 +msgid "" +"No solid model present; draw one with extrudes and revolves, or use Export 2d View to export bare " +"lines and curves." +msgstr "" +"ソリッドモデルがありません。押し出しや周回、回転を利用するか、平面への投影視点のエクスポートで直線" +"や曲線をそのまま出力します。" + +#: export.cpp:61 +msgid "" +"Bad selection for export section. Please select:\n" +"\n" +" * nothing, with an active workplane (workplane is section plane)\n" +" * a face (section plane through face)\n" +" * a point and two line segments (plane through point and parallel to lines)\n" +msgstr "" +"2D断面の出力ができませんでした。次のように選択してください:\n" +"\n" +" * なにも選択せず、作業平面がアクティブである (作業平面を断面とします)\n" +" * フェイス (フェイスを通る断面を用います)\n" +" * 1 つの点と 2 つの線分 (点を通り直線と平行する断面を用います)\n" + +#: export.cpp:818 +msgid "Active group mesh is empty; nothing to export." +msgstr "アクティブなグループのメッシュは空です。エクスポートは行なわれませんでした。" + +#: exportvector.cpp:336 +msgid "freehand lines were replaced with continuous lines" +msgstr "フリーハンドの線は実線に置き換えられました。" + +#: exportvector.cpp:338 +msgid "zigzag lines were replaced with continuous lines" +msgstr "ジグザグ線は実線に置き換えられました。" + +#: exportvector.cpp:592 +msgid "Some aspects of the drawing have no DXF equivalent and were not exported:\n" +msgstr "図面のうち一部の側面は、対応するものがDXFにないため、それらは出力されませんでした:\n" + +#: exportvector.cpp:838 +msgid "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." +msgstr "PDFのページ寸法が 200x200 インチを超えています。多くのPDFリーダーでは正常に読み込めません。" + +#: file.cpp:44 group.cpp:91 +msgctxt "group-name" +msgid "sketch-in-plane" +msgstr "" + +#: file.cpp:62 +msgctxt "group-name" +msgid "#references" +msgstr "" + +#: file.cpp:550 +msgid "The file is empty. It may be corrupt." +msgstr "ファイルが空です。ファイルが破損している可能性があります。" + +#: file.cpp:555 +msgid "Unrecognized data in file. This file may be corrupt, or from a newer version of the program." +msgstr "" +"ファイルに処理できないデータが含まれています。ファイルが破損しているか、より新しいバージョンで作成" +"されたファイルの可能性があります。" + +#: file.cpp:867 +msgctxt "title" +msgid "Missing File" +msgstr "不明ファイル" + +#: file.cpp:868 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "リンクされたファイル \"%s\" が見つかりません。" + +#: file.cpp:870 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be permanently removed." +msgstr "" +"手動で配置しますか?\n" +"\n" +"キャンセルした場合、不明なファイルに依存しているすべての寸法は削除されます。" + +#: file.cpp:873 +msgctxt "button" +msgid "&Yes" +msgstr "はい (&Y)" + +#: file.cpp:875 +msgctxt "button" +msgid "&No" +msgstr "いいえ (&N)" + +#: file.cpp:877 solvespace.cpp:611 +msgctxt "button" +msgid "&Cancel" +msgstr "キャンセル (&C)" + +#: graphicswin.cpp:41 +msgid "&File" +msgstr "ファイル (&F)" + +#: graphicswin.cpp:42 +msgid "&New" +msgstr "新規作成 (&N)" + +#: graphicswin.cpp:43 +msgid "&Open..." +msgstr "開く... (&O)" + +#: graphicswin.cpp:44 +msgid "Open &Recent" +msgstr "最近使用したファイル (&R)" + +#: graphicswin.cpp:45 +msgid "&Save" +msgstr "保存 (&S)" + +#: graphicswin.cpp:46 +msgid "Save &As..." +msgstr "名前を付けて保存... (&A)" + +#: graphicswin.cpp:48 +msgid "Export &Image..." +msgstr "画像をエクスポート... (&I)" + +#: graphicswin.cpp:49 +msgid "Export 2d &View..." +msgstr "平面への投影視点をエクスポート... (&V)" + +#: graphicswin.cpp:50 +msgid "Export 2d &Section..." +msgstr "2D断面をエクスポート... (&S)" + +#: graphicswin.cpp:51 +msgid "Export 3d &Wireframe..." +msgstr "三次元ワイヤーフレームをエクスポート... (&W)" + +#: graphicswin.cpp:52 +msgid "Export Triangle &Mesh..." +msgstr "三角メッシュをエクスポート... (&M)" + +#: graphicswin.cpp:53 +msgid "Export &Surfaces..." +msgstr "サーフェスをエクスポート... (&S)" + +#: graphicswin.cpp:54 +msgid "Im&port..." +msgstr "インポート... (&I)" + +#: graphicswin.cpp:57 +msgid "E&xit" +msgstr "終了 (&E)" + +#: graphicswin.cpp:60 +msgid "&Edit" +msgstr "編集 (&E)" + +#: graphicswin.cpp:61 +msgid "&Undo" +msgstr "取り消し (&U)" + +#: graphicswin.cpp:62 +msgid "&Redo" +msgstr "やり直し (&R)" + +#: graphicswin.cpp:63 +msgid "Re&generate All" +msgstr "すべて再生成 (&g)" + +#: graphicswin.cpp:65 +msgid "Snap Selection to &Grid" +msgstr "選択したオブジェクトをグリッドに合わせる (&G)" + +#: graphicswin.cpp:66 +msgid "Rotate Imported &90°" +msgstr "リンクした部品を90度回転する (&9)" + +#: graphicswin.cpp:68 +msgid "Cu&t" +msgstr "切り取り (&t)" + +#: graphicswin.cpp:69 +msgid "&Copy" +msgstr "コピー (&C)" + +#: graphicswin.cpp:70 +msgid "&Paste" +msgstr "貼り付け (&P)" + +#: graphicswin.cpp:71 +msgid "Paste &Transformed..." +msgstr "複製しながら貼り付け... (&T)" + +#: graphicswin.cpp:72 +msgid "&Delete" +msgstr "削除 (&D)" + +#: graphicswin.cpp:74 +msgid "Select &Edge Chain" +msgstr "接続しているエッジを選択" + +#: graphicswin.cpp:75 +msgid "Select &All" +msgstr "すべてを選択 (&A)" + +#: graphicswin.cpp:76 +msgid "&Unselect All" +msgstr "選択を解除 (&U)" + +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "線のスタイル... (&L)" + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "カメラの設定... (&V)" + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "設定 (&f)" + +#: graphicswin.cpp:84 +msgid "&View" +msgstr "表示 (&V)" + +#: graphicswin.cpp:85 +msgid "Zoom &In" +msgstr "拡大 (&I)" + +#: graphicswin.cpp:86 +msgid "Zoom &Out" +msgstr "縮小 (&O)" + +#: graphicswin.cpp:87 +msgid "Zoom To &Fit" +msgstr "選択オブジェクトの最適表示" + +#: graphicswin.cpp:89 +msgid "Align View to &Workplane" +msgstr "作業平面に合わせる (&W)" + +#: graphicswin.cpp:90 +msgid "Nearest &Ortho View" +msgstr "近傍の正面図視点へ移動 (&O)" + +#: graphicswin.cpp:91 +msgid "Nearest &Isometric View" +msgstr "近傍の等角図視点へ移動 (&I)" + +#: graphicswin.cpp:92 +msgid "&Center View At Point" +msgstr "点を表示の中心にする" + +#: graphicswin.cpp:94 +msgid "Show Snap &Grid" +msgstr "グリッドを表示 (&G)" + +#: graphicswin.cpp:95 +msgid "Darken Inactive Solids" +msgstr "アクティブでないソリッドを暗くする" + +#: graphicswin.cpp:96 +msgid "Use &Perspective Projection" +msgstr "透視投影で表示 (&P)" + +#: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "分解立体図を表示 (&x)" + +#: graphicswin.cpp:98 +msgid "Dimension &Units" +msgstr "表示単位の選択 (&U)" + +#: graphicswin.cpp:99 +msgid "Dimensions in &Millimeters" +msgstr "ミリメートル (&M)" + +#: graphicswin.cpp:100 +msgid "Dimensions in M&eters" +msgstr "メートル (&e)" + +#: graphicswin.cpp:101 +msgid "Dimensions in &Inches" +msgstr "インチ (&I)" + +#: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "フィート・インチ (&F)" + +#: graphicswin.cpp:104 +msgid "Show &Toolbar" +msgstr "ツールバーを表示 (&T)" + +#: graphicswin.cpp:105 +msgid "Show Property Bro&wser" +msgstr "プロパティブラウザを表示 (&w)" + +#: graphicswin.cpp:107 +msgid "&Full Screen" +msgstr "全画面表示 (&F)" + +#: graphicswin.cpp:109 +msgid "&New Group" +msgstr "グループ (&N)" + +#: graphicswin.cpp:110 +msgid "Sketch In &3d" +msgstr "三次元空間内でスケッチを始める (&3)" + +#: graphicswin.cpp:111 +msgid "Sketch In New &Workplane" +msgstr "新しい作業平面上でスケッチを始める (&W)" + +#: graphicswin.cpp:113 +msgid "Step &Translating" +msgstr "直線上にコピー (&T)" + +#: graphicswin.cpp:114 +msgid "Step &Rotating" +msgstr "円上にコピー (&R)" + +#: graphicswin.cpp:116 +msgid "E&xtrude" +msgstr "押し出し (&x)" + +#: graphicswin.cpp:117 +msgid "&Helix" +msgstr "周回 (&H)" + +#: graphicswin.cpp:118 +msgid "&Lathe" +msgstr "螺旋 (&L)" + +#: graphicswin.cpp:119 +msgid "Re&volve" +msgstr "回転 (&v)" + +#: graphicswin.cpp:121 +msgid "Link / Assemble..." +msgstr "リンク・アセンブル..." + +#: graphicswin.cpp:122 +msgid "Link Recent" +msgstr "最近使用したファイルとリンク" + +#: graphicswin.cpp:124 +msgid "&Sketch" +msgstr "スケッチ (&S)" + +#: graphicswin.cpp:125 +msgid "In &Workplane" +msgstr "作業平面上でスケッチする (&W)" + +#: graphicswin.cpp:126 +msgid "Anywhere In &3d" +msgstr "三次元空間内でスケッチする (&3)" + +#: graphicswin.cpp:128 +msgid "Datum &Point" +msgstr "点 (&P)" + +#: graphicswin.cpp:129 +msgid "&Workplane" +msgstr "作業平面 (&W)" + +#: graphicswin.cpp:131 +msgid "Line &Segment" +msgstr "線分 (&S)" + +#: graphicswin.cpp:132 +msgid "C&onstruction Line Segment" +msgstr "補助線の線分 (&o)" + +#: graphicswin.cpp:133 +msgid "&Rectangle" +msgstr "四角形 (&R)" + +#: graphicswin.cpp:134 +msgid "&Circle" +msgstr "円 (&C)" + +#: graphicswin.cpp:135 +msgid "&Arc of a Circle" +msgstr "円弧 (&A)" + +#: graphicswin.cpp:136 +msgid "&Bezier Cubic Spline" +msgstr "ベジェ曲線 (&B)" + +#: graphicswin.cpp:138 +msgid "&Text in TrueType Font" +msgstr "TrueTypeフォントのテキスト (&T)" + +#: graphicswin.cpp:139 +msgid "&Image" +msgstr "画像 (&I)" + +#: graphicswin.cpp:141 +msgid "To&ggle Construction" +msgstr "補助線との切り替え (&g)" + +#: graphicswin.cpp:142 +msgid "Tangent &Arc at Point" +msgstr "フィレット" + +#: graphicswin.cpp:143 +msgid "Split Curves at &Intersection" +msgstr "交差箇所で分割 (&I)" + +#: graphicswin.cpp:145 +msgid "&Constrain" +msgstr "拘束 (&C)" + +#: graphicswin.cpp:146 +msgid "&Distance / Diameter" +msgstr "距離・直径 (&D)" + +#: graphicswin.cpp:147 +msgid "Re&ference Dimension" +msgstr "参照寸法 (&f)" + +#: graphicswin.cpp:148 +msgid "A&ngle" +msgstr "角度 (&n)" + +#: graphicswin.cpp:149 +msgid "Reference An&gle" +msgstr "参照角度 (&g)" + +#: graphicswin.cpp:150 +msgid "Other S&upplementary Angle" +msgstr "補角 (&u)" + +#: graphicswin.cpp:151 +msgid "Toggle R&eference Dim" +msgstr "拘束と参照を切り替え (&e)" + +#: graphicswin.cpp:153 +msgid "&Horizontal" +msgstr "水平 (&H)" + +#: graphicswin.cpp:154 +msgid "&Vertical" +msgstr "垂直 (&V)" + +#: graphicswin.cpp:156 +msgid "&On Point / Curve / Plane" +msgstr "一致 (&O)" + +#: graphicswin.cpp:157 +msgid "E&qual Length / Radius / Angle" +msgstr "長さ・半径・角度を等値にする (&q)" + +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "長さ・円弧の比率 (&t)" + +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "長さ・円弧の差 (&e)" + +#: graphicswin.cpp:160 +msgid "At &Midpoint" +msgstr "中点 (&M)" + +#: graphicswin.cpp:161 +msgid "S&ymmetric" +msgstr "対称 (&y)" + +#: graphicswin.cpp:162 +msgid "Para&llel / Tangent" +msgstr "平行・正接 (&l)" + +#: graphicswin.cpp:163 +msgid "&Perpendicular" +msgstr "垂線 (&P)" + +#: graphicswin.cpp:164 +msgid "Same Orient&ation" +msgstr "同じ方向 (&a)" + +#: graphicswin.cpp:165 +msgid "Lock Point Where &Dragged" +msgstr "点を他のオブジェクトに連動して動かさない (&D)" + +#: graphicswin.cpp:167 +msgid "Comment" +msgstr "コメントを配置" + +#: graphicswin.cpp:169 +msgid "&Analyze" +msgstr "解析 (&A)" + +#: graphicswin.cpp:170 +msgid "Measure &Volume" +msgstr "体積を計測 (&V)" + +#: graphicswin.cpp:171 +msgid "Measure A&rea" +msgstr "面積を計測 (&r)" + +#: graphicswin.cpp:172 +msgid "Measure &Perimeter" +msgstr "外周長を計測 (&P)" + +#: graphicswin.cpp:173 +msgid "Show &Interfering Parts" +msgstr "部品の干渉を強調表示 (&I)" + +#: graphicswin.cpp:174 +msgid "Show &Naked Edges" +msgstr "浮いたエッジを強調表示 (&N)" + +#: graphicswin.cpp:175 +msgid "Show &Center of Mass" +msgstr "重心を表示 (&C)" + +#: graphicswin.cpp:177 +msgid "Show &Underconstrained Points" +msgstr "拘束されていない点を強調表示 (&U)" + +#: graphicswin.cpp:179 +msgid "&Trace Point" +msgstr "点の位置の記録を開始 (&T)" + +#: graphicswin.cpp:180 +msgid "&Stop Tracing..." +msgstr "記録を終了して保存する... (&S)" + +#: graphicswin.cpp:181 +msgid "Step &Dimension..." +msgstr "寸法を段階的に変更... (&D)" + +#: graphicswin.cpp:183 +msgid "&Help" +msgstr "ヘルプ (&H)" + +#: graphicswin.cpp:184 +msgid "&Language" +msgstr "言語 (&L)" + +#: graphicswin.cpp:185 +msgid "&Website / Manual" +msgstr "Webサイト・マニュアル" + +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "GitHubの該当コミットへ移動 (&G)" + +#: graphicswin.cpp:188 +msgid "&About" +msgstr "SolveSpaceについて (&A)" + +#: graphicswin.cpp:362 +msgid "(no recent files)" +msgstr "(履歴なし)" + +#: graphicswin.cpp:370 +#, c-format +msgid "File '%s' does not exist." +msgstr "ファイル '%s' は存在しません。" + +#: graphicswin.cpp:737 +msgid "No workplane is active, so the grid will not appear." +msgstr "作業平面がアクティブでないため、グリッドは表示されません。" + +#: graphicswin.cpp:752 +msgid "" +"The perspective factor is set to zero, so the view will always be a parallel projection.\n" +"\n" +"For a perspective projection, modify the perspective factor in the configuration screen. A value " +"around 0.3 is typical." +msgstr "" +"透視投影の係数が 0 になっているため、表示は常に平行投影になります。\n" +"\n" +"透視投影にするには、係数を configuration から変更してください。値は 0.3 くらいが一般的です。" + +#: graphicswin.cpp:837 +msgid "Select a point; this point will become the center of the view on screen." +msgstr "スクリーンの中央とする点を指定してください。" + +#: graphicswin.cpp:1137 +msgid "No additional entities share endpoints with the selected entities." +msgstr "選択した要素と端点を共有する要素は、これ以上ありません。" + +#: 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:1178 +msgid "" +"No workplane is active. Activate a workplane (with Sketch -> In Workplane) to define the plane " +"for the snap grid." +msgstr "" +"作業平面がアクティブではありません。グリッドの平面を指定するには作業平面をアクティブにしてくださ" +"い (「スケッチ -> 作業平面上でスケッチする」)。" + +#: 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:1270 +msgid "No workplane selected. Activating default workplane for this group." +msgstr "" +"作業平面がアクティブではありません。現在のグループのデフォルトの作業平面をアクティブにします。" + +#: 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:1294 +msgid "" +"Bad selection for tangent arc at point. Select a single point, or select nothing to set up arc " +"parameters." +msgstr "" +"フィェットの作成には無効な選択です。ひとつの点が選択されていればフィレットを作成します。なにも選択" +"されていなければ、フィレット作成時のパラメーターを設定できます。" + +#: graphicswin.cpp:1305 +msgid "click point on arc (draws anti-clockwise)" +msgstr "円弧上の点をクリックで指定 (反時計回りに描きます)" + +#: graphicswin.cpp:1306 +msgid "click to place datum point" +msgstr "点の位置をクリックで指定" + +#: graphicswin.cpp:1307 +msgid "click first point of line segment" +msgstr "線分の最初の点をクリックで指定" + +#: graphicswin.cpp:1309 +msgid "click first point of construction line segment" +msgstr "補助線の線分の最初の点をクリックで指定" + +#: graphicswin.cpp:1310 +msgid "click first point of cubic segment" +msgstr "ベジェ曲線の最初の点をクリックで指定" + +#: graphicswin.cpp:1311 +msgid "click center of circle" +msgstr "円の中央をクリックで指定" + +#: graphicswin.cpp:1312 +msgid "click origin of workplane" +msgstr "作業平面の原点をクリックで指定" + +#: graphicswin.cpp:1313 +msgid "click one corner of rectangle" +msgstr "四角形の角のひとつをクリックで指定" + +#: graphicswin.cpp:1314 +msgid "click top left of text" +msgstr "テキストの右上をクリックで指定する" + +#: graphicswin.cpp:1320 +msgid "click top left of image" +msgstr "画像の右上をクリックで指定する" + +#: graphicswin.cpp:1346 +msgid "No entities are selected. Select entities before trying to toggle their construction state." +msgstr "" +"スケッチ要素が選択されていません。拘束と参照を切り替えるには、最初に要素を選択してください。" + +#: group.cpp:86 +msgctxt "group-name" +msgid "sketch-in-3d" +msgstr "" + +#: group.cpp:150 +msgid "" +"Bad selection for new sketch in workplane. This group can be created with:\n" +"\n" +" * a point (through the point, orthogonal to coordinate axes)\n" +" * a point and two line segments (through the point, parallel to the lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" +" * a workplane (copy of the workplane)\n" +msgstr "" +"作業平面にスケッチを作成できませんでした。次のように選択してください。\n" +"\n" +" * 点 (点を通り、座標軸に直交する作業平面を作成します)\n" +" * 点と、2 つの線分 (点を通り、直線に平行する作業平面を作成します)\n" +" * 点と、法線 (点を通り、法線と直交する作業平面を作成します)\n" +" * 作業平面 (あるいは作業平面のコピー)\n" + +#: group.cpp:166 +msgid "" +"Activate a workplane (Sketch -> In Workplane) before extruding. The sketch will be extruded " +"normal to the workplane." +msgstr "" +"押し出しを作成する前に、「スケッチ -> 作業平面上でスケッチする」で作業平面をアクティブにしてくださ" +"い。作業平面の法線方向へ押し出しを作成します。" + +#: group.cpp:175 +msgctxt "group-name" +msgid "extrude" +msgstr "" + +#: group.cpp:180 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "周回操作は作業平面上にあるスケッチにのみ適用できます。" + +#: group.cpp:191 +msgid "" +"Bad selection for new lathe group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel to line / normal, " +"through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"周回を作成できませんでした。次のように選択してください。\n" +"\n" +" * 点と、線分もしくは法線 (点を通る回転軸を仮定し、直線・法線に平行に回転します)\n" +" * 線分 (直線を回転軸とします)\n" + +#: group.cpp:201 +msgctxt "group-name" +msgid "lathe" +msgstr "" + +#: group.cpp:206 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "回転操作は作業平面上にあるスケッチにのみ適用できます。" + +#: group.cpp:217 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel to line / normal, " +"through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"回転を作成できませんでした。次のように選択してください。\n" +"\n" +" * 点と、線分もしくは法線 (点を通る回転軸を仮定し、直線・法線に平行に回転します)\n" +" * 線分 (直線を回転軸とします)\n" + +#: group.cpp:229 +msgctxt "group-name" +msgid "revolve" +msgstr "" + +#: group.cpp:234 +msgid "Helix operation can only be applied to planar sketches." +msgstr "螺旋操作は作業平面上にあるスケッチにのみ適用できます。" + +#: group.cpp:245 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel to line / normal, " +"through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"螺旋を作成できませんでした。次のように選択してください。\n" +"\n" +" * 点と、線分もしくは法線 (点を通る回転軸を仮定し、直線・法線に平行に螺旋を作成します)\n" +" * 線分 (直線を回転軸とします)\n" + +#: group.cpp:257 +msgctxt "group-name" +msgid "helix" +msgstr "" + +#: group.cpp:270 +msgid "" +"Bad selection for new rotation. This group can be created with:\n" +"\n" +" * a point, while locked in workplane (rotate in plane, about that point)\n" +" * a point and a line or a normal (rotate about an axis through the point, and parallel to " +"line / normal)\n" +msgstr "" +"円上にコピーを作成できませんでした。次のように選択してください。\n" +"\n" +" * 作業平面上にある点 (作業平面上で、これを原点として周回します)\n" +" * 点と、直線もしくは法線 (点を通る回転軸を仮定し、直線・法線と平行に周回します)\n" + +#: group.cpp:283 +msgctxt "group-name" +msgid "rotate" +msgstr "" + +#: group.cpp:294 +msgctxt "group-name" +msgid "translate" +msgstr "" + +#: group.cpp:416 +msgid "(unnamed)" +msgstr "(名称未設定)" + +#: groupmesh.cpp:707 +msgid "not closed contour, or not all same style!" +msgstr "閉じた輪郭でない、もしくは、輪郭を構成する要素のスタイルが同一ではありません。" + +#: groupmesh.cpp:720 +msgid "points not all coplanar!" +msgstr "点が同一平面上にありません。" + +#: groupmesh.cpp:722 +msgid "contour is self-intersecting!" +msgstr "輪郭線が自己交差しています。" + +#: groupmesh.cpp:724 +msgid "zero-length edge!" +msgstr "長さが 0 のエッジです。" + +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "テキスト形式のSTLファイルは、いまのところサポートされていません。" + +#: modify.cpp:252 +msgid "Must be sketching in workplane to create tangent arc." +msgstr "正接円弧をスケッチするには、作業平面上でスケッチしてください。" + +#: modify.cpp:299 +msgid "" +"To create a tangent arc, select a point where two non-construction lines or circles in this group " +"and workplane join." +msgstr "" +"正接円弧を作成するには、同じグループかつ同じ作業平面上にある、補助線ではない2つの直線もしくは円が" +"交差している点を選択してください。" + +#: modify.cpp:386 +msgid "" +"Couldn't round this corner. Try a smaller radius, or try creating the desired geometry by hand " +"with tangency constraints." +msgstr "" +"この角をフィレットにできませんでした。もっと小さい半径を指定するか、手作業で拘束してください。" + +#: modify.cpp:595 +msgid "Couldn't split this entity; lines, circles, or cubics only." +msgstr "この要素は分割できません。分割できるのは直線・円・ベジェ曲線のみです。" + +#: modify.cpp:622 +msgid "Must be sketching in workplane to split." +msgstr "分割するには作業平面上でスケッチしてください。" + +#: modify.cpp:629 +msgid "" +"Select two entities that intersect each other (e.g. two lines/circles/arcs or a line/circle/arc " +"and a point)." +msgstr "互いに交差している 2 つの要素を選択してください (直線・円・円弧・点)" + +#: modify.cpp:734 +msgid "Can't split; no intersection found." +msgstr "交差箇所が見つからないため、分割できません。" + +#: mouse.cpp:557 +msgid "Assign to Style" +msgstr "スタイルを割り当て" + +#: mouse.cpp:573 +msgid "No Style" +msgstr "スタイル指定なし" + +#: mouse.cpp:576 +msgid "Newly Created Custom Style..." +msgstr "スタイルを作成して割り当て..." + +#: mouse.cpp:583 +msgid "Group Info" +msgstr "グループ情報" + +#: mouse.cpp:603 +msgid "Style Info" +msgstr "スタイル情報" + +#: mouse.cpp:623 +msgid "Select Edge Chain" +msgstr "接続しているエッジをまとめて選択" + +#: mouse.cpp:629 +msgid "Toggle Reference Dimension" +msgstr "参照寸法と切り替え" + +#: mouse.cpp:635 +msgid "Other Supplementary Angle" +msgstr "補角と切り替え" + +#: mouse.cpp:640 +msgid "Snap to Grid" +msgstr "グリッドに沿わせる" + +#: mouse.cpp:649 +msgid "Remove Spline Point" +msgstr "スプラインの制御点を削除" + +#: mouse.cpp:684 +msgid "Add Spline Point" +msgstr "スプラインの制御点を追加" + +#: mouse.cpp:688 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "スプラインの制御点を追加できませんでした。点の個数の上限に達しています。" + +#: mouse.cpp:713 +msgid "Toggle Construction" +msgstr "補助線との切り替え" + +#: mouse.cpp:729 +msgid "Delete Point-Coincident Constraint" +msgstr "点の一致拘束を削除する" + +#: mouse.cpp:747 +msgid "Cut" +msgstr "切り取り" + +#: mouse.cpp:749 +msgid "Copy" +msgstr "コピー" + +#: mouse.cpp:753 +msgid "Select All" +msgstr "すべてを選択" + +#: mouse.cpp:758 +msgid "Paste" +msgstr "貼り付け" + +#: mouse.cpp:760 +msgid "Paste Transformed..." +msgstr "複製しながら貼り付け..." + +#: mouse.cpp:765 +msgid "Delete" +msgstr "削除" + +#: mouse.cpp:768 +msgid "Unselect All" +msgstr "選択を解除" + +#: mouse.cpp:775 +msgid "Unselect Hovered" +msgstr "カーソルを当てている要素の選択を解除" + +#: mouse.cpp:784 +msgid "Zoom to Fit" +msgstr "選択オブジェクトの最適表示" + +#: mouse.cpp:986 mouse.cpp:1274 +msgid "click next point of line, or press Esc" +msgstr "直線の次の点をクリックで指定、もしくはESCで終了" + +#: mouse.cpp:992 +msgid "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In Workplane." +msgstr "" +"三次元空間内に四角形はスケッチできません。「スケッチ -> 作業平面上でスケッチする」で作業平面をアク" +"ティブにしてください。" + +#: mouse.cpp:1026 +msgid "click to place other corner of rectangle" +msgstr "四角形のもう一つの角をクリックで指定" + +#: mouse.cpp:1047 +msgid "click to set radius" +msgstr "半径をクリックで指定" + +#: mouse.cpp:1052 +msgid "Can't draw arc in 3d; first, activate a workplane with Sketch -> In Workplane." +msgstr "" +"三次元空間内に円弧はスケッチできません。「スケッチ -> 作業平面上でスケッチする」で作業平面をアク" +"ティブにしてください。" + +#: mouse.cpp:1071 +msgid "click to place point" +msgstr "点の位置をクリックで指定" + +#: mouse.cpp:1087 +msgid "click next point of cubic, or press Esc" +msgstr "ベジェ曲線の次の点をクリックで指定、もしくはESCで終了" + +#: mouse.cpp:1092 +msgid "Sketching in a workplane already; sketch in 3d before creating new workplane." +msgstr "" +"すでに作業平面上でのスケッチをしています。新しい作業平面を作成する前に、三次元空間内でスケッチして" +"ください。" + +#: mouse.cpp:1108 +msgid "Can't draw text in 3d; first, activate a workplane with Sketch -> In Workplane." +msgstr "" +"三次元空間内にテキストはスケッチできません。「スケッチ -> 作業平面上でスケッチする」で作業平面をア" +"クティブにしてください。" + +#: mouse.cpp:1125 +msgid "click to place bottom right of text" +msgstr "テキストの左下の位置をクリックで指定" + +#: mouse.cpp:1131 +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:553 +msgctxt "file-type" +msgid "SolveSpace models" +msgstr "SolveSpaceモデル" + +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "(すべてのファイル)" + +#: platform/gui.cpp:91 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "IDF 電子基板" + +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "STL 三角メッシュ" + +#: platform/gui.cpp:96 +msgctxt "file-type" +msgid "PNG image" +msgstr "PNG 画像" + +#: platform/gui.cpp:100 +msgctxt "file-type" +msgid "STL mesh" +msgstr "STL メッシュ" + +#: platform/gui.cpp:101 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" +msgstr "Wavefront OBJ メッシュ" + +#: platform/gui.cpp:102 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" +msgstr "Three.js 互換のメッシュ (ビューワー付)" + +#: platform/gui.cpp:103 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "Three.js 互換のメッシュ (メッシュのみ)" + +#: platform/gui.cpp:104 +msgctxt "file-type" +msgid "VRML text file" +msgstr "VRML テキストファイル" + +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 +msgctxt "file-type" +msgid "STEP file" +msgstr "STEP ファイル" + +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "PDF file" +msgstr "PDF ファイル" + +#: platform/gui.cpp:113 +msgctxt "file-type" +msgid "Encapsulated PostScript" +msgstr "EPS ファイル (Encapsulated PostScript)" + +#: platform/gui.cpp:114 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "SVG ファイル" + +#: platform/gui.cpp:116 platform/gui.cpp:123 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" +msgstr "DXF ファイル (AutoDesk 2007)" + +#: platform/gui.cpp:117 +msgctxt "file-type" +msgid "HPGL file" +msgstr "HPG ファイル" + +#: platform/gui.cpp:118 +msgctxt "file-type" +msgid "G Code" +msgstr "G コード" + +#: platform/gui.cpp:127 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" +msgstr "AudoCAD DXF/DWG ファイル" + +#: platform/gui.cpp:131 +msgctxt "file-type" +msgid "Comma-separated values" +msgstr "CSV ファイル (Comma-separated values)" + +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 +msgid "untitled" +msgstr "名称未設定" + +#: 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:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 +#: platform/guiwin.cpp:1645 +msgctxt "title" +msgid "Open File" +msgstr "ファイルを開く" + +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 +msgctxt "button" +msgid "_Cancel" +msgstr "キャンセル (_C)" + +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 +msgctxt "button" +msgid "_Save" +msgstr "保存 (_S)" + +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 +msgctxt "button" +msgid "_Open" +msgstr "開く (_O)" + +#: solvespace.cpp:171 +msgctxt "title" +msgid "Autosave Available" +msgstr "オートセーブファイルがあります" + +#: solvespace.cpp:172 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "このスケッチにはオートセーブファイルがあります。" + +#: solvespace.cpp:173 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "代わりにオートセーブファイル読み込みますか?" + +#: solvespace.cpp:174 +msgctxt "button" +msgid "&Load autosave" +msgstr "オートセーブファイルを読み込む (&L)" + +#: solvespace.cpp:176 +msgctxt "button" +msgid "Do&n't Load" +msgstr "読み込まない (&n)" + +#: solvespace.cpp:599 +msgctxt "title" +msgid "Modified File" +msgstr "編集済みファイル" + +#: 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:604 +msgctxt "dialog" +msgid "Do you want to save the changes you made to the new sketch?" +msgstr "新規スケッチへの変更を保存しますか?" + +#: solvespace.cpp:607 +msgctxt "dialog" +msgid "Your changes will be lost if you don't save them." +msgstr "保存しなければ変更は失われます。" + +#: solvespace.cpp:608 +msgctxt "button" +msgid "&Save" +msgstr "保存する (&S)" + +#: solvespace.cpp:610 +msgctxt "button" +msgid "Do&n't Save" +msgstr "保存しない (&n)" + +#: solvespace.cpp:631 +msgctxt "title" +msgid "(new sketch)" +msgstr "(新規スケッチ)" + +#: solvespace.cpp:638 +msgctxt "title" +msgid "Property Browser" +msgstr "プロパティブラウザ" + +#: 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:772 +#, c-format +msgid "Can't identify file type from file extension of filename '%s'; try .dxf or .dwg." +msgstr "" +"拡張子からファイル形式を特定できませんでした ( '%s' )。 \".dxf\" や \".dwg\" を試してください。" + +#: solvespace.cpp:824 +msgid "Constraint must have a label, and must not be a reference dimension." +msgstr "参照寸法ではなく、かつ、値のある拘束を選択してください。" + +#: solvespace.cpp:828 +msgid "Bad selection for step dimension; select a constraint." +msgstr "寸法の段階的変更には無効な選択です。値のある拘束を選択してください。" + +#: solvespace.cpp:852 +msgid "The assembly does not interfere, good." +msgstr "部品の干渉はありませんでした。" + +#: solvespace.cpp:868 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" +"ソリッドモデルの容積:\n" +"\n" +" %s" + +#: solvespace.cpp:877 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" +"\n" +"現在のグループのメッシュの容積:\n" +"\n" +" %s" + +#: solvespace.cpp:882 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" +"\n" +"\n" +"曲面はトライアングルに近似します。\n" +"これにより通常、約 1% の誤差が発生します。" + +#: solvespace.cpp:897 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"選択した面のファーフェスの面積:\n" +"\n" +" %s\n" +"\n" +"曲線は区分線形に近似します。\n" +"これにより通常、約 1%% の誤差が発生します。" + +#: 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:918 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"このグループ内のスケッチされた領域の面積:\n" +"\n" +" %s\n" +"\n" +"曲線は区分線形に近似します。\n" +"これにより通常、約 1%% の誤差が発生します。" + +#: solvespace.cpp:938 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"選択された要素の合計の長さ:\n" +"\n" +" %s\n" +"\n" +"曲線は区分線形に近似します。\n" +"これにより通常、約 1%% の誤差が発生します。" + +#: solvespace.cpp:944 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "外周長の計測には無効な選択です。線分、円弧、もしくは曲線を選択してください。" + +#: solvespace.cpp:960 +msgid "Bad selection for trace; select a single point." +msgstr "点の位置の記録には無効な選択です。ひとつの点を選択してください。" + +#: solvespace.cpp:987 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "'%s' へ書き込めませんでした。" + +#: solvespace.cpp:1017 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "メッシュが自身と交差しています (警告)" + +#: solvespace.cpp:1018 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "メッシュは自己交差していません (適切)" + +#: solvespace.cpp:1020 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "メッシュには浮いたエッジが含まれています (警告)" + +#: solvespace.cpp:1021 +msgid "The mesh is watertight (okay, valid)." +msgstr "メッシュには隙間はありません (適切)" + +#: solvespace.cpp:1024 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" +"\n" +"\n" +"モデルには %d 個のトライアングルがあり、これが %d 個のサーフェスを構成します。" + +#: solvespace.cpp:1028 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"問題のあるエッジは見つかりませんでした。%s" + +#: solvespace.cpp:1031 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d 個の問題のあるエッジが見つかりました。%s" + +#: solvespace.cpp:1044 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" + +#: style.cpp:185 +msgid "" +"Can't assign style to an entity that's derived from another entity; try assigning a style to this " +"entity's parent." +msgstr "" +"他の要素から派生した要素には個別のスタイルを割り当てることはできません。親要素にスタイルを割り当て" +"てください。" + +#: style.cpp:735 +msgid "Style name cannot be empty" +msgstr "スタイル名は空にできません" + +#: textscreens.cpp:791 +msgid "Can't repeat fewer than 1 time." +msgstr "繰り返しは 1 以上の回数を指定してください。" + +#: textscreens.cpp:795 +msgid "Can't repeat more than 999 times." +msgstr "999回を超えて繰り返すことはできません。" + +#: textscreens.cpp:820 +msgid "Group name cannot be empty" +msgstr "グループ名は空にできません" + +#: textscreens.cpp:872 +msgid "Opacity must be between zero and one." +msgstr "透明度は0から1の間で指定してください。" + +#: textscreens.cpp:907 +msgid "Radius cannot be zero or negative." +msgstr "半径は0もしくは負の値にできません。" + +#: toolbar.cpp:18 +msgid "Sketch line segment" +msgstr "線分をスケッチ" + +#: toolbar.cpp:20 +msgid "Sketch rectangle" +msgstr "四角形をスケッチ" + +#: toolbar.cpp:22 +msgid "Sketch circle" +msgstr "円をスケッチ" + +#: toolbar.cpp:24 +msgid "Sketch arc of a circle" +msgstr "円弧をスケッチ" + +#: toolbar.cpp:26 +msgid "Sketch curves from text in a TrueType font" +msgstr "TrueTypeフォントのテキストからアウトラインをスケッチ" + +#: toolbar.cpp:28 +msgid "Sketch image from a file" +msgstr "ファイルから画像を取り込む" + +#: toolbar.cpp:30 +msgid "Create tangent arc at selected point" +msgstr "選択された点でフィレットを作る" + +#: toolbar.cpp:32 +msgid "Sketch cubic Bezier spline" +msgstr "ベジェ曲線をスケッチ" + +#: toolbar.cpp:34 +msgid "Sketch datum point" +msgstr "点をスケッチ" + +#: toolbar.cpp:36 +msgid "Toggle construction" +msgstr "補助線と切り替え" + +#: toolbar.cpp:38 +msgid "Split lines / curves where they intersect" +msgstr "直線・曲線を交差箇所で分割" + +#: toolbar.cpp:42 +msgid "Constrain distance / diameter / length" +msgstr "距離・直径・長さを拘束" + +#: toolbar.cpp:44 +msgid "Constrain angle" +msgstr "角度を拘束" + +#: toolbar.cpp:46 +msgid "Constrain to be horizontal" +msgstr "水平に拘束" + +#: toolbar.cpp:48 +msgid "Constrain to be vertical" +msgstr "垂直に拘束" + +#: toolbar.cpp:50 +msgid "Constrain to be parallel or tangent" +msgstr "平行もしくは正接で拘束" + +#: toolbar.cpp:52 +msgid "Constrain to be perpendicular" +msgstr "垂線で拘束" + +#: toolbar.cpp:54 +msgid "Constrain point on line / curve / plane / point" +msgstr "点を線・曲線・面・点の上に拘束" + +#: toolbar.cpp:56 +msgid "Constrain symmetric" +msgstr "対称に拘束" + +#: toolbar.cpp:58 +msgid "Constrain equal length / radius / angle" +msgstr "長さ・半径・角度を等値に拘束" + +#: toolbar.cpp:60 +msgid "Constrain normals in same orientation" +msgstr "法線を同じ方向に拘束" + +#: toolbar.cpp:62 +msgid "Other supplementary angle" +msgstr "角度の拘束を補角へ移動" + +#: toolbar.cpp:64 +msgid "Toggle reference dimension" +msgstr "拘束と参照寸法を切り替え" + +#: toolbar.cpp:68 +msgid "New group extruding active sketch" +msgstr "押し出しを作成" + +#: toolbar.cpp:70 +msgid "New group rotating active sketch" +msgstr "周回を作成" + +#: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "螺旋を作成" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "回転を作成" + +#: toolbar.cpp:76 +msgid "New group step and repeat rotating" +msgstr "円上にコピーを作成" + +#: toolbar.cpp:78 +msgid "New group step and repeat translating" +msgstr "直線上にコピーを作成" + +#: toolbar.cpp:80 +msgid "New group in new workplane (thru given entities)" +msgstr "選択した要素で定義される作業平面でスケッチを開始" + +#: toolbar.cpp:82 +msgid "New group in 3d" +msgstr "三次元空間内でスケッチを開始" + +#: toolbar.cpp:84 +msgid "New group linking / assembling file" +msgstr "他のファイルをリンクする" + +#: toolbar.cpp:88 +msgid "Nearest isometric view" +msgstr "近傍の等角図視点" + +#: toolbar.cpp:90 +msgid "Align view to active workplane" +msgstr "アクティブな作業平面に視点を合わせる" + +#: util.cpp:165 +msgctxt "title" +msgid "Error" +msgstr "エラー" + +#: util.cpp:165 +msgctxt "title" +msgid "Message" +msgstr "メッセージ" + +#: util.cpp:170 +msgctxt "button" +msgid "&OK" +msgstr "OK (&O)" + +#: view.cpp:127 +msgid "Scale cannot be zero or negative." +msgstr "縮尺は 0 や負の値にはできません。" + +#: view.cpp:139 view.cpp:148 +msgid "Bad format: specify x, y, z" +msgstr "書式が誤っています。\"x, y, z\" で指定してください。" From 422c671bf2b3d0849ecaeea82759c19e373575cb Mon Sep 17 00:00:00 2001 From: strzinek Date: Fri, 24 Jun 2022 15:24:15 +0200 Subject: [PATCH 423/646] czech translations --- res/CMakeLists.txt | 1 + res/locales.txt | 1 + res/locales/cs_CZ.po | 2281 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 2283 insertions(+) create mode 100644 res/locales/cs_CZ.po diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index a75990034..5ad3cf01b 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -262,6 +262,7 @@ add_resources( icons/text-window/shaded.png icons/text-window/workplane.png locales.txt + locales/cs_CZ.po locales/de_DE.po locales/en_US.po locales/fr_FR.po diff --git a/res/locales.txt b/res/locales.txt index bcbb4a792..377d65754 100644 --- a/res/locales.txt +++ b/res/locales.txt @@ -1,5 +1,6 @@ # This file lists the ISO locale codes (ISO 639-1/ISO 3166-1), Windows LCIDs, # and human-readable names for every culture supported by SolveSpace. +cs-CZ,1029,Česky de-DE,0407,Deutsch en-US,0409,English (US) fr-FR,040C,Français diff --git a/res/locales/cs_CZ.po b/res/locales/cs_CZ.po new file mode 100644 index 000000000..fdab48fc2 --- /dev/null +++ b/res/locales/cs_CZ.po @@ -0,0 +1,2281 @@ +# Czech translations for SolveSpace package. +# Copyright (C) 2022 the SolveSpace authors +# This file is distributed under the same license as the SolveSpace package. +# Pavel Stržínek , 2022 +# +msgid "" +msgstr "" +"Project-Id-Version: SolveSpace 3.1\n" +"Report-Msgid-Bugs-To: phkahler@gmail.com\n" +"POT-Creation-Date: 2022-06-19 20:16+0200\n" +"PO-Revision-Date: 2022-06-19 20:16+0200\n" +"Last-Translator: Pavel Stržínek \n" +"Language-Team: none\n" +"Language: cs_CZ\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: clipboard.cpp:309 +msgid "" +"Cut, paste, and copy work only in a workplane.\n" +"\n" +"Activate one with Sketch -> In Workplane." +msgstr "" +"Kopírování, vkládání a vyjímání je funkční jen v pracovní rovině.\n" +"\n" +"Aktivuj ji přes Náčrt -> V pracovní rovině." + +#: clipboard.cpp:326 +msgid "Clipboard is empty; nothing to paste." +msgstr "Schránka je prázdná; nic ke vložení." + +#: clipboard.cpp:373 +msgid "Number of copies to paste must be at least one." +msgstr "Je třeba zadat alespoň jednu kopii ke vložení." + +#: clipboard.cpp:389 textscreens.cpp:833 +msgid "Scale cannot be zero." +msgstr "Měřítko nemůže být nulové." + +#: clipboard.cpp:431 +msgid "Select one point to define origin of rotation." +msgstr "Vyber jeden bod pro určení počátku otočení." + +#: clipboard.cpp:443 +msgid "Select two points to define translation vector." +msgstr "Vyber dva body pro určení vektoru posunutí." + +#: clipboard.cpp:453 +msgid "" +"Transformation is identity. So all copies will be exactly on top of each " +"other." +msgstr "" +"Transformace je identická. Všechny kopie budou přesně " +"nad sebou." + +#: clipboard.cpp:457 +msgid "Too many items to paste; split this into smaller pastes." +msgstr "Příliš mnoho položek ke vložení; rozděl je a vlož po částech." + +#: clipboard.cpp:462 +msgid "No workplane active." +msgstr "Není aktivní žádná pracovní rovina." + +#: confscreen.cpp:381 +msgid "Bad format: specify coordinates as x, y, z" +msgstr "Chybný formát: zadej souřadnice jako x, y, z" + +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 +msgid "Bad format: specify color as r, g, b" +msgstr "Chybný formát: zadej barvu jako r, g, b" + +#: confscreen.cpp:417 +msgid "" +"The perspective factor will have no effect until you enable View -> Use " +"Perspective Projection." +msgstr "" +"Faktor perspektivy nebude mít žádný vliv, dokud nezvolíš Pohled -> Použít perspektivní projekci." + +#: confscreen.cpp:435 confscreen.cpp:445 +#, c-format +msgid "Specify between 0 and %d digits after the decimal." +msgstr "Urči počet platných číslic za desetinnou čárkou mezi 0 a %d." + +#: confscreen.cpp:457 +msgid "Export scale must not be zero!" +msgstr "Měřítko exportu nesmí být nulové!" + +#: confscreen.cpp:469 +msgid "Cutter radius offset must not be negative!" +msgstr "Posunutí poloměru výřezu nesmí být záporné!" + +#: confscreen.cpp:528 +msgid "Bad value: autosave interval should be positive" +msgstr "Chybná hodnota: interval automatického ukládání by měl být kladný" + +#: confscreen.cpp:531 +msgid "Bad format: specify interval in integral minutes" +msgstr "Chybný formát: zadej interval v celých minutách" + +#: constraint.cpp:12 +msgctxt "constr-name" +msgid "pts-coincident" +msgstr "shoda-bodů" + +#: constraint.cpp:13 +msgctxt "constr-name" +msgid "pt-pt-distance" +msgstr "vzdálenost-dvou-bodů" + +#: constraint.cpp:14 +msgctxt "constr-name" +msgid "pt-line-distance" +msgstr "vzdálenost-bodu-a-úsečky" + +#: constraint.cpp:15 +msgctxt "constr-name" +msgid "pt-plane-distance" +msgstr "vzdálenost-bodu-a-roviny" + +#: constraint.cpp:16 +msgctxt "constr-name" +msgid "pt-face-distance" +msgstr "vzdálenost-bodu-a-stěny" + +#: constraint.cpp:17 +msgctxt "constr-name" +msgid "proj-pt-pt-distance" +msgstr "proj-vzdálenost-dvou-bodů" + +#: constraint.cpp:18 +msgctxt "constr-name" +msgid "pt-in-plane" +msgstr "bod-v-rovině" + +#: constraint.cpp:19 +msgctxt "constr-name" +msgid "pt-on-line" +msgstr "bod-na-přímce" + +#: constraint.cpp:20 +msgctxt "constr-name" +msgid "pt-on-face" +msgstr "bod-na-stěně" + +#: constraint.cpp:21 +msgctxt "constr-name" +msgid "eq-length" +msgstr "shodná-délka" + +#: constraint.cpp:22 +msgctxt "constr-name" +msgid "eq-length-and-pt-ln-dist" +msgstr "shodná-délka-a-vzdálenost-bodu-a-úsečky" + +#: constraint.cpp:23 +msgctxt "constr-name" +msgid "eq-pt-line-distances" +msgstr "shodná-vzdálenost-bodu-a-úsečky" + +#: constraint.cpp:24 +msgctxt "constr-name" +msgid "length-ratio" +msgstr "poměr-délky" + +#: constraint.cpp:25 +msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "poměr-délky-dvou-oblouků" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "poměr-délky-oblouku-a-úsečky" + +#: constraint.cpp:27 +msgctxt "constr-name" +msgid "length-difference" +msgstr "rozdíl-délky" + +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "rozdíl-délky-dvou-oblouků" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "rozdíl-délky-oblouku-a-úsečky" + +#: constraint.cpp:30 +msgctxt "constr-name" +msgid "symmetric" +msgstr "symetrie" + +#: constraint.cpp:31 +msgctxt "constr-name" +msgid "symmetric-h" +msgstr "symetrie-h" + +#: constraint.cpp:32 +msgctxt "constr-name" +msgid "symmetric-v" +msgstr "symetrie-v" + +#: constraint.cpp:33 +msgctxt "constr-name" +msgid "symmetric-line" +msgstr "symetrie-přímka" + +#: constraint.cpp:34 +msgctxt "constr-name" +msgid "at-midpoint" +msgstr "ve-středu" + +#: constraint.cpp:35 +msgctxt "constr-name" +msgid "horizontal" +msgstr "horizontála" + +#: constraint.cpp:36 +msgctxt "constr-name" +msgid "vertical" +msgstr "vertikála" + +#: constraint.cpp:37 +msgctxt "constr-name" +msgid "diameter" +msgstr "průměr" + +#: constraint.cpp:38 +msgctxt "constr-name" +msgid "pt-on-circle" +msgstr "bod-na-kruhu" + +#: constraint.cpp:39 +msgctxt "constr-name" +msgid "same-orientation" +msgstr "shodná-orientace" + +#: constraint.cpp:40 +msgctxt "constr-name" +msgid "angle" +msgstr "úhel" + +#: constraint.cpp:41 +msgctxt "constr-name" +msgid "parallel" +msgstr "rovnoběžnost" + +#: constraint.cpp:42 +msgctxt "constr-name" +msgid "arc-line-tangent" +msgstr "tečný-oblouk-a-úsečka" + +#: constraint.cpp:43 +msgctxt "constr-name" +msgid "cubic-line-tangent" +msgstr "tečná-splajna-a-úsečka" + +#: constraint.cpp:44 +msgctxt "constr-name" +msgid "curve-curve-tangent" +msgstr "tečné-dvě-křivky" + +#: constraint.cpp:45 +msgctxt "constr-name" +msgid "perpendicular" +msgstr "kolmost" + +#: constraint.cpp:46 +msgctxt "constr-name" +msgid "eq-radius" +msgstr "shodný-poloměr" + +#: constraint.cpp:47 +msgctxt "constr-name" +msgid "eq-angle" +msgstr "shodný-úhel" + +#: constraint.cpp:48 +msgctxt "constr-name" +msgid "eq-line-len-arc-len" +msgstr "shodná-délka-úsečky-a-oblouku" + +#: constraint.cpp:49 +msgctxt "constr-name" +msgid "lock-where-dragged" +msgstr "zámek-kam-přetažen" + +#: constraint.cpp:50 +msgctxt "constr-name" +msgid "comment" +msgstr "komentář" + +#: constraint.cpp:144 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "" +"Oblouk a tečná úsečka musejí mít společný koncový bod. Omez je nejdříve příkazem " +"Omezit -> Na bodě / křivce / ploše." + +#: constraint.cpp:163 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." +msgstr "" +"Tečný splajn a úsečka musejí mít společný koncový bod. Omez je nejdříve příkazem " +"Omezit -> Na bodě / křivce / ploše." + +#: constraint.cpp:189 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." +msgstr "" +"Křivky musejí mít společný koncový bod. Omez je příkazem Omezit -> V bodě " +"před omezením tečny." + +#: constraint.cpp:238 +msgid "" +"Bad selection for distance / diameter constraint. This constraint can apply " +"to:\n" +"\n" +" * two points (distance between points)\n" +" * a line segment (length)\n" +" * two points and a line segment or normal (projected distance)\n" +" * a workplane and a point (minimum distance)\n" +" * a line segment and a point (minimum distance)\n" +" * a plane face and a point (minimum distance)\n" +" * a circle or an arc (diameter)\n" +msgstr "" +"Chybný výběr pro omezení vzdálenosti / průměru. Toto omezení lze použít " +"na:\n" +"\n" +" * dva body (vzdálenost mezi body)\n" +" * úsečku (délka)\n" +" * dva body a úsečku nebo normálu (promítnutá vzdálenost)\n" +" * pracovní rovinu a bod (minimální vzdálenost)\n" +" * úsečku a bod (minimální vzdálenost)\n" +" * rovinnou plochu a bod (minimální vzdálenost)\n" +" * kružnici nebo oblouk (průměr)\n" + +#: constraint.cpp:291 +msgid "" +"Bad selection for on point / curve / plane constraint. This constraint can " +"apply to:\n" +"\n" +" * two points (points coincident)\n" +" * a point and a workplane (point in plane)\n" +" * a point and a line segment (point on line)\n" +" * a point and a circle or arc (point on curve)\n" +" * a point and a plane face (point on face)\n" +msgstr "" +"Chybný výběr pro omezení na bod / křivku / rovinu. Toto omezení lze " +"použít na:\n" +"\n" +" * dva body (body se shodují)\n" +" * bod a pracovní rovinu (bod v rovině)\n" +" * bod a úsečku (bod na přímce)\n" +" * bod a kružnici nebo oblouk (bod na křivce)\n" +" * bod a rovinnou plochu (bod na ploše)\n" + +#: constraint.cpp:353 +msgid "" +"Bad selection for equal length / radius constraint. This constraint can " +"apply to:\n" +"\n" +" * two line segments (equal length)\n" +" * two line segments and two points (equal point-line distances)\n" +" * a line segment and two points (equal point-line distances)\n" +" * a line segment, and a point and line segment (point-line distance " +"equals length)\n" +" * four line segments or normals (equal angle between A,B and C,D)\n" +" * three line segments or normals (equal angle between A,B and B,C)\n" +" * two circles or arcs (equal radius)\n" +" * a line segment and an arc (line segment length equals arc length)\n" +msgstr "" +"Chybný výběr pro omezení stejné délky / poloměru. Toto omezení lze " +"použít pro:\n" +"\n" +" * dvě úsečky (stejné délky)\n" +" * dvě úsečky a dva body (stejné vzdálenosti bodů od úseček)\n" +" * úsečku a dva body (stejné vzdálenosti bodů od přímky)\n" +" * úsečku a bod a úsečku (vzdálenost bodu od přímky " +"se rovná délce)\n" +" * čtyři úsečky nebo normály (stejný úhel mezi A,B a C,D)\n" +" * tři úsečky nebo normály (stejný úhel mezi A,B a B,C)\n" +" * dvě kružnice nebo oblouky (stejný poloměr)\n" +" * úsečku a oblouk (délka úsečky se rovná délce oblouku)\n" + +#: constraint.cpp:407 +msgid "" +"Bad selection for length ratio constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" +msgstr "" +"Chybný výběr pro omezení poměru délky. Toto omezení lze použít pro:\n" +"\n" +" * dvě úsečky\n" +" * dva oblouky\n" +" * jeden oblouk a jednu úsečku\n" + +#: constraint.cpp:441 +msgid "" +"Bad selection for length difference constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" +msgstr "" +"Chybný výběr pro omezení rozdílu délek. Toto omezení lze použít " +"pro:\n" +"\n" +" * dvě úsečky\n" +" * dva oblouky\n" +" * jeden oblouk a jednu úsečku\n" + +#: constraint.cpp:472 +msgid "" +"Bad selection for at midpoint constraint. This constraint can apply to:\n" +"\n" +" * a line segment and a point (point at midpoint)\n" +" * a line segment and a workplane (line's midpoint on plane)\n" +msgstr "" +"Chybný výběr pro omezení ve středovém bodě. Toto omezení lze použít pro: \n" +"\n" +" * úsečku a bod (bod ve středovém bodě)\n" +" * úsečku a pracovní rovinu (střed úsečky v rovině)\n" + +#: constraint.cpp:530 +msgid "" +"Bad selection for symmetric constraint. This constraint can apply to:\n" +"\n" +" * two points or a line segment (symmetric about workplane's coordinate " +"axis)\n" +" * line segment, and two points or a line segment (symmetric about line " +"segment)\n" +" * workplane, and two points or a line segment (symmetric about " +"workplane)\n" +msgstr "" +"Chybný výběr pro symetrické omezení. Toto omezení lze použít pro:\n" +"\n" +" * dva body nebo úsečku (symetrickou vůči souřadnicím osy pracovní roviny) " +" * úsečku a dva body nebo úsečku (symetrická k úsečce)\n" +" * pracovní rovinu a dva body nebo úsečku (symetrická k " +"pracovní rovině)\n" + +#: constraint.cpp:545 +msgid "" +"A workplane must be active when constraining symmetric without an explicit " +"symmetry plane." +msgstr "" +"Pracovní rovina musí být aktivní, pokud je omezena symetricky bez explicitní " +"symetrické roviny." + +#: constraint.cpp:579 +msgid "" +"Activate a workplane (with Sketch -> In Workplane) before applying a " +"horizontal or vertical constraint." +msgstr "" +"Aktivuj pracovní rovinu (pomocí Náčrt -> V pracovní rovině) před použitím " +"omezení horizontály nebo vertikály." + +#: constraint.cpp:592 +msgid "" +"Bad selection for horizontal / vertical constraint. This constraint can " +"apply to:\n" +"\n" +" * two points\n" +" * a line segment\n" +msgstr "" +"Chybný výběr pro horizontální / vertikální omezení. Toto omezení lze " +"použít pro:\n" +"\n" +" * dva body\n" +" * úsečku\n" + +#: constraint.cpp:613 +msgid "" +"Bad selection for same orientation constraint. This constraint can apply " +"to:\n" +"\n" +" * two normals\n" +msgstr "" +"Chybný výběr pro omezení stejné orientace. Toto omezení lze použít " +" pro: \n " +"\n" +" * dvě normály\n" + +#: constraint.cpp:663 +msgid "Must select an angle constraint." +msgstr "Je nutné vybrat omezení úhlu." + +#: constraint.cpp:676 +msgid "Must select a constraint with associated label." +msgstr "Je nutné vybrat omezení s přiřazeným štítkem." + +#: constraint.cpp:687 +msgid "" +"Bad selection for angle constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"Chybný výběr pro omezení úhlu. Toto omezení lze použít pro: \n" +"\n" +" * dvě úsečky\n" +" * úsečku a normálu\n" +" * dvě normály\n" + +#: constraint.cpp:754 +msgid "Curve-curve tangency must apply in workplane." +msgstr "Tečnost dvou křivek musí být použita v pracovní rovině." + +#: constraint.cpp:766 +msgid "" +"Bad selection for parallel / tangent constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments (parallel)\n" +" * a line segment and a normal (parallel)\n" +" * two normals (parallel)\n" +" * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" +msgstr "" +"Chybný výběr pro rovnoběžné / tečné omezení. Toto omezení lze použít " +" pro: \n " +"\n" +" * dvě úsečky (rovnoběžné)\n" +" * úsečku a normálu (rovnoběžnou)\n" +" * dvě normály (rovnoběžné)\n" +" * dvě úsečky, oblouky nebo beziéry, které mají společný koncový bod (tečna)\n" + +#: constraint.cpp:784 +msgid "" +"Bad selection for perpendicular constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"Chybný výběr pro omezení kolmosti. Toto omezení lze použít pro: \n" +"\n" +" * dvě úsečky\n" +" * úsečku a normálu\n" +" * dvě normály\n" + +#: constraint.cpp:799 +msgid "" +"Bad selection for lock point where dragged constraint. This constraint can " +"apply to:\n" +"\n" +" * a point\n" +msgstr "" +"Chybný výběr pro omezení uzamčení v místě přetažení. Toto omezení lze " +"použít pro: \n" +"\n" +" * bod\n" + +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "NOVÝ KOMENTÁŘ -- UPRAVIT DVOJKLIKEM" + +#: constraint.cpp:818 +msgid "click center of comment text" +msgstr "klikni na střed textu komentáře" + +#: export.cpp:19 +msgid "" +"No solid model present; draw one with extrudes and revolves, or use Export " +"2d View to export bare lines and curves." +msgstr "" +"Není přítomen žádný model tělesa; vytvoř model pomocí extruzí a rotací nebo " +"použij Exportovat 2D pohled... pro export prostých čar a křivek." + +#: export.cpp:61 +msgid "" +"Bad selection for export section. Please select:\n" +"\n" +" * nothing, with an active workplane (workplane is section plane)\n" +" * a face (section plane through face)\n" +" * a point and two line segments (plane through point and parallel to " +"lines)\n" +msgstr "" +"Chybný výběr části pro export. Vyber prosím:\n" +"\n" +" * nic, s aktivní pracovní rovinou (pracovní rovina je rovina řezu)\n" +" * plochu (rovina řezu procházející plochou)\n" +" * bod a dvě úsečky (rovina procházející bodem a rovnoběžná s " +" přímkami)\n" + +#: export.cpp:818 +msgid "Active group mesh is empty; nothing to export." +msgstr "Síť aktivní skupiny je prázdná; není co exportovat." + +#: exportvector.cpp:336 +msgid "freehand lines were replaced with continuous lines" +msgstr "volné úsečky byly nahrazeny souvislými" + +#: exportvector.cpp:338 +msgid "zigzag lines were replaced with continuous lines" +msgstr "klikaté úsečky byly nahrazeny souvislými" + +#: exportvector.cpp:592 +msgid "" +"Some aspects of the drawing have no DXF equivalent and were not exported:\n" +msgstr "" +"Některé prvky výkresu nemají ekvivalent ve formátu DXF a nebyly exportovány:\n" + +#: exportvector.cpp:838 +msgid "" +"PDF page size exceeds 200 by 200 inches; many viewers may reject this file." +msgstr "" +"Velikost stránky PDF přesahuje 200 x 200 palců; mnoho prohlížečů může tento " +"soubor odmítnout." + +#: file.cpp:44 group.cpp:91 +msgctxt "group-name" +msgid "sketch-in-plane" +msgstr "náčrt-v-rovině" + +#: file.cpp:62 +msgctxt "group-name" +msgid "#references" +msgstr "#odkazy" + +#: file.cpp:550 +msgid "The file is empty. It may be corrupt." +msgstr "Soubor je prázdný. Může být poškozený." + +#: file.cpp:555 +msgid "" +"Unrecognized data in file. This file may be corrupt, or from a newer version " +"of the program." +msgstr "" +"Nerozpoznaná data v souboru. Tento soubor může být poškozený nebo pochází z novější verze " +"programu." + +#: file.cpp:867 +msgctxt "title" +msgid "Missing File" +msgstr "Chybějící soubor" + +#: file.cpp:868 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "Odkazovaný soubor “%s” není k dispozici." + +#: file.cpp:870 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." +msgstr "" +"Chceš jej vyhledat ručně?\n" +"\n" +"Pokud odmítneš, všechny geometrie, které závisí na chybějícím souboru, budou " +"trvale odstraněny." + +#: file.cpp:873 +msgctxt "button" +msgid "&Yes" +msgstr "&Ano" + +#: file.cpp:875 +msgctxt "button" +msgid "&No" +msgstr "&Ne" + +#: file.cpp:877 solvespace.cpp:611 +msgctxt "button" +msgid "&Cancel" +msgstr "&Zrušit" + +#: graphicswin.cpp:41 +msgid "&File" +msgstr "&Soubor" + +#: graphicswin.cpp:42 +msgid "&New" +msgstr "&Nový" + +#: graphicswin.cpp:43 +msgid "&Open..." +msgstr "&Otevřít..." + +#: graphicswin.cpp:44 +msgid "Open &Recent" +msgstr "Otevřít &nedávný" + +#: graphicswin.cpp:45 +msgid "&Save" +msgstr "&Uložit" + +#: graphicswin.cpp:46 +msgid "Save &As..." +msgstr "Uložit &jako..." + +#: graphicswin.cpp:48 +msgid "Export &Image..." +msgstr "Exportovat &Obrázek..." + +#: graphicswin.cpp:49 +msgid "Export 2d &View..." +msgstr "Exportovat 2D &pohled..." + +#: graphicswin.cpp:50 +msgid "Export 2d &Section..." +msgstr "Exportovat 2D čá&st..." + +#: graphicswin.cpp:51 +msgid "Export 3d &Wireframe..." +msgstr "Exportovat 3D &drátěný model..." + +#: graphicswin.cpp:52 +msgid "Export Triangle &Mesh..." +msgstr "Exportovat &trojúhelníkovou síť (mesh)..." + +#: graphicswin.cpp:53 +msgid "Export &Surfaces..." +msgstr "Exportovat &povrchy..." + +#: graphicswin.cpp:54 +msgid "Im&port..." +msgstr "&Importovat..." + +#: graphicswin.cpp:57 +msgid "E&xit" +msgstr "U&končit" + +#: graphicswin.cpp:60 +msgid "&Edit" +msgstr "Up&ravit" + +#: graphicswin.cpp:61 +msgid "&Undo" +msgstr "&Zpět" + +#: graphicswin.cpp:62 +msgid "&Redo" +msgstr "Z&novu" + +#: graphicswin.cpp:63 +msgid "Re&generate All" +msgstr "Znovu vše &generovat" + +#: graphicswin.cpp:65 +msgid "Snap Selection to &Grid" +msgstr "Přichytit výběr k &mřížce" + +#: graphicswin.cpp:66 +msgid "Rotate Imported &90°" +msgstr "Otočit importované o &90°" + +#: graphicswin.cpp:68 +msgid "Cu&t" +msgstr "Vyjmou&t" + +#: graphicswin.cpp:69 +msgid "&Copy" +msgstr "&Kopírovat" + +#: graphicswin.cpp:70 +msgid "&Paste" +msgstr "V&ložit" + +#: graphicswin.cpp:71 +msgid "Paste &Transformed..." +msgstr "Vložit &transformované..." + +#: graphicswin.cpp:72 +msgid "&Delete" +msgstr "O&dstranit" + +#: graphicswin.cpp:74 +msgid "Select &Edge Chain" +msgstr "Vybrat ř&etězec hran" + +#: graphicswin.cpp:75 +msgid "Select &All" +msgstr "Vybr&at vše" + +#: graphicswin.cpp:76 +msgid "&Unselect All" +msgstr "Zr&ušit výběr všeho" + +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "Sty&ly čar..." + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "&Projekční pohled..." + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "Nastave&ní..." + +#: graphicswin.cpp:84 +msgid "&View" +msgstr "&Zobrazení" + +#: graphicswin.cpp:85 +msgid "Zoom &In" +msgstr "Přiblíž&it" + +#: graphicswin.cpp:86 +msgid "Zoom &Out" +msgstr "&Oddálit" + +#: graphicswin.cpp:87 +msgid "Zoom To &Fit" +msgstr "Přiblížit na &míru" + +#: graphicswin.cpp:89 +msgid "Align View to &Workplane" +msgstr "Zarovnat pohled na pracovní rovinu" + +#: graphicswin.cpp:90 +msgid "Nearest &Ortho View" +msgstr "Nejbližší &ortogonální pohled" + +#: graphicswin.cpp:91 +msgid "Nearest &Isometric View" +msgstr "Nejbližší &izometrický pohled" + +#: graphicswin.cpp:92 +msgid "&Center View At Point" +msgstr "&Pohled na střed v bodě" + +#: graphicswin.cpp:94 +msgid "Show Snap &Grid" +msgstr "Zobrazit mřížku přichy&cení" + +#: graphicswin.cpp:95 +msgid "Darken Inactive Solids" +msgstr "Ztmavit neaktivní tělesa" + +#: graphicswin.cpp:96 +msgid "Use &Perspective Projection" +msgstr "Použít &perspektivní projekci" + +#: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "Zobrazit &rozbalený pohled" + +#: graphicswin.cpp:98 +msgid "Dimension &Units" +msgstr "&Jednotky rozměru" + +#: graphicswin.cpp:99 +msgid "Dimensions in &Millimeters" +msgstr "Rozměry v &milimetrech" + +#: graphicswin.cpp:100 +msgid "Dimensions in M&eters" +msgstr "Rozměry v m&etrech" + +#: graphicswin.cpp:101 +msgid "Dimensions in &Inches" +msgstr "Rozměry v &palcích" + +#: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "Rozměry ve &stopách a palcích" + +#: graphicswin.cpp:104 +msgid "Show &Toolbar" +msgstr "Zobrazit panel &nástrojů" + +#: graphicswin.cpp:105 +msgid "Show Property Bro&wser" +msgstr "Zobrazit ¶metry" + +#: graphicswin.cpp:107 +msgid "&Full Screen" +msgstr "Na &celou obrazovku" + +#: graphicswin.cpp:109 +msgid "&New Group" +msgstr "&Nová skupina" + +#: graphicswin.cpp:110 +msgid "Sketch In &3d" +msgstr "Náčrt ve &3D" + +#: graphicswin.cpp:111 +msgid "Sketch In New &Workplane" +msgstr "Náčrt v nové pracovní &rovině" + +#: graphicswin.cpp:113 +msgid "Step &Translating" +msgstr "Krokový &posun" + +#: graphicswin.cpp:114 +msgid "Step &Rotating" +msgstr "Krokové &otočení" + +#: graphicswin.cpp:116 +msgid "E&xtrude" +msgstr "Extruze (e&xtrude)" + +#: graphicswin.cpp:117 +msgid "&Helix" +msgstr "Šroubovice (&helix)" + +#: graphicswin.cpp:118 +msgid "&Lathe" +msgstr "Plná rotace (&lathe)" + +#: graphicswin.cpp:119 +msgid "Re&volve" +msgstr "Volná rotace (re&volve)" + +#: graphicswin.cpp:121 +msgid "Link / Assemble..." +msgstr "Odkaz / Sestavení..." + +#: graphicswin.cpp:122 +msgid "Link Recent" +msgstr "Odkaz na nedávný" + +#: graphicswin.cpp:124 +msgid "&Sketch" +msgstr "&Náčrt" + +#: graphicswin.cpp:125 +msgid "In &Workplane" +msgstr "V &pracovní rovině" + +#: graphicswin.cpp:126 +msgid "Anywhere In &3d" +msgstr "Kdekoliv ve &3D" + +#: graphicswin.cpp:128 +msgid "Datum &Point" +msgstr "Vztažný &Bod" + +#: graphicswin.cpp:129 +msgid "&Workplane" +msgstr "&Pracovní rovina" + +#: graphicswin.cpp:131 +msgid "Line &Segment" +msgstr "Úsečka" + +#: graphicswin.cpp:132 +msgid "C&onstruction Line Segment" +msgstr "Konstrukční úsečka" + +#: graphicswin.cpp:133 +msgid "&Rectangle" +msgstr "&Obdélník" + +#: graphicswin.cpp:134 +msgid "&Circle" +msgstr "&Kružnice" + +#: graphicswin.cpp:135 +msgid "&Arc of a Circle" +msgstr "&Oblouk kružnice" + +#: graphicswin.cpp:136 +msgid "&Bezier Cubic Spline" +msgstr "&Bézierův kubický splajn" + +#: graphicswin.cpp:138 +msgid "&Text in TrueType Font" +msgstr "&Text v písmu TrueType" + +#: graphicswin.cpp:139 +msgid "&Image" +msgstr "&Obrázek" + +#: graphicswin.cpp:141 +msgid "To&ggle Construction" +msgstr "Přepnout &konstrukci" + +#: graphicswin.cpp:142 +msgid "Tangent &Arc at Point" +msgstr "Tečný &oblouk v bodě" + +#: graphicswin.cpp:143 +msgid "Split Curves at &Intersection" +msgstr "Rozdělit kř&ivky v průsečíku" + +#: graphicswin.cpp:145 +msgid "&Constrain" +msgstr "Ome&zení" + +#: graphicswin.cpp:146 +msgid "&Distance / Diameter" +msgstr "&Vzdálenost / průměr" + +#: graphicswin.cpp:147 +msgid "Re&ference Dimension" +msgstr "Re&ferenční rozměr" + +#: graphicswin.cpp:148 +msgid "A&ngle" +msgstr "Úhe&l" + +#: graphicswin.cpp:149 +msgid "Reference An&gle" +msgstr "Refe&renční úhel" + +#: graphicswin.cpp:150 +msgid "Other S&upplementary Angle" +msgstr "Další doplňkový úh&el" + +#: graphicswin.cpp:151 +msgid "Toggle R&eference Dim" +msgstr "Přepnout r&eferenční rozměr" + +#: graphicswin.cpp:153 +msgid "&Horizontal" +msgstr "&Horizontála" + +#: graphicswin.cpp:154 +msgid "&Vertical" +msgstr "&Vertikála" + +#: graphicswin.cpp:156 +msgid "&On Point / Curve / Plane" +msgstr "&Na bodě / křivce / ploše" + +#: graphicswin.cpp:157 +msgid "E&qual Length / Radius / Angle" +msgstr "&Shodná délka / poloměr / úhel" + +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "Poměr délky / oblo&uku" + +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "Rozdíl &délky / oblouku" + +#: graphicswin.cpp:160 +msgid "At &Midpoint" +msgstr "Ve středové&m bodě" + +#: graphicswin.cpp:161 +msgid "S&ymmetric" +msgstr "S&ymetrie" + +#: graphicswin.cpp:162 +msgid "Para&llel / Tangent" +msgstr "Rovno&běžnost / tečna" + +#: graphicswin.cpp:163 +msgid "&Perpendicular" +msgstr "&Kolmost" + +#: graphicswin.cpp:164 +msgid "Same Orient&ation" +msgstr "Shodná orient&ace" + +#: graphicswin.cpp:165 +msgid "Lock Point Where &Dragged" +msgstr "Uzamčení v místě pře&tažení" + +#: graphicswin.cpp:167 +msgid "Comment" +msgstr "Komentář" + +#: graphicswin.cpp:169 +msgid "&Analyze" +msgstr "&Analyzovat" + +#: graphicswin.cpp:170 +msgid "Measure &Volume" +msgstr "Měření &objemu" + +#: graphicswin.cpp:171 +msgid "Measure A&rea" +msgstr "Měření &plochy" + +#: graphicswin.cpp:172 +msgid "Measure &Perimeter" +msgstr "Měření ob&vodu" + +#: graphicswin.cpp:173 +msgid "Show &Interfering Parts" +msgstr "Zobrazit kol&idující části" + +#: graphicswin.cpp:174 +msgid "Show &Naked Edges" +msgstr "Zobrazit ob&nažené hrany" + +#: graphicswin.cpp:175 +msgid "Show &Center of Mass" +msgstr "Zobrazit &těžiště" + +#: graphicswin.cpp:177 +msgid "Show &Underconstrained Points" +msgstr "Zobrazit &nedostatečně omezené body" + +#: graphicswin.cpp:179 +msgid "&Trace Point" +msgstr "&Trasovat bod" + +#: graphicswin.cpp:180 +msgid "&Stop Tracing..." +msgstr "&Zastavit trasování..." + +#: graphicswin.cpp:181 +msgid "Step &Dimension..." +msgstr "&Rozměr kroku..." + +#: graphicswin.cpp:183 +msgid "&Help" +msgstr "&Nápověda" + +#: graphicswin.cpp:184 +msgid "&Language" +msgstr "&Jazyk" + +#: graphicswin.cpp:185 +msgid "&Website / Manual" +msgstr "&Web / Manuál" + +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "Revize na &GitHubu" + +#: graphicswin.cpp:188 +msgid "&About" +msgstr "O &aplikaci" + +#: graphicswin.cpp:362 +msgid "(no recent files)" +msgstr "(žádné nedávné soubory)" + +#: graphicswin.cpp:370 +#, c-format +msgid "File '%s' does not exist." +msgstr "Soubor '%s' neexistuje." + +#: graphicswin.cpp:737 +msgid "No workplane is active, so the grid will not appear." +msgstr "Žádná pracovní rovina není aktivní, proto nebude mřížka zobrazena." + +#: graphicswin.cpp:752 +msgid "" +"The perspective factor is set to zero, so the view will always be a parallel " +"projection.\n" +"\n" +"For a perspective projection, modify the perspective factor in the " +"configuration screen. A value around 0.3 is typical." +msgstr "" +"Faktor perspektivy je nastaven na nulu, proto bude pohled vždy rovnoběžnou " +"projekcí.\n" +"\n" +"Pro perspektivní projekci uprav faktor perspektivy v " +"konfigurační obrazovce. Typická hodnota je kolem 0,3." + +#: graphicswin.cpp:837 +msgid "" +"Select a point; this point will become the center of the view on screen." +msgstr "" +"Vyber bod; tento bod se stane středem pohledu na obrazovce." + +#: graphicswin.cpp:1137 +msgid "No additional entities share endpoints with the selected entities." +msgstr "Žádné další entity nesdílejí koncové body s vybranými entitami." + +#: 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 "" +"Chceš-li použít tento příkaz, vyber bod nebo jinou entitu z propojené části " +"nebo vyber skupinu propojení jako aktivní skupinu." + +#: graphicswin.cpp:1178 +msgid "" +"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " +"to define the plane for the snap grid." +msgstr "" +"Žádná pracovní rovina není aktivní. Aktivuj pracovní rovinu (pomocí Náčrt " +"-> V pracovní rovině) pro nastavení roviny přichytávání na mřížku." + +#: 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 "" +"Tyto položky nelze přichytit k mřížce; vyber body, textové komentáře nebo omezení " +"se štítkem. Chceš-li přichytit úsečku, vyber její koncové body." + +#: graphicswin.cpp:1270 +msgid "No workplane selected. Activating default workplane for this group." +msgstr "" +"Není vybrána žádná pracovní rovina. Aktivuji výchozí pracovní rovinu pro " +"tuto skupinu." + +#: 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 "" +"Není vybrána žádná pracovní rovina a aktivní skupina nemá výchozí " +"pracovní rovinu přiřazenu. Zkus vybrat pracovní rovinu nebo aktivovat " +"skupinu náčrt-v-rovině." + +#: graphicswin.cpp:1294 +msgid "" +"Bad selection for tangent arc at point. Select a single point, or select " +"nothing to set up arc parameters." +msgstr "" +"Chybný výběr tečného oblouku v bodě. Vyber jeden bod nebo výběr " +"zruš pro nastavení parametrů oblouku." + +#: graphicswin.cpp:1305 +msgid "click point on arc (draws anti-clockwise)" +msgstr "klikni na bod oblouku (kresleno proti směru hodinových ručiček)" + +#: graphicswin.cpp:1306 +msgid "click to place datum point" +msgstr "klikni pro umístění vztažného bodu" + +#: graphicswin.cpp:1307 +msgid "click first point of line segment" +msgstr "klikni na první bod úsečky" + +#: graphicswin.cpp:1309 +msgid "click first point of construction line segment" +msgstr "klikni na první bod konstrukční úsečky" + +#: graphicswin.cpp:1310 +msgid "click first point of cubic segment" +msgstr "klikni na první bod segmentu splajnu" + +#: graphicswin.cpp:1311 +msgid "click center of circle" +msgstr "klikni na střed kružnice" + +#: graphicswin.cpp:1312 +msgid "click origin of workplane" +msgstr "klikni na počátek pracovní roviny" + +#: graphicswin.cpp:1313 +msgid "click one corner of rectangle" +msgstr "klikni na jeden roh obdélníku" + +#: graphicswin.cpp:1314 +msgid "click top left of text" +msgstr "klikni na levý horní roh textu" + +#: graphicswin.cpp:1320 +msgid "click top left of image" +msgstr "klikni na levý horní roh obrázku" + +#: graphicswin.cpp:1346 +msgid "" +"No entities are selected. Select entities before trying to toggle their " +"construction state." +msgstr "" +"Nejsou vybrány žádné entity. Před přepnutím stavu konstrukce " +"nějaké entity vyber." + +#: group.cpp:86 +msgctxt "group-name" +msgid "sketch-in-3d" +msgstr "náčrt-ve-3D" + +#: group.cpp:150 +msgid "" +"Bad selection for new sketch in workplane. This group can be created with:\n" +"\n" +" * a point (through the point, orthogonal to coordinate axes)\n" +" * a point and two line segments (through the point, parallel to the " +"lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" +" * a workplane (copy of the workplane)\n" +msgstr "" +"Chybný výběr nového náčrtu v pracovním plánu. Tuto skupinu lze vytvořit pomocí:\n" +"\n" +" * bodu (přes bod, kolmo na souřadnicové osy)\n" +" * bodu a dvou úseček (procházející bodem, rovnoběžná s " +"přímkami)\n" +" * bodu a normály (procházející bodem, kolmá na normálu)\n" +" * pracovní roviny (kopie pracovní roviny)\n" + +#: group.cpp:166 +msgid "" +"Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " +"will be extruded normal to the workplane." +msgstr "" +"Před extruzí aktivuj pracovní rovinu (Náčrt -> V pracovní rovině). Náčrt " +"bude extrudován ve směru normály k pracovní rovině." + +#: group.cpp:175 +msgctxt "group-name" +msgid "extrude" +msgstr "extruze" + +#: group.cpp:180 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "Operace plné rotace lze použít pouze na rovinné náčrty.." + +#: group.cpp:191 +msgid "" +"Bad selection for new lathe group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Chybný výběr pro novou skupinu plné rotace. Tuto skupinu lze vytvořit pomocí:\n" +"\n" +" * bodu a úsečky nebo normály (rotací kolem osy rovnoběžné " +"k přímce / normále, procházející bodem)\n" +" * úsečky (rotací kolem úsečky)\n" + +#: group.cpp:201 +msgctxt "group-name" +msgid "lathe" +msgstr "plná-rotace" + +#: group.cpp:206 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "Operaci volné rotace lze použít pouze na rovinné náčrty." + +#: group.cpp:217 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Chybný výběr pro novou skupinu volné rotace. Tuto skupinu lze vytvořit pomocí:\n" +"\n" +" * bodu a úsečky nebo normály (rotace kolem osy rovnoběžné s " +"přímkou / normálou, procházející bodem)\n" +" * úsečky (rotace kolem úsečky)\n" + +#: group.cpp:229 +msgctxt "group-name" +msgid "revolve" +msgstr "volná-rotace" + +#: group.cpp:234 +msgid "Helix operation can only be applied to planar sketches." +msgstr "Operaci šroubovice lze použít pouze na rovinné náčrty." + +#: group.cpp:245 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Chybný výběr pro novou skupinu šroubovice. Tuto skupinu lze vytvořit pomocí:\n" +"\n" +" * bodu a úsečky nebo normály (rotací kolem osy rovnoběžné " +"k přímce / normále, procházející bodem)\n" +" * úsečky (rotací kolem úsečky)\n" + +#: group.cpp:257 +msgctxt "group-name" +msgid "helix" +msgstr "šroubovice" + +#: group.cpp:270 +msgid "" +"Bad selection for new rotation. This group can be created with:\n" +"\n" +" * a point, while locked in workplane (rotate in plane, about that " +"point)\n" +" * a point and a line or a normal (rotate about an axis through the " +"point, and parallel to line / normal)\n" +msgstr "" +"Chybný výběr pro nové krokové otočení. Tuto skupinu lze vytvořit pomocí:\n" +"\n" +" * bodu, přičemž je uzamčen v pracovní rovině (otočení v rovině, kolem tohoto " +"bodu)\n" +" * bodu a úsečky nebo normály (otočení kolem osy procházející " +"bodem a rovnoběžně s přímkou / normálou)\n" + +#: group.cpp:283 +msgctxt "group-name" +msgid "rotate" +msgstr "otočení" + +#: group.cpp:294 +msgctxt "group-name" +msgid "translate" +msgstr "posun" + +#: group.cpp:416 +msgid "(unnamed)" +msgstr "(nepojmenované)" + +#: groupmesh.cpp:707 +msgid "not closed contour, or not all same style!" +msgstr "Obrys není uzavřený nebo není celý v jednotném stylu!" + +#: groupmesh.cpp:720 +msgid "points not all coplanar!" +msgstr "Ne všechny body jsou v rovině!" + +#: groupmesh.cpp:722 +msgid "contour is self-intersecting!" +msgstr "Obrys se sám protíná!" + +#: groupmesh.cpp:724 +msgid "zero-length edge!" +msgstr "Nulová délka hrany!" + +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "Textové soubory STL nejsou v této chvíli podporovány." + +#: modify.cpp:252 +msgid "Must be sketching in workplane to create tangent arc." +msgstr "Pro vytvoření tečného oblouku je nutné kreslit v pracovní rovině." + +#: modify.cpp:299 +msgid "" +"To create a tangent arc, select a point where two non-construction lines or " +"circles in this group and workplane join." +msgstr "" +"Chceš-li vytvořit tečný oblouk, vyber bod, kde se s pracovní rovinou stýkají " +"dvě nekonstrukční úsečky nebo kružnice v této skupině." + +#: modify.cpp:386 +msgid "" +"Couldn't round this corner. Try a smaller radius, or try creating the " +"desired geometry by hand with tangency constraints." +msgstr "" +"Tento roh nelze zaoblit. Zkus menší poloměr nebo zkus vytvořit " +"požadovanou geometrii ručně pomocí tečných omezení." + +#: modify.cpp:595 +msgid "Couldn't split this entity; lines, circles, or cubics only." +msgstr "Tuto entitu se nepodařilo rozdělit; pouze úsečky, kružnice nebo splajny." + +#: modify.cpp:622 +msgid "Must be sketching in workplane to split." +msgstr "Rozdělení lze provést pouze při náčrtu v pracovní rovině." + +#: modify.cpp:629 +msgid "" +"Select two entities that intersect each other (e.g. two lines/circles/arcs " +"or a line/circle/arc and a point)." +msgstr "" +"Vyber dvě entity, které se vzájemně protínají (např. dvě čáry / kružnice / oblouky " +"nebo úsečka / kružnice / oblouk a bod)." + +#: modify.cpp:734 +msgid "Can't split; no intersection found." +msgstr "Nelze rozdělit, nebyla nalezena žádná průsečnice." + +#: mouse.cpp:557 +msgid "Assign to Style" +msgstr "Přiřadit ke stylu" + +#: mouse.cpp:573 +msgid "No Style" +msgstr "Žádný styl" + +#: mouse.cpp:576 +msgid "Newly Created Custom Style..." +msgstr "Nově vytvořený vlastní styl..." + +#: mouse.cpp:583 +msgid "Group Info" +msgstr "Info o skupině" + +#: mouse.cpp:603 +msgid "Style Info" +msgstr "Info o stylu" + +#: mouse.cpp:623 +msgid "Select Edge Chain" +msgstr "Vybrat řetězec hran" + +#: mouse.cpp:629 +msgid "Toggle Reference Dimension" +msgstr "Přepnout referenční rozměr" + +#: mouse.cpp:635 +msgid "Other Supplementary Angle" +msgstr "Další doplňkový úhel" + +#: mouse.cpp:640 +msgid "Snap to Grid" +msgstr "Přichytit k mřížce" + +#: mouse.cpp:649 +msgid "Remove Spline Point" +msgstr "Odebrat bod splajnu" + +#: mouse.cpp:684 +msgid "Add Spline Point" +msgstr "Přidat bod splajnu" + +#: mouse.cpp:688 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "Nelze přidat bod splajnu: bylo dosaženo maximálního počtu bodů." + +#: mouse.cpp:713 +msgid "Toggle Construction" +msgstr "Přepnout konstrukci" + +#: mouse.cpp:729 +msgid "Delete Point-Coincident Constraint" +msgstr "Odstranit omezení kolidujícího bodu" + +#: mouse.cpp:747 +msgid "Cut" +msgstr "Vyjmout" + +#: mouse.cpp:749 +msgid "Copy" +msgstr "Kopírovat" + +#: mouse.cpp:753 +msgid "Select All" +msgstr "Vybrat vše" + +#: mouse.cpp:758 +msgid "Paste" +msgstr "Vložit" + +#: mouse.cpp:760 +msgid "Paste Transformed..." +msgstr "Vložit transformované..." + +#: mouse.cpp:765 +msgid "Delete" +msgstr "Odstranit" + +#: mouse.cpp:768 +msgid "Unselect All" +msgstr "Zrušit výběr všeho" + +#: mouse.cpp:775 +msgid "Unselect Hovered" +msgstr "Zrušit výběr při najetí" + +#: mouse.cpp:784 +msgid "Zoom to Fit" +msgstr "Přiblížit na míru" + +#: mouse.cpp:986 mouse.cpp:1274 +msgid "click next point of line, or press Esc" +msgstr "klikni na další bod úsečky nebo stiskni klávesu Esc" + +#: mouse.cpp:992 +msgid "" +"Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"Nelze nakreslit obdélník ve 3D; nejprve aktivuj pracovní rovinu pomocí Náčrt -> V " +"pracovní rovině." + +#: mouse.cpp:1026 +msgid "click to place other corner of rectangle" +msgstr "kliknutím umísti další roh obdélníku" + +#: mouse.cpp:1047 +msgid "click to set radius" +msgstr "kliknutím nastav poloměr" + +#: mouse.cpp:1052 +msgid "" +"Can't draw arc in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"Nelze nakreslit oblouk ve 3D; nejprve aktivuj pracovní rovinu pomocí Náčrt -> V " +"pracovní rovině." + +#: mouse.cpp:1071 +msgid "click to place point" +msgstr "kliknutím umísti bod" + +#: mouse.cpp:1087 +msgid "click next point of cubic, or press Esc" +msgstr "klikni na další bod splajnu nebo stiskni Esc" + +#: mouse.cpp:1092 +msgid "" +"Sketching in a workplane already; sketch in 3d before creating new workplane." +msgstr "" +"Kreslení v pracovní rovině již probíhá; před vytvořením nové pracovní roviny " +"kresli ve 3D." + +#: mouse.cpp:1108 +msgid "" +"Can't draw text in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"Nelze kreslit text ve 3D; nejprve aktivuj pracovní rovinu pomocí Náčrt -> V " +"pracovní rovině." + +#: mouse.cpp:1125 +msgid "click to place bottom right of text" +msgstr "klikni pro umístění pravého dolního rohu textu" + +#: mouse.cpp:1131 +msgid "" +"Can't draw image in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"Nelze nakreslit obrázek ve 3d; nejprve aktivuj pracovní rovinu pomocí Náčrt -> V " +"pracovní rovině." + +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 +msgctxt "file-type" +msgid "SolveSpace models" +msgstr "SolveSpace modely" + +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "VŠE" + +#: platform/gui.cpp:91 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "IDF deska plošných spojů" + +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "STL trojúhelníková síť" + +#: platform/gui.cpp:96 +msgctxt "file-type" +msgid "PNG image" +msgstr "PNG obrázek" + +#: platform/gui.cpp:100 +msgctxt "file-type" +msgid "STL mesh" +msgstr "STL síť (mesh)" + +#: platform/gui.cpp:101 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" +msgstr "Wavefront OBJ síť (mesh)" + +#: platform/gui.cpp:102 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" +msgstr "Three.js-compatibilní síť (mesh), s prohlížečem" + +#: platform/gui.cpp:103 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "Three.js-compatibilní síť (mesh), bez prohlížeče" + +#: platform/gui.cpp:104 +msgctxt "file-type" +msgid "VRML text file" +msgstr "VRML textový soubor" + +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 +msgctxt "file-type" +msgid "STEP file" +msgstr "STEP soubor" + +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "PDF file" +msgstr "PDF soubor" + +#: platform/gui.cpp:113 +msgctxt "file-type" +msgid "Encapsulated PostScript" +msgstr "Zapouzdřený PostScript" + +#: platform/gui.cpp:114 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "SVG soubor" + +#: platform/gui.cpp:116 platform/gui.cpp:123 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" +msgstr "DXF soubor (AutoCAD 2007)" + +#: platform/gui.cpp:117 +msgctxt "file-type" +msgid "HPGL file" +msgstr "HPGL soubor" + +#: platform/gui.cpp:118 +msgctxt "file-type" +msgid "G Code" +msgstr "G kód (G Code)" + +#: platform/gui.cpp:127 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" +msgstr "AutoCAD DXF a DWG soubory" + +#: platform/gui.cpp:131 +msgctxt "file-type" +msgid "Comma-separated values" +msgstr "CSV soubor" + +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 +msgid "untitled" +msgstr "nepojmenovaný" + +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 +#: platform/guiwin.cpp:1639 +msgctxt "title" +msgid "Save File" +msgstr "Uložit soubor" + +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 +#: platform/guiwin.cpp:1645 +msgctxt "title" +msgid "Open File" +msgstr "Otevřít soubor" + +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 +msgctxt "button" +msgid "_Cancel" +msgstr "_Zrušit" + +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 +msgctxt "button" +msgid "_Save" +msgstr "_Uložit" + +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 +msgctxt "button" +msgid "_Open" +msgstr "_Otevřít" + +#: solvespace.cpp:171 +msgctxt "title" +msgid "Autosave Available" +msgstr "Dostupné automatické ukládání" + +#: solvespace.cpp:172 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "Pro tento náčrt je k dispozici automatické ukládání souboru." + +#: solvespace.cpp:173 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "Chceš místo toho načíst automaticky uložený soubor?" + +#: solvespace.cpp:174 +msgctxt "button" +msgid "&Load autosave" +msgstr "&Načíst automaticky uložený" + +#: solvespace.cpp:176 +msgctxt "button" +msgid "Do&n't Load" +msgstr "&Nenačítat" + +#: solvespace.cpp:599 +msgctxt "title" +msgid "Modified File" +msgstr "Upravený soubor" + +#: solvespace.cpp:601 +#, c-format +msgctxt "dialog" +msgid "Do you want to save the changes you made to the sketch “%s”?" +msgstr "Chceš uložit změny, které jsi provedl v náčrtu “%s”?" + +#: solvespace.cpp:604 +msgctxt "dialog" +msgid "Do you want to save the changes you made to the new sketch?" +msgstr "Chceš provedené změny uložit do nového náčrtu?" + +#: solvespace.cpp:607 +msgctxt "dialog" +msgid "Your changes will be lost if you don't save them." +msgstr "Pokud změny neuložíš, budou ztraceny." + +#: solvespace.cpp:608 +msgctxt "button" +msgid "&Save" +msgstr "&Uložit" + +#: solvespace.cpp:610 +msgctxt "button" +msgid "Do&n't Save" +msgstr "&Neukládat" + +#: solvespace.cpp:631 +msgctxt "title" +msgid "(new sketch)" +msgstr "(nový náčrt)" + +#: solvespace.cpp:638 +msgctxt "title" +msgid "Property Browser" +msgstr "Parametry" + +#: 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 "" +"Omezení jsou aktuálně zobrazena a budou exportována do cesty nástroje. To " +"pravděpodobně není to, co chceš; skryj je kliknutím na odkaz v horní části " +"textového okna." + +#: solvespace.cpp:772 +#, c-format +msgid "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." +msgstr "" +"Nelze určit typ souboru podle přípony názvu souboru '%s'; zkus .dxf nebo ." +"dwg." + +#: solvespace.cpp:824 +msgid "Constraint must have a label, and must not be a reference dimension." +msgstr "Omezení musí mít popisek a nesmí být referenčním rozměrem." + +#: solvespace.cpp:828 +msgid "Bad selection for step dimension; select a constraint." +msgstr "Chybný výběr rozměru kroku; vyber omezení." + +#: solvespace.cpp:852 +msgid "The assembly does not interfere, good." +msgstr "V pořádku, sestava se nepřekrývá." + +#: solvespace.cpp:868 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" +"Objem modelu tělesa je:\n" +"\n" +" %s" + +#: solvespace.cpp:877 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" +"\n" +"Objem aktuální mesh skupiny je:\n" +"\n" +" %s" + +#: solvespace.cpp:882 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" +"\n" +"\n" +"Zakřivené plochy byly aproximovány jako trojúhelníky.\n" +"To přináší chybu, obvykle kolem 1%%." + +#: solvespace.cpp:897 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"Plocha vybraných stěn je:\n" +"\n" +" %s\n" +"\n" +"Křivky byly aproximovány jako po částech lineární.\n" +"To přináší chybu, obvykle kolem 1%%." + +#: solvespace.cpp:906 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." +msgstr "" +"Tato skupina neobsahuje správně vytvořenou uzavřenou 2D oblast. Je otevřená, " +"není koplanární ani se neprotíná." + +#: solvespace.cpp:918 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"Plocha regionu zakresleného v této skupině je:\n" +"\n" +" %s\n" +"\n" +"Křivky byly aproximovány jako po částech lineární.\n" +"To přináší chybu, obvykle kolem 1%%." + +#: solvespace.cpp:938 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"Celková délka vybraných entit je:\n" +"\n" +" %s\n" +"\n" +"Křivky byly aproximovány jako po částech lineární.\n" +"To přináší chybu, obvykle kolem 1%%." + +#: solvespace.cpp:944 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "Chybný výběr obvodu; vyber úsečky, oblouky a křivky." + +#: solvespace.cpp:960 +msgid "Bad selection for trace; select a single point." +msgstr "Chybný výběr pro trasování; vyber jeden bod." + +#: solvespace.cpp:987 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "Nelze zapisovat do '%s'" + +#: solvespace.cpp:1017 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "Síť se sama protíná (NENÍ v pořádku, je neplatná)." + +#: solvespace.cpp:1018 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "Síť se sama neprotíná (je v pořádku, je platná)." + +#: solvespace.cpp:1020 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "Síť má obnažené hrany (NENÍ v pořádku, je neplatná)." + +#: solvespace.cpp:1021 +msgid "The mesh is watertight (okay, valid)." +msgstr "Síť je vodotěsná (je v pořádku, je platná)." + +#: solvespace.cpp:1024 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" +"\n" +"\n" +"Model obsahuje %d trojúhelníků z %d povrchů." + +#: solvespace.cpp:1028 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"Žádné problematické hrany, v pořádku.%s" + +#: solvespace.cpp:1031 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"Chyba, počet problematických hran: %d.%s" + +#: solvespace.cpp:1044 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" +"Toto je SolveSpace verze %s.\n" +"\n" +"Další informace naleznete na adrese http://solvespace.com/\n" +"\n" +"SolveSpace je svobodný software: můžete jej svobodně upravovat\n" +"a/nebo jej šířit za podmínek GNU\n" +"General Public License (GPL) verze 3 nebo novější.\n" +"\n" +"V rozsahu povoleném zákonem není poskytována ŽÁDNÁ ZÁRUKA.\n" +"Podrobnosti najdete na adrese http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues a další autoři.\n" + +#: style.cpp:185 +msgid "" +"Can't assign style to an entity that's derived from another entity; try " +"assigning a style to this entity's parent." +msgstr "" +"Nelze přiřadit styl entitě, která je odvozena od jiné entity; zkus " +"přiřadit styl nadřazené entitě." + +#: style.cpp:735 +msgid "Style name cannot be empty" +msgstr "Název stylu nemůže být prázdný" + +#: textscreens.cpp:791 +msgid "Can't repeat fewer than 1 time." +msgstr "Nelze opakovat méně než 1krát." + +#: textscreens.cpp:795 +msgid "Can't repeat more than 999 times." +msgstr "Nelze opakovat více než 999krát." + +#: textscreens.cpp:820 +msgid "Group name cannot be empty" +msgstr "Název skupiny nemůže být prázdný" + +#: textscreens.cpp:872 +msgid "Opacity must be between zero and one." +msgstr "Neprůhlednost musí být mezi nulou a jedničkou." + +#: textscreens.cpp:907 +msgid "Radius cannot be zero or negative." +msgstr "Poloměr nemůže být nulový nebo záporný." + +#: toolbar.cpp:18 +msgid "Sketch line segment" +msgstr "Náčrt úsečky" + +#: toolbar.cpp:20 +msgid "Sketch rectangle" +msgstr "Náčrt obdélníku" + +#: toolbar.cpp:22 +msgid "Sketch circle" +msgstr "Náčrt kružnice" + +#: toolbar.cpp:24 +msgid "Sketch arc of a circle" +msgstr "Náčrt oblouku kružnice" + +#: toolbar.cpp:26 +msgid "Sketch curves from text in a TrueType font" +msgstr "Náčrt křivek z textu v písmu TrueType" + +#: toolbar.cpp:28 +msgid "Sketch image from a file" +msgstr "Náčrt obrázku ze souboru" + +#: toolbar.cpp:30 +msgid "Create tangent arc at selected point" +msgstr "Vytvořit tečný oblouk ve vybraném bodě" + +#: toolbar.cpp:32 +msgid "Sketch cubic Bezier spline" +msgstr "Náčrt kubického Bézierova splajnu" + +#: toolbar.cpp:34 +msgid "Sketch datum point" +msgstr "Náčrt vztažného bodu" + +#: toolbar.cpp:36 +msgid "Toggle construction" +msgstr "Přepnout konstrukci" + +#: toolbar.cpp:38 +msgid "Split lines / curves where they intersect" +msgstr "Rozdělení úseček / křivek v místě jejich průsečíku" + +#: toolbar.cpp:42 +msgid "Constrain distance / diameter / length" +msgstr "Omezení vzdálenosti / průměru / délky" + +#: toolbar.cpp:44 +msgid "Constrain angle" +msgstr "Omezení úhlu" + +#: toolbar.cpp:46 +msgid "Constrain to be horizontal" +msgstr "Omezení horizontály" + +#: toolbar.cpp:48 +msgid "Constrain to be vertical" +msgstr "Omezení vertikály" + +#: toolbar.cpp:50 +msgid "Constrain to be parallel or tangent" +msgstr "Omezení rovnoběžnosti nebo tečny" + +#: toolbar.cpp:52 +msgid "Constrain to be perpendicular" +msgstr "Omezení kolmosti" + +#: toolbar.cpp:54 +msgid "Constrain point on line / curve / plane / point" +msgstr "Omezení bodu na přímce / křivce / rovině / bodu" + +#: toolbar.cpp:56 +msgid "Constrain symmetric" +msgstr "Omezení symetrie" + +#: toolbar.cpp:58 +msgid "Constrain equal length / radius / angle" +msgstr "Omezení shodné délky / poloměru / úhlu" + +#: toolbar.cpp:60 +msgid "Constrain normals in same orientation" +msgstr "Omezení normál se stejnou orientací" + +#: toolbar.cpp:62 +msgid "Other supplementary angle" +msgstr "Další doplňkový úhel" + +#: toolbar.cpp:64 +msgid "Toggle reference dimension" +msgstr "Přepnout referenční rozměr" + +#: toolbar.cpp:68 +msgid "New group extruding active sketch" +msgstr "Nová skupina extruzí aktivního náčrtu" + +#: toolbar.cpp:70 +msgid "New group rotating active sketch" +msgstr "Nová skupina plnou rotací aktivního náčrtu" + +#: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "Nová skupina šroubovicí aktivního náčrtu" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "Nová skupina volnou rotací aktivního náčrtu" + +#: toolbar.cpp:76 +msgid "New group step and repeat rotating" +msgstr "Nová skupina krokovým otočením" + +#: toolbar.cpp:78 +msgid "New group step and repeat translating" +msgstr "Nová skupina krokovým posunem" + +#: toolbar.cpp:80 +msgid "New group in new workplane (thru given entities)" +msgstr "Nová skupina v pracovní rovině (přes dané entity)" + +#: toolbar.cpp:82 +msgid "New group in 3d" +msgstr "Nová skupina ve 3D" + +#: toolbar.cpp:84 +msgid "New group linking / assembling file" +msgstr "Nová skupina odkazem / sestavením souboru" + +#: toolbar.cpp:88 +msgid "Nearest isometric view" +msgstr "Nejbližší isometrický pohled" + +#: toolbar.cpp:90 +msgid "Align view to active workplane" +msgstr "Zarovnat pohled na aktivní pracovní rovinu" + +#: util.cpp:165 +msgctxt "title" +msgid "Error" +msgstr "Chyba" + +#: util.cpp:165 +msgctxt "title" +msgid "Message" +msgstr "Zpráva" + +#: util.cpp:170 +msgctxt "button" +msgid "&OK" +msgstr "&OK" + +#: view.cpp:127 +msgid "Scale cannot be zero or negative." +msgstr "Měřítko nemůže být nulové nebo záporné." + +#: view.cpp:139 view.cpp:148 +msgid "Bad format: specify x, y, z" +msgstr "Chybný formát: zadej x, y, z" + +#~ msgid "&Mirror" +#~ msgstr "&Zrcadlit" + +#~ msgctxt "group-name" +#~ msgid "mirror" +#~ msgstr "zrcadlit" + +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Chybný výběr pro omezení poměru délky. Toto omezení lze použít pro:\n" +#~ "\n" +#~ " * dvě úsečky\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Chybný výběr pro omezení rozdílu délek. Toto omezení lze použít" +#~ "pro:\n" +#~ "\n" +#~ " * dvě úsečky\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "Poměr &délky" + +#~ msgid "Length Diff&erence" +#~ msgstr "Rozdíl dél&ek" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Chybný výběr nového náčrtu v pracovní rovině. Tuto skupinu lze vytvořit " +#~ "pomocí:\n" +#~ "\n" +#~ " * bodu (procházejícího bodem kolmým na souřadnicové osy)\n" +#~ " * bodu a dvěma úsečkami (procházejícího bodem rovnoběžným " +#~ "s úsečkami)\n" +#~ " * pracovní roviny (kopie pracovní roviny)\n" + +#~ msgctxt "file-type" +#~ msgid "Q3D Object file" +#~ msgstr "Q3D Objektový soubor" From 3721ea86a7aac6a1d984f20791c788b0babd1d68 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 26 Jun 2022 14:58:36 +0300 Subject: [PATCH 424/646] Win32: Allow 32 bit SolveSpace to access up to 4GB of RAM. Link 32 bit SolveSpace for Windows with /LARGEADDRESSAWARE which allows it to access up to 3GB of RAM on a properly configured 32 bit Windows and up to 4GB on 64 bit. See: https://msdn.microsoft.com/en-us/library/aa366778 https://docs.microsoft.com/en-us/cpp/build/reference/largeaddressaware-handle-large-addresses https://docs.microsoft.com/en-us/windows/win32/debug/pe-format#characteristics https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc786709 https://docs.microsoft.com/en-us/windows/win32/memory/4-gigabyte-tuning Fixes: #1261 --- CMakeLists.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 399e2cae2..d50a1f4a5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -91,6 +91,10 @@ endif() if(MINGW) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++") + # Link 32 bit SolveSpace with --large-address-aware which allows it to access + # up to 3GB on a properly configured 32 bit Windows and up to 4GB on 64 bit. + # See https://msdn.microsoft.com/en-us/library/aa366778 + set(CMAKE_EXE_LINKER_FLAGS "-Wl,--large-address-aware") endif() # Ensure that all platforms use 64-bit IEEE floating point operations for consistency; @@ -376,6 +380,12 @@ if(MSVC) # We rely on these /we flags. They correspond to the GNU-style flags below as # follows: /w4062=-Wswitch set(WARNING_FLAGS "${WARNING_FLAGS} /we4062") + + # Link 32 bit SolveSpace with /LARGEADDRESSAWARE which allows it to access + # up to 3GB on a properly configured 32 bit Windows and up to 4GB on 64 bit. + # See https://msdn.microsoft.com/en-us/library/aa366778 + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LARGEADDRESSAWARE") endif() if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") From f317ffcc4abc0b8d05d071de76f91d178897f5c7 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 30 Jun 2022 15:37:17 -0500 Subject: [PATCH 425/646] Stamp source tarballs with the commit hash --- .github/workflows/source-tarball.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/source-tarball.yml b/.github/workflows/source-tarball.yml index 8bc06221b..cc3c41013 100644 --- a/.github/workflows/source-tarball.yml +++ b/.github/workflows/source-tarball.yml @@ -21,7 +21,12 @@ jobs: dir_name="solvespace-${version}" archive_name="${dir_name}.tar.xz" archive_path="${HOME}/${archive_name}" - + commit_sha="$GITHUB_SHA" + + sed -e 's/^\(include(GetGitCommitHash)\)/#\1/' \ + -e 's/^# \(set(GIT_COMMIT_HASH\).*/\1 '"$commit_sha"')/' \ + -i CMakeLists.txt + echo "::set-output name=archive_name::${archive_name}" echo "::set-output name=archive_path::${archive_path}" From 78c673919341721c77234d687e645e45bc989c65 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 24 Jun 2021 09:47:49 -0500 Subject: [PATCH 426/646] Fix whitespace and trailing newline in github actions files. --- .github/scripts/build-macos.sh | 2 +- .github/scripts/sign-macos.sh | 6 +++--- .github/workflows/cd.yml | 2 +- .github/workflows/test.yml | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/scripts/build-macos.sh b/.github/scripts/build-macos.sh index 3394a8af2..103b31860 100755 --- a/.github/scripts/build-macos.sh +++ b/.github/scripts/build-macos.sh @@ -49,4 +49,4 @@ else if [ $(uname -m) = "$2" ]; then make -j$(sysctl -n hw.logicalcpu) test_solvespace fi -fi \ No newline at end of file +fi diff --git a/.github/scripts/sign-macos.sh b/.github/scripts/sign-macos.sh index 8e944d3e7..0580f7484 100755 --- a/.github/scripts/sign-macos.sh +++ b/.github/scripts/sign-macos.sh @@ -72,12 +72,12 @@ do echo "Checking progress..." progress=$(xcrun altool --notarization-info "${notarize_uuid}" -u "${MACOS_APPSTORE_USERNAME}" -p "${MACOS_APPSTORE_APP_PASSWORD}" 2>&1) # echo "${progress}" - + if [ $? -ne 0 ] || [[ "${progress}" =~ "Invalid" ]] ; then echo "Error with notarization. Exiting" break fi - + if [[ "${progress}" =~ "success" ]]; then success=1 break @@ -88,4 +88,4 @@ do done # staple -xcrun stapler staple "${dmg}" \ No newline at end of file +xcrun stapler staple "${dmg}" diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index a14afc5cb..85f28aa2c 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -69,7 +69,7 @@ jobs: with: name: windows path: build/bin/RelWithDebInfo/solvespace.exe - + build_release_windows_openmp: needs: [test_ubuntu, test_windows, test_macos] name: Build Release Windows (OpenMP) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1ca64b3a8..7b66cdb5b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -42,3 +42,4 @@ jobs: run: .github/scripts/install-macos.sh ci - name: Build & Test run: .github/scripts/build-macos.sh debug arm64 && .github/scripts/build-macos.sh debug x86_64 + From 621009c05ff1db6c28dc87744360d8cd546b8e96 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 22 Apr 2021 13:17:49 -0500 Subject: [PATCH 427/646] flatpak: Update manifest. We don't apparently need home dir access, the portal works fine. --- pkg/flatpak/com.solvespace.SolveSpace.json | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index 8f55fa848..78c654afc 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -1,16 +1,14 @@ { + "$schema": "https://raw.githubusercontent.com/TingPing/flatpak-manifest-schema/master/flatpak-manifest.schema", "app-id": "com.solvespace.SolveSpace", "runtime": "org.freedesktop.Platform", "runtime-version": "20.08", "sdk": "org.freedesktop.Sdk", "finish-args": [ - /* Access to display server and OpenGL */ "--share=ipc", "--socket=fallback-x11", "--socket=wayland", - "--device=dri", - /* Access to save files */ - "--filesystem=home" + "--device=dri" ], "cleanup": [ "/include", @@ -25,7 +23,6 @@ "/share/man", "/share/doc", "/share/aclocal", - /* mm-common junk */ "/bin/mm-common-prepare", "/share/mm-common" ], @@ -56,7 +53,6 @@ }, { "name": "glibmm", - "config-opts": [], "buildsystem": "meson", "sources": [ { @@ -74,7 +70,7 @@ "sources": [ { "type": "archive", - "url": "http://ftp.gnome.org/pub/GNOME/sources/cairomm/1.12/cairomm-1.12.0.tar.xz", + "url": "https://ftp.gnome.org/pub/GNOME/sources/cairomm/1.12/cairomm-1.12.0.tar.xz", "sha256": "a54ada8394a86182525c0762e6f50db6b9212a2109280d13ec6a0b29bfd1afe6" } ] @@ -87,7 +83,7 @@ "sources": [ { "type": "archive", - "url": "http://ftp.gnome.org/pub/GNOME/sources/pangomm/2.40/pangomm-2.40.2.tar.xz", + "url": "https://ftp.gnome.org/pub/GNOME/sources/pangomm/2.40/pangomm-2.40.2.tar.xz", "sha256": "0a97aa72513db9088ca3034af923484108746dba146e98ed76842cf858322d05" } ] @@ -107,7 +103,6 @@ }, { "name": "gtkmm", - "config-opts": [], "buildsystem": "meson", "sources": [ { @@ -121,13 +116,12 @@ "name": "libjson-c", "sources": [ { - /* 0.15-nodoc doesn't build */ "type": "archive", "url": "https://s3.amazonaws.com/json-c_releases/releases/json-c-0.13.1-nodoc.tar.gz", "sha256": "94a26340c0785fcff4f46ff38609cf84ebcd670df0c8efd75d039cc951d80132" } ], - "buildsystem": "cmake", + "buildsystem": "cmake-ninja", "builddir": true }, { @@ -138,7 +132,7 @@ "path": "../.." } ], - "buildsystem": "cmake", + "buildsystem": "cmake-ninja", "builddir": true, "config-opts": [ "-DFLATPAK=ON", From f227af1c43c2088a4f047edf73b58360d6587526 Mon Sep 17 00:00:00 2001 From: tinywrkb Date: Thu, 30 Jun 2022 15:55:21 -0500 Subject: [PATCH 428/646] flatpak: Update runtime to 21.08 --- pkg/flatpak/com.solvespace.SolveSpace.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index 78c654afc..bfe4c0657 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -2,7 +2,7 @@ "$schema": "https://raw.githubusercontent.com/TingPing/flatpak-manifest-schema/master/flatpak-manifest.schema", "app-id": "com.solvespace.SolveSpace", "runtime": "org.freedesktop.Platform", - "runtime-version": "20.08", + "runtime-version": "21.08", "sdk": "org.freedesktop.Sdk", "finish-args": [ "--share=ipc", From 2221047697e9419ce82943488a151cedfdfa14a7 Mon Sep 17 00:00:00 2001 From: tinywrkb Date: Wed, 29 Jun 2022 15:36:58 +0300 Subject: [PATCH 429/646] flatpak: Add f-e-d-c properties to depends, retain comments, and cosmetics --- pkg/flatpak/com.solvespace.SolveSpace.json | 81 +++++++++++++++++++--- 1 file changed, 70 insertions(+), 11 deletions(-) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index bfe4c0657..bb9cc7f44 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -34,7 +34,12 @@ { "type": "archive", "url": "https://download.gnome.org/sources/mm-common/1.0/mm-common-1.0.2.tar.xz", - "sha256": "a2a99f3fa943cf662f189163ed39a2cfc19a428d906dd4f92b387d3659d1641d" + "sha256": "a2a99f3fa943cf662f189163ed39a2cfc19a428d906dd4f92b387d3659d1641d", + "x-checker-data": { + "type": "gnome", + "name": "mm-common", + "stable-only": true + } } ] }, @@ -47,7 +52,15 @@ { "type": "archive", "url": "https://download.gnome.org/sources/libsigc++/2.10/libsigc%2B%2B-2.10.6.tar.xz", - "sha256": "dda176dc4681bda9d5a2ac1bc55273bdd381662b7a6d49e918267d13e8774e1b" + "sha256": "dda176dc4681bda9d5a2ac1bc55273bdd381662b7a6d49e918267d13e8774e1b", + "x-checker-data": { + "type": "gnome", + "name": "libsigc++", + "stable-only": true, + "versions": { + "<": "3.0.0" + } + } } ] }, @@ -58,7 +71,15 @@ { "type": "archive", "url": "https://download.gnome.org/sources/glibmm/2.64/glibmm-2.64.5.tar.xz", - "sha256": "508fc86e2c9141198aa16c225b16fd6b911917c0d3817602652844d0973ea386" + "sha256": "508fc86e2c9141198aa16c225b16fd6b911917c0d3817602652844d0973ea386", + "x-checker-data": { + "type": "gnome", + "name": "glibmm", + "stable-only": true, + "versions": { + "<": "2.68.0" + } + } } ] }, @@ -71,7 +92,15 @@ { "type": "archive", "url": "https://ftp.gnome.org/pub/GNOME/sources/cairomm/1.12/cairomm-1.12.0.tar.xz", - "sha256": "a54ada8394a86182525c0762e6f50db6b9212a2109280d13ec6a0b29bfd1afe6" + "sha256": "a54ada8394a86182525c0762e6f50db6b9212a2109280d13ec6a0b29bfd1afe6", + "x-checker-data": { + "type": "gnome", + "name": "cairomm", + "stable-only": true, + "versions": { + "<": "1.16.0" + } + } } ] }, @@ -84,7 +113,15 @@ { "type": "archive", "url": "https://ftp.gnome.org/pub/GNOME/sources/pangomm/2.40/pangomm-2.40.2.tar.xz", - "sha256": "0a97aa72513db9088ca3034af923484108746dba146e98ed76842cf858322d05" + "sha256": "0a97aa72513db9088ca3034af923484108746dba146e98ed76842cf858322d05", + "x-checker-data": { + "type": "gnome", + "name": "pangomm", + "stable-only": true, + "versions": { + "<": "2.48.0" + } + } } ] }, @@ -97,7 +134,15 @@ { "type": "archive", "url": "http://ftp.gnome.org/pub/GNOME/sources/atkmm/2.28/atkmm-2.28.0.tar.xz", - "sha256": "4c4cfc917fd42d3879ce997b463428d6982affa0fb660cafcc0bc2d9afcedd3a" + "sha256": "4c4cfc917fd42d3879ce997b463428d6982affa0fb660cafcc0bc2d9afcedd3a", + "x-checker-data": { + "type": "gnome", + "name": "atkmm", + "stable-only": true, + "versions": { + "<": "2.30.0" + } + } } ] }, @@ -108,21 +153,35 @@ { "type": "archive", "url": "https://download.gnome.org/sources/gtkmm/3.24/gtkmm-3.24.4.tar.xz", - "sha256": "9beb71c3e90cfcfb790396b51e3f5e7169966751efd4f3ef9697114be3be6743" + "sha256": "9beb71c3e90cfcfb790396b51e3f5e7169966751efd4f3ef9697114be3be6743", + "x-checker-data": { + "type": "gnome", + "name": "gtkmm", + "stable-only": true, + "versions": { + "<": "4.0.0" + } + } } ] }, { "name": "libjson-c", + "buildsystem": "cmake-ninja", + "builddir": true, "sources": [ { "type": "archive", "url": "https://s3.amazonaws.com/json-c_releases/releases/json-c-0.13.1-nodoc.tar.gz", - "sha256": "94a26340c0785fcff4f46ff38609cf84ebcd670df0c8efd75d039cc951d80132" + "sha256": "94a26340c0785fcff4f46ff38609cf84ebcd670df0c8efd75d039cc951d80132", + "x-checker-data": { + "type": "anitya", + "project-id": 1477, + "stable-only": true, + "url-template": "https://s3.amazonaws.com/json-c_releases/releases/json-c-$version.tar.gz" + } } - ], - "buildsystem": "cmake-ninja", - "builddir": true + ] }, { "name": "SolveSpace", From 62b8ebc6a99446aecc764610b67e151f50690080 Mon Sep 17 00:00:00 2001 From: tinywrkb Date: Wed, 29 Jun 2022 15:42:46 +0300 Subject: [PATCH 430/646] flatpak: Update modules to latest versions --- pkg/flatpak/com.solvespace.SolveSpace.json | 30 +++++++++++----------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index bb9cc7f44..c8658ecd6 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -33,8 +33,8 @@ "sources": [ { "type": "archive", - "url": "https://download.gnome.org/sources/mm-common/1.0/mm-common-1.0.2.tar.xz", - "sha256": "a2a99f3fa943cf662f189163ed39a2cfc19a428d906dd4f92b387d3659d1641d", + "url": "https://download.gnome.org/sources/mm-common/1.0/mm-common-1.0.4.tar.xz", + "sha256": "e954c09b4309a7ef93e13b69260acdc5738c907477eb381b78bb1e414ee6dbd8", "x-checker-data": { "type": "gnome", "name": "mm-common", @@ -51,8 +51,8 @@ "sources": [ { "type": "archive", - "url": "https://download.gnome.org/sources/libsigc++/2.10/libsigc%2B%2B-2.10.6.tar.xz", - "sha256": "dda176dc4681bda9d5a2ac1bc55273bdd381662b7a6d49e918267d13e8774e1b", + "url": "https://download.gnome.org/sources/libsigc++/2.10/libsigc++-2.10.8.tar.xz", + "sha256": "235a40bec7346c7b82b6a8caae0456353dc06e71f14bc414bcc858af1838719a", "x-checker-data": { "type": "gnome", "name": "libsigc++", @@ -70,8 +70,8 @@ "sources": [ { "type": "archive", - "url": "https://download.gnome.org/sources/glibmm/2.64/glibmm-2.64.5.tar.xz", - "sha256": "508fc86e2c9141198aa16c225b16fd6b911917c0d3817602652844d0973ea386", + "url": "https://download.gnome.org/sources/glibmm/2.66/glibmm-2.66.4.tar.xz", + "sha256": "199ace5682d81b15a1d565480b4a950682f2db6402c8aa5dd7217d71edff81d5", "x-checker-data": { "type": "gnome", "name": "glibmm", @@ -91,7 +91,7 @@ "sources": [ { "type": "archive", - "url": "https://ftp.gnome.org/pub/GNOME/sources/cairomm/1.12/cairomm-1.12.0.tar.xz", + "url": "https://download.gnome.org/sources/cairomm/1.12/cairomm-1.12.0.tar.xz", "sha256": "a54ada8394a86182525c0762e6f50db6b9212a2109280d13ec6a0b29bfd1afe6", "x-checker-data": { "type": "gnome", @@ -112,8 +112,8 @@ "sources": [ { "type": "archive", - "url": "https://ftp.gnome.org/pub/GNOME/sources/pangomm/2.40/pangomm-2.40.2.tar.xz", - "sha256": "0a97aa72513db9088ca3034af923484108746dba146e98ed76842cf858322d05", + "url": "https://download.gnome.org/sources/pangomm/2.46/pangomm-2.46.2.tar.xz", + "sha256": "57442ab4dc043877bfe3839915731ab2d693fc6634a71614422fb530c9eaa6f4", "x-checker-data": { "type": "gnome", "name": "pangomm", @@ -133,8 +133,8 @@ "sources": [ { "type": "archive", - "url": "http://ftp.gnome.org/pub/GNOME/sources/atkmm/2.28/atkmm-2.28.0.tar.xz", - "sha256": "4c4cfc917fd42d3879ce997b463428d6982affa0fb660cafcc0bc2d9afcedd3a", + "url": "https://download.gnome.org/sources/atkmm/2.28/atkmm-2.28.2.tar.xz", + "sha256": "a0bb49765ceccc293ab2c6735ba100431807d384ffa14c2ebd30e07993fd2fa4", "x-checker-data": { "type": "gnome", "name": "atkmm", @@ -152,8 +152,8 @@ "sources": [ { "type": "archive", - "url": "https://download.gnome.org/sources/gtkmm/3.24/gtkmm-3.24.4.tar.xz", - "sha256": "9beb71c3e90cfcfb790396b51e3f5e7169966751efd4f3ef9697114be3be6743", + "url": "https://download.gnome.org/sources/gtkmm/3.24/gtkmm-3.24.6.tar.xz", + "sha256": "4b3e142e944e1633bba008900605c341a93cfd755a7fa2a00b05d041341f11d6", "x-checker-data": { "type": "gnome", "name": "gtkmm", @@ -172,8 +172,8 @@ "sources": [ { "type": "archive", - "url": "https://s3.amazonaws.com/json-c_releases/releases/json-c-0.13.1-nodoc.tar.gz", - "sha256": "94a26340c0785fcff4f46ff38609cf84ebcd670df0c8efd75d039cc951d80132", + "url": "https://s3.amazonaws.com/json-c_releases/releases/json-c-0.16.tar.gz", + "sha256": "8e45ac8f96ec7791eaf3bb7ee50e9c2100bbbc87b8d0f1d030c5ba8a0288d96b", "x-checker-data": { "type": "anitya", "project-id": 1477, From 1fed7a23b006b63489ba17953fc8df81384db8d1 Mon Sep 17 00:00:00 2001 From: tinywrkb Date: Wed, 29 Jun 2022 17:02:11 +0300 Subject: [PATCH 431/646] flatpak: Add eigen module --- pkg/flatpak/com.solvespace.SolveSpace.json | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index c8658ecd6..235f194ac 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -165,6 +165,27 @@ } ] }, + { + "name": "eigen", + "buildsystem": "cmake-ninja", + "builddir": true, + "sources": [ + { + "type": "archive", + "url": "https://gitlab.com/libeigen/eigen/-/archive/3.4.0/eigen-3.4.0.tar.gz", + "sha256": "8586084f71f9bde545ee7fa6d00288b264a2b7ac3607b974e54d13e7162c1c72", + "x-checker-data": { + "type": "anitya", + "project-id": 13751, + "stable-only": true, + "url-template": "https://gitlab.com/libeigen/eigen/-/archive/$version/eigen-$version.tar.gz" + } + } + ], + "cleanup": [ + "*" + ] + }, { "name": "libjson-c", "buildsystem": "cmake-ninja", From 37c769cc4c7a13c7e6ae0c039a09692036d31101 Mon Sep 17 00:00:00 2001 From: tinywrkb Date: Wed, 29 Jun 2022 17:08:50 +0300 Subject: [PATCH 432/646] flatpak: Use meson buildsystem where possible --- pkg/flatpak/com.solvespace.SolveSpace.json | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index 235f194ac..37947b4d7 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -30,6 +30,7 @@ "modules": [ { "name": "mm-common", + "buildsystem": "meson", "sources": [ { "type": "archive", @@ -45,8 +46,9 @@ }, { "name": "sigc++", + "buildsystem": "meson", "config-opts": [ - "--disable-documentation" + "-Dbuild-examples=false" ], "sources": [ { @@ -67,6 +69,9 @@ { "name": "glibmm", "buildsystem": "meson", + "config-opts": [ + "-Dbuild-examples=false" + ], "sources": [ { "type": "archive", @@ -106,9 +111,7 @@ }, { "name": "pangomm", - "config-opts": [ - "--disable-documentation" - ], + "buildsystem": "meson", "sources": [ { "type": "archive", @@ -127,9 +130,7 @@ }, { "name": "atkmm", - "config-opts": [ - "--disable-documentation" - ], + "buildsystem": "meson", "sources": [ { "type": "archive", From 05147ee1726300867e5780d32d571f2b0a74f8f6 Mon Sep 17 00:00:00 2001 From: tinywrkb Date: Wed, 29 Jun 2022 17:09:50 +0300 Subject: [PATCH 433/646] flatpak: gtkmm: Avoid building demos and tests --- pkg/flatpak/com.solvespace.SolveSpace.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index 37947b4d7..0055318c4 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -150,6 +150,10 @@ { "name": "gtkmm", "buildsystem": "meson", + "config-opts": [ + "-Dbuild-demos=false", + "-Dbuild-tests=false" + ], "sources": [ { "type": "archive", From 78814b678784a6bf85b0e250d5950681964d6265 Mon Sep 17 00:00:00 2001 From: tinywrkb Date: Wed, 29 Jun 2022 17:10:59 +0300 Subject: [PATCH 434/646] flatpak: libjson-c: Enable threading and disable static libs --- pkg/flatpak/com.solvespace.SolveSpace.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index 0055318c4..270cfcf58 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -195,6 +195,10 @@ "name": "libjson-c", "buildsystem": "cmake-ninja", "builddir": true, + "config-opts": [ + "-DBUILD_STATIC_LIBS=OFF", + "-DENABLE_THREADING=ON" + ], "sources": [ { "type": "archive", From 3c3ea005fcdd0149af4ac440bbcffe4e556abdb9 Mon Sep 17 00:00:00 2001 From: tinywrkb Date: Wed, 29 Jun 2022 17:12:01 +0300 Subject: [PATCH 435/646] flatpak: finish-args: Drop unsupported JSON comment and cosmetics --- pkg/flatpak/com.solvespace.SolveSpace.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index 270cfcf58..ab799e4cd 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -5,10 +5,10 @@ "runtime-version": "21.08", "sdk": "org.freedesktop.Sdk", "finish-args": [ + "--device=dri", "--share=ipc", "--socket=fallback-x11", - "--socket=wayland", - "--device=dri" + "--socket=wayland" ], "cleanup": [ "/include", From b20d3b5be218d79ecefd1ea78d7d0425446dcf83 Mon Sep 17 00:00:00 2001 From: tinywrkb Date: Wed, 29 Jun 2022 17:15:59 +0300 Subject: [PATCH 436/646] flatpak: Cosmetics The sources array is usually at the end of a module. Maybe nitpicking, but the module name will be used as a folder name, and camelcase for folder names is less common on Linux. --- pkg/flatpak/com.solvespace.SolveSpace.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index ab799e4cd..4f58f98df 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -151,8 +151,8 @@ "name": "gtkmm", "buildsystem": "meson", "config-opts": [ - "-Dbuild-demos=false", - "-Dbuild-tests=false" + "-Dbuild-demos=false", + "-Dbuild-tests=false" ], "sources": [ { @@ -196,8 +196,8 @@ "buildsystem": "cmake-ninja", "builddir": true, "config-opts": [ - "-DBUILD_STATIC_LIBS=OFF", - "-DENABLE_THREADING=ON" + "-DBUILD_STATIC_LIBS=OFF", + "-DENABLE_THREADING=ON" ], "sources": [ { @@ -214,19 +214,19 @@ ] }, { - "name": "SolveSpace", - "sources": [ - { - "type": "dir", - "path": "../.." - } - ], + "name": "solvespace", "buildsystem": "cmake-ninja", "builddir": true, "config-opts": [ "-DFLATPAK=ON", "-DENABLE_CLI=OFF", "-DENABLE_TESTS=OFF" + ], + "sources": [ + { + "type": "dir", + "path": "../.." + } ] } ] From 6cccbdce3273b10f5e6b556ca9ebd205fd09304c Mon Sep 17 00:00:00 2001 From: tinywrkb Date: Wed, 29 Jun 2022 17:25:06 +0300 Subject: [PATCH 437/646] flatpak: Cleanup: Update and move module specific value to module cleanup arrays --- pkg/flatpak/com.solvespace.SolveSpace.json | 46 ++++++++++++++++------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index 4f58f98df..293513a6a 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -12,19 +12,11 @@ ], "cleanup": [ "/include", - "/lib/*/include", - "*.a", - "*.la", - "*.m4", - "/lib/libslvs*.so*", - "/lib/libglibmm_generate_extra_defs*.so*", - "/share/pkgconfig", - "*.pc", - "/share/man", - "/share/doc", + "/lib/cmake", + "/lib/pkgconfig", "/share/aclocal", - "/bin/mm-common-prepare", - "/share/mm-common" + "/share/pkgconfig", + "*.la" ], "command": "solvespace", "modules": [ @@ -42,6 +34,12 @@ "stable-only": true } } + ], + "cleanup": [ + "/bin", + "/share/doc", + "/share/man", + "/share/mm-common" ] }, { @@ -64,6 +62,9 @@ } } } + ], + "cleanup": [ + "/lib/sigc++-*" ] }, { @@ -86,6 +87,11 @@ } } } + ], + "cleanup": [ + "/lib/giomm-*", + "/lib/glibmm-*", + "/lib/libglibmm_generate_extra_defs-*.so*" ] }, { @@ -107,6 +113,9 @@ } } } + ], + "cleanup": [ + "/lib/cairomm-*" ] }, { @@ -126,6 +135,9 @@ } } } + ], + "cleanup": [ + "/lib/pangomm-*" ] }, { @@ -145,6 +157,9 @@ } } } + ], + "cleanup": [ + "/lib/atkmm-*" ] }, { @@ -168,6 +183,10 @@ } } } + ], + "cleanup": [ + "/lib/gdkmm-*", + "/lib/gtkmm-*" ] }, { @@ -227,6 +246,9 @@ "type": "dir", "path": "../.." } + ], + "cleanup": [ + "/lib/libslvs*.so*" ] } ] From 524bd5e261fbb302c9649b957f79be295c55e174 Mon Sep 17 00:00:00 2001 From: tinywrkb Date: Thu, 30 Jun 2022 19:13:13 +0300 Subject: [PATCH 438/646] flatpak: Keep CLI enabled --- pkg/flatpak/com.solvespace.SolveSpace.json | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index 293513a6a..1d6a8fa91 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -238,7 +238,6 @@ "builddir": true, "config-opts": [ "-DFLATPAK=ON", - "-DENABLE_CLI=OFF", "-DENABLE_TESTS=OFF" ], "sources": [ From 316f71da5dcaeedc58ac0e20806930ae77558335 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 22 Apr 2021 13:31:02 -0500 Subject: [PATCH 439/646] Add a github action to build flatpaks --- .github/workflows/test.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7b66cdb5b..9042b8e8e 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -43,3 +43,19 @@ jobs: - name: Build & Test run: .github/scripts/build-macos.sh debug arm64 && .github/scripts/build-macos.sh debug x86_64 + test_flatpak: + name: Test Flatpak x86_64 + runs-on: ubuntu-latest + container: + image: bilelmoussaoui/flatpak-github-actions:freedesktop-21.08 + options: --privileged + steps: + - uses: actions/checkout@v3 + with: + submodules: true + fetch-depth: 0 + - uses: bilelmoussaoui/flatpak-github-actions/flatpak-builder@v4 + with: + bundle: "solvespace.flatpak" + manifest-path: "pkg/flatpak/com.solvespace.SolveSpace.json" + cache-key: flatpak-builder-${{ github.sha }} From 591808f8ad5a95aa9c4f426112e51dd45c2583b6 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 30 Jun 2022 16:35:28 -0500 Subject: [PATCH 440/646] Update AppStream metadata. --- .../com.solvespace.SolveSpace.metainfo.xml.in | 43 ++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/res/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in b/res/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in index 3e88165bd..0479aae44 100644 --- a/res/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in +++ b/res/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in @@ -19,7 +19,7 @@ SolveSpace is a free (GPLv3) parametric 3d CAD tool. Applications include:

VtZ|}{BQ#~RsQKK?2yClCU{0@?|A04| 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෋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