From 006539b945da2cbc3396b824df6001e6d8bb6097 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 22 Dec 2021 11:53:03 -0600 Subject: [PATCH 01/48] 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 38e1bcf7..70a44e3b 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 7bc5a7cd..61204575 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}) - if(MSVC) - set_target_properties(solvespace PROPERTIES - LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF") + # OpenGL version + if(OPENGL STREQUAL 3) + target_sources(solvespace PRIVATE + render/gl3shader.cpp + render/rendergl3.cpp) + elseif(OPENGL STREQUAL 1) + target_sources(solvespace PRIVATE + render/rendergl1.cpp) + else() + message(FATAL_ERROR "Unsupported OpenGL version ${OPENGL}") + endif() + + # Platform-specific + if(WIN32) + target_sources(solvespace PRIVATE + platform/guiwin.cpp) + + target_link_libraries(solvespace PRIVATE comctl32) elseif(APPLE) + target_compile_options(solvespace PRIVATE -fobjc-arc) + target_compile_definitions(solvespace PRIVATE GL_SILENCE_DEPRECATION) + + target_sources(solvespace PRIVATE + platform/guimac.mm) set_target_properties(solvespace PROPERTIES OUTPUT_NAME SolveSpace XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES" XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.solvespace" RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") + else() + target_sources(solvespace PRIVATE + platform/guigtk.cpp) + + target_include_directories(solvespace PRIVATE SYSTEM + ${GTKMM_INCLUDE_DIRS} + ${JSONC_INCLUDE_DIRS} + ${FONTCONFIG_INCLUDE_DIRS}) + target_link_libraries(solvespace PRIVATE + ${GTKMM_LIBRARIES} + ${JSONC_LIBRARIES} + ${FONTCONFIG_LIBRARIES}) + endif() + + if(MSVC) + set_target_properties(solvespace PROPERTIES + LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF") endif() endif() # solvespace headless library -set(headless_SOURCES +add_library(solvespace-headless STATIC EXCLUDE_FROM_ALL + ${solvespace_core_gl_SOURCES} platform/guinone.cpp render/rendercairo.cpp) -add_library(solvespace-headless STATIC EXCLUDE_FROM_ALL - ${solvespace_core_gl_SOURCES} - ${headless_SOURCES}) - target_compile_definitions(solvespace-headless - PRIVATE -DHEADLESS) + PRIVATE HEADLESS) target_include_directories(solvespace-headless INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(solvespace-headless - solvespace-core - ${CAIRO_LIBRARIES}) - -target_compile_options(solvespace-headless - PRIVATE ${COVERAGE_FLAGS}) + PRIVATE + solvespace-core) # solvespace command-line executable @@ -432,4 +398,4 @@ if(APPLE) COMMENT "Bundling executable solvespace-cli" VERBATIM) endif() -endif() \ No newline at end of file +endif() From 974175dfbce1c4b3b6904f64c5101a283a5d2059 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Wed, 22 Dec 2021 12:53:28 -0600 Subject: [PATCH 02/48] 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 70a44e3b..00069cb7 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 fb6073c3..451063c6 100644 --- a/cmake/FindSpaceWare.cmake +++ b/cmake/FindSpaceWare.cmake @@ -16,7 +16,7 @@ if(UNIX) # Support the REQUIRED and QUIET arguments, and set SPACEWARE_FOUND if found. include(FindPackageHandleStandardArgs) - FIND_PACKAGE_HANDLE_STANDARD_ARGS(SPACEWARE DEFAULT_MSG + find_package_handle_standard_args(SpaceWare DEFAULT_MSG SPACEWARE_LIBRARY SPACEWARE_INCLUDE_DIR) if(SPACEWARE_FOUND) From 708a08f04b910337965859249b87684696369219 Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Wed, 12 Apr 2017 23:29:41 +0700 Subject: [PATCH 03/48] 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 812375f4..dc5a19e4 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -622,7 +622,7 @@ public: 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 7305b8a8..934a5064 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -291,6 +291,9 @@ public: bool andFindBad = false, bool andFindFree = false); void Clear(); + Param *GetLastParamSubstitution(Param *p); + void SubstituteParamsByLast(Expr *e); + void SortSubstitutionByDragged(Param *p); }; #include "ttf.h" diff --git a/src/system.cpp b/src/system.cpp index 1119c343..71712b79 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 7f86a784724298b87e169d1f0fe431119a427115 Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Thu, 11 May 2017 20:53:12 +0700 Subject: [PATCH 04/48] 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 ec8f82eb..aaca6844 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 934a5064..da0b827b 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -261,7 +261,7 @@ public: 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 @@ public: 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 71712b79..baed79c9 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 4d58f95b43ac97a3f09dc7912e1fa1f74ad2c985 Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Thu, 11 May 2017 20:55:41 +0700 Subject: [PATCH 05/48] 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 aaca6844..fdb19b80 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 dc5a19e4..33853d96 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -175,6 +175,7 @@ public: bool suppress; bool relaxConstraints; bool allowRedundant; + bool suppressDofCalculation; bool allDimsReference; double scale; diff --git a/src/system.cpp b/src/system.cpp index baed79c9..f1a3f67c 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 22553827..ba5d977c 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -261,6 +261,8 @@ void TextWindow::ScreenChangeGroupOption(int link, uint32_t v) { case 'e': g->allowRedundant = !(g->allowRedundant); break; + case 'D': g->suppressDofCalculation = !(g->suppressDofCalculation); break; + case 'v': g->visible = !(g->visible); break; case 'd': g->allDimsReference = !(g->allDimsReference); break; @@ -511,6 +513,10 @@ void TextWindow::ShowGroupInfo() { &TextWindow::ScreenChangeGroupOption, g->allowRedundant ? CHECK_TRUE : CHECK_FALSE); + Printf(false, " %f%LD%Fd%s suppress dof calculation (improves solver performance)", + &TextWindow::ScreenChangeGroupOption, + g->suppressDofCalculation ? CHECK_TRUE : CHECK_FALSE); + Printf(false, " %f%Ld%Fd%s treat all dimensions as reference", &TextWindow::ScreenChangeGroupOption, g->allDimsReference ? CHECK_TRUE : CHECK_FALSE); From 2f31673708830ebba69bc710732651f87c46fa1f Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Fri, 12 May 2017 09:39:07 +0700 Subject: [PATCH 06/48] 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 99d68ec4..6030cb1c 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 7109cf65..efd44a58 100644 --- a/src/expr.h +++ b/src/expr.h @@ -70,7 +70,7 @@ public: 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 f1a3f67c..0cfa27df 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 3ba40230ddd2501bb908b845230a61ccf1846efe Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Fri, 12 May 2017 10:02:33 +0700 Subject: [PATCH 07/48] 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 0cfa27df..c93b0a16 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 aec46b608e6b7d67a4b96d52c58d2c3fce8486fb Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Thu, 24 Jun 2021 11:29:24 -0500 Subject: [PATCH 08/48] 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 6030cb1c..b612dd23 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 efd44a58..d59930b8 100644 --- a/src/expr.h +++ b/src/expr.h @@ -73,6 +73,7 @@ public: 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 e528fabbe4e841f5c4ea9d61d2e47c312a96f4f9 Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Thu, 23 Dec 2021 10:14:27 -0600 Subject: [PATCH 09/48] 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 c93b0a16..00f84c45 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 ac91809a962270208963f4793850ec1fc6ce474e Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Mon, 9 Dec 2019 12:09:41 -0600 Subject: [PATCH 10/48] 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 71384a1a..cf428974 100644 --- a/.gitmodules +++ b/.gitmodules @@ -23,3 +23,6 @@ [submodule "extlib/mimalloc"] path = extlib/mimalloc url = https://github.com/microsoft/mimalloc +[submodule "extlib/eigen"] + path = extlib/eigen + url = https://gitlab.com/libeigen/eigen.git diff --git a/extlib/eigen b/extlib/eigen new file mode 160000 index 00000000..3147391d --- /dev/null +++ b/extlib/eigen @@ -0,0 +1 @@ +Subproject commit 3147391d946bb4b6c68edd901f2add6ac1f31f8c From dca5ce607d13f8139374edccaa750fce6678eceb Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 2 Jan 2018 14:35:27 -0600 Subject: [PATCH 11/48] 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 00069cb7..80bf90dc 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 61204575..d812eb76 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 c66e6cbacc914372d1fda3382c32f008ea6115b2 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 13 Dec 2020 16:28:02 +0100 Subject: [PATCH 12/48] 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 53f88b27..6033f735 100755 --- a/.github/scripts/install-ubuntu.sh +++ b/.github/scripts/install-ubuntu.sh @@ -5,6 +5,6 @@ sudo apt-get update -qq sudo apt-get install -q -y \ zlib1g-dev libpng-dev libcairo2-dev libfreetype6-dev libjson-c-dev \ libfontconfig1-dev libgtkmm-3.0-dev libpangomm-1.4-dev libgl-dev \ - libgl-dev libglu-dev libspnav-dev + libgl-dev libglu-dev libspnav-dev -git submodule update --init extlib/libdxfrw extlib/mimalloc +git submodule update --init extlib/libdxfrw extlib/mimalloc extlib/eigen diff --git a/README.md b/README.md index 554e4fca..9c29d381 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 4ad5d42a245eb908062960340e848c4182f8dc0e Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Thu, 24 Jun 2021 12:10:31 +0200 Subject: [PATCH 13/48] 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 be4b13ac..bb39bcd4 100755 --- a/.github/scripts/install-macos.sh +++ b/.github/scripts/install-macos.sh @@ -13,4 +13,4 @@ else brew install libomp fi -git submodule update --init extlib/cairo extlib/freetype extlib/libdxfrw extlib/libpng extlib/mimalloc extlib/pixman extlib/zlib +git submodule update --init extlib/cairo extlib/freetype extlib/libdxfrw extlib/libpng extlib/mimalloc extlib/pixman extlib/zlib extlib/eigen diff --git a/pkg/snap/snap/snapcraft.yaml b/pkg/snap/snap/snapcraft.yaml index 5fe5f7be..84ed2b2e 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 c0f075671bc5ca71e2813dc1861740f8ea03f7bd Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Sun, 14 May 2017 11:23:04 +0700 Subject: [PATCH 14/48] 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 | 233 ++++++++++++++++------------------------------- 3 files changed, 98 insertions(+), 173 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 80bf90dc..ecef9c5b 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 da0b827b..5f3552e4 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 @@ public: // The system Jacobian matrix struct { // The corresponding equation for each row - hEquation eq[MAX_UNKNOWNS]; + std::vector eq; // The corresponding parameter for each column - hParam param[MAX_UNKNOWNS]; + std::vector param; // We're solving AX = B int m, n; struct { - Expr *sym[MAX_UNKNOWNS][MAX_UNKNOWNS]; - double num[MAX_UNKNOWNS][MAX_UNKNOWNS]; - } A; + Eigen::SparseMatrix *sym; + Eigen::SparseMatrix *num; + } A; - double scale[MAX_UNKNOWNS]; - - // Some helpers for the least squares solve - double AAt[MAX_UNKNOWNS][MAX_UNKNOWNS]; - double Z[MAX_UNKNOWNS]; - - double X[MAX_UNKNOWNS]; + Eigen::VectorXd scale; + Eigen::VectorXd X; struct { - Expr *sym[MAX_UNKNOWNS]; - double num[MAX_UNKNOWNS]; - } B; + 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 00f84c45..a3327532 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; - - if(p.tag != tag) - continue; - mat.param[j] = p.h; - j++; + for(Param &p : param) { + if(p.tag != tag) continue; + mat.param.push_back(p.h); } - mat.n = j; + mat.n = mat.param.size(); + + for(Equation &e : eq) { + if(e.tag != tag) continue; + 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->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 605b48e6c0a44f1124739ce686746f7609d3c934 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Sun, 8 Aug 2021 15:13:30 -0500 Subject: [PATCH 15/48] 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 5f3552e4..3aa71640 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 @@ public: // 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 a3327532..5003376f 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 2521dcadc4bfbca0565e2b72b9ae4b2fbdf06233 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Mon, 24 May 2021 22:38:18 +0200 Subject: [PATCH 16/48] 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 5003376f..0cdf8a37 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 42f5d3ab0d7e8ea5481673e179f9b31eaca251f4 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Dec 2021 11:17:40 -0600 Subject: [PATCH 17/48] 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 b612dd23..d5ed87b5 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 d59930b8..7eef4e00 100644 --- a/src/expr.h +++ b/src/expr.h @@ -70,7 +70,7 @@ public: 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 0cdf8a37..cc89d7f2 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 6edeb66e3dcb76721864084987ea04288f01cce9 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Dec 2021 11:37:33 -0600 Subject: [PATCH 18/48] 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 3aa71640..83b868f3 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -246,8 +246,8 @@ public: 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 cc89d7f2..b0cb63f9 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 8ab70c2c8dfc9981d0de2f7b0594014ac4b736d6 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Dec 2021 11:47:02 -0600 Subject: [PATCH 19/48] Fix formatting --- src/system.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/system.cpp b/src/system.cpp index b0cb63f9..873a8c96 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 18dc8ee12ce8709ed3e1aadfb4c8303c1e2cea52 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Dec 2021 11:47:50 -0600 Subject: [PATCH 20/48] Small simplifications --- src/system.cpp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/system.cpp b/src/system.cpp index 873a8c96..d131f119 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 5315a69a1e0df22cba4ba2b11d2c66da4e4486f6 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 21/48] 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 83b868f3..1c22db62 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 74d7db879e8a6f7748378c518163df54a2521766 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 22/48] Update README.md --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 9c29d381..36742c78 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 8f049c5a1417c3dca8089810f5a171d12c540d51 Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 2 Jan 2022 01:56:03 +0100 Subject: [PATCH 23/48] 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 d131f119..a39f69a5 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 b71c7282622b74f3f74a33d7801357d95f8a4d2e Mon Sep 17 00:00:00 2001 From: Koen Schmeets Date: Sun, 2 Jan 2022 13:56:14 +0100 Subject: [PATCH 24/48] 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 84ed2b2e..9695538e 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 34efb6de77edbb4ae2b4d9252124240987895bbf Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Sun, 2 Jan 2022 20:04:57 +0100 Subject: [PATCH 25/48] 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 668d1f7e..1bf29a48 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 9695538e..949c43b6 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 e6e90056..ba50233d 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 d812eb76..a6af09a9 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 144c46d0..5a125f4e 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 39ca23f38e723bba4dfd7a34ec1fa580b5329ce5 Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Sun, 2 Jan 2022 20:50:02 +0100 Subject: [PATCH 26/48] 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 949c43b6..b01b25cf 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 ae4337f06602b7ea2b2ce8dc1cdb215f501401dc Mon Sep 17 00:00:00 2001 From: luzpaz Date: Tue, 4 Jan 2022 05:28:19 -0500 Subject: [PATCH 27/48] 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 df9a65bf..4b7e343a 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 ddb2aa17..e39afc79 100644 --- a/src/ttf.cpp +++ b/src/ttf.cpp @@ -11,7 +11,7 @@ #include FT_ADVANCES_H /* Yecch. Irritatingly, you need to do this nonsense to get the error string table, - since nobody thought to put this exact function into FreeType itsself. */ + since nobody thought to put this exact function into FreeType itself. */ #undef __FTERRORS_H__ #define FT_ERRORDEF(e, v, s) { (e), (s) }, #define FT_ERROR_START_LIST From cc4307a2a90fe9b78692079c39e3abe12cb37d15 Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 4 Jan 2022 12:14:50 +0200 Subject: [PATCH 28/48] 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 ba50233d..1aba0522 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 892477ee43ad5e55201f44cf5a14d3c2b7ea8183 Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 4 Jan 2022 12:16:21 +0200 Subject: [PATCH 29/48] 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 78768871..132ad85a 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 3136493a6a573ee75c7eddf3775a3641d0ac7727 Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 6 Jan 2022 14:58:33 +0200 Subject: [PATCH 30/48] 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 258c73a4..d3fa4caa 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 9ba7ab5544a40b1097356249ed4f07e409c319fe Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 6 Jan 2022 12:37:12 +0200 Subject: [PATCH 31/48] 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 d0755b07..b68c0680 100644 --- a/src/textwin.cpp +++ b/src/textwin.cpp @@ -235,6 +235,7 @@ void TextWindow::Init() { using namespace std::placeholders; window->onClose = []() { + SS.TW.HideEditControl(); SS.GW.showTextWindow = false; SS.GW.EnsureValidActives(); }; From 3d482f0d521156fb84644c8bb14965d5df360fe7 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Thu, 23 Dec 2021 13:06:24 -0600 Subject: [PATCH 32/48] 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 a39f69a5..c513796f 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 3eaa99cb25ea1d7e4bcee6f9eecd3eb597052d84 Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 7 Jan 2022 00:17:57 +0200 Subject: [PATCH 33/48] 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 2c36d988..9dfdac96 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 79a64638566af985590f23431f8cbb5c6b55ca72 Mon Sep 17 00:00:00 2001 From: ruevs Date: Fri, 7 Jan 2022 01:04:07 +0200 Subject: [PATCH 34/48] 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 9dfdac96..d2f94503 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 5efc1480741ad4d6edcf64ca78fff67de5a0dc66 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Sat, 8 Jan 2022 09:25:57 -0600 Subject: [PATCH 35/48] Add some gitignore stuff --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 4f76b266..59755d77 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,8 @@ /obj-*/ /*.slvs .vscode/ + +# Visual Studio +out/ +.vs/ +CMakeSettings.json From f1e47e6554b469ebe2cbac849e6264a3012e4c31 Mon Sep 17 00:00:00 2001 From: herrgahr <0xfd000000@gmail.com> Date: Sun, 9 Jan 2022 13:09:50 +0100 Subject: [PATCH 36/48] 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 f67a844a..674c7a0d 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 bb7a6cbbbaa266c2b8103bd4c0037772b534ff3e Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 13 Jan 2022 12:41:49 +0200 Subject: [PATCH 37/48] 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 674c7a0d..f67a844a 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 f94fc89587560dced31a5a65f74aa4aefc4a9659 Mon Sep 17 00:00:00 2001 From: ruevs Date: Thu, 13 Jan 2022 19:48:46 +0200 Subject: [PATCH 38/48] 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 5a125f4e..187b9cbc 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 cac542ae..c7c74d98 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -183,6 +183,7 @@ const MenuEntry Menu[] = { { 0, N_("&Help"), Command::NONE, 0, KN, mHelp }, { 1, N_("&Language"), Command::LOCALE, 0, KN, mHelp }, { 1, N_("&Website / Manual"), Command::WEBSITE, 0, KN, mHelp }, +{ 1, N_("&Go to GitHub commit"), Command::GITHUB, 0, KN, mHelp }, #ifndef __APPLE__ { 1, N_("&About"), Command::ABOUT, 0, KN, mHelp }, #endif diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 132ad85a..a8d1a151 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 21b00cd4..0d121b64 100644 --- a/src/ui.h +++ b/src/ui.h @@ -172,6 +172,7 @@ enum class Command : uint32_t { // Help LOCALE, WEBSITE, + GITHUB, ABOUT, }; From 5cb299b2bef43634bb6c6e0cb22508b1e16aaa0e Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 16 Jan 2022 22:10:43 +0200 Subject: [PATCH 39/48] Update CHANGELOG.md --- CHANGELOG.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76eb5283..7f6a4af0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,17 @@ Sketching: MISC: +* Add a link to the GitHub commit from which SolveSpace was built in the Help + menu. +* Make all points, vectors and normals shown in the Property Browser into + active links. This makes them explorable and selectable. +* Load 16bit PNG images correctly by re-scaling to 8bit. +* Fixed hang when trying to display characters missing from the embedded font. +* The main window vertical size can be as small as the toolbar. +* Configurable "SafeHeight" parameter instead of the fixed 5mm for G-code export. +* Add Spanish / Argentina translation. +* Move "perspective factor", "lighting direction" and "explode distance" from + the "configuration" screen to the "view" screen. * Add a "∆" suffix to groups which have "force to triangle mesh" ticked * Gray the group name in the text window for groups with suppressed solid model. * Added the ability to Link STL files. @@ -30,6 +41,10 @@ MISC: Performance: +* Speed up sketches with many constraints by roughly 8x by using the Eigen + library in the solver. The maximum unknowns increased from 1024 to 2048. +* Add a "suppress dof calculation" setting to groups - increases performance for + complex sketches. * More changes to the ID list implementation. 3.0 From b399d9a1ec50086cdfc827a43d661ef79052e175 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 40/48] add normals to linked STLs --- src/importmesh.cpp | 90 ++++++++++++++++++++++++++++++---------------- 1 file changed, 59 insertions(+), 31 deletions(-) diff --git a/src/importmesh.cpp b/src/importmesh.cpp index 4b7e343a..7b5bf438 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)); + p[0] = newPoint(el, &id, Vector::From(box.minp.x, box.minp.y, box.minp.z)); + p[1] = newPoint(el, &id, Vector::From(box.maxp.x, box.minp.y, box.minp.z)); + p[2] = newPoint(el, &id, Vector::From(box.minp.x, box.maxp.y, box.minp.z)); + p[3] = newPoint(el, &id, Vector::From(box.maxp.x, box.maxp.y, box.minp.z)); + p[4] = newPoint(el, &id, Vector::From(box.minp.x, box.minp.y, box.maxp.z)); + p[5] = newPoint(el, &id, Vector::From(box.maxp.x, box.minp.y, box.maxp.z)); + p[6] = newPoint(el, &id, Vector::From(box.minp.x, box.maxp.y, box.maxp.z)); + p[7] = newPoint(el, &id, Vector::From(box.maxp.x, box.maxp.y, box.maxp.z)); - newLine(el, id++, p[0], p[1]); - newLine(el, id++, p[0], p[2]); - newLine(el, id++, p[3], p[1]); - newLine(el, id++, p[3], p[2]); + newLine(el, &id, p[0], p[1]); + newLine(el, &id, p[0], p[2]); + newLine(el, &id, p[3], p[1]); + newLine(el, &id, p[3], p[2]); - newLine(el, id++, p[4], p[5]); - newLine(el, id++, p[4], p[6]); - newLine(el, id++, p[7], p[5]); - newLine(el, id++, p[7], p[6]); + newLine(el, &id, p[4], p[5]); + newLine(el, &id, p[4], p[6]); + newLine(el, &id, p[7], p[5]); + newLine(el, &id, p[7], p[6]); - newLine(el, id++, p[0], p[4]); - newLine(el, id++, p[1], p[5]); - newLine(el, id++, p[2], p[6]); - newLine(el, id++, p[3], p[7]); + newLine(el, &id, p[0], p[4]); + newLine(el, &id, p[1], p[5]); + newLine(el, &id, p[2], p[6]); + newLine(el, &id, p[3], p[7]); for(unsigned int i=0; i Date: Mon, 24 Jan 2022 19:19:00 +0200 Subject: [PATCH 41/48] 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 36742c78..14bb49ff 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 61cc28f8b2a80edbf34e832a5b35fdebd449077b 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 42/48] 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 7b5bf438..f06a8f1b 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 a1b2db5e187eb85b85e7ac407e77935973893809 Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 1 Feb 2022 16:28:52 +0200 Subject: [PATCH 43/48] 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 4a5ccb57..9791a538 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2018-07-19 06:55+0000\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" @@ -36,7 +36,7 @@ msgstr "Zwischenablage ist leer; es gibt nichts einzufügen." msgid "Number of copies to paste must be at least one." msgstr "Die Anzahl der einzufügenden Kopien muss mind. 1 sein." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "Maßstab kann nicht Null sein." @@ -66,15 +66,15 @@ msgstr "" msgid "No workplane active." msgstr "Es ist keine Arbeitsebene aktiv." -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Ungültiges Format: geben Sie Koordinaten als x, y, z an" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Ungültiges Format: geben Sie Farben als r, g, b an" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -82,25 +82,25 @@ msgstr "" "Der Perspektivfaktor wird sich nicht auswirken, bis Sie Ansicht -> " "Perspektive Projektion aktivieren." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Geben Sie 0 bis %d Ziffern nach dem Dezimalzeichen an." -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "Der Exportmaßstab darf nicht Null sein!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "Der Werkzeugradialabstand darf nicht negativ sein!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "" "Ungültiger Wert: Interval für automatisches Speichern muss positiv sein" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "Ungültiges Format: geben Sie das Interval in ganzen Minuten an" @@ -684,7 +684,7 @@ msgctxt "button" msgid "&No" msgstr "&Nein" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "&Abbrechen" @@ -1137,25 +1137,29 @@ msgstr "Sprache" msgid "&Website / Manual" msgstr "&Website / Anleitung" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "Über" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(keine vorhergehenden Dateien)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "Datei '%s' existiert nicht." -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "" "Das Raster wird nicht angezeigt, weil keine Arbeitsebene ausgewählt ist." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1169,20 +1173,20 @@ msgstr "" "Ändern Sie den Faktor für die Perspektivprojektion in der " "Konfigurationsmaske. Ein typischer Wert ist ca. 0,3." -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Wählen Sie einen Punkt aus; dieser Punkt wird im Mittelpunkt der " "Bildschirmansicht sein." -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" "Die ausgewählten Objekte teilen keine gemeinsamen Endpunkte mit anderen " "Objekten." -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1190,7 +1194,7 @@ msgstr "" "Für diesen Befehl wählen Sie einen Punkt oder ein anderes Objekt von einem " "verknüpften Teil aus, oder aktivieren Sie eine verknüpfte Gruppe." -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1199,7 +1203,7 @@ msgstr "" "(mit Skizze -> In Arbeitsebene), um die Ebene für das Gitterraster zu " "definieren." -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1208,13 +1212,13 @@ msgstr "" "für Punkte, Textkommentare, oder Einschränkungen mit einer Bezeichnung. Um " "eine Linie auf das Raster auszurichten, wählen Sie deren Endpunkte aus." -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Es wurde keine Arbeitsebene ausgewählt. Die Standard-Arbeitsebene für diese " "Gruppe wird aktiviert." -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1224,7 +1228,7 @@ msgstr "" "standardmäßige Arbeitsebene. Wählen Sie eine Arbeitsebene aus, oder " "erstellen Sie eine Gruppe in einer neuen Arbeitsebene." -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1232,48 +1236,48 @@ msgstr "" "Ungültige Auswahl für Bogentangente an Punkt. Wählen Sie einen einzelnen " "Punkt. Um die Bogenparameter anzugeben, wählen Sie nichts aus." -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "" "Erstellen Sie einen Punkt auf dem Bogen (zeichnet im Gegenuhrzeigersinn)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "Klicken Sie, um einen Bezugspunkt zu platzieren" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "Klicken Sie auf den ersten Punkt des Liniensegments" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "Klicken Sie auf den ersten Punkt der Konstruktionslinie" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "Klicken Sie auf den ersten Punkt der kubischen Linie" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "Klicken Sie auf den Kreismittelpunkt" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "Klicken Sie auf den Ursprungspunkt der Arbeitsebene" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "Klicken Sie auf eine Ecke des Rechtecks" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "Klicken Sie auf die obere linke Ecke des Texts" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "Klicken Sie auf die obere linke Ecke des Bilds" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1428,6 +1432,10 @@ msgstr "Kontur überschneidet sich selbst!" msgid "zero-length edge!" msgstr "Kante mit Länge Null!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Eine Bogentangente kann nur in einer Arbeitsebene erstellt werden." @@ -1630,7 +1638,7 @@ msgstr "" "Das Bild kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace-Modelle" @@ -1725,105 +1733,105 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Werte durch Komma getrennt (CSV)" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "unbenannt" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Datei speichern" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Datei öffnen" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "_Abbrechen" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "_Speichern" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "_Öffnen" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Automatische Sicherungsdatei verfügbar" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Eine automatische Sicherung ist für diese Skizze verfügbar." -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Wollen Sie die automatische Sicherungsdatei stattdessen laden?" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "AutoDatei &öffnen" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "&Nicht laden" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Geänderte Datei" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Wollen Sie die Änderungen an der Skizze “%s” sichern?" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Wollen Sie die Änderungen an der Skizze sichern?" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Ihre Änderungen werden verworfen, wenn sie nicht abgespeichert werden." -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "&Sichern" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "&Verwerfen" # solvespace.cpp:557 -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(Neue Skizze)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Attribut-Browser" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " @@ -1833,7 +1841,7 @@ msgstr "" "wahrscheinlich nicht. Verstecken Sie sie in dem auf den Link oben im " "Textfenster klicken." -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1842,23 +1850,23 @@ msgstr "" "Kann den Dateityp der Datei '%s' nicht auf Grund der Dateierweiterung " "erkennen. Versuchen Sie .dxf oder .dwg." -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" "Die Einschränkung muss einen Namen haben, und darf keine " "Referenzdimensionierung sein." -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "" "Falsche Auswahl für die Schrittdimensionierung. Wählen Sie eine " "Einschränkung." -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "Der Zusammenbau funktioniert, gut." -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1869,7 +1877,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1882,7 +1890,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1894,7 +1902,7 @@ msgstr "" "Gekrümmte Flächen wurden als Dreiecksnetz angenähert.\n" "Das verursacht Fehler, typischerweise um 1%." -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1911,7 +1919,7 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1919,7 +1927,7 @@ msgstr "" "Diese Gruppe beinhaltet keine korrekt geschlossene 2D Fläche. Sie ist offen, " "nicht koplanar, oder überschneidet sich selbst." -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1936,7 +1944,7 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1953,36 +1961,36 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Falsche Auswahl für Umfang. Wähle Liniensegmente, Bögen und Kurven." -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "Falsche Auswahl für Punkt nachzeichnen. Wähle einen einzelnen Punkt." -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "Konnte '%s' nicht schreiben" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Das Netz schneidet sich selbst: Falsch, ungültig." -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Das Netz schneidet sich nicht: Gut, gültig." -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Das Netz hat lose Kanten: Falsch, ungültig." -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "Das Netz hat keine lose Kanten: Gut, gültig." -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1993,7 +2001,7 @@ msgstr "" "\n" "Das Modell hat %d Dreiecke, von %d Flächen." -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -2008,7 +2016,7 @@ msgstr "" "\n" "Keine problematischen Kanten, gut.%s" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -2023,7 +2031,7 @@ msgstr "" "\n" "%d problematische Kanten, schlecht.%s" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2066,23 +2074,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "Name des Linientyps kann nicht leer sein." -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "Nicht weniger als 1 Wiederholung möglich." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "Nicht mehr als 999 Wiederholungen möglich." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "Der Name der Gruppe darf nicht leer sein." -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "Durchsichtigkeit muss zwischen Null und Eins sein." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "Radius darf nicht null oder negativ sein." diff --git a/res/locales/en_US.po b/res/locales/en_US.po index 385d8d76..1d00755e 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -2,12 +2,12 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # Automatically generated, 2017. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -35,7 +35,7 @@ msgstr "Clipboard is empty; nothing to paste." msgid "Number of copies to paste must be at least one." msgstr "Number of copies to paste must be at least one." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "Scale cannot be zero." @@ -63,15 +63,15 @@ msgstr "Too many items to paste; split this into smaller pastes." msgid "No workplane active." msgstr "No workplane active." -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Bad format: specify coordinates as x, y, z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Bad format: specify color as r, g, b" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,24 +79,24 @@ msgstr "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Specify between 0 and %d digits after the decimal." -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "Export scale must not be zero!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "Cutter radius offset must not be negative!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "Bad value: autosave interval should be positive" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "Bad format: specify interval in integral minutes" @@ -677,7 +677,7 @@ msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "&Cancel" @@ -1130,24 +1130,28 @@ msgstr "&Language" msgid "&Website / Manual" msgstr "&Website / Manual" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "&Go to GitHub commit" + +#: graphicswin.cpp:188 msgid "&About" msgstr "&About" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(no recent files)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "File '%s' does not exist." -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "No workplane is active, so the grid will not appear." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1161,17 +1165,17 @@ msgstr "" "For a perspective projection, modify the perspective factor in the " "configuration screen. A value around 0.3 is typical." -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Select a point; this point will become the center of the view on screen." -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "No additional entities share endpoints with the selected entities." -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1179,7 +1183,7 @@ msgstr "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1187,7 +1191,7 @@ msgstr "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1195,11 +1199,11 @@ msgstr "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "No workplane selected. Activating default workplane for this group." -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1209,7 +1213,7 @@ msgstr "" "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1217,47 +1221,47 @@ msgstr "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "click point on arc (draws anti-clockwise)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "click to place datum point" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "click first point of line segment" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "click first point of construction line segment" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "click first point of cubic segment" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "click center of circle" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "click origin of workplane" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "click one corner of rectangle" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "click top left of text" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "click top left of image" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1416,6 +1420,10 @@ msgstr "contour is self-intersecting!" msgid "zero-length edge!" msgstr "zero-length edge!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "Text-formated STL files are not currently supported" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Must be sketching in workplane to create tangent arc." @@ -1610,7 +1618,7 @@ msgstr "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace models" @@ -1705,104 +1713,104 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "untitled" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Save File" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Open File" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "_Cancel" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "_Save" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "_Open" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Autosave Available" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "An autosave file is available for this sketch." -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Do you want to load the autosave file instead?" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "&Load autosave" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "Do&n't Load" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Modified File" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Do you want to save the changes you made to the sketch “%s”?" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Do you want to save the changes you made to the new sketch?" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Your changes will be lost if you don't save them." -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "&Save" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "Do&n't Save" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(new sketch)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Property Browser" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " @@ -1812,7 +1820,7 @@ msgstr "" "is probably not what you want; hide them by clicking the link at the top of " "the text window." -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1821,19 +1829,19 @@ msgstr "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "Constraint must have a label, and must not be a reference dimension." -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "Bad selection for step dimension; select a constraint." -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "The assembly does not interfere, good." -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1844,7 +1852,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1857,7 +1865,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1869,7 +1877,7 @@ msgstr "" "Curved surfaces have been approximated as triangles.\n" "This introduces error, typically of around 1%." -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1886,7 +1894,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1894,7 +1902,7 @@ msgstr "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1911,7 +1919,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1928,36 +1936,36 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Bad selection for perimeter; select line segments, arcs, and curves." -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "Bad selection for trace; select a single point." -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "Couldn't write to '%s'" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "The mesh is self-intersecting (NOT okay, invalid)." -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "The mesh is not self-intersecting (okay, valid)." -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "The mesh has naked edges (NOT okay, invalid)." -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "The mesh is watertight (okay, valid)." -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1968,7 +1976,7 @@ msgstr "" "\n" "The model contains %d triangles, from %d surfaces." -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1983,7 +1991,7 @@ msgstr "" "\n" "Zero problematic edges, good.%s" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -1998,7 +2006,7 @@ msgstr "" "\n" "%d problematic edges, bad.%s" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2039,23 +2047,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "Style name cannot be empty" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "Can't repeat fewer than 1 time." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "Can't repeat more than 999 times." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "Group name cannot be empty" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "Opacity must be between zero and one." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "Radius cannot be zero or negative." diff --git a/res/locales/es_AR.po b/res/locales/es_AR.po index 74638f0a..ac9052f9 100644 --- a/res/locales/es_AR.po +++ b/res/locales/es_AR.po @@ -2,12 +2,12 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # Maxi , 2021. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2021-09-17 \n" "Last-Translator: andesfreedesign@gmail.com\n" "Language-Team: AndesFreeDesign\n" @@ -35,7 +35,7 @@ msgstr "El portapapeles está vacío; nada que pegar." msgid "Number of copies to paste must be at least one." msgstr "El número de copias para pegar debe ser al menos una." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "La escala no puede ser cero." @@ -63,15 +63,15 @@ msgstr "Demasiados elementos para pegar; divida esto en partes más pequeñas." msgid "No workplane active." msgstr "Ningún plano de trabajo activo." -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Formato incorrecto: especifique las coordenadas como x, y, z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Formato incorrecto: especifique color como r, g, b" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,24 +79,24 @@ msgstr "" "El factor de perspectiva no tendrá ningún efecto hasta que habilite Ver -> " "UsarProyección Perspectiva." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Especifique entre 0 y %d dígitos después del decimal." -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "¡La escala de exportación no debe ser cero!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "¡El desfase del radio de corte no debe ser negativo!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "Valor incorrecto: el intervalo de autoguardado debe ser positivo" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "Formato incorrecto: especifique el intervalo en minutos integrales" @@ -676,7 +676,7 @@ msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "&Cancelar" @@ -1129,25 +1129,29 @@ msgstr "&Lenguaje" msgid "&Website / Manual" msgstr "&Sitio Web / Manual" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "&Acerca" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(no hay archivos recientes)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "El archivo '%s' no existe." -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "" "No hay ningún plano de trabajo activo, por lo que la cuadrícula no aparecerá." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1161,20 +1165,20 @@ msgstr "" "Para una proyección en perspectiva, modifique el factor de perspectiva en la " "pantalla de configuración. Un valor de alrededor de 0,3 es típico." -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Seleccione un punto; este punto se convertirá en el centro de la vista en " "pantalla." -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" "Ninguna entidad adicional comparte puntos finales con las entidades " "seleccionadas." -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1182,7 +1186,7 @@ msgstr "" "Para usar este comando, seleccione un punto u otra entidad de una parte " "vinculada, o convertir un grupo de enlaces en el grupo activo." -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1191,7 +1195,7 @@ msgstr "" "Croquis -> En plano de trabajo) para definir el plano para el enganche a la " "cuadrícula." -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1200,13 +1204,13 @@ msgstr "" "comentarios de texto o restricciones con una etiqueta. Para enganchar una " "línea, seleccione sus puntos finales." -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "No se seleccionó ningún plano de trabajo. Activando el plano de trabajo " "predeterminado para este grupo." -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1216,7 +1220,7 @@ msgstr "" "de trabajo. Intente seleccionar un plano de trabajo o activar un croquis-en-" "nuevo-grupo de plano de trabajo." -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1224,47 +1228,47 @@ msgstr "" "Mala selección de arco tangente en el punto. Seleccione un solo punto o no " "seleccione nada para configurar los parámetros del arco." -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "clic en el punto en el arco (dibuja en sentido antihorario)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "clic para colocar el punto de referencia" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "clic en el primer punto del segmento de línea" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "clic en el primer punto del segmento de línea de construcción" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "clic en el primer punto del segmento cúbico" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "clic en el centro del círculo" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "clic en origen del plano de trabajo" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "clic en una esquina del rectángulo" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "clic en la parte superior izquierda del texto" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "clic en la parte superior izquierda de la imagen" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1418,6 +1422,10 @@ msgstr "¡El contorno se intersecta a sí mismo!" msgid "zero-length edge!" msgstr "¡arista de longitud cero!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" @@ -1617,7 +1625,7 @@ msgstr "" "No se puede dibujar una imagen en 3D; primero, active un plano de trabajo " "con Croquis -> En Plano de Trabajo." -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace modelos" @@ -1712,104 +1720,104 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Valores separados por comas" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "sin título" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Guardar Archivo" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Abrir Archivo" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "_Cancelar" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "_Guardar" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "_Abrir" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Autoguardado Disponible" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Un archivo de autoguardado está disponible para este croquis." -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "¿Desea cargar el archivo de autoguardado en su lugar?" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "&Cargar autoguardado" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "No Cargar" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Archivo Modificado" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "¿Desea guardar los cambios que realizó en el croquis “%s”?" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "¿Desea guardar los cambios que realizó en el nuevo croquis?" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Sus cambios se perderán si no los guarda." -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "&Guardar" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "No& Guardar" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(nuevo croquis)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Explorador de Propiedades" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " @@ -1819,7 +1827,7 @@ msgstr "" "Probablemente esto no sea lo que quieres; ocultarlos haciendo clic en el " "enlace en la parte superior de la ventana de texto." -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1828,20 +1836,20 @@ msgstr "" "No se puede identificar el tipo de archivo a partir de la extensión del " "nombre del archivo '%s'; intente .dxf o .dwg." -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" "La restricción debe tener una etiqueta y no debe ser una cota de referencia." -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "Mala selección para la cota del paso; seleccione una restricción." -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "El ensamble no interfiere, bien." -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1852,7 +1860,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1865,7 +1873,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1877,7 +1885,7 @@ msgstr "" "Las superficies curvas se han aproximado como triángulos.\n" "Esto introduce un error, normalmente alrededor del 1%." -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1894,7 +1902,7 @@ msgstr "" "Las curvas se han aproximado como lineales por partes.\n" "Esto introduce un error, normalmente alrededor del 1%%." -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1902,7 +1910,7 @@ msgstr "" "Este grupo no contiene un área cerrada 2d correctamente formada. Está " "abierta, no coplanares, ni auto-intersectantes." -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1919,7 +1927,7 @@ msgstr "" "Las curvas se han aproximado como lineales por partes.\n" "Esto introduce un error, normalmente alrededor del 1%%." -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1936,37 +1944,37 @@ msgstr "" "Las curvas se han aproximado como lineales por partes.\n" "Esto introduce un error, normalmente alrededor del 1%%." -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" "Mala selección de perímetro; seleccione segmentos de línea, arcos y curvas." -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "Mala selección de rastreo; seleccione un solo punto." -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "No pude escribir a '%s'" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "La malla se intersecta a si misma (NO está bien, no es válida)." -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "La malla no se intersecta (está bien, es válida)." -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "La malla tiene bordes desnudos (NO está bien, no es válida)." -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "La malla es estanca (está bien, es válida)." -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1977,7 +1985,7 @@ msgstr "" "\n" "El modelo contiene %d triángulos, desde %d superficies." -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1992,7 +2000,7 @@ msgstr "" "\n" "Cero aristas problemáticas, bien.%s" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -2007,7 +2015,7 @@ msgstr "" "\n" "%d aristas problemáticas, mal.%s" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2048,23 +2056,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "El nombre del estilo no puede estar vacío" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "No se puede repetir menos de 1 vez." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "No se puede repetir más de 999 veces." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "El nombre del grupo no puede estar vacío" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "La opacidad debe estar entre cero y uno." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "El radio no puede ser cero o negativo." diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index 6b5845a7..ec6d3bac 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" @@ -35,7 +35,7 @@ msgstr "Presse papier vide; rien à coller." msgid "Number of copies to paste must be at least one." msgstr "Le nombre de copies à coller doit être d'au moins un." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "L'échelle ne peut pas être zéro." @@ -63,15 +63,15 @@ msgstr "Trop d'éléments à coller; Divisez-les en plus petits groupes." msgid "No workplane active." msgstr "Pas d'espace de travail actif." -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Mauvais format: spécifiez les coordonnées comme x, y, z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Mauvais format; spécifiez la couleur comme r, v, b" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,26 +79,26 @@ msgstr "" "Le facteur de perspective n'aura aucun effet tant que vous n'aurez pas " "activé \"Affichage -> Utiliser la projection de perspective\"." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "L'échelle d'export ne doit pas être zéro!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "Le décalage du rayon de coupe ne doit pas être négatif!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "" "Mauvaise valeur: l'intervalle d'enregistrement automatique devrait être " "positif" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "Mauvais format: spécifiez un nombre entier de minutes" @@ -678,7 +678,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "" @@ -1131,24 +1131,28 @@ msgstr "&Langue" msgid "&Website / Manual" msgstr "&Site web / Manuel" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "&A propos" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(pas de fichier récent)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "Pas de plan de travail actif, donc la grille ne va pas apparaître." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1162,19 +1166,19 @@ msgstr "" "Pour une projection en perspective, modifiez le facteur de perspective dans " "l'écran de configuration. Une valeur d'environ 0,3 est typique." -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Sélectionnez un point. Ce point deviendra le centre de la vue à l'écran." -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" "Aucune entité supplémentaire ne partage des points d'extrémité avec les " "entités sélectionnées." -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1182,7 +1186,7 @@ msgstr "" "Pour utiliser cette commande, sélectionnez un point ou une autre entité à " "partir d'une pièce liée ou créez un groupe de liens dans le groupe actif." -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1190,7 +1194,7 @@ msgstr "" "Aucun plan de travail n'est actif. Activez un plan de travail (avec Dessin -" "> Dans plan de travail) pour définir le plan pour la grille d'accrochage." -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1199,13 +1203,13 @@ msgstr "" "des textes de commentaires ou des contraintes avec une étiquette. Pour " "accrocher une ligne, sélectionnez ses points d'extrémité." -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Aucun plan de travail sélectionné. Activation du plan de travail par défaut " "pour ce groupe." -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1215,7 +1219,7 @@ msgstr "" "de travail par défaut. Essayez de sélectionner un plan de travail ou " "d'activer un groupe de \"Dessin dans nouveau plan travail\"." -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1223,49 +1227,49 @@ msgstr "" "Mauvaise sélection pour l'arc tangent au point. Sélectionnez un seul point, " "ou ne sélectionnez rien pour configurer les paramètres de l'arc." -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "" "cliquez un point sur l'arc (dessine dans le sens inverse des aiguilles d'une " "montre)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "cliquez pour placer un point" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "cliquez le premier point du segment de ligne" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "cliquez le premier point de la ligne de construction" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "cliquez le premier point du segment cubique" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "cliquez pour placer le centre du cercle" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "cliquez pour placer l'origine du plan de travail" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "cliquez un coin du rectangle" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "cliquez le haut à gauche du texte" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "cliquez le haut à gauche de l'image" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1409,6 +1413,10 @@ msgstr "le contour s'entrecroise!" msgid "zero-length edge!" msgstr "arête de longueur nulle!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Vous devez dessiner dans un plan pour créer un arc tangent." @@ -1604,7 +1612,7 @@ msgstr "" "Impossible de dessiner l'image en 3d; D'abord, activez un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1699,130 +1707,130 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "sans nom" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Sauver fichier" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Ouvrir Fichier" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "_Annuler" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "_Sauver" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Sauvegarde automatique existante" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Fichier modifié" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(nouveau dessin)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Navigateur de propriété" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " "the text window." msgstr "" -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1830,7 +1838,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1839,7 +1847,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1847,7 +1855,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1858,13 +1866,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1875,7 +1883,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1886,36 +1894,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1923,7 +1931,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1933,7 +1941,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -1943,7 +1951,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1972,23 +1980,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "Le nom d'un style ne peut pas être vide" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "Je ne peux pas répéter moins de 1 fois." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "Je ne peux pas répéter plus de 999 fois." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "Un nom de groupe ne peut pas être vide" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "L'opacité doit être entre 0 et 1." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "Le rayon ne peut pas être zéro ou négatif." diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index d688a75c..bf9bbfbb 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2021-10-04 15:33+0300\n" "Last-Translator: Olesya Gerasimenko \n" "Language-Team: Basealt Translation Team\n" @@ -36,7 +36,7 @@ msgstr "Буфер обмена пуст; нечего вставлять." msgid "Number of copies to paste must be at least one." msgstr "Укажите в поле 'количество' хотя бы одну копию для вставки." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "Масштабный коэффициент не может быть нулевым." @@ -63,15 +63,15 @@ msgstr "Слишком много элементов для вставки; ра msgid "No workplane active." msgstr "Рабочая плоскость не активна" -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Неверный формат: введите координаты как x, y, z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Неверный формат: введите цвет как r, g, b" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,25 +79,25 @@ msgstr "" "Коэффициент перспективы не будет иметь эффект, пока вы не включите Вид-" ">Перспективная Проекция." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Введите число от 0 до %d." -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "Масштабный коэффициент не может быть нулевым!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "Радиус режущего инструмента не может быть отрицательным!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "" "Неверное значение: интервал автосохранения должен быть положительным числом" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "" "Неверный формат: введите целое число, чтобы задать интервал автосохранения" @@ -405,8 +405,8 @@ msgid "" " * two arcs\n" " * one arc and one line segment\n" msgstr "" -"Неправильное выделение для ограничения 'отношение длин'. Ограничение может" -" принимать в качестве выделения следующие примитивы:\n" +"Неправильное выделение для ограничения 'отношение длин'. Ограничение может " +"принимать в качестве выделения следующие примитивы:\n" "\n" " * два отрезка\n" " * две дуги\n" @@ -421,8 +421,8 @@ msgid "" " * two arcs\n" " * one arc and one line segment\n" msgstr "" -"Неправильное выделение для ограничения 'разность длин'. Ограничение может" -" принимать в качестве выделения следующие примитивы:\n" +"Неправильное выделение для ограничения 'разность длин'. Ограничение может " +"принимать в качестве выделения следующие примитивы:\n" "\n" " * два отрезка\n" " * две дуги\n" @@ -693,7 +693,7 @@ msgctxt "button" msgid "&No" msgstr "Нет" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "Отменить" @@ -1146,24 +1146,28 @@ msgstr "&Язык" msgid "&Website / Manual" msgstr "Вебсайт / &Справка" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "О &Программе" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(пусто)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "Файл '%s' не существует." -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "Сетку не будет видно, пока рабочая плоскость не активирована." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1177,16 +1181,16 @@ msgstr "" "перспективы на конфигурационной странице браузера.\n" "Значение по умолчанию 0.3." -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "Выделите точку. Вид будет отцентрован по этой точке." -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "Нет дополнительных объектов, соединенных с выбранными примитивами." -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1195,7 +1199,7 @@ msgstr "" "принадлежащий импортированной детали, или активируйте группу импортированной " "детали." -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1203,7 +1207,7 @@ msgstr "" "Рабочая плоскость не активна. Активируйте ее через Эскиз -> В Рабочей " "Плоскости чтобы определить плоскость для сетки." -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1212,13 +1216,13 @@ msgstr "" "текстовые комментарии или ограничения с размерными значениями. Чтобы " "привязать отрезок или другой примитив, выбирайте его точки." -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Рабочая плоскость не активна. Активирована рабочая плоскость по умолчанию " "для данной группы." -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1228,7 +1232,7 @@ msgstr "" "по умолчанию. Попробуйте выделить рабочую плоскость или создать новую с " "помощью Группа -> Создать Эскиз в Новой Рабочей Плоскости." -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1237,54 +1241,54 @@ msgstr "" "точку, либо запустите команду без выделения, чтобы перейти к окну настроек " "этой команды." -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "" "кликните мышью там, где хотите создать дугу окружности (дуга будет " "нарисована против часовой стрелки)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "кликните мышью там, где хотите создать опорную точку" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "кликните мышью там, где хотите создать первую точку отрезка" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "" "кликните мышью там, где хотите создать первую точку вспомогательного отрезка" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "" "кликните мышью там, где хотите создать первую точку кубического сплайна Безье" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "кликните мышью там, где будет находиться центр окружности" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "" "кликните мышью там, где будет находиться точка, через которую будет " "построена рабочая плоскость" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "кликните мышью там, где будет находиться один из углов прямоугольника" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "кликните мышью там, где хотите создать текст" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "" "кликните мышью там, где будет расположен левый верхний угол изображения" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1307,9 +1311,8 @@ msgid "" " * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -"Неправильное выделение для создания эскиза в рабочей плоскости. Группа может" -" быть создана, используя в качестве выделения следующие " -"примитивы:\n" +"Неправильное выделение для создания эскиза в рабочей плоскости. Группа может " +"быть создана, используя в качестве выделения следующие примитивы:\n" "\n" " * точку (через точку, ортогонально осям координат)\n" " * точку и два отрезка (через точку, параллельно отрезкам)\n" @@ -1462,6 +1465,10 @@ msgstr "контур имеет самопересечения!" msgid "zero-length edge!" msgstr "вырожденный отрезок!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" @@ -1659,7 +1666,7 @@ msgid "" "Workplane." msgstr "Невозможно создать изображение. Активируйте рабочую плоскость." -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "проекты SolveSpace" @@ -1754,104 +1761,104 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "CSV файлы (значения, разделенные запятой)" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "без имени" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Сохранить Файл" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Открыть Файл" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "Отменить" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "Сохранить" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "_Открыть" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Автосохранение Доступно" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Автоматически сохраненный файл доступен для данного проекта." -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Хотите загрузить автосохраненный файл вместо исходного?" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "&Загрузить Автосохранение" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "&Не Загружать" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Измененный Файл" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Сохранить изменения, сделанные в файле “%s”?" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Сохранить изменения, сделанные в новом проекте?" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Изменения будут утеряны, если их не сохранить." -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "&Сохранить" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "&Не Сохранять" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(новый проект)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Браузер" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " @@ -1861,7 +1868,7 @@ msgstr "" "это не то, что требуется, если так, необходимо спрятать их, нажав ссылку " "вверху окна Браузера." -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1870,21 +1877,21 @@ msgstr "" "Неподдерживаемый тип файла '%s'. Поддерживаются файлы с расширением .dxf и ." "dwg." -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "У ограничения должно быть значение и оно не должно быть справочным." -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "" "Неправильное выделение для операции изменения значения с заданным шагом; " "необходимо выбрать ограничение со значением." -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "Сборка не содержит пересечения деталей - это хорошо." -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1895,7 +1902,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1908,7 +1915,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1920,7 +1927,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%." -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1937,7 +1944,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1945,7 +1952,7 @@ msgstr "" "Эта группа не содержит замкнутых областей. В ней нет замкнутых контуров, " "примитивы не лежат в одной плоскости или самопересекаются." -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1962,7 +1969,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1979,38 +1986,38 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" "Неправильное выделение для расчета периметра; необходимо выбирать только " "отрезки, дуги и кривые в качестве исходных данных" -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "Неправильное выделение для трассировки; необходимо выбрать одну точку." -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "Невозможно записать в '%s'" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Полигональная сетка содержит самопересечения (это плохо)" -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Полигональная сетка не содержит самопересечений (это хорошо)" -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Полигональная сетка содержит \"оголенные\" ребра (это плохо)" -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "Полигональная сетка герметична (это хорошо)" -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -2021,7 +2028,7 @@ msgstr "" "\n" "Модель содержит %d треугольников, содержащихся в %d поверхностях." -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -2036,7 +2043,7 @@ msgstr "" "\n" "Нет проблемных ребер - это хорошо.%s" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -2051,7 +2058,7 @@ msgstr "" "\n" "%d найдены проблемные ребра - это плохо.%s" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2094,23 +2101,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "Имя стиля не может быть пустым." -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "Невозможно сделать повторение меньше, чем 1 раз." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "Невозможно сделать повтор больше, чем 999 раз." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "Имя группы не может быть пустым." -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "Прозрачность должна быть числом от нуля до единицы." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "Радиус не может быть нулевым или отрицательным." diff --git a/res/locales/tr_TR.po b/res/locales/tr_TR.po index de82270f..aa55f1cd 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 8192a6b6..ee4c8fb2 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2021-04-14 01:42+0300\n" "Last-Translator: https://github.com/Symbian9\n" "Language-Team: app4soft\n" @@ -35,7 +35,7 @@ msgstr "Буфер обміну порожній; немає чого встав msgid "Number of copies to paste must be at least one." msgstr "Кількість копій для вставки має бути не менше одної." -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "Масштаб не може бути нульовим." @@ -62,15 +62,15 @@ msgstr "Забагато об'єктів для вставки; рзділіть msgid "No workplane active." msgstr "Немає активної площини." -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "Некоректний формат: визначте координати X, Y, Z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "Некоректний формат: визначте колір як R, G, B" -#: confscreen.cpp:412 +#: confscreen.cpp:417 #, fuzzy msgid "" "The perspective factor will have no effect until you enable View -> Use " @@ -79,24 +79,24 @@ msgstr "" "Значення перспективи не матиме ефекту допоки не ввімкнено Вигляд -> " "Використовувати Перспективну проєкцію." -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Визначте кількість десяткових знаків від 0 до %d." -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "Масштаб експорту не може бути нульовим!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "Радіус відступу різання не може бути від'ємним!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "Некоректне значення: інтервал автозбереження має бути додатнім" -#: confscreen.cpp:521 +#: confscreen.cpp:531 #, fuzzy msgid "Bad format: specify interval in integral minutes" msgstr "Некоректний формат: визначте цілим числом інтервал у хвилинах" @@ -579,7 +579,7 @@ msgctxt "button" msgid "&No" msgstr "&Ні" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "&Відмінити" @@ -1032,24 +1032,28 @@ msgstr "&Мова" msgid "&Website / Manual" msgstr "&Вебсайт / Посібник" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "&Про програму" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(нємає нещодавніх файлів)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "Файл '%s' відсутній." -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "Відсутня активна площина - сітка не відображатиметься." -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1058,91 +1062,91 @@ msgid "" "configuration screen. A value around 0.3 is typical." msgstr "" -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." msgstr "" -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." msgstr "" -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." msgstr "" -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "клікніть для встановлення вихідної точки" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "клікніть першу точку прямої лінії" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "клікніть першу точку конструктивної прямої лінії" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "клікніть першу точку кривої" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "клікніть в місце де буде центр коментаря" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "клікніть в центр відліку площини" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "клікніть для встановлення першого кута прямокутника" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "клікніть для встановлення верхньої лівої межі тексту" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "клікніть для встановлення верхньої лівої межі зображення" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1271,6 +1275,10 @@ msgstr "контур самоперетинається!" msgid "zero-length edge!" msgstr "ребро нульової довжини!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" @@ -1452,7 +1460,7 @@ msgid "" "Workplane." msgstr "" -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace модель" @@ -1547,130 +1555,130 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "без імені" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Зберегти Файл" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Відкрити Файл" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "_Скасувати" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "_Зберегти" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "_Відкрити" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "Наявні автозбереження" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Наявні автозбереження для цього креслення." -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Завантажити файл автозбереження?" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "&Завантажити автозбереження" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "&Не Завантажувати" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "Файл Змінено" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Чи хочете ви зберегти зміни зроблені вами у ескізі “%s”?" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Чи хочете ви зберегти зміни зроблені вами у новому ескізі?" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Ваші зміни буде втрачено якщо ви не збережете їх." -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "&Зберегти" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "&Не Зберігати" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "(нове креслення)" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "Браузер Властивостей" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " "the text window." msgstr "" -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "Обмежувач має містити мітку і бути не відносним розміром." -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "Поганий вибір для крокової зміни розміру; оберіть обмежувач." -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1681,7 +1689,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1694,7 +1702,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1702,7 +1710,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1713,7 +1721,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1721,7 +1729,7 @@ msgstr "" "Ця група не місить коректно сформованого замкненої 2D площини. Вона " "відкрита, не компланарна, або ж самоперетинається." -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1738,7 +1746,7 @@ msgstr "" "Криві наближено до ламаних ліній.\n" "Це вносить похибку, зазвичай близько 1%%." -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1755,36 +1763,36 @@ msgstr "" "Криві наближено до ламаних ліній.\n" "Це вносить похибку, зазвичай близько 1%%." -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Поганий вибір для периметру; оберіть відрізки, дуги та криві." -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "Поганий вибір для вістежування шляху; оберіть одну точку." -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "Неможливо записати у '%s'" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Меш самоперетинається (НЕ добре, недійсний)." -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Меш самоперетинається (добре, дійсний)." -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Меш містить оголені ребра (НЕ добре, недійсний)." -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "Меш водонепроникний (добре, дійсний)." -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1792,7 +1800,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1807,7 +1815,7 @@ msgstr "" "\n" "Відсутні проблемні ребра, добре.%s" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -1822,7 +1830,7 @@ msgstr "" "\n" "%d проблемних ребер, погано.%s" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1863,23 +1871,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "Стиль не може містити порожнє ім'я" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "Не можливо повторити менше 1 разу." -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "Не можливо повторити понад 999 разів." -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "Група не може містити порожнє ім'я" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "Непрозорість має бути між 0 та 1." -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "Радіус не може бути нульовим чи від'ємним." diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index 7768124e..5cbf6997 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -2,12 +2,12 @@ # Copyright (C) 2020 the PACKAGE authors # This file is distributed under the same license as the SolveSpace package. # , 2020. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: 2021-04-03 13:10-0400\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" @@ -35,7 +35,7 @@ msgstr "剪贴板为空;没有要粘贴的内容。" msgid "Number of copies to paste must be at least one." msgstr "要粘贴的副本数必须至少为 1 个。" -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "缩放不能为零。" @@ -61,38 +61,38 @@ msgstr "要粘贴的项目太多; 请把他们拆分。" msgid "No workplane active." msgstr "没有工作平面处于活动状态。" -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "格式错误:将坐标指定为 x、y、z" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "格式错误:将颜色指定为 r、g、b" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." msgstr "在启用\"视图 -= 使用透视投影\"之前,透视因子将不起作用。" -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "在十进制之后指定 0 和 %d 数字之间。" -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "输出比例不能为零!" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "刀具半径偏移不能为负数!" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "坏值:自动保存间隔应为正" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "格式错误:以整数分钟为单位指定间隔" @@ -632,7 +632,7 @@ msgctxt "button" msgid "&No" msgstr "否(&N)" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "取消(&C)" @@ -1085,24 +1085,28 @@ msgstr "语言(&L)" msgid "&Website / Manual" msgstr "网页/手册(&W)" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "关于(&A)" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "(无文件)" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "文件不存在: \"%s\"。" -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "没有激活的工作面,因此无法显示轴网。" -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1111,91 +1115,91 @@ msgid "" "configuration screen. A value around 0.3 is typical." msgstr "" -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." msgstr "" -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." msgstr "" -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." msgstr "" -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "点击弧线的点(逆时针方向绘制)" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "点击放置基准点" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "点击线条的起点" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "点击构造线的起点" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "点击立方体的起点" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "点击圆弧的中心" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "点击工作面的原点" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "点击一个矩形倒角" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "点击文字左上角" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "点击图片左上角" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1326,6 +1330,10 @@ msgstr "轮廓自相交!" msgid "zero-length edge!" msgstr "边缘长度为零!" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" @@ -1505,7 +1513,7 @@ msgid "" "Workplane." msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 激活工作面。" -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace模型" @@ -1600,130 +1608,130 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "逗号分隔数据" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "未命名" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "保存文件" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "打开文件" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "取消_C" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "保存_S" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "打开_O" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " "the text window." msgstr "" -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1731,7 +1739,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1740,7 +1748,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1748,7 +1756,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1759,13 +1767,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1776,7 +1784,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1787,36 +1795,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1824,7 +1832,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1834,7 +1842,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -1844,7 +1852,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1871,23 +1879,23 @@ msgstr "无法将样式分配给派生自其他实体的实体;尝试将样式 msgid "Style name cannot be empty" msgstr "样式名称不能为空" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "不能重复少于 1 次。" -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "重复不超过 999 次。" -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "组名称不能为空" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "不透明度必须在零和 1 之间。" -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "半径偏移不能为负数。" diff --git a/res/messages.pot b/res/messages.pot index 25a6c1cf..bf8c9803 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"POT-Creation-Date: 2022-02-01 16:24+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -32,7 +32,7 @@ msgstr "" msgid "Number of copies to paste must be at least one." msgstr "" -#: clipboard.cpp:389 textscreens.cpp:827 +#: clipboard.cpp:389 textscreens.cpp:833 msgid "Scale cannot be zero." msgstr "" @@ -56,37 +56,37 @@ msgstr "" msgid "No workplane active." msgstr "" -#: confscreen.cpp:376 +#: confscreen.cpp:381 msgid "Bad format: specify coordinates as x, y, z" msgstr "" -#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 +#: confscreen.cpp:391 style.cpp:729 textscreens.cpp:864 msgid "Bad format: specify color as r, g, b" msgstr "" -#: confscreen.cpp:412 +#: confscreen.cpp:417 msgid "" "The perspective factor will have no effect until you enable View -> Use Perspective Projection." msgstr "" -#: confscreen.cpp:430 confscreen.cpp:440 +#: confscreen.cpp:435 confscreen.cpp:445 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:452 +#: confscreen.cpp:457 msgid "Export scale must not be zero!" msgstr "" -#: confscreen.cpp:464 +#: confscreen.cpp:469 msgid "Cutter radius offset must not be negative!" msgstr "" -#: confscreen.cpp:518 +#: confscreen.cpp:528 msgid "Bad value: autosave interval should be positive" msgstr "" -#: confscreen.cpp:521 +#: confscreen.cpp:531 msgid "Bad format: specify interval in integral minutes" msgstr "" @@ -538,7 +538,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:877 solvespace.cpp:610 +#: file.cpp:877 solvespace.cpp:611 msgctxt "button" msgid "&Cancel" msgstr "" @@ -991,24 +991,28 @@ msgstr "" msgid "&Website / Manual" msgstr "" -#: graphicswin.cpp:187 +#: graphicswin.cpp:186 +msgid "&Go to GitHub commit" +msgstr "" + +#: graphicswin.cpp:188 msgid "&About" msgstr "" -#: graphicswin.cpp:361 +#: graphicswin.cpp:362 msgid "(no recent files)" msgstr "" -#: graphicswin.cpp:369 +#: graphicswin.cpp:370 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:736 +#: graphicswin.cpp:737 msgid "No workplane is active, so the grid will not appear." msgstr "" -#: graphicswin.cpp:751 +#: graphicswin.cpp:752 msgid "" "The perspective factor is set to zero, so the view will always be a parallel projection.\n" "\n" @@ -1016,89 +1020,89 @@ msgid "" "around 0.3 is typical." msgstr "" -#: graphicswin.cpp:836 +#: graphicswin.cpp:837 msgid "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1136 +#: graphicswin.cpp:1137 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1154 +#: graphicswin.cpp:1155 msgid "" "To use this command, select a point or other entity from an linked part, or make a link group the " "active group." msgstr "" -#: graphicswin.cpp:1177 +#: graphicswin.cpp:1178 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) to define the plane " "for the snap grid." msgstr "" -#: graphicswin.cpp:1184 +#: graphicswin.cpp:1185 msgid "" "Can't snap these items to grid; select points, text comments, or constraints with a label. To " "snap a line, select its endpoints." msgstr "" -#: graphicswin.cpp:1269 +#: graphicswin.cpp:1270 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1272 +#: graphicswin.cpp:1273 msgid "" "No workplane is selected, and the active group does not have a default workplane. Try selecting a " "workplane, or activating a sketch-in-new-workplane group." msgstr "" -#: graphicswin.cpp:1293 +#: graphicswin.cpp:1294 msgid "" "Bad selection for tangent arc at point. Select a single point, or select nothing to set up arc " "parameters." msgstr "" -#: graphicswin.cpp:1304 +#: graphicswin.cpp:1305 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1305 +#: graphicswin.cpp:1306 msgid "click to place datum point" msgstr "" -#: graphicswin.cpp:1306 +#: graphicswin.cpp:1307 msgid "click first point of line segment" msgstr "" -#: graphicswin.cpp:1308 +#: graphicswin.cpp:1309 msgid "click first point of construction line segment" msgstr "" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1310 msgid "click first point of cubic segment" msgstr "" -#: graphicswin.cpp:1310 +#: graphicswin.cpp:1311 msgid "click center of circle" msgstr "" -#: graphicswin.cpp:1311 +#: graphicswin.cpp:1312 msgid "click origin of workplane" msgstr "" -#: graphicswin.cpp:1312 +#: graphicswin.cpp:1313 msgid "click one corner of rectangle" msgstr "" -#: graphicswin.cpp:1313 +#: graphicswin.cpp:1314 msgid "click top left of text" msgstr "" -#: graphicswin.cpp:1319 +#: graphicswin.cpp:1320 msgid "click top left of image" msgstr "" -#: graphicswin.cpp:1345 +#: graphicswin.cpp:1346 msgid "No entities are selected. Select entities before trying to toggle their construction state." msgstr "" @@ -1221,6 +1225,10 @@ msgstr "" msgid "zero-length edge!" msgstr "" +#: importmesh.cpp:136 +msgid "Text-formated STL files are not currently supported" +msgstr "" + #: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" @@ -1391,7 +1399,7 @@ msgstr "" msgid "Can't draw image in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:553 msgctxt "file-type" msgid "SolveSpace models" msgstr "" @@ -1486,127 +1494,127 @@ msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +#: platform/guigtk.cpp:1382 platform/guimac.mm:1509 platform/guiwin.cpp:1641 msgid "untitled" msgstr "" -#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guigtk.cpp:1393 platform/guigtk.cpp:1426 platform/guimac.mm:1467 #: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "" -#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guigtk.cpp:1394 platform/guigtk.cpp:1427 platform/guimac.mm:1450 #: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "" -#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +#: platform/guigtk.cpp:1397 platform/guigtk.cpp:1433 msgctxt "button" msgid "_Cancel" msgstr "" -#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +#: platform/guigtk.cpp:1398 platform/guigtk.cpp:1431 msgctxt "button" msgid "_Save" msgstr "" -#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +#: platform/guigtk.cpp:1399 platform/guigtk.cpp:1432 msgctxt "button" msgid "_Open" msgstr "" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "title" msgid "Autosave Available" msgstr "" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:173 +#: solvespace.cpp:174 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:175 +#: solvespace.cpp:176 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:598 +#: solvespace.cpp:599 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:600 +#: solvespace.cpp:601 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:603 +#: solvespace.cpp:604 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:606 +#: solvespace.cpp:607 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:607 +#: solvespace.cpp:608 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:609 +#: solvespace.cpp:610 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:630 +#: solvespace.cpp:631 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:637 +#: solvespace.cpp:638 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:699 +#: solvespace.cpp:700 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This is probably not what " "you want; hide them by clicking the link at the top of the text window." msgstr "" -#: solvespace.cpp:771 +#: solvespace.cpp:772 #, c-format msgid "Can't identify file type from file extension of filename '%s'; try .dxf or .dwg." msgstr "" -#: solvespace.cpp:823 +#: solvespace.cpp:824 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:827 +#: solvespace.cpp:828 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:852 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:867 +#: solvespace.cpp:868 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1614,7 +1622,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:876 +#: solvespace.cpp:877 #, c-format msgid "" "\n" @@ -1623,7 +1631,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:881 +#: solvespace.cpp:882 msgid "" "\n" "\n" @@ -1631,7 +1639,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:896 +#: solvespace.cpp:897 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1642,13 +1650,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:905 +#: solvespace.cpp:906 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, not coplanar, or self-" "intersecting." msgstr "" -#: solvespace.cpp:917 +#: solvespace.cpp:918 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1659,7 +1667,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:937 +#: solvespace.cpp:938 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1670,36 +1678,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:943 +#: solvespace.cpp:944 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:959 +#: solvespace.cpp:960 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:986 +#: solvespace.cpp:987 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:1016 +#: solvespace.cpp:1017 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1017 +#: solvespace.cpp:1018 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:1019 +#: solvespace.cpp:1020 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:1020 +#: solvespace.cpp:1021 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:1023 +#: solvespace.cpp:1024 #, c-format msgid "" "\n" @@ -1707,7 +1715,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:1027 +#: solvespace.cpp:1028 #, c-format msgid "" "%s\n" @@ -1717,7 +1725,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:1030 +#: solvespace.cpp:1031 #, c-format msgid "" "%s\n" @@ -1727,7 +1735,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:1043 +#: solvespace.cpp:1044 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1754,23 +1762,23 @@ msgstr "" msgid "Style name cannot be empty" msgstr "" -#: textscreens.cpp:785 +#: textscreens.cpp:791 msgid "Can't repeat fewer than 1 time." msgstr "" -#: textscreens.cpp:789 +#: textscreens.cpp:795 msgid "Can't repeat more than 999 times." msgstr "" -#: textscreens.cpp:814 +#: textscreens.cpp:820 msgid "Group name cannot be empty" msgstr "" -#: textscreens.cpp:866 +#: textscreens.cpp:872 msgid "Opacity must be between zero and one." msgstr "" -#: textscreens.cpp:901 +#: textscreens.cpp:907 msgid "Radius cannot be zero or negative." msgstr "" From 7fa72500c8c7eaddcf1e294a41de6fc59b7e14ea 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 44/48] 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 aa55f1cd..71558fce 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 465506670ceaa1f2004b7aa8d5979c9622b3d565 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 45/48] 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 1cb1a1b8..174bab58 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 026f9369894bd526e049ee0fbf2ee928ffdde612 Mon Sep 17 00:00:00 2001 From: ruevs Date: Tue, 1 Feb 2022 18:29:34 +0200 Subject: [PATCH 46/48] 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 174bab58..529fce64 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 43795f5dac16ca086b02d1d33aeed23fb699bb8d Mon Sep 17 00:00:00 2001 From: Maximilian Federle Date: Fri, 4 Feb 2022 10:36:46 +0100 Subject: [PATCH 47/48] 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 00000000..8bc06221 --- /dev/null +++ b/.github/workflows/source-tarball.yml @@ -0,0 +1,51 @@ +name: Source Tarball + +on: + release: + types: + - created + +jobs: + create_tarball: + name: Create & Upload Tarball + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: true + fetch-depth: 0 + - name: Pack Tarball + id: pack_tarball + run: | + version="${GITHUB_REF#refs/tags/v}" + dir_name="solvespace-${version}" + archive_name="${dir_name}.tar.xz" + archive_path="${HOME}/${archive_name}" + + echo "::set-output name=archive_name::${archive_name}" + echo "::set-output name=archive_path::${archive_path}" + + cd .. + tar \ + --exclude-vcs \ + --transform "s:^solvespace:${dir_name}:" \ + -cvaf \ + ${archive_path} \ + solvespace + - name: Get Release Upload URL + id: get_upload_url + env: + event: ${{ toJson(github.event) }} + run: | + upload_url=$(echo "$event" | jq -r ".release.upload_url") + echo "::set-output name=upload_url::$upload_url" + echo "Upload URL: $upload_url" + - name: Upload Tarball + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.get_upload_url.outputs.upload_url }} + asset_path: ${{ steps.pack_tarball.outputs.archive_path }} + asset_name: ${{ steps.pack_tarball.outputs.archive_name }} + asset_content_type: binary/octet-stream From d8b5281fc997e60370a3309a576b1636c97c9de5 Mon Sep 17 00:00:00 2001 From: ruevs Date: Sun, 6 Feb 2022 23:40:45 +0200 Subject: [PATCH 48/48] 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 1bf29a48..b39a9e21 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