diff --git a/.github/scripts/build-macos.sh b/.github/scripts/build-macos.sh index bb4c1e0c..3394a8af 100755 --- a/.github/scripts/build-macos.sh +++ b/.github/scripts/build-macos.sh @@ -1,27 +1,52 @@ #!/bin/sh -xe -mkdir build || true -cd build - -OSX_TARGET="10.9" - +ENABLE_SANITIZERS="OFF" if [ "$1" = "release" ]; then - BUILD_TYPE=RelWithDebInfo - cmake \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_TARGET}" \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ - -DENABLE_OPENMP="ON" \ - -DENABLE_LTO="ON" \ - .. + BUILD_TYPE="RelWithDebInfo" + ENABLE_LTO="ON" else - BUILD_TYPE=Debug - cmake \ - -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_TARGET}" \ - -DCMAKE_BUILD_TYPE="${BUILD_TYPE}" \ - -DENABLE_OPENMP="ON" \ - -DENABLE_SANITIZERS="ON" \ - .. + BUILD_TYPE="Debug" + ENABLE_LTO="OFF" fi -cmake --build . --config "${BUILD_TYPE}" -- -j$(nproc) -make -j$(nproc) test_solvespace +# this is an option for our Github CI only, since it doesn't have a macos arm64 image yet +CMAKE_GENERATOR="Unix Makefiles" +CMAKE_PREFIX_PATH="" +if [ "$2" = "arm64" ]; then + OSX_ARCHITECTURE="arm64" + CMAKE_PREFIX_PATH=$(find /tmp/libomp-arm64/libomp -depth 1) + git apply cmake/libpng-macos-arm64.patch || echo "Could not apply patch, probably already patched..." + mkdir build-arm64 || true + cd build-arm64 +elif [ "$2" = "x86_64" ]; then + OSX_ARCHITECTURE="x86_64" + CMAKE_PREFIX_PATH=$(find /tmp/libomp-x86_64/libomp -depth 1) + mkdir build || true + cd build +else + mkdir build || true + cd build +fi + +if [ "$3" = "xcode" ]; then + CMAKE_GENERATOR="Xcode" +fi + +cmake \ + -G "${CMAKE_GENERATOR}" \ + -D CMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}" \ + -D CMAKE_OSX_ARCHITECTURES="${OSX_ARCHITECTURE}" \ + -D CMAKE_BUILD_TYPE="${BUILD_TYPE}" \ + -D ENABLE_OPENMP="ON" \ + -D ENABLE_SANITIZERS="${ENABLE_SANITIZERS}" \ + -D ENABLE_LTO="${ENABLE_LTO}" \ + .. + +if [ "$3" = "xcode" ]; then + open solvespace.xcodeproj +else + cmake --build . --config "${BUILD_TYPE}" -j$(sysctl -n hw.logicalcpu) + if [ $(uname -m) = "$2" ]; then + make -j$(sysctl -n hw.logicalcpu) test_solvespace + fi +fi \ No newline at end of file diff --git a/.github/scripts/install-macos.sh b/.github/scripts/install-macos.sh index 457dd5d4..be4b13ac 100755 --- a/.github/scripts/install-macos.sh +++ b/.github/scripts/install-macos.sh @@ -1,4 +1,16 @@ #!/bin/sh -xe -brew install libomp -git submodule update --init \ No newline at end of file +if [ "$1" = "ci" ]; then + armloc=$(brew fetch --bottle-tag=arm64_big_sur libomp | grep -i downloaded | grep tar.gz | cut -f2 -d:) + x64loc=$(brew fetch --bottle-tag=big_sur libomp | grep -i downloaded | grep tar.gz | cut -f2 -d:) + cp $armloc /tmp/libomp-arm64.tar.gz + mkdir /tmp/libomp-arm64 || true + tar -xzvf /tmp/libomp-arm64.tar.gz -C /tmp/libomp-arm64 + cp $x64loc /tmp/libomp-x86_64.tar.gz + mkdir /tmp/libomp-x86_64 || true + tar -xzvf /tmp/libomp-x86_64.tar.gz -C /tmp/libomp-x86_64 +else + brew install libomp +fi + +git submodule update --init extlib/cairo extlib/freetype extlib/libdxfrw extlib/libpng extlib/mimalloc extlib/pixman extlib/zlib diff --git a/.github/scripts/sign-macos.sh b/.github/scripts/sign-macos.sh index c23dab99..8e944d3e 100755 --- a/.github/scripts/sign-macos.sh +++ b/.github/scripts/sign-macos.sh @@ -1,8 +1,29 @@ #!/bin/bash -xe +lipo \ + -create \ + build/bin/SolveSpace.app/Contents/Resources/libomp.dylib \ + build-arm64/bin/SolveSpace.app/Contents/Resources/libomp.dylib \ + -output \ + build/bin/SolveSpace.app/Contents/Resources/libomp.dylib + +lipo \ + -create \ + build/bin/SolveSpace.app/Contents/MacOS/SolveSpace \ + build-arm64/bin/SolveSpace.app/Contents/MacOS/SolveSpace \ + -output \ + build/bin/SolveSpace.app/Contents/MacOS/SolveSpace + +lipo \ + -create \ + build/bin/SolveSpace.app/Contents/MacOS/solvespace-cli \ + build-arm64/bin/SolveSpace.app/Contents/MacOS/solvespace-cli \ + -output \ + build/bin/SolveSpace.app/Contents/MacOS/solvespace-cli + cd build -openmp="bin/SolveSpace.app/Contents/Resources/lib/libomp.dylib" +openmp="bin/SolveSpace.app/Contents/Resources/libomp.dylib" app="bin/SolveSpace.app" dmg="bin/SolveSpace.dmg" bundle_id="com.solvespace.solvespace" diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 4cf7ab40..abfaba33 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -9,17 +9,27 @@ on: - created jobs: + cancel_previous_runs: + runs-on: ubuntu-latest + name: Cancel Previous Runs + steps: + - uses: styfle/cancel-workflow-action@0.8.0 + with: + access_token: ${{ github.token }} + test_ubuntu: - runs-on: ubuntu-18.04 - name: Test Ubuntu - steps: - - uses: actions/checkout@v2 - - name: Install Dependencies - run: .github/scripts/install-ubuntu.sh - - name: Build & Test - run: .github/scripts/build-ubuntu.sh + needs: [cancel_previous_runs] + runs-on: ubuntu-18.04 + name: Test Ubuntu + steps: + - uses: actions/checkout@v2 + - name: Install Dependencies + run: .github/scripts/install-ubuntu.sh + - name: Build & Test + run: .github/scripts/build-ubuntu.sh test_windows: + needs: [cancel_previous_runs] runs-on: windows-2019 name: Test Windows steps: @@ -32,14 +42,15 @@ jobs: shell: bash test_macos: - runs-on: macos-latest + needs: [cancel_previous_runs] + runs-on: macos-10.15 name: Test macOS steps: - uses: actions/checkout@v2 - name: Install Dependencies - run: .github/scripts/install-macos.sh + run: .github/scripts/install-macos.sh ci - name: Build & Test - run: .github/scripts/build-macos.sh + run: .github/scripts/build-macos.sh debug arm64 && .github/scripts/build-macos.sh debug x86_64 build_release_windows: needs: [test_ubuntu, test_windows, test_macos] @@ -80,13 +91,13 @@ jobs: build_release_macos: needs: [test_ubuntu, test_windows, test_macos] name: Build Release macOS - runs-on: macos-latest + runs-on: macos-10.15 steps: - uses: actions/checkout@v2 - name: Install Dependencies - run: .github/scripts/install-macos.sh + run: .github/scripts/install-macos.sh ci - name: Build & Test - run: .github/scripts/build-macos.sh release + run: .github/scripts/build-macos.sh release arm64 && .github/scripts/build-macos.sh release x86_64 - name: Sign Build run: .github/scripts/sign-macos.sh env: @@ -100,13 +111,15 @@ jobs: with: name: macos path: build/bin/SolveSpace.dmg - + deploy_snap_amd64: needs: [test_ubuntu, test_windows, test_macos] name: Deploy AMD64 Snap runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - name: Fetch Tags + run: git fetch --force --tags - name: Set Up Source run: rsync --filter=":- .gitignore" -r ./ pkg/snap/solvespace-snap-src - name: Build Snap @@ -128,14 +141,18 @@ jobs: store_login: ${{ secrets.SNAPSTORE_LOGIN }} snap: ${{ steps.build.outputs.snap }} release: edge,beta - + deploy_snap_arm64: needs: [test_ubuntu, test_windows, test_macos] name: Deploy ARM64 Snap runs-on: ubuntu-latest steps: - uses: docker/setup-qemu-action@v1 + with: + image: tonistiigi/binfmt@sha256:df15403e06a03c2f461c1f7938b171fda34a5849eb63a70e2a2109ed5a778bde - uses: actions/checkout@v2 + - name: Fetch Tags + run: git fetch --force --tags - name: Set Up Source run: rsync --filter=":- .gitignore" -r ./ pkg/snap/solvespace-snap-src - name: Build Snap @@ -158,38 +175,11 @@ jobs: store_login: ${{ secrets.SNAPSTORE_LOGIN }} snap: ${{ steps.build.outputs.snap }} release: edge,beta - - update_edge_release: - name: Update Edge Release - needs: [build_release_windows, build_release_windows_openmp, build_release_macos] - if: always() && github.event_name == 'push' - runs-on: ubuntu-latest - outputs: - upload_url: ${{ steps.create_release.outputs.upload_url }} - steps: - - name: Delete Old Edge Release - uses: dev-drprasad/delete-tag-and-release@v0.1.2 - with: - delete_release: true - tag_name: edge - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Create New Edge Release - id: create_release - uses: actions/create-release@v1 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: edge - release_name: Edge - prerelease: true - draft: false - body: ${{ github.event.head_commit.message }} upload_release_assets: name: Upload Release Assets - needs: [build_release_windows, build_release_windows_openmp, build_release_macos, update_edge_release] - if: always() + needs: [build_release_windows, build_release_windows_openmp, build_release_macos] + if: "!cancelled() && github.event_name == 'release'" runs-on: ubuntu-latest steps: - name: Download All Workflow Artifacts @@ -197,15 +187,9 @@ jobs: - name: Get Release Upload URL id: get_upload_url env: - event_name: ${{ github.event_name }} event: ${{ toJson(github.event) }} - edge_upload_url: ${{ needs.update_edge_release.outputs.upload_url }} run: | - if [ "$event_name" = "release" ]; then - upload_url=$(echo "$event" | jq -r ".release.upload_url") - else - upload_url="$edge_upload_url" - fi + upload_url=$(echo "$event" | jq -r ".release.upload_url") echo "::set-output name=upload_url::$upload_url" echo "Upload URL: $upload_url" - name: Upload solvespace.exe diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 27462aef..1ca64b3a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,11 +34,11 @@ jobs: shell: bash test_macos: - runs-on: macos-latest + runs-on: macos-10.15 name: Test macOS steps: - uses: actions/checkout@v2 - name: Install Dependencies - run: .github/scripts/install-macos.sh + run: .github/scripts/install-macos.sh ci - name: Build & Test - run: .github/scripts/build-macos.sh + run: .github/scripts/build-macos.sh debug arm64 && .github/scripts/build-macos.sh debug x86_64 diff --git a/CHANGELOG.md b/CHANGELOG.md index f70812ec..76eb5283 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,284 +1,330 @@ Changelog ========= +3.x - since the 3.0 release, only available in edge builds +--- + +Constraints: + +* Arcs length ratio and difference. +* Arc & Line length ratio and difference. +* Allow comments to be associated with point entities. + +Sketching: + +* Support for pan, zoom and rotate trackpad gestures on macOS +* Add "exploded view" to sketches via "\\" key. Shows sketch elements separated + by a configurable distance perpendicular to the sketch plane. +* Added Feet-Inches as a unit of measure. Inputs are still in inches. + But the display shows feet, inches, and fraction of an inch. +* Added an optional "pitch" parameter to helix extrusions (in the text window) +* Allow use of Point & Normal to define "sketch-in-new-workplane". +* Update "Property Browser" live while dragging the sketch. + +MISC: + +* Add a "∆" suffix to groups which have "force to triangle mesh" ticked +* Gray the group name in the text window for groups with suppressed solid model. +* Added the ability to Link STL files. +* When linking circuit boards (IDF .emn files) show keepout regions as construction entities. + +Performance: + +* More changes to the ID list implementation. + 3.0 --- New sketch features: - * New intersection boolean operation for solid models. - * New groups, revolution and helical extrusion. - * Extrude, lathe, translate and rotate groups can use the "assembly" - boolean operation, to increase performance. - * The solid model of extrude and lathe groups can be suppressed, - for splitting a single model in multiple parts to export, - or if only the generated entities are desired, without the mesh. - * Translate and rotate groups can create n-dimensional arrays using - the "difference" and "assembly" boolean operations. - * A new sketch in workplane group can be created based on existing workplane. - * TTF text request has two additional points on the right side, which allow - constraining the width of text. - * Image requests can now be created, similar to TTF text requests. - This replaces the "style → background image" feature. - * Irrelevant points (e.g. arc center point) are not counted when estimating - the bounding box used to compute chord tolerance. - * When adding a constraint which has a label and is redundant with another - constraint, the constraint is added as a reference, avoiding an error. - * Datum points can be copied and pasted. - * "Split Curves at Intersection" can now split curves at point lying on curve, - not just at intersection of two curves. - * Property browser now shows amount of degrees of freedom in group list. - It also shows a yellow "err" if the sketch has problems (e.g. self - intersecting) that would propagate in subsequent groups. - * It is now possible to press "g" to toggle construction on new objects while - they are still being drawn. + +* New intersection boolean operation for solid models. +* New groups, revolution and helical extrusion. +* Extrude, lathe, translate and rotate groups can use the "assembly" + boolean operation, to increase performance. +* The solid model of extrude and lathe groups can be suppressed, + for splitting a single model in multiple parts to export, + or if only the generated entities are desired, without the mesh. +* Translate and rotate groups can create n-dimensional arrays using + the "difference" and "assembly" boolean operations. +* A new sketch in workplane group can be created based on existing workplane. +* TTF text request has two additional points on the right side, which allow + constraining the width of text. +* Image requests can now be created, similar to TTF text requests. + This replaces the "style → background image" feature. +* Irrelevant points (e.g. arc center point) are not counted when estimating + the bounding box used to compute chord tolerance. +* When adding a constraint which has a label and is redundant with another + constraint, the constraint is added as a reference, avoiding an error. +* Datum points can be copied and pasted. +* "Split Curves at Intersection" can now split curves at point lying on curve, + not just at intersection of two curves. +* Property browser now shows amount of degrees of freedom in group list. + It also shows a yellow "err" if the sketch has problems (e.g. self + intersecting) that would propagate in subsequent groups. +* It is now possible to press "g" to toggle construction on new objects while + they are still being drawn. +* Allow right click to end sketching of all entities. New constraint features: - * When dragging an arc or rectangle point, it will be automatically - constrained to other points with a click. - * When selecting a constraint, the requests it constraints can be selected - in the text window. - * When selecting an entity, the constraints applied to it can be selected - in the text window. - * Distance constraint labels can now be formatted to use SI prefixes. - Values are edited in the configured unit regardless of label format. - * When creating a constraint, if an exactly identical constraint already - exists, it is now selected instead of adding a redundant constraint. - * It is now possible to turn off automatic creation of horizontal/vertical - constraints on line segments. - * Automatic creation of constraints no longer happens if the constraint - would have been redundant with other ones. - * New option to open the constraint editor for newly created constraints - with a value. - * New "redundant constraint timeout (in ms)" option to prevent UI freeze - when looking for redundant constraints. - * Swap vertical and horizontal constraints when pasting rotated by 90/270 - degrees. + +* When dragging an arc or rectangle point, it will be automatically + constrained to other points with a click. +* When selecting a constraint, the requests it constraints can be selected + in the text window. +* When selecting an entity, the constraints applied to it can be selected + in the text window. +* Distance constraint labels can now be formatted to use SI prefixes. + Values are edited in the configured unit regardless of label format. +* When creating a constraint, if an exactly identical constraint already + exists, it is now selected instead of adding a redundant constraint. +* It is now possible to turn off automatic creation of horizontal/vertical + constraints on line segments. +* Automatic creation of constraints no longer happens if the constraint + would have been redundant with other ones. +* New option to open the constraint editor for newly created constraints + with a value. +* New "redundant constraint timeout (in ms)" option to prevent UI freeze + when looking for redundant constraints. +* Swap vertical and horizontal constraints when pasting rotated by 90/270 + degrees. New export/import features: - * Link IDF circuit boards in an assembly (.emn files) - * Three.js: allow configuring projection for exported model, and initially - use the current viewport projection. - * Wavefront OBJ: a material file is exported alongside the model, containing - mesh color information. - * DXF/DWG: 3D DXF files are imported as construction entities, in 3d. - * [ADDED 2019-02-25](https://github.com/solvespace/solvespace/pull/384) and [REMOVED 2020-11-13](https://github.com/solvespace/solvespace/issues/795): - Q3D: [Q3D](https://github.com/q3k/q3d/) triangle meshes can now be - exported. This format allows to easily hack on triangle mesh data created - in SolveSpace, supports colour information and is more space efficient than - most other formats. - * VRML (WRL) triangle meshes can now be exported, useful for e.g. [KiCAD](http://kicad.org). - * Export 2d section: custom styled entities that lie in the same - plane as the exported section are included. - * Added ExportBackgroundColor in configuration for EPS, PDF, and SVG files. - * STEP export includes object colors and transparency. + +* Link IDF circuit boards in an assembly (.emn files) +* Three.js: allow configuring projection for exported model, and initially + use the current viewport projection. +* Wavefront OBJ: a material file is exported alongside the model, containing + mesh color information. +* DXF/DWG: 3D DXF files are imported as construction entities, in 3d. +* VRML (WRL) triangle meshes can now be exported, useful for e.g. [KiCAD](http://kicad.org). +* Export 2d section: custom styled entities that lie in the same + plane as the exported section are included. +* Added ExportBackgroundColor in configuration for EPS, PDF, and SVG files. +* STEP export includes object colors and transparency. +* Default "line styles" have a new "export these objects" option. New rendering features: - * The "Show/hide hidden lines" button is now a tri-state button that allows - showing all lines (on top of shaded mesh), stippling occluded lines - or not drawing them at all. - * The "Show/hide outlines" button is now independent from "Show/hide edges". - * "View | Darken Inactive Solids" added. When turned off and a "sketch in plane" - group is active solids form previous groups will not be "darkened" (have the - s000d-#def-dim-solid style applied to them). + +* The "Show/hide hidden lines" button is now a tri-state button that allows + showing all lines (on top of shaded mesh), stippling occluded lines + or not drawing them at all. +* The "Show/hide outlines" button is now independent from "Show/hide edges". +* "View | Darken Inactive Solids" added. When turned off and a "sketch in plane" + group is active solids form previous groups will not be "darkened" (have the + s000d-#def-dim-solid style applied to them). New measurement/analysis features: - * New choice for base unit, meters. - * New command for measuring total length of selected entities, - "Analyze → Measure Perimeter". - * New command for measuring center of mass, with live updates as the sketch - changes, "Analyze → Center of Mass". - * New option for displaying areas of closed contours. - * When calculating volume of the mesh, volume of the solid from the current - group is now shown alongside total volume of all solids. - * When calculating area, and faces are selected, calculate area of those faces - instead of the closed contour in the sketch. - * When selecting a point and a line, projected distance to current - workplane is displayed. + +* New choice for base unit, meters. +* New command for measuring total length of selected entities, + "Analyze → Measure Perimeter". +* New command for measuring center of mass, with live updates as the sketch + changes, "Analyze → Center of Mass". +* New option for displaying areas of closed contours. +* When calculating volume of the mesh, volume of the solid from the current + group is now shown alongside total volume of all solids. +* When calculating area, and faces are selected, calculate area of those faces + instead of the closed contour in the sketch. +* When selecting a point and a line, projected distance to current + workplane is displayed. Other new features: - * Improvements to the text window for selected entities and constraints. - * Ambient light source added in text window to allow flat shaded renderings. - * New command-line interface, for batch exporting and more. - * The graphical interface now supports HiDPI screens on every OS. - * New option to lock Z axis to be always vertical, like in SketchUp. - * New button to hide all construction entities. - * New link to match the on-screen size of the sketch with its actual size, - "view → set to full scale". - * When zooming to fit, constraints are also considered. - * Ctrl-clicking entities now deselects them, as the inverse of clicking. - * When clicking on an entity that shares a place with other entities, - the entity from the current group is selected. - * When dragging an entity that shares a place with other entities, - the entity from a request is selected. For example, dragging a point on - a face of an extrusion coincident with the source sketch plane will - drag the point from the source sketch. - * The default font for TTF text is now Bitstream Vera Sans, which is - included in the resources such that it is available on any OS. - * In expressions, numbers can contain the digit group separator, "_". - * The "=" key is bound to "Zoom In", like "+" key. - * The numpad decimal separator key is bound to "." regardless of locale. - * On Windows, full-screen mode is implemented. - * On Linux, native file chooser dialog can be used. - * New edit menu items "Line Styles", "View Projection" and "Configuration" - that are shortcuts to the respective configuration screens. - * New cmake build options using -DENABLE_OPENMP=yes and -DENABLE_LTO=yes - to enable support for multi-threading and link-time optimization. - * "Shift+Scroll" for ten times finer zoom. - * Chinese translation + +* Improvements to the text window for selected entities and constraints. +* Ambient light source added in text window to allow flat shaded renderings. +* New command-line interface, for batch exporting and more. +* The graphical interface now supports HiDPI screens on every OS. +* New option to lock Z axis to be always vertical when rotating the view, + a.k.a. "turntable navigation". +* New button to hide all construction entities. +* New link to match the on-screen size of the sketch with its actual size, + "view → set to full scale". +* When zooming to fit, constraints are also considered. +* Ctrl-clicking entities now deselects them, as the inverse of clicking. +* When clicking on an entity that shares a place with other entities, + the entity from the current group is selected. +* When dragging an entity that shares a place with other entities, + the entity from a request is selected. For example, dragging a point on + a face of an extrusion coincident with the source sketch plane will + drag the point from the source sketch. +* The default font for TTF text is now Bitstream Vera Sans, which is + included in the resources such that it is available on any OS. +* In expressions, numbers can contain the digit group separator, "_". +* The "=" key is bound to "Zoom In", like "+" key. +* The numpad decimal separator key is bound to "." regardless of locale. +* On Windows, full-screen mode is implemented. +* On Linux, native file chooser dialog can be used. +* New edit menu items "Line Styles", "View Projection" and "Configuration" + that are shortcuts to the respective configuration screens. +* New cmake build options using -DENABLE_OPENMP=yes and -DENABLE_LTO=yes + to enable support for multi-threading and link-time optimization. +* "Shift+Scroll" for ten times finer zoom. +* Translations: Chinese, French, German, Russian, Turkish, Ukrainian. Bugs fixed: - * Fixed broken --view options for command line thumbnail image creation. - * Some errors in Triangulation of surfaces. - * Some NURNS boolean operations that failed particularly on surfaces - created with Lathe, Revolve, or Helix. - * Segfault in Remove Spline Point context menu. - * A point in 3d constrained to any line whose length is free no longer - causes the line length to collapse. - * Curve-line constraints (in 3d), parallel constraints (in 3d), and - same orientation constraints are more robust. - * Adding some constraints (vertical, midpoint, etc) twice errors out - immediately, instead of later and in a confusing way. - * Constraining a newly placed point to a hovered entity does not cause - spurious changes in the sketch. - * Points highlighted with "Analyze → Show Degrees of Freedom" are drawn - on top of all other geometry. - * A step rotate/translate group using a group forced to triangle mesh - as a source group also gets forced to triangle mesh. - * Paste Transformed with a negative scale does not invert arcs. - * The tangent arc now modifies the original entities instead of deleting - them, such that their constraints are retained. - * When linking a sketch file, missing custom styles are now imported from - the linked file. - * 3Dconnexion SpaceMouse should now work (on Windows and macOS X). - * Improved NURBS boolean operations on curved surfaces in some cases. - * Show only usable fonts in the font selector. + +* Fixed broken --view options for command line thumbnail image creation. +* Some errors in Triangulation of surfaces. +* Some NURNS boolean operations that failed particularly on surfaces + created with Lathe, Revolve, or Helix. +* Segfault in Remove Spline Point context menu. +* A point in 3d constrained to any line whose length is free no longer + causes the line length to collapse. +* Curve-line constraints (in 3d), parallel constraints (in 3d), and + same orientation constraints are more robust. +* Adding some constraints (vertical, midpoint, etc) twice errors out + immediately, instead of later and in a confusing way. +* Constraining a newly placed point to a hovered entity does not cause + spurious changes in the sketch. +* Points highlighted with "Analyze → Show Degrees of Freedom" are drawn + on top of all other geometry. +* A step rotate/translate group using a group forced to triangle mesh + as a source group also gets forced to triangle mesh. +* Paste Transformed with a negative scale does not invert arcs. +* The tangent arc now modifies the original entities instead of deleting + them, such that their constraints are retained. +* When linking a sketch file, missing custom styles are now imported from + the linked file. +* 3Dconnexion SpaceMouse should now work (on Windows and macOS X). +* Improved NURBS boolean operations on curved surfaces in some cases. +* Show only usable fonts in the font selector. 2.x --- Bug fixes: - * Do not crash when changing an unconstrained lathe group between - union and difference modes. + +* Do not crash when changing an unconstrained lathe group between + union and difference modes. 2.3 --- Bug fixes: - * Do not crash when applying a symmetry constraint to two points. - * Fix TTF font metrics again (properly this time). - * Fix the "draw back faces in red" option. - * Fix export of wireframe as 3D DXF. - * Various minor crashes. + +* Do not crash when applying a symmetry constraint to two points. +* Fix TTF font metrics again (properly this time). +* Fix the "draw back faces in red" option. +* Fix export of wireframe as 3D DXF. +* Various minor crashes. 2.2 --- Other new features: - * OS X: support 3Dconnexion devices (SpaceMouse, SpaceNavigator, etc). - * GTK: files with uppercase extensions can be opened. + +* OS X: support 3Dconnexion devices (SpaceMouse, SpaceNavigator, etc). +* GTK: files with uppercase extensions can be opened. Bug fixes: - * Do not remove autosaves after successfully opening a file, preventing - data loss in case of two abnormal terminations in a row. - * Do not crash when changing autosave interval. - * Unbreak the "Show degrees of freedom" command. - * Three.js: correctly respond to controls when browser zoom is used. - * OS X: do not completely hide main window when defocused. - * GTK: unbreak 3Dconnexion support. - * When pasting transformed entities, multiply constraint values by scale. - * Fix TTF font metrics (restore the behavior from version 2.0). - * Forcibly show the current group once we start a drawing operation. - * DXF export: always declare layers before using them. - * Do not truncate operations on selections to first 32 selected entities. - * Translate and rotate groups inherit the "suppress solid model" setting. - * DXF: files with paths containing non-ASCII or spaces can be exported - or imported. - * Significantly improved performance when dragging an entity. - * Various crashes and minor glitches. + +* Do not remove autosaves after successfully opening a file, preventing + data loss in case of two abnormal terminations in a row. +* Do not crash when changing autosave interval. +* Unbreak the "Show degrees of freedom" command. +* Three.js: correctly respond to controls when browser zoom is used. +* OS X: do not completely hide main window when defocused. +* GTK: unbreak 3Dconnexion support. +* When pasting transformed entities, multiply constraint values by scale. +* Fix TTF font metrics (restore the behavior from version 2.0). +* Forcibly show the current group once we start a drawing operation. +* DXF export: always declare layers before using them. +* Do not truncate operations on selections to first 32 selected entities. +* Translate and rotate groups inherit the "suppress solid model" setting. +* DXF: files with paths containing non-ASCII or spaces can be exported + or imported. +* Significantly improved performance when dragging an entity. +* Various crashes and minor glitches. 2.1 --- New sketch features: - * Lathe groups create circle and face entities. - * New toolbar button for creating lathe groups. - * Chord tolerance is separated into two: display chord tolerance (specified - in percents, relative to model bounding box), and export chord tolerance - (specified in millimeters as absolute value). - * Bezier spline points can be added and removed after the spline is created. - * When an unconstrained extrusion is switched between "union" and - "difference", its normal is flipped. - * Groups can be added in the middle of the stack. Note that this results - in files incompatible with version 2.0. - * Active group can be removed. - * Removing an imported group does not cause all subsequent groups to also - be removed. - * When a new group with a solid is created, the color is taken from - a previous group with a solid, if any. - * Entities in a newly active group do not become visible. - * When entities are selected, "Zoom to fit" zooms to fit only these - entities and not the entire sketch. - * Zero-length edges are reported with a "zero-length error", not - "points not all coplanar". + +* Lathe groups create circle and face entities. +* New toolbar button for creating lathe groups. +* Chord tolerance is separated into two: display chord tolerance (specified + in percents, relative to model bounding box), and export chord tolerance + (specified in millimeters as absolute value). +* Bezier spline points can be added and removed after the spline is created. +* When an unconstrained extrusion is switched between "union" and + "difference", its normal is flipped. +* Groups can be added in the middle of the stack. Note that this results + in files incompatible with version 2.0. +* Active group can be removed. +* Removing an imported group does not cause all subsequent groups to also + be removed. +* When a new group with a solid is created, the color is taken from + a previous group with a solid, if any. +* Entities in a newly active group do not become visible. +* When entities are selected, "Zoom to fit" zooms to fit only these + entities and not the entire sketch. +* Zero-length edges are reported with a "zero-length error", not + "points not all coplanar". New constraint features: - * Height of the font used for drawing constraint labels can be changed. - * New constraint, length difference, placed with J. - (Patch by Peter Ruevski) - * Horizontal/vertical constraints are automatically added if a line segment - is close enough to being horizontal/vertical. This can be disabled by - holding Ctrl. - * Reference dimensions and angles can be placed with Shift+D and Shift+N. - * Copying and pasting entities duplicates any constraints that only involve - entities in the clipboard, as well as selected comments. - * Diameter constraints can be shown as radius. - * The "pi" identifier can be used in expressions. - * Constraint labels can be snapped to grid. - * Integer angles are displayed without trailing zeroes. - * Angle constraints have proper reference lines and arrowheads. - * Extension lines are drawn for point-line distance constraints. + +* Height of the font used for drawing constraint labels can be changed. +* New constraint, length difference, placed with J. + (Patch by Peter Ruevski) +* Horizontal/vertical constraints are automatically added if a line segment + is close enough to being horizontal/vertical. This can be disabled by + holding Ctrl. +* Reference dimensions and angles can be placed with Shift+D and Shift+N. +* Copying and pasting entities duplicates any constraints that only involve + entities in the clipboard, as well as selected comments. +* Diameter constraints can be shown as radius. +* The "pi" identifier can be used in expressions. +* Constraint labels can be snapped to grid. +* Integer angles are displayed without trailing zeroes. +* Angle constraints have proper reference lines and arrowheads. +* Extension lines are drawn for point-line distance constraints. New solver features: - * Sketches with redundant and unsolvable constraints are distinguished. - * New group setting, "allow redundant constraints". Note that it makes - the solver less stable. + +* Sketches with redundant and unsolvable constraints are distinguished. +* New group setting, "allow redundant constraints". Note that it makes + the solver less stable. New rendering and styling features: - * New line style parameter: stippling, based on ISO 128. - * Outlines of solids can be drawn in a particular style (by default, thick - lines) controlled by the "Show outline of solid model" button. - * Occluded edges can be drawn in a particular style (by default, stippled - with short dashes) controlled by the "Show hidden lines" button. - * Solids can be made transparent. + +* New line style parameter: stippling, based on ISO 128. +* Outlines of solids can be drawn in a particular style (by default, thick + lines) controlled by the "Show outline of solid model" button. +* Occluded edges can be drawn in a particular style (by default, stippled + with short dashes) controlled by the "Show hidden lines" button. +* Solids can be made transparent. New export/import features: - * The old "import" command (for .slvs files) is renamed to "link". - * If a linked .slvs file is not found, first the relative path recorded - in the .slvs file is checked and then the absolute path; this is - an inversion of the previously used order. If it is still not found, - a dialog appears offering to locate it. - * DXF and DWG files can be imported, with point-coincident, horizontal and - vertical constraints automatically inferred from geometry, and distance - and angle constraints created when a dimension placed against geometry - exists. - * Triangle mesh can be exported for viewing in the browser through WebGL. - * Export dialogs remember the last file format used, and preselect it. - * Exported DXF files have exact circles, arcs and splines instead of - a piecewise linear approximation (unless hidden line removal was needed). - * Exported DXF files preserve color and line thickness. - * In exported DXF files, constraints are represented as DXF dimensions, - instead of piecewise linear geometry. - * When exporting 2d views, overlapping lines are removed. + +* The old "import" command (for .slvs files) is renamed to "link". +* If a linked .slvs file is not found, first the relative path recorded + in the .slvs file is checked and then the absolute path; this is + an inversion of the previously used order. If it is still not found, + a dialog appears offering to locate it. +* DXF and DWG files can be imported, with point-coincident, horizontal and + vertical constraints automatically inferred from geometry, and distance + and angle constraints created when a dimension placed against geometry + exists. +* Triangle mesh can be exported for viewing in the browser through WebGL. +* Export dialogs remember the last file format used, and preselect it. +* Exported DXF files have exact circles, arcs and splines instead of + a piecewise linear approximation (unless hidden line removal was needed). +* Exported DXF files preserve color and line thickness. +* In exported DXF files, constraints are represented as DXF dimensions, + instead of piecewise linear geometry. +* When exporting 2d views, overlapping lines are removed. Other new features: - * Native Linux (GTK 2 and GTK 3) and Mac OS X ports. - * Automatically save and then restore sketches if SolveSpace crashes. - (Patch by Marc Britten) - * Unicode is supported everywhere (filenames, group names, TTF text, - comments), although RTL scripts and scripts making heavy use of ligatures - are not rendered correctly. - * The vector font is grid-fitted when rendered on screen to make it easier - to read regardless of its size. + +* Native Linux (GTK 2 and GTK 3) and Mac OS X ports. +* Automatically save and then restore sketches if SolveSpace crashes. + (Patch by Marc Britten) +* Unicode is supported everywhere (filenames, group names, TTF text, + comments), although RTL scripts and scripts making heavy use of ligatures + are not rendered correctly. +* The vector font is grid-fitted when rendered on screen to make it easier + to read regardless of its size. 2.0 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 12948781..38e1bcf7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,5 @@ # cmake configuration +cmake_minimum_required(VERSION 3.9...3.19) if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) message(FATAL_ERROR @@ -7,17 +8,10 @@ if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) " mkdir build && cd build && cmake ..") endif() -cmake_minimum_required(VERSION 3.7.2 FATAL_ERROR) -if(NOT CMAKE_VERSION VERSION_LESS 3.11.0) - cmake_policy(VERSION 3.11.0) -endif() -if(NOT CMAKE_VERSION VERSION_LESS 3.9) - # LTO/IPO with non-Intel compilers on Linux requires policy CMP0069 to be set to NEW. - # Set it explicitly until cmake_minimum_required is raised to >= 3.9. - cmake_policy(SET CMP0069 NEW) -endif() set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/") + +cmake_policy(SET CMP0048 OLD) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED YES) @@ -27,10 +21,15 @@ set(CMAKE_USER_MAKE_RULES_OVERRIDE set(CMAKE_USER_MAKE_RULES_OVERRIDE_CXX "${CMAKE_SOURCE_DIR}/cmake/cxx_flag_overrides.cmake") -if(APPLE OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") +if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() +if (APPLE) + # Docs say this must be set before the first project() call + set(CMAKE_OSX_DEPLOYMENT_TARGET "10.12" CACHE STRING "macOS minimum supported version") +endif() + # project # NOTE TO PACKAGERS: The embedded git commit hash is critical for rapid bug triage when the builds @@ -40,10 +39,10 @@ include(GetGitCommitHash) # and instead uncomment the following, adding the complete git hash of the checkout you are using: # set(GIT_COMMIT_HASH 0000000000000000000000000000000000000000) -project(solvespace) set(solvespace_VERSION_MAJOR 3) set(solvespace_VERSION_MINOR 0) string(SUBSTRING "${GIT_COMMIT_HASH}" 0 8 solvespace_GIT_HASH) +project(solvespace LANGUAGES C CXX ASM) set(ENABLE_GUI ON CACHE BOOL "Whether the graphical interface is enabled") @@ -68,10 +67,6 @@ if("${CMAKE_GENERATOR}" STREQUAL "Xcode") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY $<1:${CMAKE_BINARY_DIR}/bin>) endif() -if(NOT CMAKE_C_COMPILER_ID STREQUAL CMAKE_CXX_COMPILER_ID) - message(FATAL_ERROR "C and C++ compilers should be supplied by the same vendor") -endif() - if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) # GCC 4.8/4.9 ship with broken but present . meh. @@ -82,11 +77,13 @@ endif() # common compiler flags include(CheckCXXCompilerFlag) -set(FILE_PREFIX_MAP "-ffile-prefix-map=${CMAKE_CURRENT_SOURCE_DIR}=.") -check_cxx_compiler_flag("${FILE_PREFIX_MAP}" HAS_FILE_PREFIX_MAP) -if(HAS_FILE_PREFIX_MAP) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FILE_PREFIX_MAP}") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FILE_PREFIX_MAP}") +if (NOT APPLE) + set(FILE_PREFIX_MAP "-ffile-prefix-map=${CMAKE_CURRENT_SOURCE_DIR}=.") + check_cxx_compiler_flag("${FILE_PREFIX_MAP}" HAS_FILE_PREFIX_MAP) + if(HAS_FILE_PREFIX_MAP) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FILE_PREFIX_MAP}") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FILE_PREFIX_MAP}") + endif() endif() if(MINGW) @@ -210,6 +207,12 @@ if(WIN32 OR APPLE) find_vendored_package(PNG libpng SKIP_INSTALL_ALL ON PNG_LIBRARY png_static + PNG_ARM_NEON "off" + PNG_SHARED OFF + PNG_STATIC ON + PNG_EXECUTABLES OFF + PNG_TESTS OFF + PNG_FRAMEWORK OFF PNG_PNG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/extlib/libpng) list(APPEND PNG_PNG_INCLUDE_DIR ${CMAKE_BINARY_DIR}/extlib/libpng) @@ -222,11 +225,14 @@ if(WIN32 OR APPLE) FREETYPE_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extlib/freetype/include) message(STATUS "Using in-tree pixman") - add_vendored_subdirectory(extlib/pixman) set(PIXMAN_FOUND YES) set(PIXMAN_LIBRARY pixman) + set(PIXMAN_BUILD_TESTS OFF CACHE BOOL "") + set(PIXMAN_BUILD_DEMOS OFF CACHE BOOL "") + set(PIXMAN_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extlib/pixman/pixman) list(APPEND PIXMAN_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/extlib/pixman/pixman) + add_vendored_subdirectory(extlib/pixman) message(STATUS "Using in-tree cairo") add_vendored_subdirectory(extlib/cairo) @@ -275,6 +281,7 @@ if(ENABLE_GUI) elseif(APPLE) find_package(OpenGL REQUIRED) find_library(APPKIT_LIBRARY AppKit REQUIRED) + set(util_LIBRARIES ${APPKIT_LIBRARY}) else() find_package(OpenGL REQUIRED) find_package(SpaceWare) diff --git a/README.md b/README.md index 9b6cb225..e9a9d38d 100644 --- a/README.md +++ b/README.md @@ -37,16 +37,19 @@ the SolveSpace maintainers for each stable release. ### Via Snap Store -Builds from master are automatically released to the `edge` channel in the Snap Store. Those packages contain the latest improvements, but receive less testing than release builds. +Official releases can be installed from the `stable` channel. -Future official releases will appear in the `stable` channel. +Builds from master are automatically released to the `edge` channel in the Snap Store. Those packages contain the latest improvements, but receive less testing than release builds. [![Get it from the Snap Store](https://snapcraft.io/static/images/badges/en/snap-store-black.svg)](https://snapcraft.io/solvespace) Or install from a terminal: ``` -snap install --edge solvespace +# for the latest stable release: +snap install solvespace +# for the bleeding edge builds from master: +snap install solvespace --edge ``` ### Via third-party binary packages @@ -58,6 +61,20 @@ and cannot guarantee their functionality. [notesalexp]: https://notesalexp.org/packages/en/source/solvespace/ +### Via automated edge builds + +> :warning: **Edge builds might be unstable or contain severe bugs!** +> They are intended for experienced users to test new features or verify bugfixes. + +Cutting edge builds from the latest master commit are available as zip archives from the +following links: + +- [macOS](https://nightly.link/solvespace/solvespace/workflows/cd/master/macos.zip) +- [Windows](https://nightly.link/solvespace/solvespace/workflows/cd/master/windows.zip) +- [Windows with OpenMP enabled](https://nightly.link/solvespace/solvespace/workflows/cd/master/windows-openmp.zip) + +Extract the downloaded archive and install or execute the contained file as is appropriate for your platform. + ### Via source code See below. diff --git a/cmake/libpng-macos-arm64.patch b/cmake/libpng-macos-arm64.patch new file mode 100644 index 00000000..2d0e15cf --- /dev/null +++ b/cmake/libpng-macos-arm64.patch @@ -0,0 +1,117 @@ +diff --git a/extlib/libpng/CMakeLists.txt b/extlib/libpng/CMakeLists.txt +index 42ff0f9025..6834ea332e 100644 +--- a/extlib/libpng/CMakeLists.txt ++++ b/extlib/libpng/CMakeLists.txt +@@ -65,11 +65,22 @@ option(PNG_HARDWARE_OPTIMIZATIONS "Enable hardware optimizations" ON) + set(PNG_PREFIX "" CACHE STRING "Prefix to add to the API function names") + set(DFA_XTRA "" CACHE FILEPATH "File containing extra configuration settings") + ++# CMake currently sets CMAKE_SYSTEM_PROCESSOR to one of x86_64 or arm64 on macOS, ++# based upon the OS architecture, not the target architecture. As such, we need ++# to check CMAKE_OSX_ARCHITECTURES to identify which hardware-specific flags to ++# enable. Note that this will fail if you attempt to build a universal binary in ++# a single cmake invocation. ++if (APPLE AND CMAKE_OSX_ARCHITECTURES) ++ set(TARGET_ARCH ${CMAKE_OSX_ARCHITECTURES}) ++else() ++ set(TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR}) ++endif() ++ + if(PNG_HARDWARE_OPTIMIZATIONS) + + # Set definitions and sources for ARM. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64") ++if(TARGET_ARCH MATCHES "^arm" OR ++ TARGET_ARCH MATCHES "^aarch64") + set(PNG_ARM_NEON_POSSIBLE_VALUES check on off) + set(PNG_ARM_NEON "check" + CACHE STRING "Enable ARM NEON optimizations: check|on|off; check is default") +@@ -95,8 +106,8 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR + endif() + + # Set definitions and sources for PowerPC. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*") ++if(TARGET_ARCH MATCHES "^powerpc*" OR ++ TARGET_ARCH MATCHES "^ppc64*") + set(PNG_POWERPC_VSX_POSSIBLE_VALUES on off) + set(PNG_POWERPC_VSX "on" + CACHE STRING "Enable POWERPC VSX optimizations: on|off; on is default") +@@ -118,8 +129,8 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR + endif() + + # Set definitions and sources for Intel. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*") ++if(TARGET_ARCH MATCHES "^i?86" OR ++ TARGET_ARCH MATCHES "^x86_64*") + set(PNG_INTEL_SSE_POSSIBLE_VALUES on off) + set(PNG_INTEL_SSE "on" + CACHE STRING "Enable INTEL_SSE optimizations: on|off; on is default") +@@ -141,8 +152,8 @@ if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR + endif() + + # Set definitions and sources for MIPS. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*") ++if(TARGET_ARCH MATCHES "mipsel*" OR ++ TARGET_ARCH MATCHES "mips64el*") + set(PNG_MIPS_MSA_POSSIBLE_VALUES on off) + set(PNG_MIPS_MSA "on" + CACHE STRING "Enable MIPS_MSA optimizations: on|off; on is default") +@@ -166,26 +177,26 @@ endif() + else(PNG_HARDWARE_OPTIMIZATIONS) + + # Set definitions and sources for ARM. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^aarch64") ++if(TARGET_ARCH MATCHES "^arm" OR ++ TARGET_ARCH MATCHES "^aarch64") + add_definitions(-DPNG_ARM_NEON_OPT=0) + endif() + + # Set definitions and sources for PowerPC. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^powerpc*" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc64*") ++if(TARGET_ARCH MATCHES "^powerpc*" OR ++ TARGET_ARCH MATCHES "^ppc64*") + add_definitions(-DPNG_POWERPC_VSX_OPT=0) + endif() + + # Set definitions and sources for Intel. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "^i?86" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "^x86_64*") ++if(TARGET_ARCH MATCHES "^i?86" OR ++ TARGET_ARCH MATCHES "^x86_64*") + add_definitions(-DPNG_INTEL_SSE_OPT=0) + endif() + + # Set definitions and sources for MIPS. +-if(CMAKE_SYSTEM_PROCESSOR MATCHES "mipsel*" OR +- CMAKE_SYSTEM_PROCESSOR MATCHES "mips64el*") ++if(TARGET_ARCH MATCHES "mipsel*" OR ++ TARGET_ARCH MATCHES "mips64el*") + add_definitions(-DPNG_MIPS_MSA_OPT=0) + endif() + +@@ -412,19 +412,11 @@ else() + DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/scripts/checksym.awk" + "${CMAKE_CURRENT_SOURCE_DIR}/scripts/symbols.def") + +- add_custom_target(symbol-check +- DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/scripts/symbols.chk") +- + generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/sym.out" + "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym") + generate_copy("${CMAKE_CURRENT_BINARY_DIR}/scripts/vers.out" + "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers") + +- add_custom_target(genvers +- DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.vers") +- add_custom_target(gensym +- DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/libpng.sym") +- + add_custom_target("genprebuilt" + COMMAND "${CMAKE_COMMAND}" + "-DOUTPUT=scripts/pnglibconf.h.prebuilt" diff --git a/developer_docs/IdLists_Entities_and_Remap.txt b/developer_docs/IdLists_Entities_and_Remap.txt new file mode 100644 index 00000000..5fe17916 --- /dev/null +++ b/developer_docs/IdLists_Entities_and_Remap.txt @@ -0,0 +1,49 @@ +Some notes about Entities, Entity IDs and the IdList structure +============================================================== +Sketch entities in SolveSpace are all of the same type without use of language +support for polymorphism. The entity class is defined in sketch.h. That class +contains an enum for each entity to define its type (line, arc, etc...) and some +other members that can be used to store different things depending on the entity +type. This means all entities are the same size, so some data may be reference +by pointers from the entity (font, extra points, etc...) + +Entities in a sketch are kept in a global array (IdList) referenced by a unique +Id (handle) and can be looked up by Id in log(n) time via binary search. In +order to use binary search the array must be kept in order sorted by Id. One +problem is that insertion takes O(n) time because half the list (on average) +must be shifted to make room for a new item. + +The IdList class is a template and is used for more than entities. + +EntityMap: +========== +Another important structure is the EntityMap and EntityKey defined in sketch.h +This is what allows SovleSpace to update groups when earlier groups in the +sketch are changed. If a rectangle is extruded to a box and items are +constrained to entities on that box, the user can go back to the sketch and +modify it. Entities can be added, modified an even deleted. So long as the +entities that are later used to build upon are kept the later extrude group will +pick up the changes from the 2D sketch and anything build on it will remain. + +The way this works is that each group has a member called remap, which is one of +these maps. This is where my understanding is fuzzy. At the end of Group.cpp is +a function called Group::CopyEntity() which is used to make new sketch entities +when a group is created. These are generally copies of entities in the previous +group, but there are exceptions. A point will be used to generate a line when +extruding a 2D sketch. A point will also be "copied" to a circle for a Lathe +group. For this reason, the entity key is derived by combining its previous key +with something often called the CopyNumber or just remap (unfortunate). + +When a group is regenerated (the first time, or after a previous one is +modified) entities are copied from the old group to the new one. For Step +Translating and Rotating there may be many copies, and the copy number is +literally N for the Nth copy except for the last one which gets an enum - it is +common to constrain the last item, so it gets a large unique number so that +constraints still refer to it if the number of copies changes. When an entity is +copied like this a new handle is created unless there is already an entity in +Remap that was created the same way. This is how constructions are preserved +across underlying changes. + +There are some hard limits used in the hash table for the remap mechanism which +limit the number of entities in a group (but not the global sketch). + diff --git a/developer_docs/Solver_Transforms.txt b/developer_docs/Solver_Transforms.txt index 1ea3ae5f..98300f8b 100644 --- a/developer_docs/Solver_Transforms.txt +++ b/developer_docs/Solver_Transforms.txt @@ -46,7 +46,7 @@ POINT_N_ROT_TRANS: Rotates a point via quaternion param[3],param[4],param[5],par POINT_N_COPY: A non-transformed copy of a point - numeric copy? -POINT_N_ROT_AA: A point rotated arount point param[0],param[1],param[2] Where the +POINT_N_ROT_AA: A point rotated around point param[0],param[1],param[2] Where the angle is given by param[3]*timesApplied (times 2?) and the axis of rotation defined by param[4],param[5],param[6] @@ -130,7 +130,7 @@ the entity itself. The ForceTo() functions are shortcuts for using the solver. They are passed the desired location of a point (or orientation of a normal...) and have the opportunity to back-calculate what the group parameters should be to place it there. This is -used for mouse dragging of copied entites. It is notable that the constraints will +used for mouse dragging of copied entities. It is notable that the constraints will still be applied afterward, but this is a good shortcut. When creating a new entity transformation, the first thing to do is define the diff --git a/extlib/libpng b/extlib/libpng index e9c3d83d..dbe3e0c4 160000 --- a/extlib/libpng +++ b/extlib/libpng @@ -1 +1 @@ -Subproject commit e9c3d83d5a04835806287f1e8c0f2d3a962d6673 +Subproject commit dbe3e0c43e549a1602286144d94b0666549b18e6 diff --git a/extlib/mimalloc b/extlib/mimalloc index 27627843..4e643b6d 160000 --- a/extlib/mimalloc +++ b/extlib/mimalloc @@ -1 +1 @@ -Subproject commit 27627843648ef84aee1621976f25bee5946e6bda +Subproject commit 4e643b6d3178e0ea2a093b7e14fe621631a91e4b diff --git a/include/slvs.h b/include/slvs.h index 1c97fbf8..458f8c0d 100644 --- a/include/slvs.h +++ b/include/slvs.h @@ -113,6 +113,10 @@ typedef struct { #define SLVS_C_WHERE_DRAGGED 100031 #define SLVS_C_CURVE_CURVE_TANGENT 100032 #define SLVS_C_LENGTH_DIFFERENCE 100033 +#define SLVS_C_ARC_ARC_LEN_RATIO 100034 +#define SLVS_C_ARC_LINE_LEN_RATIO 100035 +#define SLVS_C_ARC_ARC_DIFFERENCE 100036 +#define SLVS_C_ARC_LINE_DIFFERENCE 100037 typedef struct { Slvs_hConstraint h; diff --git a/pkg/flatpak/com.solvespace.SolveSpace.json b/pkg/flatpak/com.solvespace.SolveSpace.json index 8c4ce513..8f55fa84 100644 --- a/pkg/flatpak/com.solvespace.SolveSpace.json +++ b/pkg/flatpak/com.solvespace.SolveSpace.json @@ -1,19 +1,29 @@ { "app-id": "com.solvespace.SolveSpace", - "runtime": "org.gnome.Platform", - "runtime-version": "3.30", - "sdk": "org.gnome.Sdk", + "runtime": "org.freedesktop.Platform", + "runtime-version": "20.08", + "sdk": "org.freedesktop.Sdk", "finish-args": [ /* Access to display server and OpenGL */ - "--share=ipc", "--socket=fallback-x11", "--socket=wayland", "--device=dri", + "--share=ipc", + "--socket=fallback-x11", + "--socket=wayland", + "--device=dri", /* Access to save files */ "--filesystem=home" ], "cleanup": [ - "/include", "/lib/*/include", - "*.a", "*.la", "*.m4", "/lib/libslvs*.so*", "/lib/libglibmm_generate_extra_defs*.so*", - "/share/pkgconfig", "*.pc", - "/share/man", "/share/doc", + "/include", + "/lib/*/include", + "*.a", + "*.la", + "*.m4", + "/lib/libslvs*.so*", + "/lib/libglibmm_generate_extra_defs*.so*", + "/share/pkgconfig", + "*.pc", + "/share/man", + "/share/doc", "/share/aclocal", /* mm-common junk */ "/bin/mm-common-prepare", @@ -26,8 +36,8 @@ "sources": [ { "type": "archive", - "url": "http://ftp.gnome.org/pub/GNOME/sources/mm-common/0.9/mm-common-0.9.12.tar.xz", - "sha256": "ceffdcce1e5b52742884c233ec604bf6fded12eea9da077ce7a62c02c87e7c0b" + "url": "https://download.gnome.org/sources/mm-common/1.0/mm-common-1.0.2.tar.xz", + "sha256": "a2a99f3fa943cf662f189163ed39a2cfc19a428d906dd4f92b387d3659d1641d" } ] }, @@ -39,21 +49,20 @@ "sources": [ { "type": "archive", - "url": "http://ftp.gnome.org/pub/GNOME/sources/libsigc++/2.10/libsigc++-2.10.1.tar.xz", - "sha256": "c9a25f26178c6cbb147f9904d8c533b5a5c5111a41ac2eb781eb734eea446003" + "url": "https://download.gnome.org/sources/libsigc++/2.10/libsigc%2B%2B-2.10.6.tar.xz", + "sha256": "dda176dc4681bda9d5a2ac1bc55273bdd381662b7a6d49e918267d13e8774e1b" } ] }, { "name": "glibmm", - "config-opts": [ - "--disable-documentation" - ], + "config-opts": [], + "buildsystem": "meson", "sources": [ { "type": "archive", - "url": "http://ftp.gnome.org/pub/GNOME/sources/glibmm/2.58/glibmm-2.58.1.tar.xz", - "sha256": "6e5fe03bdf1e220eeffd543e017fd2fb15bcec9235f0ffd50674aff9362a85f0" + "url": "https://download.gnome.org/sources/glibmm/2.64/glibmm-2.64.5.tar.xz", + "sha256": "508fc86e2c9141198aa16c225b16fd6b911917c0d3817602652844d0973ea386" } ] }, @@ -98,14 +107,13 @@ }, { "name": "gtkmm", - "config-opts": [ - "--disable-documentation" - ], + "config-opts": [], + "buildsystem": "meson", "sources": [ { "type": "archive", - "url": "http://ftp.gnome.org/pub/GNOME/sources/gtkmm/3.24/gtkmm-3.24.1.tar.xz", - "sha256": "ddfe42ed2458a20a34de252854bcf4b52d3f0c671c045f56b42aa27c7542d2fd" + "url": "https://download.gnome.org/sources/gtkmm/3.24/gtkmm-3.24.4.tar.xz", + "sha256": "9beb71c3e90cfcfb790396b51e3f5e7169966751efd4f3ef9697114be3be6743" } ] }, @@ -113,6 +121,7 @@ "name": "libjson-c", "sources": [ { + /* 0.15-nodoc doesn't build */ "type": "archive", "url": "https://s3.amazonaws.com/json-c_releases/releases/json-c-0.13.1-nodoc.tar.gz", "sha256": "94a26340c0785fcff4f46ff38609cf84ebcd670df0c8efd75d039cc951d80132" @@ -125,8 +134,8 @@ "name": "SolveSpace", "sources": [ { - "type": "git", - "path": "/home/whitequark/Projects/solvespace" + "type": "dir", + "path": "../.." } ], "buildsystem": "cmake", diff --git a/res/CMakeLists.txt b/res/CMakeLists.txt index 9152488d..7303c6f7 100644 --- a/res/CMakeLists.txt +++ b/res/CMakeLists.txt @@ -31,7 +31,7 @@ if(WIN32) set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${source}") endfunction() elseif(APPLE) - set(app_resource_dir ${CMAKE_BINARY_DIR}/bin/SolveSpace.app/Contents/Resources) + set(app_resource_dir ${CMAKE_BINARY_DIR}/Resources) set(cli_resource_dir ${CMAKE_BINARY_DIR}/res) function(add_resource name) @@ -134,6 +134,13 @@ else() DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications RENAME com.solvespace.SolveSpace.desktop) + set(DESKTOP_FILE_NAME com.solvespace.SolveSpace.desktop) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in + ${CMAKE_CURRENT_BINARY_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo) + install(FILES freedesktop/solvespace-flatpak-mime.xml DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/mime/packages RENAME com.solvespace.SolveSpace-slvs.xml) @@ -176,6 +183,13 @@ else() install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freedesktop/solvespace.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) + set(DESKTOP_FILE_NAME solvespace.desktop) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in + ${CMAKE_CURRENT_BINARY_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/freedesktop/com.solvespace.SolveSpace.metainfo.xml + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/metainfo) + install(FILES freedesktop/solvespace-mime.xml DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/mime/packages RENAME solvespace-slvs.xml) @@ -185,7 +199,7 @@ else() RENAME solvespace.svg) install(FILES freedesktop/solvespace-scalable.svg DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/mimetypes - RENAME application.x-solvespace.svg) + RENAME application-x-solvespace.svg) foreach(SIZE 16x16 24x24 32x32 48x48) install(FILES freedesktop/solvespace-${SIZE}.png @@ -193,12 +207,7 @@ else() RENAME solvespace.png) install(FILES freedesktop/solvespace-${SIZE}.png DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${SIZE}/mimetypes - RENAME application.x-solvespace.png) - endforeach() - - foreach(SIZE 16x16 24x24 32x32 48x48) - install(FILES freedesktop/solvespace-${SIZE}.xpm - DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps) + RENAME application-x-solvespace.png) endforeach() endif() endif() @@ -257,6 +266,8 @@ add_resources( locales/en_US.po locales/fr_FR.po locales/uk_UA.po + locales/es_AR.po + locales/tr_TR.po locales/ru_RU.po locales/zh_CN.po fonts/unifont.hex.gz diff --git a/res/fonts/unicode.lff.gz b/res/fonts/unicode.lff.gz index 6b1b04da..6d35aecf 100644 Binary files a/res/fonts/unicode.lff.gz and b/res/fonts/unicode.lff.gz differ diff --git a/res/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in b/res/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in new file mode 100644 index 00000000..3e88165b --- /dev/null +++ b/res/freedesktop/com.solvespace.SolveSpace.metainfo.xml.in @@ -0,0 +1,87 @@ + + + com.solvespace.SolveSpace + + SolveSpace + A free (GPLv3) parametric 3d CAD tool + + CC0-1.0 + GPL-3.0-or-later + ryan_AT_ryanpavlik.com + + + Graphics + 3DGraphics + Engineering + + +

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

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

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

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

Second release candidate for the 3.0 stable release.

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

First release candidate for the 3.0 stable release.

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

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

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

Bug-fix release, including performance improvements.

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

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

+
+ https://github.com/solvespace/solvespace/releases/tag/v2.1 +
+
+ +
diff --git a/res/freedesktop/solvespace-16x16.xpm b/res/freedesktop/solvespace-16x16.xpm deleted file mode 100644 index 3cd06622..00000000 --- a/res/freedesktop/solvespace-16x16.xpm +++ /dev/null @@ -1,27 +0,0 @@ -/* XPM */ -static char *solvespace_16x16[] = { -/* columns rows colors chars-per-pixel */ -"16 16 5 1 ", -" c black", -". c #1ED500", -"X c #DE00D6", -"o c #CBCBCB", -"O c None", -/* pixels */ -"OOO OOOOOOOOOOOO", -"OOO OOOOOOOOOOOO", -"OOO OOOOOOOOOOOO", -"OOO OOOOOXOOOOOO", -"OOO OOOOOXoOOOOO", -"OOO OOOOOXoOOOOO", -"OOO OOOOOXoOOOOO", -"OOO OOOOOXoOOOOO", -"OOO OOOOOXoOOOOO", -"OOO OOXXXXXXXOOO", -"OOO OOOoooooooOO", -"OO...OOOOOOOOOOO", -" ... ", -"OO...OOOOOOOOOOO", -"OOO OOOOOOOOOOOO", -"OOO OOOOOOOOOOOO" -}; diff --git a/res/freedesktop/solvespace-24x24.xpm b/res/freedesktop/solvespace-24x24.xpm deleted file mode 100644 index 9d1c02e6..00000000 --- a/res/freedesktop/solvespace-24x24.xpm +++ /dev/null @@ -1,35 +0,0 @@ -/* XPM */ -static char *solvespace_24x24[] = { -/* columns rows colors chars-per-pixel */ -"24 24 5 1 ", -" c black", -". c #1ED500", -"X c #DE00D6", -"o c #CBCBCB", -"O c None", -/* pixels */ -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOO OOOOOOOOOOOOOOOO", -"OOOOOOO OOOOOOOOOOOOOOOO", -"OOOOOOO OOOOOOOOOOOOOOOO", -"OOOOOOO OOOOOXOOOOOOOOOO", -"OOOOOOO OOOOOXoOOOOOOOOO", -"OOOOOOO OOOOOXoOOOOOOOOO", -"OOOOOOO OOOOOXoOOOOOOOOO", -"OOOOOOO OOOOOXoOOOOOOOOO", -"OOOOOOO OOOOOXoOOOOOOOOO", -"OOOOOOO OOXXXXXXXOOOOOOO", -"OOOOOOO OOOoooooooOOOOOO", -"OOOOOO...OOOOOOOOOOOOOOO", -"OOOO ... OOOO", -"OOOOOO...OOOOOOOOOOOOOOO", -"OOOOOOO OOOOOOOOOOOOOOOO", -"OOOOOOO OOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOO" -}; diff --git a/res/freedesktop/solvespace-32x32.xpm b/res/freedesktop/solvespace-32x32.xpm deleted file mode 100644 index 0d7c5987..00000000 --- a/res/freedesktop/solvespace-32x32.xpm +++ /dev/null @@ -1,43 +0,0 @@ -/* XPM */ -static char *solvespace_32x32[] = { -/* columns rows colors chars-per-pixel */ -"32 32 5 1 ", -" c black", -". c #1ED500", -"X c #DE00D6", -"o c #CBCBCB", -"O c None", -/* pixels */ -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOXXoOOOOOOOOOOOO", -"OOOOOO OOOOXXXXXXXXXXXXOOOOOOOO", -"OOOOOO OOOOXXXXXXXXXXXXOOOOOOOO", -"OOOOOO OOOOOooooooooooooOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOO......OOOOOOOOOOOOOOOOOOOOOO", -"OOOO......OOOOOOOOOOOOOOOOOOOOOO", -" ...... ", -" ...... ", -"OOOO......OOOOOOOOOOOOOOOOOOOOOO", -"OOOO......OOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOO OOOOOOOOOOOOOOOOOOOOOOOO" -}; diff --git a/res/freedesktop/solvespace-48x48.xpm b/res/freedesktop/solvespace-48x48.xpm deleted file mode 100644 index c5adf53b..00000000 --- a/res/freedesktop/solvespace-48x48.xpm +++ /dev/null @@ -1,59 +0,0 @@ -/* XPM */ -static char *solvespace_48x48[] = { -/* columns rows colors chars-per-pixel */ -"48 48 5 1 ", -" c black", -". c #1ED500", -"X c #DE00D6", -"o c #CBCBCB", -"O c None", -/* pixels */ -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOXXoOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOXXXXXXXXXXXXOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOXXXXXXXXXXXXOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOooooooooooooOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOO ...... OOOOOOOO", -"OOOOOOOO ...... OOOOOOOO", -"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOO......OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOO OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO", -"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO" -}; diff --git a/res/freedesktop/solvespace-flatpak.desktop.in b/res/freedesktop/solvespace-flatpak.desktop.in index b16ccf44..c80b67ad 100644 --- a/res/freedesktop/solvespace-flatpak.desktop.in +++ b/res/freedesktop/solvespace-flatpak.desktop.in @@ -6,5 +6,5 @@ Exec=${CMAKE_INSTALL_FULL_BINDIR}/solvespace MimeType=application/x-solvespace Icon=com.solvespace.SolveSpace Type=Application -Categories=Graphics +Categories=Graphics;3DGraphics;Engineering; Keywords=parametric;cad;2d;3d; diff --git a/res/freedesktop/solvespace-snap.desktop b/res/freedesktop/solvespace-snap.desktop index 8441258c..da0dda13 100644 --- a/res/freedesktop/solvespace-snap.desktop +++ b/res/freedesktop/solvespace-snap.desktop @@ -6,5 +6,5 @@ Exec=solvespace MimeType=application/x-solvespace Icon=${SNAP}/meta/icons/hicolor/scalable/apps/snap.solvespace.svg Type=Application -Categories=Graphics +Categories=Graphics;3DGraphics;Engineering; Keywords=parametric;cad;2d;3d; diff --git a/res/freedesktop/solvespace.desktop.in b/res/freedesktop/solvespace.desktop.in index 8c6fb24a..87e6863c 100644 --- a/res/freedesktop/solvespace.desktop.in +++ b/res/freedesktop/solvespace.desktop.in @@ -6,5 +6,5 @@ Exec=${CMAKE_INSTALL_FULL_BINDIR}/solvespace MimeType=application/x-solvespace Icon=solvespace Type=Application -Categories=Graphics +Categories=Graphics;3DGraphics;Engineering; Keywords=parametric;cad;2d;3d; diff --git a/res/icons/graphics-window/extrude.png b/res/icons/graphics-window/extrude.png index ad71bce3..a8eb88bc 100644 Binary files a/res/icons/graphics-window/extrude.png and b/res/icons/graphics-window/extrude.png differ diff --git a/res/icons/graphics-window/lathe.png b/res/icons/graphics-window/lathe.png index 02625401..cb91631b 100644 Binary files a/res/icons/graphics-window/lathe.png and b/res/icons/graphics-window/lathe.png differ diff --git a/res/icons/graphics-window/revolve.png b/res/icons/graphics-window/revolve.png index 110a0123..0569907c 100644 Binary files a/res/icons/graphics-window/revolve.png and b/res/icons/graphics-window/revolve.png differ diff --git a/res/locales.txt b/res/locales.txt index 0f4fab16..d94e2c04 100644 --- a/res/locales.txt +++ b/res/locales.txt @@ -3,6 +3,8 @@ de-DE,0407,Deutsch en-US,0409,English (US) fr-FR,040C,Français +es-AR,2C0A,español (AR) ru-RU,0419,Русский +tr-TR,041F,Türkçe uk-UA,0422,Українська zh-CN,0804,简体中文 diff --git a/res/locales/de_DE.po b/res/locales/de_DE.po index bbd3fcda..4a5ccb57 100644 --- a/res/locales/de_DE.po +++ b/res/locales/de_DE.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: 2018-07-19 06:55+0000\n" "Last-Translator: Reini Urban \n" "Language-Team: none\n" @@ -17,7 +17,7 @@ msgstr "" "X-Generator: Zanata 4.5.0\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -28,27 +28,27 @@ msgstr "" "\n" "Aktivieren Sie eine mit Skizze -> In Arbeitsebene" -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "Zwischenablage ist leer; es gibt nichts einzufügen." -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "Die Anzahl der einzufügenden Kopien muss mind. 1 sein." -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "Maßstab kann nicht Null sein." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "Wählen Sie einen Punkt, um den Drehmittelpunkt zu definieren." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "Wählen Sie zwei Punkte, um den Verschiebungsvektor zu definieren." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -56,25 +56,25 @@ msgstr "" "Die Transformation ist die Identität. Alle Kopien werden deckungsgleich " "übereinanderliegen." -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "" "Zuviele Objekte zum Einfügen; teilen Sie diese in kleinere " "Einfügeoperationen auf." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "Es ist keine Arbeitsebene aktiv." -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "Ungültiges Format: geben Sie Koordinaten als x, y, z an" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "Ungültiges Format: geben Sie Farben als r, g, b an" -#: confscreen.cpp:454 +#: confscreen.cpp:412 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -82,25 +82,25 @@ msgstr "" "Der Perspektivfaktor wird sich nicht auswirken, bis Sie Ansicht -> " "Perspektive Projektion aktivieren." -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Geben Sie 0 bis %d Ziffern nach dem Dezimalzeichen an." -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "Der Exportmaßstab darf nicht Null sein!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "Der Werkzeugradialabstand darf nicht negativ sein!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "" "Ungültiger Wert: Interval für automatisches Speichern muss positiv sein" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "Ungültiges Format: geben Sie das Interval in ganzen Minuten an" @@ -171,115 +171,135 @@ msgstr "Längenverhältnis" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "Längendifferenz" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "Symmetrisch" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "Symmetrisch-H" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "Symmetrisch-V" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "Symmetrisch-Linie" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "auf-Mittelpunkt" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "Horizontal" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "Vertikal" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "Durchmesser" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "Pkt-auf-Kreis" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "gl-Orientierung" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "Winkel" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "Parallel" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "Bogen-Linie-Tangente" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "Kub-Linie-Tangente" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "Kurve-Kurve-Tangente" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "Rechtwinklig" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "gl-Radius" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "gl-Winkel" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "gl-Linie-Länge-Bogen-Länge" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "Fix-an-Position" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "Kommentar" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -288,7 +308,7 @@ msgstr "" "haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " "Tangente einschränken. -> Sc" -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -297,7 +317,7 @@ msgstr "" "haben. Schränken Sie mit \"Einschränkung / Auf Punkt\" ein, bevor Sie die " "Tangente einschränken. -> Sc" -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -305,7 +325,7 @@ msgstr "" "Die Kurven müssen einen gemeinsamen Endpunkt haben. Schränken Sie mit " "\"Einschränkung / Auf Punkt\" ein, bevor Sie die Tangente einschränken. -> Sc" -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -329,7 +349,7 @@ msgstr "" " * eine Seitenfläche und ein Punkt [minimaler Abstand]\n" " * ein Kreis oder ein Bogen [Durchmesser]\n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -349,7 +369,7 @@ msgstr "" " * einen Punkt und einen Kreis oder Bogen [Punkt auf Kurve]\n" " * einen Punkt und eine Seitenfläche [Punkt auf Fläche]\n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -380,30 +400,26 @@ msgstr "" " * ein Liniensegment und ein Bogen [Länge des Liniensegments gleich " "Bogenlänge]\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Ungültige Auswahl für Einschränkung \"Längenverhältnis\". Diese " -"Einschränkung ist anwendbar auf:\n" -"\n" -" * zwei Liniensegmente\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Ungültige Auswahl für Einschränkung \"Längendifferenz\". Diese Einschränkung " -"ist anwendbar auf:\n" -"\n" -" * zwei Liniensegmente\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -417,7 +433,7 @@ msgstr "" " * ein Liniensegment und eine Arbeitsebene [Mittelpunkt der Linie auf " "Ebene]\n" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -438,7 +454,7 @@ msgstr "" " * eine Arbeitsebene und zwei Punkte oder ein Liniensegment [symmetrisch " "zu Arbeitsebene]\n" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -446,7 +462,7 @@ msgstr "" "Eine Arbeitsebene muss aktiv sein, um die Symmetrie ohne explizite " "Symmetrieebene einzuschränken." -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -454,7 +470,7 @@ msgstr "" "Aktivieren Sie eine Arbeitsebene (mit Skizze -> In Arbeitsebene), bevor Sie " "horizontal oder vertikal einschränken." -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -468,7 +484,7 @@ msgstr "" " * zwei Punkte\n" " * ein Liniensegment\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -480,15 +496,15 @@ msgstr "" "\n" " * zwei Normale\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "Sie müssen einen eingeschränkten Winkel auswählen." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "Sie müssen eine Einschränkung mit zugeordneter Kennzeichnung angeben." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -503,12 +519,12 @@ msgstr "" " * ein Liniensegment und eine Normale\n" " * zwei Normale\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "" "Die Kurven-Kurven-Tangente muss in der Arbeitsebene eingeschränkt werden." -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -527,7 +543,7 @@ msgstr "" " * zwei Liniensegmente, Bögen oder Beziers mit gemeinsamem Endpunkt " "[Tangente]\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -542,7 +558,7 @@ msgstr "" " * ein Liniensegment und eine Normale\n" " * zwei Normale\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -554,7 +570,11 @@ msgstr "" "\n" " * einen Punkt\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "NEUER KOMMENTAR -- DOPPELKLICKEN ZUM BEARBEITEN" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "Klicken Sie auf die Mitte des Kommentartextes" @@ -583,26 +603,26 @@ msgstr "" " * einen Punkt und zwei Liniensegmente [Schnittebene durch Punkt und " "parallel zu Linien]\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "Das Netz der aktiven Gruppe ist leer; es gibt nichts zu exportieren." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "Freihandlinien wurden mit durchgehenden Linien ersetzt" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "Zickzacklinien wurden mit durchgehenden Linien ersetzt" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Teile der Zeichnung haben keine Entsprechung in DXF und wurden nicht " "exportiert:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -619,11 +639,11 @@ msgctxt "group-name" msgid "#references" msgstr "#Referenzen" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "Die Datei ist leer. Es kann beschädigt sein." -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -664,7 +684,7 @@ msgctxt "button" msgid "&No" msgstr "&Nein" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "&Abbrechen" @@ -838,296 +858,304 @@ msgid "Use &Perspective Projection" msgstr "Perspektivische Projektion" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "Maßeinheit" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "Maße in Millimeter" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "Masse in M&etern" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "Maße in Zoll" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "Werkzeugleiste anzeigen" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "Attributbrowser anzeigen" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "Vollbildschirm" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "Neue Gruppe" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "In 3D skizzieren" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "In neuer Arbeitsebene skizzieren" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "Kopieren und verschieben" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "Kopieren und drehen" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "E&xtrudieren" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "&Helix" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "R&otieren" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "D&rehen" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "Verknüpfen / Zusammensetzen" -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "Letzte verknüpfen" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Skizze" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "In Arbeitsebene" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "Im 3D-Raum" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "Bezugspunkt" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "Arbeits&ebene" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "&Linie" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "K&onstruktionslinie" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "&Rechteck" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "&Kreis" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "Kreisbogen" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "Kubischer &Bezier-Spline" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "&Text in Truetype-Font" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "B&ild" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "Konstruktionselement an/aus" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "Bogentangente an Punkt" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Kurven im Schnittpunkt trennen" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Einschränkung" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "Abstand / Durchmesser" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "Referenzangabe" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "Winkel" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "Referenzwinkel" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Komplementärwinkel" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Referenzangabe ein/aus" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "Horizontal" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Vertikal" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "Auf Punkt / Kurve / Ebene" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "Gleicher Abstand / Radius / Winkel" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "Längenverhältnis" - -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "Längendifferenz" - #: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" + +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" + +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "Auf &Mittelpunkt" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "Symmetrisch" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "Paral&llel / Tangente" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "Rechtwinklig" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Gleiche Orientierung" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "Punkt an Position fixieren" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Kommentar" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Analyse" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "&Volumen bestimmen" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "Fläche bestimmen" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "Umfang bestimmen" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "Überlagernde Teile anzeigen" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "Freiliegende Kanten anzeigen" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "Massenmittelpunkt anzeigen" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "&Unterbeschränkte Punkte anzeigen" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "Punkt nachzeichnen" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "Nachzeichnen beenden" -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Schrittgröße…" -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Hilfe" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "Sprache" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "&Website / Anleitung" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "Über" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(keine vorhergehenden Dateien)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "Datei '%s' existiert nicht." -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "" "Das Raster wird nicht angezeigt, weil keine Arbeitsebene ausgewählt ist." -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1141,20 +1169,20 @@ msgstr "" "Ändern Sie den Faktor für die Perspektivprojektion in der " "Konfigurationsmaske. Ein typischer Wert ist ca. 0,3." -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Wählen Sie einen Punkt aus; dieser Punkt wird im Mittelpunkt der " "Bildschirmansicht sein." -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "" "Die ausgewählten Objekte teilen keine gemeinsamen Endpunkte mit anderen " "Objekten." -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1162,7 +1190,7 @@ msgstr "" "Für diesen Befehl wählen Sie einen Punkt oder ein anderes Objekt von einem " "verknüpften Teil aus, oder aktivieren Sie eine verknüpfte Gruppe." -#: graphicswin.cpp:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1171,7 +1199,7 @@ msgstr "" "(mit Skizze -> In Arbeitsebene), um die Ebene für das Gitterraster zu " "definieren." -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1180,13 +1208,13 @@ msgstr "" "für Punkte, Textkommentare, oder Einschränkungen mit einer Bezeichnung. Um " "eine Linie auf das Raster auszurichten, wählen Sie deren Endpunkte aus." -#: graphicswin.cpp:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Es wurde keine Arbeitsebene ausgewählt. Die Standard-Arbeitsebene für diese " "Gruppe wird aktiviert." -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1196,7 +1224,7 @@ msgstr "" "standardmäßige Arbeitsebene. Wählen Sie eine Arbeitsebene aus, oder " "erstellen Sie eine Gruppe in einer neuen Arbeitsebene." -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1204,48 +1232,48 @@ msgstr "" "Ungültige Auswahl für Bogentangente an Punkt. Wählen Sie einen einzelnen " "Punkt. Um die Bogenparameter anzugeben, wählen Sie nichts aus." -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "" "Erstellen Sie einen Punkt auf dem Bogen (zeichnet im Gegenuhrzeigersinn)" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "Klicken Sie, um einen Bezugspunkt zu platzieren" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "Klicken Sie auf den ersten Punkt des Liniensegments" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "Klicken Sie auf den ersten Punkt der Konstruktionslinie" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "Klicken Sie auf den ersten Punkt der kubischen Linie" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "Klicken Sie auf den Kreismittelpunkt" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "Klicken Sie auf den Ursprungspunkt der Arbeitsebene" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "Klicken Sie auf eine Ecke des Rechtecks" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "Klicken Sie auf die obere linke Ecke des Texts" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "Klicken Sie auf die obere linke Ecke des Bilds" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1258,24 +1286,18 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "Skizze-in-3D" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -"Ungültige Auswahl für Skizze in neuer Arbeitsebene. Diese Gruppe kann " -"erstellt werden mit:\n" -"\n" -" * einem Punkt (durch den Punkt, orthogonal zu den Koordinatenachsen)\n" -" * einem Punkt und zwei Liniensegmenten (durch den Punkt, parallel zu den " -"Linien)\n" -" * einer Arbeitsebene (Kopie der Arbeitsebene)\n" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1283,16 +1305,16 @@ msgstr "" "Aktivieren Sie vor der Extrusion eine Arbeitsebene (mit Skizze -> In " "Arbeitsebene). Die Skizze wird senkrecht zur Arbeitsebene extrudiert" -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "Extrusion" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "Rotieren kann nur mit planaren Skizzen ausgeführt werden." -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1307,16 +1329,16 @@ msgstr "" "eine Achse parallel zur Linie/Normalen, durch den Punkt)\n" " * einem Liniensegment (Drehung um das Liniensegment)\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "Drehung" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "Revolve kann nur mit planaren Skizzen ausgeführt werden." -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1331,16 +1353,16 @@ msgstr "" "Achse parallel zu Linie / Normale, durch Punkt)\n" " * einem Liniensegment (gedreht um Liniensegment)\n" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "Revolve" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "Helix kann nur mit planaren Skizzen ausgeführt werden." -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1355,12 +1377,12 @@ msgstr "" "Achse parallel zu Linie / Normale, durch Punkt)\n" " * einem Liniensegment (gedreht um Liniensegment)\n" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "Helix" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1376,41 +1398,41 @@ msgstr "" " * einem Punkt und einer Linie oder einer Normale (gedreht um eine Achse " "durch den Punkt, parallel zur Linie / Normale)\n" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "Drehen" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "Versetzen" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "unbenannt" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "Kontur nicht geschlossen, oder kein einheitlicher Linientyp!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "Punkte sind nicht alle koplanar!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "Kontur überschneidet sich selbst!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "Kante mit Länge Null!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Eine Bogentangente kann nur in einer Arbeitsebene erstellt werden." -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1419,7 +1441,7 @@ msgstr "" "nicht-Konstruktionslinien oder -kreise in dieser Gruppe und Arbeitsebene " "treffen. " -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1428,17 +1450,17 @@ msgstr "" "Radius, oder erstellen Sie die gewünschte Geometrie von Hand mit \"Tangente" "\"-Einschränkungen." -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" "Dieses Objekt konnte nicht geteilt werden. Dies geht nur für Linien, Kreise " "oder kubische Splines." -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "Trennen ist nur in einer Arbeitsebene möglich." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." @@ -1446,109 +1468,109 @@ msgstr "" "Wählen Sie zwei Objekte aus, die sich schneiden (z.B. zwei Linien/Kreise/" "Bögen, oder eine Linie/Kreis/Bogen und ein Punkt)." -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "Trennen nicht möglich; keine Überschneidung gefunden." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Linientyp zuordnen" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "Kein Linientyp" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Neu erstellter benutzerdefinierter Linientyp…" -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Info zu Gruppe" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Info zu Linientyp" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Kantenverlauf auswählen" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Von/zu Referenzangabe wechseln" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Anderer Komplementärwinkel" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Auf Raster ausrichten" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Spline-Punkt löschen" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Spline-Punkt hinzufügen" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "" "Spline-Punkt kann nicht hinzugefügt werden: maximale Anzahl der Punkte " "erreicht." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Konstruktionselement an/aus" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Einschränkung \"Punkte deckungsgleich\" löschen" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Ausschneiden" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Kopieren" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Alle auswählen" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Einfügen" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Einfügen und transformieren…" -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Löschen" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Alle deselektieren" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Aktive deselektieren" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Zoom an Bildschirm anpassen" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "Klicken Sie auf den nächsten Punkt der Linie, oder drücken Sie Esc" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1556,15 +1578,15 @@ msgstr "" "Ein Rechteck kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "Klicken Sie auf die gegenüberliegende Ecke des Rechtecks" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "Klicken Sie, um den Radius festzulegen" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1572,23 +1594,23 @@ msgstr "" "Ein Kreisbogen kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "Klicken Sie, um einen Punkt zu platzieren" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "" "Klicken Sie auf den nächsten Punkt der kubischen Linie, oder drücken Sie Esc" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Eine Arbeitsebene ist bereits aktiv. Skizzieren Sie in 3D, bevor Sie eine " "neue Arbeitsebene erstellen." -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1596,11 +1618,11 @@ msgstr "" "Text kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "Klicken Sie auf die untere rechte Ecke des Texts" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1608,194 +1630,200 @@ msgstr "" "Das Bild kann nicht in 3D erstellt werden. Aktivieren Sie zuerst eine " "Arbeitsebene mit \"Skizze -> In Arbeitsebene\"." -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "NEUER KOMMENTAR -- DOPPELKLICKEN ZUM BEARBEITEN" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace-Modelle" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "IDF Leiterplatte" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "PNG-Datei" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "STL-Netz" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ-Netz" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-kompatibles Netz, mit Ansicht" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-kompatibles Netz, nur Netz" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "VRML Textdatei" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "STEP-Datei" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "PDF-Datei" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Eingebettetes Postscript" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "Skalierbare Vektorgrafik" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF-Datei (AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL-Datei" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "G-Code" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF- und DWG-Dateien" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "Werte durch Komma getrennt (CSV)" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "unbenannt" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Datei speichern" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Datei öffnen" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "_Abbrechen" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "_Speichern" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "_Öffnen" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "Automatische Sicherungsdatei verfügbar" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Eine automatische Sicherung ist für diese Skizze verfügbar." -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Wollen Sie die automatische Sicherungsdatei stattdessen laden?" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "AutoDatei &öffnen" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "&Nicht laden" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "Geänderte Datei" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Wollen Sie die Änderungen an der Skizze “%s” sichern?" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Wollen Sie die Änderungen an der Skizze sichern?" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Ihre Änderungen werden verworfen, wenn sie nicht abgespeichert werden." -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "&Sichern" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "&Verwerfen" # solvespace.cpp:557 -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "(Neue Skizze)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "Attribut-Browser" -#: solvespace.cpp:658 +#: solvespace.cpp:699 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " @@ -1805,7 +1833,7 @@ msgstr "" "wahrscheinlich nicht. Verstecken Sie sie in dem auf den Link oben im " "Textfenster klicken." -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1814,23 +1842,23 @@ msgstr "" "Kann den Dateityp der Datei '%s' nicht auf Grund der Dateierweiterung " "erkennen. Versuchen Sie .dxf oder .dwg." -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" "Die Einschränkung muss einen Namen haben, und darf keine " "Referenzdimensionierung sein." -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "" "Falsche Auswahl für die Schrittdimensionierung. Wählen Sie eine " "Einschränkung." -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "Der Zusammenbau funktioniert, gut." -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1841,7 +1869,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1854,7 +1882,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1866,7 +1894,7 @@ msgstr "" "Gekrümmte Flächen wurden als Dreiecksnetz angenähert.\n" "Das verursacht Fehler, typischerweise um 1%." -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1883,7 +1911,7 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1891,7 +1919,7 @@ msgstr "" "Diese Gruppe beinhaltet keine korrekt geschlossene 2D Fläche. Sie ist offen, " "nicht koplanar, oder überschneidet sich selbst." -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1908,7 +1936,7 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1925,36 +1953,36 @@ msgstr "" "Kurven wurden als gerade Linienstücke angenähert.\n" "Das verursacht Fehler, typischerweise um 1%%." -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Falsche Auswahl für Umfang. Wähle Liniensegmente, Bögen und Kurven." -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "Falsche Auswahl für Punkt nachzeichnen. Wähle einen einzelnen Punkt." -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "Konnte '%s' nicht schreiben" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "Das Netz schneidet sich selbst: Falsch, ungültig." -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "Das Netz schneidet sich nicht: Gut, gültig." -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Das Netz hat lose Kanten: Falsch, ungültig." -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "Das Netz hat keine lose Kanten: Gut, gültig." -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1965,7 +1993,7 @@ msgstr "" "\n" "Das Modell hat %d Dreiecke, von %d Flächen." -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1980,7 +2008,7 @@ msgstr "" "\n" "Keine problematischen Kanten, gut.%s" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1995,7 +2023,7 @@ msgstr "" "\n" "%d problematische Kanten, schlecht.%s" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2025,7 +2053,7 @@ msgstr "" "\n" "© 2008-%d Jonathan Westhues und andere.\n" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -2034,27 +2062,27 @@ msgstr "" "Objekt abgeleitet wurde. Versuchen Sie, dem übergeordneten Objekt einen Typ " "zuzuordnen." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "Name des Linientyps kann nicht leer sein." -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "Nicht weniger als 1 Wiederholung möglich." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "Nicht mehr als 999 Wiederholungen möglich." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "Der Name der Gruppe darf nicht leer sein." -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "Durchsichtigkeit muss zwischen Null und Eins sein." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "Radius darf nicht null oder negativ sein." @@ -2210,14 +2238,58 @@ msgctxt "button" msgid "&OK" msgstr "&OK" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "Der Maßstab kann nicht Null oder negativ sein." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "Ungültiges Format: geben Sie x, y, z ein" +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Ungültige Auswahl für Einschränkung \"Längenverhältnis\". Diese " +#~ "Einschränkung ist anwendbar auf:\n" +#~ "\n" +#~ " * zwei Liniensegmente\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Ungültige Auswahl für Einschränkung \"Längendifferenz\". Diese " +#~ "Einschränkung ist anwendbar auf:\n" +#~ "\n" +#~ " * zwei Liniensegmente\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "Längenverhältnis" + +#~ msgid "Length Diff&erence" +#~ msgstr "Längendifferenz" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Ungültige Auswahl für Skizze in neuer Arbeitsebene. Diese Gruppe kann " +#~ "erstellt werden mit:\n" +#~ "\n" +#~ " * einem Punkt (durch den Punkt, orthogonal zu den Koordinatenachsen)\n" +#~ " * einem Punkt und zwei Liniensegmenten (durch den Punkt, parallel zu " +#~ "den Linien)\n" +#~ " * einer Arbeitsebene (Kopie der Arbeitsebene)\n" + #~ msgctxt "file-type" #~ msgid "Q3D Object file" #~ msgstr "Q3D Objektdatei" diff --git a/res/locales/en_US.po b/res/locales/en_US.po index 27f02444..385d8d76 100644 --- a/res/locales/en_US.po +++ b/res/locales/en_US.po @@ -2,12 +2,12 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # Automatically generated, 2017. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: 2017-01-05 10:30+0000\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,27 +27,27 @@ msgstr "" "\n" "Activate one with Sketch -> In Workplane." -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "Clipboard is empty; nothing to paste." -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "Number of copies to paste must be at least one." -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "Scale cannot be zero." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "Select one point to define origin of rotation." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "Select two points to define translation vector." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -55,23 +55,23 @@ msgstr "" "Transformation is identity. So all copies will be exactly on top of each " "other." -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "Too many items to paste; split this into smaller pastes." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "No workplane active." -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "Bad format: specify coordinates as x, y, z" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "Bad format: specify color as r, g, b" -#: confscreen.cpp:454 +#: confscreen.cpp:412 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,24 +79,24 @@ msgstr "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Specify between 0 and %d digits after the decimal." -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "Export scale must not be zero!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "Cutter radius offset must not be negative!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "Bad value: autosave interval should be positive" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "Bad format: specify interval in integral minutes" @@ -167,115 +167,135 @@ msgstr "length-ratio" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "arc-arc-length-ratio" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "arc-line-length-ratio" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "length-difference" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "arc-arc-len-difference" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "arc-line-len-difference" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "symmetric" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "symmetric-h" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "symmetric-v" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "symmetric-line" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "at-midpoint" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "horizontal" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "vertical" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "diameter" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "pt-on-circle" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "same-orientation" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "angle" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "parallel" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "arc-line-tangent" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "cubic-line-tangent" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "curve-curve-tangent" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "perpendicular" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "eq-radius" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "eq-angle" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "eq-line-len-arc-len" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "lock-where-dragged" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "comment" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -283,7 +303,7 @@ msgstr "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -291,7 +311,7 @@ msgstr "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -299,7 +319,7 @@ msgstr "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -323,7 +343,7 @@ msgstr "" " * a plane face and a point (minimum distance)\n" " * a circle or an arc (diameter)\n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -343,7 +363,7 @@ msgstr "" " * a point and a circle or arc (point on curve)\n" " * a point and a plane face (point on face)\n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -371,29 +391,37 @@ msgstr "" " * two circles or arcs (equal radius)\n" " * a line segment and an arc (line segment length equals arc length)\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -405,43 +433,43 @@ msgstr "" " * a line segment and a point (point at midpoint)\n" " * a line segment and a workplane (line's midpoint on plane)\n" -#: constraint.cpp:486 -msgid "" -"Bad selection for symmetric constraint. This constraint can apply to:\n" -"\n" -" * two points or a line segment (symmetric about workplane's coordinate " -"axis)\n" -" * line segment, and two points or a line segment (symmetric about line " -"segment)\n" -" * workplane, and two points or a line segment (symmetric about " -"workplane)\n" -msgstr "" -"Bad selection for symmetric constraint. This constraint can apply to:\n" -"\n" -" * two points or a line segment (symmetric about workplane's coordinate " -"axis)\n" -" * line segment, and two points or a line segment (symmetric about line " -"segment)\n" -" * workplane, and two points or a line segment (symmetric about " -"workplane)\n" - -#: constraint.cpp:500 -msgid "" -"A workplane must be active when constraining symmetric without an explicit " -"symmetry plane." -msgstr "" -"A workplane must be active when constraining symmetric without an explicit " -"symmetry plane." - #: constraint.cpp:530 msgid "" +"Bad selection for symmetric constraint. This constraint can apply to:\n" +"\n" +" * two points or a line segment (symmetric about workplane's coordinate " +"axis)\n" +" * line segment, and two points or a line segment (symmetric about line " +"segment)\n" +" * workplane, and two points or a line segment (symmetric about " +"workplane)\n" +msgstr "" +"Bad selection for symmetric constraint. This constraint can apply to:\n" +"\n" +" * two points or a line segment (symmetric about workplane's coordinate " +"axis)\n" +" * line segment, and two points or a line segment (symmetric about line " +"segment)\n" +" * workplane, and two points or a line segment (symmetric about " +"workplane)\n" + +#: constraint.cpp:545 +msgid "" +"A workplane must be active when constraining symmetric without an explicit " +"symmetry plane." +msgstr "" +"A workplane must be active when constraining symmetric without an explicit " +"symmetry plane." + +#: constraint.cpp:579 +msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." msgstr "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -455,7 +483,7 @@ msgstr "" " * two points\n" " * a line segment\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -467,15 +495,15 @@ msgstr "" "\n" " * two normals\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "Must select an angle constraint." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "Must select a constraint with associated label." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -489,11 +517,11 @@ msgstr "" " * a line segment and a normal\n" " * two normals\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "Curve-curve tangency must apply in workplane." -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -511,7 +539,7 @@ msgstr "" " * two normals (parallel)\n" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -525,7 +553,7 @@ msgstr "" " * a line segment and a normal\n" " * two normals\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -537,7 +565,11 @@ msgstr "" "\n" " * a point\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "NEW COMMENT -- DOUBLE-CLICK TO EDIT" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "click center of comment text" @@ -565,25 +597,25 @@ msgstr "" " * a point and two line segments (plane through point and parallel to " "lines)\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "Active group mesh is empty; nothing to export." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "freehand lines were replaced with continuous lines" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "zigzag lines were replaced with continuous lines" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -599,11 +631,11 @@ msgctxt "group-name" msgid "#references" msgstr "#references" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "The file is empty. It may be corrupt." -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -645,7 +677,7 @@ msgctxt "button" msgid "&No" msgstr "&No" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "&Cancel" @@ -819,295 +851,303 @@ msgid "Use &Perspective Projection" msgstr "Use &Perspective Projection" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "Show E&xploded View" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "Dimension &Units" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "Dimensions in &Millimeters" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "Dimensions in M&eters" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "Dimensions in &Inches" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "Dimensions in &Feet and Inches" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "Show &Toolbar" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "Show Property Bro&wser" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "&Full Screen" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "&New Group" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "Sketch In &3d" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "Sketch In New &Workplane" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "Step &Translating" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "Step &Rotating" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "E&xtrude" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "&Helix" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "&Lathe" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "Re&volve" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "Link / Assemble..." -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "Link Recent" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Sketch" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "In &Workplane" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "Anywhere In &3d" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "Datum &Point" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "&Workplane" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "Line &Segment" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "C&onstruction Line Segment" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "&Rectangle" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "&Circle" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "&Arc of a Circle" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "&Bezier Cubic Spline" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "&Text in TrueType Font" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "&Image" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "To&ggle Construction" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "Tangent &Arc at Point" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Split Curves at &Intersection" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Constrain" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "&Distance / Diameter" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "Re&ference Dimension" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "A&ngle" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "Reference An&gle" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Other S&upplementary Angle" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Toggle R&eference Dim" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "&Horizontal" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Vertical" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "&On Point / Curve / Plane" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "E&qual Length / Radius / Angle" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "Length Ra&tio" - -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "Length Diff&erence" - #: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "Length / Arc Ra&tio" + +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "Length / Arc Diff&erence" + +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "At &Midpoint" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "S&ymmetric" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "Para&llel / Tangent" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "&Perpendicular" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Same Orient&ation" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "Lock Point Where &Dragged" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Comment" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Analyze" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "Measure &Volume" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "Measure A&rea" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "Measure &Perimeter" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "Show &Interfering Parts" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "Show &Naked Edges" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "Show &Center of Mass" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "Show &Underconstrained Points" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "&Trace Point" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "&Stop Tracing..." -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Step &Dimension..." -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Help" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "&Language" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "&Website / Manual" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "&About" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(no recent files)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "File '%s' does not exist." -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "No workplane is active, so the grid will not appear." -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1121,17 +1161,17 @@ msgstr "" "For a perspective projection, modify the perspective factor in the " "configuration screen. A value around 0.3 is typical." -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Select a point; this point will become the center of the view on screen." -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "No additional entities share endpoints with the selected entities." -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1139,7 +1179,7 @@ msgstr "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." -#: graphicswin.cpp:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1147,7 +1187,7 @@ msgstr "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1155,11 +1195,11 @@ msgstr "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." -#: graphicswin.cpp:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "No workplane selected. Activating default workplane for this group." -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1169,7 +1209,7 @@ msgstr "" "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1177,47 +1217,47 @@ msgstr "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "click point on arc (draws anti-clockwise)" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "click to place datum point" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "click first point of line segment" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "click first point of construction line segment" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "click first point of cubic segment" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "click center of circle" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "click origin of workplane" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "click one corner of rectangle" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "click top left of text" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "click top left of image" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1230,13 +1270,14 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "sketch-in-3d" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" "Bad selection for new sketch in workplane. This group can be created with:\n" @@ -1244,9 +1285,10 @@ msgstr "" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1254,16 +1296,16 @@ msgstr "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "extrude" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "Lathe operation can only be applied to planar sketches." -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1277,16 +1319,16 @@ msgstr "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "lathe" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "Revolve operation can only be applied to planar sketches." -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1300,16 +1342,16 @@ msgstr "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "revolve" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "Helix operation can only be applied to planar sketches." -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1323,12 +1365,12 @@ msgstr "" "to line / normal, through point)\n" " * a line segment (revolved about line segment)\n" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "helix" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1344,41 +1386,41 @@ msgstr "" " * a point and a line or a normal (rotate about an axis through the " "point, and parallel to line / normal)\n" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "rotate" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "translate" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "(unnamed)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "not closed contour, or not all same style!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "points not all coplanar!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "contour is self-intersecting!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "zero-length edge!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Must be sketching in workplane to create tangent arc." -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1386,7 +1428,7 @@ msgstr "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1394,15 +1436,15 @@ msgstr "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "Couldn't split this entity; lines, circles, or cubics only." -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "Must be sketching in workplane to split." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." @@ -1410,107 +1452,107 @@ msgstr "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "Can't split; no intersection found." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Assign to Style" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "No Style" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Newly Created Custom Style..." -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Group Info" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Style Info" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Select Edge Chain" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Toggle Reference Dimension" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Other Supplementary Angle" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Snap to Grid" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Remove Spline Point" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Add Spline Point" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "Cannot add spline point: maximum number of points reached." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Toggle Construction" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Delete Point-Coincident Constraint" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Cut" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Copy" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Select All" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Paste" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Paste Transformed..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Delete" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Unselect All" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Unselect Hovered" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Zoom to Fit" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "click next point of line, or press Esc" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1518,15 +1560,15 @@ msgstr "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "click to place other corner of rectangle" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "click to set radius" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1534,21 +1576,21 @@ msgstr "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "click to place point" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "click next point of cubic, or press Esc" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Sketching in a workplane already; sketch in 3d before creating new workplane." -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1556,11 +1598,11 @@ msgstr "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "click to place bottom right of text" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1568,193 +1610,199 @@ msgstr "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "NEW COMMENT -- DOUBLE-CLICK TO EDIT" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace models" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "ALL" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "IDF circuit board" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "STL triangle mesh" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "PNG image" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "STL mesh" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ mesh" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-compatible mesh, with viewer" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-compatible mesh, mesh only" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "VRML text file" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "STEP file" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "PDF file" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Encapsulated PostScript" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "Scalable Vector Graphics" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF file (AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL file" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF and DWG files" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "Comma-separated values" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "untitled" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Save File" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Open File" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "_Cancel" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "_Save" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "_Open" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "Autosave Available" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "An autosave file is available for this sketch." -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Do you want to load the autosave file instead?" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "&Load autosave" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "Do&n't Load" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "Modified File" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Do you want to save the changes you made to the sketch “%s”?" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Do you want to save the changes you made to the new sketch?" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Your changes will be lost if you don't save them." -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "&Save" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "Do&n't Save" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "(new sketch)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "Property Browser" -#: solvespace.cpp:658 +#: solvespace.cpp:699 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " @@ -1764,7 +1812,7 @@ msgstr "" "is probably not what you want; hide them by clicking the link at the top of " "the text window." -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." @@ -1773,19 +1821,19 @@ msgstr "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "Constraint must have a label, and must not be a reference dimension." -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "Bad selection for step dimension; select a constraint." -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "The assembly does not interfere, good." -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1796,7 +1844,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1809,7 +1857,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1821,7 +1869,7 @@ msgstr "" "Curved surfaces have been approximated as triangles.\n" "This introduces error, typically of around 1%." -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1838,7 +1886,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1846,7 +1894,7 @@ msgstr "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1863,7 +1911,7 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1880,36 +1928,36 @@ msgstr "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "Bad selection for perimeter; select line segments, arcs, and curves." -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "Bad selection for trace; select a single point." -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "Couldn't write to '%s'" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "The mesh is self-intersecting (NOT okay, invalid)." -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "The mesh is not self-intersecting (okay, valid)." -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "The mesh has naked edges (NOT okay, invalid)." -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "The mesh is watertight (okay, valid)." -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1920,7 +1968,7 @@ msgstr "" "\n" "The model contains %d triangles, from %d surfaces." -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1935,7 +1983,7 @@ msgstr "" "\n" "Zero problematic edges, good.%s" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1950,7 +1998,7 @@ msgstr "" "\n" "%d problematic edges, bad.%s" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1979,7 +2027,7 @@ msgstr "" "\n" "© 2008-%d Jonathan Westhues and other authors.\n" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -1987,27 +2035,27 @@ msgstr "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "Style name cannot be empty" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "Can't repeat fewer than 1 time." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "Can't repeat more than 999 times." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "Group name cannot be empty" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "Opacity must be between zero and one." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "Radius cannot be zero or negative." @@ -2162,14 +2210,64 @@ msgctxt "button" msgid "&OK" msgstr "&OK" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "Scale cannot be zero or negative." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "Bad format: specify x, y, z" +#~ msgid "&Mirror" +#~ msgstr "&Mirror" + +#~ msgctxt "group-name" +#~ msgid "mirror" +#~ msgstr "mirror" + +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "Length Ra&tio" + +#~ msgid "Length Diff&erence" +#~ msgstr "Length Diff&erence" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" + #~ msgctxt "file-type" #~ msgid "Q3D Object file" #~ msgstr "Q3D Object file" diff --git a/res/locales/es_AR.po b/res/locales/es_AR.po new file mode 100644 index 00000000..74638f0a --- /dev/null +++ b/res/locales/es_AR.po @@ -0,0 +1,2276 @@ +# Spanish/Argentina translations for SolveSpace package. +# Copyright (C) 2017 the SolveSpace authors +# This file is distributed under the same license as the SolveSpace package. +# Maxi , 2021. +# +msgid "" +msgstr "" +"Project-Id-Version: SolveSpace 3.0\n" +"Report-Msgid-Bugs-To: whitequark@whitequark.org\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"PO-Revision-Date: 2021-09-17 \n" +"Last-Translator: andesfreedesign@gmail.com\n" +"Language-Team: AndesFreeDesign\n" +"Language: es_AR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: clipboard.cpp:309 +msgid "" +"Cut, paste, and copy work only in a workplane.\n" +"\n" +"Activate one with Sketch -> In Workplane." +msgstr "" +"Cortar, pegar y copiar trabajo\n" +"solo en un plano de trabajo.\n" +"Activar uno con Croquis-> En Plano de trabajo" + +#: clipboard.cpp:326 +msgid "Clipboard is empty; nothing to paste." +msgstr "El portapapeles está vacío; nada que pegar." + +#: clipboard.cpp:373 +msgid "Number of copies to paste must be at least one." +msgstr "El número de copias para pegar debe ser al menos una." + +#: clipboard.cpp:389 textscreens.cpp:827 +msgid "Scale cannot be zero." +msgstr "La escala no puede ser cero." + +#: clipboard.cpp:431 +msgid "Select one point to define origin of rotation." +msgstr "Seleccione un punto para definir el origen de la rotación." + +#: clipboard.cpp:443 +msgid "Select two points to define translation vector." +msgstr "Seleccione dos puntos para definir el vector de traslación." + +#: clipboard.cpp:453 +msgid "" +"Transformation is identity. So all copies will be exactly on top of each " +"other." +msgstr "" +"No se especificó ninguna transformación. Todas las copias estarán ubicadas " +"en el mismo lugar." + +#: clipboard.cpp:457 +msgid "Too many items to paste; split this into smaller pastes." +msgstr "Demasiados elementos para pegar; divida esto en partes más pequeñas." + +#: clipboard.cpp:462 +msgid "No workplane active." +msgstr "Ningún plano de trabajo activo." + +#: confscreen.cpp:376 +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 +msgid "Bad format: specify color as r, g, b" +msgstr "Formato incorrecto: especifique color como r, g, b" + +#: confscreen.cpp:412 +msgid "" +"The perspective factor will have no effect until you enable View -> Use " +"Perspective Projection." +msgstr "" +"El factor de perspectiva no tendrá ningún efecto hasta que habilite Ver -> " +"UsarProyección Perspectiva." + +#: confscreen.cpp:430 confscreen.cpp:440 +#, c-format +msgid "Specify between 0 and %d digits after the decimal." +msgstr "Especifique entre 0 y %d dígitos después del decimal." + +#: confscreen.cpp:452 +msgid "Export scale must not be zero!" +msgstr "¡La escala de exportación no debe ser cero!" + +#: confscreen.cpp:464 +msgid "Cutter radius offset must not be negative!" +msgstr "¡El desfase del radio de corte no debe ser negativo!" + +#: confscreen.cpp:518 +msgid "Bad value: autosave interval should be positive" +msgstr "Valor incorrecto: el intervalo de autoguardado debe ser positivo" + +#: confscreen.cpp:521 +msgid "Bad format: specify interval in integral minutes" +msgstr "Formato incorrecto: especifique el intervalo en minutos integrales" + +#: constraint.cpp:12 +msgctxt "constr-name" +msgid "pts-coincident" +msgstr "ps-coincidente" + +#: constraint.cpp:13 +msgctxt "constr-name" +msgid "pt-pt-distance" +msgstr "p-p-distancia" + +#: constraint.cpp:14 +msgctxt "constr-name" +msgid "pt-line-distance" +msgstr "p-línea-distancia" + +#: constraint.cpp:15 +msgctxt "constr-name" +msgid "pt-plane-distance" +msgstr "p-plano-distancia" + +#: constraint.cpp:16 +msgctxt "constr-name" +msgid "pt-face-distance" +msgstr "p-cara-distancia" + +#: constraint.cpp:17 +msgctxt "constr-name" +msgid "proj-pt-pt-distance" +msgstr "proy-p-p-distancia" + +#: constraint.cpp:18 +msgctxt "constr-name" +msgid "pt-in-plane" +msgstr "p-en-plano" + +#: constraint.cpp:19 +msgctxt "constr-name" +msgid "pt-on-line" +msgstr "p-sobre-línea" + +#: constraint.cpp:20 +msgctxt "constr-name" +msgid "pt-on-face" +msgstr "p-sobre-cara" + +#: constraint.cpp:21 +msgctxt "constr-name" +msgid "eq-length" +msgstr "igual-longitud" + +#: constraint.cpp:22 +msgctxt "constr-name" +msgid "eq-length-and-pt-ln-dist" +msgstr "igual-longitud-y-p-línea-dist" + +#: constraint.cpp:23 +msgctxt "constr-name" +msgid "eq-pt-line-distances" +msgstr "igual-p-línea-distancias" + +#: constraint.cpp:24 +msgctxt "constr-name" +msgid "length-ratio" +msgstr "longitud-radio" + +#: constraint.cpp:25 +msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" +msgid "length-difference" +msgstr "longitud-diferencia" + +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 +msgctxt "constr-name" +msgid "symmetric" +msgstr "simetría" + +#: constraint.cpp:31 +msgctxt "constr-name" +msgid "symmetric-h" +msgstr "simetría-h" + +#: constraint.cpp:32 +msgctxt "constr-name" +msgid "symmetric-v" +msgstr "simetría-v" + +#: constraint.cpp:33 +msgctxt "constr-name" +msgid "symmetric-line" +msgstr "simetría-línea" + +#: constraint.cpp:34 +msgctxt "constr-name" +msgid "at-midpoint" +msgstr "en-puntoMedio" + +#: constraint.cpp:35 +msgctxt "constr-name" +msgid "horizontal" +msgstr "horizontal" + +#: constraint.cpp:36 +msgctxt "constr-name" +msgid "vertical" +msgstr "vertical" + +#: constraint.cpp:37 +msgctxt "constr-name" +msgid "diameter" +msgstr "diámetro" + +#: constraint.cpp:38 +msgctxt "constr-name" +msgid "pt-on-circle" +msgstr "p-sobre-círculo" + +#: constraint.cpp:39 +msgctxt "constr-name" +msgid "same-orientation" +msgstr "misma-orientación" + +#: constraint.cpp:40 +msgctxt "constr-name" +msgid "angle" +msgstr "ángulo" + +#: constraint.cpp:41 +msgctxt "constr-name" +msgid "parallel" +msgstr "paralela" + +#: constraint.cpp:42 +msgctxt "constr-name" +msgid "arc-line-tangent" +msgstr "arco-línea-tangente" + +#: constraint.cpp:43 +msgctxt "constr-name" +msgid "cubic-line-tangent" +msgstr "cúbica-línea-tangente" + +#: constraint.cpp:44 +msgctxt "constr-name" +msgid "curve-curve-tangent" +msgstr "curva-curva-tangente" + +#: constraint.cpp:45 +msgctxt "constr-name" +msgid "perpendicular" +msgstr "perpendicular" + +#: constraint.cpp:46 +msgctxt "constr-name" +msgid "eq-radius" +msgstr "igual-radio" + +#: constraint.cpp:47 +msgctxt "constr-name" +msgid "eq-angle" +msgstr "igual-ángulo" + +#: constraint.cpp:48 +msgctxt "constr-name" +msgid "eq-line-len-arc-len" +msgstr "igual-línea-long-arco-long" + +#: constraint.cpp:49 +msgctxt "constr-name" +msgid "lock-where-dragged" +msgstr "fijación" + +#: constraint.cpp:50 +msgctxt "constr-name" +msgid "comment" +msgstr "comentario" + +#: constraint.cpp:144 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "" +"El arco tangente y la línea deben compartir un punto final. Restringirlos " +"con Restringir -> En el punto antes de restringir la tangente." + +#: constraint.cpp:163 +msgid "" +"The tangent cubic and line segment must share an endpoint. Constrain them " +"with Constrain -> On Point before constraining tangent." +msgstr "" +"La tangente cúbica y la línea deben compartir un punto final. Restringirlos " +"con Restringir -> En el punto antes de restringir la tangente." + +#: constraint.cpp:189 +msgid "" +"The curves must share an endpoint. Constrain them with Constrain -> On Point " +"before constraining tangent." +msgstr "" +"Las curvas deben compartir un punto final. Restringirlos con Restringir -> " +"En el punto antes de restringir la tangente." + +#: constraint.cpp:238 +msgid "" +"Bad selection for distance / diameter constraint. This constraint can apply " +"to:\n" +"\n" +" * two points (distance between points)\n" +" * a line segment (length)\n" +" * two points and a line segment or normal (projected distance)\n" +" * a workplane and a point (minimum distance)\n" +" * a line segment and a point (minimum distance)\n" +" * a plane face and a point (minimum distance)\n" +" * a circle or an arc (diameter)\n" +msgstr "" +"Mala selección para la restricción de distancia / diámetro. Esta restricción " +"puede aplicarse a:\n" +"\n" +" * dos puntos (distancia entre puntos) \n" +" * un segmento de línea (longitud) \n" +" * dos puntos y un segmento de línea o normal (distancia proyectada) \n" +" * un plano de trabajo y un punto (distancia mínima) \n" +" * un segmento de línea y un punto (distancia mínima) \n" +" * una cara plana y un punto (distancia mínima) \n" +" * un círculo o un arco (diámetro) \n" + +#: constraint.cpp:291 +msgid "" +"Bad selection for on point / curve / plane constraint. This constraint can " +"apply to:\n" +"\n" +" * two points (points coincident)\n" +" * a point and a workplane (point in plane)\n" +" * a point and a line segment (point on line)\n" +" * a point and a circle or arc (point on curve)\n" +" * a point and a plane face (point on face)\n" +msgstr "" +"Mala selección para una restricción de punto / curva / plano. Esta " +"restricción puedeaplicar a: \n" +"\n" +" * dos puntos (puntos coincidentes) \n" +" * un punto y un plano de trabajo (punto en el plano) \n" +" * un punto y un segmento de línea (punto en la línea) \n" +" * un punto y un círculo o arco (punto en la curva) \n" +" * un punto y una cara plana (punto en la cara) \n" + +#: constraint.cpp:353 +msgid "" +"Bad selection for equal length / radius constraint. This constraint can " +"apply to:\n" +"\n" +" * two line segments (equal length)\n" +" * two line segments and two points (equal point-line distances)\n" +" * a line segment and two points (equal point-line distances)\n" +" * a line segment, and a point and line segment (point-line distance " +"equals length)\n" +" * four line segments or normals (equal angle between A,B and C,D)\n" +" * three line segments or normals (equal angle between A,B and B,C)\n" +" * two circles or arcs (equal radius)\n" +" * a line segment and an arc (line segment length equals arc length)\n" +msgstr "" +"Mala selección para restricción de igualdad longitud / radio. Esta " +"restricción puede aplicar a:\n" +"\n" +" * dos segmentos de línea (igual longitud)\n" +" * dos segmentos de línea y dos puntos (distancias de línea-punto " +"iguales)\n" +" * un segmento de línea y dos puntos (distancias punto-línea iguales)\n" +" * un segmento de línea, y un punto y un segmento de línea (distancia " +"punto-línea igual a la longitud)\n" +" * cuatro segmentos de línea o normales (ángulo igual entre A,B y C,D)\n" +" * tres segmentos de línea o normales (ángulo igual entre A,B y B,C)\n" +" * 2 círculos o arcos (igual radio)\n" +" * un segmento de línea y un arco (la longitud del segmento de línea es " +"igual a la longitud del arco)\n" + +#: constraint.cpp:407 +msgid "" +"Bad selection for length ratio constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" +msgstr "" + +#: constraint.cpp:441 +msgid "" +"Bad selection for length difference constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" +msgstr "" + +#: constraint.cpp:472 +msgid "" +"Bad selection for at midpoint constraint. This constraint can apply to:\n" +"\n" +" * a line segment and a point (point at midpoint)\n" +" * a line segment and a workplane (line's midpoint on plane)\n" +msgstr "" +"Mala selección para una restricción de punto medio. Esta restricción se " +"puede aplicar a:\n" +"\n" +" * un segmento de línea y un punto (punto en el punto medio)\n" +" * un segmento de línea y un plano de trabajo (punto medio de la línea en " +"el plano)\n" + +#: constraint.cpp:530 +msgid "" +"Bad selection for symmetric constraint. This constraint can apply to:\n" +"\n" +" * two points or a line segment (symmetric about workplane's coordinate " +"axis)\n" +" * line segment, and two points or a line segment (symmetric about line " +"segment)\n" +" * workplane, and two points or a line segment (symmetric about " +"workplane)\n" +msgstr "" +"Mala selección por restricción simétrica. Esta restricción se puede aplicar " +"a:\n" +"\n" +" * dos puntos o un segmento de línea (simétrico con respecto al eje de " +"coordenadas del plano de trabajo)\n" +" * segmento de línea, y dos puntos o un segmento de línea (simétrico con " +"respecto al segmento de línea)\n" +" * plano de trabajo, y dos puntos o un segmento de recta (simétrico sobre " +"plano de trabajo)\n" + +#: constraint.cpp:545 +msgid "" +"A workplane must be active when constraining symmetric without an explicit " +"symmetry plane." +msgstr "" +"Un plano de trabajo debe estar activo al restringir simétrico sin un plano " +"de simetría explícito." + +#: constraint.cpp:579 +msgid "" +"Activate a workplane (with Sketch -> In Workplane) before applying a " +"horizontal or vertical constraint." +msgstr "" +"Active un plano de trabajo (con Croquis -> En plano de trabajo) antes de " +"aplicar una restricción horizontal o vertical." + +#: constraint.cpp:592 +msgid "" +"Bad selection for horizontal / vertical constraint. This constraint can " +"apply to:\n" +"\n" +" * two points\n" +" * a line segment\n" +msgstr "" +"Mala selección por restricción horizontal / vertical. Esta restricción puede " +"aplicar a:\n" +"\n" +" * dos puntos\n" +" * un segmento de línea\n" + +#: constraint.cpp:613 +msgid "" +"Bad selection for same orientation constraint. This constraint can apply " +"to:\n" +"\n" +" * two normals\n" +msgstr "" +"Mala selección para la misma restricción de orientación. Esta restricción " +"puede aplicarse a:\n" +"\n" +" * dos normales\n" + +#: constraint.cpp:663 +msgid "Must select an angle constraint." +msgstr "Debe seleccionar una restricción de ángulo." + +#: constraint.cpp:676 +msgid "Must select a constraint with associated label." +msgstr "Debe seleccionar una restricción con etiqueta asociada." + +#: constraint.cpp:687 +msgid "" +"Bad selection for angle constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"Mala selección por restricción de ángulo. Esta restricción se puede aplicar " +"a:\n" +"\n" +" * dos segmentos de línea\n" +" * un segmento de linea y una normal\n" +" * dos normales\n" + +#: constraint.cpp:754 +msgid "Curve-curve tangency must apply in workplane." +msgstr "La tangencia curva-curva debe aplicarse en el plano de trabajo." + +#: constraint.cpp:766 +msgid "" +"Bad selection for parallel / tangent constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments (parallel)\n" +" * a line segment and a normal (parallel)\n" +" * two normals (parallel)\n" +" * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" +msgstr "" +"Mala selección para restricción de paralelo / tangente. Esta restricción " +"puede aplicarse a:\n" +"\n" +" * dos segmentos de línea (paralelos)\n" +" * un segmento de línea y una normal (paralelas)\n" +" * dos normales (paralelas)\n" +" * dos segmentos de línea, arcos, o beziers, que comparten un punto final " +"(tangente)\n" + +#: constraint.cpp:784 +msgid "" +"Bad selection for perpendicular constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"Mala selección por restricción perpendicular. Esta restricción se puede " +"aplicar a:\n" +"\n" +" * dos segmentos de línea\n" +" * un segmento de línea y una normal\n" +" * dos normales\n" + +#: constraint.cpp:799 +msgid "" +"Bad selection for lock point where dragged constraint. This constraint can " +"apply to:\n" +"\n" +" * a point\n" +msgstr "" +"Mala selección para el punto de bloqueo donde se arrastró la restricción. " +"Esta restricción puede aplicar a:\n" +"\n" +" * un punto\n" + +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "NUEVO COMENTARIO -- DOBLE-CLIC PARA EDITAR" + +#: constraint.cpp:818 +msgid "click center of comment text" +msgstr "clic en el centro del texto del comentario" + +#: export.cpp:19 +msgid "" +"No solid model present; draw one with extrudes and revolves, or use Export " +"2d View to export bare lines and curves." +msgstr "" +"No hay un modelo sólido presente; dibuje uno con extrusiones y revoluciones, " +"o use Exportar Vista 2d para exportar líneas y curvas desnudas." + +#: export.cpp:61 +msgid "" +"Bad selection for export section. Please select:\n" +"\n" +" * nothing, with an active workplane (workplane is section plane)\n" +" * a face (section plane through face)\n" +" * a point and two line segments (plane through point and parallel to " +"lines)\n" +msgstr "" +"Mala selección para la sección de exportación. Por favor seleccione:\n" +"\n" +" * nada, con un plano de trabajo activo (el plano de trabajo es un plano " +"de sección)\n" +" * una cara (plano de sección a través de la cara)\n" +" * un punto y dos segmentos de línea (plano que pasa por el punto y " +"paralelo a las líneas)\n" + +#: export.cpp:818 +msgid "Active group mesh is empty; nothing to export." +msgstr "La malla del grupo activo está vacía; nada para exportar." + +#: exportvector.cpp:336 +msgid "freehand lines were replaced with continuous lines" +msgstr "Las líneas a mano alzada fueron reemplazadas por líneas continuas." + +#: exportvector.cpp:338 +msgid "zigzag lines were replaced with continuous lines" +msgstr "Las líneas en zigzag fueron reemplazadas por líneas continuas." + +#: exportvector.cpp:592 +msgid "" +"Some aspects of the drawing have no DXF equivalent and were not exported:\n" +msgstr "" +"Algunos aspectos del dibujo no tienen equivalente DXF y no se exportaron:\n" + +#: exportvector.cpp:838 +msgid "" +"PDF page size exceeds 200 by 200 inches; many viewers may reject this file." +msgstr "" +"El tamaño de la página PDF supera las 5080mm x 5080mm; muchos usuarios " +"pueden rechazar este archivo." + +#: file.cpp:44 group.cpp:91 +msgctxt "group-name" +msgid "sketch-in-plane" +msgstr "croquis-en-plano" + +#: file.cpp:62 +msgctxt "group-name" +msgid "#references" +msgstr "#referencias" + +#: file.cpp:550 +msgid "The file is empty. It may be corrupt." +msgstr "El archivo esta vacío. Puede estar corrupto." + +#: file.cpp:555 +msgid "" +"Unrecognized data in file. This file may be corrupt, or from a newer version " +"of the program." +msgstr "" +"Datos no reconocidos en el archivo. Este archivo puede estar dañado o ser de " +"una versión más reciente del programa." + +#: file.cpp:867 +msgctxt "title" +msgid "Missing File" +msgstr "Archivo perdido" + +#: file.cpp:868 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "El archivo vinculado “%s” no esta presente." + +#: file.cpp:870 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." +msgstr "" +"¿Quieres localizarlo manualmente?\n" +"\n" +"Si lo rechaza, cualquier geometría que dependa del archivo faltante se " +"eliminará permanentemente." + +#: file.cpp:873 +msgctxt "button" +msgid "&Yes" +msgstr "&Si" + +#: file.cpp:875 +msgctxt "button" +msgid "&No" +msgstr "&No" + +#: file.cpp:877 solvespace.cpp:610 +msgctxt "button" +msgid "&Cancel" +msgstr "&Cancelar" + +#: graphicswin.cpp:41 +msgid "&File" +msgstr "&Archivo" + +#: graphicswin.cpp:42 +msgid "&New" +msgstr "&Nuevo" + +#: graphicswin.cpp:43 +msgid "&Open..." +msgstr "&Abrir..." + +#: graphicswin.cpp:44 +msgid "Open &Recent" +msgstr "Abrir &Reciente" + +#: graphicswin.cpp:45 +msgid "&Save" +msgstr "&Guardar" + +#: graphicswin.cpp:46 +msgid "Save &As..." +msgstr "Guardar &Como..." + +#: graphicswin.cpp:48 +msgid "Export &Image..." +msgstr "Exportar &Imagen..." + +#: graphicswin.cpp:49 +msgid "Export 2d &View..." +msgstr "Exportar 2d &Vista..." + +#: graphicswin.cpp:50 +msgid "Export 2d &Section..." +msgstr "Exportar 2d &Corte..." + +#: graphicswin.cpp:51 +msgid "Export 3d &Wireframe..." +msgstr "Exportar 3d &Estructura alámbrica..." + +#: graphicswin.cpp:52 +msgid "Export Triangle &Mesh..." +msgstr "Exportar Triángulo &Malla..." + +#: graphicswin.cpp:53 +msgid "Export &Surfaces..." +msgstr "Exportar &Superficies..." + +#: graphicswin.cpp:54 +msgid "Im&port..." +msgstr "Im&portar..." + +#: graphicswin.cpp:57 +msgid "E&xit" +msgstr "S&alir" + +#: graphicswin.cpp:60 +msgid "&Edit" +msgstr "&Editar" + +#: graphicswin.cpp:61 +msgid "&Undo" +msgstr "&Deshacer" + +#: graphicswin.cpp:62 +msgid "&Redo" +msgstr "&Rehacer" + +#: graphicswin.cpp:63 +msgid "Re&generate All" +msgstr "Re&generar Todo" + +#: graphicswin.cpp:65 +msgid "Snap Selection to &Grid" +msgstr "Selección Enganche a &Cuadrícula" + +#: graphicswin.cpp:66 +msgid "Rotate Imported &90°" +msgstr "Rotar importado a &90°" + +#: graphicswin.cpp:68 +msgid "Cu&t" +msgstr "Cor&tar" + +#: graphicswin.cpp:69 +msgid "&Copy" +msgstr "&Copiar" + +#: graphicswin.cpp:70 +msgid "&Paste" +msgstr "&Pegar" + +#: graphicswin.cpp:71 +msgid "Paste &Transformed..." +msgstr "Pegar &Тransformar..." + +#: graphicswin.cpp:72 +msgid "&Delete" +msgstr "&Borrar" + +#: graphicswin.cpp:74 +msgid "Select &Edge Chain" +msgstr "Seleccionar Cadena de &Aristas" + +#: graphicswin.cpp:75 +msgid "Select &All" +msgstr "Seleccionar &Todo" + +#: graphicswin.cpp:76 +msgid "&Unselect All" +msgstr "&Deseleccionar Todo" + +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "Estilos de Línea..." + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "&Ver Proyección..." + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "Con&figuración..." + +#: graphicswin.cpp:84 +msgid "&View" +msgstr "&Vista" + +#: graphicswin.cpp:85 +msgid "Zoom &In" +msgstr "Acer&car" + +#: graphicswin.cpp:86 +msgid "Zoom &Out" +msgstr "Ale&jar" + +#: graphicswin.cpp:87 +msgid "Zoom To &Fit" +msgstr " Enfoque para ajustar" + +#: graphicswin.cpp:89 +msgid "Align View to &Workplane" +msgstr "Alinear Vista a &Plano de trabajo" + +#: graphicswin.cpp:90 +msgid "Nearest &Ortho View" +msgstr "Vista &Ortogonal mas cercana" + +#: graphicswin.cpp:91 +msgid "Nearest &Isometric View" +msgstr "Vista &Isometrica mas cercana" + +#: graphicswin.cpp:92 +msgid "&Center View At Point" +msgstr "&Vista Central en Punto" + +#: graphicswin.cpp:94 +msgid "Show Snap &Grid" +msgstr "Mostrar Enganches &Cuadrícula" + +#: graphicswin.cpp:95 +msgid "Darken Inactive Solids" +msgstr "Oscurecer Sólidos Inactivos" + +#: graphicswin.cpp:96 +msgid "Use &Perspective Projection" +msgstr "Usar Proyección &Perspectiva" + +#: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 +msgid "Dimension &Units" +msgstr "&Unidades de Cota" + +#: graphicswin.cpp:99 +msgid "Dimensions in &Millimeters" +msgstr "Cotas en &Milímetros" + +#: graphicswin.cpp:100 +msgid "Dimensions in M&eters" +msgstr "Cotas en M&etros" + +#: graphicswin.cpp:101 +msgid "Dimensions in &Inches" +msgstr "Cotas en &Pulgadas" + +#: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 +msgid "Show &Toolbar" +msgstr "Mostrar &Barra de herramientas" + +#: graphicswin.cpp:105 +msgid "Show Property Bro&wser" +msgstr "Mostrar Nave&gador de Propiedades" + +#: graphicswin.cpp:107 +msgid "&Full Screen" +msgstr "&Pantalla Completa" + +#: graphicswin.cpp:109 +msgid "&New Group" +msgstr "&Nuevo Grupo" + +#: graphicswin.cpp:110 +msgid "Sketch In &3d" +msgstr "Сroquis En &3d" + +#: graphicswin.cpp:111 +msgid "Sketch In New &Workplane" +msgstr "Сroquis En Nuevo &Plano de trabajo" + +#: graphicswin.cpp:113 +msgid "Step &Translating" +msgstr "Paso &Traslación" + +#: graphicswin.cpp:114 +msgid "Step &Rotating" +msgstr "Paso &Giratorio" + +#: graphicswin.cpp:116 +msgid "E&xtrude" +msgstr "E&xtrusión" + +#: graphicswin.cpp:117 +msgid "&Helix" +msgstr "&Hélice" + +#: graphicswin.cpp:118 +msgid "&Lathe" +msgstr "&Torno" + +#: graphicswin.cpp:119 +msgid "Re&volve" +msgstr "Re&volución" + +#: graphicswin.cpp:121 +msgid "Link / Assemble..." +msgstr "Enlace / Ensamblar..." + +#: graphicswin.cpp:122 +msgid "Link Recent" +msgstr "Enlace Reciente" + +#: graphicswin.cpp:124 +msgid "&Sketch" +msgstr "&Croquis" + +#: graphicswin.cpp:125 +msgid "In &Workplane" +msgstr "En &Plano de trabajo" + +#: graphicswin.cpp:126 +msgid "Anywhere In &3d" +msgstr "En cualquier lugar en &3d" + +#: graphicswin.cpp:128 +msgid "Datum &Point" +msgstr "Referencia &Punto" + +#: graphicswin.cpp:129 +msgid "&Workplane" +msgstr "&Plano de trabajo" + +#: graphicswin.cpp:131 +msgid "Line &Segment" +msgstr "Línea &Segmento" + +#: graphicswin.cpp:132 +msgid "C&onstruction Line Segment" +msgstr "S&egmento de Línea de Construcción" + +#: graphicswin.cpp:133 +msgid "&Rectangle" +msgstr "&Rectángulo" + +#: graphicswin.cpp:134 +msgid "&Circle" +msgstr "&Círculo" + +#: graphicswin.cpp:135 +msgid "&Arc of a Circle" +msgstr "&Arco de un Círculo" + +#: graphicswin.cpp:136 +msgid "&Bezier Cubic Spline" +msgstr "&Spline Cúbico de Bezier" + +#: graphicswin.cpp:138 +msgid "&Text in TrueType Font" +msgstr "&Texto en Fuente TrueType" + +#: graphicswin.cpp:139 +msgid "&Image" +msgstr "&Imagen" + +#: graphicswin.cpp:141 +msgid "To&ggle Construction" +msgstr "Al&ternar Construcción" + +#: graphicswin.cpp:142 +msgid "Tangent &Arc at Point" +msgstr "Tangente &Arco en el Punto" + +#: graphicswin.cpp:143 +msgid "Split Curves at &Intersection" +msgstr "Dividir Curvas en &Intersección" + +#: graphicswin.cpp:145 +msgid "&Constrain" +msgstr "&Restricción" + +#: graphicswin.cpp:146 +msgid "&Distance / Diameter" +msgstr "&Distancia / Diámetro" + +#: graphicswin.cpp:147 +msgid "Re&ference Dimension" +msgstr "Co&ta de Referencia" + +#: graphicswin.cpp:148 +msgid "A&ngle" +msgstr "Á&ngulo" + +#: graphicswin.cpp:149 +msgid "Reference An&gle" +msgstr "Ángulo de Re&ferencia" + +#: graphicswin.cpp:150 +msgid "Other S&upplementary Angle" +msgstr "Otro Á&ngulo Suplementario" + +#: graphicswin.cpp:151 +msgid "Toggle R&eference Dim" +msgstr "Alternar C&ota Referencia" + +#: graphicswin.cpp:153 +msgid "&Horizontal" +msgstr "&Horizontal" + +#: graphicswin.cpp:154 +msgid "&Vertical" +msgstr "&Vertical" + +#: graphicswin.cpp:156 +msgid "&On Point / Curve / Plane" +msgstr "&Sobre Punto / Curva / Plano" + +#: graphicswin.cpp:157 +msgid "E&qual Length / Radius / Angle" +msgstr "I&gual Longitud / Radio / Ángulo" + +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" + +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" + +#: graphicswin.cpp:160 +msgid "At &Midpoint" +msgstr "En &PuntoMedio" + +#: graphicswin.cpp:161 +msgid "S&ymmetric" +msgstr "S&imetría" + +#: graphicswin.cpp:162 +msgid "Para&llel / Tangent" +msgstr "Para&lela / Tangente" + +#: graphicswin.cpp:163 +msgid "&Perpendicular" +msgstr "&Perpendicular" + +#: graphicswin.cpp:164 +msgid "Same Orient&ation" +msgstr "Misma Orient&ación" + +#: graphicswin.cpp:165 +msgid "Lock Point Where &Dragged" +msgstr "Punto de Bloqueo Donde &Arrastrado" + +#: graphicswin.cpp:167 +msgid "Comment" +msgstr "Comentario" + +#: graphicswin.cpp:169 +msgid "&Analyze" +msgstr "&Analizar" + +#: graphicswin.cpp:170 +msgid "Measure &Volume" +msgstr "Medición &Volumen" + +#: graphicswin.cpp:171 +msgid "Measure A&rea" +msgstr "Medición Á&rea" + +#: graphicswin.cpp:172 +msgid "Measure &Perimeter" +msgstr "Medición &Perímetro" + +#: graphicswin.cpp:173 +msgid "Show &Interfering Parts" +msgstr "Mostrar &Piezas que Interfieren" + +#: graphicswin.cpp:174 +msgid "Show &Naked Edges" +msgstr "Mostrar &Aristas Desnudas" + +#: graphicswin.cpp:175 +msgid "Show &Center of Mass" +msgstr "Mostrar &Centro de Masa" + +#: graphicswin.cpp:177 +msgid "Show &Underconstrained Points" +msgstr "Mostrar &Puntos Subrestringidos" + +#: graphicswin.cpp:179 +msgid "&Trace Point" +msgstr "&Punto de Rastro" + +#: graphicswin.cpp:180 +msgid "&Stop Tracing..." +msgstr "&Dejar de rastrear..." + +#: graphicswin.cpp:181 +msgid "Step &Dimension..." +msgstr "Cota &Paso..." + +#: graphicswin.cpp:183 +msgid "&Help" +msgstr "&Ayuda" + +#: graphicswin.cpp:184 +msgid "&Language" +msgstr "&Lenguaje" + +#: graphicswin.cpp:185 +msgid "&Website / Manual" +msgstr "&Sitio Web / Manual" + +#: graphicswin.cpp:187 +msgid "&About" +msgstr "&Acerca" + +#: graphicswin.cpp:361 +msgid "(no recent files)" +msgstr "(no hay archivos recientes)" + +#: graphicswin.cpp:369 +#, c-format +msgid "File '%s' does not exist." +msgstr "El archivo '%s' no existe." + +#: graphicswin.cpp:736 +msgid "No workplane is active, so the grid will not appear." +msgstr "" +"No hay ningún plano de trabajo activo, por lo que la cuadrícula no aparecerá." + +#: graphicswin.cpp:751 +msgid "" +"The perspective factor is set to zero, so the view will always be a parallel " +"projection.\n" +"\n" +"For a perspective projection, modify the perspective factor in the " +"configuration screen. A value around 0.3 is typical." +msgstr "" +"El factor de perspectiva se establece en cero, por lo que la vista siempre " +"será una proyección paralela.\n" +"\n" +"Para una proyección en perspectiva, modifique el factor de perspectiva en la " +"pantalla de configuración. Un valor de alrededor de 0,3 es típico." + +#: graphicswin.cpp:836 +msgid "" +"Select a point; this point will become the center of the view on screen." +msgstr "" +"Seleccione un punto; este punto se convertirá en el centro de la vista en " +"pantalla." + +#: graphicswin.cpp:1136 +msgid "No additional entities share endpoints with the selected entities." +msgstr "" +"Ninguna entidad adicional comparte puntos finales con las entidades " +"seleccionadas." + +#: graphicswin.cpp:1154 +msgid "" +"To use this command, select a point or other entity from an linked part, or " +"make a link group the active group." +msgstr "" +"Para usar este comando, seleccione un punto u otra entidad de una parte " +"vinculada, o convertir un grupo de enlaces en el grupo activo." + +#: graphicswin.cpp:1177 +msgid "" +"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " +"to define the plane for the snap grid." +msgstr "" +"No hay ningún plano de trabajo activo. Activar un plano de trabajo (con " +"Croquis -> En plano de trabajo) para definir el plano para el enganche a la " +"cuadrícula." + +#: graphicswin.cpp:1184 +msgid "" +"Can't snap these items to grid; select points, text comments, or constraints " +"with a label. To snap a line, select its endpoints." +msgstr "" +"No se pueden enganchar estos elementos a la cuadrícula; seleccionar puntos, " +"comentarios de texto o restricciones con una etiqueta. Para enganchar una " +"línea, seleccione sus puntos finales." + +#: graphicswin.cpp:1269 +msgid "No workplane selected. Activating default workplane for this group." +msgstr "" +"No se seleccionó ningún plano de trabajo. Activando el plano de trabajo " +"predeterminado para este grupo." + +#: graphicswin.cpp:1272 +msgid "" +"No workplane is selected, and the active group does not have a default " +"workplane. Try selecting a workplane, or activating a sketch-in-new-" +"workplane group." +msgstr "" +"No se selecciona ningún plano de trabajo y el grupo activo no tiene un plano " +"de trabajo. Intente seleccionar un plano de trabajo o activar un croquis-en-" +"nuevo-grupo de plano de trabajo." + +#: graphicswin.cpp:1293 +msgid "" +"Bad selection for tangent arc at point. Select a single point, or select " +"nothing to set up arc parameters." +msgstr "" +"Mala selección de arco tangente en el punto. Seleccione un solo punto o no " +"seleccione nada para configurar los parámetros del arco." + +#: graphicswin.cpp:1304 +msgid "click point on arc (draws anti-clockwise)" +msgstr "clic en el punto en el arco (dibuja en sentido antihorario)" + +#: graphicswin.cpp:1305 +msgid "click to place datum point" +msgstr "clic para colocar el punto de referencia" + +#: graphicswin.cpp:1306 +msgid "click first point of line segment" +msgstr "clic en el primer punto del segmento de línea" + +#: graphicswin.cpp:1308 +msgid "click first point of construction line segment" +msgstr "clic en el primer punto del segmento de línea de construcción" + +#: graphicswin.cpp:1309 +msgid "click first point of cubic segment" +msgstr "clic en el primer punto del segmento cúbico" + +#: graphicswin.cpp:1310 +msgid "click center of circle" +msgstr "clic en el centro del círculo" + +#: graphicswin.cpp:1311 +msgid "click origin of workplane" +msgstr "clic en origen del plano de trabajo" + +#: graphicswin.cpp:1312 +msgid "click one corner of rectangle" +msgstr "clic en una esquina del rectángulo" + +#: graphicswin.cpp:1313 +msgid "click top left of text" +msgstr "clic en la parte superior izquierda del texto" + +#: graphicswin.cpp:1319 +msgid "click top left of image" +msgstr "clic en la parte superior izquierda de la imagen" + +#: graphicswin.cpp:1345 +msgid "" +"No entities are selected. Select entities before trying to toggle their " +"construction state." +msgstr "" +"No se seleccionaron entidades. Seleccione entidades antes de intentar " +"alternar su estado de construcción." + +#: group.cpp:86 +msgctxt "group-name" +msgid "sketch-in-3d" +msgstr "croquis-en-3d" + +#: group.cpp:150 +msgid "" +"Bad selection for new sketch in workplane. This group can be created with:\n" +"\n" +" * a point (through the point, orthogonal to coordinate axes)\n" +" * a point and two line segments (through the point, parallel to the " +"lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" +" * a workplane (copy of the workplane)\n" +msgstr "" + +#: group.cpp:166 +msgid "" +"Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " +"will be extruded normal to the workplane." +msgstr "" +"Active un plano de trabajo (Croquis -> En plano de trabajo) antes de " +"extruir. El croquis se extruirá normal al plano de trabajo." + +#: group.cpp:175 +msgctxt "group-name" +msgid "extrude" +msgstr "extruir" + +#: group.cpp:180 +msgid "Lathe operation can only be applied to planar sketches." +msgstr "La operación de torno solo se puede aplicar a croquis planos." + +#: group.cpp:191 +msgid "" +"Bad selection for new lathe group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Mala selección para el nuevo grupo de torno. Este grupo se puede crear con:\n" +"\n" +" * un punto y un segmento de línea o normal (revolucionado alrededor de " +"un eje paralelo a la línea / normal, a través del punto)\n" +" * un segmento de línea (revolucionado sobre un segmento de línea)\n" + +#: group.cpp:201 +msgctxt "group-name" +msgid "lathe" +msgstr "torno" + +#: group.cpp:206 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "La operación de revolución solo se puede aplicar a croquis planos." + +#: group.cpp:217 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Mala selección para el nuevo grupo de revolución. Este grupo se puede crear " +"con:\n" +"\n" +" * un punto y un segmento de línea o normal (revolucionado alrededor de " +"un eje paralelo a la línea / normal, a través del punto)\n" +" * un segmento de línea (revolucionado sobre un segmento de línea)\n" + +#: group.cpp:229 +msgctxt "group-name" +msgid "revolve" +msgstr "revolución" + +#: group.cpp:234 +msgid "Helix operation can only be applied to planar sketches." +msgstr "La operación de hélice solo se puede aplicar a croquis planos." + +#: group.cpp:245 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Mala selección para el nuevo grupo de hélice. Este grupo se puede crear " +"con:\n" +"\n" +" * un punto y un segmento de recta o normal (girado alrededor de un eje " +"paralelo a la línea / normal, a través del punto)\n" +" * un segmento de línea (girado sobre un segmento de línea)\n" + +#: group.cpp:257 +msgctxt "group-name" +msgid "helix" +msgstr "hélice" + +#: group.cpp:270 +msgid "" +"Bad selection for new rotation. This group can be created with:\n" +"\n" +" * a point, while locked in workplane (rotate in plane, about that " +"point)\n" +" * a point and a line or a normal (rotate about an axis through the " +"point, and parallel to line / normal)\n" +msgstr "" +"Mala selección para nueva rotación. Este grupo se puede crear con:\n" +"\n" +" * un punto, mientras está bloqueado en el plano de trabajo (girar en el " +"plano, sobre ese punto)\n" +" * un punto y una línea o una normal (rotar alrededor de un eje a través " +"de un punto y paralela a la línea / normal)\n" + +#: group.cpp:283 +msgctxt "group-name" +msgid "rotate" +msgstr "rotar" + +#: group.cpp:294 +msgctxt "group-name" +msgid "translate" +msgstr "trasladar" + +#: group.cpp:416 +msgid "(unnamed)" +msgstr "(sin nombre)" + +#: groupmesh.cpp:707 +msgid "not closed contour, or not all same style!" +msgstr "¡Contorno no cerrado, o no todos del mismo estilo!" + +#: groupmesh.cpp:720 +msgid "points not all coplanar!" +msgstr "¡No todos los puntos son coplanares!" + +#: groupmesh.cpp:722 +msgid "contour is self-intersecting!" +msgstr "¡El contorno se intersecta a sí mismo!" + +#: groupmesh.cpp:724 +msgid "zero-length edge!" +msgstr "¡arista de longitud cero!" + +#: modify.cpp:252 +msgid "Must be sketching in workplane to create tangent arc." +msgstr "" +"Debe estar dibujando en el plano de trabajo para crear un arco tangente." + +#: modify.cpp:299 +msgid "" +"To create a tangent arc, select a point where two non-construction lines or " +"circles in this group and workplane join." +msgstr "" +"Para crear un arco tangente, seleccione un punto donde dos líneas que no " +"sean de construcción o los círculos de este grupo y el plano de trabajo se " +"unen." + +#: modify.cpp:386 +msgid "" +"Couldn't round this corner. Try a smaller radius, or try creating the " +"desired geometry by hand with tangency constraints." +msgstr "" +"No pude redondear esta esquina. Pruebe con un radio más pequeño o intente " +"crear la geometría deseada a mano con restricciones de tangencia." + +#: modify.cpp:595 +msgid "Couldn't split this entity; lines, circles, or cubics only." +msgstr "No se pudo dividir esta entidad; solo líneas, círculos o cúbicos." + +#: modify.cpp:622 +msgid "Must be sketching in workplane to split." +msgstr "Debe estar dibujando en el plano de trabajo para dividir." + +#: modify.cpp:629 +msgid "" +"Select two entities that intersect each other (e.g. two lines/circles/arcs " +"or a line/circle/arc and a point)." +msgstr "" +"Seleccione dos entidades que se crucen entre sí (por ejemplo, dos líneas / " +"círculos / arcos o una línea / círculo / arco y un punto)." + +#: modify.cpp:734 +msgid "Can't split; no intersection found." +msgstr "No se puede dividir; no se encontró ninguna intersección." + +#: mouse.cpp:557 +msgid "Assign to Style" +msgstr "Asignar a Estilo" + +#: mouse.cpp:573 +msgid "No Style" +msgstr "Sin Estilo" + +#: mouse.cpp:576 +msgid "Newly Created Custom Style..." +msgstr "Estilo Personalizado Recién Creado..." + +#: mouse.cpp:583 +msgid "Group Info" +msgstr "Información de Grupo" + +#: mouse.cpp:603 +msgid "Style Info" +msgstr "Información de Estilo" + +#: mouse.cpp:623 +msgid "Select Edge Chain" +msgstr "Seleccionar Cadena de Arista" + +#: mouse.cpp:629 +msgid "Toggle Reference Dimension" +msgstr "Alternar Cota de Referencia" + +#: mouse.cpp:635 +msgid "Other Supplementary Angle" +msgstr "Otro Ángulo Suplementario" + +#: mouse.cpp:640 +msgid "Snap to Grid" +msgstr "Enganchar a la cuadrícula" + +#: mouse.cpp:649 +msgid "Remove Spline Point" +msgstr "Remover Punto de Spline" + +#: mouse.cpp:684 +msgid "Add Spline Point" +msgstr "Agregar Punto de Spline" + +#: mouse.cpp:688 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "" +"No se puede agregar un punto de spline: se alcanzó el número máximo de " +"puntos." + +#: mouse.cpp:713 +msgid "Toggle Construction" +msgstr "Alternar Construcción" + +#: mouse.cpp:729 +msgid "Delete Point-Coincident Constraint" +msgstr "Eliminar restricción de punto-coincidente" + +#: mouse.cpp:747 +msgid "Cut" +msgstr "Cortar" + +#: mouse.cpp:749 +msgid "Copy" +msgstr "Copiar" + +#: mouse.cpp:753 +msgid "Select All" +msgstr "Seleccionar Todo " + +#: mouse.cpp:758 +msgid "Paste" +msgstr "Pegar" + +#: mouse.cpp:760 +msgid "Paste Transformed..." +msgstr "Pegar Transformado ..." + +#: mouse.cpp:765 +msgid "Delete" +msgstr "Eliminar" + +#: mouse.cpp:768 +msgid "Unselect All" +msgstr "Deseleccionar Todo" + +#: mouse.cpp:775 +msgid "Unselect Hovered" +msgstr "Deselección Flotante" + +#: mouse.cpp:784 +msgid "Zoom to Fit" +msgstr "Zoom para ajustar" + +#: mouse.cpp:986 mouse.cpp:1274 +msgid "click next point of line, or press Esc" +msgstr "clic en el siguiente punto de la línea o presione Esc" + +#: mouse.cpp:992 +msgid "" +"Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"No se puede dibujar un rectángulo en 3d; primero, active un plano de trabajo " +"con Croquis -> En Plano de trabajo." + +#: mouse.cpp:1026 +msgid "click to place other corner of rectangle" +msgstr "clic para colocar la otra esquina del rectángulo" + +#: mouse.cpp:1047 +msgid "click to set radius" +msgstr "clic para establecer el radio" + +#: mouse.cpp:1052 +msgid "" +"Can't draw arc in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"No se puede dibujar un arco en 3d; primero, active un plano de trabajo con " +"Croquis -> En Plano de trabajo." + +#: mouse.cpp:1071 +msgid "click to place point" +msgstr "clic para colocar el punto" + +#: mouse.cpp:1087 +msgid "click next point of cubic, or press Esc" +msgstr "clic en el siguiente punto del cúbico, o presione Esc" + +#: mouse.cpp:1092 +msgid "" +"Sketching in a workplane already; sketch in 3d before creating new workplane." +msgstr "" +"Dibujando en un plano de trabajo ya; croquis en 3d antes de crear un nuevo " +"plano de trabajo." + +#: mouse.cpp:1108 +msgid "" +"Can't draw text in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"No se puede dibujar texto en 3D; primero, active un plano de trabajo con " +"Croquis -> En Plano de trabajo." + +#: mouse.cpp:1125 +msgid "click to place bottom right of text" +msgstr "clic para colocar la parte inferior derecha del texto" + +#: mouse.cpp:1131 +msgid "" +"Can't draw image in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"No se puede dibujar una imagen en 3D; primero, active un plano de trabajo " +"con Croquis -> En Plano de Trabajo." + +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +msgctxt "file-type" +msgid "SolveSpace models" +msgstr "SolveSpace modelos" + +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "placa circuito IDF" + +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 +msgctxt "file-type" +msgid "PNG image" +msgstr "imagen PNG" + +#: platform/gui.cpp:100 +msgctxt "file-type" +msgid "STL mesh" +msgstr "STL malla" + +#: platform/gui.cpp:101 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" +msgstr "Wavefront OBJ malla" + +#: platform/gui.cpp:102 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" +msgstr "Three.js-malla compatible, con visor" + +#: platform/gui.cpp:103 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "Three.js-malla compatible, solo malla" + +#: platform/gui.cpp:104 +msgctxt "file-type" +msgid "VRML text file" +msgstr "Archivo texto VRML" + +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 +msgctxt "file-type" +msgid "STEP file" +msgstr "Archivo STEP" + +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "PDF file" +msgstr "Archivo PDF" + +#: platform/gui.cpp:113 +msgctxt "file-type" +msgid "Encapsulated PostScript" +msgstr "Encapsulado PostScript" + +#: platform/gui.cpp:114 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "Gráficos Vectoriales Escalables" + +#: platform/gui.cpp:116 platform/gui.cpp:123 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" +msgstr "Archivo DXF (AutoCAD 2007)" + +#: platform/gui.cpp:117 +msgctxt "file-type" +msgid "HPGL file" +msgstr "Archivo HPGL" + +#: platform/gui.cpp:118 +msgctxt "file-type" +msgid "G Code" +msgstr "G Code" + +#: platform/gui.cpp:127 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" +msgstr "Archivos AutoCAD DXF y DWG" + +#: platform/gui.cpp:131 +msgctxt "file-type" +msgid "Comma-separated values" +msgstr "Valores separados por comas" + +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 +msgid "untitled" +msgstr "sin título" + +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 +msgctxt "title" +msgid "Save File" +msgstr "Guardar Archivo" + +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 +msgctxt "title" +msgid "Open File" +msgstr "Abrir Archivo" + +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +msgctxt "button" +msgid "_Cancel" +msgstr "_Cancelar" + +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +msgctxt "button" +msgid "_Save" +msgstr "_Guardar" + +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +msgctxt "button" +msgid "_Open" +msgstr "_Abrir" + +#: solvespace.cpp:170 +msgctxt "title" +msgid "Autosave Available" +msgstr "Autoguardado Disponible" + +#: solvespace.cpp:171 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "Un archivo de autoguardado está disponible para este croquis." + +#: solvespace.cpp:172 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "¿Desea cargar el archivo de autoguardado en su lugar?" + +#: solvespace.cpp:173 +msgctxt "button" +msgid "&Load autosave" +msgstr "&Cargar autoguardado" + +#: solvespace.cpp:175 +msgctxt "button" +msgid "Do&n't Load" +msgstr "No Cargar" + +#: solvespace.cpp:598 +msgctxt "title" +msgid "Modified File" +msgstr "Archivo Modificado" + +#: solvespace.cpp:600 +#, c-format +msgctxt "dialog" +msgid "Do you want to save the changes you made to the sketch “%s”?" +msgstr "¿Desea guardar los cambios que realizó en el croquis “%s”?" + +#: solvespace.cpp:603 +msgctxt "dialog" +msgid "Do you want to save the changes you made to the new sketch?" +msgstr "¿Desea guardar los cambios que realizó en el nuevo croquis?" + +#: solvespace.cpp:606 +msgctxt "dialog" +msgid "Your changes will be lost if you don't save them." +msgstr "Sus cambios se perderán si no los guarda." + +#: solvespace.cpp:607 +msgctxt "button" +msgid "&Save" +msgstr "&Guardar" + +#: solvespace.cpp:609 +msgctxt "button" +msgid "Do&n't Save" +msgstr "No& Guardar" + +#: solvespace.cpp:630 +msgctxt "title" +msgid "(new sketch)" +msgstr "(nuevo croquis)" + +#: solvespace.cpp:637 +msgctxt "title" +msgid "Property Browser" +msgstr "Explorador de Propiedades" + +#: solvespace.cpp:699 +msgid "" +"Constraints are currently shown, and will be exported in the toolpath. This " +"is probably not what you want; hide them by clicking the link at the top of " +"the text window." +msgstr "" +"Las restricciones se muestran actualmente y se exportarán en la trayectoria." +"Probablemente esto no sea lo que quieres; ocultarlos haciendo clic en el " +"enlace en la parte superior de la ventana de texto." + +#: solvespace.cpp:771 +#, c-format +msgid "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." +msgstr "" +"No se puede identificar el tipo de archivo a partir de la extensión del " +"nombre del archivo '%s'; intente .dxf o .dwg." + +#: solvespace.cpp:823 +msgid "Constraint must have a label, and must not be a reference dimension." +msgstr "" +"La restricción debe tener una etiqueta y no debe ser una cota de referencia." + +#: solvespace.cpp:827 +msgid "Bad selection for step dimension; select a constraint." +msgstr "Mala selección para la cota del paso; seleccione una restricción." + +#: solvespace.cpp:851 +msgid "The assembly does not interfere, good." +msgstr "El ensamble no interfiere, bien." + +#: solvespace.cpp:867 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" +"El volumen del modelo sólido es:\n" +"\n" +" %s" + +#: solvespace.cpp:876 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" +"\n" +"El volumen de la malla del grupo actual es:\n" +"\n" +" %s" + +#: solvespace.cpp:881 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" +"\n" +"\n" +"Las superficies curvas se han aproximado como triángulos.\n" +"Esto introduce un error, normalmente alrededor del 1%." + +#: solvespace.cpp:896 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"El área de la superficie de las caras seleccionadas es:\n" +"\n" +" %s\n" +"\n" +"Las curvas se han aproximado como lineales por partes.\n" +"Esto introduce un error, normalmente alrededor del 1%%." + +#: solvespace.cpp:905 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." +msgstr "" +"Este grupo no contiene un área cerrada 2d correctamente formada. Está " +"abierta, no coplanares, ni auto-intersectantes." + +#: solvespace.cpp:917 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"El área de la región croquizada en este grupo es:\n" +"\n" +" %s\n" +"\n" +"Las curvas se han aproximado como lineales por partes.\n" +"Esto introduce un error, normalmente alrededor del 1%%." + +#: solvespace.cpp:937 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"La longitud total de las entidades seleccionadas es:\n" +"\n" +" %s\n" +"\n" +"Las curvas se han aproximado como lineales por partes.\n" +"Esto introduce un error, normalmente alrededor del 1%%." + +#: solvespace.cpp:943 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "" +"Mala selección de perímetro; seleccione segmentos de línea, arcos y curvas." + +#: solvespace.cpp:959 +msgid "Bad selection for trace; select a single point." +msgstr "Mala selección de rastreo; seleccione un solo punto." + +#: solvespace.cpp:986 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "No pude escribir a '%s'" + +#: solvespace.cpp:1016 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "La malla se intersecta a si misma (NO está bien, no es válida)." + +#: solvespace.cpp:1017 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "La malla no se intersecta (está bien, es válida)." + +#: solvespace.cpp:1019 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "La malla tiene bordes desnudos (NO está bien, no es válida)." + +#: solvespace.cpp:1020 +msgid "The mesh is watertight (okay, valid)." +msgstr "La malla es estanca (está bien, es válida)." + +#: solvespace.cpp:1023 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" +"\n" +"\n" +"El modelo contiene %d triángulos, desde %d superficies." + +#: solvespace.cpp:1027 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"Cero aristas problemáticas, bien.%s" + +#: solvespace.cpp:1030 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d aristas problemáticas, mal.%s" + +#: solvespace.cpp:1043 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" +"Esta es la versión de SolveSpace %s.\n" +"\n" +"Para más información, ver http://solvespace.com/\n" +"\n" +"SolveSpace es software libre: eres libre de modificarlo\n" +"y/o redistribuirlo bajo los términos de la GNU\n" +"Licencia Pública General (GPL) version 3 o posterior.\n" +"\n" +"NO HAY GARANTÍA, en la medida permitida por\n" +"ley. Para detalles, visita http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues y otros autores.\n" + +#: style.cpp:185 +msgid "" +"Can't assign style to an entity that's derived from another entity; try " +"assigning a style to this entity's parent." +msgstr "" +"No se puede asignar estilo a una entidad derivada de otra entidad;; intente " +"asignar un estilo al padre de esta entidad." + +#: style.cpp:735 +msgid "Style name cannot be empty" +msgstr "El nombre del estilo no puede estar vacío" + +#: textscreens.cpp:785 +msgid "Can't repeat fewer than 1 time." +msgstr "No se puede repetir menos de 1 vez." + +#: textscreens.cpp:789 +msgid "Can't repeat more than 999 times." +msgstr "No se puede repetir más de 999 veces." + +#: textscreens.cpp:814 +msgid "Group name cannot be empty" +msgstr "El nombre del grupo no puede estar vacío" + +#: textscreens.cpp:866 +msgid "Opacity must be between zero and one." +msgstr "La opacidad debe estar entre cero y uno." + +#: textscreens.cpp:901 +msgid "Radius cannot be zero or negative." +msgstr "El radio no puede ser cero o negativo." + +#: toolbar.cpp:18 +msgid "Sketch line segment" +msgstr "Croquizar segmento de línea" + +#: toolbar.cpp:20 +msgid "Sketch rectangle" +msgstr "Croquizar rectángulo" + +#: toolbar.cpp:22 +msgid "Sketch circle" +msgstr "Croquizar círculo" + +#: toolbar.cpp:24 +msgid "Sketch arc of a circle" +msgstr "Croquizar arco de un círculo" + +#: toolbar.cpp:26 +msgid "Sketch curves from text in a TrueType font" +msgstr "Croquizar curvas desde texto en fuente TrueType" + +#: toolbar.cpp:28 +msgid "Sketch image from a file" +msgstr "Croquizar imagen desde un archivo" + +#: toolbar.cpp:30 +msgid "Create tangent arc at selected point" +msgstr "Crear arco tangente en el punto seleccionado" + +#: toolbar.cpp:32 +msgid "Sketch cubic Bezier spline" +msgstr "Croquizar spline de Bezier cúbico" + +#: toolbar.cpp:34 +msgid "Sketch datum point" +msgstr "Croquizar punto de referencia" + +#: toolbar.cpp:36 +msgid "Toggle construction" +msgstr "Alternar construcción" + +#: toolbar.cpp:38 +msgid "Split lines / curves where they intersect" +msgstr "Dividir líneas / curvas donde se intersectan" + +#: toolbar.cpp:42 +msgid "Constrain distance / diameter / length" +msgstr "Restringir distancia / diámetro / longitud" + +#: toolbar.cpp:44 +msgid "Constrain angle" +msgstr "Restringir ángulo" + +#: toolbar.cpp:46 +msgid "Constrain to be horizontal" +msgstr "Restringir para ser horizontal" + +#: toolbar.cpp:48 +msgid "Constrain to be vertical" +msgstr "Restringir para ser vertical" + +#: toolbar.cpp:50 +msgid "Constrain to be parallel or tangent" +msgstr "Restringir para ser paralela o tangente" + +#: toolbar.cpp:52 +msgid "Constrain to be perpendicular" +msgstr "Restringir para ser perpendicular" + +#: toolbar.cpp:54 +msgid "Constrain point on line / curve / plane / point" +msgstr "Restringir punto en línea / curva / plano / punto" + +#: toolbar.cpp:56 +msgid "Constrain symmetric" +msgstr "Restringir simétrico" + +#: toolbar.cpp:58 +msgid "Constrain equal length / radius / angle" +msgstr "Restringir igualdad longitud / radio / ángulo" + +#: toolbar.cpp:60 +msgid "Constrain normals in same orientation" +msgstr "Restringir normales en la misma orientación" + +#: toolbar.cpp:62 +msgid "Other supplementary angle" +msgstr "Otro ángulo suplementario" + +#: toolbar.cpp:64 +msgid "Toggle reference dimension" +msgstr "Alternar cota de referencia" + +#: toolbar.cpp:68 +msgid "New group extruding active sketch" +msgstr "Nuevo grupo de extrusión de croquis activo" + +#: toolbar.cpp:70 +msgid "New group rotating active sketch" +msgstr "Nuevo croquis activo giratorio de grupo" + +#: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "Nueva hélice de grupo a partir del croquis activo" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "Nuevo croquis activo de revolución de grupo" + +#: toolbar.cpp:76 +msgid "New group step and repeat rotating" +msgstr "Nuevo paso de grupo y rotación repetida" + +#: toolbar.cpp:78 +msgid "New group step and repeat translating" +msgstr "Nuevo paso de grupo y traslación repetida" + +#: toolbar.cpp:80 +msgid "New group in new workplane (thru given entities)" +msgstr "Nuevo grupo en nuevo plano de trabajo (a través de entidades dadas)" + +#: toolbar.cpp:82 +msgid "New group in 3d" +msgstr "Nuevo grupo en 3d" + +#: toolbar.cpp:84 +msgid "New group linking / assembling file" +msgstr "Nuevo enlace de grupo / archivo de ensamble" + +#: toolbar.cpp:88 +msgid "Nearest isometric view" +msgstr "Vista isométrica más cercana" + +#: toolbar.cpp:90 +msgid "Align view to active workplane" +msgstr "Alinear vista al plano de trabajo activo" + +#: util.cpp:165 +msgctxt "title" +msgid "Error" +msgstr "Error" + +#: util.cpp:165 +msgctxt "title" +msgid "Message" +msgstr "Mensaje" + +#: util.cpp:170 +msgctxt "button" +msgid "&OK" +msgstr "&Aceptar" + +#: view.cpp:127 +msgid "Scale cannot be zero or negative." +msgstr "La escala no debe ser cero o negativa." + +#: view.cpp:139 view.cpp:148 +msgid "Bad format: specify x, y, z" +msgstr "Formato incorrecto: especifica x, y, z" + +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Mala selección por restricción de la relación de longitud. Esta " +#~ "restricción se puede aplicar a:\n" +#~ "\n" +#~ " * dos segmentos de línea\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Mala selección por restricción de diferencia de longitud. Esta " +#~ "restricción puede aplicar a:\n" +#~ "\n" +#~ " * dos segmentos de línea\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "Relación Lo&ngitud" + +#~ msgid "Length Diff&erence" +#~ msgstr "Diferencia Long&itud" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Mala selección para un nuevo croquis en el plano de trabajo. Este grupo " +#~ "se puede crear con:\n" +#~ "\n" +#~ " * un punto (a través del punto, ortogonal a los ejes de coordenadas)\n" +#~ " * un punto y dos segmentos de línea (a través del punto, paralelo a " +#~ "líneas)\n" +#~ " * un plano de trabajo (copia de un plano de trabajo)\n" + +#~ msgctxt "file-type" +#~ msgid "Q3D Object file" +#~ msgstr "Archivo Objeto Q3D" diff --git a/res/locales/fr_FR.po b/res/locales/fr_FR.po index 50c30201..6b5845a7 100644 --- a/res/locales/fr_FR.po +++ b/res/locales/fr_FR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: 2018-07-14 06:12+0000\n" "Last-Translator: whitequark \n" "Language-Team: none\n" @@ -17,7 +17,7 @@ msgstr "" "X-Generator: Zanata 4.4.5\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,27 +27,27 @@ msgstr "" "\n" "Activez un plan avec \"Dessin -> Dans plan de travail\"." -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "Presse papier vide; rien à coller." -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "Le nombre de copies à coller doit être d'au moins un." -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "L'échelle ne peut pas être zéro." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "Sélectionnez un point pour définir l'origine de la rotation." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "Sélectionnez deux points pour définir le vecteur de translation." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." @@ -55,23 +55,23 @@ msgstr "" "Transformation identique. Donc, toutes les copies seront exactement les unes " "au-dessus des autres." -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "Trop d'éléments à coller; Divisez-les en plus petits groupes." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "Pas d'espace de travail actif." -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "Mauvais format: spécifiez les coordonnées comme x, y, z" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "Mauvais format; spécifiez la couleur comme r, v, b" -#: confscreen.cpp:454 +#: confscreen.cpp:412 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -79,26 +79,26 @@ msgstr "" "Le facteur de perspective n'aura aucun effet tant que vous n'aurez pas " "activé \"Affichage -> Utiliser la projection de perspective\"." -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "L'échelle d'export ne doit pas être zéro!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "Le décalage du rayon de coupe ne doit pas être négatif!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "" "Mauvaise valeur: l'intervalle d'enregistrement automatique devrait être " "positif" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "Mauvais format: spécifiez un nombre entier de minutes" @@ -169,115 +169,135 @@ msgstr "longueur-ratio" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "longueur-difference" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "symétrique" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "symétrique-h" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "symétrique-v" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "symétrique-ligne" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "au-point-milieu" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "horizontal" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "vertical" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "diamètre" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "pt-sur-cercle" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "même-orientation" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "angle" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "parallèle" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "arc-ligne-tangente" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "cubique-ligne-tangente" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "courbe-courbe-tangente" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "perpendiculaire" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "eg-rayon" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "eg-angle" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "eg-ligne-long-arc-long" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "verrouillé-où-déplacé" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "commentaire" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -286,7 +306,7 @@ msgstr "" "Contraignez-les avec \"Contrainte -> Sur point avant de contraindre la " "tangente\"." -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -295,7 +315,7 @@ msgstr "" "Contraignez-les avec \"Contrainte -> Sur point avant de contraindre la " "tangente\"." -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -303,7 +323,7 @@ msgstr "" "Les courbes doivent partager un point final. Contraignez-les avec " "\"Contrainte -> Sur point avant de contraindre la tangente\"." -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -327,7 +347,7 @@ msgstr "" "    * Une face plane et un point (distance minimale)\n" "    * Un cercle ou un arc (diamètre)\n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -347,7 +367,7 @@ msgstr "" "    * Un point et un cercle ou un arc (point sur courbe)\n" "    * Un point et une face plane (point sur une face)\n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -378,30 +398,26 @@ msgstr "" "    * Un segment de ligne et un arc (la longueur de segment de ligne est " "égale à la longueur d'arc)\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Mauvaise sélection pour la contrainte du rapport de longueur. Cette " -"contrainte peut s'appliquer à:\n" -"\n" -"    * Deux segments de ligne\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Mauvaise sélection pour la contrainte de différence de longueur. Cette " -"contrainte peut s'appliquer à:\n" -"\n" -"    * Deux segments de ligne\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -414,7 +430,7 @@ msgstr "" "    * Un segment de ligne et un point (point au milieu)\n" "    * Un segment de ligne et un plan de travail (point médian dans le plan)\n" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -435,7 +451,7 @@ msgstr "" "    * Plan de travail, et deux points ou un segment de ligne (symétrique au " "plan de travail)\n" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -443,7 +459,7 @@ msgstr "" "Un plan de travail doit être actif lors d'une contrainte de symétrie sans " "plan de symétrie explicite." -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -451,7 +467,7 @@ msgstr "" "Activez un plan de travail (avec Dessin -> Dans plan de travail) avant " "d'appliquer une contrainte horizontale ou verticale." -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -465,7 +481,7 @@ msgstr "" "    * deux points\n" "    * Un segment de ligne\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -477,15 +493,15 @@ msgstr "" "\n" " * Deux normales\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "Vous devez sélectionner une contrainte d'angle." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "Vous devez sélectionner une contrainte avec une étiquette associée." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -500,11 +516,11 @@ msgstr "" "    * Un segment de ligne et une normale\n" "    * Deux normales\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "Courbe-Courbe tangence doit s'appliquer dans le plan de travail." -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -523,7 +539,7 @@ msgstr "" "    * Deux segments de ligne, des arcs ou des Béziers, qui partagent un " "point final (tangent)\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -538,7 +554,7 @@ msgstr "" "    * Un segment de ligne et une normale\n" "    * Deux normales\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -550,7 +566,11 @@ msgstr "" "\n" "    * un point\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "NOUVEAU COMMENTAIRE - DOUBLE-CLIQUE POUR EDITER" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "cliquez le centre du texte de commentaire" @@ -580,26 +600,26 @@ msgstr "" "    * Un point et deux segments de ligne (plan au-travers d'un point et " "parallèle aux lignes)\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "Le maillage du groupe actif est vide; Rien à exporter." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "les lignes à main levée ont été remplacées par des lignes continues" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "les lignes en zigzag ont été remplacées par des lignes continues" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Certains aspects du dessin n'ont pas d'équivalent DXF et n'ont pas été " "exportés:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -616,11 +636,11 @@ msgctxt "group-name" msgid "#references" msgstr "#références" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "" -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -658,7 +678,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "" @@ -832,295 +852,303 @@ msgid "Use &Perspective Projection" msgstr "Utiliser la vue en &Perspective" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "&Unités de dimensions" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "Dimensions en &Millimètres" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "Dimensions en &Mètres" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "Dimensions en &Pouces" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "Affichage &Barre d'outils" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "Affichage du &Navigateur de Propriété" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "&Plein Ecran" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "&Nouveau Groupe" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "Dessin en &3d" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "Dessin dans un nouveau &Plan de travail" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "Espacement &Linéaire" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "Espacement &Circulaire" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "E&xtruder" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "&Helix" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "&Lathe" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "Ré&volution" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "Lié / Assembler..." -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "Lié Récent" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Dessin" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "Dans le &Plan de travail" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "N'importe où dans la &3d" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "&Point" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "&Plan de travail" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "Ligne - &Polyligne" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "Ligne de C&onstruction" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "&Rectangle" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "&Cercle" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "&Arc de Cercle" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "Spline Cubique de &Beziers" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "&Texte en Police TrueType" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "&Image" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "&Basculer en mode \"Construction\"" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "&Arc Tangent au Point" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Diviser les Courbes à l'&Intersection" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Constraintes" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "&Distance / Diamètre" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "Dimension Maîtresse / Indicative" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "A&ngle" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "An&gle Maître / Indicatif" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Autre angle S&upplémentaire" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Basculer cote Maîtresse / cote Indicative" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "&Horizontal" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Vertical" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "&Sur Point / Courbe / Plan" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "&Egale Longueur / Rayon / Angle" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "R&apport de Longueur" - -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "D&ifférence de Longueur" - #: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" + +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" + +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "Au &Milieu" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "&Symétrique" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "Para&llèle / Tangent" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "&Perpendiculaire" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Même Orient&ation" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "Accrocher le point à l'&Emplacement" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Commentaire" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Analyse" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "Mesure &Volume" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "Mesure &Aire" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "Mesure &Périmètre" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "Montrer les Pièces &Interférentes" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "Montrer les Arêtes &Nues" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "Montrer le &Centre de Gravité" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "Montrer les &sous-contraintes Points" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "&Tracer Point" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "&Arrêt Tracé..." -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Espacement &Dimension..." -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Aide" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "&Langue" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "&Site web / Manuel" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "&A propos" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(pas de fichier récent)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "Pas de plan de travail actif, donc la grille ne va pas apparaître." -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1134,19 +1162,19 @@ msgstr "" "Pour une projection en perspective, modifiez le facteur de perspective dans " "l'écran de configuration. Une valeur d'environ 0,3 est typique." -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" "Sélectionnez un point. Ce point deviendra le centre de la vue à l'écran." -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "" "Aucune entité supplémentaire ne partage des points d'extrémité avec les " "entités sélectionnées." -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." @@ -1154,7 +1182,7 @@ msgstr "" "Pour utiliser cette commande, sélectionnez un point ou une autre entité à " "partir d'une pièce liée ou créez un groupe de liens dans le groupe actif." -#: graphicswin.cpp:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1162,7 +1190,7 @@ msgstr "" "Aucun plan de travail n'est actif. Activez un plan de travail (avec Dessin -" "> Dans plan de travail) pour définir le plan pour la grille d'accrochage." -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1171,13 +1199,13 @@ msgstr "" "des textes de commentaires ou des contraintes avec une étiquette. Pour " "accrocher une ligne, sélectionnez ses points d'extrémité." -#: graphicswin.cpp:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Aucun plan de travail sélectionné. Activation du plan de travail par défaut " "pour ce groupe." -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1187,7 +1215,7 @@ msgstr "" "de travail par défaut. Essayez de sélectionner un plan de travail ou " "d'activer un groupe de \"Dessin dans nouveau plan travail\"." -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1195,49 +1223,49 @@ msgstr "" "Mauvaise sélection pour l'arc tangent au point. Sélectionnez un seul point, " "ou ne sélectionnez rien pour configurer les paramètres de l'arc." -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "" "cliquez un point sur l'arc (dessine dans le sens inverse des aiguilles d'une " "montre)" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "cliquez pour placer un point" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "cliquez le premier point du segment de ligne" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "cliquez le premier point de la ligne de construction" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "cliquez le premier point du segment cubique" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "cliquez pour placer le centre du cercle" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "cliquez pour placer l'origine du plan de travail" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "cliquez un coin du rectangle" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "cliquez le haut à gauche du texte" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "cliquez le haut à gauche de l'image" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1250,24 +1278,18 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "dessin-en-3d" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -"Mauvaise sélection pour un nouveau dessin dans le plan de travail. Ce groupe " -"peut être créé avec:\n" -"\n" -"    * Un point (par le point, orthogonal aux axes de coordonnées)\n" -"    * Un point et deux segments de ligne (par le point, parallèle aux " -"lignes)\n" -"    * Un plan de travail (copie du plan de travail)\n" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1275,16 +1297,16 @@ msgstr "" "Activez un plan de travail (Dessin -> Dans plan de travail) avant " "l'extrusion. Le croquis sera extrudé normalement au plan de travail." -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "extruder" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "" -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1299,16 +1321,16 @@ msgstr "" "parallèle à la ligne / point normal, par le point)\n" "    * Un segment de ligne (révolution sur le segment de ligne)\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "révolution" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "" -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1317,16 +1339,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "" -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1335,12 +1357,12 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1357,41 +1379,41 @@ msgstr "" "    * Un point et une ligne ou une normale (tourner autour d'un axe par le " "point et parallèle à la ligne / normale)\n" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "rotation" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "translation" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "(sans nom)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "contour non fermé ou tout n'est pas du même style!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "les points ne sont pas tous coplanaires!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "le contour s'entrecroise!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "arête de longueur nulle!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "Vous devez dessiner dans un plan pour créer un arc tangent." -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1399,7 +1421,7 @@ msgstr "" "Pour créer un arc tangent, sélectionnez un point où deux lignes (pas de " "construction) ou cercles de ce groupe et de ce plan se joignent." -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1407,123 +1429,123 @@ msgstr "" "Impossible d'arrondir ce coin. Essayez un rayon plus petit, ou essayez de " "créer la géométrie souhaitée à la main avec des contraintes tangentielles." -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" "Impossible de diviser cette entité; Lignes, cercles ou cubiques uniquement." -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "Vous devez dessiner dans un plan de travail pour diviser." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "Impossible de diviser; pas d'intersection trouvée." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Appliquer au style" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "Pas de style" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Style personnalisé nouvellement créé ..." -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Info Groupe" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Info Style" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Sélection Chaîne d'arêtes" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Basculer cote maîtresse / cote indicative" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Autre angle supplémentaire" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Accrocher à la grille" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Effacer le point de la Spline" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Ajouter un point à la Spline" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "" "Impossible d'ajouter le point spline: nombre maximum de points atteints." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Basculer en mode \"construction\"." -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Effacer la contraint Point-Coïncident" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Couper" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Copier" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Sélectionner tout" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Coller" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Coller transformé..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Effacer" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Désélectionner tout" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Désélectionner survolé" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Zoom pour ajuster" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "cliquez pou le prochain point de ligne or appuyez sur Esc" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1531,15 +1553,15 @@ msgstr "" "Impossible de dessiner un rectangle en 3d; D'abord, activez un plan de " "travail avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "cliquez pour placer un autre coin de rectangle" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "cliquez pour ajuster le rayon" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1547,22 +1569,22 @@ msgstr "" "Ne peut pas dessiner l'arc en 3d; D'abord, activez un plan de travail avec " "\"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "cliquez pour placer un point" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "cliquez le prochain point cubique ou appuyez sur Esc" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Vous dessinez déjà dans un plan de travail; Sélectionner \"Dessiner en 3d\" " "avant de créer un nouveau plan de travail." -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1570,11 +1592,11 @@ msgstr "" "Impossible de dessiner du texte en 3d; D'abord, activer un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." @@ -1582,219 +1604,225 @@ msgstr "" "Impossible de dessiner l'image en 3d; D'abord, activez un plan de travail " "avec \"Dessin -> Dans plan de travail\"." -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "NOUVEAU COMMENTAIRE - DOUBLE-CLIQUE POUR EDITER" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "sans nom" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Sauver fichier" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Ouvrir Fichier" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "_Annuler" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "_Sauver" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "Sauvegarde automatique existante" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "Fichier modifié" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "(nouveau dessin)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "Navigateur de propriété" -#: solvespace.cpp:658 +#: solvespace.cpp:699 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " "the text window." msgstr "" -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1802,7 +1830,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1811,7 +1839,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1819,7 +1847,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1830,13 +1858,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1847,7 +1875,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1858,36 +1886,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1895,7 +1923,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1905,7 +1933,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1915,7 +1943,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1932,7 +1960,7 @@ msgid "" "© 2008-%d Jonathan Westhues and other authors.\n" msgstr "" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -1940,27 +1968,27 @@ msgstr "" "Impossible d'attribuer le style à une entité dérivée d'une autre entité; " "Essayez d'attribuer un style au parent de cette entité." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "Le nom d'un style ne peut pas être vide" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "Je ne peux pas répéter moins de 1 fois." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "Je ne peux pas répéter plus de 999 fois." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "Un nom de groupe ne peut pas être vide" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "L'opacité doit être entre 0 et 1." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "Le rayon ne peut pas être zéro ou négatif." @@ -2116,14 +2144,58 @@ msgctxt "button" msgid "&OK" msgstr "" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "L'échelle ne peut pas être zéro ou négative." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "Mauvais format: Spécifiez x, y, z" +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Mauvaise sélection pour la contrainte du rapport de longueur. Cette " +#~ "contrainte peut s'appliquer à:\n" +#~ "\n" +#~ "    * Deux segments de ligne\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Mauvaise sélection pour la contrainte de différence de longueur. Cette " +#~ "contrainte peut s'appliquer à:\n" +#~ "\n" +#~ "    * Deux segments de ligne\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "R&apport de Longueur" + +#~ msgid "Length Diff&erence" +#~ msgstr "D&ifférence de Longueur" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Mauvaise sélection pour un nouveau dessin dans le plan de travail. Ce " +#~ "groupe peut être créé avec:\n" +#~ "\n" +#~ "    * Un point (par le point, orthogonal aux axes de coordonnées)\n" +#~ "    * Un point et deux segments de ligne (par le point, parallèle aux " +#~ "lignes)\n" +#~ "    * Un plan de travail (copie du plan de travail)\n" + #~ msgid "Specify between 0 and 8 digits after the decimal." #~ msgstr "Spécifiez entre 0 et 8 chiffres après la virgule." diff --git a/res/locales/ru_RU.po b/res/locales/ru_RU.po index 42a3fa3a..d688a75c 100644 --- a/res/locales/ru_RU.po +++ b/res/locales/ru_RU.po @@ -2,22 +2,23 @@ # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. # EvilSpirit , 2017. +# Olesya Gerasimenko , 2021. msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" -"PO-Revision-Date: 2021-01-22 18:50+0700\n" -"Last-Translator: evilspirit@evilspirit.org\n" -"Language-Team: EvilSpirit\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"PO-Revision-Date: 2021-10-04 15:33+0300\n" +"Last-Translator: Olesya Gerasimenko \n" +"Language-Team: Basealt Translation Team\n" "Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 2.4.2\n" +"X-Generator: Lokalize 21.08.1\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,50 +28,50 @@ msgstr "" "можно только находясь в рабочей плоскости.\n" "Активируйте рабочую плоскость через Эскиз->В Рабочей Плоскости" -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "Буфер обмена пуст; нечего вставлять." -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "Укажите в поле 'количество' хотя бы одну копию для вставки." -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "Масштабный коэффициент не может быть нулевым." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "Выберите одну точку в качестве центра вращения." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "Выберите две точки, чтобы задать вектор смещения." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "" "Трансформация не задана. Все копии будут расположены в одном и том же месте." -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "Слишком много элементов для вставки; разбейте на несколько частей." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "Рабочая плоскость не активна" -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "Неверный формат: введите координаты как x, y, z" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "Неверный формат: введите цвет как r, g, b" -#: confscreen.cpp:454 +#: confscreen.cpp:412 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." @@ -78,25 +79,25 @@ msgstr "" "Коэффициент перспективы не будет иметь эффект, пока вы не включите Вид-" ">Перспективная Проекция." -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "Введите число от 0 до %d." -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "Масштабный коэффициент не может быть нулевым!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "Радиус режущего инструмента не может быть отрицательным!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "" "Неверное значение: интервал автосохранения должен быть положительным числом" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "" "Неверный формат: введите целое число, чтобы задать интервал автосохранения" @@ -168,115 +169,135 @@ msgstr "отношение-длин" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "отношение-длин-дуга-дуга" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "отношение-длин-дуга-отрезок" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "разность-длин" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "разность-длин-дуга-дуга" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "разность-длин-дуга-отрезок" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "симметричность" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "симметричность-гориз" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "симметричность-верт" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "симметричность-по-оси" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "на-середине" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "горизонтальность" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "вертикальность" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "диаметр" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "тчк-на-окружности" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "идентичная-ориентация" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "угол" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "параллельность" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "кас-дуга-линия" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "кас-сплайн-линия" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "кас-кривых" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "перпендикулярность" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "равенство-радиусов" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "равенство-углов" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "равен-длины-линии-длины-дуги" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "фиксация" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "комментарий" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." @@ -285,7 +306,7 @@ msgstr "" "'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " "касательности." -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." @@ -294,7 +315,7 @@ msgstr "" "'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " "касательности." -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." @@ -303,7 +324,7 @@ msgstr "" "'Ограничения -> Точка на Примитиве' перед тем, как применять ограничение " "касательности." -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -328,7 +349,7 @@ msgstr "" " * грань и точку (расстояние от точки до плоскости грани)\n" " * окружность или дугу (диаметр / радиус)\n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -348,7 +369,7 @@ msgstr "" " * точку и окружность / дугу / сплайн (точка на кривой)\n" " * точку и грань (точка на грани)\n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -376,30 +397,38 @@ msgstr "" " * две окружности / дуги (равенство радиусов)\n" " * отрезок и дугу (равенство длины отрезка и длины дуги)\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Неправильное выделение для ограничения 'отношение длин'.\n" -"Ограничение может принимать в качестве выделения следующие примитивы:\n" +"Неправильное выделение для ограничения 'отношение длин'. Ограничение может" +" принимать в качестве выделения следующие примитивы:\n" "\n" " * два отрезка\n" +" * две дуги\n" +" * дугу и отрезок\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"Неправильное выделение для ограничения 'разница длин'.\n" -"Ограничение может принимать в качестве выделения следующие примитивы:\n" +"Неправильное выделение для ограничения 'разность длин'. Ограничение может" +" принимать в качестве выделения следующие примитивы:\n" "\n" " * два отрезка\n" +" * две дуги\n" +" * дугу и отрезок\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -412,7 +441,7 @@ msgstr "" " * точку и отрезок (точка на середине отрезка)\n" " * отрезок и рабочую плоскость (середина отрезка на плоскости)\n" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -432,7 +461,7 @@ msgstr "" " * рабочую плоскость и две точки / отрезок (симметричность относительно " "рабочей плоскости\n" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." @@ -440,7 +469,7 @@ msgstr "" "Рабочая плоскость должна быть активна для того, чтобы создать\n" "ограничение симметричности без явного указания плоскости симметрии." -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." @@ -448,7 +477,7 @@ msgstr "" "Рабочая плоскость должна быть активирована (Эскиз -> В рабочей плоскости)\n" "перед тем, как накладывать ограничения горизонтальности / вертикальности." -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -462,30 +491,30 @@ msgstr "" " * две точки\n" " * отрезок\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" "\n" " * two normals\n" msgstr "" -"Неправильное выделение для ограничения \"идентичная ориентация\".\n" +"Неправильное выделение для ограничения 'идентичная ориентация'.\n" "Ограничение может принимать в качестве выделения следующие примитивы:\n" "\n" " * два координатных базиса('нормали')\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "" "Переключатся между смежными углами можно только выбрав ограничение угла." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "" "Переключать режим 'размера для справок' возможно только для ограничений, " "имеющих размерное значение." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -500,12 +529,12 @@ msgstr "" " * отрезок и координатный базис (нормаль)\n" " * два координатных базиса (нормали)\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "" "Ограничение касательности может быть наложено только в рабочей плоскости." -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -524,7 +553,7 @@ msgstr "" " * два отрезка, две дуги или два сплайна, соединенных крайними точками " "(касательность)\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -539,19 +568,23 @@ msgstr "" " * отрезок и координатный базис (нормаль)\n" " * два координатных базиса (нормали)\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" "\n" " * a point\n" msgstr "" -"Неправильное выделение для ограничения 'Фиксация'.\n" +"Неправильное выделение для ограничения 'фиксация'.\n" "Ограничение может принимать в качестве выделения следующие примитивы:\n" "\n" " * точку\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "КОММЕНТАРИЙ -- ДВОЙНОЙ ЩЕЛЧОК ДЛЯ РЕДАКТИРОВАНИЯ" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "кликните мышью там, где будет расположен текстовый комментарий" @@ -579,26 +612,26 @@ msgstr "" " * точку и два отрезка (сечение плоскостью, заданной двумя отрезками, " "построенной через указанную точку)\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "Активная группа не содержит тел; нечего экспортировать." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "Стили линии 'от руки' были заменены сплошными линиями" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "Стили линии 'зиг-заг' были заменены сплошными линиями" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" "Некоторые элементы чертежа не имеют аналогов в DXF-представлении и не были " "экспортированы:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -615,11 +648,11 @@ msgctxt "group-name" msgid "#references" msgstr "система-координат" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "Файл пуст. Возможно он поврежден." -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -660,7 +693,7 @@ msgctxt "button" msgid "&No" msgstr "Нет" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "Отменить" @@ -783,7 +816,7 @@ msgstr "Стили Линий..." #: graphicswin.cpp:79 msgid "&View Projection..." -msgstr "&View Прое&кция..." +msgstr "&Проекция вида..." #: graphicswin.cpp:81 msgid "Con&figuration..." @@ -834,295 +867,303 @@ msgid "Use &Perspective Projection" msgstr "Перспективная Прое&кция" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "Показать &Развернутый Вид" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "Единицы Измерения" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "Размеры в Ми&ллиметрах" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "Размеры в Метрах" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "Размеры в Дю&ймах" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "Размеры в &Футах и дюймах" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "Показывать Па&нель Инструментов" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "Показывать Брау&зер" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "Полно&экранный Режим" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "&Группа" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "Создать Эскиз в &3d" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "Создать Эскиз в Новой &Рабочей Плоскости" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "&Линейный Массив" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "&Круговой Массив" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "Тело &Выдавливания" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "Тело Винтовое" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "Тело В&ращения" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "Тело В&ращения" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "&Импорт Детали / Сборка..." -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "Последние &Детали" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Эскиз" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "В &Рабочей Плоскости" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "Режим &3d" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "Опорная &Точка" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "Рабочая &Плоскость" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "&Отрезок" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "&Вспомогательный Отрезок" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "Прямоу&гольник" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "О&кружность" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "Д&уга Окружности" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "Кубический &Сплайн Безье" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "Т&екст TrueType" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "И&зображение" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "Переключить Режим Вс&помогательных Построений" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "Кас&ательная в Точке" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Ра&збить Кривые Пересечением" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Ограничения" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "&Расстояние / Диаметр" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "&Справочный Размер" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "&Угол" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "С&правочный Угол" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Переключить Сме&жный Угол" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Переключить Режим Размера Для Спра&вок" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "&Горизонтальность" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Вертикальность" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "&Точка на Примитиве" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "&Равенство Длин / Радиусов / Углов" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "Отно&шение Длин" - -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "Ра&зница Длин" - #: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "&Отношение длин (дуга)" + +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "Р&азность длин (дуга)" + +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "&На Середине" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "С&имметричность" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "Пара&ллельность / Касательность" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "Перпендикул&ярность" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Идентичная &Ориентация" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "За&фиксировать" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Текстовый &Комментарий" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Анализ" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "Измерить &Объем" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "Измерить П&лощадь" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "Измерить П&ериметр" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "Показать Пе&ресекающиеся Детали" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "Показать Про&блемные Ребра" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "Показать Центр Масс" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "Показать Свободные Точки" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "Включить &Трассировку Точки" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "Остановить Тра&ссировку..." -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Плавное Из&менение Размера..." -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Помощь" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "&Язык" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "Вебсайт / &Справка" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "О &Программе" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(пусто)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "Файл '%s' не существует." -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "Сетку не будет видно, пока рабочая плоскость не активирована." -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1136,25 +1177,25 @@ msgstr "" "перспективы на конфигурационной странице браузера.\n" "Значение по умолчанию 0.3." -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "Выделите точку. Вид будет отцентрован по этой точке." -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "Нет дополнительных объектов, соединенных с выбранными примитивами." -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." msgstr "" "Чтобы использовать эту команду, выделите точку или другой примитив, " -"принадлежащий импортированной детали или активируйте группу импортированной " +"принадлежащий импортированной детали, или активируйте группу импортированной " "детали." -#: graphicswin.cpp:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." @@ -1162,7 +1203,7 @@ msgstr "" "Рабочая плоскость не активна. Активируйте ее через Эскиз -> В Рабочей " "Плоскости чтобы определить плоскость для сетки." -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." @@ -1171,13 +1212,13 @@ msgstr "" "текстовые комментарии или ограничения с размерными значениями. Чтобы " "привязать отрезок или другой примитив, выбирайте его точки." -#: graphicswin.cpp:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "" "Рабочая плоскость не активна. Активирована рабочая плоскость по умолчанию " "для данной группы." -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" @@ -1187,7 +1228,7 @@ msgstr "" "по умолчанию. Попробуйте выделить рабочую плоскость или создать новую с " "помощью Группа -> Создать Эскиз в Новой Рабочей Плоскости." -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." @@ -1196,54 +1237,54 @@ msgstr "" "точку, либо запустите команду без выделения, чтобы перейти к окну настроек " "этой команды." -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "" "кликните мышью там, где хотите создать дугу окружности (дуга будет " "нарисована против часовой стрелки)" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "кликните мышью там, где хотите создать опорную точку" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "кликните мышью там, где хотите создать первую точку отрезка" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "" "кликните мышью там, где хотите создать первую точку вспомогательного отрезка" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "" "кликните мышью там, где хотите создать первую точку кубического сплайна Безье" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "кликните мышью там, где будет находиться центр окружности" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "" "кликните мышью там, где будет находиться точка, через которую будет " "построена рабочая плоскость" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "кликните мышью там, где будет находиться один из углов прямоугольника" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "кликните мышью там, где хотите создать текст" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "" "кликните мышью там, где будет расположен левый верхний угол изображения" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1256,26 +1297,26 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "эскиз-в-3d" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -"Неправильное выделение для создания эскиза.\n" -"Группа может быть создана, используя в качестве выделения следующие " +"Неправильное выделение для создания эскиза в рабочей плоскости. Группа может" +" быть создана, используя в качестве выделения следующие " "примитивы:\n" "\n" -" * точку (рабочая плоскость, ориентированная к ближайшему виду, " -"проходящая через точку)\n" -" * точку и два отрезка (рабочая плоскость, проходящая через точку и " -"параллельная отрезкам)\n" -" * рабочую плоскость (копия рабочей плоскости)\n" +" * точку (через точку, ортогонально осям координат)\n" +" * точку и два отрезка (через точку, параллельно отрезкам)\n" +" * точку и нормаль (через точку, ортогонально нормали)\n" +" * рабочую плоскость (копию рабочей плоскости)\n" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." @@ -1283,18 +1324,18 @@ msgstr "" "Выберите рабочую плоскость (Эскиз -> В Рабочей Плоскости) перед созданием " "группы выдавливания. Эскиз будет выдавлен по нормали к рабочей плоскости." -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "тело-выдавливания" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "" "Операция создания тела вращения может быть применена только к плоским " "эскизам." -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1306,23 +1347,23 @@ msgstr "" "Группа может быть создана, используя в качестве выделения следующие " "примитивы:\n" "\n" -" * точку и отрезок / координатных базис (нормаль) (тело вращения вокруг " +" * точку и отрезок / координатный базис (нормаль) (тело вращения вокруг " "оси, проходящей через точку и параллельной отрезку / нормали)\n" " * отрезок (тело вращения вокруг оси, проходящей через отрезок)\n" "\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "тело-вращения" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "" "Операция создания тела вращения может быть применена только к плоским " "эскизам." -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1334,23 +1375,23 @@ msgstr "" "Группа может быть создана, используя в качестве выделения следующие " "примитивы:\n" "\n" -" * точку и отрезок / координатных базис (нормаль) (тело вращения вокруг " +" * точку и отрезок / координатный базис (нормаль) (тело вращения вокруг " "оси, проходящей через точку и параллельной отрезку / нормали)\n" " * отрезок (тело вращения вокруг оси, проходящей через отрезок)\n" "\n" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "тело-вращения" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "" "Операция создания винтового тела может быть применена только к плоским " "эскизам." -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1367,12 +1408,12 @@ msgstr "" "точку)\n" " * отрезок (вращение вокруг отрезка)\n" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "тело-винтовое" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1387,47 +1428,47 @@ msgstr "" "\n" " * точку при активной рабочей плоскости (вращение в плоскости вокруг " "выбранной точки)\n" -" * точку и отрезок / координатных базис (нормаль) (вращение вокруг оси, " +" * точку и отрезок / координатный базис (нормаль) (вращение вокруг оси, " "проходящей через точку и параллельной отрезку / нормали)\n" "\n" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "круговой-массив" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "линейный-массив" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "(без имени)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "незамкнутый контур или несовпадение стилей!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "не все точки лежат в одной плоскости!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "контур имеет самопересечения!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "вырожденный отрезок!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" "Скругления эскиза можно создавать только когда рабочая плоскость " "активирована." -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." @@ -1435,7 +1476,7 @@ msgstr "" "Чтобы создать скругление эскиза, выберите точку, где соединяются два " "примитива, не принадлежащих к вспомогательной геометрии." -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." @@ -1443,18 +1484,18 @@ msgstr "" "Невозможно скруглить угол. Попробуйте радиус поменьше или создайте требуемую " "геометрию с помощью Ограничения -> Параллельность / Касательность." -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" "Невозможно разделить такие примитивы. Выберите линии, окружности или " "кубические сплайны." -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "" "Пересечение примитивов работает только когда рабочая плоскость активна." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." @@ -1462,349 +1503,355 @@ msgstr "" "Выберите два пересекающихся примитива (два отрезка/окружности/дуги или " "отрезок/окружность/дугу и точку)" -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "Невозможно разделить пересекаемые примитивы: пересечений нет." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Применить Стиль" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "Стиль по Умолчанию" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Создать Новый Стиль..." -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Настройки Группы" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Настройки Стиля" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Выделить Последовательность Примитивов" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Переключить Режим Размера Для Справок" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Переключить Смежный Угол" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Привязать к Сетке" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Удалить Точку Сплайна" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Добавить Точку Сплайна" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "" "Невозможно добавить точку сплайна: достигнуто ограничение максимального " "количества точек для сплайна." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Переключить Режим 'Дополнительные Построения'." -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Удалить Ограничение Совпадения Точек" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Вырезать" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Копировать" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Выделить Все" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Вставить" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Вставить с Трансформацией..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Удалить" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Сбросить Выделение" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Снять Выделение с Выбранного" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Показать Все" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "кликните мышью там, где хотите расположить следующую точку" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" "Невозможно начертить прямоугольник, когда рабочая плоскость не активна." -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "кликните мышью там, где хотите расположить другой угол прямоугольника" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "кликните, чтобы задать радиус" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать дугу, когда нет активной рабочей плоскости." -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "кликните мышью там, где хотите создать точку" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "" "кликните мышью там, где хотите создать следующую точку сплайна или нажмите " "Esc для завершения операции." -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" "Рабочая плоскость уже активна. Перейдите в режим 3d перед созданием новой " "рабочей плоскости." -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать текст, когда нет активной рабочей плоскости." -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "кликните, чтобы расположить правый нижний угол текста" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "Невозможно создать изображение. Активируйте рабочую плоскость." -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "КОММЕНТАРИЙ -- ДВОЙНОЙ ЩЕЛЧОК ДЛЯ РЕДАКТИРОВАНИЯ" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "проекты SolveSpace" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "ВСЕ" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "IDF печатная плата" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "STL треугольная сетка" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "PNG изображение" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "STL полигональная сетка" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ полигональная сетка" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" -msgstr "Three.js-совместимая полигональная сетка с просмторщиком" +msgstr "Three.js-совместимая полигональная сетка с просмотрщиком" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-совместимая полигональная сетка" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "VRML файл" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "STEP файл" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "PDF документ" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "Encapsulated PostScript" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "SVG изображение" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF файл (AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL файл" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF и DWG файлы" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "CSV файлы (значения, разделенные запятой)" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "без имени" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "Сохранить Файл" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "Открыть Файл" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "Отменить" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "Сохранить" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "_Открыть" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "Автосохранение Доступно" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "Автоматически сохраненный файл доступен для данного проекта." -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "Хотите загрузить автосохраненный файл вместо исходного?" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "&Загрузить Автосохранение" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "&Не Загружать" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "Измененный Файл" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "Сохранить изменения, сделанные в файле “%s”?" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "Сохранить изменения, сделанные в новом проекте?" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "Изменения будут утеряны, если их не сохранить." -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "&Сохранить" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "&Не Сохранять" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "(новый проект)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "Браузер" -#: solvespace.cpp:658 +#: solvespace.cpp:699 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " @@ -1814,30 +1861,30 @@ msgstr "" "это не то, что требуется, если так, необходимо спрятать их, нажав ссылку " "вверху окна Браузера." -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -"Неподдерживаемый тип файла '%s'; Поддерживаются файлы с расширением .dxf и ." +"Неподдерживаемый тип файла '%s'. Поддерживаются файлы с расширением .dxf и ." "dwg." -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "У ограничения должно быть значение и оно не должно быть справочным." -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "" "Неправильное выделение для операции изменения значения с заданным шагом; " "необходимо выбрать ограничение со значением." -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "Сборка не содержит пересечения деталей - это хорошо." -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1848,7 +1895,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1861,7 +1908,7 @@ msgstr "" "\n" " %s" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1873,7 +1920,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%." -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1890,7 +1937,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." @@ -1898,7 +1945,7 @@ msgstr "" "Эта группа не содержит замкнутых областей. В ней нет замкнутых контуров, " "примитивы не лежат в одной плоскости или самопересекаются." -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1915,7 +1962,7 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1932,38 +1979,38 @@ msgstr "" "Кривые аппроксимированы кусочно-линейными функциями.\n" "Это приводит к ошибке в расчетах, обычно в пределах 1%%." -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" "Неправильное выделение для расчета периметра; необходимо выбирать только " "отрезки, дуги и кривые в качестве исходных данных" -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "Неправильное выделение для трассировки; необходимо выбрать одну точку." -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "Невозможно записать в '%s'" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." -msgstr "Полигональная стека содержит самопересечения (это плохо)" +msgstr "Полигональная сетка содержит самопересечения (это плохо)" -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." -msgstr "Полигональная стека не содержит самопересечений (это хорошо)" +msgstr "Полигональная сетка не содержит самопересечений (это хорошо)" -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "Полигональная сетка содержит \"оголенные\" ребра (это плохо)" -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "Полигональная сетка герметична (это хорошо)" -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1974,7 +2021,7 @@ msgstr "" "\n" "Модель содержит %d треугольников, содержащихся в %d поверхностях." -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1989,7 +2036,7 @@ msgstr "" "\n" "Нет проблемных ребер - это хорошо.%s" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -2004,7 +2051,7 @@ msgstr "" "\n" "%d найдены проблемные ребра - это плохо.%s" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -2035,7 +2082,7 @@ msgstr "" "\n" "© 2008-%d Джонатан Вэстью и другие авторы.\n" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." @@ -2043,27 +2090,27 @@ msgstr "" "Невозможно применить стиль к примитиву, который произошел от другого " "примитива. Попробуйте применить стиль к исходному примитиву." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "Имя стиля не может быть пустым." -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "Невозможно сделать повторение меньше, чем 1 раз." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "Невозможно сделать повтор больше, чем 999 раз." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "Имя группы не может быть пустым." -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "Прозрачность должна быть числом от нуля до единицы." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "Радиус не может быть нулевым или отрицательным." @@ -2218,14 +2265,60 @@ msgctxt "button" msgid "&OK" msgstr "ХОРОШО" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "Масштабный коэффициент не может быть нулевым или отрицательным." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "Неверный формат: введите данные как x, y, z" +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Неправильное выделение для ограничения 'отношение длин'.\n" +#~ "Ограничение может принимать в качестве выделения следующие примитивы:\n" +#~ "\n" +#~ " * два отрезка\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Неправильное выделение для ограничения 'разница длин'.\n" +#~ "Ограничение может принимать в качестве выделения следующие примитивы:\n" +#~ "\n" +#~ " * два отрезка\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "Отно&шение Длин" + +#~ msgid "Length Diff&erence" +#~ msgstr "Ра&зница Длин" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Неправильное выделение для создания эскиза.\n" +#~ "Группа может быть создана, используя в качестве выделения следующие " +#~ "примитивы:\n" +#~ "\n" +#~ " * точку (рабочая плоскость, ориентированная к ближайшему виду, " +#~ "проходящая через точку)\n" +#~ " * точку и два отрезка (рабочая плоскость, проходящая через точку и " +#~ "параллельная отрезкам)\n" +#~ " * рабочую плоскость (копия рабочей плоскости)\n" + #~ msgid "Specify between 0 and 8 digits after the decimal." #~ msgstr "Введите число от 0 до 8." diff --git a/res/locales/tr_TR.po b/res/locales/tr_TR.po new file mode 100644 index 00000000..de82270f --- /dev/null +++ b/res/locales/tr_TR.po @@ -0,0 +1,2265 @@ +# Turkish translations for SolveSpace package. +# Copyright (C) 2017 the SolveSpace authors +# This file is distributed under the same license as the SolveSpace package. +# Automatically generated, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: SolveSpace 3.0\n" +"Report-Msgid-Bugs-To: whitequark@whitequark.org\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"PO-Revision-Date: 2021-03-09 22:58+0300\n" +"Last-Translator: Mustafa Halil GÖRENTAŞ \n" +"Language-Team: app4soft\n" +"Language: tr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.2\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: clipboard.cpp:309 +msgid "" +"Cut, paste, and copy work only in a workplane.\n" +"\n" +"Activate one with Sketch -> In Workplane." +msgstr "" +"İşi yalnızca bir çalışma düzleminde kesin, yapıştır ve kopyalayın.\n" +"\n" +"Çizim -> Çalışma Düzleminde menüsü ile bir düzlemi etkinleştirin." + +#: clipboard.cpp:326 +msgid "Clipboard is empty; nothing to paste." +msgstr "Pano boş; yapıştırılacak bir şey yok." + +#: clipboard.cpp:373 +msgid "Number of copies to paste must be at least one." +msgstr "Yapıştırılacak kopya sayısı en az bir olmalıdır." + +#: clipboard.cpp:389 textscreens.cpp:827 +msgid "Scale cannot be zero." +msgstr "Ölçek sıfır olamaz." + +#: clipboard.cpp:431 +msgid "Select one point to define origin of rotation." +msgstr "Dönüşün başlangıç noktasını tanımlamak için bir nokta seçin." + +#: clipboard.cpp:443 +msgid "Select two points to define translation vector." +msgstr "Öteleme vektörünü tanımlamak için iki nokta seçin." + +#: clipboard.cpp:453 +msgid "" +"Transformation is identity. So all copies will be exactly on top of each " +"other." +msgstr "Dönüşüm özdeştir. Yani tüm kopyalar tam olarak üst üste gelecek." + +#: clipboard.cpp:457 +msgid "Too many items to paste; split this into smaller pastes." +msgstr "Yapıştırılamayacak kadar çok öğe; bunu daha küçük yapıştımalara bölün." + +#: clipboard.cpp:462 +msgid "No workplane active." +msgstr "Etkin Çalışma Düzlemi yok." + +#: confscreen.cpp:376 +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 +msgid "Bad format: specify color as r, g, b" +msgstr "Hatalı biçim: rengi r, g, b olarak belirtin" + +#: confscreen.cpp:412 +msgid "" +"The perspective factor will have no effect until you enable View -> Use " +"Perspective Projection." +msgstr "" +"Görünüm -> Perspektif Projeksiyonu Kullan'ı etkinleştirene kadar perspektif " +"çarpanının hiçbir etkisi olmayacaktır." + +#: confscreen.cpp:430 confscreen.cpp:440 +#, c-format +msgid "Specify between 0 and %d digits after the decimal." +msgstr "Ondalık basamak sonra 0 ile %d arasında basamak belirtin." + +#: confscreen.cpp:452 +msgid "Export scale must not be zero!" +msgstr "Dışa aktarma ölçeği sıfır olmamalıdır!" + +#: confscreen.cpp:464 +msgid "Cutter radius offset must not be negative!" +msgstr "Kesici yarıçap ofseti negatif olmamalıdır!" + +#: confscreen.cpp:518 +msgid "Bad value: autosave interval should be positive" +msgstr "Hatalı değer: otomatik kaydetme süresi pozitif olmalıdır" + +#: confscreen.cpp:521 +msgid "Bad format: specify interval in integral minutes" +msgstr "Hatalı biçim: süre aralığını dakika cinsinden belirtin" + +#: constraint.cpp:12 +msgctxt "constr-name" +msgid "pts-coincident" +msgstr "nktlar-kesişen" + +#: constraint.cpp:13 +msgctxt "constr-name" +msgid "pt-pt-distance" +msgstr "nkt-nkt-mesafe" + +#: constraint.cpp:14 +msgctxt "constr-name" +msgid "pt-line-distance" +msgstr "nkt-çizgi-mesafesi" + +#: constraint.cpp:15 +msgctxt "constr-name" +msgid "pt-plane-distance" +msgstr "nkt-düzlem-mesafesi" + +#: constraint.cpp:16 +msgctxt "constr-name" +msgid "pt-face-distance" +msgstr "nkt-yüzey-mesafesi" + +#: constraint.cpp:17 +msgctxt "constr-name" +msgid "proj-pt-pt-distance" +msgstr "proj-nkt-nkt-mesafesi" + +#: constraint.cpp:18 +msgctxt "constr-name" +msgid "pt-in-plane" +msgstr "düzlemde-nkt" + +#: constraint.cpp:19 +msgctxt "constr-name" +msgid "pt-on-line" +msgstr "nkt-çizgide" + +#: constraint.cpp:20 +msgctxt "constr-name" +msgid "pt-on-face" +msgstr "yüzeyde-nkt" + +#: constraint.cpp:21 +msgctxt "constr-name" +msgid "eq-length" +msgstr "eş-uzunluk" + +#: constraint.cpp:22 +msgctxt "constr-name" +msgid "eq-length-and-pt-ln-dist" +msgstr "eş-uzunluk-ve-çzg-nkt-mesafesi" + +#: constraint.cpp:23 +msgctxt "constr-name" +msgid "eq-pt-line-distances" +msgstr "eş-nkt-çizgi-mesafesi" + +#: constraint.cpp:24 +msgctxt "constr-name" +msgid "length-ratio" +msgstr "uzunluk-oranı" + +#: constraint.cpp:25 +msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" +msgid "length-difference" +msgstr "uzunluk-farkı" + +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 +msgctxt "constr-name" +msgid "symmetric" +msgstr "simetrik" + +#: constraint.cpp:31 +msgctxt "constr-name" +msgid "symmetric-h" +msgstr "simetrik-y" + +#: constraint.cpp:32 +msgctxt "constr-name" +msgid "symmetric-v" +msgstr "simetrik-d" + +#: constraint.cpp:33 +msgctxt "constr-name" +msgid "symmetric-line" +msgstr "simetrik-çizgi" + +#: constraint.cpp:34 +msgctxt "constr-name" +msgid "at-midpoint" +msgstr "orta noktada" + +#: constraint.cpp:35 +msgctxt "constr-name" +msgid "horizontal" +msgstr "yatay" + +#: constraint.cpp:36 +msgctxt "constr-name" +msgid "vertical" +msgstr "dikey" + +#: constraint.cpp:37 +msgctxt "constr-name" +msgid "diameter" +msgstr "çap" + +#: constraint.cpp:38 +msgctxt "constr-name" +msgid "pt-on-circle" +msgstr "nkt-çemberde" + +#: constraint.cpp:39 +msgctxt "constr-name" +msgid "same-orientation" +msgstr "aynı-yön" + +#: constraint.cpp:40 +msgctxt "constr-name" +msgid "angle" +msgstr "açı" + +#: constraint.cpp:41 +msgctxt "constr-name" +msgid "parallel" +msgstr "paralel" + +#: constraint.cpp:42 +msgctxt "constr-name" +msgid "arc-line-tangent" +msgstr "yay-çizgi-teğet" + +#: constraint.cpp:43 +msgctxt "constr-name" +msgid "cubic-line-tangent" +msgstr "kubik-çizgi-teğet" + +#: constraint.cpp:44 +msgctxt "constr-name" +msgid "curve-curve-tangent" +msgstr "eğri-eğri-teğet" + +#: constraint.cpp:45 +msgctxt "constr-name" +msgid "perpendicular" +msgstr "dik" + +#: constraint.cpp:46 +msgctxt "constr-name" +msgid "eq-radius" +msgstr "eş-yarıçap" + +#: constraint.cpp:47 +msgctxt "constr-name" +msgid "eq-angle" +msgstr "eş-açı" + +#: constraint.cpp:48 +msgctxt "constr-name" +msgid "eq-line-len-arc-len" +msgstr "eş-çizgi-uzn-yay-uzn" + +#: constraint.cpp:49 +msgctxt "constr-name" +msgid "lock-where-dragged" +msgstr "sürüklendiği-yerde-kilitli" + +#: constraint.cpp:50 +msgctxt "constr-name" +msgid "comment" +msgstr "yorum" + +#: constraint.cpp:144 +msgid "" +"The tangent arc and line segment must share an endpoint. Constrain them with " +"Constrain -> On Point before constraining tangent." +msgstr "" +"Teğet, yay ve çizgi parçası bir uç noktayı paylaşmalıdır. Teğeti " +"sınırlandırmadan önce bunları Sınırlandır -> Noktada ile sınırlandırın." + +#: constraint.cpp: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." + +#: 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." + +#: constraint.cpp:238 +msgid "" +"Bad selection for distance / diameter constraint. This constraint can apply " +"to:\n" +"\n" +" * two points (distance between points)\n" +" * a line segment (length)\n" +" * two points and a line segment or normal (projected distance)\n" +" * a workplane and a point (minimum distance)\n" +" * a line segment and a point (minimum distance)\n" +" * a plane face and a point (minimum distance)\n" +" * a circle or an arc (diameter)\n" +msgstr "" +"Mesafe / çap sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki nokta (noktalar arasındaki mesafe)\n" +" * bir çizgi parçası (uzunluk)\n" +" * iki nokta ve bir çizgi parçası veya normal (öngörülen mesafe)\n" +" * bir çalışma düzlemi ve bir nokta (minimum mesafe)\n" +" * bir çizgi parçası ve bir nokta (minimum mesafe)\n" +" * bir düzlem yüzeyi ve bir nokta (minimum mesafe)\n" +" * bir daire veya yay (çap)\n" + +#: constraint.cpp:291 +msgid "" +"Bad selection for on point / curve / plane constraint. This constraint can " +"apply to:\n" +"\n" +" * two points (points coincident)\n" +" * a point and a workplane (point in plane)\n" +" * a point and a line segment (point on line)\n" +" * a point and a circle or arc (point on curve)\n" +" * a point and a plane face (point on face)\n" +msgstr "" +"Nokta / eğri / düzlem sınırlandırması için hatalı seçim. Bu sınırlandırma " +"şunlara uygulanabilir:\n" +"\n" +" * iki nokta (çakışan noktalar)\n" +" * bir nokta ve bir çalışma düzlemi (düzlemdeki nokta)\n" +" * bir nokta ve bir çizgi parçası (çizgi üzerinde nokta)\n" +" * bir nokta ve bir daire veya yay (eğri üzerinde nokta)\n" +" * bir nokta ve bir düzlem yüzeyi (yüzeyin üzerine gelin)\n" + +#: constraint.cpp:353 +msgid "" +"Bad selection for equal length / radius constraint. This constraint can " +"apply to:\n" +"\n" +" * two line segments (equal length)\n" +" * two line segments and two points (equal point-line distances)\n" +" * a line segment and two points (equal point-line distances)\n" +" * a line segment, and a point and line segment (point-line distance " +"equals length)\n" +" * four line segments or normals (equal angle between A,B and C,D)\n" +" * three line segments or normals (equal angle between A,B and B,C)\n" +" * two circles or arcs (equal radius)\n" +" * a line segment and an arc (line segment length equals arc length)\n" +msgstr "" +"Eşit uzunluk / yarıçap sınırlandırması için hatalı seçim. Bu sınırlandırma " +"şunlara uygulanabilir:\n" +"\n" +" * iki çizgi parçası (eşit uzunluk)\n" +" * iki çizgi parçası ve iki nokta (eşit nokta-çizgi mesafeleri)\n" +" * bir çizgi parçası ve iki nokta (eşit nokta-çizgi mesafeleri)\n" +" * bir çizgi parçası ve bir nokta ve çizgi parçası (nokta-çizgi mesafesi " +"uzunluğa eşittir)\n" +" * dört çizgi parçası veya normal (A, B ve C, D arasında eşit açı)\n" +" * üç çizgi parçası veya normal (A, B ve B, C arasında eşit açı)\n" +" * iki daire veya yay (eşit yarıçap)\n" +" * bir çizgi parçası ve bir yay (çizgi parçası uzunluğu yay uzunluğuna " +"eşittir)\n" + +#: constraint.cpp:407 +msgid "" +"Bad selection for length ratio constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" +msgstr "" + +#: constraint.cpp:441 +msgid "" +"Bad selection for length difference constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" +msgstr "" + +#: constraint.cpp:472 +msgid "" +"Bad selection for at midpoint constraint. This constraint can apply to:\n" +"\n" +" * a line segment and a point (point at midpoint)\n" +" * a line segment and a workplane (line's midpoint on plane)\n" +msgstr "" +"Orta nokta sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * bir çizgi parçası ve bir nokta (orta noktayı işaret edin)\n" +" * bir çizgi parçası ve bir çalışma düzlemi (düzlemdeki çizginin orta " +"noktası)\n" + +#: constraint.cpp:530 +msgid "" +"Bad selection for symmetric constraint. This constraint can apply to:\n" +"\n" +" * two points or a line segment (symmetric about workplane's coordinate " +"axis)\n" +" * line segment, and two points or a line segment (symmetric about line " +"segment)\n" +" * workplane, and two points or a line segment (symmetric about " +"workplane)\n" +msgstr "" +"Simetrik sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki nokta veya bir çizgi parçası (çalışma düzleminin koordinat ekseni " +"etrafında simetrik)\n" +" * çizgi parçası ve iki nokta veya bir çizgi parçası (çizgi parçası " +"etrafında simetrik)\n" +" * çalışma düzlemi ve iki nokta veya bir çizgi parçası (çalışma düzlemi " +"etrafında simetrik)\n" + +#: constraint.cpp: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 " +"düzlemi etkin olmalıdır." + +#: constraint.cpp:579 +msgid "" +"Activate a workplane (with Sketch -> In Workplane) before applying a " +"horizontal or vertical constraint." +msgstr "" +"Yatay veya dikey bir sınırlandırma uygulamadan önce bir çalışma düzlemini " +"(Çizim -> Çalışma Düzleminde menüsü) etkinleştirin." + +#: constraint.cpp:592 +msgid "" +"Bad selection for horizontal / vertical constraint. This constraint can " +"apply to:\n" +"\n" +" * two points\n" +" * a line segment\n" +msgstr "" +"Yatay / dikey sınırlandırma için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki nokta\n" +" * bir çizgi parçası\n" + +#: constraint.cpp:613 +msgid "" +"Bad selection for same orientation constraint. This constraint can apply " +"to:\n" +"\n" +" * two normals\n" +msgstr "" +"Aynı yön sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki normal\n" + +#: constraint.cpp:663 +msgid "Must select an angle constraint." +msgstr "Bir açı sınırlaması seçilmelidir." + +#: constraint.cpp:676 +msgid "Must select a constraint with associated label." +msgstr "İlişkili etikete sahip bir sınırlama seçilmelidir." + +#: constraint.cpp:687 +msgid "" +"Bad selection for angle constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"Açı sınırlaması için hatalı seçim. Bu sınırlandırma şunlara uygulanabilir:\n" +"\n" +" * iki çizgi parçası\n" +" * bir çizgi parçası ve normal\n" +" * iki normal\n" + +#: constraint.cpp:754 +msgid "Curve-curve tangency must apply in workplane." +msgstr "Eğri-eğri teğetliği çalışma düzlemine uygulanmalıdır." + +#: constraint.cpp:766 +msgid "" +"Bad selection for parallel / tangent constraint. This constraint can apply " +"to:\n" +"\n" +" * two line segments (parallel)\n" +" * a line segment and a normal (parallel)\n" +" * two normals (parallel)\n" +" * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" +msgstr "" +"Paralel / teğet sınırlaması için hatalı seçim. Bu sınırlandırma şunlara " +"uygulanabilir:\n" +"\n" +" * iki çizgi parçası (paralel)\n" +" * bir çizgi parçası ve normal (paralel)\n" +" * iki normal (paralel)\n" +" * bir uç noktayı paylaşan(teğet) iki çizgi parçası, yay veya " +"bezier'ler\n" + +#: constraint.cpp:784 +msgid "" +"Bad selection for perpendicular constraint. This constraint can apply to:\n" +"\n" +" * two line segments\n" +" * a line segment and a normal\n" +" * two normals\n" +msgstr "" +"Dikey sınırlama için hatalı seçim. Bu sınırlandırma şunlara uygulanabilir:\n" +"\n" +" * iki çizgi parçası\n" +" * bir çizgi parçası ve normal\n" +" * iki normal\n" + +#: constraint.cpp:799 +msgid "" +"Bad selection for lock point where dragged constraint. This constraint can " +"apply to:\n" +"\n" +" * a point\n" +msgstr "" +"Sürüklendiği yerde noktayı sınırlandırmak için hatalı seçim. Bu " +"sınırlandırma şunlara uygulanabilir:\n" +"\n" +"* bir nokta\n" + +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "YENİ YORUM - DÜZENLEMEK İÇİN ÇİFT TIKLAYIN" + +#: constraint.cpp:818 +msgid "click center of comment text" +msgstr "yorum metninin merkezine tıklayın" + +#: export.cpp:19 +msgid "" +"No solid model present; draw one with extrudes and revolves, or use Export " +"2d View to export bare lines and curves." +msgstr "" +"Katı model yok; katılama ve döndürme komutları ile bir model çizin veya açık " +"çizgileri ve eğrileri dışa vermek için Görüntüyü 2d olarak Dışa Aktar'ı " +"kullanın." + +#: export.cpp:61 +msgid "" +"Bad selection for export section. Please select:\n" +"\n" +" * nothing, with an active workplane (workplane is section plane)\n" +" * a face (section plane through face)\n" +" * a point and two line segments (plane through point and parallel to " +"lines)\n" +msgstr "" +"Kesiti Dışa Aktarmak için hatalı seçim. Lütfen şunlardan birini seçin:\n" +"\n" +" * aktif bir çalışma düzleminde iken hiçbir şey seçmeyin (çalışma " +"düzlemi, kesit düzlemidir)\n" +" * bir yüzey (yüzeyden kesit düzlemi)\n" +" * bir nokta ve iki çizgi parçası (nokta boyunca düzlem ve çizgilere " +"paralel)\n" + +#: export.cpp:818 +msgid "Active group mesh is empty; nothing to export." +msgstr "Etkin Mesh grubu boş; dışa aktarılacak bir şey yok." + +#: exportvector.cpp:336 +msgid "freehand lines were replaced with continuous lines" +msgstr "serbest çizgiler, sürekli çizgilerle değiştirildi" + +#: exportvector.cpp:338 +msgid "zigzag lines were replaced with continuous lines" +msgstr "zikzak çizgiler sürekli çizgilerle değiştirildi" + +#: exportvector.cpp:592 +msgid "" +"Some aspects of the drawing have no DXF equivalent and were not exported:\n" +msgstr "Çizimin bazı yönlerinin DXF eşdeğeri yoktur ve dışa aktarılmamıştır:\n" + +#: exportvector.cpp:838 +msgid "" +"PDF page size exceeds 200 by 200 inches; many viewers may reject this file." +msgstr "" +"PDF sayfa boyutu 200 x 200 inç'i aşıyor; birçok görüntüleyici bu dosyayı " +"reddedebilir." + +#: file.cpp:44 group.cpp:91 +msgctxt "group-name" +msgid "sketch-in-plane" +msgstr "düzlemde çizim" + +#: file.cpp:62 +msgctxt "group-name" +msgid "#references" +msgstr "#referanslar" + +#: file.cpp:550 +msgid "The file is empty. It may be corrupt." +msgstr "Dosya boş. Bozuk olabilir." + +#: file.cpp:555 +msgid "" +"Unrecognized data in file. This file may be corrupt, or from a newer version " +"of the program." +msgstr "" +"Dosyada veriler tanınmadı. Bu dosya bozuk veya programın daha yeni bir " +"sürümü ile oluşturulmuş olabilir." + +#: file.cpp:867 +msgctxt "title" +msgid "Missing File" +msgstr "Eksik Dosya" + +#: file.cpp:868 +#, c-format +msgctxt "dialog" +msgid "The linked file “%s” is not present." +msgstr "\"%s\" bağlantılı dosya yok." + +#: file.cpp:870 +msgctxt "dialog" +msgid "" +"Do you want to locate it manually?\n" +"\n" +"If you decline, any geometry that depends on the missing file will be " +"permanently removed." +msgstr "" +"Yerini manuel olarak mı bulmak istiyorsunuz?\n" +"\n" +"Reddederseniz, eksik dosyaya bağlı olan geometri kalıcı olarak " +"kaldırılacaktır." + +#: file.cpp:873 +msgctxt "button" +msgid "&Yes" +msgstr "&Evet" + +#: file.cpp:875 +msgctxt "button" +msgid "&No" +msgstr "&Hayır" + +#: file.cpp:877 solvespace.cpp:610 +msgctxt "button" +msgid "&Cancel" +msgstr "&İptal" + +#: graphicswin.cpp:41 +msgid "&File" +msgstr "&Dosya" + +#: graphicswin.cpp:42 +msgid "&New" +msgstr "&Yeni" + +#: graphicswin.cpp:43 +msgid "&Open..." +msgstr "&Aç..." + +#: graphicswin.cpp:44 +msgid "Open &Recent" +msgstr "&Son Erişilenden Aç" + +#: graphicswin.cpp:45 +msgid "&Save" +msgstr "&Kaydet" + +#: graphicswin.cpp:46 +msgid "Save &As..." +msgstr "&Farklı kaydet..." + +#: graphicswin.cpp:48 +msgid "Export &Image..." +msgstr "&Resim olarak dışa aktar..." + +#: graphicswin.cpp:49 +msgid "Export 2d &View..." +msgstr "&Görüntüyü 2d olarak dışa aktar..." + +#: graphicswin.cpp:50 +msgid "Export 2d &Section..." +msgstr "&Kesiti 2d olarak dışa aktar..." + +#: graphicswin.cpp:51 +msgid "Export 3d &Wireframe..." +msgstr "3d &TelKafes olarak dışa aktar..." + +#: graphicswin.cpp:52 +msgid "Export Triangle &Mesh..." +msgstr "&Üçgensel Mesh olarak dışa aktar..." + +#: graphicswin.cpp:53 +msgid "Export &Surfaces..." +msgstr "Y&üzeyleri dışa aktar..." + +#: graphicswin.cpp:54 +msgid "Im&port..." +msgstr "&İçe Aktar..." + +#: graphicswin.cpp:57 +msgid "E&xit" +msgstr "&Çıkış" + +#: graphicswin.cpp:60 +msgid "&Edit" +msgstr "D&üzen" + +#: graphicswin.cpp:61 +msgid "&Undo" +msgstr "&Geri al" + +#: graphicswin.cpp:62 +msgid "&Redo" +msgstr "&Yinele" + +#: graphicswin.cpp:63 +msgid "Re&generate All" +msgstr "Tümünü Yeniden &Oluştur" + +#: graphicswin.cpp:65 +msgid "Snap Selection to &Grid" +msgstr "Seçimi &Izgaraya Tuttur" + +#: graphicswin.cpp:66 +msgid "Rotate Imported &90°" +msgstr "İçe Aktarılanları &90° Döndür" + +#: graphicswin.cpp:68 +msgid "Cu&t" +msgstr "&Kes" + +#: graphicswin.cpp:69 +msgid "&Copy" +msgstr "K&opyala" + +#: graphicswin.cpp:70 +msgid "&Paste" +msgstr "Y&apıştır" + +#: graphicswin.cpp:71 +msgid "Paste &Transformed..." +msgstr "&Dönüştürerek Yapıştır..." + +#: graphicswin.cpp:72 +msgid "&Delete" +msgstr "&Sil" + +#: graphicswin.cpp:74 +msgid "Select &Edge Chain" +msgstr "Kenar &Zincirini Seçin" + +#: graphicswin.cpp:75 +msgid "Select &All" +msgstr "&Tümünü Seç" + +#: graphicswin.cpp:76 +msgid "&Unselect All" +msgstr "Tüm Seçimi &Kaldır" + +#: graphicswin.cpp:78 +msgid "&Line Styles..." +msgstr "&Çizgi Biçimi..." + +#: graphicswin.cpp:79 +msgid "&View Projection..." +msgstr "&Projeksiyonu Görüntüle..." + +#: graphicswin.cpp:81 +msgid "Con&figuration..." +msgstr "Y&apılandır..." + +#: graphicswin.cpp:84 +msgid "&View" +msgstr "&Görünüm" + +#: graphicswin.cpp:85 +msgid "Zoom &In" +msgstr "&Yakınlaş" + +#: graphicswin.cpp:86 +msgid "Zoom &Out" +msgstr "&Uzaklaş" + +#: graphicswin.cpp:87 +msgid "Zoom To &Fit" +msgstr "&Sığacak Şekilde Yakınlaş" + +#: graphicswin.cpp:89 +msgid "Align View to &Workplane" +msgstr "Görünümü &Çalışma Düzlemine Hizala" + +#: graphicswin.cpp:90 +msgid "Nearest &Ortho View" +msgstr "En Yakın &Orto Görünüm" + +#: graphicswin.cpp:91 +msgid "Nearest &Isometric View" +msgstr "En Yakın &İzometrik Görünüm" + +#: graphicswin.cpp:92 +msgid "&Center View At Point" +msgstr "&Noktayı Merkezde Görüntüle" + +#: graphicswin.cpp:94 +msgid "Show Snap &Grid" +msgstr "&Izgarayı Göster" + +#: graphicswin.cpp:95 +msgid "Darken Inactive Solids" +msgstr "Aktif Olmayan Katıları &Koyulaştır" + +#: graphicswin.cpp:96 +msgid "Use &Perspective Projection" +msgstr "&Perspektif Projeksiyonu Kullanın" + +#: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 +msgid "Dimension &Units" +msgstr "Ölçü &Birimleri" + +#: graphicswin.cpp:99 +msgid "Dimensions in &Millimeters" +msgstr "&Milimetre cinsinden ölçü" + +#: graphicswin.cpp:100 +msgid "Dimensions in M&eters" +msgstr "M&etre cinsinden ölçü" + +#: graphicswin.cpp:101 +msgid "Dimensions in &Inches" +msgstr "&İnç cinsinden ölçü" + +#: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 +msgid "Show &Toolbar" +msgstr "&Araç Çubuğunu Göster" + +#: graphicswin.cpp:105 +msgid "Show Property Bro&wser" +msgstr "&Özellik Tarayıcısını Göster" + +#: graphicswin.cpp:107 +msgid "&Full Screen" +msgstr "&Tam Ekran" + +#: graphicswin.cpp:109 +msgid "&New Group" +msgstr "Yeni &Grup" + +#: graphicswin.cpp:110 +msgid "Sketch In &3d" +msgstr "&3d'de Çizim Yap" + +#: graphicswin.cpp:111 +msgid "Sketch In New &Workplane" +msgstr "&Yeni Çalışma Düzleminde Çizim Yap" + +#: graphicswin.cpp:113 +msgid "Step &Translating" +msgstr "Adım &Ötele" + +#: graphicswin.cpp:114 +msgid "Step &Rotating" +msgstr "Adım &Döndür" + +#: graphicswin.cpp:116 +msgid "E&xtrude" +msgstr "&Katıla" + +#: graphicswin.cpp:117 +msgid "&Helix" +msgstr "&Helis" + +#: graphicswin.cpp:118 +msgid "&Lathe" +msgstr "&Çark" + +#: graphicswin.cpp:119 +msgid "Re&volve" +msgstr "Dö&ndür" + +#: graphicswin.cpp:121 +msgid "Link / Assemble..." +msgstr "Bağla / Montajla..." + +#: graphicswin.cpp:122 +msgid "Link Recent" +msgstr "Son Erişilenden Bağla" + +#: graphicswin.cpp:124 +msgid "&Sketch" +msgstr "&Çizim" + +#: graphicswin.cpp:125 +msgid "In &Workplane" +msgstr "Ç&alışma Düzleminde" + +#: graphicswin.cpp:126 +msgid "Anywhere In &3d" +msgstr "&3d'de Herhangi Bir Yerde" + +#: graphicswin.cpp:128 +msgid "Datum &Point" +msgstr "Referasn &Noktası" + +#: graphicswin.cpp:129 +msgid "&Workplane" +msgstr "Ça&lışma Düzlemi" + +#: graphicswin.cpp:131 +msgid "Line &Segment" +msgstr "Çizgi &Parçası" + +#: graphicswin.cpp:132 +msgid "C&onstruction Line Segment" +msgstr "&Yapı Çizgisi Parçası" + +#: graphicswin.cpp:133 +msgid "&Rectangle" +msgstr "&Dikdörtgen" + +#: graphicswin.cpp:134 +msgid "&Circle" +msgstr "&Çember" + +#: graphicswin.cpp:135 +msgid "&Arc of a Circle" +msgstr "Çember &Yayı" + +#: graphicswin.cpp:136 +msgid "&Bezier Cubic Spline" +msgstr "Bezier Kübik &Eğri" + +#: graphicswin.cpp:138 +msgid "&Text in TrueType Font" +msgstr "TrueType Yazı Tipinde &Metin" + +#: graphicswin.cpp:139 +msgid "&Image" +msgstr "&Resim" + +#: graphicswin.cpp:141 +msgid "To&ggle Construction" +msgstr "Yap&ıyı Değiştir" + +#: graphicswin.cpp:142 +msgid "Tangent &Arc at Point" +msgstr "Noktada &Teğet Yay" + +#: graphicswin.cpp:143 +msgid "Split Curves at &Intersection" +msgstr "Kesişim yerinde Eğrileri &Böl" + +#: graphicswin.cpp:145 +msgid "&Constrain" +msgstr "&Sınırlandır" + +#: graphicswin.cpp:146 +msgid "&Distance / Diameter" +msgstr "&Mesafe / Çap" + +#: graphicswin.cpp:147 +msgid "Re&ference Dimension" +msgstr "&Referans Ölçü" + +#: graphicswin.cpp:148 +msgid "A&ngle" +msgstr "&Açı" + +#: graphicswin.cpp:149 +msgid "Reference An&gle" +msgstr "Referans A&çı" + +#: graphicswin.cpp:150 +msgid "Other S&upplementary Angle" +msgstr "Diğer &Bütünler Açı" + +#: graphicswin.cpp:151 +msgid "Toggle R&eference Dim" +msgstr "Ölçüyü Re&ferans Yap / Yapma" + +#: graphicswin.cpp:153 +msgid "&Horizontal" +msgstr "&Yatay" + +#: graphicswin.cpp:154 +msgid "&Vertical" +msgstr "&Dikey" + +#: graphicswin.cpp:156 +msgid "&On Point / Curve / Plane" +msgstr "&Noktada / Eğride / Düzlemde" + +#: graphicswin.cpp:157 +msgid "E&qual Length / Radius / Angle" +msgstr "&Eşit Uzunluk / Yarıçap / Açı" + +#: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" + +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" + +#: graphicswin.cpp:160 +msgid "At &Midpoint" +msgstr "&Orta Noktada" + +#: graphicswin.cpp:161 +msgid "S&ymmetric" +msgstr "&Simetrik" + +#: graphicswin.cpp:162 +msgid "Para&llel / Tangent" +msgstr "&Paralel / Teğet" + +#: graphicswin.cpp:163 +msgid "&Perpendicular" +msgstr "D&ik" + +#: graphicswin.cpp:164 +msgid "Same Orient&ation" +msgstr "Aynı &Yön" + +#: graphicswin.cpp:165 +msgid "Lock Point Where &Dragged" +msgstr "Sürüklendiği Yerde Noktayı &Kilitle" + +#: graphicswin.cpp:167 +msgid "Comment" +msgstr "Y&orum" + +#: graphicswin.cpp:169 +msgid "&Analyze" +msgstr "&Analiz Et" + +#: graphicswin.cpp:170 +msgid "Measure &Volume" +msgstr "&Hacmi Ölçün" + +#: graphicswin.cpp:171 +msgid "Measure A&rea" +msgstr "&Alanı Ölçün" + +#: graphicswin.cpp:172 +msgid "Measure &Perimeter" +msgstr "&Çevre Uzunluğunu Ölçün" + +#: graphicswin.cpp:173 +msgid "Show &Interfering Parts" +msgstr "&Engelleyen Parçaları Göster" + +#: graphicswin.cpp:174 +msgid "Show &Naked Edges" +msgstr "A&çık Kenarları Göster" + +#: graphicswin.cpp:175 +msgid "Show &Center of Mass" +msgstr "&Kütle Merkezini Göster" + +#: graphicswin.cpp:177 +msgid "Show &Underconstrained Points" +msgstr "&Sınırlanmamış Noktaları Göster" + +#: graphicswin.cpp:179 +msgid "&Trace Point" +msgstr "&Noktayı İzle" + +#: graphicswin.cpp:180 +msgid "&Stop Tracing..." +msgstr "&İzlemeyi &Durdur..." + +#: graphicswin.cpp:181 +msgid "Step &Dimension..." +msgstr "Adım &Ölçüsü..." + +#: graphicswin.cpp:183 +msgid "&Help" +msgstr "&Yardım" + +#: graphicswin.cpp:184 +msgid "&Language" +msgstr "&Dil" + +#: graphicswin.cpp:185 +msgid "&Website / Manual" +msgstr "&Web sitesi / Kılavuz" + +#: graphicswin.cpp:187 +msgid "&About" +msgstr "&Hakkında" + +#: graphicswin.cpp:361 +msgid "(no recent files)" +msgstr "(yeni dosyalar yok)" + +#: graphicswin.cpp:369 +#, c-format +msgid "File '%s' does not exist." +msgstr "'%s' dosyası mevcut değil." + +#: graphicswin.cpp:736 +msgid "No workplane is active, so the grid will not appear." +msgstr "Etkin çalışma düzlemi yok, bu nedenle ızgara görünmeyecektir." + +#: graphicswin.cpp:751 +msgid "" +"The perspective factor is set to zero, so the view will always be a parallel " +"projection.\n" +"\n" +"For a perspective projection, modify the perspective factor in the " +"configuration screen. A value around 0.3 is typical." +msgstr "" +"Perspektif çarpanı sıfıra ayarlanmıştır, bu nedenle görünüm her zaman " +"paralel bir projeksiyon olacaktır.\n" +"\n" +"Perspektif bir projeksiyon için, konfigürasyon ekranındaki perspektif " +"çarpanını değiştirin. 0,3 civarında bir değer tipiktir." + +#: graphicswin.cpp:836 +msgid "" +"Select a point; this point will become the center of the view on screen." +msgstr "" +"Bir nokta seçin; bu nokta ekrandaki görüntünün merkezi haline gelecektir." + +#: graphicswin.cpp:1136 +msgid "No additional entities share endpoints with the selected entities." +msgstr "Hiçbir ek öğe, seçili öğeler ile uç noktaları paylaşmaz." + +#: graphicswin.cpp:1154 +msgid "" +"To use this command, select a point or other entity from an linked part, or " +"make a link group the active group." +msgstr "" +"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 +msgid "" +"No workplane is active. Activate a workplane (with Sketch -> In Workplane) " +"to define the plane for the snap grid." +msgstr "" +"Etkin çalışma düzlemi yok. Tutturma ızgarasının düzlemini tanımlamak için " +"bir çalışma düzlemini (Çizim -> Çalışma Düzleminde menüsü ile) etkinleştirin." + +#: graphicswin.cpp:1184 +msgid "" +"Can't snap these items to grid; select points, text comments, or constraints " +"with a label. To snap a line, select its endpoints." +msgstr "" +"Bu öğeleri ızgaraya tutturamazsınız; noktaları, metin yorumlarını veya " +"sınırlamaları bir etiketle seçin. Bir çizgiyi tutturmak için uç noktalarını " +"seçin." + +#: graphicswin.cpp:1269 +msgid "No workplane selected. Activating default workplane for this group." +msgstr "" +"Çalışma düzlemi seçilmedi. Bu grup için varsayılan çalışma düzlemi " +"etkinleştiriliyor." + +#: graphicswin.cpp:1272 +msgid "" +"No workplane is selected, and the active group does not have a default " +"workplane. Try selecting a workplane, or activating a sketch-in-new-" +"workplane group." +msgstr "" +"Hiçbir çalışma düzlemi seçilmemiştir ve aktif grubun varsayılan bir çalışma " +"düzlemi yoktur. Bir çalışma düzlemi seçmeyi veya yeni çalışma düzleminde " +"çizim grubunu etkinleştirmeyi deneyin." + +#: graphicswin.cpp:1293 +msgid "" +"Bad selection for tangent arc at point. Select a single point, or select " +"nothing to set up arc parameters." +msgstr "" +"Noktada teğet yay oluşturmak için hatalı seçim. Tek bir nokta seçin veya yay " +"parametrelerini ayarlamak için hiçbir şey seçmeyin." + +#: graphicswin.cpp:1304 +msgid "click point on arc (draws anti-clockwise)" +msgstr "yayın ilk noktası için tıklayın (saat yönünün tersine çizilir)" + +#: graphicswin.cpp:1305 +msgid "click to place datum point" +msgstr "referans noktasını yerleştirmek için tıklayın" + +#: graphicswin.cpp:1306 +msgid "click first point of line segment" +msgstr "çizgi parçasının ilk noktası için tıklayın" + +#: graphicswin.cpp:1308 +msgid "click first point of construction line segment" +msgstr "yapı çizgisinin ilk noktası için tıklayın" + +#: graphicswin.cpp:1309 +msgid "click first point of cubic segment" +msgstr "kübik segmentin ilk noktası için tıklayın" + +#: graphicswin.cpp:1310 +msgid "click center of circle" +msgstr "çemberin merkezi için tıklayın" + +#: graphicswin.cpp:1311 +msgid "click origin of workplane" +msgstr "çalışma düzleminin merkezi için tıklayın" + +#: graphicswin.cpp:1312 +msgid "click one corner of rectangle" +msgstr "dikdörtgenin bir köşesi için tıklayın" + +#: graphicswin.cpp:1313 +msgid "click top left of text" +msgstr "metnin sol üst köşesi için tıklayın" + +#: graphicswin.cpp:1319 +msgid "click top left of image" +msgstr "resmin sol üst köşesi için tıklayın" + +#: graphicswin.cpp:1345 +msgid "" +"No entities are selected. Select entities before trying to toggle their " +"construction state." +msgstr "" +"Hiçbir öğe seçilmedi. Yapı durumlarını geçiş yapmaya çalışmadan önce öğeleri " +"seçin." + +#: group.cpp:86 +msgctxt "group-name" +msgid "sketch-in-3d" +msgstr "3d-içinde-çizim" + +#: group.cpp:150 +msgid "" +"Bad selection for new sketch in workplane. This group can be created with:\n" +"\n" +" * a point (through the point, orthogonal to coordinate axes)\n" +" * a point and two line segments (through the point, parallel to the " +"lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" +" * a workplane (copy of the workplane)\n" +msgstr "" + +#: group.cpp: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." + +#: group.cpp:175 +msgctxt "group-name" +msgid "extrude" +msgstr "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." + +#: group.cpp:191 +msgid "" +"Bad selection for new lathe group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Yeni çark grubu için hatalı seçim. Bu grup şu şekilde oluşturulabilir:\n" +"\n" +" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel " +"bir eksen etrafında, nokta boyunca döndürülür )\n" +" * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n" + +#: group.cpp:201 +msgctxt "group-name" +msgid "lathe" +msgstr "çark" + +#: group.cpp:206 +msgid "Revolve operation can only be applied to planar sketches." +msgstr "Döndürme işlemi yalnızca düzlemsel çizimlere uygulanabilir." + +#: group.cpp:217 +msgid "" +"Bad selection for new revolve group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Yeni döndürme grup için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n" +"\n" +" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel, " +"noktadan geçen bir eksen etrafında döndürülür)\n" +" * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n" + +#: group.cpp:229 +msgctxt "group-name" +msgid "revolve" +msgstr "döndür" + +#: group.cpp:234 +msgid "Helix operation can only be applied to planar sketches." +msgstr "Helis işlemi yalnızca düzlemsel çizimlere uygulanabilir." + +#: group.cpp:245 +msgid "" +"Bad selection for new helix group. This group can be created with:\n" +"\n" +" * a point and a line segment or normal (revolved about an axis parallel " +"to line / normal, through point)\n" +" * a line segment (revolved about line segment)\n" +msgstr "" +"Yeni helis grubu için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n" +"\n" +" * bir nokta ve bir çizgi parçası veya normal (çizgiye / normale paralel, " +"noktadan geçen bir eksen etrafında döndürülür)\n" +" * bir çizgi parçası (çizgi parçası etrafında döndürülür)\n" + +#: group.cpp:257 +msgctxt "group-name" +msgid "helix" +msgstr "helis" + +#: group.cpp:270 +msgid "" +"Bad selection for new rotation. This group can be created with:\n" +"\n" +" * a point, while locked in workplane (rotate in plane, about that " +"point)\n" +" * a point and a line or a normal (rotate about an axis through the " +"point, and parallel to line / normal)\n" +msgstr "" +"Yeni çevirme için hatalı seçim. Bu grup şunlarla oluşturulabilir:\n" +"\n" +" * çalışma düzleminde bir nokta, kilitli olduğu sürece (düzlemde o nokta " +"etrafında çevirin)\n" +" * bir nokta ve bir çizgi veya bir normal (nokta boyunca bir eksen " +"etrafında ve çizgiye / normale paralel çevirin)\n" + +#: group.cpp:283 +msgctxt "group-name" +msgid "rotate" +msgstr "çevir" + +#: group.cpp:294 +msgctxt "group-name" +msgid "translate" +msgstr "ötele" + +#: group.cpp:416 +msgid "(unnamed)" +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!" + +#: groupmesh.cpp:720 +msgid "points not all coplanar!" +msgstr "noktaların hepsi aynı düzlemde değil!" + +#: groupmesh.cpp:722 +msgid "contour is self-intersecting!" +msgstr "kontur kendisiyle kesişiyor!" + +#: groupmesh.cpp:724 +msgid "zero-length edge!" +msgstr "sıfır-uzunlukta kenar!" + +#: modify.cpp:252 +msgid "Must be sketching in workplane to create tangent arc." +msgstr "Teğet yay oluşturmak için çalışma düzleminde çizim yapılmalıdır." + +#: modify.cpp:299 +msgid "" +"To create a tangent arc, select a point where two non-construction lines or " +"circles in this group and workplane join." +msgstr "" +"Bir teğet yay oluşturmak için, bu gruptaki iki yapı-dışı çizginin veya " +"dairenin ve çalışma düzleminin birleştiği bir nokta seçin." + +#: modify.cpp:386 +msgid "" +"Couldn't round this corner. Try a smaller radius, or try creating the " +"desired geometry by hand with tangency constraints." +msgstr "" +"Bu köşe yuvarlatılamadı. Daha küçük bir yarıçap deneyin veya teğet " +"sınırlamaları ile istenen geometriyi elle oluşturmayı deneyin." + +#: modify.cpp:595 +msgid "Couldn't split this entity; lines, circles, or cubics only." +msgstr "Bu öğeler bölünemedi; yalnızca çizgiler, çemberler veya küpler." + +#: modify.cpp:622 +msgid "Must be sketching in workplane to split." +msgstr "Bölmek için çalışma düzleminde çizim 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)." + +#: modify.cpp:734 +msgid "Can't split; no intersection found." +msgstr "Bölünemez; kesişim bulunamadı." + +#: mouse.cpp:557 +msgid "Assign to Style" +msgstr "Biçime Ata" + +#: mouse.cpp:573 +msgid "No Style" +msgstr "Biçim Yok" + +#: mouse.cpp:576 +msgid "Newly Created Custom Style..." +msgstr "Yeni Oluşturulan Özel Biçim ..." + +#: mouse.cpp:583 +msgid "Group Info" +msgstr "Grup Bilgisi" + +#: mouse.cpp:603 +msgid "Style Info" +msgstr "Biçim Bİlgisi" + +#: mouse.cpp:623 +msgid "Select Edge Chain" +msgstr "Kenar Zinciri Seçin" + +#: mouse.cpp:629 +msgid "Toggle Reference Dimension" +msgstr "Ölçü Referansını Değiştir" + +#: mouse.cpp:635 +msgid "Other Supplementary Angle" +msgstr "Diğer Bütünler Açı" + +#: mouse.cpp:640 +msgid "Snap to Grid" +msgstr "Izgaraya Tuttur" + +#: mouse.cpp:649 +msgid "Remove Spline Point" +msgstr "Eğri Noktasını Sil" + +#: mouse.cpp:684 +msgid "Add Spline Point" +msgstr "Eğri Noktası Ekle" + +#: mouse.cpp:688 +msgid "Cannot add spline point: maximum number of points reached." +msgstr "Eğri noktası eklenemiyor: en fazla nokta sayısına ulaşıldı." + +#: mouse.cpp:713 +msgid "Toggle Construction" +msgstr "Yapıyı değiştir" + +#: mouse.cpp:729 +msgid "Delete Point-Coincident Constraint" +msgstr "Çakışan-Nokta Sınırlamasını Sil" + +#: mouse.cpp:747 +msgid "Cut" +msgstr "Kes" + +#: mouse.cpp:749 +msgid "Copy" +msgstr "Kopyala" + +#: mouse.cpp:753 +msgid "Select All" +msgstr "Tümünü Seç" + +#: mouse.cpp:758 +msgid "Paste" +msgstr "Yapıştır" + +#: mouse.cpp:760 +msgid "Paste Transformed..." +msgstr "Dönüştürerek Yapıştır..." + +#: mouse.cpp:765 +msgid "Delete" +msgstr "Sil" + +#: mouse.cpp:768 +msgid "Unselect All" +msgstr "Tüm Seçimi Kaldır" + +#: mouse.cpp:775 +msgid "Unselect Hovered" +msgstr "Fareyle Üzerine Gelinen Seçimi Kaldır" + +#: mouse.cpp:784 +msgid "Zoom to Fit" +msgstr "Sığdırmak için Yakınlaştır" + +#: mouse.cpp:986 mouse.cpp:1274 +msgid "click next point of line, or press Esc" +msgstr "çizginin sonraki noktası için tıklayın veya Esc tuşuna basın" + +#: mouse.cpp:992 +msgid "" +"Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"3d'de dikdörtgen çizilemez; önce Çizim -> Çalışma Düzleminde menüsü ile bir " +"çalışma düzlemini etkinleştirin." + +#: mouse.cpp:1026 +msgid "click to place other corner of rectangle" +msgstr "dikdörtgenin diğer köşesini yerleştirmek için tıklayın" + +#: mouse.cpp:1047 +msgid "click to set radius" +msgstr "yarıçapı ayarlamak için tıklayın" + +#: mouse.cpp:1052 +msgid "" +"Can't draw arc in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"3d'de yay çizemez; önce Çizim -> Çalışma Düzleminde menüsü ile bir çalışma " +"düzlemini etkinleştirin." + +#: mouse.cpp:1071 +msgid "click to place point" +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" + +#: mouse.cpp:1092 +msgid "" +"Sketching in a workplane already; sketch in 3d before creating new workplane." +msgstr "" +"Zaten bir çalışma düzleminde çizim yapılıyor; 3d'de çizim yapmadan önce yeni " +"çalışma düzlemi oluşturun." + +#: mouse.cpp:1108 +msgid "" +"Can't draw text in 3d; first, activate a workplane with Sketch -> In " +"Workplane." +msgstr "" +"3d'de metin yazılamaz; önce Çizim -> Çalışma Düzleminde menüsü ile bir " +"çalışma düzlemini etkinleştirin." + +#: mouse.cpp:1125 +msgid "click to place bottom right of text" +msgstr "metnin sağ alt konumunu yerleştirmek 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." + +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 +msgctxt "file-type" +msgid "SolveSpace models" +msgstr "SolveSpace Modelleri" + +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 +msgctxt "file-type" +msgid "IDF circuit board" +msgstr "IDF devre kartı" + +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 +msgctxt "file-type" +msgid "PNG image" +msgstr "PNG Resmi" + +#: platform/gui.cpp:100 +msgctxt "file-type" +msgid "STL mesh" +msgstr "STL mesh" + +#: platform/gui.cpp:101 +msgctxt "file-type" +msgid "Wavefront OBJ mesh" +msgstr "Wavefront OBJ mesh" + +#: platform/gui.cpp:102 +msgctxt "file-type" +msgid "Three.js-compatible mesh, with viewer" +msgstr "Görüntüleyicili, Three.js-uyumlu mesh" + +#: platform/gui.cpp:103 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "Three.js-uyumlu mesh, yalnızca mesh" + +#: platform/gui.cpp:104 +msgctxt "file-type" +msgid "VRML text file" +msgstr "VRML metin dosyası" + +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 +msgctxt "file-type" +msgid "STEP file" +msgstr "STEP dosyası" + +#: platform/gui.cpp:112 +msgctxt "file-type" +msgid "PDF file" +msgstr "PDF dosyası" + +#: platform/gui.cpp:113 +msgctxt "file-type" +msgid "Encapsulated PostScript" +msgstr "Kapsüllenmiş PostScript" + +#: platform/gui.cpp:114 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "Ölçeklenebilir Vektör Grafikleri (SVG)" + +#: platform/gui.cpp:116 platform/gui.cpp:123 +msgctxt "file-type" +msgid "DXF file (AutoCAD 2007)" +msgstr "DXF dosyası (AutoCAD 2007)" + +#: platform/gui.cpp:117 +msgctxt "file-type" +msgid "HPGL file" +msgstr "HPGL dosyası" + +#: platform/gui.cpp:118 +msgctxt "file-type" +msgid "G Code" +msgstr "G Kodu" + +#: platform/gui.cpp:127 +msgctxt "file-type" +msgid "AutoCAD DXF and DWG files" +msgstr "AutoCAD DXF ve DWG dosyaları" + +#: platform/gui.cpp:131 +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 +msgid "untitled" +msgstr "isimsiz" + +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 +msgctxt "title" +msgid "Save File" +msgstr "Dosyayı Kaydet" + +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 +msgctxt "title" +msgid "Open File" +msgstr "Dosyayı Aç" + +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 +msgctxt "button" +msgid "_Cancel" +msgstr "_İptal" + +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 +msgctxt "button" +msgid "_Save" +msgstr "_Kaydet" + +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 +msgctxt "button" +msgid "_Open" +msgstr "_Aç" + +#: solvespace.cpp:170 +msgctxt "title" +msgid "Autosave Available" +msgstr "Otomatik Kaydetme Kullanılabilir" + +#: solvespace.cpp:171 +msgctxt "dialog" +msgid "An autosave file is available for this sketch." +msgstr "Bu çizim için otomatik kaydetme dosyası kullanılabilir." + +#: solvespace.cpp:172 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "Bunun yerine otomatik kaydetme dosyasını yüklemek istiyor musunuz?" + +#: solvespace.cpp:173 +msgctxt "button" +msgid "&Load autosave" +msgstr "&Otomatik kaydetmeyi yükle" + +#: solvespace.cpp:175 +msgctxt "button" +msgid "Do&n't Load" +msgstr "&Yükleme" + +#: solvespace.cpp:598 +msgctxt "title" +msgid "Modified File" +msgstr "Değiştirilen Dosya" + +#: solvespace.cpp:600 +#, c-format +msgctxt "dialog" +msgid "Do you want to save the changes you made to the sketch “%s”?" +msgstr "\"%s\" çiziminde yaptığınız değişiklikleri kaydetmek istiyor musunuz?" + +#: solvespace.cpp:603 +msgctxt "dialog" +msgid "Do you want to save the changes you made to the new sketch?" +msgstr "Yeni çizimde yaptığınız değişiklikleri kaydetmek istiyor musunuz?" + +#: solvespace.cpp:606 +msgctxt "dialog" +msgid "Your changes will be lost if you don't save them." +msgstr "Bunları kaydetmezseniz değişiklikleriniz kaybolur." + +#: solvespace.cpp:607 +msgctxt "button" +msgid "&Save" +msgstr "&Kaydet" + +#: solvespace.cpp:609 +msgctxt "button" +msgid "Do&n't Save" +msgstr "K&aydetme" + +#: solvespace.cpp:630 +msgctxt "title" +msgid "(new sketch)" +msgstr "(yeni çizim)" + +#: solvespace.cpp:637 +msgctxt "title" +msgid "Property Browser" +msgstr "Özellik Tarayıcısı" + +#: solvespace.cpp:699 +msgid "" +"Constraints are currently shown, and will be exported in the toolpath. This " +"is probably not what you want; hide them by clicking the link at the top of " +"the text window." +msgstr "" +"Sınırlamalar şu anda gösterilmektedir ve takım yolunda dışa aktarılacaktır. " +"Muhtemelen istediğiniz bu değil; metin penceresinin üst kısmındaki " +"bağlantıya tıklayarak bunları gizleyin." + +#: solvespace.cpp:771 +#, c-format +msgid "" +"Can't identify file type from file extension of filename '%s'; try .dxf or ." +"dwg." +msgstr "" +"Dosya türü '%s' dosya uzantısından tanımlanamıyor; .dxf veya .dwg'yi deneyin." + +#: solvespace.cpp:823 +msgid "Constraint must have a label, and must not be a reference dimension." +msgstr "Sınırlamanın bir etiketi olmalı ve bir referans ölçüsü olmamalıdır." + +#: solvespace.cpp:827 +msgid "Bad selection for step dimension; select a constraint." +msgstr "" +"Adım ölçüsü için hatalı seçim; bir nokta boyunca, eksenleri koordine etmek " +"için ortogonal seçin." + +#: solvespace.cpp:851 +msgid "The assembly does not interfere, good." +msgstr "Montaj engel değil, iyi." + +#: solvespace.cpp:867 +#, c-format +msgid "" +"The volume of the solid model is:\n" +"\n" +" %s" +msgstr "" +"Katı modelin hacmi:\n" +"\n" +" % s" + +#: solvespace.cpp:876 +#, c-format +msgid "" +"\n" +"The volume of current group mesh is:\n" +"\n" +" %s" +msgstr "" +"\n" +"Mevcut mesh grubunun hacmi:\n" +"\n" +" %s" + +#: solvespace.cpp:881 +msgid "" +"\n" +"\n" +"Curved surfaces have been approximated as triangles.\n" +"This introduces error, typically of around 1%." +msgstr "" +"\n" +"\n" +"Eğri yüzeyler, üçgenler olarak yaklaştırılmıştır.\n" +"Bu, tipik olarak yaklaşık 1% hataya neden olur." + +#: solvespace.cpp:896 +#, c-format +msgid "" +"The surface area of the selected faces is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"Seçilen yüzlerin yüzey alanı:\n" +"\n" +" %s\n" +"\n" +"Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" +"Bu, tipik olarak yaklaşık 1%% hataya neden olur." + +#: solvespace.cpp:905 +msgid "" +"This group does not contain a correctly-formed 2d closed area. It is open, " +"not coplanar, or self-intersecting." +msgstr "" +"Bu grup, doğru biçimlendirilmiş 2d kapalı alan içermiyor. Açık, eş düzlemli " +"değil veya kendisiyle kesişiyor." + +#: solvespace.cpp:917 +#, c-format +msgid "" +"The area of the region sketched in this group is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"Bu grupta çizilen bölgenin alanı:\n" +"\n" +" %s\n" +"\n" +"Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" +"Bu, tipik olarak yaklaşık 1%% hataya neden olur." + +#: solvespace.cpp:937 +#, c-format +msgid "" +"The total length of the selected entities is:\n" +"\n" +" %s\n" +"\n" +"Curves have been approximated as piecewise linear.\n" +"This introduces error, typically of around 1%%." +msgstr "" +"Seçilen öğelerin toplam uzunluğu:\n" +"\n" +" %s\n" +"\n" +"Eğriler, parçalı doğrusal olarak yaklaştırıldı.\n" +"Bu, tipik olarak yaklaşık 1%% hataya neden olur." + +#: solvespace.cpp:943 +msgid "Bad selection for perimeter; select line segments, arcs, and curves." +msgstr "" +"Çevre uzunluğu için hatalı seçim; çizgi parçalarını, yayları ve eğrileri " +"seçin." + +#: solvespace.cpp:959 +msgid "Bad selection for trace; select a single point." +msgstr "İzleme için hatalı seçim; tek bir nokta seçin." + +#: solvespace.cpp:986 +#, c-format +msgid "Couldn't write to '%s'" +msgstr "\"%s\" ye yazılamadı" + +#: solvespace.cpp:1016 +msgid "The mesh is self-intersecting (NOT okay, invalid)." +msgstr "Mesh kendisiyle kesişiyor (TAMAM değil, geçersiz)." + +#: solvespace.cpp:1017 +msgid "The mesh is not self-intersecting (okay, valid)." +msgstr "Mesh kendi kendine kesişmiyor (tamam, geçerli)." + +#: solvespace.cpp:1019 +msgid "The mesh has naked edges (NOT okay, invalid)." +msgstr "Mesh'in açık kenarları var (tamam DEĞİL, geçersiz)." + +#: solvespace.cpp:1020 +msgid "The mesh is watertight (okay, valid)." +msgstr "Mesh çok sıkı (tamam, geçerli)" + +#: solvespace.cpp:1023 +#, c-format +msgid "" +"\n" +"\n" +"The model contains %d triangles, from %d surfaces." +msgstr "" +"\n" +"\n" +"Model, %d yüzeylerden %d üçgen içerir." + +#: solvespace.cpp:1027 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"Zero problematic edges, good.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"Sıfır sorunlu kenar, iyi.%s" + +#: solvespace.cpp:1030 +#, c-format +msgid "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d problematic edges, bad.%s" +msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d sorunlu kenar, kötü.%s" + +#: solvespace.cpp:1043 +#, c-format +msgid "" +"This is SolveSpace version %s.\n" +"\n" +"For more information, see http://solvespace.com/\n" +"\n" +"SolveSpace is free software: you are free to modify\n" +"and/or redistribute it under the terms of the GNU\n" +"General Public License (GPL) version 3 or later.\n" +"\n" +"There is NO WARRANTY, to the extent permitted by\n" +"law. For details, visit http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues and other authors.\n" +msgstr "" +"Bu SolveSpace'in %s sürümüdür.\n" +"\n" +"Daha fazla bilgi için, http://solvespace.com/ bkz.\n" +"\n" +"SolveSpace ücretsiz bir yazılımdır: GNU Genel Kamu \n" +"Lisansı (GPL) sürüm 3 veya daha sonraki hükümler altında \n" +"onu değiştirmekte ve / veya yeniden dağıtmakta özgürsünüz.\n" +"\n" +"Yasaların izin verdiği ölçüde GARANTİ YOKTUR. \n" +"Ayrıntılar için http://gnu.org/licenses/ adresini ziyaret edin.\n" +"\n" +"© 2008-% d Jonathan Westhues ve diğer yazarlar.\n" + +#: style.cpp:185 +msgid "" +"Can't assign style to an entity that's derived from another entity; try " +"assigning a style to this entity's parent." +msgstr "" +"Başka bir öğeden türetilen bir öğeye biçim atayamazsınız; bu öğenin üst " +"öğesine bir biçim atamayı deneyin." + +#: style.cpp:735 +msgid "Style name cannot be empty" +msgstr "Biçim adı boş olamaz" + +#: textscreens.cpp:785 +msgid "Can't repeat fewer than 1 time." +msgstr "1 defadan az tekrar edilemez." + +#: textscreens.cpp:789 +msgid "Can't repeat more than 999 times." +msgstr "999 defadan fazla tekrar edilemez." + +#: textscreens.cpp:814 +msgid "Group name cannot be empty" +msgstr "Grup adı boş olamaz" + +#: textscreens.cpp:866 +msgid "Opacity must be between zero and one." +msgstr "Şeffaflık değeri sıfır ile bir arasında olmalıdır." + +#: textscreens.cpp:901 +msgid "Radius cannot be zero or negative." +msgstr "Yarıçap sıfır veya negatif değer olamaz." + +#: toolbar.cpp:18 +msgid "Sketch line segment" +msgstr "Çizgi parçası ile taslak çizin" + +#: toolbar.cpp:20 +msgid "Sketch rectangle" +msgstr "Dikdörtgen çizin" + +#: toolbar.cpp:22 +msgid "Sketch circle" +msgstr "Çember çizin" + +#: toolbar.cpp:24 +msgid "Sketch arc of a circle" +msgstr "Bir çember yayı çizin" + +#: toolbar.cpp:26 +msgid "Sketch curves from text in a TrueType font" +msgstr "TrueType yazı tipindeki metinden eğriler çizin" + +#: toolbar.cpp:28 +msgid "Sketch image from a file" +msgstr "Bir dosyadan resim ekleyin" + +#: toolbar.cpp:30 +msgid "Create tangent arc at selected point" +msgstr "Seçilen noktada teğet yay oluşturun" + +#: toolbar.cpp:32 +msgid "Sketch cubic Bezier spline" +msgstr "Kübik Bezier Eğri Çizin" + +#: toolbar.cpp:34 +msgid "Sketch datum point" +msgstr "Referans Nokta Ekleyin" + +#: toolbar.cpp:36 +msgid "Toggle construction" +msgstr "Yapıyı değiştirin" + +#: toolbar.cpp:38 +msgid "Split lines / curves where they intersect" +msgstr "Çizgileri / eğrileri kesiştikleri yerde bölün" + +#: toolbar.cpp:42 +msgid "Constrain distance / diameter / length" +msgstr "Mesafeyi / çapı / uzunluğu sınırlandırın" + +#: toolbar.cpp:44 +msgid "Constrain angle" +msgstr "Açıyı sınırlandırın" + +#: toolbar.cpp:46 +msgid "Constrain to be horizontal" +msgstr "Yatay olarak sınırlandırın" + +#: toolbar.cpp:48 +msgid "Constrain to be vertical" +msgstr "Dikey olarak sınırlandırın" + +#: toolbar.cpp:50 +msgid "Constrain to be parallel or tangent" +msgstr "Paralel veya teğet olarak sınırlandırın" + +#: toolbar.cpp:52 +msgid "Constrain to be perpendicular" +msgstr "Dik olarak sınırlandırın" + +#: toolbar.cpp:54 +msgid "Constrain point on line / curve / plane / point" +msgstr "Noktayı çizgi / eğri / düzlem / nokta ile çakıştırarak sınırlandırın" + +#: toolbar.cpp:56 +msgid "Constrain symmetric" +msgstr "Simetrik olarak sınırlandırın" + +#: toolbar.cpp:58 +msgid "Constrain equal length / radius / angle" +msgstr "Eşit uzunluk / yarıçap / açı olarak sınırlandırın" + +#: toolbar.cpp:60 +msgid "Constrain normals in same orientation" +msgstr "Normalleri aynı yönde sınırlandırın" + +#: toolbar.cpp:62 +msgid "Other supplementary angle" +msgstr "Diğer bütünler açı" + +#: toolbar.cpp:64 +msgid "Toggle reference dimension" +msgstr "Ölçüyü Referans Yap / Yapma" + +#: toolbar.cpp:68 +msgid "New group extruding active sketch" +msgstr "Etkin çizimi katılayarak yeni grup oluşturun" + +#: toolbar.cpp:70 +msgid "New group rotating active sketch" +msgstr "Etkin çizimi döndürerek yeni grup oluşturun" + +#: toolbar.cpp:72 +msgid "New group helix from active sketch" +msgstr "Etkin çizimden sarmal yeni grup oluştur" + +#: toolbar.cpp:74 +msgid "New group revolve active sketch" +msgstr "Etkin çizimi döndürülür yeni grup oluşturun" + +#: toolbar.cpp:76 +msgid "New group step and repeat rotating" +msgstr "Adımlayarak ve tekrarlayarak yeni dönüş grup oluşturun" + +#: toolbar.cpp:78 +msgid "New group step and repeat translating" +msgstr "Adımlayarak ve tekrarlayarak yeni öteleme grup oluşturun" + +#: toolbar.cpp:80 +msgid "New group in new workplane (thru given entities)" +msgstr "" +"Yeni çalışma düzleminde yeni grup oluşturun (verilen öğeler aracılığıyla)" + +#: toolbar.cpp:82 +msgid "New group in 3d" +msgstr "3d'de yeni grup oluşturun" + +#: toolbar.cpp:84 +msgid "New group linking / assembling file" +msgstr "Bağlantı / Montaj dosyası ile yeni grup oluşturun" + +#: toolbar.cpp:88 +msgid "Nearest isometric view" +msgstr "En yakın izometrik görünüm" + +#: toolbar.cpp:90 +msgid "Align view to active workplane" +msgstr "Görünümü etkin çalışma düzlemine hizalayın" + +#: util.cpp:165 +msgctxt "title" +msgid "Error" +msgstr "Hata" + +#: util.cpp:165 +msgctxt "title" +msgid "Message" +msgstr "Mesaj" + +#: util.cpp:170 +msgctxt "button" +msgid "&OK" +msgstr "&Tamam" + +#: view.cpp:127 +msgid "Scale cannot be zero or negative." +msgstr "Ölçek sıfır veya negatif olamaz." + +#: view.cpp:139 view.cpp:148 +msgid "Bad format: specify x, y, z" +msgstr "Kötü biçim: x, y, z'yi belirtin" + +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Uzunluk oranı sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +#~ "uygulanabilir:\n" +#~ "\n" +#~ " * iki çizgi parçası\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "Uzunluk farkı sınırlandırması için hatalı seçim. Bu sınırlandırma şunlara " +#~ "uygulanabilir:\n" +#~ "\n" +#~ " * iki çizgi parçası\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "&Uzunluk Oranı" + +#~ msgid "Length Diff&erence" +#~ msgstr "U&zunluk Farkı" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "Çalışma düzleminde yeni taslak çizmek için hatalı seçim. Bu grup şunlarla " +#~ "oluşturulabilir:\n" +#~ "\n" +#~ " * bir nokta (nokta boyunca, eksenleri koordine etmek için " +#~ "ortogonal)\n" +#~ " * bir nokta ve iki çizgi parçası (noktadan, çizgilere paralel)\n" +#~ " * bir çalışma düzlemi (çalışma düzleminin kopyası)\n" + +#~ msgctxt "file-type" +#~ msgid "Q3D Object file" +#~ msgstr "Q3D Object file" diff --git a/res/locales/uk_UA.po b/res/locales/uk_UA.po index 86ce77b4..8192a6b6 100644 --- a/res/locales/uk_UA.po +++ b/res/locales/uk_UA.po @@ -1,291 +1,320 @@ # Ukrainian translations for SolveSpace package. # Copyright (C) 2017 the SolveSpace authors # This file is distributed under the same license as the SolveSpace package. -# AppSoft4 , 2017. +# app4soft , 2021. msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" -"PO-Revision-Date: 2017-01-05 10:30+0000\n" -"Last-Translator: appsoft@ua.fm\n" -"Language-Team: OpenOrienteeringUkraine\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"PO-Revision-Date: 2021-04-14 01:42+0300\n" +"Last-Translator: https://github.com/Symbian9\n" +"Language-Team: app4soft\n" "Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.4.2\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" "Activate one with Sketch -> In Workplane." msgstr "" +"Вирізання, вставка та копіювання працює лише у площині.\n" +"\n" +"Активуйте одну через Креслення -> У площині." -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." -msgstr "" +msgstr "Буфер обміну порожній; немає чого вставляти." -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." -msgstr "" +msgstr "Кількість копій для вставки має бути не менше одної." -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." -msgstr "" +msgstr "Масштаб не може бути нульовим." -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." -msgstr "" +msgstr "Оберіть одну точку для визначення центру обертання." -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." -msgstr "" +msgstr "Оберіть дві точки для визначення вектору розміщення." -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "" -#: clipboard.cpp:458 +#: clipboard.cpp:457 +#, fuzzy msgid "Too many items to paste; split this into smaller pastes." -msgstr "" +msgstr "Забагато об'єктів для вставки; рзділіть копіювання на кілька етапів." -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." -msgstr "" +msgstr "Немає активної площини." -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" -msgstr "" +msgstr "Некоректний формат: визначте координати X, Y, Z" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" -msgstr "" +msgstr "Некоректний формат: визначте колір як R, G, B" -#: confscreen.cpp:454 +#: confscreen.cpp:412 +#, fuzzy msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." msgstr "" +"Значення перспективи не матиме ефекту допоки не ввімкнено Вигляд -> " +"Використовувати Перспективну проєкцію." -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." -msgstr "" +msgstr "Визначте кількість десяткових знаків від 0 до %d." -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" -msgstr "" +msgstr "Масштаб експорту не може бути нульовим!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" -msgstr "" +msgstr "Радіус відступу різання не може бути від'ємним!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" -msgstr "" +msgstr "Некоректне значення: інтервал автозбереження має бути додатнім" -#: confscreen.cpp:558 +#: confscreen.cpp:521 +#, fuzzy msgid "Bad format: specify interval in integral minutes" -msgstr "" +msgstr "Некоректний формат: визначте цілим числом інтервал у хвилинах" #: constraint.cpp:12 msgctxt "constr-name" msgid "pts-coincident" -msgstr "" +msgstr "співпадіння-тчк" #: constraint.cpp:13 msgctxt "constr-name" msgid "pt-pt-distance" -msgstr "" +msgstr "відстань-тчк-тчк" #: constraint.cpp:14 msgctxt "constr-name" msgid "pt-line-distance" -msgstr "" +msgstr "відстань-тчк-лінія" #: constraint.cpp:15 msgctxt "constr-name" msgid "pt-plane-distance" -msgstr "" +msgstr "відстань-тчк-площина" #: constraint.cpp:16 msgctxt "constr-name" msgid "pt-face-distance" -msgstr "" +msgstr "відстань-тчк-грань" #: constraint.cpp:17 msgctxt "constr-name" msgid "proj-pt-pt-distance" -msgstr "" +msgstr "проєційна-відстань-тчк-тчк" #: constraint.cpp:18 msgctxt "constr-name" msgid "pt-in-plane" -msgstr "" +msgstr "тчк-у-площині" #: constraint.cpp:19 msgctxt "constr-name" msgid "pt-on-line" -msgstr "" +msgstr "тчк-на-лінії" #: constraint.cpp:20 msgctxt "constr-name" msgid "pt-on-face" -msgstr "" +msgstr "тчк-на-грані" #: constraint.cpp:21 msgctxt "constr-name" msgid "eq-length" -msgstr "" +msgstr "рівні-довжини" #: constraint.cpp:22 msgctxt "constr-name" msgid "eq-length-and-pt-ln-dist" -msgstr "" +msgstr "рівні-довжина-відстань-тчк-лінія" #: constraint.cpp:23 msgctxt "constr-name" msgid "eq-pt-line-distances" -msgstr "" +msgstr "рівна-відстань-тчк-лінія" #: constraint.cpp:24 msgctxt "constr-name" msgid "length-ratio" -msgstr "" +msgstr "пропорція-довжин" #: constraint.cpp:25 msgctxt "constr-name" -msgid "length-difference" +msgid "arc-arc-length-ratio" msgstr "" #: constraint.cpp:26 msgctxt "constr-name" -msgid "symmetric" +msgid "arc-line-length-ratio" msgstr "" #: constraint.cpp:27 msgctxt "constr-name" -msgid "symmetric-h" -msgstr "" +msgid "length-difference" +msgstr "різниця-довжин" #: constraint.cpp:28 msgctxt "constr-name" -msgid "symmetric-v" +msgid "arc-arc-len-difference" msgstr "" #: constraint.cpp:29 msgctxt "constr-name" -msgid "symmetric-line" +msgid "arc-line-len-difference" msgstr "" #: constraint.cpp:30 msgctxt "constr-name" -msgid "at-midpoint" -msgstr "" +msgid "symmetric" +msgstr "симетрія" #: constraint.cpp:31 msgctxt "constr-name" -msgid "horizontal" -msgstr "" +msgid "symmetric-h" +msgstr "симетрія-вертикально" #: constraint.cpp:32 msgctxt "constr-name" -msgid "vertical" -msgstr "" +msgid "symmetric-v" +msgstr "симетрія-горизонтально" #: constraint.cpp:33 msgctxt "constr-name" -msgid "diameter" -msgstr "" +msgid "symmetric-line" +msgstr "симетрія-відносно-лінії" #: constraint.cpp:34 msgctxt "constr-name" -msgid "pt-on-circle" -msgstr "" +msgid "at-midpoint" +msgstr "на-середині" #: constraint.cpp:35 msgctxt "constr-name" -msgid "same-orientation" -msgstr "" +msgid "horizontal" +msgstr "горизонталь" #: constraint.cpp:36 msgctxt "constr-name" -msgid "angle" -msgstr "" +msgid "vertical" +msgstr "вертикаль" #: constraint.cpp:37 msgctxt "constr-name" -msgid "parallel" -msgstr "" +msgid "diameter" +msgstr "діаметр" #: constraint.cpp:38 msgctxt "constr-name" -msgid "arc-line-tangent" -msgstr "" +msgid "pt-on-circle" +msgstr "тчк-на-колі" #: constraint.cpp:39 msgctxt "constr-name" -msgid "cubic-line-tangent" -msgstr "" +msgid "same-orientation" +msgstr "співнаправленість" #: constraint.cpp:40 msgctxt "constr-name" -msgid "curve-curve-tangent" -msgstr "" +msgid "angle" +msgstr "кут" #: constraint.cpp:41 msgctxt "constr-name" -msgid "perpendicular" -msgstr "" +msgid "parallel" +msgstr "паралель" #: constraint.cpp:42 msgctxt "constr-name" -msgid "eq-radius" -msgstr "" +msgid "arc-line-tangent" +msgstr "дотичні-дуга-лінія" #: constraint.cpp:43 msgctxt "constr-name" -msgid "eq-angle" -msgstr "" +msgid "cubic-line-tangent" +msgstr "дотичні-сплайн-лінія" #: constraint.cpp:44 msgctxt "constr-name" -msgid "eq-line-len-arc-len" -msgstr "" +msgid "curve-curve-tangent" +msgstr "дотичні-крива-крива" #: constraint.cpp:45 msgctxt "constr-name" -msgid "lock-where-dragged" -msgstr "" +msgid "perpendicular" +msgstr "перпендикуляр" #: constraint.cpp:46 msgctxt "constr-name" -msgid "comment" -msgstr "" +msgid "eq-radius" +msgstr "рівнозначні-радіуси" -#: constraint.cpp:140 +#: constraint.cpp:47 +msgctxt "constr-name" +msgid "eq-angle" +msgstr "рівнозначні-кути" + +#: constraint.cpp:48 +msgctxt "constr-name" +msgid "eq-line-len-arc-len" +msgstr "рівнозначні-лінія-дуга" + +#: constraint.cpp:49 +msgctxt "constr-name" +msgid "lock-where-dragged" +msgstr "фіксоване-положення" + +#: constraint.cpp:50 +msgctxt "constr-name" +msgid "comment" +msgstr "коментар" + +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." msgstr "" -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." msgstr "" -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." msgstr "" -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -299,7 +328,7 @@ msgid "" " * a circle or an arc (diameter)\n" msgstr "" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -311,7 +340,7 @@ msgid "" " * a point and a plane face (point on face)\n" msgstr "" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -327,22 +356,26 @@ msgid "" " * a line segment and an arc (line segment length equals arc length)\n" msgstr "" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -350,7 +383,7 @@ msgid "" " * a line segment and a workplane (line's midpoint on plane)\n" msgstr "" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -362,19 +395,19 @@ msgid "" "workplane)\n" msgstr "" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." msgstr "" -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." msgstr "" -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -383,7 +416,7 @@ msgid "" " * a line segment\n" msgstr "" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -391,15 +424,16 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:614 +#: constraint.cpp:663 +#, fuzzy msgid "Must select an angle constraint." -msgstr "" +msgstr "Необхідно обрати кут." -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." -msgstr "" +msgstr "Необхідно обрати обмежувач з відповідною міткою." -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -408,11 +442,11 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "" -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -423,7 +457,7 @@ msgid "" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -432,7 +466,7 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -440,15 +474,22 @@ msgid "" " * a point\n" msgstr "" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "КОМЕНТАР -- ДВІЧІ КЛІКНІТЬ ДЛЯ РЕДАГУВАННЯ" + +#: constraint.cpp:818 msgid "click center of comment text" -msgstr "" +msgstr "клікніть в місце де буде центр коментаря" #: export.cpp:19 msgid "" "No solid model present; draw one with extrudes and revolves, or use Export " "2d View to export bare lines and curves." msgstr "" +"Вісутня об'ємна модель; створіть одну з допомогою екструдування та " +"виточування або скористайтеся функцією \"Експортувати 2D Вигляд\" для " +"еспорту лише ліній та кривих." #: export.cpp:61 msgid "" @@ -460,58 +501,64 @@ msgid "" "lines)\n" msgstr "" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." -msgstr "" +msgstr "Активна група не містить меш; немає чого експортувати." -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" +"Деякі аспекти креслення на мають відповідників у форматі DXF і не будуть " +"експортовані:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" +"Розмір аркуша у PDF перевищує 200×200 дюймів; багато переглядачів можуть не " +"підтримувати цей файл." #: file.cpp:44 group.cpp:91 msgctxt "group-name" msgid "sketch-in-plane" -msgstr "" +msgstr "креслення-в-площині" #: file.cpp:62 msgctxt "group-name" msgid "#references" -msgstr "" +msgstr "#базові-площини" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." -msgstr "" +msgstr "Файл порожній. Він може бути пошкодженим." -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." msgstr "" +"Нерозпізнані дані у файлі. Цей файл може бути пошкодженим або збереженим " +"новою версією програми." #: file.cpp:867 msgctxt "title" msgid "Missing File" -msgstr "" +msgstr "Втрачений Файл" #: file.cpp:868 #, c-format msgctxt "dialog" msgid "The linked file “%s” is not present." -msgstr "" +msgstr "Приєднаний файл “%s” відсутній." #: file.cpp:870 msgctxt "dialog" @@ -525,17 +572,17 @@ msgstr "" #: file.cpp:873 msgctxt "button" msgid "&Yes" -msgstr "" +msgstr "&Так" #: file.cpp:875 msgctxt "button" msgid "&No" -msgstr "" +msgstr "&Ні" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" -msgstr "" +msgstr "&Відмінити" #: graphicswin.cpp:41 msgid "&File" @@ -567,15 +614,15 @@ msgstr "Експортувати &Зображення..." #: graphicswin.cpp:49 msgid "Export 2d &View..." -msgstr "Експортувати 2d &Вигляд..." +msgstr "Експортувати 2D &Вигляд..." #: graphicswin.cpp:50 msgid "Export 2d &Section..." -msgstr "Експортувати 2d &Секцію..." +msgstr "Експортувати 2D &Секцію..." #: graphicswin.cpp:51 msgid "Export 3d &Wireframe..." -msgstr "Експортувати 3d &Скелет..." +msgstr "Експортувати 3D &Скелет..." #: graphicswin.cpp:52 msgid "Export Triangle &Mesh..." @@ -635,7 +682,7 @@ msgstr "Вставити &Трансфмованим..." #: graphicswin.cpp:72 msgid "&Delete" -msgstr "&Delete" +msgstr "&Видалити" #: graphicswin.cpp:74 msgid "Select &Edge Chain" @@ -651,19 +698,19 @@ msgstr "&Зняти Виділення з Усього" #: graphicswin.cpp:78 msgid "&Line Styles..." -msgstr "" +msgstr "Стилі &Ліній..." #: graphicswin.cpp:79 msgid "&View Projection..." -msgstr "" +msgstr "&Проекція Відображення..." #: graphicswin.cpp:81 msgid "Con&figuration..." -msgstr "" +msgstr "&Налаштування..." #: graphicswin.cpp:84 msgid "&View" -msgstr "&View" +msgstr "&Відображення" #: graphicswin.cpp:85 msgid "Zoom &In" @@ -691,7 +738,7 @@ msgstr "Найближчий &Ізометричний Вигляд" #: graphicswin.cpp:92 msgid "&Center View At Point" -msgstr "&Центрувати Вигляд На Точці" +msgstr "&Центрувати Вигляд на Точці" #: graphicswin.cpp:94 msgid "Show Snap &Grid" @@ -699,302 +746,310 @@ msgstr "Показати &Сітку Прикріплення" #: graphicswin.cpp:95 msgid "Darken Inactive Solids" -msgstr "" +msgstr "Затінювати Неактивні Тіла" #: graphicswin.cpp:96 msgid "Use &Perspective Projection" msgstr "Використовувати &Перспективну Проекцію" #: graphicswin.cpp:97 -msgid "Dimension &Units" +msgid "Show E&xploded View" msgstr "" #: graphicswin.cpp:98 -msgid "Dimensions in &Millimeters" -msgstr "Розміри в &Міліметрах" +msgid "Dimension &Units" +msgstr "Розмірні &Одиниці" #: graphicswin.cpp:99 -msgid "Dimensions in M&eters" -msgstr "" +msgid "Dimensions in &Millimeters" +msgstr "Розміри у &Міліметрах" #: graphicswin.cpp:100 +msgid "Dimensions in M&eters" +msgstr "Розміри у &Метрах" + +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" -msgstr "Розміри в &Дюймах" +msgstr "Розміри у &Дюймах" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "Показати Панель &Інструментів" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "Показати Вікно Власти&востей" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "&Повний Екран" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "&Нова Група" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" -msgstr "Креслення В &3d" - -#: graphicswin.cpp:109 -msgid "Sketch In New &Workplane" -msgstr "Креслення В Новій Робочій &Площині" +msgstr "Креслення у &3D" #: graphicswin.cpp:111 +msgid "Sketch In New &Workplane" +msgstr "Креслення у Новій &Площині" + +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "Покрокове &Переміщення" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "Покрокове &Обертання" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "Ви&давити" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" -msgstr "" +msgstr "&Спіраль" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "&Виточити" -#: graphicswin.cpp:117 -msgid "Re&volve" -msgstr "" - #: graphicswin.cpp:119 -msgid "Link / Assemble..." -msgstr "Приєднати / Монтувати..." +msgid "Re&volve" +msgstr "&Обертати" -#: graphicswin.cpp:120 -msgid "Link Recent" -msgstr "Приєднати Недавні" +#: graphicswin.cpp:121 +msgid "Link / Assemble..." +msgstr "Приєднати / Зібрати..." #: graphicswin.cpp:122 +msgid "Link Recent" +msgstr "Приєднати Нещодавні" + +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "&Креслення" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" -msgstr "В Робочій &Площині" - -#: graphicswin.cpp:124 -msgid "Anywhere In &3d" -msgstr "Будь-де В &3d" +msgstr "У Робочій &Площині" #: graphicswin.cpp:126 +msgid "Anywhere In &3d" +msgstr "Будь-де в &3D" + +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "Опорна &Точка" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "Робоча &Площина" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "&Відрізок Прямої" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "Контсрук&ційний Відрізок Прямої" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "&Прямокутник" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "&Коло" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "&Дуга Кола" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "Кубічний Сплайн &Без'є" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" -msgstr "&Текст з TrueType Шрифтом" - -#: graphicswin.cpp:137 -msgid "&Image" -msgstr "" +msgstr "&Текст із TrueType Шрифтом" #: graphicswin.cpp:139 +msgid "&Image" +msgstr "&Зображення" + +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "Пере&мкнути Конструктивність" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "Дотична &Дуга на Точці" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "Розрізати Криві на &Перетині" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "&Обмежити" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "&Відстань / Діаметр" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "Від&носний Розмір" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "К&ут" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "Відносний К&ут" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "Інший Су&міжний Кут" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "Перемкнути Від&носність Розмірів" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "&Горизонтально" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "&Вертикально" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "&На точці / Кривій / Площині" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "Рі&вні Довжина / Радіус / Кут" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "Про&порція Довжин" - -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "Рі&зниця Довжин" - #: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" + +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" + +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "До &Середини" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "Си&метрично" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "Пара&лельно / Дотична" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "&Препендикулярно" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "Однакова Орієн&тація" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "Фіксувати Точку Після &Переміщення" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "Коментар" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "&Аналізувати" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "Обрахувати &Об'єм" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "Обрахувати Пл&ощу" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "Обрахувати &Периметр" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "Показати &Дотичні Частини" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "Показати &Приховані Ребра" -#: graphicswin.cpp:173 -msgid "Show &Center of Mass" -msgstr "" - #: graphicswin.cpp:175 -msgid "Show &Underconstrained Points" -msgstr "" +msgid "Show &Center of Mass" +msgstr "Показати &Центр Масс" #: graphicswin.cpp:177 +msgid "Show &Underconstrained Points" +msgstr "Показати &Надмірно Обмежені Точки" + +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "&Трасувати Точку" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "&Зупити Трасування..." -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "Прорахувати &Розмір..." -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "&Довідка" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "&Мова" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "&Вебсайт / Посібник" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "&Про програму" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" -msgstr "" +msgstr "(нємає нещодавніх файлів)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." -msgstr "" +msgstr "Файл '%s' відсутній." -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." -msgstr "" +msgstr "Відсутня активна площина - сітка не відображатиметься." -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1003,91 +1058,91 @@ msgid "" "configuration screen. A value around 0.3 is typical." msgstr "" -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." msgstr "" -#: graphicswin.cpp:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." msgstr "" -#: graphicswin.cpp:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." msgstr "" -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" -msgstr "" +msgstr "клікніть для встановлення вихідної точки" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" -msgstr "" +msgstr "клікніть першу точку прямої лінії" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" -msgstr "" - -#: graphicswin.cpp:1287 -msgid "click first point of cubic segment" -msgstr "" - -#: graphicswin.cpp:1288 -msgid "click center of circle" -msgstr "" - -#: graphicswin.cpp:1289 -msgid "click origin of workplane" -msgstr "" - -#: graphicswin.cpp:1290 -msgid "click one corner of rectangle" -msgstr "" - -#: graphicswin.cpp:1291 -msgid "click top left of text" -msgstr "" - -#: graphicswin.cpp:1297 -msgid "click top left of image" -msgstr "" +msgstr "клікніть першу точку конструктивної прямої лінії" #: graphicswin.cpp:1309 +msgid "click first point of cubic segment" +msgstr "клікніть першу точку кривої" + +#: graphicswin.cpp:1310 +msgid "click center of circle" +msgstr "клікніть в місце де буде центр коментаря" + +#: graphicswin.cpp:1311 +msgid "click origin of workplane" +msgstr "клікніть в центр відліку площини" + +#: graphicswin.cpp:1312 +msgid "click one corner of rectangle" +msgstr "клікніть для встановлення першого кута прямокутника" + +#: graphicswin.cpp:1313 +msgid "click top left of text" +msgstr "клікніть для встановлення верхньої лівої межі тексту" + +#: graphicswin.cpp:1319 +msgid "click top left of image" +msgstr "клікніть для встановлення верхньої лівої межі зображення" + +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1096,34 +1151,37 @@ msgstr "" #: group.cpp:86 msgctxt "group-name" msgid "sketch-in-3d" -msgstr "" +msgstr "ескіз-в-3D" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." msgstr "" +"Активуйте робочу площину ( Ескіз -> У Площині) перед екструдуванням. Ескіз " +"буде екструдовано перпендикулярно до робочої площини." -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" -msgstr "" +msgstr "видавлювання" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "" -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1132,16 +1190,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" -msgstr "" +msgstr "проточування" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "" -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1150,16 +1208,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" -msgstr "" +msgstr "прокручування" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." -msgstr "" +msgstr "Спіраль може бути створена лише на основі площинного ескізу." -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1168,12 +1226,12 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" -msgstr "" +msgstr "спіраль" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1183,436 +1241,447 @@ msgid "" "point, and parallel to line / normal)\n" msgstr "" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" -msgstr "" +msgstr "крутіння" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" -msgstr "" +msgstr "перекладання" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" -msgstr "" +msgstr "(безіменне)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" -msgstr "" +msgstr "не замкнений контур або не все в єдиному стилі!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" -msgstr "" +msgstr "контур самоперетинається!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" -msgstr "" +msgstr "ребро нульової довжини!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." msgstr "" -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." msgstr "" -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" -#: modify.cpp:624 +#: modify.cpp:622 +#, fuzzy msgid "Must be sketching in workplane to split." -msgstr "" +msgstr "Має бути накреслений у робочій площині для розділеня." -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." -msgstr "" +msgstr "Неможливо розділити; відсутній перетин." -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "Встановити Стиль" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "Без Стилю" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "Створити Користувацький Стиль..." -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "Параметри Групи" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "Параметри Стилю" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "Виділити Ланцюг Ребер" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "Перемкнути Відносність Розміру" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "Інший Суміжний Кут" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "Прикріпити до Сітки" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "Видалити Точку Сплайну" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "Додати Точку Сплайну" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "" +"Неможливо додати точку сплайна: перевищено максимальну кількість точок." -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "Пермкнути Конструктивність" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "Роз'єднати З'єднання Точок" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "Вирізати" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "Копіювати" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "Виділити Усе" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "Вставити" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "Вставити Трансформованим..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "Видалити" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "Зняти Виділення з Усього" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "Зняти Виділення з Наведеного" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "Умістити на Екрані" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" -msgstr "" +msgstr "клікніть наступну точку лінії або натисніть Esc" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" -msgstr "" +msgstr "клікніть для встановлення іншого кута прямокутника" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" -msgstr "" +msgstr "клікніть для визначення радіусу" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" -msgstr "" +msgstr "клікніть для встановлення точки" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" -msgstr "" +msgstr "клікніть наступну точку кривої або натисніть Esc" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" -msgstr "" +msgstr "клікніть для встановлення нижньої правої межі тексту" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "" -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" +msgstr "SolveSpace модель" + +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" msgstr "" -#: platform/gui.cpp:90 +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" +msgstr "IDF друкована плата" + +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" msgstr "" -#: platform/gui.cpp:94 +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" -msgstr "" - -#: platform/gui.cpp:98 -msgctxt "file-type" -msgid "STL mesh" -msgstr "" - -#: platform/gui.cpp:99 -msgctxt "file-type" -msgid "Wavefront OBJ mesh" -msgstr "" +msgstr "PNG зображення" #: platform/gui.cpp:100 msgctxt "file-type" -msgid "Three.js-compatible mesh, with viewer" -msgstr "" +msgid "STL mesh" +msgstr "STL меш" #: platform/gui.cpp:101 msgctxt "file-type" -msgid "Three.js-compatible mesh, mesh only" -msgstr "" +msgid "Wavefront OBJ mesh" +msgstr "Wavefront OBJ меш" #: platform/gui.cpp:102 msgctxt "file-type" -msgid "VRML text file" -msgstr "" +msgid "Three.js-compatible mesh, with viewer" +msgstr "Three.js-сумісний меш, з переглядачем" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:103 +msgctxt "file-type" +msgid "Three.js-compatible mesh, mesh only" +msgstr "Three.js-сумісний меш, лише меш" + +#: platform/gui.cpp:104 +msgctxt "file-type" +msgid "VRML text file" +msgstr "VRML меш, текстовий формат" + +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" -msgstr "" - -#: platform/gui.cpp:110 -msgctxt "file-type" -msgid "PDF file" -msgstr "" - -#: platform/gui.cpp:111 -msgctxt "file-type" -msgid "Encapsulated PostScript" -msgstr "" +msgstr "STEP файл" #: platform/gui.cpp:112 msgctxt "file-type" -msgid "Scalable Vector Graphics" -msgstr "" +msgid "PDF file" +msgstr "PDF файл" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:113 +msgctxt "file-type" +msgid "Encapsulated PostScript" +msgstr "Encapsulated PostScript" + +#: platform/gui.cpp:114 +msgctxt "file-type" +msgid "Scalable Vector Graphics" +msgstr "Scalable Vector Graphics, векторний формат" + +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" -msgstr "" +msgstr "DXF файл (AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" -msgstr "" +msgstr "HPGL файл" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" -msgstr "" +msgstr "G Code" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" -msgstr "" +msgstr "AutoCAD DXF та DWG файли" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" -msgstr "" +msgstr "Comma-separated values" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" -msgstr "" +msgstr "без імені" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" -msgstr "" +msgstr "Зберегти Файл" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" -msgstr "" +msgstr "Відкрити Файл" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" -msgstr "" +msgstr "_Скасувати" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" -msgstr "" +msgstr "_Зберегти" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" -msgstr "" - -#: solvespace.cpp:169 -msgctxt "title" -msgid "Autosave Available" -msgstr "" +msgstr "_Відкрити" #: solvespace.cpp:170 -msgctxt "dialog" -msgid "An autosave file is available for this sketch." -msgstr "" +msgctxt "title" +msgid "Autosave Available" +msgstr "Наявні автозбереження" #: solvespace.cpp:171 msgctxt "dialog" -msgid "Do you want to load the autosave file instead?" -msgstr "" +msgid "An autosave file is available for this sketch." +msgstr "Наявні автозбереження для цього креслення." #: solvespace.cpp:172 +msgctxt "dialog" +msgid "Do you want to load the autosave file instead?" +msgstr "Завантажити файл автозбереження?" + +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" -msgstr "" +msgstr "&Завантажити автозбереження" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" -msgstr "" +msgstr "&Не Завантажувати" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" -msgstr "" +msgstr "Файл Змінено" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" -msgstr "" +msgstr "Чи хочете ви зберегти зміни зроблені вами у ескізі “%s”?" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" -msgstr "" +msgstr "Чи хочете ви зберегти зміни зроблені вами у новому ескізі?" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." -msgstr "" +msgstr "Ваші зміни буде втрачено якщо ви не збережете їх." -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" -msgstr "" +msgstr "&Зберегти" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" -msgstr "" +msgstr "&Не Зберігати" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" -msgstr "" +msgstr "(нове креслення)" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" -msgstr "" +msgstr "Браузер Властивостей" -#: solvespace.cpp:658 +#: solvespace.cpp:699 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " "the text window." msgstr "" -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." -msgstr "" +msgstr "Обмежувач має містити мітку і бути не відносним розміром." -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." -msgstr "" +msgstr "Поганий вибір для крокової зміни розміру; оберіть обмежувач." -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" "\n" " %s" msgstr "" +"Об'єм твердого тіла становить:\n" +"\n" +" %s" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1620,8 +1689,12 @@ msgid "" "\n" " %s" msgstr "" +"\n" +"Об'єм поточної групи мешу становить:\n" +"\n" +" %s" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1629,7 +1702,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1640,13 +1713,15 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" +"Ця група не місить коректно сформованого замкненої 2D площини. Вона " +"відкрита, не компланарна, або ж самоперетинається." -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1656,8 +1731,14 @@ msgid "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." msgstr "" +"Площа заповнення ескізу у цій групі становить:\n" +"\n" +" %s\n" +"\n" +"Криві наближено до ламаних ліній.\n" +"Це вносить похибку, зазвичай близько 1%%." -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1667,37 +1748,43 @@ msgid "" "Curves have been approximated as piecewise linear.\n" "This introduces error, typically of around 1%%." msgstr "" +"Загальна довжина обраних елементів становить:\n" +"\n" +" %s\n" +"\n" +"Криві наближено до ламаних ліній.\n" +"Це вносить похибку, зазвичай близько 1%%." -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." -msgstr "" +msgstr "Поганий вибір для периметру; оберіть відрізки, дуги та криві." -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." -msgstr "" +msgstr "Поганий вибір для вістежування шляху; оберіть одну точку." -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" -msgstr "" +msgstr "Неможливо записати у '%s'" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." -msgstr "" +msgstr "Меш самоперетинається (НЕ добре, недійсний)." -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." -msgstr "" +msgstr "Меш самоперетинається (добре, дійсний)." -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." -msgstr "" +msgstr "Меш містить оголені ребра (НЕ добре, недійсний)." -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." -msgstr "" +msgstr "Меш водонепроникний (добре, дійсний)." -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1705,7 +1792,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1714,8 +1801,13 @@ msgid "" "\n" "Zero problematic edges, good.%s" msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"Відсутні проблемні ребра, добре.%s" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1724,8 +1816,13 @@ msgid "" "\n" "%d problematic edges, bad.%s" msgstr "" +"%s\n" +"\n" +"%s\n" +"\n" +"%d проблемних ребер, погано.%s" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1741,36 +1838,50 @@ msgid "" "\n" "© 2008-%d Jonathan Westhues and other authors.\n" msgstr "" +"Це SolveSpace версії %s.\n" +"\n" +"Більше інформації на сайті http://solvespace.com/\n" +"\n" +"SolveSpace є вільною програмою: ви можете модифікувати\n" +"та/або розповсюджувати її відповідно до ліцензії GNU\n" +"General Public License (GPL) версії 3 чи новішої.\n" +"\n" +"ВІЧСУТНІ БУДЬ-ЯКІ ГАРАНТІЇ, в межах, доволених\n" +"законом. Деталі на сайті http://gnu.org/licenses/\n" +"\n" +"© 2008-%d Jonathan Westhues та інші автори.\n" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." msgstr "" +"Неможливо призначити стиль елементу який походить від іншого елемента; " +"спробуйте призначити стиль батьківському елементу." -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" -msgstr "" +msgstr "Стиль не може містити порожнє ім'я" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." -msgstr "" +msgstr "Не можливо повторити менше 1 разу." -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." -msgstr "" +msgstr "Не можливо повторити понад 999 разів." -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" -msgstr "" +msgstr "Група не може містити порожнє ім'я" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." -msgstr "" +msgstr "Непрозорість має бути між 0 та 1." -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." -msgstr "" +msgstr "Радіус не може бути нульовим чи від'ємним." #: toolbar.cpp:18 msgid "Sketch line segment" @@ -1794,7 +1905,7 @@ msgstr "Накреслити криві з тексту на TrueType шрифт #: toolbar.cpp:28 msgid "Sketch image from a file" -msgstr "" +msgstr "Вставити зображення з файлу" #: toolbar.cpp:30 msgid "Create tangent arc at selected point" @@ -1866,19 +1977,19 @@ msgstr "Перемкнути відносність розміру" #: toolbar.cpp:68 msgid "New group extruding active sketch" -msgstr "Нова група екструдування активного креслення" +msgstr "Нова група екструдування активного ескізу" #: toolbar.cpp:70 msgid "New group rotating active sketch" -msgstr "Нова група обертання актиного креслення" +msgstr "Нова група обертання актиного ескізу" #: toolbar.cpp:72 msgid "New group helix from active sketch" -msgstr "" +msgstr "Нова група спіралі з активного ескізу" #: toolbar.cpp:74 msgid "New group revolve active sketch" -msgstr "" +msgstr "Нова група обертання активного ескізу" #: toolbar.cpp:76 msgid "New group step and repeat rotating" @@ -1894,7 +2005,7 @@ msgstr "Нова група в новій площині (через обран #: toolbar.cpp:82 msgid "New group in 3d" -msgstr "Нова група в 3d" +msgstr "Нова група в 3D" #: toolbar.cpp:84 msgid "New group linking / assembling file" @@ -1911,25 +2022,31 @@ msgstr "Вирівняти вигляд до активної робочої п #: util.cpp:165 msgctxt "title" msgid "Error" -msgstr "" +msgstr "Помилка" #: util.cpp:165 msgctxt "title" msgid "Message" -msgstr "" +msgstr "Повідомлення" #: util.cpp:170 msgctxt "button" msgid "&OK" -msgstr "" +msgstr "&OK" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." -msgstr "" +msgstr "Масштаб не може бути нульовим чи від'ємним." -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" -msgstr "" +msgstr "Некоректний формат: визначте X, Y, Z" + +#~ msgid "Length Ra&tio" +#~ msgstr "Про&порція Довжин" + +#~ msgid "Length Diff&erence" +#~ msgstr "Рі&зниця Довжин" #~ msgid "Show Degrees of &Freedom" #~ msgstr "Показати Степені &Свободи" diff --git a/res/locales/zh_CN.po b/res/locales/zh_CN.po index 1c2ce7f6..7768124e 100644 --- a/res/locales/zh_CN.po +++ b/res/locales/zh_CN.po @@ -2,22 +2,22 @@ # Copyright (C) 2020 the PACKAGE authors # This file is distributed under the same license as the SolveSpace package. # , 2020. -# +# msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" -"PO-Revision-Date: 2020-09-28 12:42+0800\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" +"PO-Revision-Date: 2021-04-03 13:10-0400\n" "Last-Translator: lomatus@163.com\n" "Language-Team: none\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.1\n" +"X-Generator: Poedit 2.4.2\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" @@ -27,72 +27,72 @@ msgstr "" "\n" "使用\"工作平面中的草图 -+\"激活一个。" -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "剪贴板为空;没有要粘贴的内容。" -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "要粘贴的副本数必须至少为 1 个。" -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "缩放不能为零。" -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "选择一个点以定义旋转原点。" -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "选择两个点来定义转换向量。" -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "" "Transformation is identity. So all copies will be exactly on top of each " "other." msgstr "转换就是标识,因此所有的复制在彼此之上。" -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "要粘贴的项目太多; 请把他们拆分。" -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "没有工作平面处于活动状态。" -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "格式错误:将坐标指定为 x、y、z" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "格式错误:将颜色指定为 r、g、b" -#: confscreen.cpp:454 +#: confscreen.cpp:412 msgid "" "The perspective factor will have no effect until you enable View -> Use " "Perspective Projection." msgstr "在启用\"视图 -= 使用透视投影\"之前,透视因子将不起作用。" -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "在十进制之后指定 0 和 %d 数字之间。" -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "输出比例不能为零!" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "刀具半径偏移不能为负数!" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "坏值:自动保存间隔应为正" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "格式错误:以整数分钟为单位指定间隔" @@ -163,134 +163,154 @@ msgstr "长度比率" #: constraint.cpp:25 msgctxt "constr-name" +msgid "arc-arc-length-ratio" +msgstr "" + +#: constraint.cpp:26 +msgctxt "constr-name" +msgid "arc-line-length-ratio" +msgstr "" + +#: constraint.cpp:27 +msgctxt "constr-name" msgid "length-difference" msgstr "长度不同" -#: constraint.cpp:26 +#: constraint.cpp:28 +msgctxt "constr-name" +msgid "arc-arc-len-difference" +msgstr "" + +#: constraint.cpp:29 +msgctxt "constr-name" +msgid "arc-line-len-difference" +msgstr "" + +#: constraint.cpp:30 msgctxt "constr-name" msgid "symmetric" msgstr "对称的" -#: constraint.cpp:27 +#: constraint.cpp:31 msgctxt "constr-name" msgid "symmetric-h" msgstr "水平对称" -#: constraint.cpp:28 +#: constraint.cpp:32 msgctxt "constr-name" msgid "symmetric-v" msgstr "纵向对称" -#: constraint.cpp:29 +#: constraint.cpp:33 msgctxt "constr-name" msgid "symmetric-line" msgstr "线对称" -#: constraint.cpp:30 +#: constraint.cpp:34 msgctxt "constr-name" msgid "at-midpoint" msgstr "在中点" -#: constraint.cpp:31 +#: constraint.cpp:35 msgctxt "constr-name" msgid "horizontal" msgstr "水平约束" -#: constraint.cpp:32 +#: constraint.cpp:36 msgctxt "constr-name" msgid "vertical" msgstr "垂直约束" -#: constraint.cpp:33 +#: constraint.cpp:37 msgctxt "constr-name" msgid "diameter" msgstr "直径约束" -#: constraint.cpp:34 +#: constraint.cpp:38 msgctxt "constr-name" msgid "pt-on-circle" msgstr "圆点约束" -#: constraint.cpp:35 +#: constraint.cpp:39 msgctxt "constr-name" msgid "same-orientation" msgstr "相同原点" -#: constraint.cpp:36 +#: constraint.cpp:40 msgctxt "constr-name" msgid "angle" msgstr "角度约束" -#: constraint.cpp:37 +#: constraint.cpp:41 msgctxt "constr-name" msgid "parallel" msgstr "平行约束" -#: constraint.cpp:38 +#: constraint.cpp:42 msgctxt "constr-name" msgid "arc-line-tangent" msgstr "弧切线" -#: constraint.cpp:39 +#: constraint.cpp:43 msgctxt "constr-name" msgid "cubic-line-tangent" msgstr "立方体切线" -#: constraint.cpp:40 +#: constraint.cpp:44 msgctxt "constr-name" msgid "curve-curve-tangent" msgstr "曲线间切线" -#: constraint.cpp:41 +#: constraint.cpp:45 msgctxt "constr-name" msgid "perpendicular" msgstr "垂直约束" -#: constraint.cpp:42 +#: constraint.cpp:46 msgctxt "constr-name" msgid "eq-radius" msgstr "等于半径" -#: constraint.cpp:43 +#: constraint.cpp:47 msgctxt "constr-name" msgid "eq-angle" msgstr "等于角度" -#: constraint.cpp:44 +#: constraint.cpp:48 msgctxt "constr-name" msgid "eq-line-len-arc-len" msgstr "等于线长或弧长" -#: constraint.cpp:45 +#: constraint.cpp:49 msgctxt "constr-name" msgid "lock-where-dragged" msgstr "锁定位置" -#: constraint.cpp:46 +#: constraint.cpp:50 msgctxt "constr-name" msgid "comment" msgstr "备注" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with " "Constrain -> On Point before constraining tangent." msgstr "切线弧和线段必须共享一个端点。在约束切线之前,使用约束 -= 点约束它们。" -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them " "with Constrain -> On Point before constraining tangent." msgstr "" "切线立方段和线段必须共享终结点。在约束切线之前,使用约束 -= 点约束它们。" -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point " "before constraining tangent." msgstr "曲线必须共享一个终结点。在约束切线之前,使用约束 -= 点约束它们。" -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply " "to:\n" @@ -313,7 +333,7 @@ msgstr "" " * 平面面和点(最小距离)\n" " * 圆或弧(直径)\n" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can " "apply to:\n" @@ -332,7 +352,7 @@ msgstr "" " * 一个点和一个圆或圆(曲线上的点)\n" " * 点和平面面(点在脸上)\n" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can " "apply to:\n" @@ -358,28 +378,26 @@ msgstr "" " * 两个圆或圆(相等半径)\n" " * 线段和圆弧(线段长度等于弧长)\n" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"长度比率约束的选择错误。此约束可应用于:\n" -"\n" -"* 两个线段\n" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply " "to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -"长度差异约束的选择错误。此约束可应用于:\n" -"\n" -"* 两个线段\n" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -391,7 +409,7 @@ msgstr "" "* 线段和点(点在中点)\n" " * 线段和工作平面(平面上的线中点)\n" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -408,19 +426,19 @@ msgstr "" " * 线段,和两个点或线段(对称的线段)\n" " * 工作平面和两个点或线段(工作平面对称)\n" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "" "A workplane must be active when constraining symmetric without an explicit " "symmetry plane." msgstr "在没有显式对称平面约束对称时,工作平面必须处于活动状态。" -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a " "horizontal or vertical constraint." msgstr "在应用水平或垂直约束之前,激活工作平面(使用草图 -= 在工作平面中)。" -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can " "apply to:\n" @@ -433,7 +451,7 @@ msgstr "" "• 两点\n" " • 线段\n" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply " "to:\n" @@ -444,15 +462,15 @@ msgstr "" "\n" "• 两个法线\n" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "必须选择角度约束。" -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "必须选择具有关联标签的约束。" -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -466,11 +484,11 @@ msgstr "" " * 线段和法线\n" " • 两个法线\n" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "曲线曲线切线必须应用于工作平面。" -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply " "to:\n" @@ -487,7 +505,7 @@ msgstr "" " * 两个法线(平行)\n" " * 共享端点的两条线段、弧线或贝塞尔(切线)\n" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -501,7 +519,7 @@ msgstr "" " * 线段和法线\n" " • 两个法线\n" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can " "apply to:\n" @@ -512,7 +530,11 @@ msgstr "" "\n" "• 一点\n" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "新备注 - 双击编辑" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "单击注释文本的中心" @@ -538,24 +560,24 @@ msgstr "" " * 脸(通过面的剖面)\n" " * 一个点和两个线段(平面穿过点和平行线)\n" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "活动组网格为空;没有要导出的。" -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "徒手线替换为连续线" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "锯齿线替换为连续线" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "" "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "绘图的某些方面没有 DXF 等效项,并且未导出:\n" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "" "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "PDF 页面大小超过 200 英寸或 200 英寸;许多查看器可能会拒绝此文件。" @@ -570,11 +592,11 @@ msgctxt "group-name" msgid "#references" msgstr "#参考" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "" -#: file.cpp:557 +#: file.cpp:555 msgid "" "Unrecognized data in file. This file may be corrupt, or from a newer version " "of the program." @@ -610,7 +632,7 @@ msgctxt "button" msgid "&No" msgstr "否(&N)" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "取消(&C)" @@ -784,295 +806,303 @@ msgid "Use &Perspective Projection" msgstr "使用远景透视(&P)" #: graphicswin.cpp:97 +msgid "Show E&xploded View" +msgstr "" + +#: graphicswin.cpp:98 msgid "Dimension &Units" msgstr "标注单位(&U)" -#: graphicswin.cpp:98 +#: graphicswin.cpp:99 msgid "Dimensions in &Millimeters" msgstr "标注单位 mm (&M)" -#: graphicswin.cpp:99 +#: graphicswin.cpp:100 msgid "Dimensions in M&eters" msgstr "标注单位m (&E)" -#: graphicswin.cpp:100 +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "标准单位英寸 (&I)" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "显示工具条(&T)" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "显示属性浏览器(&W)" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "全屏(&F)" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "新组合(&N)" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "在三维内绘制(&3)" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "在新工作面绘制(&W)" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "移动(&T)" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "旋转(&R)" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "挤出(&E)" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "螺旋(&H)" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "扫略(&L)" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "旋转(&V)" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "链接/装配..." -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "连接最近文件" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "绘图(&S)" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "在工作平面(&W)" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "在3D的任何位置(&3)" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "基准点(&P)" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "工作面(&W)" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "线段(&S)" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "构造线段(&C)" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "矩形(&R)" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "圆线(&C)" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "圆弧(&A)" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "立方体线的贝塞尔曲线(&B)" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "TrueTyoe字体文字(&T)" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "图片(&I)" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "切换构造(&G)" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "弧线切线点(&A)" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "在交叉处拆分曲线(&I)" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "约束(&C)" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "距离/直径(&D)" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "参考标注(&F)" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "角度(&A)" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "参考角度(&G)" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "其它增补角度(&U)" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "切换参考标注(&E)" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "水平约束(&H)" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "垂直约束(&V)" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "在点线面(&O)" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "等于/长度/半径/角度(&Q)" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "长度比例(&T)" - -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "长度偏差(&E)" - #: graphicswin.cpp:158 +msgid "Length / Arc Ra&tio" +msgstr "" + +#: graphicswin.cpp:159 +msgid "Length / Arc Diff&erence" +msgstr "" + +#: graphicswin.cpp:160 msgid "At &Midpoint" msgstr "在中点(&M)" -#: graphicswin.cpp:159 +#: graphicswin.cpp:161 msgid "S&ymmetric" msgstr "对称(&Y)" -#: graphicswin.cpp:160 +#: graphicswin.cpp:162 msgid "Para&llel / Tangent" msgstr "水平/切线(&L)" -#: graphicswin.cpp:161 +#: graphicswin.cpp:163 msgid "&Perpendicular" msgstr "垂直的(&P)" -#: graphicswin.cpp:162 +#: graphicswin.cpp:164 msgid "Same Orient&ation" msgstr "相同方向(&A)" -#: graphicswin.cpp:163 +#: graphicswin.cpp:165 msgid "Lock Point Where &Dragged" msgstr "锁定点位置(&D)" -#: graphicswin.cpp:165 +#: graphicswin.cpp:167 msgid "Comment" msgstr "备注" -#: graphicswin.cpp:167 +#: graphicswin.cpp:169 msgid "&Analyze" msgstr "分析(&A)" -#: graphicswin.cpp:168 +#: graphicswin.cpp:170 msgid "Measure &Volume" msgstr "测量体积(&V)" -#: graphicswin.cpp:169 +#: graphicswin.cpp:171 msgid "Measure A&rea" msgstr "测量面积(&R)" -#: graphicswin.cpp:170 +#: graphicswin.cpp:172 msgid "Measure &Perimeter" msgstr "测量周长(&P)" -#: graphicswin.cpp:171 +#: graphicswin.cpp:173 msgid "Show &Interfering Parts" msgstr "显示干涉零件(&I)" -#: graphicswin.cpp:172 +#: graphicswin.cpp:174 msgid "Show &Naked Edges" msgstr "显示孤立边(&N)" -#: graphicswin.cpp:173 +#: graphicswin.cpp:175 msgid "Show &Center of Mass" msgstr "显示中心(&C)" -#: graphicswin.cpp:175 +#: graphicswin.cpp:177 msgid "Show &Underconstrained Points" msgstr "显示无效约束点(&U)" -#: graphicswin.cpp:177 +#: graphicswin.cpp:179 msgid "&Trace Point" msgstr "跟踪点(&T)" -#: graphicswin.cpp:178 +#: graphicswin.cpp:180 msgid "&Stop Tracing..." msgstr "停止跟踪(&S)" -#: graphicswin.cpp:179 +#: graphicswin.cpp:181 msgid "Step &Dimension..." msgstr "逐步标注(&D)" -#: graphicswin.cpp:181 +#: graphicswin.cpp:183 msgid "&Help" msgstr "帮助(&H)" -#: graphicswin.cpp:182 +#: graphicswin.cpp:184 msgid "&Language" msgstr "语言(&L)" -#: graphicswin.cpp:183 +#: graphicswin.cpp:185 msgid "&Website / Manual" msgstr "网页/手册(&W)" -#: graphicswin.cpp:185 +#: graphicswin.cpp:187 msgid "&About" msgstr "关于(&A)" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "(无文件)" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "文件不存在: \"%s\"。" -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "没有激活的工作面,因此无法显示轴网。" -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel " "projection.\n" @@ -1081,91 +1111,91 @@ msgid "" "configuration screen. A value around 0.3 is typical." msgstr "" -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "" "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or " "make a link group the active group." msgstr "" -#: graphicswin.cpp:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) " "to define the plane for the snap grid." msgstr "" -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints " "with a label. To snap a line, select its endpoints." msgstr "" -#: graphicswin.cpp:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 msgid "" "No workplane is selected, and the active group does not have a default " "workplane. Try selecting a workplane, or activating a sketch-in-new-" "workplane group." msgstr "" -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select " "nothing to set up arc parameters." msgstr "" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "点击弧线的点(逆时针方向绘制)" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "点击放置基准点" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "点击线条的起点" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "点击构造线的起点" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "点击立方体的起点" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "点击圆弧的中心" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "点击工作面的原点" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "点击一个矩形倒角" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "点击文字左上角" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "点击图片左上角" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "" "No entities are selected. Select entities before trying to toggle their " "construction state." @@ -1176,37 +1206,33 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "3D草图" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the " "lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -"在新工作面内绘图选择失败,该组可以使用:\n" -"\n" -" * 一个点(通过该点,正交至坐标轴)\n" -" * 一个点和二个线段(通过点,绘制平行线至线段)\n" -" * 一个工作面(复制工作面)\n" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch " "will be extruded normal to the workplane." msgstr "挤出前先激活工作面(草图->在工作面),该草图将由工作面的法线方向挤出。" -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "挤出" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "扫略操作仅可用于二维草图。" -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1219,16 +1245,16 @@ msgstr "" " * 一个点和一个线段或法线(围绕坐标轴至线或法线的平行线,通过点)\n" " * 一个线段(围绕线段)\n" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "扫略" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "" -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1237,16 +1263,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "旋转" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "" -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1255,12 +1281,12 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "螺旋" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1270,428 +1296,434 @@ msgid "" "point, and parallel to line / normal)\n" msgstr "" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "旋转" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "移动" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "(未命名)" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" -msgstr "未闭合轮廓,或样式不一致!" +msgstr "未闭合轮廓 , 或样式不一致!" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "点不在相同平面!" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "轮廓自相交!" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "边缘长度为零!" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or " "circles in this group and workplane join." msgstr "" -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the " "desired geometry by hand with tangency constraints." msgstr "" -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "" -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs " "or a line/circle/arc and a point)." msgstr "" -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "无法拆分;未发现较差点。" -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "指定样式" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "无样式" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "新组样式。" -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "组信息" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "样式信息" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "选择边缘链" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "切换参考标注" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "其它补充角度" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "捕捉至轴网" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "删除样条线的点" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "增加样条线的点" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "无法增加样条线点:超过最大限制。" -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "切换构造" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "删除点一致约束" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "剪切" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "复制" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "全选" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "粘贴" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "粘贴移动的..." -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "删除" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "取消全选" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "取消覆盖区域的全选" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "自动缩放" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "点击下一个点或取消(ESC)" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "" "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在3D内绘制矩形; 首先,激活工作面,草图->在工作面。" -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "点击放置其它矩形倒角" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "点击设置半径" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "" "Can't draw arc in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在3D空间内绘制弧线,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "点击放置点" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "点击下一个点或取消(ESC)" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "" "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "已经在工作面绘制;在新建工作面前在三维空间绘制。" -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "" "Can't draw text in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在三维空间内绘制文字,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "点击文字的右下角放置" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "" "Can't draw image in 3d; first, activate a workplane with Sketch -> In " "Workplane." msgstr "无法在三维空间内绘制图片,可使用 草图->在工作面 激活工作面。" -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "新备注 - 双击编辑" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "SolveSpace模型" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "PNG图片" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "STL网格" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "Wavefront OBJ网格" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "Three.js-网格及查看视图" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "Three.js-仅网格" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "VRML文本文件" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "STEP文件" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "PDF文件" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "封装好的PostScript" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "SVG矢量图" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "DXF文件(AutoCAD 2007)" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "HPGL文件" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "G Code" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "AutoCAD DXF/DWG文件" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "逗号分隔数据" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "未命名" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "保存文件" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "打开文件" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "取消_C" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "保存_S" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "打开_O" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:658 +#: solvespace.cpp:699 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This " "is probably not what you want; hide them by clicking the link at the top of " "the text window." msgstr "" -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "" "Can't identify file type from file extension of filename '%s'; try .dxf or ." "dwg." msgstr "" -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1699,7 +1731,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1708,7 +1740,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1716,7 +1748,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1727,13 +1759,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, " "not coplanar, or self-intersecting." msgstr "" -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1744,7 +1776,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1755,36 +1787,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1792,7 +1824,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1802,7 +1834,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1812,7 +1844,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1829,33 +1861,33 @@ msgid "" "© 2008-%d Jonathan Westhues and other authors.\n" msgstr "" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try " "assigning a style to this entity's parent." msgstr "无法将样式分配给派生自其他实体的实体;尝试将样式分配给此实体的父级。" -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "样式名称不能为空" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "不能重复少于 1 次。" -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "重复不超过 999 次。" -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "组名称不能为空" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "不透明度必须在零和 1 之间。" -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "半径偏移不能为负数。" @@ -2010,14 +2042,54 @@ msgctxt "button" msgid "&OK" msgstr "&OK" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "缩放不能为零。" -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "格式错误: 需指定 x, y, z" +#~ msgid "" +#~ "Bad selection for length ratio constraint. This constraint can apply to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "长度比率约束的选择错误。此约束可应用于:\n" +#~ "\n" +#~ "* 两个线段\n" + +#~ msgid "" +#~ "Bad selection for length difference constraint. This constraint can apply " +#~ "to:\n" +#~ "\n" +#~ " * two line segments\n" +#~ msgstr "" +#~ "长度差异约束的选择错误。此约束可应用于:\n" +#~ "\n" +#~ "* 两个线段\n" + +#~ msgid "Length Ra&tio" +#~ msgstr "长度比例(&T)" + +#~ msgid "Length Diff&erence" +#~ msgstr "长度偏差(&E)" + +#~ msgid "" +#~ "Bad selection for new sketch in workplane. This group can be created " +#~ "with:\n" +#~ "\n" +#~ " * a point (through the point, orthogonal to coordinate axes)\n" +#~ " * a point and two line segments (through the point, parallel to the " +#~ "lines)\n" +#~ " * a workplane (copy of the workplane)\n" +#~ msgstr "" +#~ "在新工作面内绘图选择失败,该组可以使用:\n" +#~ "\n" +#~ " * 一个点(通过该点,正交至坐标轴)\n" +#~ " * 一个点和二个线段(通过点,绘制平行线至线段)\n" +#~ " * 一个工作面(复制工作面)\n" + #~ msgctxt "file-type" #~ msgid "Q3D Object file" #~ msgstr "Q3D对象文件" diff --git a/res/messages.pot b/res/messages.pot index 534faa40..25a6c1cf 100644 --- a/res/messages.pot +++ b/res/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: SolveSpace 3.0\n" "Report-Msgid-Bugs-To: whitequark@whitequark.org\n" -"POT-Creation-Date: 2021-02-01 15:45+0200\n" +"POT-Creation-Date: 2021-09-26 16:25-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,76 +17,76 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#: clipboard.cpp:310 +#: clipboard.cpp:309 msgid "" "Cut, paste, and copy work only in a workplane.\n" "\n" "Activate one with Sketch -> In Workplane." msgstr "" -#: clipboard.cpp:327 +#: clipboard.cpp:326 msgid "Clipboard is empty; nothing to paste." msgstr "" -#: clipboard.cpp:374 +#: clipboard.cpp:373 msgid "Number of copies to paste must be at least one." msgstr "" -#: clipboard.cpp:390 textscreens.cpp:783 +#: clipboard.cpp:389 textscreens.cpp:827 msgid "Scale cannot be zero." msgstr "" -#: clipboard.cpp:432 +#: clipboard.cpp:431 msgid "Select one point to define origin of rotation." msgstr "" -#: clipboard.cpp:444 +#: clipboard.cpp:443 msgid "Select two points to define translation vector." msgstr "" -#: clipboard.cpp:454 +#: clipboard.cpp:453 msgid "Transformation is identity. So all copies will be exactly on top of each other." msgstr "" -#: clipboard.cpp:458 +#: clipboard.cpp:457 msgid "Too many items to paste; split this into smaller pastes." msgstr "" -#: clipboard.cpp:463 +#: clipboard.cpp:462 msgid "No workplane active." msgstr "" -#: confscreen.cpp:418 +#: confscreen.cpp:376 msgid "Bad format: specify coordinates as x, y, z" msgstr "" -#: confscreen.cpp:428 style.cpp:659 textscreens.cpp:805 +#: confscreen.cpp:386 style.cpp:729 textscreens.cpp:858 msgid "Bad format: specify color as r, g, b" msgstr "" -#: confscreen.cpp:454 +#: confscreen.cpp:412 msgid "" "The perspective factor will have no effect until you enable View -> Use Perspective Projection." msgstr "" -#: confscreen.cpp:467 confscreen.cpp:477 +#: confscreen.cpp:430 confscreen.cpp:440 #, c-format msgid "Specify between 0 and %d digits after the decimal." msgstr "" -#: confscreen.cpp:489 +#: confscreen.cpp:452 msgid "Export scale must not be zero!" msgstr "" -#: confscreen.cpp:501 +#: confscreen.cpp:464 msgid "Cutter radius offset must not be negative!" msgstr "" -#: confscreen.cpp:555 +#: confscreen.cpp:518 msgid "Bad value: autosave interval should be positive" msgstr "" -#: confscreen.cpp:558 +#: confscreen.cpp:521 msgid "Bad format: specify interval in integral minutes" msgstr "" @@ -157,133 +157,153 @@ msgstr "" #: constraint.cpp:25 msgctxt "constr-name" -msgid "length-difference" +msgid "arc-arc-length-ratio" msgstr "" #: constraint.cpp:26 msgctxt "constr-name" -msgid "symmetric" +msgid "arc-line-length-ratio" msgstr "" #: constraint.cpp:27 msgctxt "constr-name" -msgid "symmetric-h" +msgid "length-difference" msgstr "" #: constraint.cpp:28 msgctxt "constr-name" -msgid "symmetric-v" +msgid "arc-arc-len-difference" msgstr "" #: constraint.cpp:29 msgctxt "constr-name" -msgid "symmetric-line" +msgid "arc-line-len-difference" msgstr "" #: constraint.cpp:30 msgctxt "constr-name" -msgid "at-midpoint" +msgid "symmetric" msgstr "" #: constraint.cpp:31 msgctxt "constr-name" -msgid "horizontal" +msgid "symmetric-h" msgstr "" #: constraint.cpp:32 msgctxt "constr-name" -msgid "vertical" +msgid "symmetric-v" msgstr "" #: constraint.cpp:33 msgctxt "constr-name" -msgid "diameter" +msgid "symmetric-line" msgstr "" #: constraint.cpp:34 msgctxt "constr-name" -msgid "pt-on-circle" +msgid "at-midpoint" msgstr "" #: constraint.cpp:35 msgctxt "constr-name" -msgid "same-orientation" +msgid "horizontal" msgstr "" #: constraint.cpp:36 msgctxt "constr-name" -msgid "angle" +msgid "vertical" msgstr "" #: constraint.cpp:37 msgctxt "constr-name" -msgid "parallel" +msgid "diameter" msgstr "" #: constraint.cpp:38 msgctxt "constr-name" -msgid "arc-line-tangent" +msgid "pt-on-circle" msgstr "" #: constraint.cpp:39 msgctxt "constr-name" -msgid "cubic-line-tangent" +msgid "same-orientation" msgstr "" #: constraint.cpp:40 msgctxt "constr-name" -msgid "curve-curve-tangent" +msgid "angle" msgstr "" #: constraint.cpp:41 msgctxt "constr-name" -msgid "perpendicular" +msgid "parallel" msgstr "" #: constraint.cpp:42 msgctxt "constr-name" -msgid "eq-radius" +msgid "arc-line-tangent" msgstr "" #: constraint.cpp:43 msgctxt "constr-name" -msgid "eq-angle" +msgid "cubic-line-tangent" msgstr "" #: constraint.cpp:44 msgctxt "constr-name" -msgid "eq-line-len-arc-len" +msgid "curve-curve-tangent" msgstr "" #: constraint.cpp:45 msgctxt "constr-name" -msgid "lock-where-dragged" +msgid "perpendicular" msgstr "" #: constraint.cpp:46 msgctxt "constr-name" +msgid "eq-radius" +msgstr "" + +#: constraint.cpp:47 +msgctxt "constr-name" +msgid "eq-angle" +msgstr "" + +#: constraint.cpp:48 +msgctxt "constr-name" +msgid "eq-line-len-arc-len" +msgstr "" + +#: constraint.cpp:49 +msgctxt "constr-name" +msgid "lock-where-dragged" +msgstr "" + +#: constraint.cpp:50 +msgctxt "constr-name" msgid "comment" msgstr "" -#: constraint.cpp:140 +#: constraint.cpp:144 msgid "" "The tangent arc and line segment must share an endpoint. Constrain them with Constrain -> On " "Point before constraining tangent." msgstr "" -#: constraint.cpp:158 +#: constraint.cpp:163 msgid "" "The tangent cubic and line segment must share an endpoint. Constrain them with Constrain -> On " "Point before constraining tangent." msgstr "" -#: constraint.cpp:183 +#: constraint.cpp:189 msgid "" "The curves must share an endpoint. Constrain them with Constrain -> On Point before constraining " "tangent." msgstr "" -#: constraint.cpp:231 +#: constraint.cpp:238 msgid "" "Bad selection for distance / diameter constraint. This constraint can apply to:\n" "\n" @@ -296,7 +316,7 @@ msgid "" " * a circle or an arc (diameter)\n" msgstr "" -#: constraint.cpp:284 +#: constraint.cpp:291 msgid "" "Bad selection for on point / curve / plane constraint. This constraint can apply to:\n" "\n" @@ -307,7 +327,7 @@ msgid "" " * a point and a plane face (point on face)\n" msgstr "" -#: constraint.cpp:346 +#: constraint.cpp:353 msgid "" "Bad selection for equal length / radius constraint. This constraint can apply to:\n" "\n" @@ -321,21 +341,25 @@ msgid "" " * a line segment and an arc (line segment length equals arc length)\n" msgstr "" -#: constraint.cpp:385 +#: constraint.cpp:407 msgid "" "Bad selection for length ratio constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -#: constraint.cpp:402 +#: constraint.cpp:441 msgid "" "Bad selection for length difference constraint. This constraint can apply to:\n" "\n" " * two line segments\n" +" * two arcs\n" +" * one arc and one line segment\n" msgstr "" -#: constraint.cpp:428 +#: constraint.cpp:472 msgid "" "Bad selection for at midpoint constraint. This constraint can apply to:\n" "\n" @@ -343,7 +367,7 @@ msgid "" " * a line segment and a workplane (line's midpoint on plane)\n" msgstr "" -#: constraint.cpp:486 +#: constraint.cpp:530 msgid "" "Bad selection for symmetric constraint. This constraint can apply to:\n" "\n" @@ -352,17 +376,17 @@ msgid "" " * workplane, and two points or a line segment (symmetric about workplane)\n" msgstr "" -#: constraint.cpp:500 +#: constraint.cpp:545 msgid "A workplane must be active when constraining symmetric without an explicit symmetry plane." msgstr "" -#: constraint.cpp:530 +#: constraint.cpp:579 msgid "" "Activate a workplane (with Sketch -> In Workplane) before applying a horizontal or vertical " "constraint." msgstr "" -#: constraint.cpp:543 +#: constraint.cpp:592 msgid "" "Bad selection for horizontal / vertical constraint. This constraint can apply to:\n" "\n" @@ -370,22 +394,22 @@ msgid "" " * a line segment\n" msgstr "" -#: constraint.cpp:564 +#: constraint.cpp:613 msgid "" "Bad selection for same orientation constraint. This constraint can apply to:\n" "\n" " * two normals\n" msgstr "" -#: constraint.cpp:614 +#: constraint.cpp:663 msgid "Must select an angle constraint." msgstr "" -#: constraint.cpp:627 +#: constraint.cpp:676 msgid "Must select a constraint with associated label." msgstr "" -#: constraint.cpp:638 +#: constraint.cpp:687 msgid "" "Bad selection for angle constraint. This constraint can apply to:\n" "\n" @@ -394,11 +418,11 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:701 +#: constraint.cpp:754 msgid "Curve-curve tangency must apply in workplane." msgstr "" -#: constraint.cpp:711 +#: constraint.cpp:766 msgid "" "Bad selection for parallel / tangent constraint. This constraint can apply to:\n" "\n" @@ -408,7 +432,7 @@ msgid "" " * two line segments, arcs, or beziers, that share an endpoint (tangent)\n" msgstr "" -#: constraint.cpp:729 +#: constraint.cpp:784 msgid "" "Bad selection for perpendicular constraint. This constraint can apply to:\n" "\n" @@ -417,14 +441,18 @@ msgid "" " * two normals\n" msgstr "" -#: constraint.cpp:744 +#: constraint.cpp:799 msgid "" "Bad selection for lock point where dragged constraint. This constraint can apply to:\n" "\n" " * a point\n" msgstr "" -#: constraint.cpp:755 +#: constraint.cpp:813 mouse.cpp:1158 +msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" +msgstr "" + +#: constraint.cpp:818 msgid "click center of comment text" msgstr "" @@ -443,23 +471,23 @@ msgid "" " * a point and two line segments (plane through point and parallel to lines)\n" msgstr "" -#: export.cpp:822 +#: export.cpp:818 msgid "Active group mesh is empty; nothing to export." msgstr "" -#: exportvector.cpp:337 +#: exportvector.cpp:336 msgid "freehand lines were replaced with continuous lines" msgstr "" -#: exportvector.cpp:339 +#: exportvector.cpp:338 msgid "zigzag lines were replaced with continuous lines" msgstr "" -#: exportvector.cpp:593 +#: exportvector.cpp:592 msgid "Some aspects of the drawing have no DXF equivalent and were not exported:\n" msgstr "" -#: exportvector.cpp:839 +#: exportvector.cpp:838 msgid "PDF page size exceeds 200 by 200 inches; many viewers may reject this file." msgstr "" @@ -473,11 +501,11 @@ msgctxt "group-name" msgid "#references" msgstr "" -#: file.cpp:552 +#: file.cpp:550 msgid "The file is empty. It may be corrupt." msgstr "" -#: file.cpp:557 +#: file.cpp:555 msgid "Unrecognized data in file. This file may be corrupt, or from a newer version of the program." msgstr "" @@ -510,7 +538,7 @@ msgctxt "button" msgid "&No" msgstr "" -#: file.cpp:877 solvespace.cpp:569 +#: file.cpp:877 solvespace.cpp:610 msgctxt "button" msgid "&Cancel" msgstr "" @@ -684,295 +712,303 @@ msgid "Use &Perspective Projection" msgstr "" #: graphicswin.cpp:97 -msgid "Dimension &Units" +msgid "Show E&xploded View" msgstr "" #: graphicswin.cpp:98 -msgid "Dimensions in &Millimeters" +msgid "Dimension &Units" msgstr "" #: graphicswin.cpp:99 -msgid "Dimensions in M&eters" +msgid "Dimensions in &Millimeters" msgstr "" #: graphicswin.cpp:100 +msgid "Dimensions in M&eters" +msgstr "" + +#: graphicswin.cpp:101 msgid "Dimensions in &Inches" msgstr "" #: graphicswin.cpp:102 +msgid "Dimensions in &Feet and Inches" +msgstr "" + +#: graphicswin.cpp:104 msgid "Show &Toolbar" msgstr "" -#: graphicswin.cpp:103 +#: graphicswin.cpp:105 msgid "Show Property Bro&wser" msgstr "" -#: graphicswin.cpp:105 +#: graphicswin.cpp:107 msgid "&Full Screen" msgstr "" -#: graphicswin.cpp:107 +#: graphicswin.cpp:109 msgid "&New Group" msgstr "" -#: graphicswin.cpp:108 +#: graphicswin.cpp:110 msgid "Sketch In &3d" msgstr "" -#: graphicswin.cpp:109 +#: graphicswin.cpp:111 msgid "Sketch In New &Workplane" msgstr "" -#: graphicswin.cpp:111 +#: graphicswin.cpp:113 msgid "Step &Translating" msgstr "" -#: graphicswin.cpp:112 +#: graphicswin.cpp:114 msgid "Step &Rotating" msgstr "" -#: graphicswin.cpp:114 +#: graphicswin.cpp:116 msgid "E&xtrude" msgstr "" -#: graphicswin.cpp:115 +#: graphicswin.cpp:117 msgid "&Helix" msgstr "" -#: graphicswin.cpp:116 +#: graphicswin.cpp:118 msgid "&Lathe" msgstr "" -#: graphicswin.cpp:117 +#: graphicswin.cpp:119 msgid "Re&volve" msgstr "" -#: graphicswin.cpp:119 +#: graphicswin.cpp:121 msgid "Link / Assemble..." msgstr "" -#: graphicswin.cpp:120 +#: graphicswin.cpp:122 msgid "Link Recent" msgstr "" -#: graphicswin.cpp:122 +#: graphicswin.cpp:124 msgid "&Sketch" msgstr "" -#: graphicswin.cpp:123 +#: graphicswin.cpp:125 msgid "In &Workplane" msgstr "" -#: graphicswin.cpp:124 +#: graphicswin.cpp:126 msgid "Anywhere In &3d" msgstr "" -#: graphicswin.cpp:126 +#: graphicswin.cpp:128 msgid "Datum &Point" msgstr "" -#: graphicswin.cpp:127 +#: graphicswin.cpp:129 msgid "&Workplane" msgstr "" -#: graphicswin.cpp:129 +#: graphicswin.cpp:131 msgid "Line &Segment" msgstr "" -#: graphicswin.cpp:130 +#: graphicswin.cpp:132 msgid "C&onstruction Line Segment" msgstr "" -#: graphicswin.cpp:131 +#: graphicswin.cpp:133 msgid "&Rectangle" msgstr "" -#: graphicswin.cpp:132 +#: graphicswin.cpp:134 msgid "&Circle" msgstr "" -#: graphicswin.cpp:133 +#: graphicswin.cpp:135 msgid "&Arc of a Circle" msgstr "" -#: graphicswin.cpp:134 +#: graphicswin.cpp:136 msgid "&Bezier Cubic Spline" msgstr "" -#: graphicswin.cpp:136 +#: graphicswin.cpp:138 msgid "&Text in TrueType Font" msgstr "" -#: graphicswin.cpp:137 +#: graphicswin.cpp:139 msgid "&Image" msgstr "" -#: graphicswin.cpp:139 +#: graphicswin.cpp:141 msgid "To&ggle Construction" msgstr "" -#: graphicswin.cpp:140 +#: graphicswin.cpp:142 msgid "Tangent &Arc at Point" msgstr "" -#: graphicswin.cpp:141 +#: graphicswin.cpp:143 msgid "Split Curves at &Intersection" msgstr "" -#: graphicswin.cpp:143 +#: graphicswin.cpp:145 msgid "&Constrain" msgstr "" -#: graphicswin.cpp:144 +#: graphicswin.cpp:146 msgid "&Distance / Diameter" msgstr "" -#: graphicswin.cpp:145 +#: graphicswin.cpp:147 msgid "Re&ference Dimension" msgstr "" -#: graphicswin.cpp:146 +#: graphicswin.cpp:148 msgid "A&ngle" msgstr "" -#: graphicswin.cpp:147 +#: graphicswin.cpp:149 msgid "Reference An&gle" msgstr "" -#: graphicswin.cpp:148 +#: graphicswin.cpp:150 msgid "Other S&upplementary Angle" msgstr "" -#: graphicswin.cpp:149 +#: graphicswin.cpp:151 msgid "Toggle R&eference Dim" msgstr "" -#: graphicswin.cpp:151 +#: graphicswin.cpp:153 msgid "&Horizontal" msgstr "" -#: graphicswin.cpp:152 +#: graphicswin.cpp:154 msgid "&Vertical" msgstr "" -#: graphicswin.cpp:154 +#: graphicswin.cpp:156 msgid "&On Point / Curve / Plane" msgstr "" -#: graphicswin.cpp:155 +#: graphicswin.cpp:157 msgid "E&qual Length / Radius / Angle" msgstr "" -#: graphicswin.cpp:156 -msgid "Length Ra&tio" -msgstr "" - -#: graphicswin.cpp:157 -msgid "Length Diff&erence" -msgstr "" - #: graphicswin.cpp:158 -msgid "At &Midpoint" +msgid "Length / Arc Ra&tio" msgstr "" #: graphicswin.cpp:159 -msgid "S&ymmetric" +msgid "Length / Arc Diff&erence" msgstr "" #: graphicswin.cpp:160 -msgid "Para&llel / Tangent" +msgid "At &Midpoint" msgstr "" #: graphicswin.cpp:161 -msgid "&Perpendicular" +msgid "S&ymmetric" msgstr "" #: graphicswin.cpp:162 -msgid "Same Orient&ation" +msgid "Para&llel / Tangent" msgstr "" #: graphicswin.cpp:163 -msgid "Lock Point Where &Dragged" +msgid "&Perpendicular" +msgstr "" + +#: graphicswin.cpp:164 +msgid "Same Orient&ation" msgstr "" #: graphicswin.cpp:165 -msgid "Comment" +msgid "Lock Point Where &Dragged" msgstr "" #: graphicswin.cpp:167 -msgid "&Analyze" -msgstr "" - -#: graphicswin.cpp:168 -msgid "Measure &Volume" +msgid "Comment" msgstr "" #: graphicswin.cpp:169 -msgid "Measure A&rea" +msgid "&Analyze" msgstr "" #: graphicswin.cpp:170 -msgid "Measure &Perimeter" +msgid "Measure &Volume" msgstr "" #: graphicswin.cpp:171 -msgid "Show &Interfering Parts" +msgid "Measure A&rea" msgstr "" #: graphicswin.cpp:172 -msgid "Show &Naked Edges" +msgid "Measure &Perimeter" msgstr "" #: graphicswin.cpp:173 -msgid "Show &Center of Mass" +msgid "Show &Interfering Parts" +msgstr "" + +#: graphicswin.cpp:174 +msgid "Show &Naked Edges" msgstr "" #: graphicswin.cpp:175 -msgid "Show &Underconstrained Points" +msgid "Show &Center of Mass" msgstr "" #: graphicswin.cpp:177 -msgid "&Trace Point" -msgstr "" - -#: graphicswin.cpp:178 -msgid "&Stop Tracing..." +msgid "Show &Underconstrained Points" msgstr "" #: graphicswin.cpp:179 -msgid "Step &Dimension..." +msgid "&Trace Point" +msgstr "" + +#: graphicswin.cpp:180 +msgid "&Stop Tracing..." msgstr "" #: graphicswin.cpp:181 -msgid "&Help" -msgstr "" - -#: graphicswin.cpp:182 -msgid "&Language" +msgid "Step &Dimension..." msgstr "" #: graphicswin.cpp:183 -msgid "&Website / Manual" +msgid "&Help" +msgstr "" + +#: graphicswin.cpp:184 +msgid "&Language" msgstr "" #: graphicswin.cpp:185 +msgid "&Website / Manual" +msgstr "" + +#: graphicswin.cpp:187 msgid "&About" msgstr "" -#: graphicswin.cpp:355 +#: graphicswin.cpp:361 msgid "(no recent files)" msgstr "" -#: graphicswin.cpp:363 +#: graphicswin.cpp:369 #, c-format msgid "File '%s' does not exist." msgstr "" -#: graphicswin.cpp:725 +#: graphicswin.cpp:736 msgid "No workplane is active, so the grid will not appear." msgstr "" -#: graphicswin.cpp:740 +#: graphicswin.cpp:751 msgid "" "The perspective factor is set to zero, so the view will always be a parallel projection.\n" "\n" @@ -980,89 +1016,89 @@ msgid "" "around 0.3 is typical." msgstr "" -#: graphicswin.cpp:819 +#: graphicswin.cpp:836 msgid "Select a point; this point will become the center of the view on screen." msgstr "" -#: graphicswin.cpp:1114 +#: graphicswin.cpp:1136 msgid "No additional entities share endpoints with the selected entities." msgstr "" -#: graphicswin.cpp:1132 +#: graphicswin.cpp:1154 msgid "" "To use this command, select a point or other entity from an linked part, or make a link group the " "active group." msgstr "" -#: graphicswin.cpp:1155 +#: graphicswin.cpp:1177 msgid "" "No workplane is active. Activate a workplane (with Sketch -> In Workplane) to define the plane " "for the snap grid." msgstr "" -#: graphicswin.cpp:1162 +#: graphicswin.cpp:1184 msgid "" "Can't snap these items to grid; select points, text comments, or constraints with a label. To " "snap a line, select its endpoints." msgstr "" -#: graphicswin.cpp:1247 +#: graphicswin.cpp:1269 msgid "No workplane selected. Activating default workplane for this group." msgstr "" -#: graphicswin.cpp:1250 +#: graphicswin.cpp:1272 msgid "" "No workplane is selected, and the active group does not have a default workplane. Try selecting a " "workplane, or activating a sketch-in-new-workplane group." msgstr "" -#: graphicswin.cpp:1271 +#: graphicswin.cpp:1293 msgid "" "Bad selection for tangent arc at point. Select a single point, or select nothing to set up arc " "parameters." msgstr "" -#: graphicswin.cpp:1282 +#: graphicswin.cpp:1304 msgid "click point on arc (draws anti-clockwise)" msgstr "" -#: graphicswin.cpp:1283 +#: graphicswin.cpp:1305 msgid "click to place datum point" msgstr "" -#: graphicswin.cpp:1284 +#: graphicswin.cpp:1306 msgid "click first point of line segment" msgstr "" -#: graphicswin.cpp:1286 +#: graphicswin.cpp:1308 msgid "click first point of construction line segment" msgstr "" -#: graphicswin.cpp:1287 +#: graphicswin.cpp:1309 msgid "click first point of cubic segment" msgstr "" -#: graphicswin.cpp:1288 +#: graphicswin.cpp:1310 msgid "click center of circle" msgstr "" -#: graphicswin.cpp:1289 +#: graphicswin.cpp:1311 msgid "click origin of workplane" msgstr "" -#: graphicswin.cpp:1290 +#: graphicswin.cpp:1312 msgid "click one corner of rectangle" msgstr "" -#: graphicswin.cpp:1291 +#: graphicswin.cpp:1313 msgid "click top left of text" msgstr "" -#: graphicswin.cpp:1297 +#: graphicswin.cpp:1319 msgid "click top left of image" msgstr "" -#: graphicswin.cpp:1309 +#: graphicswin.cpp:1345 msgid "No entities are selected. Select entities before trying to toggle their construction state." msgstr "" @@ -1071,31 +1107,32 @@ msgctxt "group-name" msgid "sketch-in-3d" msgstr "" -#: group.cpp:142 +#: group.cpp:150 msgid "" "Bad selection for new sketch in workplane. This group can be created with:\n" "\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, parallel to the lines)\n" +" * a point and a normal (through the point, orthogonal to the normal)\n" " * a workplane (copy of the workplane)\n" msgstr "" -#: group.cpp:154 +#: group.cpp:166 msgid "" "Activate a workplane (Sketch -> In Workplane) before extruding. The sketch will be extruded " "normal to the workplane." msgstr "" -#: group.cpp:163 +#: group.cpp:175 msgctxt "group-name" msgid "extrude" msgstr "" -#: group.cpp:168 +#: group.cpp:180 msgid "Lathe operation can only be applied to planar sketches." msgstr "" -#: group.cpp:179 +#: group.cpp:191 msgid "" "Bad selection for new lathe group. This group can be created with:\n" "\n" @@ -1104,16 +1141,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:189 +#: group.cpp:201 msgctxt "group-name" msgid "lathe" msgstr "" -#: group.cpp:194 +#: group.cpp:206 msgid "Revolve operation can only be applied to planar sketches." msgstr "" -#: group.cpp:205 +#: group.cpp:217 msgid "" "Bad selection for new revolve group. This group can be created with:\n" "\n" @@ -1122,16 +1159,16 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:217 +#: group.cpp:229 msgctxt "group-name" msgid "revolve" msgstr "" -#: group.cpp:222 +#: group.cpp:234 msgid "Helix operation can only be applied to planar sketches." msgstr "" -#: group.cpp:233 +#: group.cpp:245 msgid "" "Bad selection for new helix group. This group can be created with:\n" "\n" @@ -1140,12 +1177,12 @@ msgid "" " * a line segment (revolved about line segment)\n" msgstr "" -#: group.cpp:245 +#: group.cpp:257 msgctxt "group-name" msgid "helix" msgstr "" -#: group.cpp:258 +#: group.cpp:270 msgid "" "Bad selection for new rotation. This group can be created with:\n" "\n" @@ -1154,416 +1191,422 @@ msgid "" "line / normal)\n" msgstr "" -#: group.cpp:271 +#: group.cpp:283 msgctxt "group-name" msgid "rotate" msgstr "" -#: group.cpp:282 +#: group.cpp:294 msgctxt "group-name" msgid "translate" msgstr "" -#: group.cpp:400 +#: group.cpp:416 msgid "(unnamed)" msgstr "" -#: groupmesh.cpp:709 +#: groupmesh.cpp:707 msgid "not closed contour, or not all same style!" msgstr "" -#: groupmesh.cpp:722 +#: groupmesh.cpp:720 msgid "points not all coplanar!" msgstr "" -#: groupmesh.cpp:724 +#: groupmesh.cpp:722 msgid "contour is self-intersecting!" msgstr "" -#: groupmesh.cpp:726 +#: groupmesh.cpp:724 msgid "zero-length edge!" msgstr "" -#: modify.cpp:254 +#: modify.cpp:252 msgid "Must be sketching in workplane to create tangent arc." msgstr "" -#: modify.cpp:301 +#: modify.cpp:299 msgid "" "To create a tangent arc, select a point where two non-construction lines or circles in this group " "and workplane join." msgstr "" -#: modify.cpp:388 +#: modify.cpp:386 msgid "" "Couldn't round this corner. Try a smaller radius, or try creating the desired geometry by hand " "with tangency constraints." msgstr "" -#: modify.cpp:597 +#: modify.cpp:595 msgid "Couldn't split this entity; lines, circles, or cubics only." msgstr "" -#: modify.cpp:624 +#: modify.cpp:622 msgid "Must be sketching in workplane to split." msgstr "" -#: modify.cpp:631 +#: modify.cpp:629 msgid "" "Select two entities that intersect each other (e.g. two lines/circles/arcs or a line/circle/arc " "and a point)." msgstr "" -#: modify.cpp:736 +#: modify.cpp:734 msgid "Can't split; no intersection found." msgstr "" -#: mouse.cpp:559 +#: mouse.cpp:557 msgid "Assign to Style" msgstr "" -#: mouse.cpp:575 +#: mouse.cpp:573 msgid "No Style" msgstr "" -#: mouse.cpp:578 +#: mouse.cpp:576 msgid "Newly Created Custom Style..." msgstr "" -#: mouse.cpp:585 +#: mouse.cpp:583 msgid "Group Info" msgstr "" -#: mouse.cpp:605 +#: mouse.cpp:603 msgid "Style Info" msgstr "" -#: mouse.cpp:625 +#: mouse.cpp:623 msgid "Select Edge Chain" msgstr "" -#: mouse.cpp:631 +#: mouse.cpp:629 msgid "Toggle Reference Dimension" msgstr "" -#: mouse.cpp:637 +#: mouse.cpp:635 msgid "Other Supplementary Angle" msgstr "" -#: mouse.cpp:642 +#: mouse.cpp:640 msgid "Snap to Grid" msgstr "" -#: mouse.cpp:651 +#: mouse.cpp:649 msgid "Remove Spline Point" msgstr "" -#: mouse.cpp:686 +#: mouse.cpp:684 msgid "Add Spline Point" msgstr "" -#: mouse.cpp:690 +#: mouse.cpp:688 msgid "Cannot add spline point: maximum number of points reached." msgstr "" -#: mouse.cpp:715 +#: mouse.cpp:713 msgid "Toggle Construction" msgstr "" -#: mouse.cpp:730 +#: mouse.cpp:729 msgid "Delete Point-Coincident Constraint" msgstr "" -#: mouse.cpp:749 +#: mouse.cpp:747 msgid "Cut" msgstr "" -#: mouse.cpp:751 +#: mouse.cpp:749 msgid "Copy" msgstr "" -#: mouse.cpp:755 +#: mouse.cpp:753 msgid "Select All" msgstr "" -#: mouse.cpp:760 +#: mouse.cpp:758 msgid "Paste" msgstr "" -#: mouse.cpp:762 +#: mouse.cpp:760 msgid "Paste Transformed..." msgstr "" -#: mouse.cpp:767 +#: mouse.cpp:765 msgid "Delete" msgstr "" -#: mouse.cpp:770 +#: mouse.cpp:768 msgid "Unselect All" msgstr "" -#: mouse.cpp:777 +#: mouse.cpp:775 msgid "Unselect Hovered" msgstr "" -#: mouse.cpp:786 +#: mouse.cpp:784 msgid "Zoom to Fit" msgstr "" -#: mouse.cpp:988 mouse.cpp:1275 +#: mouse.cpp:986 mouse.cpp:1274 msgid "click next point of line, or press Esc" msgstr "" -#: mouse.cpp:994 +#: mouse.cpp:992 msgid "Can't draw rectangle in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1028 +#: mouse.cpp:1026 msgid "click to place other corner of rectangle" msgstr "" -#: mouse.cpp:1048 +#: mouse.cpp:1047 msgid "click to set radius" msgstr "" -#: mouse.cpp:1053 +#: mouse.cpp:1052 msgid "Can't draw arc in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1072 +#: mouse.cpp:1071 msgid "click to place point" msgstr "" -#: mouse.cpp:1088 +#: mouse.cpp:1087 msgid "click next point of cubic, or press Esc" msgstr "" -#: mouse.cpp:1093 +#: mouse.cpp:1092 msgid "Sketching in a workplane already; sketch in 3d before creating new workplane." msgstr "" -#: mouse.cpp:1109 +#: mouse.cpp:1108 msgid "Can't draw text in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1126 +#: mouse.cpp:1125 msgid "click to place bottom right of text" msgstr "" -#: mouse.cpp:1132 +#: mouse.cpp:1131 msgid "Can't draw image in 3d; first, activate a workplane with Sketch -> In Workplane." msgstr "" -#: mouse.cpp:1159 -msgid "NEW COMMENT -- DOUBLE-CLICK TO EDIT" -msgstr "" - -#: platform/gui.cpp:85 platform/gui.cpp:89 solvespace.cpp:511 +#: platform/gui.cpp:85 platform/gui.cpp:90 solvespace.cpp:552 msgctxt "file-type" msgid "SolveSpace models" msgstr "" -#: platform/gui.cpp:90 +#: platform/gui.cpp:89 +msgctxt "file-type" +msgid "ALL" +msgstr "" + +#: platform/gui.cpp:91 msgctxt "file-type" msgid "IDF circuit board" msgstr "" -#: platform/gui.cpp:94 +#: platform/gui.cpp:92 +msgctxt "file-type" +msgid "STL triangle mesh" +msgstr "" + +#: platform/gui.cpp:96 msgctxt "file-type" msgid "PNG image" msgstr "" -#: platform/gui.cpp:98 +#: platform/gui.cpp:100 msgctxt "file-type" msgid "STL mesh" msgstr "" -#: platform/gui.cpp:99 +#: platform/gui.cpp:101 msgctxt "file-type" msgid "Wavefront OBJ mesh" msgstr "" -#: platform/gui.cpp:100 +#: platform/gui.cpp:102 msgctxt "file-type" msgid "Three.js-compatible mesh, with viewer" msgstr "" -#: platform/gui.cpp:101 +#: platform/gui.cpp:103 msgctxt "file-type" msgid "Three.js-compatible mesh, mesh only" msgstr "" -#: platform/gui.cpp:102 +#: platform/gui.cpp:104 msgctxt "file-type" msgid "VRML text file" msgstr "" -#: platform/gui.cpp:106 platform/gui.cpp:113 platform/gui.cpp:120 +#: platform/gui.cpp:108 platform/gui.cpp:115 platform/gui.cpp:122 msgctxt "file-type" msgid "STEP file" msgstr "" -#: platform/gui.cpp:110 +#: platform/gui.cpp:112 msgctxt "file-type" msgid "PDF file" msgstr "" -#: platform/gui.cpp:111 +#: platform/gui.cpp:113 msgctxt "file-type" msgid "Encapsulated PostScript" msgstr "" -#: platform/gui.cpp:112 +#: platform/gui.cpp:114 msgctxt "file-type" msgid "Scalable Vector Graphics" msgstr "" -#: platform/gui.cpp:114 platform/gui.cpp:121 +#: platform/gui.cpp:116 platform/gui.cpp:123 msgctxt "file-type" msgid "DXF file (AutoCAD 2007)" msgstr "" -#: platform/gui.cpp:115 +#: platform/gui.cpp:117 msgctxt "file-type" msgid "HPGL file" msgstr "" -#: platform/gui.cpp:116 +#: platform/gui.cpp:118 msgctxt "file-type" msgid "G Code" msgstr "" -#: platform/gui.cpp:125 +#: platform/gui.cpp:127 msgctxt "file-type" msgid "AutoCAD DXF and DWG files" msgstr "" -#: platform/gui.cpp:129 +#: platform/gui.cpp:131 msgctxt "file-type" msgid "Comma-separated values" msgstr "" -#: platform/guigtk.cpp:1324 platform/guimac.mm:1363 platform/guiwin.cpp:1639 +#: platform/guigtk.cpp:1367 platform/guimac.mm:1487 platform/guiwin.cpp:1641 msgid "untitled" msgstr "" -#: platform/guigtk.cpp:1335 platform/guigtk.cpp:1368 platform/guimac.mm:1321 -#: platform/guiwin.cpp:1582 +#: platform/guigtk.cpp:1378 platform/guigtk.cpp:1411 platform/guimac.mm:1445 +#: platform/guiwin.cpp:1639 msgctxt "title" msgid "Save File" msgstr "" -#: platform/guigtk.cpp:1336 platform/guigtk.cpp:1369 platform/guimac.mm:1304 -#: platform/guiwin.cpp:1584 +#: platform/guigtk.cpp:1379 platform/guigtk.cpp:1412 platform/guimac.mm:1428 +#: platform/guiwin.cpp:1645 msgctxt "title" msgid "Open File" msgstr "" -#: platform/guigtk.cpp:1339 platform/guigtk.cpp:1375 +#: platform/guigtk.cpp:1382 platform/guigtk.cpp:1418 msgctxt "button" msgid "_Cancel" msgstr "" -#: platform/guigtk.cpp:1340 platform/guigtk.cpp:1373 +#: platform/guigtk.cpp:1383 platform/guigtk.cpp:1416 msgctxt "button" msgid "_Save" msgstr "" -#: platform/guigtk.cpp:1341 platform/guigtk.cpp:1374 +#: platform/guigtk.cpp:1384 platform/guigtk.cpp:1417 msgctxt "button" msgid "_Open" msgstr "" -#: solvespace.cpp:169 +#: solvespace.cpp:170 msgctxt "title" msgid "Autosave Available" msgstr "" -#: solvespace.cpp:170 +#: solvespace.cpp:171 msgctxt "dialog" msgid "An autosave file is available for this sketch." msgstr "" -#: solvespace.cpp:171 +#: solvespace.cpp:172 msgctxt "dialog" msgid "Do you want to load the autosave file instead?" msgstr "" -#: solvespace.cpp:172 +#: solvespace.cpp:173 msgctxt "button" msgid "&Load autosave" msgstr "" -#: solvespace.cpp:174 +#: solvespace.cpp:175 msgctxt "button" msgid "Do&n't Load" msgstr "" -#: solvespace.cpp:557 +#: solvespace.cpp:598 msgctxt "title" msgid "Modified File" msgstr "" -#: solvespace.cpp:559 +#: solvespace.cpp:600 #, c-format msgctxt "dialog" msgid "Do you want to save the changes you made to the sketch “%s”?" msgstr "" -#: solvespace.cpp:562 +#: solvespace.cpp:603 msgctxt "dialog" msgid "Do you want to save the changes you made to the new sketch?" msgstr "" -#: solvespace.cpp:565 +#: solvespace.cpp:606 msgctxt "dialog" msgid "Your changes will be lost if you don't save them." msgstr "" -#: solvespace.cpp:566 +#: solvespace.cpp:607 msgctxt "button" msgid "&Save" msgstr "" -#: solvespace.cpp:568 +#: solvespace.cpp:609 msgctxt "button" msgid "Do&n't Save" msgstr "" -#: solvespace.cpp:589 +#: solvespace.cpp:630 msgctxt "title" msgid "(new sketch)" msgstr "" -#: solvespace.cpp:596 +#: solvespace.cpp:637 msgctxt "title" msgid "Property Browser" msgstr "" -#: solvespace.cpp:658 +#: solvespace.cpp:699 msgid "" "Constraints are currently shown, and will be exported in the toolpath. This is probably not what " "you want; hide them by clicking the link at the top of the text window." msgstr "" -#: solvespace.cpp:730 +#: solvespace.cpp:771 #, c-format msgid "Can't identify file type from file extension of filename '%s'; try .dxf or .dwg." msgstr "" -#: solvespace.cpp:778 +#: solvespace.cpp:823 msgid "Constraint must have a label, and must not be a reference dimension." msgstr "" -#: solvespace.cpp:782 +#: solvespace.cpp:827 msgid "Bad selection for step dimension; select a constraint." msgstr "" -#: solvespace.cpp:806 +#: solvespace.cpp:851 msgid "The assembly does not interfere, good." msgstr "" -#: solvespace.cpp:822 +#: solvespace.cpp:867 #, c-format msgid "" "The volume of the solid model is:\n" @@ -1571,7 +1614,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:831 +#: solvespace.cpp:876 #, c-format msgid "" "\n" @@ -1580,7 +1623,7 @@ msgid "" " %s" msgstr "" -#: solvespace.cpp:836 +#: solvespace.cpp:881 msgid "" "\n" "\n" @@ -1588,7 +1631,7 @@ msgid "" "This introduces error, typically of around 1%." msgstr "" -#: solvespace.cpp:851 +#: solvespace.cpp:896 #, c-format msgid "" "The surface area of the selected faces is:\n" @@ -1599,13 +1642,13 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:860 +#: solvespace.cpp:905 msgid "" "This group does not contain a correctly-formed 2d closed area. It is open, not coplanar, or self-" "intersecting." msgstr "" -#: solvespace.cpp:872 +#: solvespace.cpp:917 #, c-format msgid "" "The area of the region sketched in this group is:\n" @@ -1616,7 +1659,7 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:892 +#: solvespace.cpp:937 #, c-format msgid "" "The total length of the selected entities is:\n" @@ -1627,36 +1670,36 @@ msgid "" "This introduces error, typically of around 1%%." msgstr "" -#: solvespace.cpp:898 +#: solvespace.cpp:943 msgid "Bad selection for perimeter; select line segments, arcs, and curves." msgstr "" -#: solvespace.cpp:914 +#: solvespace.cpp:959 msgid "Bad selection for trace; select a single point." msgstr "" -#: solvespace.cpp:941 +#: solvespace.cpp:986 #, c-format msgid "Couldn't write to '%s'" msgstr "" -#: solvespace.cpp:971 +#: solvespace.cpp:1016 msgid "The mesh is self-intersecting (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:972 +#: solvespace.cpp:1017 msgid "The mesh is not self-intersecting (okay, valid)." msgstr "" -#: solvespace.cpp:974 +#: solvespace.cpp:1019 msgid "The mesh has naked edges (NOT okay, invalid)." msgstr "" -#: solvespace.cpp:975 +#: solvespace.cpp:1020 msgid "The mesh is watertight (okay, valid)." msgstr "" -#: solvespace.cpp:978 +#: solvespace.cpp:1023 #, c-format msgid "" "\n" @@ -1664,7 +1707,7 @@ msgid "" "The model contains %d triangles, from %d surfaces." msgstr "" -#: solvespace.cpp:982 +#: solvespace.cpp:1027 #, c-format msgid "" "%s\n" @@ -1674,7 +1717,7 @@ msgid "" "Zero problematic edges, good.%s" msgstr "" -#: solvespace.cpp:985 +#: solvespace.cpp:1030 #, c-format msgid "" "%s\n" @@ -1684,7 +1727,7 @@ msgid "" "%d problematic edges, bad.%s" msgstr "" -#: solvespace.cpp:998 +#: solvespace.cpp:1043 #, c-format msgid "" "This is SolveSpace version %s.\n" @@ -1701,33 +1744,33 @@ msgid "" "© 2008-%d Jonathan Westhues and other authors.\n" msgstr "" -#: style.cpp:166 +#: style.cpp:185 msgid "" "Can't assign style to an entity that's derived from another entity; try assigning a style to this " "entity's parent." msgstr "" -#: style.cpp:665 +#: style.cpp:735 msgid "Style name cannot be empty" msgstr "" -#: textscreens.cpp:741 +#: textscreens.cpp:785 msgid "Can't repeat fewer than 1 time." msgstr "" -#: textscreens.cpp:745 +#: textscreens.cpp:789 msgid "Can't repeat more than 999 times." msgstr "" -#: textscreens.cpp:770 +#: textscreens.cpp:814 msgid "Group name cannot be empty" msgstr "" -#: textscreens.cpp:813 +#: textscreens.cpp:866 msgid "Opacity must be between zero and one." msgstr "" -#: textscreens.cpp:848 +#: textscreens.cpp:901 msgid "Radius cannot be zero or negative." msgstr "" @@ -1882,10 +1925,10 @@ msgctxt "button" msgid "&OK" msgstr "" -#: view.cpp:78 +#: view.cpp:127 msgid "Scale cannot be zero or negative." msgstr "" -#: view.cpp:90 view.cpp:99 +#: view.cpp:139 view.cpp:148 msgid "Bad format: specify x, y, z" msgstr "" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 45dab944..7bc5a7cd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -117,6 +117,7 @@ if(WIN32) ${SPACEWARE_LIBRARIES}) elseif(APPLE) add_compile_options( + -DGL_SILENCE_DEPRECATION -fobjc-arc) list(APPEND platform_SOURCES @@ -176,6 +177,7 @@ set(solvespace_core_SOURCES groupmesh.cpp importdxf.cpp importidf.cpp + importmesh.cpp mesh.cpp modify.cpp mouse.cpp @@ -338,7 +340,10 @@ if(ENABLE_GUI) LINK_FLAGS "/MANIFEST:NO /SAFESEH:NO /INCREMENTAL:NO /OPT:REF") elseif(APPLE) set_target_properties(solvespace PROPERTIES - OUTPUT_NAME SolveSpace) + OUTPUT_NAME SolveSpace + XCODE_ATTRIBUTE_ENABLE_HARDENED_RUNTIME "YES" + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.solvespace" + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") endif() endif() @@ -401,17 +406,30 @@ endif() # solvespace macOS package if(APPLE) - set(bundle SolveSpace) - set(bundle_bin ${EXECUTABLE_OUTPUT_PATH}/${bundle}.app/Contents/MacOS) - set(bundle_resources ${EXECUTABLE_OUTPUT_PATH}/${bundle}.app/Contents/Resources/lib) - execute_process( - COMMAND mkdir -p ${bundle_resources} - COMMAND cp -p /usr/local/opt/libomp/lib/libomp.dylib ${bundle_resources}/libomp.dylib - ) - add_custom_command(TARGET solvespace POST_BUILD - COMMAND ${CMAKE_COMMAND} -E make_directory ${bundle_bin} - COMMAND ${CMAKE_COMMAND} -E copy $ ${bundle_bin} - COMMAND install_name_tool -change /usr/local/opt/libomp/lib/libomp.dylib "@executable_path/../Resources/lib/libomp.dylib" ${bundle_bin}/${bundle} - COMMENT "Bundling executable solvespace-cli" - VERBATIM) -endif() + set(LIBOMP_LIB_PATH ${OpenMP_CXX_INCLUDE_DIRS}/../lib/libomp.dylib) + set(LIBOMP_LINK_PATH "@executable_path/../Resources/libomp.dylib") + set(LIBOMP_LINK_PATH_UTILS "@executable_path/SolveSpace.app/Contents/Resources/libomp.dylib") + if(ENABLE_GUI) + add_custom_command(TARGET solvespace POST_BUILD + COMMAND cp -r ${CMAKE_BINARY_DIR}/Resources $ + ) + if(ENABLE_OPENMP) + execute_process(COMMAND install_name_tool -id ${LIBOMP_LINK_PATH} ${LIBOMP_LIB_PATH}) + message("FROM " ${${LIBOMP_LIB_PATH}} "TO" $/Resources/libomp.dylib) + add_custom_command(TARGET solvespace POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy ${LIBOMP_LIB_PATH} $/Resources/libomp.dylib + COMMAND install_name_tool -change ${LIBOMP_LINK_PATH} ${LIBOMP_LINK_PATH_UTILS} $ + ) + endif() + endif() + if(ENABLE_TESTS AND ENABLE_OPENMP) + add_custom_command(TARGET solvespace POST_BUILD + COMMAND install_name_tool -change ${LIBOMP_LINK_PATH} ${LIBOMP_LINK_PATH_UTILS} $) + endif() + if(ENABLE_CLI) + add_custom_command(TARGET solvespace POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy $ $ + COMMENT "Bundling executable solvespace-cli" + VERBATIM) + endif() +endif() \ No newline at end of file diff --git a/src/clipboard.cpp b/src/clipboard.cpp index d43ec458..69a624c3 100644 --- a/src/clipboard.cpp +++ b/src/clipboard.cpp @@ -138,18 +138,17 @@ void GraphicsWindow::CopySelection() { } } - Constraint *c; - for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) { - if(!SS.clipboard.ContainsEntity(c->ptA) || - !SS.clipboard.ContainsEntity(c->ptB) || - !SS.clipboard.ContainsEntity(c->entityA) || - !SS.clipboard.ContainsEntity(c->entityB) || - !SS.clipboard.ContainsEntity(c->entityC) || - !SS.clipboard.ContainsEntity(c->entityD) || - c->type == Constraint::Type::COMMENT) { + for(Constraint &c : SK.constraint) { + if(!SS.clipboard.ContainsEntity(c.ptA) || + !SS.clipboard.ContainsEntity(c.ptB) || + !SS.clipboard.ContainsEntity(c.entityA) || + !SS.clipboard.ContainsEntity(c.entityB) || + !SS.clipboard.ContainsEntity(c.entityC) || + !SS.clipboard.ContainsEntity(c.entityD) || + c.type == Constraint::Type::COMMENT) { continue; } - SS.clipboard.c.Add(c); + SS.clipboard.c.Add(&c); } } @@ -282,7 +281,7 @@ void GraphicsWindow::PasteClipboard(Vector trans, double theta, double scale) { } case Constraint::Type::HORIZONTAL: case Constraint::Type::VERTICAL: - // When rotating 90 or 270 degrees, swap the vertical / horizontal constaints + // When rotating 90 or 270 degrees, swap the vertical / horizontal constraints if (EXACT(fmod(theta + (PI/2), PI) == 0)) { if(c.type == Constraint::Type::HORIZONTAL) { c.type = Constraint::Type::VERTICAL; diff --git a/src/confscreen.cpp b/src/confscreen.cpp index c7e2815a..1e2e82a6 100644 --- a/src/confscreen.cpp +++ b/src/confscreen.cpp @@ -9,24 +9,6 @@ #include #endif -void TextWindow::ScreenChangeLightDirection(int link, uint32_t v) { - SS.TW.ShowEditControl(8, ssprintf("%.2f, %.2f, %.2f", CO(SS.lightDir[v]))); - SS.TW.edit.meaning = Edit::LIGHT_DIRECTION; - SS.TW.edit.i = v; -} - -void TextWindow::ScreenChangeLightIntensity(int link, uint32_t v) { - SS.TW.ShowEditControl(31, ssprintf("%.2f", SS.lightIntensity[v])); - SS.TW.edit.meaning = Edit::LIGHT_INTENSITY; - SS.TW.edit.i = v; -} - -void TextWindow::ScreenChangeLightAmbient(int link, uint32_t v) { - SS.TW.ShowEditControl(31, ssprintf("%.2f", SS.ambientIntensity)); - SS.TW.edit.meaning = Edit::LIGHT_AMBIENT; - SS.TW.edit.i = 0; -} - void TextWindow::ScreenChangeColor(int link, uint32_t v) { SS.TW.ShowEditControlWithColorPicker(13, SS.modelColor[v]); @@ -58,13 +40,8 @@ void TextWindow::ScreenChangeExportMaxSegments(int link, uint32_t v) { SS.TW.edit.i = 1; } -void TextWindow::ScreenChangeCameraTangent(int link, uint32_t v) { - SS.TW.ShowEditControl(3, ssprintf("%.3f", 1000*SS.cameraTangent)); - SS.TW.edit.meaning = Edit::CAMERA_TANGENT; -} - void TextWindow::ScreenChangeGridSpacing(int link, uint32_t v) { - SS.TW.ShowEditControl(3, SS.MmToString(SS.gridSpacing)); + SS.TW.ShowEditControl(3, SS.MmToString(SS.gridSpacing, true)); SS.TW.edit.meaning = Edit::GRID_SPACING; } @@ -89,7 +66,7 @@ void TextWindow::ScreenChangeExportScale(int link, uint32_t v) { } void TextWindow::ScreenChangeExportOffset(int link, uint32_t v) { - SS.TW.ShowEditControl(3, SS.MmToString(SS.exportOffset)); + SS.TW.ShowEditControl(3, SS.MmToString(SS.exportOffset, true)); SS.TW.edit.meaning = Edit::EXPORT_OFFSET; } @@ -171,7 +148,7 @@ void TextWindow::ScreenChangeCanvasSize(int link, uint32_t v) { } int col = 13; if(v < 10) col = 11; - SS.TW.ShowEditControl(col, SS.MmToString(d)); + SS.TW.ShowEditControl(col, SS.MmToString(d, true)); SS.TW.edit.meaning = Edit::CANVAS_SIZE; SS.TW.edit.i = v; } @@ -181,7 +158,12 @@ void TextWindow::ScreenChangeGCodeParameter(int link, uint32_t v) { switch(link) { case 'd': SS.TW.edit.meaning = Edit::G_CODE_DEPTH; - buf += SS.MmToString(SS.gCode.depth); + buf += SS.MmToString(SS.gCode.depth, true); + break; + + case 'h': + SS.TW.edit.meaning = Edit::G_CODE_SAFE_HEIGHT; + buf += SS.MmToString(SS.gCode.safeHeight, true); break; case 's': @@ -191,12 +173,12 @@ void TextWindow::ScreenChangeGCodeParameter(int link, uint32_t v) { case 'F': SS.TW.edit.meaning = Edit::G_CODE_FEED; - buf += SS.MmToString(SS.gCode.feed); + buf += SS.MmToString(SS.gCode.feed, true); break; case 'P': SS.TW.edit.meaning = Edit::G_CODE_PLUNGE_FEED; - buf += SS.MmToString(SS.gCode.plungeFeed); + buf += SS.MmToString(SS.gCode.plungeFeed, true); break; } SS.TW.ShowEditControl(14, buf); @@ -227,20 +209,6 @@ void TextWindow::ShowConfiguration() { &ScreenChangeColor, i); } - Printf(false, ""); - Printf(false, "%Ft light direction intensity"); - for(i = 0; i < 2; i++) { - Printf(false, "%Bp #%d (%2,%2,%2)%Fl%D%f%Ll[c]%E " - "%2 %Fl%D%f%Ll[c]%E", - (i & 1) ? 'd' : 'a', i, - CO(SS.lightDir[i]), i, &ScreenChangeLightDirection, - SS.lightIntensity[i], i, &ScreenChangeLightIntensity); - } - Printf(false, "%Bp ambient lighting " - "%2 %Fl%D%f%Ll[c]%E", - (i & 1) ? 'd' : 'a', i, - SS.ambientIntensity, &ScreenChangeLightAmbient); - Printf(false, ""); Printf(false, "%Ft chord tolerance (in percents)%E"); Printf(false, "%Ba %@ %% %Fl%Ll%f%D[change]%E; %@ mm, %d triangles", @@ -262,11 +230,6 @@ void TextWindow::ShowConfiguration() { SS.exportMaxSegments, &ScreenChangeExportMaxSegments); - Printf(false, ""); - Printf(false, "%Ft perspective factor (0 for parallel)%E"); - Printf(false, "%Ba %# %Fl%Ll%f%D[change]%E", - SS.cameraTangent*1000, - &ScreenChangeCameraTangent, 0); Printf(false, "%Ft snap grid spacing%E"); Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E", SS.MmToString(SS.gridSpacing).c_str(), @@ -461,6 +424,11 @@ bool TextWindow::EditControlDoneForConfiguration(const std::string &s) { SS.GW.Invalidate(); break; } + case Edit::EXPLODE_DISTANCE: { + SS.explodeDistance = min(1e4, max(-1e4, SS.StringToMm(s))); + SS.MarkGroupDirty(SS.GW.activeGroup, true); + break; + } case Edit::DIGITS_AFTER_DECIMAL: { int v = atoi(s.c_str()); if(v < 0 || v > 8) { @@ -529,6 +497,11 @@ bool TextWindow::EditControlDoneForConfiguration(const std::string &s) { if(e) SS.gCode.depth = (float)SS.ExprToMm(e); break; } + case Edit::G_CODE_SAFE_HEIGHT: { + Expr *e = Expr::From(s, /*popUpError=*/true); + if(e) SS.gCode.safeHeight = (float)SS.ExprToMm(e); + break; + } case Edit::G_CODE_PASSES: { Expr *e = Expr::From(s, /*popUpError=*/true); if(e) SS.gCode.passes = (int)(e->Eval()); diff --git a/src/constraint.cpp b/src/constraint.cpp index 435fc3ac..6a25c265 100644 --- a/src/constraint.cpp +++ b/src/constraint.cpp @@ -22,7 +22,11 @@ std::string Constraint::DescriptionString() const { case Type::EQ_LEN_PT_LINE_D: s = C_("constr-name", "eq-length-and-pt-ln-dist"); break; case Type::EQ_PT_LN_DISTANCES: s = C_("constr-name", "eq-pt-line-distances"); break; case Type::LENGTH_RATIO: s = C_("constr-name", "length-ratio"); break; + case Type::ARC_ARC_LEN_RATIO: s = C_("constr-name", "arc-arc-length-ratio"); break; + case Type::ARC_LINE_LEN_RATIO: s = C_("constr-name", "arc-line-length-ratio"); break; case Type::LENGTH_DIFFERENCE: s = C_("constr-name", "length-difference"); break; + case Type::ARC_ARC_DIFFERENCE: s = C_("constr-name", "arc-arc-len-difference"); break; + case Type::ARC_LINE_DIFFERENCE: s = C_("constr-name", "arc-line-len-difference"); break; case Type::SYMMETRIC: s = C_("constr-name", "symmetric"); break; case Type::SYMMETRIC_HORIZ: s = C_("constr-name", "symmetric-h"); break; case Type::SYMMETRIC_VERT: s = C_("constr-name", "symmetric-v"); break; @@ -384,10 +388,27 @@ void Constraint::MenuConstrain(Command id) { c.type = Type::LENGTH_RATIO; c.entityA = gs.entity[0]; c.entityB = gs.entity[1]; + } + else if(gs.arcs == 2 && gs.n == 2) { + c.type = Type::ARC_ARC_LEN_RATIO; + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } + else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) { + c.type = Type::ARC_LINE_LEN_RATIO; + if(SK.GetEntity(gs.entity[0])->type == Entity::Type::ARC_OF_CIRCLE) { + c.entityA = gs.entity[1]; + c.entityB = gs.entity[0]; + } else { + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } } else { Error(_("Bad selection for length ratio constraint. This " "constraint can apply to:\n\n" - " * two line segments\n")); + " * two line segments\n" + " * two arcs\n" + " * one arc and one line segment\n")); return; } @@ -401,10 +422,27 @@ void Constraint::MenuConstrain(Command id) { c.type = Type::LENGTH_DIFFERENCE; c.entityA = gs.entity[0]; c.entityB = gs.entity[1]; + } + else if(gs.arcs == 2 && gs.n == 2) { + c.type = Type::ARC_ARC_DIFFERENCE; + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } + else if(gs.lineSegments == 1 && gs.arcs == 1 && gs.n == 2) { + c.type = Type::ARC_LINE_DIFFERENCE; + if(SK.GetEntity(gs.entity[0])->type == Entity::Type::ARC_OF_CIRCLE) { + c.entityA = gs.entity[1]; + c.entityB = gs.entity[0]; + } else { + c.entityA = gs.entity[0]; + c.entityB = gs.entity[1]; + } } else { Error(_("Bad selection for length difference constraint. This " "constraint can apply to:\n\n" - " * two line segments\n")); + " * two line segments\n" + " * two arcs\n" + " * one arc and one line segment\n")); return; } @@ -767,10 +805,19 @@ void Constraint::MenuConstrain(Command id) { break; case Command::COMMENT: - SS.GW.pending.operation = GraphicsWindow::Pending::COMMAND; - SS.GW.pending.command = Command::COMMENT; - SS.GW.pending.description = _("click center of comment text"); - SS.ScheduleShowTW(); + if(gs.points == 1 && gs.n == 1) { + c.type = Type::COMMENT; + c.ptA = gs.point[0]; + c.group = SS.GW.activeGroup; + c.workplane = SS.GW.ActiveWorkplane(); + c.comment = _("NEW COMMENT -- DOUBLE-CLICK TO EDIT"); + AddConstraint(&c); + } else { + SS.GW.pending.operation = GraphicsWindow::Pending::COMMAND; + SS.GW.pending.command = Command::COMMENT; + SS.GW.pending.description = _("click center of comment text"); + SS.ScheduleShowTW(); + } break; default: ssassert(false, "Unexpected menu ID"); diff --git a/src/constrainteq.cpp b/src/constrainteq.cpp index 965a13d0..c21d1072 100644 --- a/src/constrainteq.cpp +++ b/src/constrainteq.cpp @@ -18,7 +18,11 @@ bool ConstraintBase::HasLabel() const { case Type::PROJ_PT_DISTANCE: case Type::DIAMETER: case Type::LENGTH_RATIO: + case Type::ARC_ARC_LEN_RATIO: + case Type::ARC_LINE_LEN_RATIO: case Type::LENGTH_DIFFERENCE: + case Type::ARC_ARC_DIFFERENCE: + case Type::ARC_LINE_DIFFERENCE: case Type::ANGLE: case Type::COMMENT: return true; @@ -39,7 +43,11 @@ bool ConstraintBase::IsProjectible() const { case Type::EQ_PT_LN_DISTANCES: case Type::EQUAL_ANGLE: case Type::LENGTH_RATIO: + case Type::ARC_ARC_LEN_RATIO: + case Type::ARC_LINE_LEN_RATIO: case Type::LENGTH_DIFFERENCE: + case Type::ARC_ARC_DIFFERENCE: + case Type::ARC_LINE_DIFFERENCE: case Type::SYMMETRIC: case Type::SYMMETRIC_HORIZ: case Type::SYMMETRIC_VERT: @@ -334,6 +342,110 @@ void ConstraintBase::GenerateEquations(IdList *l, AddEq(l, (la->Div(lb))->Minus(exA), 0); return; } + + case Type::ARC_ARC_LEN_RATIO: { + EntityBase *arc1 = SK.GetEntity(entityA), + *arc2 = SK.GetEntity(entityB); + + // And get the arc1 radius, and the cosine of its angle + EntityBase *ao1 = SK.GetEntity(arc1->point[0]), + *as1 = SK.GetEntity(arc1->point[1]), + *af1 = SK.GetEntity(arc1->point[2]); + + ExprVector aos1 = (as1->PointGetExprs()).Minus(ao1->PointGetExprs()), + aof1 = (af1->PointGetExprs()).Minus(ao1->PointGetExprs()); + Expr *r1 = aof1.Magnitude(); + + ExprVector n1 = arc1->Normal()->NormalExprsN(); + ExprVector u1 = aos1.WithMagnitude(Expr::From(1.0)); + ExprVector v1 = n1.Cross(u1); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta1 = aof1.Dot(u1)->Div(r1); + Expr *sintheta1 = aof1.Dot(v1)->Div(r1); + + double thetas1, thetaf1, dtheta1; + arc1->ArcGetAngles(&thetas1, &thetaf1, &dtheta1); + Expr *theta1; + if(dtheta1 < 3*PI/4) { + theta1 = costheta1->ACos(); + } else if(dtheta1 < 5*PI/4) { + // As the angle crosses pi, cos theta1 is not invertible; + // so use the sine to stop blowing up + theta1 = Expr::From(PI)->Minus(sintheta1->ASin()); + } else { + theta1 = (Expr::From(2*PI))->Minus(costheta1->ACos()); + } + + // And get the arc2 radius, and the cosine of its angle + EntityBase *ao2 = SK.GetEntity(arc2->point[0]), + *as2 = SK.GetEntity(arc2->point[1]), + *af2 = SK.GetEntity(arc2->point[2]); + + ExprVector aos2 = (as2->PointGetExprs()).Minus(ao2->PointGetExprs()), + aof2 = (af2->PointGetExprs()).Minus(ao2->PointGetExprs()); + Expr *r2 = aof2.Magnitude(); + + ExprVector n2 = arc2->Normal()->NormalExprsN(); + ExprVector u2 = aos2.WithMagnitude(Expr::From(1.0)); + ExprVector v2 = n2.Cross(u2); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta2 = aof2.Dot(u2)->Div(r2); + Expr *sintheta2 = aof2.Dot(v2)->Div(r2); + + double thetas2, thetaf2, dtheta2; + arc2->ArcGetAngles(&thetas2, &thetaf2, &dtheta2); + Expr *theta2; + if(dtheta2 < 3*PI/4) { + theta2 = costheta2->ACos(); + } else if(dtheta2 < 5*PI/4) { + // As the angle crosses pi, cos theta2 is not invertible; + // so use the sine to stop blowing up + theta2 = Expr::From(PI)->Minus(sintheta2->ASin()); + } else { + theta2 = (Expr::From(2*PI))->Minus(costheta2->ACos()); + } + // And write the equation; (r1*theta1) / ( r2*theta2) = some ratio + AddEq(l, (r1->Times(theta1))->Div(r2->Times(theta2))->Minus(exA), 0); + return; + } + + case Type::ARC_LINE_LEN_RATIO: { + EntityBase *line = SK.GetEntity(entityA), + *arc1 = SK.GetEntity(entityB); + + Expr *ll = Distance(workplane, line->point[0], line->point[1]); + + // And get the arc1 radius, and the cosine of its angle + EntityBase *ao1 = SK.GetEntity(arc1->point[0]), + *as1 = SK.GetEntity(arc1->point[1]), + *af1 = SK.GetEntity(arc1->point[2]); + + ExprVector aos1 = (as1->PointGetExprs()).Minus(ao1->PointGetExprs()), + aof1 = (af1->PointGetExprs()).Minus(ao1->PointGetExprs()); + Expr *r1 = aof1.Magnitude(); + ExprVector n1 = arc1->Normal()->NormalExprsN(); + ExprVector u1 = aos1.WithMagnitude(Expr::From(1.0)); + ExprVector v1 = n1.Cross(u1); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta1 = aof1.Dot(u1)->Div(r1); + Expr *sintheta1 = aof1.Dot(v1)->Div(r1); + + double thetas1, thetaf1, dtheta1; + arc1->ArcGetAngles(&thetas1, &thetaf1, &dtheta1); + Expr *theta1; + if(dtheta1 < 3*PI/4) { + theta1 = costheta1->ACos(); + } else if(dtheta1 < 5*PI/4) { + // As the angle crosses pi, cos theta1 is not invertible; + // so use the sine to stop blowing up + theta1 = Expr::From(PI)->Minus(sintheta1->ASin()); + } else { + theta1 = (Expr::From(2*PI))->Minus(costheta1->ACos()); + } + // And write the equation; (r1*theta1) / ( length) = some ratio + AddEq(l, (r1->Times(theta1))->Div(ll)->Minus(exA), 0); + return; + } case Type::LENGTH_DIFFERENCE: { EntityBase *a = SK.GetEntity(entityA); @@ -343,7 +455,111 @@ void ConstraintBase::GenerateEquations(IdList *l, AddEq(l, (la->Minus(lb))->Minus(exA), 0); return; } + + case Type::ARC_ARC_DIFFERENCE: { + EntityBase *arc1 = SK.GetEntity(entityA), + *arc2 = SK.GetEntity(entityB); + // And get the arc1 radius, and the cosine of its angle + EntityBase *ao1 = SK.GetEntity(arc1->point[0]), + *as1 = SK.GetEntity(arc1->point[1]), + *af1 = SK.GetEntity(arc1->point[2]); + + ExprVector aos1 = (as1->PointGetExprs()).Minus(ao1->PointGetExprs()), + aof1 = (af1->PointGetExprs()).Minus(ao1->PointGetExprs()); + Expr *r1 = aof1.Magnitude(); + + ExprVector n1 = arc1->Normal()->NormalExprsN(); + ExprVector u1 = aos1.WithMagnitude(Expr::From(1.0)); + ExprVector v1 = n1.Cross(u1); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta1 = aof1.Dot(u1)->Div(r1); + Expr *sintheta1 = aof1.Dot(v1)->Div(r1); + + double thetas1, thetaf1, dtheta1; + arc1->ArcGetAngles(&thetas1, &thetaf1, &dtheta1); + Expr *theta1; + if(dtheta1 < 3*PI/4) { + theta1 = costheta1->ACos(); + } else if(dtheta1 < 5*PI/4) { + // As the angle crosses pi, cos theta1 is not invertible; + // so use the sine to stop blowing up + theta1 = Expr::From(PI)->Minus(sintheta1->ASin()); + } else { + theta1 = (Expr::From(2*PI))->Minus(costheta1->ACos()); + } + + // And get the arc2 radius, and the cosine of its angle + EntityBase *ao2 = SK.GetEntity(arc2->point[0]), + *as2 = SK.GetEntity(arc2->point[1]), + *af2 = SK.GetEntity(arc2->point[2]); + + ExprVector aos2 = (as2->PointGetExprs()).Minus(ao2->PointGetExprs()), + aof2 = (af2->PointGetExprs()).Minus(ao2->PointGetExprs()); + Expr *r2 = aof2.Magnitude(); + + ExprVector n2 = arc2->Normal()->NormalExprsN(); + ExprVector u2 = aos2.WithMagnitude(Expr::From(1.0)); + ExprVector v2 = n2.Cross(u2); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta2 = aof2.Dot(u2)->Div(r2); + Expr *sintheta2 = aof2.Dot(v2)->Div(r2); + + double thetas2, thetaf2, dtheta2; + arc2->ArcGetAngles(&thetas2, &thetaf2, &dtheta2); + Expr *theta2; + if(dtheta2 < 3*PI/4) { + theta2 = costheta2->ACos(); + } else if(dtheta2 < 5*PI/4) { + // As the angle crosses pi, cos theta2 is not invertible; + // so use the sine to stop blowing up + theta2 = Expr::From(PI)->Minus(sintheta2->ASin()); + } else { + theta2 = (Expr::From(2*PI))->Minus(costheta2->ACos()); + } + // And write the equation; (r1*theta1) - ( r2*theta2) = some difference + AddEq(l, (r1->Times(theta1))->Minus(r2->Times(theta2))->Minus(exA), 0); + return; + } + + case Type::ARC_LINE_DIFFERENCE: { + EntityBase *line = SK.GetEntity(entityA), + *arc1 = SK.GetEntity(entityB); + + Expr *ll = Distance(workplane, line->point[0], line->point[1]); + + // And get the arc1 radius, and the cosine of its angle + EntityBase *ao1 = SK.GetEntity(arc1->point[0]), + *as1 = SK.GetEntity(arc1->point[1]), + *af1 = SK.GetEntity(arc1->point[2]); + + ExprVector aos1 = (as1->PointGetExprs()).Minus(ao1->PointGetExprs()), + aof1 = (af1->PointGetExprs()).Minus(ao1->PointGetExprs()); + Expr *r1 = aof1.Magnitude(); + ExprVector n1 = arc1->Normal()->NormalExprsN(); + ExprVector u1 = aos1.WithMagnitude(Expr::From(1.0)); + ExprVector v1 = n1.Cross(u1); + // so in our new csys, we start at (1, 0, 0) + Expr *costheta1 = aof1.Dot(u1)->Div(r1); + Expr *sintheta1 = aof1.Dot(v1)->Div(r1); + + double thetas1, thetaf1, dtheta1; + arc1->ArcGetAngles(&thetas1, &thetaf1, &dtheta1); + Expr *theta1; + if(dtheta1 < 3*PI/4) { + theta1 = costheta1->ACos(); + } else if(dtheta1 < 5*PI/4) { + // As the angle crosses pi, cos theta1 is not invertible; + // so use the sine to stop blowing up + theta1 = Expr::From(PI)->Minus(sintheta1->ASin()); + } else { + theta1 = (Expr::From(2*PI))->Minus(costheta1->ACos()); + } + // And write the equation; (r1*theta1) - ( length) = some difference + AddEq(l, (r1->Times(theta1))->Minus(ll)->Minus(exA), 0); + return; + } + case Type::DIAMETER: { EntityBase *circle = SK.GetEntity(entityA); Expr *r = circle->CircleGetRadiusExpr(); @@ -511,7 +727,7 @@ void ConstraintBase::GenerateEquations(IdList *l, } } return; - + case Type::SYMMETRIC: if(workplane == EntityBase::FREE_IN_3D) { EntityBase *plane = SK.GetEntity(entityA); diff --git a/src/draw.cpp b/src/draw.cpp index ccaeb961..3610f201 100644 --- a/src/draw.cpp +++ b/src/draw.cpp @@ -210,16 +210,15 @@ void GraphicsWindow::SelectByMarquee() { BBox marqueeBBox = BBox::From(Vector::From(marqueePoint.x, marqueePoint.y, VERY_NEGATIVE), Vector::From(orig.mouse.x, orig.mouse.y, VERY_POSITIVE)); - Entity *e; - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(e->group != SS.GW.activeGroup) continue; - if(e->IsFace() || e->IsDistance()) continue; - if(!e->IsVisible()) continue; + for(Entity &e : SK.entity) { + if(e.group != SS.GW.activeGroup) continue; + if(e.IsFace() || e.IsDistance()) continue; + if(!e.IsVisible()) continue; bool entityHasBBox; - BBox entityBBox = e->GetOrGenerateScreenBBox(&entityHasBBox); + BBox entityBBox = e.GetOrGenerateScreenBBox(&entityHasBBox); if(entityHasBBox && entityBBox.Overlaps(marqueeBBox)) { - MakeSelected(e->h); + MakeSelected(e.h); } } } @@ -412,8 +411,8 @@ void GraphicsWindow::HitTestMakeSelection(Point2d mp) { cached.projRight = projRight; cached.projUp = projUp; cached.scale = scale; - for(Entity *e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - e->screenBBoxValid = false; + for(Entity &e : SK.entity) { + e.screenBBoxValid = false; } } diff --git a/src/drawconstraint.cpp b/src/drawconstraint.cpp index 2cdb9afc..02aababb 100644 --- a/src/drawconstraint.cpp +++ b/src/drawconstraint.cpp @@ -12,7 +12,7 @@ std::string Constraint::Label() const { std::string result; if(type == Type::ANGLE) { result = SS.DegreeToString(valA) + "°"; - } else if(type == Type::LENGTH_RATIO) { + } else if(type == Type::LENGTH_RATIO || type == Type::ARC_ARC_LEN_RATIO || type == Type::ARC_LINE_LEN_RATIO) { result = ssprintf("%.3f:1", valA); } else if(type == Type::COMMENT) { result = comment; @@ -267,7 +267,7 @@ void Constraint::DoEqualRadiusTicks(Canvas *canvas, Canvas::hStroke hcs, const Camera &camera = canvas->GetCamera(); Entity *circ = SK.GetEntity(he); - Vector center = SK.GetEntity(circ->point[0])->PointGetNum(); + Vector center = SK.GetEntity(circ->point[0])->PointGetDrawNum(); double r = circ->CircleGetRadiusNum(); Quaternion q = circ->Normal()->NormalGetNum(); Vector u = q.RotationU(), v = q.RotationV(); @@ -291,7 +291,8 @@ void Constraint::DoEqualRadiusTicks(Canvas *canvas, Canvas::hStroke hcs, void Constraint::DoArcForAngle(Canvas *canvas, Canvas::hStroke hcs, Vector a0, Vector da, Vector b0, Vector db, - Vector offset, Vector *ref, bool trim) + Vector offset, Vector *ref, bool trim, + Vector explodeOffset) { const Camera &camera = canvas->GetCamera(); double pixels = 1.0 / camera.scale; @@ -305,6 +306,9 @@ void Constraint::DoArcForAngle(Canvas *canvas, Canvas::hStroke hcs, db = db.ProjectVectorInto(workplane); } + a0 = a0.Plus(explodeOffset); + b0 = b0.Plus(explodeOffset); + Vector a1 = a0.Plus(da); Vector b1 = b0.Plus(db); @@ -534,6 +538,15 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, DoProjectedPoint(canvas, hcs, &bp); } + if(ShouldDrawExploded()) { + // Offset A and B by the same offset so the constraint is drawn + // in the plane of one of the exploded points (rather than at an + // angle) + Vector offset = SK.GetEntity(ptA)->ExplodeOffset(); + ap = ap.Plus(offset); + bp = bp.Plus(offset); + } + Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(disp.offset); if(refs) refs->push_back(ref); @@ -548,6 +561,19 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, dp = (bp.Minus(ap)), pp = SK.GetEntity(entityA)->VectorGetNum(); + if(ShouldDrawExploded()) { + // explode for whichever point is in the workplane (or the first if both are) + Entity *pt = SK.GetEntity(ptA); + if(pt->group != group) { + pt = SK.GetEntity(ptB); + } + if(pt->group == group) { + Vector offset = pt->ExplodeOffset(); + ap = ap.Plus(offset); + bp = bp.Plus(offset); + } + } + Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(disp.offset); if(refs) refs->push_back(ref); @@ -564,7 +590,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, case Type::PT_FACE_DISTANCE: case Type::PT_PLANE_DISTANCE: { - Vector pt = SK.GetEntity(ptA)->PointGetNum(); + Vector pt = SK.GetEntity(ptA)->PointGetDrawNum(); Entity *enta = SK.GetEntity(entityA); Vector n, p; if(type == Type::PT_PLANE_DISTANCE) { @@ -590,7 +616,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } case Type::PT_LINE_DISTANCE: { - Vector pt = SK.GetEntity(ptA)->PointGetNum(); + Entity *ptEntity = SK.GetEntity(ptA); + Vector pt = ptEntity->PointGetNum(); Entity *line = SK.GetEntity(entityA); Vector lA = SK.GetEntity(line->point[0])->PointGetNum(); Vector lB = SK.GetEntity(line->point[1])->PointGetNum(); @@ -602,6 +629,19 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, DoProjectedPoint(canvas, hcs, &pt); } + // Only explode if the point and line are in the same group (and that group is a sketch + // with explode enabled) otherwise it's too visually confusing to figure out what the + // correct projections should be. + bool shouldExplode = ShouldDrawExploded() + && ptEntity->group == group + && line->group == group; + if(shouldExplode) { + Vector explodeOffset = ptEntity->ExplodeOffset(); + pt = pt.Plus(explodeOffset); + lA = lA.Plus(explodeOffset); + lB = lB.Plus(explodeOffset); + } + // Find the closest point on the line Vector closest = pt.ClosestPointOnLine(lA, dl); @@ -655,7 +695,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, case Type::DIAMETER: { Entity *circle = SK.GetEntity(entityA); - Vector center = SK.GetEntity(circle->point[0])->PointGetNum(); + Vector center = SK.GetEntity(circle->point[0])->PointGetDrawNum(); Quaternion q = SK.GetEntity(circle->normal)->NormalGetNum(); Vector n = q.RotationN().WithMagnitude(1); double r = circle->CircleGetRadiusNum(); @@ -697,7 +737,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, Vector r = camera.projRight.ScaledBy((a+1)/camera.scale); Vector d = camera.projUp.ScaledBy((2-a)/camera.scale); for(int i = 0; i < 2; i++) { - Vector p = SK.GetEntity(i == 0 ? ptA : ptB)-> PointGetNum(); + Vector p = SK.GetEntity(i == 0 ? ptA : ptB)->PointGetDrawNum(); if(refs) refs->push_back(p); canvas->DrawQuad(p.Plus (r).Plus (d), p.Plus (r).Minus(d), @@ -715,7 +755,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, case Type::PT_ON_FACE: case Type::PT_IN_PLANE: { double s = 8/camera.scale; - Vector p = SK.GetEntity(ptA)->PointGetNum(); + Vector p = SK.GetEntity(ptA)->PointGetDrawNum(); if(refs) refs->push_back(p); Vector r, d; if(type == Type::PT_ON_FACE) { @@ -740,7 +780,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } case Type::WHERE_DRAGGED: { - Vector p = SK.GetEntity(ptA)->PointGetNum(); + Vector p = SK.GetEntity(ptA)->PointGetDrawNum(); if(refs) refs->push_back(p); Vector u = p.Plus(gu.WithMagnitude(8/camera.scale)).Plus( gr.WithMagnitude(8/camera.scale)), @@ -797,10 +837,10 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } DoArcForAngle(canvas, hcs, a0, da, b0, db, - da.WithMagnitude(40/camera.scale), &ref, /*trim=*/false); + da.WithMagnitude(40/camera.scale), &ref, /*trim=*/false, a->ExplodeOffset()); if(refs) refs->push_back(ref); DoArcForAngle(canvas, hcs, c0, dc, d0, dd, - dc.WithMagnitude(40/camera.scale), &ref, /*trim=*/false); + dc.WithMagnitude(40/camera.scale), &ref, /*trim=*/false, c->ExplodeOffset()); if(refs) refs->push_back(ref); return; @@ -820,7 +860,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } Vector ref; - DoArcForAngle(canvas, hcs, a0, da, b0, db, disp.offset, &ref, /*trim=*/true); + DoArcForAngle(canvas, hcs, a0, da, b0, db, disp.offset, &ref, /*trim=*/true, a->ExplodeOffset()); DoLabel(canvas, hcs, ref, labelPos, gr, gu); if(refs) refs->push_back(ref); return; @@ -855,7 +895,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, if(u.Dot(ru) < 0) u = u.ScaledBy(-1); } - Vector p = e->VectorGetRefPoint(); + Vector p = e->VectorGetRefPoint().Plus(e->ExplodeOffset()); Vector s = p.Plus(u).Plus(v); DoLine(canvas, hcs, s, s.Plus(v)); Vector m = s.Plus(v.ScaledBy(0.5)); @@ -873,9 +913,9 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, if(type == Type::ARC_LINE_TANGENT) { Entity *arc = SK.GetEntity(entityA); Entity *norm = SK.GetEntity(arc->normal); - Vector c = SK.GetEntity(arc->point[0])->PointGetNum(); + Vector c = SK.GetEntity(arc->point[0])->PointGetDrawNum(); Vector p = - SK.GetEntity(arc->point[other ? 2 : 1])->PointGetNum(); + SK.GetEntity(arc->point[other ? 2 : 1])->PointGetDrawNum(); Vector r = p.Minus(c); textAt = p.Plus(r.WithMagnitude(14/camera.scale)); u = norm->NormalU(); @@ -896,6 +936,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, Entity *cubic = SK.GetEntity(entityA); Vector p = other ? cubic->CubicGetFinishNum() : cubic->CubicGetStartNum(); + p = p.Plus(cubic->ExplodeOffset()); Vector dir = SK.GetEntity(entityB)->VectorGetNum(); Vector out = n.Cross(dir); textAt = p.Plus(out.WithMagnitude(14/camera.scale)); @@ -905,12 +946,12 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, u = wn->NormalU(); v = wn->NormalV(); n = wn->NormalN(); - EntityBase *eA = SK.GetEntity(entityA); + Entity *eA = SK.GetEntity(entityA); // Big pain; we have to get a vector tangent to the curve // at the shared point, which could be from either a cubic // or an arc. if(other) { - textAt = eA->EndpointFinish(); + textAt = eA->EndpointFinish().Plus(eA->ExplodeOffset()); if(eA->type == Entity::Type::CUBIC) { dir = eA->CubicGetFinishTangentNum(); } else { @@ -919,7 +960,7 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, dir = n.Cross(dir); } } else { - textAt = eA->EndpointStart(); + textAt = eA->EndpointStart().Plus(eA->ExplodeOffset()); if(eA->type == Entity::Type::CUBIC) { dir = eA->CubicGetStartTangentNum(); } else { @@ -947,6 +988,10 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, Vector u = (gn.Cross(n)).WithMagnitude(4/camera.scale); Vector p = e->VectorGetRefPoint(); + if(ShouldDrawExploded()) { + p = p.Plus(e->ExplodeOffset()); + } + DoLine(canvas, hcs, p.Plus(u), p.Plus(u).Plus(n)); DoLine(canvas, hcs, p.Minus(u), p.Minus(u).Plus(n)); if(refs) refs->push_back(p.Plus(n.ScaledBy(0.5))); @@ -967,8 +1012,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, Entity *line = SK.GetEntity(entityA); Vector ref; DoEqualLenTicks(canvas, hcs, - SK.GetEntity(line->point[0])->PointGetNum(), - SK.GetEntity(line->point[1])->PointGetNum(), + SK.GetEntity(line->point[0])->PointGetDrawNum(), + SK.GetEntity(line->point[1])->PointGetDrawNum(), gn, &ref); if(refs) refs->push_back(ref); DoEqualRadiusTicks(canvas, hcs, entityB, &ref); @@ -990,6 +1035,12 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, DoProjectedPoint(canvas, hcs, &b); } + if(ShouldDrawExploded()) { + Vector offset = e->ExplodeOffset(); + a = a.Plus(offset); + b = b.Plus(offset); + } + Vector ref; DoEqualLenTicks(canvas, hcs, a, b, gn, &ref); if(refs) refs->push_back(ref); @@ -1000,7 +1051,42 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } return; } + case Type::ARC_ARC_LEN_RATIO: + case Type::ARC_ARC_DIFFERENCE: { + Entity *circle = SK.GetEntity(entityA); + Vector center = SK.GetEntity(circle->point[0])->PointGetNum(); + Quaternion q = SK.GetEntity(circle->normal)->NormalGetNum(); + Vector n = q.RotationN().WithMagnitude(1); + Vector ref2; + DoEqualRadiusTicks(canvas, hcs, entityA, &ref2); + DoEqualRadiusTicks(canvas, hcs, entityB, &ref2); + + Vector ref = center.Plus(disp.offset); + // Force the label into the same plane as the circle. + ref = ref.Minus(n.ScaledBy(n.Dot(ref) - n.Dot(center))); + if(refs) refs->push_back(ref); + Vector topLeft; + DoLabel(canvas, hcs, ref, &topLeft, gr, gu); + if(labelPos) *labelPos = topLeft; + return; + } + case Type::ARC_LINE_LEN_RATIO: + case Type::ARC_LINE_DIFFERENCE: { + Vector a, b = Vector::From(0, 0, 0); + Vector ref; + Entity *e = SK.GetEntity(entityA); + a = SK.GetEntity(e->point[0])->PointGetNum(); + b = SK.GetEntity(e->point[1])->PointGetNum(); + DoEqualLenTicks(canvas, hcs, a, b, gn, &ref); + if(refs) refs->push_back(ref); + DoEqualRadiusTicks(canvas, hcs, entityB, &ref); + if(refs) refs->push_back(ref); + ref = ((a.Plus(b)).ScaledBy(0.5)).Plus(disp.offset); + DoLabel(canvas, hcs, ref, labelPos, gr, gu); + return; + } + case Type::EQ_LEN_PT_LINE_D: { Entity *forLen = SK.GetEntity(entityA); Vector a = SK.GetEntity(forLen->point[0])->PointGetNum(), @@ -1009,6 +1095,11 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, DoProjectedPoint(canvas, hcs, &a); DoProjectedPoint(canvas, hcs, &b); } + if(ShouldDrawExploded()) { + Vector offset = forLen->ExplodeOffset(); + a = a.Plus(offset); + b = b.Plus(offset); + } Vector refa; DoEqualLenTicks(canvas, hcs, a, b, gn, &refa); if(refs) refs->push_back(refa); @@ -1024,6 +1115,11 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } Vector closest = pt.ClosestPointOnLine(la, lb.Minus(la)); + if(ShouldDrawExploded()) { + Vector offset = SK.GetEntity(ptA)->ExplodeOffset(); + pt = pt.Plus(offset); + closest = closest.Plus(offset); + } DoLine(canvas, hcs, pt, closest); Vector refb; DoEqualLenTicks(canvas, hcs, pt, closest, gn, &refb); @@ -1046,6 +1142,11 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, } Vector closest = pt.ClosestPointOnLine(la, lb.Minus(la)); + if(ShouldDrawExploded()) { + Vector offset = pte->ExplodeOffset(); + pt = pt.Plus(offset); + closest = closest.Plus(offset); + } DoLine(canvas, hcs, pt, closest); Vector ref; @@ -1075,8 +1176,8 @@ void Constraint::DoLayout(DrawAs how, Canvas *canvas, goto s; } s: - Vector a = SK.GetEntity(ptA)->PointGetNum(); - Vector b = SK.GetEntity(ptB)->PointGetNum(); + Vector a = SK.GetEntity(ptA)->PointGetDrawNum(); + Vector b = SK.GetEntity(ptB)->PointGetDrawNum(); for(int i = 0; i < 2; i++) { Vector tail = (i == 0) ? a : b; @@ -1113,8 +1214,8 @@ s: } // For "at midpoint", this branch is always taken. Entity *e = SK.GetEntity(entityA); - Vector a = SK.GetEntity(e->point[0])->PointGetNum(); - Vector b = SK.GetEntity(e->point[1])->PointGetNum(); + Vector a = SK.GetEntity(e->point[0])->PointGetDrawNum(); + Vector b = SK.GetEntity(e->point[1])->PointGetDrawNum(); Vector m = (a.ScaledBy(0.5)).Plus(b.ScaledBy(0.5)); Vector offset = (a.Minus(b)).Cross(n); offset = offset.WithMagnitude(textHeight); @@ -1138,8 +1239,8 @@ s: r.WithMagnitude(1), u.WithMagnitude(1), hcs); if(refs) refs->push_back(o); } else { - Vector a = SK.GetEntity(ptA)->PointGetNum(); - Vector b = SK.GetEntity(ptB)->PointGetNum(); + Vector a = SK.GetEntity(ptA)->PointGetDrawNum(); + Vector b = SK.GetEntity(ptB)->PointGetDrawNum(); Entity *w = SK.GetEntity(workplane); Vector cu = w->Normal()->NormalU(); @@ -1189,8 +1290,13 @@ s: } hcs = canvas->GetStroke(stroke); } - DoLabel(canvas, hcs, disp.offset, labelPos, u, v); - if(refs) refs->push_back(disp.offset); + Vector ref = disp.offset; + if(ptA.v) { + Vector a = SK.GetEntity(ptA)->PointGetNum(); + ref = a.Plus(disp.offset); + } + DoLabel(canvas, hcs, ref, labelPos, u, v); + if(refs) refs->push_back(ref); return; } } @@ -1238,7 +1344,11 @@ bool Constraint::HasLabel() const { case Type::PT_FACE_DISTANCE: case Type::PROJ_PT_DISTANCE: case Type::LENGTH_RATIO: + case Type::ARC_ARC_LEN_RATIO: + case Type::ARC_LINE_LEN_RATIO: case Type::LENGTH_DIFFERENCE: + case Type::ARC_ARC_DIFFERENCE: + case Type::ARC_LINE_DIFFERENCE: case Type::DIAMETER: case Type::ANGLE: return true; @@ -1247,3 +1357,7 @@ bool Constraint::HasLabel() const { return false; } } + +bool Constraint::ShouldDrawExploded() const { + return SK.GetGroup(group)->ShouldDrawExploded(); +} diff --git a/src/drawentity.cpp b/src/drawentity.cpp index 00bcb28a..d0092544 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -26,7 +26,7 @@ void Entity::GenerateEdges(SEdgeList *el) { List lv = {}; sb->MakePwlInto(&lv); for(int j = 1; j < lv.n; j++) { - el->AddEdge(lv[j-1], lv[j], style.v, i); + el->AddEdge(lv[j-1], lv[j], Style::ForEntity(h).v, i); } lv.Clear(); } @@ -88,7 +88,7 @@ void Entity::GetReferencePoints(std::vector *refs) { case Type::POINT_N_ROT_AXIS_TRANS: case Type::POINT_IN_3D: case Type::POINT_IN_2D: - refs->push_back(PointGetNum()); + refs->push_back(PointGetDrawNum()); break; case Type::NORMAL_N_COPY: @@ -103,12 +103,12 @@ void Entity::GetReferencePoints(std::vector *refs) { case Type::CUBIC_PERIODIC: case Type::TTF_TEXT: case Type::IMAGE: - refs->push_back(SK.GetEntity(point[0])->PointGetNum()); + refs->push_back(SK.GetEntity(point[0])->PointGetDrawNum()); break; case Type::LINE_SEGMENT: { - Vector a = SK.GetEntity(point[0])->PointGetNum(), - b = SK.GetEntity(point[1])->PointGetNum(); + Vector a = SK.GetEntity(point[0])->PointGetDrawNum(), + b = SK.GetEntity(point[1])->PointGetDrawNum(); refs->push_back(b.Plus(a.Minus(b).ScaledBy(0.5))); break; } @@ -466,6 +466,26 @@ void Entity::GenerateBezierCurves(SBezierList *sbl) const { } } +bool Entity::ShouldDrawExploded() const { + return SK.GetGroup(group)->ShouldDrawExploded(); +} + +Vector Entity::ExplodeOffset() const { + if(ShouldDrawExploded() && workplane.v != 0) { + int requestIdx = SK.GetRequest(h.request())->groupRequestIndex; + double offset = SS.explodeDistance * (requestIdx + 1); + return SK.GetEntity(workplane)->Normal()->NormalN().ScaledBy(offset); + } else { + return Vector::From(0, 0, 0); + } +} + +Vector Entity::PointGetDrawNum() const { + // As per EntityBase::PointGetNum but specifically for when drawing/rendering the point + // (and not when solving), so we can potentially draw it somewhere different + return PointGetNum().Plus(ExplodeOffset()); +} + void Entity::Draw(DrawAs how, Canvas *canvas) { if(!(how == DrawAs::HOVERED || how == DrawAs::SELECTED) && !IsVisible()) return; @@ -557,16 +577,17 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { pointStroke.unit = Canvas::Unit::PX; Canvas::hStroke hcsPoint = canvas->GetStroke(pointStroke); + Vector p = PointGetDrawNum(); if(free) { Canvas::Stroke analyzeStroke = Style::Stroke(Style::ANALYZE); analyzeStroke.width = 14.0; analyzeStroke.layer = Canvas::Layer::FRONT; Canvas::hStroke hcsAnalyze = canvas->GetStroke(analyzeStroke); - canvas->DrawPoint(PointGetNum(), hcsAnalyze); + canvas->DrawPoint(p, hcsAnalyze); } - canvas->DrawPoint(PointGetNum(), hcsPoint); + canvas->DrawPoint(p, hcsPoint); return; } @@ -621,7 +642,7 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { tail = camera.projRight.ScaledBy(w/s).Plus( camera.projUp. ScaledBy(h/s)).Minus(camera.offset); } else { - tail = SK.GetEntity(point[0])->PointGetNum(); + tail = SK.GetEntity(point[0])->PointGetDrawNum(); } tail = camera.AlignToPixelGrid(tail); @@ -709,8 +730,32 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { case Type::TTF_TEXT: { // Generate the rational polynomial curves, then piecewise linearize // them, and display those. - if(!canvas->DrawBeziers(*GetOrGenerateBezierCurves(), hcs)) { - canvas->DrawEdges(*GetOrGenerateEdges(), hcs); + // Calculating the draw offset, if necessary. + const bool shouldExplode = ShouldDrawExploded(); + Vector explodeOffset; + SBezierList offsetBeziers = {}; + SBezierList *beziers = GetOrGenerateBezierCurves(); + if(shouldExplode) { + explodeOffset = ExplodeOffset(); + for(const SBezier& b : beziers->l) { + SBezier offset = b.TransformedBy(explodeOffset, Quaternion::IDENTITY, 1.0); + offsetBeziers.l.Add(&offset); + } + beziers = &offsetBeziers; + } + + SEdgeList *edges = nullptr; + SEdgeList offsetEdges = {}; + + if(!canvas->DrawBeziers(*beziers, hcs)) { + edges = GetOrGenerateEdges(); + if(shouldExplode) { + for(const SEdge &e : edges->l) { + offsetEdges.AddEdge(e.a.Plus(explodeOffset), e.b.Plus(explodeOffset), e.auxA, e.auxB, e.tag); + } + edges = &offsetEdges; + } + canvas->DrawEdges(*edges, hcs); } if(type == Type::CIRCLE) { Entity *dist = SK.GetEntity(distance); @@ -720,12 +765,14 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { Canvas::Stroke analyzeStroke = Style::Stroke(Style::ANALYZE); analyzeStroke.layer = Canvas::Layer::FRONT; Canvas::hStroke hcsAnalyze = canvas->GetStroke(analyzeStroke); - if(!canvas->DrawBeziers(*GetOrGenerateBezierCurves(), hcsAnalyze)) { - canvas->DrawEdges(*GetOrGenerateEdges(), hcsAnalyze); + if(!canvas->DrawBeziers(*beziers, hcsAnalyze)) { + canvas->DrawEdges(*edges, hcsAnalyze); } } } } + offsetBeziers.Clear(); + offsetEdges.Clear(); return; } case Type::IMAGE: { @@ -757,7 +804,7 @@ void Entity::Draw(DrawAs how, Canvas *canvas) { Canvas::hFill hf = canvas->GetFill(fill); Vector v[4] = {}; for(int i = 0; i < 4; i++) { - v[i] = SK.GetEntity(point[i])->PointGetNum(); + v[i] = SK.GetEntity(point[i])->PointGetDrawNum(); } Vector iu = v[3].Minus(v[0]); Vector iv = v[1].Minus(v[0]); diff --git a/src/dsc.h b/src/dsc.h index 93403bca..19f08686 100644 --- a/src/dsc.h +++ b/src/dsc.h @@ -10,6 +10,7 @@ #include "solvespace.h" #include +#include /// Trait indicating which types are handle types and should get the associated operators. /// Specialize for each handle type and inherit from std::true_type. @@ -371,15 +372,28 @@ public: } }; +template class IdList; + // Comparison functor used by IdList and related classes template struct CompareId { - bool operator()(T const& lhs, T const& rhs) const { - return lhs.h.v < rhs.h.v; + + CompareId(const IdList *list) { + idlist = list; } - bool operator()(T const& lhs, H rhs) const { - return lhs.h.v < rhs.v; + + bool operator()(int lhs, T const& rhs) const { + return idlist->elemstore[lhs].h.v < rhs.h.v; } + bool operator()(int lhs, H rhs) const { + return idlist->elemstore[lhs].h.v < rhs.v; + } + bool operator()(T *lhs, int rhs) const { + return lhs->h.v < idlist->elemstore[rhs].h.v; + } + +private: + const IdList *idlist; }; // A list, where each element has an integer identifier. The list is kept @@ -387,148 +401,152 @@ struct CompareId { // id. template class IdList { - T *elem = nullptr; - int elemsAllocated = 0; + std::vector elemstore; + std::vector elemidx; + std::vector freelist; public: - int n = 0; + int n = 0; // PAR@@@@@ make this private to see all interesting and suspicious places in SoveSpace ;-) + friend struct CompareId; using Compare = CompareId; + struct iterator { + typedef std::random_access_iterator_tag iterator_category; + typedef T value_type; + typedef int difference_type; + typedef T *pointer; + typedef T &reference; + + public: + T &operator*() const noexcept { return *elem; } + const T *operator->() const noexcept { return elem; } + + bool operator==(const iterator &p) const { return p.position == position; } + bool operator!=(const iterator &p) const { return !operator==(p); } + + iterator &operator++() { + ++position; + if(position >= (int)list->elemidx.size()) { + elem = nullptr; // PAR@@@@ Remove just debugging + } else if(0 <= position) { + elem = &(list->elemstore[list->elemidx[position]]); + } + return *this; + } + + // Needed for std:find_if of gcc used in entity.cpp GenerateEquations + difference_type operator-(const iterator &rhs) const noexcept { + return position - rhs.position; + } + + iterator(IdList *l) : position(0), list(l) { + if(list) { + if(list->elemstore.size() && list->elemidx.size()) { + elem = &(list->elemstore[list->elemidx[position]]); + } + } + }; + iterator(IdList *l, int pos) : position(pos), list(l) { + if(position >= (int)list->elemidx.size()) { + elem = nullptr; + } else if(0 <= position) { + elem = &((list->elemstore)[list->elemidx[position]]); + } + }; + + private: + int position; + T *elem; + IdList *list; + }; + + bool IsEmpty() const { return n == 0; } - void AllocForOneMore() { - if(n >= elemsAllocated) { - ReserveMore((elemsAllocated + 32)*2 - n); - } - } - uint32_t MaximumId() { if(IsEmpty()) { return 0; } else { - return Last()->h.v; + return elemstore[elemidx.back()].h.v; } } H AddAndAssignId(T *t) { t->h.v = (MaximumId() + 1); - AllocForOneMore(); - // Copy-construct at the end of the list. - new(&elem[n]) T(*t); + // Add at the end of the list. + elemstore.push_back(*t); + elemidx.push_back(elemstore.size()-1); ++n; return t->h; } - T * LowerBound(T const& t) { - if(IsEmpty()) { - return nullptr; - } - auto it = std::lower_bound(begin(), end(), t, Compare()); - return it; - } - - T * LowerBound(H const& h) { - if(IsEmpty()) { - return nullptr; - } - auto it = std::lower_bound(begin(), end(), h, Compare()); - return it; - } - - int LowerBoundIndex(T const& t) { - if(IsEmpty()) { - return 0; - } - auto it = LowerBound(t); - auto idx = std::distance(begin(), it); - auto i = static_cast(idx); - return i; - } void ReserveMore(int howMuch) { - if(n + howMuch > elemsAllocated) { - elemsAllocated = n + howMuch; - T *newElem = (T *)::operator new[]((size_t)elemsAllocated*sizeof(T)); - for(int i = 0; i < n; i++) { - new(&newElem[i]) T(std::move(elem[i])); - elem[i].~T(); - } - ::operator delete[](elem); - elem = newElem; - } + elemstore.reserve(elemstore.size() + howMuch); + elemidx.reserve(elemidx.size() + howMuch); + // freelist.reserve(freelist.size() + howMuch); // PAR@@@@ maybe we should - not much more RAM } void Add(T *t) { - AllocForOneMore(); - // Look to see if we already have something with the same handle value. ssassert(FindByIdNoOops(t->h) == nullptr, "Handle isn't unique"); - // Copy-construct at the end of the list. - new(&elem[n]) T(*t); + // Find out where the added element should be. + auto pos = std::lower_bound(elemidx.begin(), elemidx.end(), *t, Compare(this)); + + if(freelist.empty()) { // Add a new element to the store + elemstore.push_back(*t); + // Insert a pointer to the element at the correct position + if(elemidx.empty()) { + // The list is empty so pos, begin and end are all null. + // insert does not work in this case. + elemidx.push_back(elemstore.size()-1); + } else { + elemidx.insert(pos, elemstore.size() - 1); + } + } else { // Use the last element from the freelist + // Insert an index to the element at the correct position + elemidx.insert(pos, freelist.back()); + // Remove the element from the freelist + freelist.pop_back(); + + // Copy-construct to the element storage. + elemstore[*pos] = T(*t); + // *elemptr[pos] = *t; // PAR@@@@@@ maybe this? + } + ++n; - // The item we just added is trivially sorted, so "merge" - std::inplace_merge(begin(), end() - 1, end(), Compare()); } T *FindById(H h) { T *t = FindByIdNoOops(h); - ssassert(t != NULL, "Cannot find handle"); + ssassert(t != nullptr, "Cannot find handle"); return t; } - int IndexOf(H h) { - if(IsEmpty()) { - return -1; - } - auto it = LowerBound(h); - auto idx = std::distance(begin(), it); - if (idx < n) { - return idx; - } - return -1; - } - T *FindByIdNoOops(H h) { if(IsEmpty()) { return nullptr; } - auto it = LowerBound(h); - if (it == nullptr || it == end()) { + auto it = std::lower_bound(elemidx.begin(), elemidx.end(), h, Compare(this)); + if(it == elemidx.end()) { return nullptr; + } else { + if(elemstore[*it].h.v != h.v) { + return nullptr; + } + return &elemstore[*it]; } - if (it->h.v == h.v) { - return it; - } - return nullptr; } - T *First() { - return (IsEmpty()) ? NULL : &(elem[0]); - } - T *Last() { - return (IsEmpty()) ? NULL : &(elem[n-1]); - } - T *NextAfter(T *prev) { - if(IsEmpty() || !prev) return NULL; - if(prev - First() == (n - 1)) return NULL; - return prev + 1; - } - - T &Get(size_t i) { return elem[i]; } - T const &Get(size_t i) const { return elem[i]; } + T &Get(size_t i) { return elemstore[elemidx[i]]; } T &operator[](size_t i) { return Get(i); } - T const &operator[](size_t i) const { return Get(i); } - T *begin() { return IsEmpty() ? nullptr : &elem[0]; } - T *end() { return IsEmpty() ? nullptr : &elem[0] + n; } - const T *begin() const { return IsEmpty() ? nullptr : &elem[0]; } - const T *end() const { return IsEmpty() ? nullptr : &elem[0] + n; } - const T *cbegin() const { return begin(); } - const T *cend() const { return end(); } + iterator begin() { return IsEmpty() ? nullptr : iterator(this); } + iterator end() { return IsEmpty() ? nullptr : iterator(this, elemidx.size()); } void ClearTags() { for(auto &elt : *this) { elt.tag = 0; } @@ -545,22 +563,23 @@ public: int src, dest; dest = 0; for(src = 0; src < n; src++) { - if(elem[src].tag) { + if(elemstore[elemidx[src]].tag) { // this item should be deleted - elem[src].Clear(); + elemstore[elemidx[src]].Clear(); +// elemstore[elemidx[src]].~T(); // Clear below calls the destructors + freelist.push_back(elemidx[src]); + elemidx[src] = 0xDEADBEEF; // PAR@@@@@ just for debugging, not needed, remove later } else { if(src != dest) { - elem[dest] = elem[src]; + elemidx[dest] = elemidx[src]; } dest++; } } - for(int i = dest; i < n; i++) - elem[i].~T(); n = dest; - // and elemsAllocated is untouched, because we didn't resize + elemidx.resize(n); // Clear left over elements at the end. } - void RemoveById(H h) { + void RemoveById(H h) { // PAR@@@@@ this can be optimized ClearTags(); FindById(h)->tag = 1; RemoveTagged(); @@ -568,28 +587,35 @@ public: void MoveSelfInto(IdList *l) { l->Clear(); - std::swap(l->elem, elem); - std::swap(l->elemsAllocated, elemsAllocated); + std::swap(l->elemstore, elemstore); + std::swap(l->elemidx, elemidx); + std::swap(l->freelist, freelist); std::swap(l->n, n); } void DeepCopyInto(IdList *l) { l->Clear(); - l->elem = (T *)::operator new[](elemsAllocated * sizeof(elem[0])); - for(int i = 0; i < n; i++) - new(&l->elem[i]) T(elem[i]); - l->elemsAllocated = elemsAllocated; + + for(auto const &it : elemstore) { + l->elemstore.push_back(it); + } + + for(auto const &it : elemidx) { + l->elemidx.push_back(it); + } + l->n = n; } void Clear() { - for(int i = 0; i < n; i++) { - elem[i].Clear(); - elem[i].~T(); + for(auto &it : elemidx) { + elemstore[it].Clear(); +// elemstore[it].~T(); // clear below calls the destructors } - if(elem) ::operator delete[](elem); - elem = NULL; - elemsAllocated = n = 0; + freelist.clear(); + elemidx.clear(); + elemstore.clear(); + n = 0; } }; diff --git a/src/export.cpp b/src/export.cpp index b9ebb914..f1c331fd 100644 --- a/src/export.cpp +++ b/src/export.cpp @@ -366,9 +366,9 @@ void SolveSpaceUI::ExportLinesAndMesh(SEdgeList *sel, SBezierList *sbl, SMesh *s // And calculate lighting for the triangle Vector n = tt.Normal().WithMagnitude(1); - double lighting = SS.ambientIntensity + + double lighting = min(1.0, SS.ambientIntensity + max(0.0, (SS.lightIntensity[0])*(n.Dot(l0))) + - max(0.0, (SS.lightIntensity[1])*(n.Dot(l1))); + max(0.0, (SS.lightIntensity[1])*(n.Dot(l1)))); double r = min(1.0, tt.meta.color.redF() * lighting), g = min(1.0, tt.meta.color.greenF() * lighting), b = min(1.0, tt.meta.color.blueF() * lighting); diff --git a/src/exportstep.cpp b/src/exportstep.cpp index db42dc08..5bfa57f6 100644 --- a/src/exportstep.cpp +++ b/src/exportstep.cpp @@ -353,22 +353,21 @@ void StepFileWriter::ExportSurfacesTo(const Platform::Path &filename) { advancedFaces = {}; - SSurface *ss; - for(ss = shell->surface.First(); ss; ss = shell->surface.NextAfter(ss)) { - if(ss->trim.IsEmpty()) + for(SSurface &ss : shell->surface) { + if(ss.trim.IsEmpty()) continue; // Get all of the loops of Beziers that trim our surface (with each // Bezier split so that we use the section as t goes from 0 to 1), and // the piecewise linearization of those loops in xyz space. SBezierList sbl = {}; - ss->MakeSectionEdgesInto(shell, NULL, &sbl); + ss.MakeSectionEdgesInto(shell, NULL, &sbl); // Apply the export scale factor. - ss->ScaleSelfBy(1.0/SS.exportScale); + ss.ScaleSelfBy(1.0/SS.exportScale); sbl.ScaleSelfBy(1.0/SS.exportScale); - ExportSurface(ss, &sbl); + ExportSurface(&ss, &sbl); sbl.Clear(); } diff --git a/src/exportvector.cpp b/src/exportvector.cpp index 97730997..55abac68 100644 --- a/src/exportvector.cpp +++ b/src/exportvector.cpp @@ -170,22 +170,21 @@ public: } if(writer->constraint) { - Constraint *c; - for(c = writer->constraint->First(); c; c = writer->constraint->NextAfter(c)) { - if(!writer->NeedToOutput(c)) continue; - switch(c->type) { + for(Constraint &c : *writer->constraint) { + if(!writer->NeedToOutput(&c)) continue; + switch(c.type) { case Constraint::Type::PT_PT_DISTANCE: { - Vector ap = SK.GetEntity(c->ptA)->PointGetNum(); - Vector bp = SK.GetEntity(c->ptB)->PointGetNum(); - Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(c->disp.offset); + Vector ap = SK.GetEntity(c.ptA)->PointGetNum(); + Vector bp = SK.GetEntity(c.ptB)->PointGetNum(); + Vector ref = ((ap.Plus(bp)).ScaledBy(0.5)).Plus(c.disp.offset); writeAlignedDimension(xfrm(ap), xfrm(bp), xfrm(ref), - xfrm(ref), c->Label(), c->GetStyle(), c->valA); + xfrm(ref), c.Label(), c.GetStyle(), c.valA); break; } case Constraint::Type::PT_LINE_DISTANCE: { - Vector pt = SK.GetEntity(c->ptA)->PointGetNum(); - Entity *line = SK.GetEntity(c->entityA); + Vector pt = SK.GetEntity(c.ptA)->PointGetNum(); + Entity *line = SK.GetEntity(c.entityA); Vector lA = SK.GetEntity(line->point[0])->PointGetNum(); Vector lB = SK.GetEntity(line->point[1])->PointGetNum(); Vector dl = lB.Minus(lA); @@ -194,7 +193,7 @@ public: if(pt.Equals(closest)) break; - Vector ref = ((closest.Plus(pt)).ScaledBy(0.5)).Plus(c->disp.offset); + Vector ref = ((closest.Plus(pt)).ScaledBy(0.5)).Plus(c.disp.offset); Vector refClosest = ref.ClosestPointOnLine(lA, dl); double ddl = dl.Dot(dl); @@ -209,54 +208,54 @@ public: Vector xdl = xfrm(lB).Minus(xfrm(lA)); writeLinearDimension(xfrm(pt), xfrm(refClosest), xfrm(ref), - xfrm(ref), c->Label(), + xfrm(ref), c.Label(), atan2(xdl.y, xdl.x) / PI * 180.0 + 90.0, 0.0, - c->GetStyle(), c->valA); + c.GetStyle(), c.valA); break; } case Constraint::Type::DIAMETER: { - Entity *circle = SK.GetEntity(c->entityA); + Entity *circle = SK.GetEntity(c.entityA); Vector center = SK.GetEntity(circle->point[0])->PointGetNum(); Quaternion q = SK.GetEntity(circle->normal)->NormalGetNum(); Vector n = q.RotationN().WithMagnitude(1); double r = circle->CircleGetRadiusNum(); - Vector ref = center.Plus(c->disp.offset); + Vector ref = center.Plus(c.disp.offset); // Force the label into the same plane as the circle. ref = ref.Minus(n.ScaledBy(n.Dot(ref) - n.Dot(center))); Vector rad = ref.Minus(center).WithMagnitude(r); - if(/*isRadius*/c->other) { + if(/*isRadius*/c.other) { writeRadialDimension( xfrm(center), xfrm(center.Plus(rad)), - xfrm(ref), c->Label(), c->GetStyle(), c->valA); + xfrm(ref), c.Label(), c.GetStyle(), c.valA); } else { writeDiametricDimension( xfrm(center.Minus(rad)), xfrm(center.Plus(rad)), - xfrm(ref), c->Label(), c->GetStyle(), c->valA); + xfrm(ref), c.Label(), c.GetStyle(), c.valA); } break; } case Constraint::Type::ANGLE: { - Entity *a = SK.GetEntity(c->entityA); - Entity *b = SK.GetEntity(c->entityB); + Entity *a = SK.GetEntity(c.entityA); + Entity *b = SK.GetEntity(c.entityB); Vector a0 = a->VectorGetStartPoint(); Vector b0 = b->VectorGetStartPoint(); Vector da = a->VectorGetNum(); Vector db = b->VectorGetNum(); - if(/*otherAngle*/c->other) { + if(/*otherAngle*/c.other) { a0 = a0.Plus(da); da = da.ScaledBy(-1); } bool skew = false; - Vector ref = c->disp.offset; + Vector ref = c.disp.offset; Vector pi = Vector::AtIntersectionOfLines(a0, a0.Plus(da), b0, b0.Plus(db), &skew); - if(!skew) ref = pi.Plus(c->disp.offset); + if(!skew) ref = pi.Plus(c.disp.offset); Vector norm = da.Cross(db); Vector dna = norm.Cross(da).WithMagnitude(1.0); @@ -277,7 +276,7 @@ public: Vector bisect = da.WithMagnitude(1.0).ScaledBy(cos(thetaf / 2.0)).Plus( dna.ScaledBy(sin(thetaf / 2.0))); - ref = pi.Plus(bisect.WithMagnitude(c->disp.offset.Magnitude())); + ref = pi.Plus(bisect.WithMagnitude(c.disp.offset.Magnitude())); // Get lines again to write exact line. a0 = a->VectorGetStartPoint(); @@ -287,15 +286,15 @@ public: writeAngularDimension( xfrm(a0), xfrm(a0.Plus(da)), xfrm(b0), xfrm(b0.Plus(db)), xfrm(ref), - xfrm(ref), c->Label(), c->GetStyle(), c->valA); + xfrm(ref), c.Label(), c.GetStyle(), c.valA); break; } case Constraint::Type::COMMENT: { - Style *st = SK.style.FindById(c->GetStyle()); - writeText(xfrm(c->disp.offset), c->Label(), - Style::TextHeight(c->GetStyle()) / SS.GW.scale, - st->textAngle, st->textOrigin, c->GetStyle()); + Style *st = SK.style.FindById(c.GetStyle()); + writeText(xfrm(c.disp.offset), c.Label(), + Style::TextHeight(c.GetStyle()) / SS.GW.scale, + st->textAngle, st->textOrigin, c.GetStyle()); break; } @@ -1103,7 +1102,7 @@ void SvgFileWriter::StartFile() { fprintf(f, "stroke-dasharray:%s;\r\n", patternStr.c_str()); } if(s->filled) { - fprintf(f, "fill:#%02x%02x%02x;\r\n", fillRgb.red, fillRgb.green, fillRgb.blue); + fprintf(f, "fill:#%02x%02x%02x;\r\n", fillRgb.red, fillRgb.green, fillRgb.blue); } else { fprintf(f, "fill:none;\r\n"); @@ -1309,9 +1308,9 @@ void GCodeFileWriter::FinishAndCloseFile() { SS.MmToString(pt->p.x).c_str(), SS.MmToString(pt->p.y).c_str(), SS.MmToString(SS.gCode.feed).c_str()); } - // Move up to a clearance plane 5mm above the work. + // Move up to a clearance plane above the work. fprintf(f, "G00 Z%s\r\n", - SS.MmToString(SS.gCode.depth < 0 ? +5 : -5).c_str()); + SS.MmToString(SS.gCode.safeHeight).c_str()); } } diff --git a/src/file.cpp b/src/file.cpp index 160b5ec7..0b5806c0 100644 --- a/src/file.cpp +++ b/src/file.cpp @@ -354,19 +354,18 @@ bool SolveSpaceUI::SaveToFile(const Platform::Path &filename) { } SShell *s = &g->runningShell; - SSurface *srf; - for(srf = s->surface.First(); srf; srf = s->surface.NextAfter(srf)) { + for(SSurface &srf : s->surface) { fprintf(fh, "Surface %08x %08x %08x %d %d\n", - srf->h.v, srf->color.ToPackedInt(), srf->face, srf->degm, srf->degn); - for(i = 0; i <= srf->degm; i++) { - for(j = 0; j <= srf->degn; j++) { + srf.h.v, srf.color.ToPackedInt(), srf.face, srf.degm, srf.degn); + for(i = 0; i <= srf.degm; i++) { + for(j = 0; j <= srf.degn; j++) { fprintf(fh, "SCtrl %d %d %.20f %.20f %.20f Weight %20.20f\n", - i, j, CO(srf->ctrl[i][j]), srf->weight[i][j]); + i, j, CO(srf.ctrl[i][j]), srf.weight[i][j]); } } STrimBy *stb; - for(stb = srf->trim.First(); stb; stb = srf->trim.NextAfter(stb)) { + for(stb = srf.trim.First(); stb; stb = srf.trim.NextAfter(stb)) { fprintf(fh, "TrimBy %08x %d %.20f %.20f %.20f %.20f %.20f %.20f\n", stb->curve.v, stb->backwards ? 1 : 0, CO(stb->start), CO(stb->finish)); @@ -374,21 +373,20 @@ bool SolveSpaceUI::SaveToFile(const Platform::Path &filename) { fprintf(fh, "AddSurface\n"); } - SCurve *sc; - for(sc = s->curve.First(); sc; sc = s->curve.NextAfter(sc)) { + for(SCurve &sc : s->curve) { fprintf(fh, "Curve %08x %d %d %08x %08x\n", - sc->h.v, - sc->isExact ? 1 : 0, sc->exact.deg, - sc->surfA.v, sc->surfB.v); + sc.h.v, + sc.isExact ? 1 : 0, sc.exact.deg, + sc.surfA.v, sc.surfB.v); - if(sc->isExact) { - for(i = 0; i <= sc->exact.deg; i++) { + if(sc.isExact) { + for(i = 0; i <= sc.exact.deg; i++) { fprintf(fh, "CCtrl %d %.20f %.20f %.20f Weight %.20f\n", - i, CO(sc->exact.ctrl[i]), sc->exact.weight[i]); + i, CO(sc.exact.ctrl[i]), sc.exact.weight[i]); } } SCurvePt *scpt; - for(scpt = sc->pts.First(); scpt; scpt = sc->pts.NextAfter(scpt)) { + for(scpt = sc.pts.First(); scpt; scpt = sc.pts.NextAfter(scpt)) { fprintf(fh, "CurvePt %d %.20f %.20f %.20f\n", scpt->vertex ? 1 : 0, CO(scpt->p)); } @@ -712,7 +710,9 @@ bool SolveSpaceUI::LoadEntitiesFromFile(const Platform::Path &filename, EntityLi SMesh *m, SShell *sh) { if(strcmp(filename.Extension().c_str(), "emn")==0) { - return LinkIDF(filename, le, m, sh); + return LinkIDF(filename, le, m, sh); + } else if(strcmp(filename.Extension().c_str(), "stl")==0) { + return LinkStl(filename, le, m, sh); } else { return LoadEntitiesFromSlvs(filename, le, m, sh); } @@ -909,6 +909,8 @@ try_again: return false; } } + if(g.IsTriangleMeshAssembly()) + g.forceToMesh = true; } else if(linkMap.count(g.linkFile) == 0) { dbp("Missing file for group: %s", g.name.c_str()); // The file was moved; prompt the user for its new location. diff --git a/src/generate.cpp b/src/generate.cpp index fdda9946..ec8f82eb 100644 --- a/src/generate.cpp +++ b/src/generate.cpp @@ -224,9 +224,11 @@ void SolveSpaceUI::GenerateAll(Generate type, bool andFindFree, bool genForBBox) if(PruneGroups(hg)) goto pruned; + int groupRequestIndex = 0; for(auto &req : SK.request) { Request *r = &req; if(r->group != hg) continue; + r->groupRequestIndex = groupRequestIndex++; r->Generate(&(SK.entity), &(SK.param)); } diff --git a/src/graphicswin.cpp b/src/graphicswin.cpp index a7d44f12..cac542ae 100644 --- a/src/graphicswin.cpp +++ b/src/graphicswin.cpp @@ -94,10 +94,12 @@ const MenuEntry Menu[] = { { 1, N_("Show Snap &Grid"), Command::SHOW_GRID, '>', KC, mView }, { 1, N_("Darken Inactive Solids"), Command::DIM_SOLID_MODEL, 0, KC, mView }, { 1, N_("Use &Perspective Projection"), Command::PERSPECTIVE_PROJ, '`', KC, mView }, +{ 1, N_("Show E&xploded View"), Command::EXPLODE_SKETCH, '\\', KC, mView }, { 1, N_("Dimension &Units"), Command::NONE, 0, KN, NULL }, { 2, N_("Dimensions in &Millimeters"), Command::UNITS_MM, 0, KR, mView }, { 2, N_("Dimensions in M&eters"), Command::UNITS_METERS, 0, KR, mView }, { 2, N_("Dimensions in &Inches"), Command::UNITS_INCHES, 0, KR, mView }, +{ 2, N_("Dimensions in &Feet and Inches"), Command::UNITS_FEET_INCHES, 0, KR, mView }, { 1, NULL, Command::NONE, 0, KN, NULL }, { 1, N_("Show &Toolbar"), Command::SHOW_TOOLBAR, 0, KC, mView }, { 1, N_("Show Property Bro&wser"), Command::SHOW_TEXT_WND, '\t', KC, mView }, @@ -153,8 +155,8 @@ const MenuEntry Menu[] = { { 1, NULL, Command::NONE, 0, KN, NULL }, { 1, N_("&On Point / Curve / Plane"), Command::ON_ENTITY, 'o', KN, mCon }, { 1, N_("E&qual Length / Radius / Angle"), Command::EQUAL, 'q', KN, mCon }, -{ 1, N_("Length Ra&tio"), Command::RATIO, 'z', KN, mCon }, -{ 1, N_("Length Diff&erence"), Command::DIFFERENCE, 'j', KN, mCon }, +{ 1, N_("Length / Arc Ra&tio"), Command::RATIO, 'z', KN, mCon }, +{ 1, N_("Length / Arc Diff&erence"), Command::DIFFERENCE, 'j', KN, mCon }, { 1, N_("At &Midpoint"), Command::AT_MIDPOINT, 'm', KN, mCon }, { 1, N_("S&ymmetric"), Command::SYMMETRIC, 'y', KN, mCon }, { 1, N_("Para&llel / Tangent"), Command::PARALLEL, 'l', KN, mCon }, @@ -317,6 +319,8 @@ void GraphicsWindow::PopulateMainMenu() { dimSolidModelMenuItem = menuItem; } else if(Menu[i].cmd == Command::PERSPECTIVE_PROJ) { perspectiveProjMenuItem = menuItem; + } else if(Menu[i].cmd == Command::EXPLODE_SKETCH) { + explodeMenuItem = menuItem; } else if(Menu[i].cmd == Command::SHOW_TOOLBAR) { showToolbarMenuItem = menuItem; } else if(Menu[i].cmd == Command::SHOW_TEXT_WND) { @@ -329,6 +333,8 @@ void GraphicsWindow::PopulateMainMenu() { unitsMetersMenuItem = menuItem; } else if(Menu[i].cmd == Command::UNITS_INCHES) { unitsInchesMenuItem = menuItem; + } else if(Menu[i].cmd == Command::UNITS_FEET_INCHES) { + unitsFeetInchesMenuItem = menuItem; } else if(Menu[i].cmd == Command::SEL_WORKPLANE) { inWorkplaneMenuItem = menuItem; } else if(Menu[i].cmd == Command::FREE_IN_3D) { @@ -369,8 +375,11 @@ static void PopulateMenuWithPathnames(Platform::MenuRef menu, void GraphicsWindow::PopulateRecentFiles() { PopulateMenuWithPathnames(openRecentMenu, SS.recentFiles, [](const Platform::Path &path) { + // OkayToStartNewFile could mutate recentFiles, which will invalidate path (which is a + // reference into the recentFiles vector), so take a copy of it here. + Platform::Path pathCopy(path); if(!SS.OkayToStartNewFile()) return; - SS.Load(path); + SS.Load(pathCopy); }); PopulateMenuWithPathnames(linkRecentMenu, SS.recentFiles, [](const Platform::Path &path) { @@ -404,6 +413,8 @@ void GraphicsWindow::Init() { showEdges = true; showMesh = false; showOutlines = false; + showFacesDrawing = false; + showFacesNonDrawing = true; drawOccludedAs = DrawOccludedAs::INVISIBLE; showTextWindow = true; @@ -419,7 +430,7 @@ void GraphicsWindow::Init() { using namespace std::placeholders; // Do this first, so that if it causes an onRender event we don't try to paint without // a canvas. - window->SetMinContentSize(720, 670); + window->SetMinContentSize(720, /*ToolbarDrawOrHitTest 636*/ 32 * 18 + 3 * 16 + 8 + 4); window->onClose = std::bind(&SolveSpaceUI::MenuFile, Command::EXIT); window->onRender = std::bind(&GraphicsWindow::Paint, this); window->onKeyboardEvent = std::bind(&GraphicsWindow::KeyboardEvent, this, _1); @@ -745,6 +756,12 @@ void GraphicsWindow::MenuView(Command id) { } break; + case Command::EXPLODE_SKETCH: + SS.explode = !SS.explode; + SS.GW.EnsureValidActives(); + SS.MarkGroupDirty(SS.GW.activeGroup, true); + break; + case Command::ONTO_WORKPLANE: if(SS.GW.LockedInWorkplane()) { SS.GW.AnimateOntoWorkplane(); @@ -838,6 +855,12 @@ void GraphicsWindow::MenuView(Command id) { SS.GW.EnsureValidActives(); break; + case Command::UNITS_FEET_INCHES: + SS.viewUnits = Unit::FEET_INCHES; + SS.ScheduleShowTW(); + SS.GW.EnsureValidActives(); + break; + case Command::UNITS_MM: SS.viewUnits = Unit::MM; SS.ScheduleShowTW(); @@ -920,6 +943,7 @@ void GraphicsWindow::EnsureValidActives() { case Unit::MM: case Unit::METERS: case Unit::INCHES: + case Unit::FEET_INCHES: break; default: SS.viewUnits = Unit::MM; @@ -928,6 +952,7 @@ void GraphicsWindow::EnsureValidActives() { unitsMmMenuItem->SetActive(SS.viewUnits == Unit::MM); unitsMetersMenuItem->SetActive(SS.viewUnits == Unit::METERS); unitsInchesMenuItem->SetActive(SS.viewUnits == Unit::INCHES); + unitsFeetInchesMenuItem->SetActive(SS.viewUnits == Unit::FEET_INCHES); if(SS.TW.window) SS.TW.window->SetVisible(SS.GW.showTextWindow); showTextWndMenuItem->SetActive(SS.GW.showTextWindow); @@ -935,6 +960,7 @@ void GraphicsWindow::EnsureValidActives() { showGridMenuItem->SetActive(SS.GW.showSnapGrid); dimSolidModelMenuItem->SetActive(SS.GW.dimSolidModel); perspectiveProjMenuItem->SetActive(SS.usePerspectiveProj); + explodeMenuItem->SetActive(SS.explode); showToolbarMenuItem->SetActive(SS.showToolbar); fullScreenMenuItem->SetActive(SS.GW.window->IsFullScreen()); @@ -965,20 +991,19 @@ void GraphicsWindow::ForceTextWindowShown() { } void GraphicsWindow::DeleteTaggedRequests() { - Request *r; // Delete any requests that were affected by this deletion. - for(r = SK.request.First(); r; r = SK.request.NextAfter(r)) { - if(r->workplane == Entity::FREE_IN_3D) continue; - if(!r->workplane.isFromRequest()) continue; - Request *wrkpl = SK.GetRequest(r->workplane.request()); + for(Request &r : SK.request) { + if(r.workplane == Entity::FREE_IN_3D) continue; + if(!r.workplane.isFromRequest()) continue; + Request *wrkpl = SK.GetRequest(r.workplane.request()); if(wrkpl->tag) - r->tag = 1; + r.tag = 1; } // Rewrite any point-coincident constraints that were affected by this // deletion. - for(r = SK.request.First(); r; r = SK.request.NextAfter(r)) { - if(!r->tag) continue; - FixConstraintsForRequestBeingDeleted(r->h); + for(Request &r : SK.request) { + if(!r.tag) continue; + FixConstraintsForRequestBeingDeleted(r.h); } // and then delete the tagged requests. SK.request.RemoveTagged(); @@ -1042,9 +1067,8 @@ void GraphicsWindow::MenuEdit(Command id) { SS.centerOfMass.draw = false; // This clears the marks drawn to indicate which points are // still free to drag. - Param *p; - for(p = SK.param.First(); p; p = SK.param.NextAfter(p)) { - p->free = false; + for(Param &p : SK.param) { + p.free = false; } if(SS.exportMode) { SS.exportMode = false; @@ -1054,13 +1078,12 @@ void GraphicsWindow::MenuEdit(Command id) { break; case Command::SELECT_ALL: { - Entity *e; - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(e->group != SS.GW.activeGroup) continue; - if(e->IsFace() || e->IsDistance()) continue; - if(!e->IsVisible()) continue; + for(Entity &e : SK.entity) { + if(e.group != SS.GW.activeGroup) continue; + if(e.IsFace() || e.IsDistance()) continue; + if(!e.IsVisible()) continue; - SS.GW.MakeSelected(e->h); + SS.GW.MakeSelected(e.h); } SS.GW.Invalidate(); SS.ScheduleShowTW(); @@ -1068,24 +1091,23 @@ void GraphicsWindow::MenuEdit(Command id) { } case Command::SELECT_CHAIN: { - Entity *e; int newlySelected = 0; bool didSomething; do { didSomething = false; - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(e->group != SS.GW.activeGroup) continue; - if(!e->HasEndpoints()) continue; - if(!e->IsVisible()) continue; + for(Entity &e : SK.entity) { + if(e.group != SS.GW.activeGroup) continue; + if(!e.HasEndpoints()) continue; + if(!e.IsVisible()) continue; - Vector st = e->EndpointStart(), - fi = e->EndpointFinish(); + Vector st = e.EndpointStart(), + fi = e.EndpointFinish(); bool onChain = false, alreadySelected = false; List *ls = &(SS.GW.selection); for(Selection *s = ls->First(); s; s = ls->NextAfter(s)) { if(!s->entity.v) continue; - if(s->entity == e->h) { + if(s->entity == e.h) { alreadySelected = true; continue; } @@ -1102,7 +1124,7 @@ void GraphicsWindow::MenuEdit(Command id) { } } if(onChain && !alreadySelected) { - SS.GW.MakeSelected(e->h); + SS.GW.MakeSelected(e.h); newlySelected++; didSomething = true; } @@ -1367,6 +1389,14 @@ void GraphicsWindow::ToggleBool(bool *v) { SS.GenerateAll(SolveSpaceUI::Generate::UNTIL_ACTIVE); } + if(v == &showFaces) { + if(g->type == Group::Type::DRAWING_WORKPLANE || g->type == Group::Type::DRAWING_3D) { + showFacesDrawing = showFaces; + } else { + showFacesNonDrawing = showFaces; + } + } + Invalidate(/*clearPersistent=*/true); SS.ScheduleShowTW(); } diff --git a/src/group.cpp b/src/group.cpp index 1539e68c..1cb1a1b8 100644 --- a/src/group.cpp +++ b/src/group.cpp @@ -138,12 +138,24 @@ void Group::MenuGroup(Command id, Platform::Path linkFile) { g.predef.q = wrkplg->predef.q; } else ssassert(false, "Unexpected workplane subtype"); } + } else if(gs.anyNormals == 1 && gs.points == 1 && gs.n == 2) { + g.subtype = Subtype::WORKPLANE_BY_POINT_NORMAL; + g.predef.q = SK.GetEntity(gs.anyNormal[0])->NormalGetNum(); + g.predef.origin = gs.point[0]; + //} else if(gs.faces == 1 && gs.points == 1 && gs.n == 2) { + // g.subtype = Subtype::WORKPLANE_BY_POINT_FACE; + // g.predef.q = SK.GetEntity(gs.face[0])->NormalGetNum(); + // g.predef.origin = gs.point[0]; } else { Error(_("Bad selection for new sketch in workplane. This " "group can be created with:\n\n" " * a point (through the point, orthogonal to coordinate axes)\n" " * a point and two line segments (through the point, " - "parallel to the lines)\n" + "parallel to the lines)\n" + " * a point and a normal (through the point, " + "orthogonal to the normal)\n" + /*" * a point and a face (through the point, " + "parallel to the face)\n"*/ " * a workplane (copy of the workplane)\n")); return; } @@ -392,7 +404,11 @@ bool Group::IsForcedToMeshBySource() const { } bool Group::IsForcedToMesh() const { - return forceToMesh || IsForcedToMeshBySource(); + return forceToMesh || IsTriangleMeshAssembly() || IsForcedToMeshBySource(); +} + +bool Group::IsTriangleMeshAssembly() const { + return type == Type::LINKED && linkFile.Extension() == "stl"; } std::string Group::DescriptionString() { @@ -404,11 +420,10 @@ std::string Group::DescriptionString() { } void Group::Activate() { - if(type == Type::EXTRUDE || type == Type::LINKED || type == Type::LATHE || - type == Type::REVOLVE || type == Type::HELIX || type == Type::TRANSLATE || type == Type::ROTATE) { - SS.GW.showFaces = true; + if(type == Type::DRAWING_WORKPLANE || type == Type::DRAWING_3D) { + SS.GW.showFaces = SS.GW.showFacesDrawing; } else { - SS.GW.showFaces = false; + SS.GW.showFaces = SS.GW.showFacesNonDrawing; } SS.MarkGroupDirty(h); // for good measure; shouldn't be needed SS.ScheduleShowTW(); @@ -440,7 +455,7 @@ void Group::Generate(IdList *entity, if(predef.negateU) u = u.ScaledBy(-1); if(predef.negateV) v = v.ScaledBy(-1); q = Quaternion::From(u, v); - } else if(subtype == Subtype::WORKPLANE_BY_POINT_ORTHO) { + } else if(subtype == Subtype::WORKPLANE_BY_POINT_ORTHO || subtype == Subtype::WORKPLANE_BY_POINT_NORMAL /*|| subtype == Subtype::WORKPLANE_BY_POINT_FACE*/) { // Already given, numerically. q = predef.q; } else ssassert(false, "Unexpected workplane subtype"); @@ -448,6 +463,7 @@ void Group::Generate(IdList *entity, Entity normal = {}; normal.type = Entity::Type::NORMAL_N_COPY; normal.numNormal = q; + normal.point[0] = h.entity(2); normal.group = h; normal.h = h.entity(1); @@ -800,6 +816,12 @@ void Group::GenerateEquations(IdList *l) { AddEq(l, (EC(axis.z))->Minus(EP(6)), 5); #undef EC #undef EP + if(type == Type::HELIX) { + if(valB != 0.0) { + AddEq(l, Expr::From(h.param(7))->Times(Expr::From(PI))-> + Minus(Expr::From(h.param(3))->Times(Expr::From(valB))), 6); + } + } } else if(type == Type::EXTRUDE) { if(predef.entityB != Entity::FREE_IN_3D) { // The extrusion path is locked along a line, normal to the @@ -1172,3 +1194,6 @@ void Group::CopyEntity(IdList *el, el->Add(&en); } +bool Group::ShouldDrawExploded() const { + return SS.explode && h == SS.GW.activeGroup && type == Type::DRAWING_WORKPLANE && !SS.exportMode; +} diff --git a/src/groupmesh.cpp b/src/groupmesh.cpp index f1041d63..11add4f1 100644 --- a/src/groupmesh.cpp +++ b/src/groupmesh.cpp @@ -83,13 +83,12 @@ void Group::GenerateLoops() { } void SShell::RemapFaces(Group *g, int remap) { - SSurface *ss; - for(ss = surface.First(); ss; ss = surface.NextAfter(ss)){ - hEntity face = { ss->face }; + for(SSurface &ss : surface){ + hEntity face = { ss.face }; if(face == Entity::NO_ENTITY) continue; face = g->Remap(face, remap); - ss->face = face.v; + ss.face = face.v; } } @@ -292,13 +291,12 @@ void Group::GenerateShellAndMesh() { // So these are the sides if(ss->degm != 1 || ss->degn != 1) continue; - Entity *e; - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(e->group != opA) continue; - if(e->type != Entity::Type::LINE_SEGMENT) continue; + for(Entity &e : SK.entity) { + if(e.group != opA) continue; + if(e.type != Entity::Type::LINE_SEGMENT) continue; - Vector a = SK.GetEntity(e->point[0])->PointGetNum(), - b = SK.GetEntity(e->point[1])->PointGetNum(); + Vector a = SK.GetEntity(e.point[0])->PointGetNum(), + b = SK.GetEntity(e.point[1])->PointGetNum(); a = a.Plus(ttop); b = b.Plus(ttop); // Could get taken backwards, so check all cases. @@ -307,7 +305,7 @@ void Group::GenerateShellAndMesh() { (a.Equals(ss->ctrl[0][1]) && b.Equals(ss->ctrl[1][1])) || (b.Equals(ss->ctrl[0][1]) && a.Equals(ss->ctrl[1][1]))) { - face = Remap(e->h, REMAP_LINE_TO_FACE); + face = Remap(e.h, REMAP_LINE_TO_FACE); ss->face = face.v; break; } diff --git a/src/importidf.cpp b/src/importidf.cpp index 1789e5cc..8ca3432a 100644 --- a/src/importidf.cpp +++ b/src/importidf.cpp @@ -54,7 +54,7 @@ static std::vector splitString(const std::string line) { } ////////////////////////////////////////////////////////////////////////////// -// Functions for linking an IDF file - we need to create entites that +// Functions for linking an IDF file - we need to create entities that // get remapped into a linked group similar to linking .slvs files ////////////////////////////////////////////////////////////////////////////// @@ -77,7 +77,7 @@ static hEntity newPoint(EntityList *el, int *id, Vector p, bool visible = true) return en.h; } -static hEntity newLine(EntityList *el, int *id, hEntity p0, hEntity p1) { +static hEntity newLine(EntityList *el, int *id, hEntity p0, hEntity p1, bool keepout) { Entity en = {}; en.type = Entity::Type::LINE_SEGMENT; en.point[0] = p0; @@ -85,8 +85,8 @@ static hEntity newLine(EntityList *el, int *id, hEntity p0, hEntity p1) { en.extraPoints = 0; en.timesApplied = 0; en.group.v = 493; - en.construction = false; - en.style.v = Style::ACTIVE_GRP; + en.construction = keepout; + en.style.v = keepout? Style::CONSTRUCTION : Style::ACTIVE_GRP; en.actVisible = true; en.forceHidden = false; @@ -117,7 +117,7 @@ static hEntity newNormal(EntityList *el, int *id, Quaternion normal) { return en.h; } -static hEntity newArc(EntityList *el, int *id, hEntity p0, hEntity p1, hEntity pc, hEntity hnorm) { +static hEntity newArc(EntityList *el, int *id, hEntity p0, hEntity p1, hEntity pc, hEntity hnorm, bool keepout) { Entity en = {}; en.type = Entity::Type::ARC_OF_CIRCLE; en.point[0] = pc; @@ -127,8 +127,8 @@ static hEntity newArc(EntityList *el, int *id, hEntity p0, hEntity p1, hEntity p en.extraPoints = 0; en.timesApplied = 0; en.group.v = 403; - en.construction = false; - en.style.v = Style::ACTIVE_GRP; + en.construction = keepout; + en.style.v = keepout? Style::CONSTRUCTION : Style::ACTIVE_GRP; en.actVisible = true; en.forceHidden = false; *id = *id+1; @@ -158,7 +158,7 @@ static hEntity newDistance(EntityList *el, int *id, double distance) { return en.h; } -static hEntity newCircle(EntityList *el, int *id, hEntity p0, hEntity hdist, hEntity hnorm) { +static hEntity newCircle(EntityList *el, int *id, hEntity p0, hEntity hdist, hEntity hnorm, bool keepout) { Entity en = {}; en.type = Entity::Type::CIRCLE; en.point[0] = p0; @@ -167,8 +167,8 @@ static hEntity newCircle(EntityList *el, int *id, hEntity p0, hEntity hdist, hEn en.extraPoints = 0; en.timesApplied = 0; en.group.v = 399; - en.construction = false; - en.style.v = Style::ACTIVE_GRP; + en.construction = keepout; + en.style.v = keepout? Style::CONSTRUCTION : Style::ACTIVE_GRP; en.actVisible = true; en.forceHidden = false; @@ -196,18 +196,18 @@ static Vector ArcCenter(Vector p0, Vector p1, double angle) { // Positive angles are counter clockwise, negative are clockwise. An angle of 360 // indicates a circle centered at x1,y1 passing through x2,y2 and is a complete loop. static void CreateEntity(EntityList *el, int *id, hEntity h0, hEntity h1, hEntity hnorm, - Vector p0, Vector p1, double angle) { + Vector p0, Vector p1, double angle, bool keepout) { if (angle == 0.0) { //line if(p0.Equals(p1)) return; - newLine(el, id, h0, h1); + newLine(el, id, h0, h1, keepout); } else if(angle == 360.0) { // circle double d = p1.Minus(p0).Magnitude(); hEntity hd = newDistance(el, id, d); - newCircle(el, id, h1, hd, hnorm); + newCircle(el, id, h1, hd, hnorm, keepout); } else { // arc @@ -226,7 +226,7 @@ static void CreateEntity(EntityList *el, int *id, hEntity h0, hEntity h1, hEntit } Vector c = m.Minus(perp.ScaledBy(dist)); hEntity hc = newPoint(el, id, c, /*visible=*/false); - newArc(el, id, h0, h1, hc, hnorm); + newArc(el, id, h0, h1, hc, hnorm, keepout); } } @@ -291,9 +291,9 @@ static void MakeBeziersForArcs(SBezierList *sbl, Vector center, Vector pa, Vecto namespace SolveSpace { // Here we read the important section of an IDF file. SolveSpace Entities are directly created by -// the funcions above, which is only OK because of the way linking works. For example points do +// the functions above, which is only OK because of the way linking works. For example points do // not have handles for solver parameters (coordinates), they only have their actPoint values -// set (or actNormal or actDistance). These are incompete entites and would be a problem if +// set (or actNormal or actDistance). These are incomplete entities and would be a problem if // they were part of the sketch, but they are not. After making a list of them here, a new group // gets created from copies of these. Those copies are complete and part of the sketch group. bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *sh) { @@ -355,10 +355,9 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s } else if (line.find(".BOARD_OUTLINE") == 0) { section = board_outline; record_number = 1; -// no keepouts for now - they should also be shown as construction? -// } else if (line.find(".ROUTE_KEEPOUT") == 0) { -// section = routing_keepout; -// record_number = 1; + } else if (line.find(".ROUTE_KEEPOUT") == 0) { + section = routing_keepout; + record_number = 1; } else if(line.find(".DRILLED_HOLES") == 0) { section = drilled_holes; record_number = 1; @@ -433,13 +432,15 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s bool vis = (ang == 360.0); if (bottomEntities) { hEntity hp = newPoint(el, &entityCount, point, /*visible=*/vis); - CreateEntity(el, &entityCount, hprev, hp, hnorm, pprev, point, ang); + CreateEntity(el, &entityCount, hprev, hp, hnorm, pprev, point, ang, + (section == routing_keepout) ); pprev = point; hprev = hp; } if (topEntities) { hEntity hp = newPoint(el, &entityCount, pTop, /*visible=*/vis); - CreateEntity(el, &entityCount, hprevTop, hp, hnorm, pprevTop, pTop, ang); + CreateEntity(el, &entityCount, hprevTop, hp, hnorm, pprevTop, pTop, + ang, (section == routing_keepout) ); pprevTop = pTop; hprevTop = hp; } @@ -467,12 +468,12 @@ bool LinkIDF(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *s Vector cent = Vector::From(x,y,0.0); hEntity hcent = newPoint(el, &entityCount, cent); hEntity hdist = newDistance(el, &entityCount, d/2); - newCircle(el, &entityCount, hcent, hdist, hnorm); + newCircle(el, &entityCount, hcent, hdist, hnorm, false); // and again for the top Vector cTop = Vector::From(x,y,board_thickness); hcent = newPoint(el, &entityCount, cTop); hdist = newDistance(el, &entityCount, d/2); - newCircle(el, &entityCount, hcent, hdist, hnorm); + newCircle(el, &entityCount, hcent, hdist, hnorm, false); // create the curves for the extrusion Vector pt = Vector::From(x+d/2, y, 0.0); MakeBeziersForArcs(&sbl, cent, pt, pt, normal, 360.0); diff --git a/src/importmesh.cpp b/src/importmesh.cpp new file mode 100644 index 00000000..df9a65bf --- /dev/null +++ b/src/importmesh.cpp @@ -0,0 +1,221 @@ +//----------------------------------------------------------------------------- +// Triangle mesh file reader. Reads an STL file triangle mesh and creates +// a SovleSpace SMesh from it. Supports only Linking, not import. +// +// Copyright 2020 Paul Kahler. +//----------------------------------------------------------------------------- +#include "solvespace.h" +#include "sketch.h" +#include + +#define MIN_POINT_DISTANCE 0.001 + +// we will check for duplicate verticies and keep all their normals +class vertex { +public: + Vector p; + std::vector normal; +}; + +static bool isEdgeVertex(vertex &v) { + unsigned int i,j; + bool result = false; + for(i=0;i &lv, Vector &p, Vector &n) { + unsigned int i; + for(i=0; iAdd(&en); + return en.h; +} + +// check if a vertex is unique and add it via newPoint if it is. +static void addVertex(EntityList *el, Vector v) { + if(el->n < 15000) { + int id = el->n+2; + newPoint(el, id, v); + } +} + +static hEntity newLine(EntityList *el, int id, hEntity p0, hEntity p1) { + Entity en = {}; + en.type = Entity::Type::LINE_SEGMENT; + en.point[0] = p0; + en.point[1] = p1; + en.extraPoints = 0; + en.timesApplied = 0; + en.group.v = 493; + en.construction = true; + en.style.v = Style::CONSTRUCTION; + en.actVisible = true; + en.forceHidden = false; + + en.h.v = id + en.group.v*65536; + el->Add(&en); + return en.h; +} + +namespace SolveSpace { + +bool LinkStl(const Platform::Path &filename, EntityList *el, SMesh *m, SShell *sh) { + dbp("\nLink STL triangle mesh."); + el->Clear(); + std::string data; + if(!ReadFile(filename, &data)) { + Error("Couldn't read from '%s'", filename.raw.c_str()); + return false; + } + + std::stringstream f(data); + + char str[80] = {}; + f.read(str, 80); + + uint32_t n; + uint32_t color; + + f.read((char*)&n, 4); + dbp("%d triangles", n); + + float x,y,z; + float xn,yn,zn; + + //add the STL origin as an entity + addVertex(el, Vector::From(0.0, 0.0, 0.0)); + + std::vector verts = {}; + + for(uint32_t i = 0; i> 7) & 0xf8; + tr.meta.color.green = (color >> 2) & 0xf8; + tr.meta.color.blue = (color << 3); + tr.meta.color.alpha = 255; + } else { + tr.meta.color.red = 90; + tr.meta.color.green = 120; + tr.meta.color.blue = 140; + tr.meta.color.alpha = 255; + } + + m->AddTriangle(&tr); + Vector normal = tr.Normal().WithMagnitude(1.0); + addUnique(verts, tr.a, normal); + addUnique(verts, tr.b, normal); + addUnique(verts, tr.c, normal); + } + dbp("%d verticies", verts.size()); + + BBox box = {}; + box.minp = verts[0].p; + box.maxp = verts[0].p; + + // determine the bounding box for all vertexes + for(unsigned int i=1; in+2; + p[0] = newPoint(el, id++, Vector::From(box.minp.x, box.minp.y, box.minp.z)); + p[1] = newPoint(el, id++, Vector::From(box.maxp.x, box.minp.y, box.minp.z)); + p[2] = newPoint(el, id++, Vector::From(box.minp.x, box.maxp.y, box.minp.z)); + p[3] = newPoint(el, id++, Vector::From(box.maxp.x, box.maxp.y, box.minp.z)); + p[4] = newPoint(el, id++, Vector::From(box.minp.x, box.minp.y, box.maxp.z)); + p[5] = newPoint(el, id++, Vector::From(box.maxp.x, box.minp.y, box.maxp.z)); + p[6] = newPoint(el, id++, Vector::From(box.minp.x, box.maxp.y, box.maxp.z)); + p[7] = newPoint(el, id++, Vector::From(box.maxp.x, box.maxp.y, box.maxp.z)); + + newLine(el, id++, p[0], p[1]); + newLine(el, id++, p[0], p[2]); + newLine(el, id++, p[3], p[1]); + newLine(el, id++, p[3], p[2]); + + newLine(el, id++, p[4], p[5]); + newLine(el, id++, p[4], p[6]); + newLine(el, id++, p[7], p[5]); + newLine(el, id++, p[7], p[6]); + + newLine(el, id++, p[0], p[4]); + newLine(el, id++, p[1], p[5]); + newLine(el, id++, p[2], p[6]); + newLine(el, id++, p[3], p[7]); + + for(unsigned int i=0; igroup != SS.GW.activeGroup) return; - Entity *e; - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(!(e->h.isFromRequest())) continue; - if(e->h.request() != hr) continue; + for(Entity &e : SK.entity) { + if(!(e.h.isFromRequest())) continue; + if(e.h.request() != hr) continue; - if(e->type != Entity::Type::POINT_IN_2D && - e->type != Entity::Type::POINT_IN_3D) + if(e.type != Entity::Type::POINT_IN_2D && + e.type != Entity::Type::POINT_IN_3D) { continue; } // This is a point generated by the request being deleted; so fix // the constraints for that. - FixConstraintsForPointBeingDeleted(e->h); + FixConstraintsForPointBeingDeleted(e.h); } } void GraphicsWindow::FixConstraintsForPointBeingDeleted(hEntity hpt) { List ld = {}; - Constraint *c; SK.constraint.ClearTags(); - for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) { - if(c->type != Constraint::Type::POINTS_COINCIDENT) continue; - if(c->group != SS.GW.activeGroup) continue; + for(Constraint &c : SK.constraint) { + if(c.type != Constraint::Type::POINTS_COINCIDENT) continue; + if(c.group != SS.GW.activeGroup) continue; - if(c->ptA == hpt) { - ld.Add(&(c->ptB)); - c->tag = 1; + if(c.ptA == hpt) { + ld.Add(&(c.ptB)); + c.tag = 1; } - if(c->ptB == hpt) { - ld.Add(&(c->ptA)); - c->tag = 1; + if(c.ptB == hpt) { + ld.Add(&(c.ptA)); + c.tag = 1; } } // Remove constraints without waiting for regeneration; this way @@ -225,21 +223,21 @@ void GraphicsWindow::ParametricCurve::CreateRequestTrimmedTo(double t, // happens to exist, then constrain that point coincident to hpt. //----------------------------------------------------------------------------- void GraphicsWindow::ParametricCurve::ConstrainPointIfCoincident(hEntity hpt) { - Entity *e, *pt; + Entity *pt; pt = SK.GetEntity(hpt); Vector ev, ptv; ptv = pt->PointGetNum(); - for(e = SK.entity.First(); e; e = SK.entity.NextAfter(e)) { - if(e->h == pt->h) continue; - if(!e->IsPoint()) continue; - if(e->group != pt->group) continue; - if(e->workplane != pt->workplane) continue; + for(Entity &e : SK.entity) { + if(e.h == pt->h) continue; + if(!e.IsPoint()) continue; + if(e.group != pt->group) continue; + if(e.workplane != pt->workplane) continue; - ev = e->PointGetNum(); + ev = e.PointGetNum(); if(!ev.Equals(ptv)) continue; - Constraint::ConstrainCoincident(hpt, e->h); + Constraint::ConstrainCoincident(hpt, e.h); break; } } diff --git a/src/mouse.cpp b/src/mouse.cpp index 77b52342..5e7cde26 100644 --- a/src/mouse.cpp +++ b/src/mouse.cpp @@ -10,6 +10,8 @@ void GraphicsWindow::UpdateDraggedPoint(hEntity hp, double mx, double my) { Vector pos = p->PointGetNum(); UpdateDraggedNum(&pos, mx, my); p->PointForceTo(pos); + + SS.ScheduleShowTW(); } void GraphicsWindow::UpdateDraggedNum(Vector *pos, double mx, double my) { @@ -101,7 +103,10 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, shiftDown = !shiftDown; } - if(SS.showToolbar) { + // Not passing right-button and middle-button drags to the toolbar avoids + // some cosmetic issues with trackpad pans/rotates implemented with + // simulated right-button drag events causing spurious hover events. + if(SS.showToolbar && !middleDown) { if(ToolbarMouseMoved((int)x, (int)y)) { hover.Clear(); return; @@ -188,32 +193,23 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, hEntity dragEntity = ChooseFromHoverToDrag().entity; if(dragEntity.v) e = SK.GetEntity(dragEntity); if(e && e->type != Entity::Type::WORKPLANE) { - Entity *e = SK.GetEntity(dragEntity); + if(!hoverWasSelectedOnMousedown) { + // The user clicked an unselected entity, which + // means they're dragging just the hovered thing, + // not the full selection. So clear all the selection + // except that entity. + ClearSelection(); + MakeSelected(dragEntity); + } if(e->type == Entity::Type::CIRCLE && selection.n <= 1) { // Drag the radius. - ClearSelection(); pending.circle = dragEntity; pending.operation = Pending::DRAGGING_RADIUS; } else if(e->IsNormal()) { - ClearSelection(); pending.normal = dragEntity; pending.operation = Pending::DRAGGING_NORMAL; } else { - if(!hoverWasSelectedOnMousedown) { - // The user clicked an unselected entity, which - // means they're dragging just the hovered thing, - // not the full selection. So clear all the selection - // except that entity. - ClearSelection(); - MakeSelected(e->h); - } StartDraggingBySelection(); - if(!hoverWasSelectedOnMousedown) { - // And then clear the selection again, since they - // probably didn't want that selected if they just - // were dragging it. - ClearSelection(); - } hover.Clear(); pending.operation = Pending::DRAGGING_POINTS; } @@ -425,6 +421,7 @@ void GraphicsWindow::MouseMoved(double x, double y, bool leftDown, SK.GetEntity(circle->distance)->DistanceForceTo(r); SS.MarkGroupDirtyByEntity(pending.circle); + SS.ScheduleShowTW(); break; } @@ -526,11 +523,16 @@ void GraphicsWindow::MouseRightUp(double x, double y) { } if(pending.operation == Pending::DRAGGING_NEW_LINE_POINT || - pending.operation == Pending::DRAGGING_NEW_CUBIC_POINT) + pending.operation == Pending::DRAGGING_NEW_CUBIC_POINT || + pending.operation == Pending::DRAGGING_NEW_ARC_POINT || + pending.operation == Pending::DRAGGING_NEW_RADIUS || + pending.operation == Pending::DRAGGING_NEW_POINT + ) { // Special case; use a right click to stop drawing lines, since // a left click would draw another one. This is quicker and more - // intuitive than hitting escape. Likewise for new cubic segments. + // intuitive than hitting escape. Likewise for other entities + // for consistency. ClearPending(); return; } @@ -714,11 +716,12 @@ void GraphicsWindow::MouseRightUp(double x, double y) { if(gs.points == 1) { Entity *p = SK.GetEntity(gs.point[0]); - Constraint *c; + Constraint *c = nullptr; IdList *lc = &(SK.constraint); - for(c = lc->First(); c; c = lc->NextAfter(c)) { - if(c->type != Constraint::Type::POINTS_COINCIDENT) continue; - if(c->ptA == p->h || c->ptB == p->h) { + for(Constraint &ci : *lc) { + if(ci.type != Constraint::Type::POINTS_COINCIDENT) continue; + if(ci.ptA == p->h || ci.ptB == p->h) { + c = &ci; break; } } @@ -728,11 +731,10 @@ void GraphicsWindow::MouseRightUp(double x, double y) { SS.UndoRemember(); SK.constraint.ClearTags(); - Constraint *c; - for(c = SK.constraint.First(); c; c = SK.constraint.NextAfter(c)) { - if(c->type != Constraint::Type::POINTS_COINCIDENT) continue; - if(c->ptA == p->h || c->ptB == p->h) { - c->tag = 1; + for(Constraint &c : SK.constraint) { + if(c.type != Constraint::Type::POINTS_COINCIDENT) continue; + if(c.ptA == p->h || c.ptB == p->h) { + c.tag = 1; } } SK.constraint.RemoveTagged(); @@ -1306,15 +1308,20 @@ void GraphicsWindow::MouseLeftDown(double mx, double my, bool shiftDown, bool ct void GraphicsWindow::MouseLeftUp(double mx, double my, bool shiftDown, bool ctrlDown) { orig.mouseDown = false; - hoverWasSelectedOnMousedown = false; switch(pending.operation) { case Pending::DRAGGING_POINTS: - SS.extraLine.draw = false; - // fall through case Pending::DRAGGING_CONSTRAINT: case Pending::DRAGGING_NORMAL: case Pending::DRAGGING_RADIUS: + if(!hoverWasSelectedOnMousedown) { + // And then clear the selection again, since they + // probably didn't want that selected if they just + // were dragging it. + ClearSelection(); + } + hoverWasSelectedOnMousedown = false; + SS.extraLine.draw = false; ClearPending(); Invalidate(); break; @@ -1369,12 +1376,12 @@ void GraphicsWindow::EditConstraint(hConstraint constraint) { value /= 2; // Try showing value with default number of digits after decimal first. - if(c->type == Constraint::Type::LENGTH_RATIO) { + if(c->type == Constraint::Type::LENGTH_RATIO || c->type == Constraint::Type::ARC_ARC_LEN_RATIO || c->type == Constraint::Type::ARC_LINE_LEN_RATIO) { editValue = ssprintf("%.3f", value); } else if(c->type == Constraint::Type::ANGLE) { editValue = SS.DegreeToString(value); } else { - editValue = SS.MmToString(value); + editValue = SS.MmToString(value, true); value /= SS.MmPerUnit(); } // If that's not enough to represent it exactly, show the value with as many @@ -1430,7 +1437,9 @@ void GraphicsWindow::EditControlDone(const std::string &s) { case Constraint::Type::PT_LINE_DISTANCE: case Constraint::Type::PT_FACE_DISTANCE: case Constraint::Type::PT_PLANE_DISTANCE: - case Constraint::Type::LENGTH_DIFFERENCE: { + case Constraint::Type::LENGTH_DIFFERENCE: + case Constraint::Type::ARC_ARC_DIFFERENCE: + case Constraint::Type::ARC_LINE_DIFFERENCE: { // The sign is not displayed to the user, but this is a signed // distance internally. To flip the sign, the user enters a // negative distance. @@ -1444,6 +1453,8 @@ void GraphicsWindow::EditControlDone(const std::string &s) { } case Constraint::Type::ANGLE: case Constraint::Type::LENGTH_RATIO: + case Constraint::Type::ARC_ARC_LEN_RATIO: + case Constraint::Type::ARC_LINE_LEN_RATIO: // These don't get the units conversion for distance, and // they're always positive c->valA = fabs(e->Eval()); diff --git a/src/platform/gui.cpp b/src/platform/gui.cpp index 28fded44..0c9637ff 100644 --- a/src/platform/gui.cpp +++ b/src/platform/gui.cpp @@ -86,8 +86,10 @@ std::vector SolveSpaceModelFileFilters = { }; std::vector SolveSpaceLinkFileFilters = { + { CN_("file-type", "ALL"), { "slvs", "emn", "stl" } }, { CN_("file-type", "SolveSpace models"), { "slvs" } }, { CN_("file-type", "IDF circuit board"), { "emn" } }, + { CN_("file-type", "STL triangle mesh"), { "stl" } }, }; std::vector RasterFileFilters = { diff --git a/src/platform/guigtk.cpp b/src/platform/guigtk.cpp index 94247b45..1a11582e 100644 --- a/src/platform/guigtk.cpp +++ b/src/platform/guigtk.cpp @@ -33,7 +33,18 @@ #if defined(HAVE_SPACEWARE) # include -# include +# include +# if defined(GDK_WINDOWING_X11) +# include +# endif +# if defined(GDK_WINDOWING_WAYLAND) +# include +# endif +# if GTK_CHECK_VERSION(3, 20, 0) +# include +# else +# include +# endif #endif #include "solvespace.h" @@ -217,6 +228,10 @@ public: } return false; }; + // Note: asan warnings about new-delete-type-mismatch are false positives here: + // https://gitlab.gnome.org/GNOME/gtkmm/-/issues/65 + // Pass new_delete_type_mismatch=0 to ASAN_OPTIONS to disable those warnings. + // Unfortunately they won't go away until upgrading to gtkmm4 _connection = Glib::signal_timeout().connect(handler, milliseconds); } }; @@ -1038,16 +1053,8 @@ WindowRef CreateWindow(Window::Kind kind, WindowRef parentWindow) { void Open3DConnexion() {} void Close3DConnexion() {} -#if defined(HAVE_SPACEWARE) && defined(GDK_WINDOWING_X11) -static GdkFilterReturn GdkSpnavFilter(GdkXEvent *gdkXEvent, GdkEvent *gdkEvent, gpointer data) { - XEvent *xEvent = (XEvent *)gdkXEvent; - WindowImplGtk *window = (WindowImplGtk *)data; - - spnav_event spnavEvent; - if(!spnav_x11_event(xEvent, &spnavEvent)) { - return GDK_FILTER_CONTINUE; - } - +#if defined(HAVE_SPACEWARE) && (defined(GDK_WINDOWING_X11) || defined(GDK_WINDOWING_WAYLAND)) +static void ProcessSpnavEvent(WindowImplGtk *window, const spnav_event &spnavEvent, bool shiftDown, bool controlDown) { switch(spnavEvent.type) { case SPNAV_EVENT_MOTION: { SixDofEvent event = {}; @@ -1058,8 +1065,8 @@ static GdkFilterReturn GdkSpnavFilter(GdkXEvent *gdkXEvent, GdkEvent *gdkEvent, event.rotationX = (double)spnavEvent.motion.rx * 0.001; event.rotationY = (double)spnavEvent.motion.ry * 0.001; event.rotationZ = (double)spnavEvent.motion.rz * -0.001; - event.shiftDown = xEvent->xmotion.state & ShiftMask; - event.controlDown = xEvent->xmotion.state & ControlMask; + event.shiftDown = shiftDown; + event.controlDown = controlDown; if(window->onSixDofEvent) { window->onSixDofEvent(event); } @@ -1075,17 +1082,52 @@ static GdkFilterReturn GdkSpnavFilter(GdkXEvent *gdkXEvent, GdkEvent *gdkEvent, } switch(spnavEvent.button.bnum) { case 0: event.button = SixDofEvent::Button::FIT; break; - default: return GDK_FILTER_REMOVE; + default: return; } - event.shiftDown = xEvent->xmotion.state & ShiftMask; - event.controlDown = xEvent->xmotion.state & ControlMask; + event.shiftDown = shiftDown; + event.controlDown = controlDown; if(window->onSixDofEvent) { window->onSixDofEvent(event); } break; } +} - return GDK_FILTER_REMOVE; +static GdkFilterReturn GdkSpnavFilter(GdkXEvent *gdkXEvent, GdkEvent *gdkEvent, gpointer data) { + XEvent *xEvent = (XEvent *)gdkXEvent; + WindowImplGtk *window = (WindowImplGtk *)data; + bool shiftDown = (xEvent->xmotion.state & ShiftMask) != 0; + bool controlDown = (xEvent->xmotion.state & ControlMask) != 0; + + spnav_event spnavEvent; + if(spnav_x11_event(xEvent, &spnavEvent)) { + ProcessSpnavEvent(window, spnavEvent, shiftDown, controlDown); + return GDK_FILTER_REMOVE; + } + return GDK_FILTER_CONTINUE; +} + +static gboolean ConsumeSpnavQueue(GIOChannel *, GIOCondition, gpointer data) { + WindowImplGtk *window = (WindowImplGtk *)data; + Glib::RefPtr gdkWindow = window->gtkWindow.get_window(); + + // We don't get modifier state through the socket. + int x, y; + Gdk::ModifierType mask{}; +#if GTK_CHECK_VERSION(3, 20, 0) + Glib::RefPtr device = gdkWindow->get_display()->get_default_seat()->get_pointer(); +#else + Glib::RefPtr device = gdkWindow->get_display()->get_device_manager()->get_client_pointer(); +#endif + gdkWindow->get_device_position(device, x, y, mask); + bool shiftDown = (mask & Gdk::SHIFT_MASK) != 0; + bool controlDown = (mask & Gdk::CONTROL_MASK) != 0; + + spnav_event spnavEvent; + while(spnav_poll_event(&spnavEvent)) { + ProcessSpnavEvent(window, spnavEvent, shiftDown, controlDown); + } + return TRUE; } void Request3DConnexionEventsForWindow(WindowRef window) { @@ -1093,11 +1135,26 @@ void Request3DConnexionEventsForWindow(WindowRef window) { std::static_pointer_cast(window); Glib::RefPtr gdkWindow = windowImpl->gtkWindow.get_window(); +#if defined(GDK_WINDOWING_X11) if(GDK_IS_X11_DISPLAY(gdkWindow->get_display()->gobj())) { - gdkWindow->add_filter(GdkSpnavFilter, windowImpl.get()); - spnav_x11_open(gdk_x11_get_default_xdisplay(), - gdk_x11_window_get_xid(gdkWindow->gobj())); + if(spnav_x11_open(gdk_x11_get_default_xdisplay(), + gdk_x11_window_get_xid(gdkWindow->gobj())) != -1) { + gdkWindow->add_filter(GdkSpnavFilter, windowImpl.get()); + } else if(spnav_open() != -1) { + g_io_add_watch(g_io_channel_unix_new(spnav_fd()), G_IO_IN, + ConsumeSpnavQueue, windowImpl.get()); + } } +#endif +#if defined(GDK_WINDOWING_WAYLAND) + if(GDK_IS_WAYLAND_DISPLAY(gdkWindow->get_display()->gobj())) { + if(spnav_open() != -1) { + g_io_add_watch(g_io_channel_unix_new(spnav_fd()), G_IO_IN, + ConsumeSpnavQueue, windowImpl.get()); + } + } +#endif + } #else void Request3DConnexionEventsForWindow(WindowRef window) {} @@ -1303,7 +1360,7 @@ public: return; Platform::Path path = GetFilename(); - if(gtkChooser->get_action() != GTK_FILE_CHOOSER_ACTION_OPEN) { + if(gtkChooser->get_action() != Gtk::FILE_CHOOSER_ACTION_OPEN) { SetCurrentName(path.WithExtension(extension).FileName()); } } diff --git a/src/platform/guimac.mm b/src/platform/guimac.mm index b2b07a8b..67d1eb97 100644 --- a/src/platform/guimac.mm +++ b/src/platform/guimac.mm @@ -286,7 +286,8 @@ public: } void PopUp() override { - [NSMenu popUpContextMenu:nsMenu withEvent:[NSApp currentEvent] forView:nil]; + NSEvent* event = [NSApp currentEvent]; + [NSMenu popUpContextMenu:nsMenu withEvent:event forView:event.window.contentView]; } void Clear() override { @@ -358,18 +359,25 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) { - (void)didEdit:(NSString *)text; @property double scrollerMin; -@property double scrollerMax; +@property double scrollerSize; +@property double pageSize; + @end @implementation SSView { NSTrackingArea *trackingArea; NSTextField *editor; + double magnificationGestureCurrentZ; + double rotationGestureCurrent; + Point2d trackpadPositionShift; + bool inTrackpadScrollGesture; + Platform::Window::Kind kind; } @synthesize acceptsFirstResponder; -- (id)initWithFrame:(NSRect)frameRect { +- (id)initWithKind:(Platform::Window::Kind)aKind { NSOpenGLPixelFormatAttribute attrs[] = { NSOpenGLPFADoubleBuffer, NSOpenGLPFAColorSize, 24, @@ -377,7 +385,7 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) { 0 }; NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs]; - if(self = [super initWithFrame:frameRect pixelFormat:pixelFormat]) { + if(self = [super initWithFrame:NSMakeRect(0, 0, 0, 0) pixelFormat:pixelFormat]) { self.wantsBestResolutionOpenGLSurface = YES; self.wantsLayer = YES; editor = [[NSTextField alloc] init]; @@ -387,6 +395,18 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) { editor.bezeled = NO; editor.target = self; editor.action = @selector(didEdit:); + + inTrackpadScrollGesture = false; + kind = aKind; + if(kind == Platform::Window::Kind::TOPLEVEL) { + NSGestureRecognizer *mag = [[NSMagnificationGestureRecognizer alloc] initWithTarget:self + action:@selector(magnifyGesture:)]; + [self addGestureRecognizer:mag]; + + NSRotationGestureRecognizer* rot = [[NSRotationGestureRecognizer alloc] initWithTarget:self + action:@selector(rotateGesture:)]; + [self addGestureRecognizer:rot]; + } } return self; } @@ -427,9 +447,9 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) { - (Platform::MouseEvent)convertMouseEvent:(NSEvent *)nsEvent { Platform::MouseEvent event = {}; - NSPoint nsPoint = [self convertPoint:nsEvent.locationInWindow fromView:self]; + NSPoint nsPoint = [self convertPoint:nsEvent.locationInWindow fromView:nil]; event.x = nsPoint.x; - event.y = self.bounds.size.height - nsPoint.y; + event.y = nsPoint.y; NSUInteger nsFlags = [nsEvent modifierFlags]; if(nsFlags & NSEventModifierFlagShift) event.shiftDown = true; @@ -553,14 +573,57 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) { using Platform::MouseEvent; MouseEvent event = [self convertMouseEvent:nsEvent]; + if(nsEvent.subtype == NSEventSubtypeTabletPoint && kind == Platform::Window::Kind::TOPLEVEL) { + // This is how Cocoa represents 2 finger trackpad drag gestures, rather than going via + // NSPanGestureRecognizer which is how you might expect this to work... We complicate this + // further by also handling shift-two-finger-drag to mean rotate. Fortunately we're using + // shift in the same way as right-mouse-button MouseEvent does (to converts a pan to a + // rotate) so we get the rotate support for free. It's a bit ugly having to fake mouse + // events and track the deviation from the actual mouse cursor with trackpadPositionShift, + // but in lieu of an event API that allows us to request a rotate/pan with relative + // coordinates, it's the best we can do. + event.button = MouseEvent::Button::RIGHT; + // Make sure control (actually cmd) isn't passed through, ctrl-right-click-drag has special + // meaning as rotate which we don't want to inadvertently trigger. + event.controlDown = false; + if(nsEvent.scrollingDeltaX == 0 && nsEvent.scrollingDeltaY == 0) { + // Cocoa represents the point where the user lifts their fingers off (and any inertial + // scrolling has finished) by an event with scrollingDeltaX and scrollingDeltaY both 0. + // Sometimes you also get a zero scroll at the start of a two-finger-rotate (probably + // reflecting the internal implementation of that being a cancelled possible pan + // gesture), which is why this conditional is structured the way it is. + if(inTrackpadScrollGesture) { + event.x += trackpadPositionShift.x; + event.y += trackpadPositionShift.y; + event.type = MouseEvent::Type::RELEASE; + receiver->onMouseEvent(event); + inTrackpadScrollGesture = false; + trackpadPositionShift = Point2d::From(0, 0); + } + return; + } else if(!inTrackpadScrollGesture) { + inTrackpadScrollGesture = true; + trackpadPositionShift = Point2d::From(0, 0); + event.type = MouseEvent::Type::PRESS; + receiver->onMouseEvent(event); + // And drop through + } + + trackpadPositionShift.x += nsEvent.scrollingDeltaX; + trackpadPositionShift.y += nsEvent.scrollingDeltaY; + event.type = MouseEvent::Type::MOTION; + event.x += trackpadPositionShift.x; + event.y += trackpadPositionShift.y; + receiver->onMouseEvent(event); + return; + } + event.type = MouseEvent::Type::SCROLL_VERT; bool isPrecise = [nsEvent hasPreciseScrollingDeltas]; event.scrollDelta = [nsEvent scrollingDeltaY] / (isPrecise ? 50 : 5); - if(receiver->onMouseEvent) { - receiver->onMouseEvent(event); - } + receiver->onMouseEvent(event); } - (void)mouseExited:(NSEvent *)nsEvent { @@ -638,6 +701,50 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) { [super keyUp:nsEvent]; } +- (void)magnifyGesture:(NSMagnificationGestureRecognizer *)gesture { + // The onSixDofEvent API doesn't allow us to specify the scaling's origin, so for expediency + // we fake out a scrollwheel MouseEvent with a suitably-scaled scrollDelta with a bit of + // absolute-to-relative positioning conversion tracked using magnificationGestureCurrentZ. + + if(gesture.state == NSGestureRecognizerStateBegan) { + magnificationGestureCurrentZ = 0.0; + } + + // Magic number to make gesture.magnification align roughly with what scrollDelta expects + constexpr double kScale = 10.0; + double z = ((double)gesture.magnification * kScale); + double zdelta = z - magnificationGestureCurrentZ; + magnificationGestureCurrentZ = z; + + using Platform::MouseEvent; + MouseEvent event = {}; + event.type = MouseEvent::Type::SCROLL_VERT; + NSPoint nsPoint = [gesture locationInView:self]; + event.x = nsPoint.x; + event.y = nsPoint.y; + event.scrollDelta = zdelta; + if(receiver->onMouseEvent) { + receiver->onMouseEvent(event); + } +} + +- (void)rotateGesture:(NSRotationGestureRecognizer *)gesture { + if(gesture.state == NSGestureRecognizerStateBegan) { + rotationGestureCurrent = 0.0; + } + double rotation = gesture.rotation; + double rotationDelta = rotation - rotationGestureCurrent; + rotationGestureCurrent = rotation; + + using Platform::SixDofEvent; + SixDofEvent event = {}; + event.type = SixDofEvent::Type::MOTION; + event.rotationZ = rotationDelta; + if(receiver->onSixDofEvent) { + receiver->onSixDofEvent(event); + } +} + @synthesize editing; - (void)startEditing:(NSString *)text at:(NSPoint)origin withHeight:(double)fontHeight @@ -698,11 +805,27 @@ MenuBarRef GetOrCreateMainMenu(bool *unique) { } @synthesize scrollerMin; -@synthesize scrollerMax; +@synthesize scrollerSize; +@synthesize pageSize; - (void)didScroll:(NSScroller *)sender { + double pos; + switch(sender.hitPart) { + case NSScrollerKnob: + case NSScrollerKnobSlot: + pos = receiver->GetScrollbarPosition(); + break; + case NSScrollerDecrementPage: + pos = receiver->GetScrollbarPosition() - pageSize; + break; + case NSScrollerIncrementPage: + pos = receiver->GetScrollbarPosition() + pageSize; + break; + default: + return; + } + if(receiver->onScrollbarAdjusted) { - double pos = scrollerMin + [sender doubleValue] * (scrollerMax - scrollerMin); receiver->onScrollbarAdjusted(pos); } } @@ -769,7 +892,7 @@ public: NSString *nsToolTip; WindowImplCocoa(Window::Kind kind, std::shared_ptr parentWindow) { - ssView = [[SSView alloc] init]; + ssView = [[SSView alloc] initWithKind:kind]; ssView.translatesAutoresizingMaskIntoConstraints = NO; ssView.receiver = this; @@ -962,21 +1085,22 @@ public: void ConfigureScrollbar(double min, double max, double pageSize) override { ssView.scrollerMin = min; - ssView.scrollerMax = max - pageSize; - [nsScroller setKnobProportion:(pageSize / (ssView.scrollerMax - ssView.scrollerMin))]; + ssView.scrollerSize = max + 1 - min; + ssView.pageSize = pageSize; + nsScroller.knobProportion = pageSize / ssView.scrollerSize; + nsScroller.hidden = pageSize >= ssView.scrollerSize; } double GetScrollbarPosition() override { + // Platform::Window scrollbar positions are in the range [min, max+1 - pageSize] inclusive, + // and Cocoa scrollbars are from 0.0 to 1.0 inclusive, so we have to apply some scaling and + // transforming. (scrollerSize is max+1-min, see ConfigureScrollbar above) return ssView.scrollerMin + - [nsScroller doubleValue] * (ssView.scrollerMax - ssView.scrollerMin); + nsScroller.doubleValue * (ssView.scrollerSize - ssView.pageSize); } void SetScrollbarPosition(double pos) override { - if(pos > ssView.scrollerMax) - pos = ssView.scrollerMax; - if(GetScrollbarPosition() == pos) - return; - [nsScroller setDoubleValue:(pos / (ssView.scrollerMax - ssView.scrollerMin))]; + nsScroller.doubleValue = (pos - ssView.scrollerMin) / ( ssView.scrollerSize - ssView.pageSize); } void Invalidate() override { @@ -1426,9 +1550,22 @@ void OpenInBrowser(const std::string &url) { - (IBAction)preferences:(id)sender; - (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename; - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender; + +@property BOOL exiting; + @end @implementation SSApplicationDelegate + +@synthesize exiting; + +- (id)init { + if (self = [super init]) { + self.exiting = false; + } + return self; +} + - (IBAction)preferences:(id)sender { if (!SS.GW.showTextWindow) { SolveSpace::SS.GW.MenuView(SolveSpace::Command::SHOW_TEXT_WND); @@ -1443,12 +1580,27 @@ void OpenInBrowser(const std::string &url) { } - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender { - [[[NSApp mainWindow] delegate] windowShouldClose:[NSApp mainWindow]]; - return NSTerminateCancel; + if(!SS.unsaved) { + return NSTerminateNow; + } else { + [self performSelectorOnMainThread:@selector(applicationTerminatePrompt) withObject:nil + waitUntilDone:NO modes:@[NSDefaultRunLoopMode, NSModalPanelRunLoopMode]]; + return NSTerminateLater; + } +} + +- (void)applicationWillTerminate:(NSNotification *)notification { + if(!exiting) { + // Prevent the Platform::ExitGui() call from SolveSpaceUI::Exit() + // triggering another terminate + exiting = true; + // Now let SS save settings etc + SS.Exit(); + } } - (void)applicationTerminatePrompt { - SolveSpace::SS.MenuFile(SolveSpace::Command::EXIT); + [NSApp replyToApplicationShouldTerminate:SS.OkayToStartNewFile()]; } @end @@ -1469,6 +1621,14 @@ std::vector InitGui(int argc, char **argv) { ssDelegate = [[SSApplicationDelegate alloc] init]; NSApplication.sharedApplication.delegate = ssDelegate; + // Setting this prevents "Show Tab Bar" and "Show All Tabs" items from being + // automagically added to the View menu + NSWindow.allowsAutomaticWindowTabbing = NO; + + // And this prevents the duplicate "Enter Full Screen" menu item, see + // https://stackoverflow.com/questions/52154977/how-to-get-rid-of-enter-full-screen-menu-item + [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"NSFullScreenMenuItemEverywhere"]; + [NSBundle.mainBundle loadNibNamed:@"MainMenu" owner:nil topLevelObjects:nil]; NSArray *languages = NSLocale.preferredLanguages; @@ -1487,8 +1647,10 @@ void RunGui() { } void ExitGui() { - [NSApp setDelegate:nil]; - [NSApp terminate:nil]; + if(!ssDelegate.exiting) { + ssDelegate.exiting = true; + [NSApp terminate:nil]; + } } void ClearGui() {} diff --git a/src/platform/guiwin.cpp b/src/platform/guiwin.cpp index b93b87b4..ba9e18cf 100644 --- a/src/platform/guiwin.cpp +++ b/src/platform/guiwin.cpp @@ -1229,7 +1229,7 @@ public: sscheck(GetMonitorInfo(MonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST), &mi)); // If it somehow ended up off-screen, then put it back. - // and make it visible by at least this portion of the scrren + // and make it visible by at least this portion of the screen const LONG movein = 40; RECT mrc = mi.rcMonitor; @@ -1583,11 +1583,6 @@ public: ofn.nMaxFile = sizeof(filenameWC) / sizeof(wchar_t); ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT; - if(isSaveDialog) { - SetTitle(C_("title", "Save File")); - } else { - SetTitle(C_("title", "Open File")); - } } void SetTitle(std::string title) override { @@ -1640,13 +1635,14 @@ public: } bool RunModal() override { - if(GetFilename().IsEmpty()) { - SetFilename(Path::From(_("untitled"))); - } - if(isSaveDialog) { + SetTitle(C_("title", "Save File")); + if(GetFilename().IsEmpty()) { + SetFilename(Path::From(_("untitled"))); + } return GetSaveFileNameW(&ofn) == TRUE; } else { + SetTitle(C_("title", "Open File")); return GetOpenFileNameW(&ofn) == TRUE; } } diff --git a/src/render/render2d.cpp b/src/render/render2d.cpp index 710e795d..fd948e80 100644 --- a/src/render/render2d.cpp +++ b/src/render/render2d.cpp @@ -190,11 +190,11 @@ void SurfaceRenderer::DrawFaces(const SMesh &m, const std::vector &fac void SurfaceRenderer::DrawPixmap(std::shared_ptr pm, const Vector &o, const Vector &u, const Vector &v, const Point2d &ta, const Point2d &tb, hFill hcf) { - ssassert(false, "Not implemented"); + dbp("Not implemented"); } void SurfaceRenderer::InvalidatePixmap(std::shared_ptr pm) { - ssassert(false, "Not implemented"); + dbp("Not implemented"); } //----------------------------------------------------------------------------- diff --git a/src/sketch.h b/src/sketch.h index 68a912b3..812375f4 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -198,6 +198,9 @@ public: // For drawings in 2d WORKPLANE_BY_POINT_ORTHO = 6000, WORKPLANE_BY_LINE_SEGMENTS = 6001, + WORKPLANE_BY_POINT_NORMAL = 6002, + //WORKPLANE_BY_POINT_FACE = 6003, + //WORKPLANE_BY_FACE = 6004, // For extrudes, translates, and rotates ONE_SIDED = 7000, TWO_SIDED = 7001 @@ -266,6 +269,7 @@ public: void Generate(EntityList *entity, ParamList *param); bool IsSolvedOkay(); void TransformImportedBy(Vector t, Quaternion q); + bool IsTriangleMeshAssembly() const; bool IsForcedToMeshBySource() const; bool IsForcedToMesh() const; // When a request generates entities from entities, and the source @@ -323,6 +327,7 @@ public: void DrawPolyError(Canvas *canvas); void DrawFilledPaths(Canvas *canvas); void DrawContourAreaLabels(Canvas *canvas); + bool ShouldDrawExploded() const; SPolygon GetPolygon(); @@ -368,6 +373,7 @@ public: std::string font; Platform::Path file; double aspectRatio; + int groupRequestIndex; static hParam AddParam(ParamList *param, hParam hp); void Generate(EntityList *entity, ParamList *param); @@ -591,6 +597,10 @@ public: beziers.l.Clear(); edges.l.Clear(); } + + bool ShouldDrawExploded() const; + Vector ExplodeOffset() const; + Vector PointGetDrawNum() const; }; class EntReqTable { @@ -673,7 +683,10 @@ public: CURVE_CURVE_TANGENT = 125, EQUAL_RADIUS = 130, WHERE_DRAGGED = 200, - + ARC_ARC_LEN_RATIO = 210, + ARC_LINE_LEN_RATIO = 211, + ARC_ARC_DIFFERENCE = 212, + ARC_LINE_DIFFERENCE = 213, COMMENT = 1000 }; @@ -757,7 +770,7 @@ public: Vector p0, Vector p1, Vector pt, double salient); void DoArcForAngle(Canvas *canvas, Canvas::hStroke hcs, Vector a0, Vector da, Vector b0, Vector db, - Vector offset, Vector *ref, bool trim); + Vector offset, Vector *ref, bool trim, Vector explodeOffset); void DoArrow(Canvas *canvas, Canvas::hStroke hcs, Vector p, Vector dir, Vector n, double width, double angle, double da); void DoLineWithArrows(Canvas *canvas, Canvas::hStroke hcs, @@ -779,6 +792,8 @@ public: std::string DescriptionString() const; + bool ShouldDrawExploded() const; + static hConstraint AddConstraint(Constraint *c, bool rememberForUndo = true); static void MenuConstrain(Command id); static void DeleteAllConstraintsFor(Constraint::Type type, hEntity entityA, hEntity ptA); @@ -884,11 +899,14 @@ public: double width; int zIndex; bool exportable; + StipplePattern stippleType; } Default; static const Default Defaults[]; static std::string CnfColor(const std::string &prefix); static std::string CnfWidth(const std::string &prefix); + static std::string CnfStippleType(const std::string &prefix); + static std::string CnfStippleScale(const std::string &prefix); static std::string CnfTextHeight(const std::string &prefix); static std::string CnfPrefixToName(const std::string &prefix); static std::string CnfExportable(const std::string &prefix); @@ -918,7 +936,11 @@ public: static bool Exportable(int hs); static hStyle ForEntity(hEntity he); static StipplePattern PatternType(hStyle hs); + static double StippleScale(hStyle hs); static double StippleScaleMm(hStyle hs); + static std::string StipplePatternName(hStyle hs); + static std::string StipplePatternName(StipplePattern stippleType); + static StipplePattern StipplePatternFromString(std::string name); std::string DescriptionString() const; diff --git a/src/solvespace.cpp b/src/solvespace.cpp index 4e458cf4..78768871 100644 --- a/src/solvespace.cpp +++ b/src/solvespace.cpp @@ -19,6 +19,7 @@ void SolveSpaceUI::Init() { Platform::SettingsRef settings = Platform::GetSettings(); SS.tangentArcRadius = 10.0; + SS.explodeDistance = 1.0; // Then, load the registry settings. // Default list of colors for the model material @@ -104,6 +105,7 @@ void SolveSpaceUI::Init() { exportCanvas.dy = settings->ThawFloat("ExportCanvas_Dy", 5.0); // Extra parameters when exporting G code gCode.depth = settings->ThawFloat("GCode_Depth", 10.0); + gCode.safeHeight = settings->ThawFloat("GCode_SafeHeight", 5.0); gCode.passes = settings->ThawInt("GCode_Passes", 1); gCode.feed = settings->ThawFloat("GCode_Feed", 10.0); gCode.plungeFeed = settings->ThawFloat("GCode_PlungeFeed", 10.0); @@ -315,6 +317,7 @@ void SolveSpaceUI::ScheduleAutosave() { double SolveSpaceUI::MmPerUnit() { switch(viewUnits) { case Unit::INCHES: return 25.4; + case Unit::FEET_INCHES: return 25.4; // The 'unit' is still inches case Unit::METERS: return 1000.0; case Unit::MM: return 1.0; } @@ -323,14 +326,47 @@ double SolveSpaceUI::MmPerUnit() { const char *SolveSpaceUI::UnitName() { switch(viewUnits) { case Unit::INCHES: return "in"; + case Unit::FEET_INCHES: return "in"; case Unit::METERS: return "m"; case Unit::MM: return "mm"; } return ""; } -std::string SolveSpaceUI::MmToString(double v) { +std::string SolveSpaceUI::MmToString(double v, bool editable) { v /= MmPerUnit(); + // The syntax 2' 6" for feet and inches is not something we can (currently) + // parse back from a string so if editable is true, we treat FEET_INCHES the + // same as INCHES and just return the unadorned decimal number of inches. + if(viewUnits == Unit::FEET_INCHES && !editable) { + // Now convert v from inches to 64'ths of an inch, to make rounding easier. + v = floor((v + (1.0 / 128.0)) * 64.0); + int feet = (int)(v / (12.0 * 64.0)); + v = v - (feet * 12.0 * 64.0); + // v is now the feet-less remainder in 1/64 inches + int inches = (int)(v / 64.0); + int numerator = (int)(v - ((double)inches * 64.0)); + int denominator = 64; + // Divide down to smallest denominator where the numerator is still a whole number + while ((numerator != 0) && ((numerator & 1) == 0)) { + numerator /= 2; + denominator /= 2; + } + std::ostringstream str; + if(feet != 0) { + str << feet << "'-"; + } + // For something like 0.5, show 1/2" rather than 0 1/2" + if(!(feet == 0 && inches == 0 && numerator != 0)) { + str << inches; + } + if(numerator != 0) { + str << " " << numerator << "/" << denominator; + } + str << "\""; + return str.str(); + } + int digits = UnitDigitsAfterDecimal(); double minimum = 0.5 * pow(10,-digits); while ((v < minimum) && (v > LENGTH_EPS)) { @@ -349,7 +385,7 @@ static const char *DimToString(int dim) { } static std::pair SelectSIPrefixMm(int ord, int dim) { // decide what units to use depending on the order of magnitude of the -// measure in meters and the dimmension (1,2,3 lenear, area, volume) +// measure in meters and the dimension (1,2,3 lenear, area, volume) switch(dim) { case 0: case 1: @@ -378,7 +414,7 @@ static std::pair SelectSIPrefixMm(int ord, int dim) { default: dbp ("dimensions over 3 not supported"); break; - } + } return {0, "m"}; } static std::pair SelectSIPrefixInch(int deg) { @@ -394,17 +430,22 @@ std::string SolveSpaceUI::MmToStringSI(double v, int dim) { dim = 1; } - v /= pow((viewUnits == Unit::INCHES) ? 25.4 : 1000, dim); + bool inches = (viewUnits == Unit::INCHES) || (viewUnits == Unit::FEET_INCHES); + v /= pow(inches ? 25.4 : 1000, dim); int vdeg = (int)(log10(fabs(v))); std::string unit; if(fabs(v) > 0.0) { int sdeg = 0; std::tie(sdeg, unit) = - (viewUnits == Unit::INCHES) + inches ? SelectSIPrefixInch(vdeg/dim) : SelectSIPrefixMm(vdeg, dim); v /= pow(10.0, sdeg * dim); } + if(viewUnits == Unit::FEET_INCHES && fabs(v) > pow(12.0, dim)) { + unit = "ft"; + v /= pow(12.0, dim); + } int pdeg = (int)ceil(log10(fabs(v) + 1e-10)); return ssprintf("%.*g%s%s%s", pdeg + UnitDigitsAfterDecimal(), v, compact ? "" : " ", unit.c_str(), DimToString(dim)); @@ -434,10 +475,11 @@ int SolveSpaceUI::GetMaxSegments() { return maxSegments; } int SolveSpaceUI::UnitDigitsAfterDecimal() { - return (viewUnits == Unit::INCHES) ? afterDecimalInch : afterDecimalMm; + return (viewUnits == Unit::INCHES || viewUnits == Unit::FEET_INCHES) ? + afterDecimalInch : afterDecimalMm; } void SolveSpaceUI::SetUnitDigitsAfterDecimal(int v) { - if(viewUnits == Unit::INCHES) { + if(viewUnits == Unit::INCHES || viewUnits == Unit::FEET_INCHES) { afterDecimalInch = v; } else { afterDecimalMm = v; @@ -764,7 +806,11 @@ void SolveSpaceUI::MenuAnalyze(Command id) { SS.TW.stepDim.isDistance = (c->type != Constraint::Type::ANGLE) && (c->type != Constraint::Type::LENGTH_RATIO) && - (c->type != Constraint::Type::LENGTH_DIFFERENCE); + (c->type != Constraint::Type::ARC_ARC_LEN_RATIO) && + (c->type != Constraint::Type::ARC_LINE_LEN_RATIO) && + (c->type != Constraint::Type::LENGTH_DIFFERENCE) && + (c->type != Constraint::Type::ARC_ARC_DIFFERENCE) && + (c->type != Constraint::Type::ARC_LINE_DIFFERENCE) ; SS.TW.shown.constraint = c->h; SS.TW.shown.screen = TextWindow::Screen::STEP_DIMENSION; @@ -1026,12 +1072,14 @@ void SolveSpaceUI::Clear() { GW.showGridMenuItem = NULL; GW.dimSolidModelMenuItem = NULL; GW.perspectiveProjMenuItem = NULL; + GW.explodeMenuItem = NULL; GW.showToolbarMenuItem = NULL; GW.showTextWndMenuItem = NULL; GW.fullScreenMenuItem = NULL; GW.unitsMmMenuItem = NULL; GW.unitsMetersMenuItem = NULL; GW.unitsInchesMenuItem = NULL; + GW.unitsFeetInchesMenuItem = NULL; GW.inWorkplaneMenuItem = NULL; GW.in3dMenuItem = NULL; GW.undoMenuItem = NULL; diff --git a/src/solvespace.h b/src/solvespace.h index e64a1ab8..8a922167 100644 --- a/src/solvespace.h +++ b/src/solvespace.h @@ -138,7 +138,8 @@ enum class Command : uint32_t; enum class Unit : uint32_t { MM = 0, INCHES, - METERS + METERS, + FEET_INCHES }; template @@ -597,6 +598,7 @@ public: } exportCanvas; struct { double depth; + double safeHeight; int passes; double feed; double plungeFeed; @@ -608,8 +610,10 @@ public: int afterDecimalDegree; bool useSIPrefixes; int autosaveInterval; // in minutes + bool explode; + double explodeDistance; - std::string MmToString(double v); + std::string MmToString(double v, bool editable=false); std::string MmToStringSI(double v, int dim = 0); std::string DegreeToString(double v); double ExprToMm(Expr *e); @@ -812,6 +816,7 @@ public: void ImportDxf(const Platform::Path &file); void ImportDwg(const Platform::Path &file); bool LinkIDF(const Platform::Path &filename, EntityList *le, SMesh *m, SShell *sh); +bool LinkStl(const Platform::Path &filename, EntityList *le, SMesh *m, SShell *sh); extern SolveSpaceUI SS; extern Sketch SK; diff --git a/src/srf/boolean.cpp b/src/srf/boolean.cpp index 1edf46ed..7700e1b6 100644 --- a/src/srf/boolean.cpp +++ b/src/srf/boolean.cpp @@ -29,7 +29,7 @@ void SCurve::GetAxisAlignedBounding(Vector *ptMax, Vector *ptMin) const { } } -// We will be inserting other curve verticies into our curves to split them. +// We will be inserting other curve vertices into our curves to split them. // This is helpful when curved surfaces become tangent along a trim and the // usual tests for curve-surface intersection don't split the curve at a vertex. // This is faster than the previous version that split at surface corners and @@ -521,20 +521,19 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, SEdgeList inter = {}; SSurface *ss; - SCurve *sc; - for(sc = into->curve.First(); sc; sc = into->curve.NextAfter(sc)) { - if(sc->source != SCurve::Source::INTERSECTION) continue; + for(SCurve &sc : into->curve) { + if(sc.source != SCurve::Source::INTERSECTION) continue; if(opA) { - if(sc->surfA != h) continue; - ss = shb->surface.FindById(sc->surfB); + if(sc.surfA != h) continue; + ss = shb->surface.FindById(sc.surfB); } else { - if(sc->surfB != h) continue; - ss = sha->surface.FindById(sc->surfA); + if(sc.surfB != h) continue; + ss = sha->surface.FindById(sc.surfA); } int i; - for(i = 1; i < sc->pts.n; i++) { - Vector a = sc->pts[i-1].p, - b = sc->pts[i].p; + for(i = 1; i < sc.pts.n; i++) { + Vector a = sc.pts[i-1].p, + b = sc.pts[i].p; Point2d auv, buv; ss->ClosestPointTo(a, &(auv.x), &(auv.y)); @@ -560,9 +559,9 @@ SSurface SSurface::MakeCopyTrimAgainst(SShell *parent, bkwds = !bkwds; } if(bkwds) { - inter.AddEdge(tb, ta, sc->h.v, 1); + inter.AddEdge(tb, ta, sc.h.v, 1); } else { - inter.AddEdge(ta, tb, sc->h.v, 0); + inter.AddEdge(ta, tb, sc.h.v, 0); } } } @@ -711,20 +710,18 @@ void SShell::MakeIntersectionCurvesAgainst(SShell *agnst, SShell *into) { for(int i = 0; i< surface.n; i++) { SSurface *sa = &surface[i]; - SSurface *sb; - for(sb = agnst->surface.First(); sb; sb = agnst->surface.NextAfter(sb)){ + for(SSurface &sb : agnst->surface){ // Intersect every surface from our shell against every surface // from agnst; this will add zero or more curves to the curve // list for into. - sa->IntersectAgainst(sb, this, agnst, into); + sa->IntersectAgainst(&sb, this, agnst, into); } } } void SShell::CleanupAfterBoolean() { - SSurface *ss; - for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { - ss->edges.Clear(); + for(SSurface &ss : surface) { + ss.edges.Clear(); } } @@ -734,10 +731,9 @@ void SShell::CleanupAfterBoolean() { // by their new IDs. //----------------------------------------------------------------------------- void SShell::RewriteSurfaceHandlesForCurves(SShell *a, SShell *b) { - SCurve *sc; - for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) { - sc->surfA = sc->GetSurfaceA(a, b)->newH, - sc->surfB = sc->GetSurfaceB(a, b)->newH; + for(SCurve &sc : curve) { + sc.surfA = sc.GetSurfaceA(a, b)->newH, + sc.surfB = sc.GetSurfaceB(a, b)->newH; } } @@ -759,32 +755,32 @@ void SShell::MakeFromAssemblyOf(SShell *a, SShell *b) { // First, copy over all the curves. Note which shell (a or b) each curve // came from, but assign it a new ID. curve.ReserveMore(a->curve.n + b->curve.n); - SCurve *c, cn; + SCurve cn; for(i = 0; i < 2; i++) { ab = (i == 0) ? a : b; - for(c = ab->curve.First(); c; c = ab->curve.NextAfter(c)) { - cn = SCurve::FromTransformationOf(c, t, q, 1.0); + for(SCurve &c : ab->curve) { + cn = SCurve::FromTransformationOf(&c, t, q, 1.0); cn.source = (i == 0) ? SCurve::Source::A : SCurve::Source::B; // surfA and surfB are wrong now, and we can't fix them until // we've assigned IDs to the surfaces. So we'll get that later. - c->newH = curve.AddAndAssignId(&cn); + c.newH = curve.AddAndAssignId(&cn); } } // Likewise copy over all the surfaces. surface.ReserveMore(a->surface.n + b->surface.n); - SSurface *s, sn; + SSurface sn; for(i = 0; i < 2; i++) { ab = (i == 0) ? a : b; - for(s = ab->surface.First(); s; s = ab->surface.NextAfter(s)) { - sn = SSurface::FromTransformationOf(s, t, q, 1.0, /*includingTrims=*/true); + for(SSurface &s : ab->surface) { + sn = SSurface::FromTransformationOf(&s, t, q, 1.0, /*includingTrims=*/true); // All the trim curve IDs get rewritten; we know the new handles // to the curves since we recorded them in the previous step. STrimBy *stb; for(stb = sn.trim.First(); stb; stb = sn.trim.NextAfter(stb)) { stb->curve = ab->curve.FindById(stb->curve)->newH; } - s->newH = surface.AddAndAssignId(&sn); + s.newH = surface.AddAndAssignId(&sn); } } @@ -800,7 +796,7 @@ void SShell::MakeFromBoolean(SShell *a, SShell *b, SSurface::CombineAs type) { b->MakeClassifyingBsps(NULL); // Copy over all the original curves, splitting them so that a - // piecwise linear segment never crosses a surface from the other + // piecewise linear segment never crosses a surface from the other // shell. a->CopyCurvesSplitAgainst(/*opA=*/true, b, this); b->CopyCurvesSplitAgainst(/*opA=*/false, a, this); @@ -809,12 +805,11 @@ void SShell::MakeFromBoolean(SShell *a, SShell *b, SSurface::CombineAs type) { // the surfaces in B (which is all of the intersection curves). a->MakeIntersectionCurvesAgainst(b, this); - SCurve *sc; - for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) { - SSurface *srfA = sc->GetSurfaceA(a, b), - *srfB = sc->GetSurfaceB(a, b); + for(SCurve &sc : curve) { + SSurface *srfA = sc.GetSurfaceA(a, b), + *srfB = sc.GetSurfaceB(a, b); - sc->RemoveShortSegments(srfA, srfB); + sc.RemoveShortSegments(srfA, srfB); } // And clean up the piecewise linear things we made as a calculation aid diff --git a/src/srf/curve.cpp b/src/srf/curve.cpp index 55496b67..382415b1 100644 --- a/src/srf/curve.cpp +++ b/src/srf/curve.cpp @@ -817,7 +817,7 @@ void SCurve::RemoveShortSegments(SSurface *srfA, SSurface *srfB) { continue; } - // if the curve is exact and points are >0.05 appart wrt t, point is there + // if the curve is exact and points are >0.05 apart wrt t, point is there // deliberately regardless of chord tolerance (ex: small circles) tprev = t = tnext = 0; if (isExact) { diff --git a/src/srf/merge.cpp b/src/srf/merge.cpp index a91a307f..42ae5590 100644 --- a/src/srf/merge.cpp +++ b/src/srf/merge.cpp @@ -58,10 +58,9 @@ void SShell::MergeCoincidentSurfaces() { // All the references to this surface get replaced with the // new srf - SCurve *sc; - for(sc = curve.First(); sc; sc = curve.NextAfter(sc)) { - if(sc->surfA == sj->h) sc->surfA = si->h; - if(sc->surfB == sj->h) sc->surfB = si->h; + for(SCurve &sc : curve) { + if(sc.surfA == sj->h) sc.surfA = si->h; + if(sc.surfB == sj->h) sc.surfB = si->h; } } diff --git a/src/srf/raycast.cpp b/src/srf/raycast.cpp index 58779282..f1c0d2bd 100644 --- a/src/srf/raycast.cpp +++ b/src/srf/raycast.cpp @@ -381,9 +381,8 @@ void SShell::AllPointsIntersecting(Vector a, Vector b, List *il, bool asSegment, bool trimmed, bool inclTangent) { - SSurface *ss; - for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { - ss->AllPointsIntersecting(a, b, il, + for(SSurface &ss : surface) { + ss.AllPointsIntersecting(a, b, il, asSegment, trimmed, inclTangent); } } @@ -434,11 +433,10 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, // First, check for edge-on-edge int edge_inters = 0; Vector inter_surf_n[2], inter_edge_n[2]; - SSurface *srf; - for(srf = surface.First(); srf; srf = surface.NextAfter(srf)) { - if(srf->LineEntirelyOutsideBbox(ea, eb, /*asSegment=*/true)) continue; + for(SSurface &srf : surface) { + if(srf.LineEntirelyOutsideBbox(ea, eb, /*asSegment=*/true)) continue; - SEdgeList *sel = &(srf->edges); + SEdgeList *sel = &(srf.edges); SEdge *se; for(se = sel->l.First(); se; se = sel->l.NextAfter(se)) { if((ea.Equals(se->a) && eb.Equals(se->b)) || @@ -448,9 +446,9 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, if(edge_inters < 2) { // Edge-on-edge case Point2d pm; - srf->ClosestPointTo(p, &pm, /*mustConverge=*/false); + srf.ClosestPointTo(p, &pm, /*mustConverge=*/false); // A vector normal to the surface, at the intersection point - inter_surf_n[edge_inters] = srf->NormalAt(pm); + inter_surf_n[edge_inters] = srf.NormalAt(pm); // A vector normal to the intersecting edge (but within the // intersecting surface) at the intersection point, pointing // out. @@ -520,25 +518,25 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir, // are on surface) and for numerical stability, so we don't pick up // the additional error from the line intersection. - for(srf = surface.First(); srf; srf = surface.NextAfter(srf)) { - if(srf->LineEntirelyOutsideBbox(ea, eb, /*asSegment=*/true)) continue; + for(SSurface &srf : surface) { + if(srf.LineEntirelyOutsideBbox(ea, eb, /*asSegment=*/true)) continue; Point2d puv; - srf->ClosestPointTo(p, &(puv.x), &(puv.y), /*mustConverge=*/false); - Vector pp = srf->PointAt(puv); + srf.ClosestPointTo(p, &(puv.x), &(puv.y), /*mustConverge=*/false); + Vector pp = srf.PointAt(puv); if((pp.Minus(p)).Magnitude() > LENGTH_EPS) continue; Point2d dummy = { 0, 0 }; - SBspUv::Class c = (srf->bsp) ? srf->bsp->ClassifyPoint(puv, dummy, srf) : SBspUv::Class::OUTSIDE; + SBspUv::Class c = (srf.bsp) ? srf.bsp->ClassifyPoint(puv, dummy, &srf) : SBspUv::Class::OUTSIDE; if(c == SBspUv::Class::OUTSIDE) continue; // Edge-on-face (unless edge-on-edge above superceded) Point2d pin, pout; - srf->ClosestPointTo(p.Plus(edge_n_in), &pin, /*mustConverge=*/false); - srf->ClosestPointTo(p.Plus(edge_n_out), &pout, /*mustConverge=*/false); + srf.ClosestPointTo(p.Plus(edge_n_in), &pin, /*mustConverge=*/false); + srf.ClosestPointTo(p.Plus(edge_n_out), &pout, /*mustConverge=*/false); - Vector surf_n_in = srf->NormalAt(pin), - surf_n_out = srf->NormalAt(pout); + Vector surf_n_in = srf.NormalAt(pin), + surf_n_out = srf.NormalAt(pout); *indir = ClassifyRegion(edge_n_in, surf_n_in, surf_n); *outdir = ClassifyRegion(edge_n_out, surf_n_out, surf_n); diff --git a/src/srf/surface.cpp b/src/srf/surface.cpp index 815aedad..c63875e5 100644 --- a/src/srf/surface.cpp +++ b/src/srf/surface.cpp @@ -1038,35 +1038,31 @@ void SShell::MakeFromTransformationOf(SShell *a, { booleanFailed = false; surface.ReserveMore(a->surface.n); - SSurface *s; - for(s = a->surface.First(); s; s = a->surface.NextAfter(s)) { + for(SSurface &s : a->surface) { SSurface n; - n = SSurface::FromTransformationOf(s, t, q, scale, /*includingTrims=*/true); + n = SSurface::FromTransformationOf(&s, t, q, scale, /*includingTrims=*/true); surface.Add(&n); // keeping the old ID } curve.ReserveMore(a->curve.n); - SCurve *c; - for(c = a->curve.First(); c; c = a->curve.NextAfter(c)) { + for(SCurve &c : a->curve) { SCurve n; - n = SCurve::FromTransformationOf(c, t, q, scale); + n = SCurve::FromTransformationOf(&c, t, q, scale); curve.Add(&n); // keeping the old ID } } void SShell::MakeEdgesInto(SEdgeList *sel) { - SSurface *s; - for(s = surface.First(); s; s = surface.NextAfter(s)) { - s->MakeEdgesInto(this, sel, SSurface::MakeAs::XYZ); + for(SSurface &s : surface) { + s.MakeEdgesInto(this, sel, SSurface::MakeAs::XYZ); } } void SShell::MakeSectionEdgesInto(Vector n, double d, SEdgeList *sel, SBezierList *sbl) { - SSurface *s; - for(s = surface.First(); s; s = surface.NextAfter(s)) { - if(s->CoincidentWithPlane(n, d)) { - s->MakeSectionEdgesInto(this, sel, sbl); + for(SSurface &s : surface) { + if(s.CoincidentWithPlane(n, d)) { + s.MakeSectionEdgesInto(this, sel, sbl); } } } @@ -1088,15 +1084,13 @@ bool SShell::IsEmpty() const { } void SShell::Clear() { - SSurface *s; - for(s = surface.First(); s; s = surface.NextAfter(s)) { - s->Clear(); + for(SSurface &s : surface) { + s.Clear(); } surface.Clear(); - SCurve *c; - for(c = curve.First(); c; c = curve.NextAfter(c)) { - c->Clear(); + for(SCurve &c : curve) { + c.Clear(); } curve.Clear(); } diff --git a/src/srf/surfinter.cpp b/src/srf/surfinter.cpp index 0a827761..9e03a83c 100644 --- a/src/srf/surfinter.cpp +++ b/src/srf/surfinter.cpp @@ -23,20 +23,20 @@ void SSurface::AddExactIntersectionCurve(SBezier *sb, SSurface *srfB, // Now we have to piecewise linearize the curve. If there's already an // identical curve in the shell, then follow that pwl exactly, otherwise // calculate from scratch. - SCurve split, *existing = NULL, *se; + SCurve split, *existing = NULL; SBezier sbrev = *sb; sbrev.Reverse(); bool backwards = false; #pragma omp critical(into) { - for(se = into->curve.First(); se; se = into->curve.NextAfter(se)) { - if(se->isExact) { - if(sb->Equals(&(se->exact))) { - existing = se; + for(SCurve &se : into->curve) { + if(se.isExact) { + if(sb->Equals(&(se.exact))) { + existing = &se; break; } - if(sbrev.Equals(&(se->exact))) { - existing = se; + if(sbrev.Equals(&(se.exact))) { + existing = &se; backwards = true; break; } @@ -332,15 +332,14 @@ void SSurface::IntersectAgainst(SSurface *b, SShell *agnstA, SShell *agnstB, shext = agnstA; } bool foundExact = false; - SCurve *sc; - for(sc = shext->curve.First(); sc; sc = shext->curve.NextAfter(sc)) { - if(sc->source == SCurve::Source::INTERSECTION) continue; - if(!sc->isExact) continue; - if((sc->surfA != sext->h) && (sc->surfB != sext->h)) continue; + for(SCurve &sc : shext->curve) { + if(sc.source == SCurve::Source::INTERSECTION) continue; + if(!sc.isExact) continue; + if((sc.surfA != sext->h) && (sc.surfB != sext->h)) continue; // we have a curve belonging to the curved surface and not the plane. // does it lie completely in the plane? - if(splane->ContainsPlaneCurve(sc)) { - SBezier bezier = sc->exact; + if(splane->ContainsPlaneCurve(&sc)) { + SBezier bezier = sc.exact; AddExactIntersectionCurve(&bezier, b, agnstA, agnstB, into); foundExact = true; } @@ -571,10 +570,9 @@ bool SSurface::ContainsPlaneCurve(SCurve *sc) const { void SShell::MakeCoincidentEdgesInto(SSurface *proto, bool sameNormal, SEdgeList *el, SShell *useCurvesFrom) { - SSurface *ss; - for(ss = surface.First(); ss; ss = surface.NextAfter(ss)) { - if(proto->CoincidentWith(ss, sameNormal)) { - ss->MakeEdgesInto(this, el, SSurface::MakeAs::XYZ, useCurvesFrom); + for(SSurface &ss : surface) { + if(proto->CoincidentWith(&ss, sameNormal)) { + ss.MakeEdgesInto(this, el, SSurface::MakeAs::XYZ, useCurvesFrom); } } diff --git a/src/srf/triangulate.cpp b/src/srf/triangulate.cpp index d02f9638..464bce62 100644 --- a/src/srf/triangulate.cpp +++ b/src/srf/triangulate.cpp @@ -426,7 +426,7 @@ void SContour::UvTriangulateInto(SMesh *m, SSurface *srf) { if (i == l.n-1) { end = true; } - if (end) { // triangulate the fan and tag the verticies + if (end) { // triangulate the fan and tag the vertices if (j > 3) { Vector center = l[pstart+1].p.Plus(l[pstart+j-1].p).ScaledBy(0.5); for (int x=0; xMakeTriangulationGridInto(&lj, 0, 1, /*swapped=*/false, 0); // force 2nd order grid to have at least 4 segments in each direction - if ((li.n < 5) && (srf->degm>1)) { // 4 segments minimun + if ((li.n < 5) && (srf->degm>1)) { // 4 segments minimum li.Clear(); li.Add(&v[0]);li.Add(&v[1]);li.Add(&v[2]);li.Add(&v[3]);li.Add(&v[4]); } - if ((lj.n < 5) && (srf->degn>1)) { // 4 segments minimun + if ((lj.n < 5) && (srf->degn>1)) { // 4 segments minimum lj.Clear(); lj.Add(&v[0]);lj.Add(&v[1]);lj.Add(&v[2]);lj.Add(&v[3]);lj.Add(&v[4]); } @@ -681,7 +681,7 @@ void SPolygon::UvGridTriangulateInto(SMesh *mesh, SSurface *srf) { if (!bottom[j]) // add our own bottom edge holes.AddEdge(a, b); } else { - if (prev_flag) // add our left neighbots right edge + if (prev_flag) // add our left neighbors right edge holes.AddEdge(a, d); if (bottom[j]) // add our bottom neighbors top edge holes.AddEdge(b, a); diff --git a/src/style.cpp b/src/style.cpp index 19a1835c..4349eb36 100644 --- a/src/style.cpp +++ b/src/style.cpp @@ -8,22 +8,22 @@ #include "solvespace.h" const Style::Default Style::Defaults[] = { - { { ACTIVE_GRP }, "ActiveGrp", RGBf(1.0, 1.0, 1.0), 1.5, 4, true }, - { { CONSTRUCTION }, "Construction", RGBf(0.1, 0.7, 0.1), 1.5, 0, false }, - { { INACTIVE_GRP }, "InactiveGrp", RGBf(0.5, 0.3, 0.0), 1.5, 3, true }, - { { DATUM }, "Datum", RGBf(0.0, 0.8, 0.0), 1.5, 0, true }, - { { SOLID_EDGE }, "SolidEdge", RGBf(0.8, 0.8, 0.8), 1.0, 2, true }, - { { CONSTRAINT }, "Constraint", RGBf(1.0, 0.1, 1.0), 1.0, 0, true }, - { { SELECTED }, "Selected", RGBf(1.0, 0.0, 0.0), 1.5, 0, true }, - { { HOVERED }, "Hovered", RGBf(1.0, 1.0, 0.0), 1.5, 0, true }, - { { CONTOUR_FILL }, "ContourFill", RGBf(0.0, 0.1, 0.1), 1.0, 0, true }, - { { NORMALS }, "Normals", RGBf(0.0, 0.4, 0.4), 1.0, 0, true }, - { { ANALYZE }, "Analyze", RGBf(0.0, 1.0, 1.0), 3.0, 0, true }, - { { DRAW_ERROR }, "DrawError", RGBf(1.0, 0.0, 0.0), 8.0, 0, true }, - { { DIM_SOLID }, "DimSolid", RGBf(0.1, 0.1, 0.1), 1.0, 0, true }, - { { HIDDEN_EDGE }, "HiddenEdge", RGBf(0.8, 0.8, 0.8), 1.0, 1, true }, - { { OUTLINE }, "Outline", RGBf(0.8, 0.8, 0.8), 3.0, 5, true }, - { { 0 }, NULL, RGBf(0.0, 0.0, 0.0), 0.0, 0, true } + { { ACTIVE_GRP }, "ActiveGrp", RGBf(1.0, 1.0, 1.0), 1.5, 4, true, StipplePattern::CONTINUOUS }, + { { CONSTRUCTION }, "Construction", RGBf(0.1, 0.7, 0.1), 1.5, 0, false, StipplePattern::CONTINUOUS }, + { { INACTIVE_GRP }, "InactiveGrp", RGBf(0.5, 0.3, 0.0), 1.5, 3, true, StipplePattern::CONTINUOUS }, + { { DATUM }, "Datum", RGBf(0.0, 0.8, 0.0), 1.5, 0, true, StipplePattern::CONTINUOUS }, + { { SOLID_EDGE }, "SolidEdge", RGBf(0.8, 0.8, 0.8), 1.0, 2, true, StipplePattern::CONTINUOUS }, + { { CONSTRAINT }, "Constraint", RGBf(1.0, 0.1, 1.0), 1.0, 0, true, StipplePattern::CONTINUOUS }, + { { SELECTED }, "Selected", RGBf(1.0, 0.0, 0.0), 1.5, 0, true, StipplePattern::CONTINUOUS }, + { { HOVERED }, "Hovered", RGBf(1.0, 1.0, 0.0), 1.5, 0, true, StipplePattern::CONTINUOUS }, + { { CONTOUR_FILL }, "ContourFill", RGBf(0.0, 0.1, 0.1), 1.0, 0, true, StipplePattern::CONTINUOUS }, + { { NORMALS }, "Normals", RGBf(0.0, 0.4, 0.4), 1.0, 0, true, StipplePattern::CONTINUOUS }, + { { ANALYZE }, "Analyze", RGBf(0.0, 1.0, 1.0), 3.0, 0, true, StipplePattern::CONTINUOUS }, + { { DRAW_ERROR }, "DrawError", RGBf(1.0, 0.0, 0.0), 8.0, 0, true, StipplePattern::CONTINUOUS }, + { { DIM_SOLID }, "DimSolid", RGBf(0.1, 0.1, 0.1), 1.0, 0, true, StipplePattern::CONTINUOUS }, + { { HIDDEN_EDGE }, "HiddenEdge", RGBf(0.8, 0.8, 0.8), 1.0, 1, true, StipplePattern::DASH }, + { { OUTLINE }, "Outline", RGBf(0.8, 0.8, 0.8), 3.0, 5, true, StipplePattern::CONTINUOUS }, + { { 0 }, NULL, RGBf(0.0, 0.0, 0.0), 0.0, 0, true, StipplePattern::CONTINUOUS } }; std::string Style::CnfColor(const std::string &prefix) { @@ -32,6 +32,12 @@ std::string Style::CnfColor(const std::string &prefix) { std::string Style::CnfWidth(const std::string &prefix) { return "Style_" + prefix + "_Width"; } +std::string Style::CnfStippleType(const std::string &prefix) { + return "Style_" + prefix + "_StippleType"; +} +std::string Style::CnfStippleScale(const std::string &prefix) { + return "Style_" + prefix + "_StippleScale"; +} std::string Style::CnfTextHeight(const std::string &prefix) { return "Style_" + prefix + "_TextHeight"; } @@ -105,9 +111,14 @@ void Style::FillDefaultStyle(Style *s, const Default *d, bool factory) { : settings->ThawBool(CnfExportable(d->cnfPrefix), d->exportable); s->filled = false; s->fillColor = RGBf(0.3, 0.3, 0.3); - s->stippleType = (d->h.v == Style::HIDDEN_EDGE) ? StipplePattern::DASH - : StipplePattern::CONTINUOUS; - s->stippleScale = 15.0; + s->stippleType = (factory) + ? d->stippleType + : Style::StipplePatternFromString( + settings->ThawString(CnfStippleType(d->cnfPrefix), + StipplePatternName(d->stippleType))); + s->stippleScale = (factory) + ? 15.0 + : settings->ThawFloat(CnfStippleScale(d->cnfPrefix), 15.0); s->zIndex = d->zIndex; } @@ -125,6 +136,8 @@ void Style::FreezeDefaultStyles(Platform::SettingsRef settings) { for(d = &(Defaults[0]); d->h.v; d++) { settings->FreezeColor(CnfColor(d->cnfPrefix), Color(d->h)); settings->FreezeFloat(CnfWidth(d->cnfPrefix), (float)Width(d->h)); + settings->FreezeString(CnfStippleType(d->cnfPrefix), StipplePatternName(d->h)); + settings->FreezeFloat(CnfStippleScale(d->cnfPrefix), (float)StippleScale(d->h)); settings->FreezeFloat(CnfTextHeight(d->cnfPrefix), (float)TextHeight(d->h)); settings->FreezeBool(CnfExportable(d->cnfPrefix), Exportable(d->h.v)); } @@ -353,11 +366,62 @@ hStyle Style::ForEntity(hEntity he) { return hs; } +StipplePattern Style::StipplePatternFromString(std::string name) { + std::transform(name.begin(), name.end(), name.begin(), ::tolower); + if(name == "continuous") { + return StipplePattern::CONTINUOUS; + } else if(name == "shortdash") { + return StipplePattern::SHORT_DASH; + } else if(name == "dash") { + return StipplePattern::DASH; + } else if(name == "longdash") { + return StipplePattern::LONG_DASH; + } else if(name == "dashdot") { + return StipplePattern::DASH_DOT; + } else if(name == "dashdotdot") { + return StipplePattern::DASH_DOT_DOT; + } else if(name == "dot") { + return StipplePattern::DOT; + } else if(name == "freehand") { + return StipplePattern::FREEHAND; + } else if(name == "zigzag") { + return StipplePattern::ZIGZAG; + } + + return StipplePattern::CONTINUOUS; +} + StipplePattern Style::PatternType(hStyle hs) { Style *s = Get(hs); return s->stippleType; } +std::string Style::StipplePatternName(hStyle hs) { + Style *s = Get(hs); + return StipplePatternName(s->stippleType); +} + +std::string Style::StipplePatternName(StipplePattern stippleType) { + switch(stippleType) { + case StipplePattern::CONTINUOUS: return "Continuous"; + case StipplePattern::SHORT_DASH: return "ShortDash"; + case StipplePattern::DASH: return "Dash"; + case StipplePattern::LONG_DASH: return "LongDash"; + case StipplePattern::DASH_DOT: return "DashDot"; + case StipplePattern::DASH_DOT_DOT: return "DashDotDot"; + case StipplePattern::DOT: return "Dot"; + case StipplePattern::FREEHAND: return "FreeHand"; + case StipplePattern::ZIGZAG: return "ZigZag"; + } + + return "Continuous"; +} + +double Style::StippleScale(hStyle hs) { + Style *s = Get(hs); + return s->stippleScale; +} + double Style::StippleScaleMm(hStyle hs) { Style *s = Get(hs); if(s->widthAs == UnitsAs::MM) { @@ -389,6 +453,7 @@ void TextWindow::ScreenShowStyleInfo(int link, uint32_t v) { void TextWindow::ScreenLoadFactoryDefaultStyles(int link, uint32_t v) { Style::LoadFactoryDefaults(); SS.TW.GoToScreen(Screen::LIST_OF_STYLES); + SS.GW.persistentDirty = true; } void TextWindow::ScreenCreateCustomStyle(int link, uint32_t v) { @@ -405,14 +470,13 @@ void TextWindow::ShowListOfStyles() { Printf(true, "%Ft color style-name"); bool darkbg = false; - Style *s; - for(s = SK.style.First(); s; s = SK.style.NextAfter(s)) { + for(Style &s : SK.style) { Printf(false, "%Bp %Bz %Bp %Fl%Ll%f%D%s%E", darkbg ? 'd' : 'a', - &s->color, + &s.color, darkbg ? 'd' : 'a', - ScreenShowStyleInfo, s->h.v, - s->DescriptionString().c_str()); + ScreenShowStyleInfo, s.h.v, + s.DescriptionString().c_str()); darkbg = !darkbg; } @@ -499,7 +563,7 @@ void TextWindow::ScreenChangeStyleMetric(int link, uint32_t v) { if(units == Style::UnitsAs::PIXELS) { edit_value = ssprintf("%.2f", val); } else { - edit_value = SS.MmToString(val); + edit_value = SS.MmToString(val, true); } SS.TW.ShowEditControl(col, edit_value); SS.TW.edit.style = hs; diff --git a/src/textscreens.cpp b/src/textscreens.cpp index 07d5cdee..22553827 100644 --- a/src/textscreens.cpp +++ b/src/textscreens.cpp @@ -123,13 +123,18 @@ void TextWindow::ShowListOfGroups() { sprintf(sdof, "%-3d", dof); } } + std::string suffix; + if(g->forceToMesh || g->IsTriangleMeshAssembly()) { + suffix = " (∆)"; + } + bool ref = (g->h == Group::HGROUP_REFERENCES); Printf(false, "%Bp%Fd " "%Ft%s%Fb%D%f%Ll%s%E " "%Fb%s%D%f%Ll%s%E " "%Fp%D%f%s%Ll%s%E " - "%Fl%Ll%D%f%s", + "%Fp%Ll%D%f%s%E%s", // Alternate between light and dark backgrounds, for readability backgroundParity ? 'd' : 'a', // Link that activates the group @@ -146,7 +151,9 @@ void TextWindow::ShowListOfGroups() { ok ? ((warn && SS.checkClosedContour) ? "err" : sdof) : "", ok ? "" : "ERR", // Link to a screen that gives more details on the group - g->h.v, (&TextWindow::ScreenSelectGroup), s.c_str()); + g->suppress ? 'g' : 'l', + g->h.v, (&TextWindow::ScreenSelectGroup), s.c_str(), + suffix.c_str()); if(active) afterActive = true; backgroundParity = !backgroundParity; @@ -299,6 +306,23 @@ void TextWindow::ScreenChangeGroupScale(int link, uint32_t v) { SS.TW.edit.meaning = Edit::GROUP_SCALE; SS.TW.edit.group.v = v; } +void TextWindow::ScreenChangeHelixPitch(int link, uint32_t v) { + Group *g = SK.GetGroup(SS.TW.shown.group); + double pitch = g->valB/SS.MmPerUnit(); + SS.TW.ShowEditControl(3, ssprintf("%.8f", pitch)); + SS.TW.edit.meaning = Edit::HELIX_PITCH; + SS.TW.edit.group.v = v; +} +void TextWindow::ScreenChangePitchOption(int link, uint32_t v) { + Group *g = SK.GetGroup(SS.TW.shown.group); + if(g->valB == 0.0) { + g->valB = SK.GetParam(g->h.param(7))->val * PI / + (SK.GetParam(g->h.param(3))->val); + } else { + g->valB = 0.0; + } + SS.GW.Invalidate(); +} void TextWindow::ScreenDeleteGroup(int link, uint32_t v) { SS.UndoRemember(); @@ -398,6 +422,26 @@ void TextWindow::ShowGroupInfo() { } Printf(false, ""); + if(g->type == Group::Type::HELIX) { + Printf(false, "%Ft pitch - length per turn%E"); + + if (fabs(g->valB) != 0.0) { + Printf(false, " %Ba %# %Fl%Ll%f%D[change]%E", + g->valB / SS.MmPerUnit(), + &TextWindow::ScreenChangeHelixPitch, g->h.v); + } else { + Printf(false, " %Ba %# %E", + SK.GetParam(g->h.param(7))->val * PI / + ( (SK.GetParam(g->h.param(3))->val) * SS.MmPerUnit() ), + &TextWindow::ScreenChangeHelixPitch, g->h.v); + } + Printf(false, " %Fd%f%LP%s fixed", + &TextWindow::ScreenChangePitchOption, + g->valB != 0 ? CHECK_TRUE : CHECK_FALSE); + + Printf(false, ""); // blank line + } + if(g->type == Group::Type::EXTRUDE || g->type == Group::Type::LATHE || g->type == Group::Type::REVOLVE || g->type == Group::Type::LINKED || g->type == Group::Type::HELIX) { @@ -451,7 +495,7 @@ void TextWindow::ShowGroupInfo() { &TextWindow::ScreenChangeGroupOption, g->visible ? CHECK_TRUE : CHECK_FALSE); - if(!g->IsForcedToMeshBySource()) { + if(!g->IsForcedToMeshBySource() && !g->IsTriangleMeshAssembly()) { Printf(false, " %f%Lf%Fd%s force NURBS surfaces to triangle mesh", &TextWindow::ScreenChangeGroupOption, g->forceToMesh ? CHECK_TRUE : CHECK_FALSE); @@ -579,7 +623,7 @@ void TextWindow::ShowGroupSolveInfo() { } if(g->solved.timeout) { - Printf(true, "%FxSome items in list have been ommitted%Fd"); + Printf(true, "%FxSome items in list have been omitted%Fd"); Printf(false, "%Fxbecause the operation timed out.%Fd"); } @@ -603,7 +647,7 @@ void TextWindow::ScreenStepDimFinish(int link, uint32_t v) { SS.TW.edit.meaning = Edit::STEP_DIM_FINISH; std::string edit_value; if(SS.TW.stepDim.isDistance) { - edit_value = SS.MmToString(SS.TW.stepDim.finish); + edit_value = SS.MmToString(SS.TW.stepDim.finish, true); } else { edit_value = ssprintf("%.3f", SS.TW.stepDim.finish); } @@ -690,7 +734,7 @@ void TextWindow::ScreenChangeTangentArc(int link, uint32_t v) { switch(link) { case 'r': { SS.TW.edit.meaning = Edit::TANGENT_ARC_RADIUS; - SS.TW.ShowEditControl(3, SS.MmToString(SS.tangentArcRadius)); + SS.TW.ShowEditControl(3, SS.MmToString(SS.tangentArcRadius, true)); break; } @@ -789,6 +833,15 @@ void TextWindow::EditControlDone(std::string s) { } break; + case Edit::HELIX_PITCH: // stored in valB + if(Expr *e = Expr::From(s, /*popUpError=*/true)) { + double ev = e->Eval(); + Group *g = SK.GetGroup(edit.group); + g->valB = ev * SS.MmPerUnit(); + SS.MarkGroupDirty(g->h); + } + break; + case Edit::GROUP_COLOR: { Vector rgb; if(sscanf(s.c_str(), "%lf, %lf, %lf", &rgb.x, &rgb.y, &rgb.z)==3) { diff --git a/src/textwin.cpp b/src/textwin.cpp index 3e339226..d0755b07 100644 --- a/src/textwin.cpp +++ b/src/textwin.cpp @@ -203,7 +203,7 @@ const TextWindow::Color TextWindow::fgColors[] = { { 'r', RGBi( 0, 0, 0) }, // Reverse : black { 'x', RGBi(255, 20, 20) }, // Error : red { 'i', RGBi( 0, 255, 255) }, // Info : cyan - { 'g', RGBi(160, 160, 160) }, + { 'g', RGBi(128, 128, 128) }, // Disabled : gray { 'b', RGBi(200, 200, 200) }, { 0, RGBi( 0, 0, 0) } }; @@ -348,8 +348,8 @@ void TextWindow::ClearScreen() { rows = 0; } -// This message was addded when someone had too many fonts for the text window -// Scrolling seemed to be broken, but was actaully at the MAX_ROWS. +// This message was added when someone had too many fonts for the text window +// Scrolling seemed to be broken, but was actually at the MAX_ROWS. static const char* endString = " **** End of Text Screen ****"; void TextWindow::Printf(bool halfLine, const char *fmt, ...) { diff --git a/src/toolbar.cpp b/src/toolbar.cpp index bf6b59c5..74764883 100644 --- a/src/toolbar.cpp +++ b/src/toolbar.cpp @@ -153,11 +153,18 @@ bool GraphicsWindow::ToolbarDrawOrHitTest(int mx, int my, UiCanvas *canvas, double width, height; window->GetContentSize(&width, &height); - int x = 17, y = (int)(height - 52); + int x = 17, y = (int)(height - 21); // 20 is the menu bar height - // When changing these values, also change the asReference drawing code in drawentity.cpp. + // When changing these values, also change the asReference drawing code in drawentity.cpp + // as well as the "window->SetMinContentSize(720, 636);" in graphicswin.cpp int fudge = 8; - int h = 32*18 + 3*16 + fudge; + int h = 32*18 + 3*16 + fudge; // Toolbar height = 18 icons * 32 pixels + 3 dividers * 16 pixels + fudge + + if(h < y) { + // If there is enough vertical space leave up to 32 pixels between the menu bar and the toolbar. + y -= ((y - h) < 32) ? y - h : 32; + } + int aleft = 0, aright = 66, atop = y+16+fudge/2, abot = y+16-h; bool withinToolbar = diff --git a/src/ui.h b/src/ui.h index 026d57de..21b00cd4 100644 --- a/src/ui.h +++ b/src/ui.h @@ -82,6 +82,7 @@ enum class Command : uint32_t { SHOW_GRID, DIM_SOLID_MODEL, PERSPECTIVE_PROJ, + EXPLODE_SKETCH, ONTO_WORKPLANE, NEAREST_ORTHO, NEAREST_ISO, @@ -89,6 +90,7 @@ enum class Command : uint32_t { SHOW_TOOLBAR, SHOW_TEXT_WND, UNITS_INCHES, + UNITS_FEET_INCHES, UNITS_MM, UNITS_METERS, FULL_SCREEN, @@ -312,12 +314,14 @@ public: EXPORT_OFFSET = 110, CANVAS_SIZE = 111, G_CODE_DEPTH = 112, - G_CODE_PASSES = 113, - G_CODE_FEED = 114, - G_CODE_PLUNGE_FEED = 115, - AUTOSAVE_INTERVAL = 116, - LIGHT_AMBIENT = 117, - FIND_CONSTRAINT_TIMEOUT = 118, + G_CODE_SAFE_HEIGHT = 113, + G_CODE_PASSES = 114, + G_CODE_FEED = 115, + G_CODE_PLUNGE_FEED = 116, + AUTOSAVE_INTERVAL = 117, + LIGHT_AMBIENT = 118, + FIND_CONSTRAINT_TIMEOUT = 119, + EXPLODE_DISTANCE = 120, // For TTF text TTF_TEXT = 300, // For the step dimension screen @@ -342,7 +346,9 @@ public: VIEW_PROJ_RIGHT = 702, VIEW_PROJ_UP = 703, // For tangent arc - TANGENT_ARC_RADIUS = 800 + TANGENT_ARC_RADIUS = 800, + // For helix pitch + HELIX_PITCH = 802 }; struct { bool showAgain; @@ -473,6 +479,8 @@ public: static void ScreenChangeExprA(int link, uint32_t v); static void ScreenChangeGroupName(int link, uint32_t v); static void ScreenChangeGroupScale(int link, uint32_t v); + static void ScreenChangeHelixPitch(int link, uint32_t v); + static void ScreenChangePitchOption(int link, uint32_t v); static void ScreenChangeLightDirection(int link, uint32_t v); static void ScreenChangeLightIntensity(int link, uint32_t v); static void ScreenChangeLightAmbient(int link, uint32_t v); @@ -483,6 +491,7 @@ public: static void ScreenChangeExportMaxSegments(int link, uint32_t v); static void ScreenChangeCameraTangent(int link, uint32_t v); static void ScreenChangeGridSpacing(int link, uint32_t v); + static void ScreenChangeExplodeDistance(int link, uint32_t v); static void ScreenChangeDigitsAfterDecimal(int link, uint32_t v); static void ScreenChangeDigitsAfterDecimalDegree(int link, uint32_t v); static void ScreenChangeUseSIPrefixes(int link, uint32_t v); @@ -535,6 +544,7 @@ public: Platform::MenuItemRef showGridMenuItem; Platform::MenuItemRef dimSolidModelMenuItem; Platform::MenuItemRef perspectiveProjMenuItem; + Platform::MenuItemRef explodeMenuItem; Platform::MenuItemRef showToolbarMenuItem; Platform::MenuItemRef showTextWndMenuItem; Platform::MenuItemRef fullScreenMenuItem; @@ -542,6 +552,7 @@ public: Platform::MenuItemRef unitsMmMenuItem; Platform::MenuItemRef unitsMetersMenuItem; Platform::MenuItemRef unitsInchesMenuItem; + Platform::MenuItemRef unitsFeetInchesMenuItem; Platform::MenuItemRef inWorkplaneMenuItem; Platform::MenuItemRef in3dMenuItem; @@ -798,6 +809,8 @@ public: bool showEdges; bool showOutlines; bool showFaces; + bool showFacesDrawing; + bool showFacesNonDrawing; bool showMesh; void ToggleBool(bool *v); diff --git a/src/view.cpp b/src/view.cpp index 14d09ba3..99067bc5 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -35,8 +35,29 @@ void TextWindow::ShowEditView() { Printf(false, "%Ba %Ftout%E (%3, %3, %3)", CO(n)); Printf(false, ""); - Printf(false, "The perspective may be changed in the"); - Printf(false, "configuration screen."); + Printf(false, "%Ft perspective factor (0 for parallel)%E"); + Printf(false, "%Ba %# %Fl%Ll%f%D[change]%E", + SS.cameraTangent*1000, + &ScreenChangeCameraTangent, 0); + + Printf(false, ""); + Printf(false, "%Ft light direction intensity"); + for(int i = 0; i < 2; i++) { + Printf(false, "%Bp #%d (%2,%2,%2)%Fl%D%f%Ll[c]%E " + "%2 %Fl%D%f%Ll[c]%E", + (i & 1) ? 'd' : 'a', i, + CO(SS.lightDir[i]), i, &ScreenChangeLightDirection, + SS.lightIntensity[i], i, &ScreenChangeLightIntensity); + } + Printf(false, "%Ba ambient lighting %2 %Fl%f%Ll[c]%E", + SS.ambientIntensity, &ScreenChangeLightAmbient); + + Printf(false, ""); + Printf(false, "%Ft explode distance%E"); + Printf(false, "%Ba %s %Fl%Ll%f%D[change]%E", + SS.MmToString(SS.explodeDistance).c_str(), + &ScreenChangeExplodeDistance, 0); + } void TextWindow::ScreenChangeViewScale(int link, uint32_t v) { @@ -51,9 +72,9 @@ void TextWindow::ScreenChangeViewToFullScale(int link, uint32_t v) { void TextWindow::ScreenChangeViewOrigin(int link, uint32_t v) { std::string edit_value = ssprintf("%s, %s, %s", - SS.MmToString(-SS.GW.offset.x).c_str(), - SS.MmToString(-SS.GW.offset.y).c_str(), - SS.MmToString(-SS.GW.offset.z).c_str()); + SS.MmToString(-SS.GW.offset.x, true).c_str(), + SS.MmToString(-SS.GW.offset.y, true).c_str(), + SS.MmToString(-SS.GW.offset.z, true).c_str()); SS.TW.edit.meaning = Edit::VIEW_ORIGIN; SS.TW.ShowEditControl(3, edit_value); @@ -66,6 +87,34 @@ void TextWindow::ScreenChangeViewProjection(int link, uint32_t v) { SS.TW.ShowEditControl(10, edit_value); } +void TextWindow::ScreenChangeLightDirection(int link, uint32_t v) { + SS.TW.ShowEditControl(8, ssprintf("%.2f, %.2f, %.2f", CO(SS.lightDir[v]))); + SS.TW.edit.meaning = Edit::LIGHT_DIRECTION; + SS.TW.edit.i = v; +} + +void TextWindow::ScreenChangeLightIntensity(int link, uint32_t v) { + SS.TW.ShowEditControl(31, ssprintf("%.2f", SS.lightIntensity[v])); + SS.TW.edit.meaning = Edit::LIGHT_INTENSITY; + SS.TW.edit.i = v; +} + +void TextWindow::ScreenChangeLightAmbient(int link, uint32_t v) { + SS.TW.ShowEditControl(31, ssprintf("%.2f", SS.ambientIntensity)); + SS.TW.edit.meaning = Edit::LIGHT_AMBIENT; + SS.TW.edit.i = 0; +} + +void TextWindow::ScreenChangeCameraTangent(int link, uint32_t v) { + SS.TW.ShowEditControl(3, ssprintf("%.3f", 1000*SS.cameraTangent)); + SS.TW.edit.meaning = Edit::CAMERA_TANGENT; +} + +void TextWindow::ScreenChangeExplodeDistance(int link, uint32_t v) { + SS.TW.ShowEditControl(3, SS.MmToString(SS.explodeDistance, true)); + SS.TW.edit.meaning = Edit::EXPLODE_DISTANCE; +} + bool TextWindow::EditControlDoneForView(const std::string &s) { switch(edit.meaning) { case Edit::VIEW_SCALE: { diff --git a/test/constraint/equal_angle/normal.png b/test/constraint/equal_angle/normal.png index 3f81a954..aecf3155 100644 Binary files a/test/constraint/equal_angle/normal.png and b/test/constraint/equal_angle/normal.png differ diff --git a/test/constraint/equal_angle/normal.slvs b/test/constraint/equal_angle/normal.slvs index b1d538f1..60e7b924 100644 --- a/test/constraint/equal_angle/normal.slvs +++ b/test/constraint/equal_angle/normal.slvs @@ -119,7 +119,7 @@ Param.val=-5.00000000000000000000 AddParam Param.h.v.=00040011 -Param.val=5.00000000000000000000 +Param.val=5.00000000000000088818 AddParam Param.h.v.=00040013 @@ -147,7 +147,7 @@ Param.val=10.00000000000000000000 AddParam Param.h.v.=00060010 -Param.val=10.00000000000000000000 +Param.val=10.29878739785912600269 AddParam Param.h.v.=00060011 @@ -155,7 +155,7 @@ Param.val=10.00000000000000000000 AddParam Param.h.v.=00060013 -Param.val=5.00000000000000000000 +Param.val=5.29878739785912422633 AddParam Param.h.v.=00060014 @@ -163,7 +163,7 @@ Param.val=5.00000000000000000000 AddParam Param.h.v.=00070010 -Param.val=5.00000000000000000000 +Param.val=5.29878739785912422633 AddParam Param.h.v.=00070011 @@ -171,7 +171,7 @@ Param.val=5.00000000000000000000 AddParam Param.h.v.=00070013 -Param.val=10.00000000000000000000 +Param.val=10.29878739785912600269 AddParam Param.h.v.=00070014 @@ -310,7 +310,7 @@ Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 Entity.actPoint.x=-5.00000000000000000000 -Entity.actPoint.y=5.00000000000000000000 +Entity.actPoint.y=5.00000000000000088818 Entity.actVisible=1 AddEntity @@ -363,7 +363,7 @@ Entity.h.v=00060001 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=10.00000000000000000000 +Entity.actPoint.x=10.29878739785912600269 Entity.actPoint.y=10.00000000000000000000 Entity.actVisible=1 AddEntity @@ -372,7 +372,7 @@ Entity.h.v=00060002 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=5.00000000000000000000 +Entity.actPoint.x=5.29878739785912422633 Entity.actPoint.y=5.00000000000000000000 Entity.actVisible=1 AddEntity @@ -390,7 +390,7 @@ Entity.h.v=00070001 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=5.00000000000000000000 +Entity.actPoint.x=5.29878739785912422633 Entity.actPoint.y=5.00000000000000000000 Entity.actVisible=1 AddEntity @@ -399,7 +399,7 @@ Entity.h.v=00070002 Entity.type=2001 Entity.construction=0 Entity.workplane.v=80020000 -Entity.actPoint.x=10.00000000000000000000 +Entity.actPoint.x=10.29878739785912600269 Entity.actPoint.y=5.00000000000000000000 Entity.actVisible=1 AddEntity diff --git a/test/constraint/equal_angle/normal_old_version.slvs b/test/constraint/equal_angle/normal_old_version.slvs new file mode 100644 index 00000000..b1d538f1 --- /dev/null +++ b/test/constraint/equal_angle/normal_old_version.slvs @@ -0,0 +1,463 @@ +SolveSpaceREVa + + +Group.h.v=00000001 +Group.type=5000 +Group.name=#references +Group.color=ff000000 +Group.skipFirst=0 +Group.predef.swapUV=0 +Group.predef.negateU=0 +Group.predef.negateV=0 +Group.visible=1 +Group.suppress=0 +Group.relaxConstraints=0 +Group.allowRedundant=0 +Group.allDimsReference=0 +Group.scale=1.00000000000000000000 +Group.remap={ +} +AddGroup + +Group.h.v=00000002 +Group.type=5001 +Group.order=1 +Group.name=sketch-in-plane +Group.activeWorkplane.v=80020000 +Group.color=ff000000 +Group.subtype=6000 +Group.skipFirst=0 +Group.predef.q.w=1.00000000000000000000 +Group.predef.origin.v=00010001 +Group.predef.swapUV=0 +Group.predef.negateU=0 +Group.predef.negateV=0 +Group.visible=1 +Group.suppress=0 +Group.relaxConstraints=0 +Group.allowRedundant=0 +Group.allDimsReference=0 +Group.scale=1.00000000000000000000 +Group.remap={ +} +AddGroup + +Param.h.v.=00010010 +AddParam + +Param.h.v.=00010011 +AddParam + +Param.h.v.=00010012 +AddParam + +Param.h.v.=00010020 +Param.val=1.00000000000000000000 +AddParam + +Param.h.v.=00010021 +AddParam + +Param.h.v.=00010022 +AddParam + +Param.h.v.=00010023 +AddParam + +Param.h.v.=00020010 +AddParam + +Param.h.v.=00020011 +AddParam + +Param.h.v.=00020012 +AddParam + +Param.h.v.=00020020 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020021 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020022 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00020023 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00030010 +AddParam + +Param.h.v.=00030011 +AddParam + +Param.h.v.=00030012 +AddParam + +Param.h.v.=00030020 +Param.val=0.50000000000000000000 +AddParam + +Param.h.v.=00030021 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00030022 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00030023 +Param.val=-0.50000000000000000000 +AddParam + +Param.h.v.=00040010 +Param.val=-5.00000000000000000000 +AddParam + +Param.h.v.=00040011 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00040013 +Param.val=-10.00000000000000000000 +AddParam + +Param.h.v.=00040014 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00050010 +Param.val=-10.00000000000000000000 +AddParam + +Param.h.v.=00050011 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00050013 +Param.val=-5.00000000000000000000 +AddParam + +Param.h.v.=00050014 +Param.val=10.00000000000000000000 +AddParam + +Param.h.v.=00060010 +Param.val=10.00000000000000000000 +AddParam + +Param.h.v.=00060011 +Param.val=10.00000000000000000000 +AddParam + +Param.h.v.=00060013 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00060014 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00070010 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00070011 +Param.val=5.00000000000000000000 +AddParam + +Param.h.v.=00070013 +Param.val=10.00000000000000000000 +AddParam + +Param.h.v.=00070014 +Param.val=5.00000000000000000000 +AddParam + +Request.h.v=00000001 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000002 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000003 +Request.type=100 +Request.group.v=00000001 +Request.construction=0 +AddRequest + +Request.h.v=00000004 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Request.h.v=00000005 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Request.h.v=00000006 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Request.h.v=00000007 +Request.type=200 +Request.workplane.v=80020000 +Request.group.v=00000002 +Request.construction=0 +AddRequest + +Entity.h.v=00010000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00010001 +Entity.normal.v=00010020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00010001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00010020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00010001 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00020001 +Entity.normal.v=00020020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00020020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00020001 +Entity.actNormal.w=0.50000000000000000000 +Entity.actNormal.vx=0.50000000000000000000 +Entity.actNormal.vy=0.50000000000000000000 +Entity.actNormal.vz=0.50000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=00030001 +Entity.normal.v=00030020 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030001 +Entity.type=2000 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00030020 +Entity.type=3000 +Entity.construction=0 +Entity.point[0].v=00030001 +Entity.actNormal.w=0.50000000000000000000 +Entity.actNormal.vx=-0.50000000000000000000 +Entity.actNormal.vy=-0.50000000000000000000 +Entity.actNormal.vz=-0.50000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00040001 +Entity.point[1].v=00040002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-5.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00040002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-10.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00050000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00050001 +Entity.point[1].v=00050002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00050001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-10.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00050002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=-5.00000000000000000000 +Entity.actPoint.y=10.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00060000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00060001 +Entity.point[1].v=00060002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00060001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=10.00000000000000000000 +Entity.actPoint.y=10.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00060002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=5.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00070000 +Entity.type=11000 +Entity.construction=0 +Entity.point[0].v=00070001 +Entity.point[1].v=00070002 +Entity.workplane.v=80020000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00070001 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=5.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=00070002 +Entity.type=2001 +Entity.construction=0 +Entity.workplane.v=80020000 +Entity.actPoint.x=10.00000000000000000000 +Entity.actPoint.y=5.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80020000 +Entity.type=10000 +Entity.construction=0 +Entity.point[0].v=80020002 +Entity.normal.v=80020001 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80020001 +Entity.type=3010 +Entity.construction=0 +Entity.point[0].v=80020002 +Entity.actNormal.w=1.00000000000000000000 +Entity.actVisible=1 +AddEntity + +Entity.h.v=80020002 +Entity.type=2012 +Entity.construction=1 +Entity.actVisible=1 +AddEntity + +Constraint.h.v=00000001 +Constraint.type=20 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.ptA.v=00040002 +Constraint.ptB.v=00050001 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000002 +Constraint.type=20 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.ptA.v=00060002 +Constraint.ptB.v=00070001 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + +Constraint.h.v=00000003 +Constraint.type=54 +Constraint.group.v=00000002 +Constraint.workplane.v=80020000 +Constraint.entityA.v=00040000 +Constraint.entityB.v=00050000 +Constraint.entityC.v=00070000 +Constraint.entityD.v=00060000 +Constraint.other=0 +Constraint.other2=0 +Constraint.reference=0 +AddConstraint + diff --git a/test/constraint/equal_angle/test.cpp b/test/constraint/equal_angle/test.cpp index f1e5fce9..e96c709f 100644 --- a/test/constraint/equal_angle/test.cpp +++ b/test/constraint/equal_angle/test.cpp @@ -8,12 +8,12 @@ TEST_CASE(normal_roundtrip) { TEST_CASE(normal_migrate_from_v20) { CHECK_LOAD("normal_v20.slvs"); - CHECK_SAVE("normal.slvs"); + CHECK_SAVE("normal_old_version.slvs"); } TEST_CASE(normal_migrate_from_v22) { CHECK_LOAD("normal_v22.slvs"); - CHECK_SAVE("normal.slvs"); + CHECK_SAVE("normal_old_version.slvs"); } TEST_CASE(other_roundtrip) { diff --git a/test/request/image/linked.png b/test/request/image/linked.png new file mode 100644 index 00000000..8667e341 Binary files /dev/null and b/test/request/image/linked.png differ diff --git a/test/request/image/normal.png b/test/request/image/normal.png new file mode 100644 index 00000000..a44f72d7 Binary files /dev/null and b/test/request/image/normal.png differ diff --git a/test/request/image/test.cpp b/test/request/image/test.cpp index da0954e0..a9507bee 100644 --- a/test/request/image/test.cpp +++ b/test/request/image/test.cpp @@ -2,13 +2,12 @@ TEST_CASE(normal_roundtrip) { CHECK_LOAD("normal.slvs"); - // Can't render images through cairo for now. - // CHECK_RENDER("normal.png"); + CHECK_RENDER("normal.png"); CHECK_SAVE("normal.slvs"); } TEST_CASE(linked_roundtrip) { CHECK_LOAD("linked.slvs"); - // CHECK_RENDER("linked.png"); + CHECK_RENDER("linked.png"); CHECK_SAVE("linked.slvs"); }