Compare commits

...

103 Commits

Author SHA1 Message Date
Adrián Insaurralde Avalos b9bfa5c550 Increment point release number in cmake and windows installer 2023-11-13 23:33:39 -03:00
Adrián Insaurralde Avalos e9b426d561 Fix windows uninstaller issue #10971 and #11232 2023-11-13 23:33:39 -03:00
wandererfan 36bde55f05 [TD]fix regression on Links with scale 2023-11-13 15:29:18 -05:00
0penBrain c6c35bd2d3 Fix #9465 - Coin version on Mac Conda builds causes transform crash
with this solution, we have traded a crash for a memory leak. so it is only activated for MAC OS where we have the crash, until we find a better solution.
2023-11-12 18:27:37 -03:00
Roy-043 930079cdcf Arch: Fix multiple issues with ImportOBJ.py
Fixes #6187.

Other fixes:
* Made handling of shapes and global placement more consistent.
* Shapes without curves were also triangulated.
* Polygonal faces could have flipped normals and duplicate points.
2023-11-12 19:20:31 +01:00
Roy-043 b8eb92fdc6 Arch: Read and write object.Label on Wavefront OBJ import and export
Fixes #5635.
Fixes #5636.
2023-11-12 19:18:27 +01:00
Adrián Insaurralde Avalos 9d03a07005 Fix 10545 by using position of array members 2023-11-11 15:12:17 -03:00
wandererfan 47d68ac6a2 [TD]fix selection highlighting from tree 2023-11-11 12:09:12 -03:00
wandererfan 58e3b7200d [TD]fix #10440 Balloon arrow end point 2023-11-11 11:47:44 -03:00
wandererfan 09fb4dba8f [TD]add support for view menu zoom 2023-11-11 11:45:24 -03:00
wandererfan a2a26839ff [TD]fix keyboard zoomIn/zoomOut for Touchpad mode 2023-11-11 11:41:47 -03:00
Syres916 ec5ed6baf1 [Gui] Fix color bar position and text (#10552)
* [Gui] Fix ColorBar position and labelling

* [Gui] Improve formatting

* [Gui] ColorBar adjusts if user squashes window height

* [Gui] Changes following feedback
2023-11-11 11:27:25 -03:00
wmayer 0c0c434575 Gui: filter warning about dead keys
Forum thread: https://forum.freecad.org/viewtopic.php?t=80981
2023-11-11 11:24:41 -03:00
Zheng, Lei f51f9e3c1f Gui: fix selection of nested object in App::Part 2023-11-11 11:15:18 -03:00
Victor Predko 2187c8dc56 Spreadsheet: export CSV file extension by default
Fixes #10829
2023-11-11 11:09:59 -03:00
Florian Foinant-Willig adc26e8031 TechDraw: Fix #10919 crash at geometry deletion 2023-11-11 11:08:16 -03:00
Roy-043 cbfb641436 Merge pull request #11295 from Roy-043/Draft-improved-props_changed_placement_only-function
Draft: improved props_changed_placement_only function
2023-11-11 15:05:35 +01:00
Roy-043 3771ccb75a Merge pull request #11280 from Roy-043/Arch-Fix-issue-with-getSceneGraph
Arch: Fix issue with getSceneGraph
2023-11-11 15:05:35 +01:00
Roy-043 52c82d163b Draft: renaming of anno style could fail
The error occurred if the style was in use.
2023-11-11 15:05:35 +01:00
Roy-043 b291ffc231 Draft: clone IfcType and Subvolume properties
Fixes #11186.
2023-11-11 15:05:35 +01:00
Roy-043 baf37cb1cc Arch: fix Placement multiplication for subvolumes
Fixes #11185.

Same problem as in #6617.
2023-11-11 15:05:35 +01:00
bdieterm cf9ed2b070 Part: allow reduction of Part ViewProvider tesselation resolution
Problem description
To display a shape, the ViewProvider creates a mesh of the shape data. The
resolution depends also on the two parameters "Angular Deflection" and
"Deviation" in the View properties. (The values of these parameters are also
updated for all objects when changing these settings in the Preferences
dialog).
Changing the parameters from a high value to a lower value has an immediate
effect on the displayed shape -- for example a circle will be displayed finer
with more line segments. But changing the parameter back to the higher value
(with less resolution) will keep the finer view-mesh instead of calculating a
coarser one. To get back to the coarse view, the object has to be manually
recomputed or the file re-opened.

Solution
I just set the meshing parameter AllowQualityDecrease to True. I guess that
this was not implemented before because this parameter is quite new (introduced
in OCC v7.5 in the year 2020).
2023-11-11 15:05:35 +01:00
Florian Foinant-Willig a9c9d8ba87 Part: fix crash with null face 2023-11-11 11:04:00 -03:00
Florian Foinant-Willig 198e7ef9b5 Fix #10910 2023-11-11 10:59:19 -03:00
wandererfan 9aebd3fe5a [TD]fix fail on unmeshed shape 2023-11-11 10:57:10 -03:00
0penBrain 1642ebbe58 [Bugfix]Gui: in draggers, remove/detach all callbacks + add checks and asserts, hopefully fixes #9465 2023-11-10 17:58:14 -03:00
xtemp09 c6091324f0 [GUI] Fix memory leak in ViewProviderPlane.cpp 2023-11-10 16:39:02 -03:00
Adrián Insaurralde Avalos fc8980aeb3 File formats: Uppercase file types when importing a file. (#10977)
* Added uppercase extensions for supported formats

In the file App\Application.cpp

* Added file types in upper case

* Adds uppercase file types to the file import filter.

Fixes #10879

* Added filter for *.fcmacro *.fcscript
2023-11-10 16:38:10 -03:00
Adrian Insaurralde Avalos 83c85c79c3 Migrate away from deprecated distutils python package where possible 2023-11-10 16:30:47 -03:00
Adrián Insaurralde Avalos e11d5dff7d Fem: Connect constraint temperature spinboxes to properties and task dialog rework - fixes #11109 2023-11-10 16:29:06 -03:00
Adrián Insaurralde Avalos 381a743295 Import: fixes #10983: Crash when trying to import a DXF file with Polosh letters in the name 2023-11-10 16:19:15 -03:00
pavltom bb88d3b5bb [TechDraw] - Fix issue #10094 2023-11-09 03:06:11 -03:00
Paddle f9950cb1db SplashScreen : Add "ShowSplasherMessages" parameter to disable labels from the splashscreen. 2023-11-09 03:04:54 -03:00
Adrián Insaurralde Avalos 76e1410f53 Gui: fixes issue #9422: Dependency Graph: export to .dot/.gv 2023-11-09 03:01:44 -03:00
didendron 7e0c640c1c Gui: Add cancel button to transform task UI dialog
Fixes #7517
2023-11-09 02:51:33 -03:00
wmayer 27ae66475d Part: fix crash in Geometry::Restore()
If a project contains an unknown geometry extension then the attempt to create it returns a null pointer which isn't checked and causes a segmentation fault.

See also forum: https://forum.freecad.org/viewtopic.php?t=81091
2023-11-09 01:56:26 -03:00
wmayer 4f0e0e6edc Part: fix encoding issue in BOPProgressIndicator::Show 2023-11-09 01:55:47 -03:00
wmayer 239f5a0d98 Gui: fixes #10724: TaskView gets truncated 2023-11-09 01:53:52 -03:00
wmayer ef6c15373e Gui: fix possible memory leak if inappropriate view provider is created
Example code:
doc = App.newDocument()
doc.addObject(type = "Part::Feature", viewType = "MeshGui::ViewProviderMesh")
2023-11-09 01:51:54 -03:00
wmayer fbe2fef66c App: fixes #10460: App::PropertyPythonObject is not saving data
Since Py3.11 the methods names __setstate__ and __getstate__ conflict with the method names added to the object class.
Thus rename them to 'loads' and 'dumps'
2023-11-09 01:45:32 -03:00
wmayer 844c20cfa8 Gui: fixes #10782: Unable to cancel Select module Open obj messagebox 2023-11-09 01:41:36 -03:00
wmayer 6841532641 Gui: Initial save of a document doesn't have the expected thumbnail
When saving the thumbnail there is a check if the 3D window is the active window. This check fails if a document is saved for the first time because
the appearing file dialog causes the 3D window to not be active any more. Thus, no snapshot of the 3D window will be created and the program logo will be
saved instead. A workaround is to save the document twice.

This PR removes the check for the active window so that the snapshot can be created. The issue might be related to #10937.
2023-11-09 01:39:01 -03:00
Adrián Insaurralde Avalos eb07bad7da Start: fixes #10221: /tmp/FreeCADStartThumbnails* directories are not removed when FreeCAD terminates
The commit adds some new functions:

* getThumbnailDir()
  Returns the path to the thumbnail directory which is a sub-directory of the Cache directory.
  There is no need to always create a unique directory after each restart because it doesn't harm
  if the thumbnail directoy contains deprecated files.

* createThumbnailDir()
  Creates the thumbnail directoy if it doesn't exist yet.

* getSha1Hash
  Helper function to compute a SHA-1 hash of a given path. If the same path is passed
  then the hash value will be the same.
  This way it can be avoided to create a different image file from a project file
  after each restart.

* getUniquePNG
  Computes the path of a PNG image file for a given project file. It's also possible
  to pass an arbitrary string as argument.

* useCachedPNG
  If the PNG image exists and if it's newer than the project file True is returned
  and False otherwise.

The changes in detail are:
1. For a given project file it is checked if the thumbnail directory already contains
   a cached image. If it's newer than the project file it will used, otherwise it will
   be re-created.

2. For the system icon to a given file format it is only checked if the icon already exists.
   If yes, it will be used.
2023-11-09 01:37:39 -03:00
Adrián Insaurralde Avalos 621aea2d10 [Start] Fix Python 3.11 Unicode Errors
Example Error :
  File "/home/john/freecad-daily-build/Mod/Start/StartPage/StartPage.py", line 422, in handle
    ALTCSS = f.read()
             ^^^^^^^^
  File "/usr/lib/python3.11/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 421: ordinal not in range(128)

    main (FreeCAD/FreeCAD#10535)
2023-11-09 01:21:38 -03:00
wmayer 5f6a5bf6e4 App: the function findLicense() uses the '==' operator to compare two C strings.
This is wrong and leads to failures under Windows.
2023-11-09 01:08:47 -03:00
wmayer 419d53381b fixes #10063: Part_SectionCut does not work if the view is in perspective 2023-11-09 00:48:17 -03:00
wmayer 4f436f7c0c Gui: fix size policy of placement dialog 2023-11-09 00:40:08 -03:00
Adrian Insaurralde Avalos 26af24b711 AddonManager: handle the case of symlinked addon when uninstalling
see #11045
2023-11-09 00:39:23 -03:00
wmayer 916a1146b2 Gui: fixes #11045: Freecad fails to start after uninstalling disabled addon
The PR refactors FindPreferencePacksInPackage() and splits program logic from exception handling. It also handles std::exception to give more
information about a possible failure
2023-11-09 00:38:57 -03:00
wmayer bf765f88d2 Mesh: disable potentially unsafe code in Wm4 library 2023-11-09 00:37:55 -03:00
wmayer cc41382933 TD: fix QGIViewPart::highlightMoved 2023-11-09 00:37:40 -03:00
wmayer ddc2d98f2c TD: fix GeometryMatcher::compareBSplines 2023-11-09 00:37:01 -03:00
wmayer a82f870f6a PD: wrong direction determined for linear pattern
A selected edge of a sketch is not in local coordinates and thus its corresponding axis mustn't be multiplied with the sketch placement as
this will lead to a wrong direction vector.

Forum: https://forum.freecad.org/viewtopic.php?t=82022
2023-11-09 00:35:57 -03:00
Camille 06f62a710c Fix issue #10144 [Problem] FreeCAD freezes when clicking inside spreadsheet - see issue for detailed explanation. 2023-11-09 00:27:11 -03:00
wmayer 20dcef6af0 PD: fixes #11197: If bounding box of Body is activated it will be done for each sub-feature 2023-11-09 00:19:03 -03:00
wmayer dc12da981b Gui: issue #9205: Default settings make it hard to select objects in the 3D window
backported from PR #11187
2023-11-06 16:23:36 -03:00
wmayer f8069ede36 TD: fix possible crash in QGIWeldSymbol::customBoundingRect()
Forum thread: https://forum.freecad.org/viewtopic.php?t=80203
2023-10-22 20:38:40 +02:00
Connor Worrell 5a740cfe68 [GUI] QuantitySpinBox Regex Optimization #10067 Ammendum 2023-10-22 20:37:39 +02:00
Connor Worrell 76fd25f9de [GUI] QuantitySpinBox: Regex optimization. 2023-10-22 20:37:24 +02:00
Roy-043 35a59ac38c Draft: importSVG: handle viewBox in mm (PR10929 fix was not correct) (#11143) 2023-10-22 20:29:08 +02:00
Roy-043 5a4648e581 Draft: importDXF: fix off layer bug (#11090)
* Draft: importDXF fix off layer bug

Fixes #10254.

* Typo

* Typo 2
2023-10-19 18:03:37 +02:00
Roy-043 d0f3d63ef8 Draft: Import DXF: handle arc angles larger than 360 degrees
See #10985.
2023-10-19 18:01:22 +02:00
Roy-043 885343c435 Draft: Use DXF OCS when importing circles and arcs to Part shapes
See #10985.
2023-10-19 18:00:43 +02:00
Roy-043 ddd6f544e5 Arch: ArchFrame typos when checking enum values 2023-10-10 11:27:35 +02:00
Roy-043 a252d1571d Draft: importSVG: handle viewBox in mm
Forum topic:
https://forum.freecad.org/viewtopic.php?t=81696
2023-10-04 12:55:49 +02:00
Roy-043 12af1e764d Draft: get_movable_children: prevent endless loop
Forum topic:
https://forum.freecad.org/viewtopic.php?t=81547
2023-09-29 12:38:58 +02:00
Rexbas 83538ba3cd Gui: Improve accuracy for navigation cube's rotate to nearest feature
(cherry picked from commit c2bf9efc7d)
2023-09-25 12:04:20 +02:00
Rexbas 34e4bf9e44 Gui: Improve object center rotation mode
(cherry picked from commit fcbee3ad49)
2023-09-25 12:03:25 +02:00
wmayer 15def85b29 pre-commit: Avoid automatic commits for backport fixes 2023-09-24 16:02:22 -05:00
Roy-043 4d98082de0 Arch: avoid intersecting solids in windows and doors with openings
With the current code, if you place a simple door and change its Opening property to 50, the door leaf and the frame intersect. This PR fixes that issue.
2023-09-21 14:13:49 +02:00
Yorik van Havre 5b964fa338 Merge pull request #10711 from Roy-043/Arch-Fix-Arch_Fence-section-placement
Arch: Fix Arch_Fence section placement
2023-09-18 19:35:59 +02:00
Yorik van Havre 948ffd940e Merge pull request #10712 from Roy-043/Draft-shape2dview-avoid-issues-with-intersecting-solids
Draft: shape2dview: avoid issues with intersecting solids
2023-09-18 19:35:30 +02:00
Roy-043 b00fa5ea7f Draft: Fix for PR10673 (#10699)
Fixes an issue that was missed in #10673.
2023-09-16 17:19:19 +02:00
Roy-043 0570197f8e Draft: V0.21 version of getPlaneRotation caused a dimension bug (#10673)
`DraftVecUtils.getPlaneRotation` can now return None. The `view_dimension.py` code did not handle that.
2023-09-13 17:04:38 +02:00
Roy-043 083ebf2a0e Draft: importSVG.py: check and fix path faces
Fixes #10659.
2023-09-13 13:06:31 +02:00
wmayer cc93256813 Mesh: fixes issue #10075: 3MF files exported from FreeCAD don't work in PrusaSlicer
Add an option to force to always write a mesh as model type even if it's not a solid

This change is backported from master
2023-09-06 08:15:16 +02:00
wmayer 5ab2894828 Base: fixes #10462: mesh.unite() causes segementaion fault 2023-09-03 15:09:35 +02:00
Chris Hennes f6708547a9 CMake: Increment point release number 2023-08-30 21:32:05 -05:00
Roy-043 21824c7f60 Draft: importDWG.py wrongly assumed that opt directory always exists on Linux (#10447)
Forum topic:
https://forum.freecad.org/viewtopic.php?p=703063#p703061
2023-08-30 18:13:16 +02:00
sliptonic da2bc3ba8b fixes #10113
packaging.version.parse() will raise InvalidVersion in some cases but the error isn't caught.
2023-08-30 10:55:54 -05:00
David Kaufman cc31a0f6ae [Path] Make RampDressup accept other dressups as its base operation 2023-08-30 10:55:54 -05:00
Harald Hartmann 41790d996b add estlcam_post.py 2023-08-30 10:55:54 -05:00
Syres916 4fc6b3d830 [0.21] [Gui] Py311 Initialization of locales... (#3)
* [0.21] [MainGui] Py311add initialization of locales ...

... with native environment setting

* [0.21][Gui] use '%Y-%m-%d %H:%M:%S' as format string for date
2023-08-29 16:26:16 -05:00
bdieterm c64d89507d Core: escape filepath characters in FreeCAD.loadFile 2023-08-28 10:37:37 -05:00
wmayer 3c52ca8cc6 Part: fix possible crash in ViewProviderPartExt::getDetail 2023-08-25 19:11:36 +02:00
wmayer b53e11ad26 App: fix possible crash in ComplexGeoData::getSubElementByName 2023-08-25 19:10:27 +02:00
Roy-043 a7bf4f33f8 [TD]revert change to PdfVersion_A1b
Fixes #10283.
2023-08-21 20:19:18 +02:00
Chris Hennes 7878610a7d Merge pull request #10280 from Syres916/Backport_Sketcher_Profiles_Icon
[0.21][Sketcher] Fix minor icon missing bug...
2023-08-20 10:40:48 -05:00
Syres916 89c28543a2 [0.21][Sketcher] Fix minor icon missing bug...
...icon was moved to obsolete in 2020
Backport of https://github.com/FreeCAD/FreeCAD/commit/fec225ddccc911d3e8d921a26abde183c18bdb76
2023-08-20 11:34:46 +01:00
qewer33 b6c4b0b9fb Fix StartPage javascript error when switching tabs 2023-08-19 21:30:21 +02:00
Jonas Bähr 65ed955565 Fix build of "tests" on macOS
Building the C++ unit tests failed for
 tests/src/Mod/Sketcher/App/SketchObject.cpp
because some XML headers were not found. This was because the XercesC
include dir was not in the search list for headers.

Details:
> In file included from /Users/jonas/src/FreeCAD/FreeCAD-git/tests/src/Mod/Sketcher/App/SketchObject.cpp:7:
> In file included from /Users/jonas/src/FreeCAD/FreeCAD-git/src/App/Application.h:33:
> /Users/jonas/src/FreeCAD/FreeCAD-git/src/Base/Parameter.h:55:10: fatal error: 'xercesc/util/XercesDefs.hpp' file not found
> #include <xercesc/util/XercesDefs.hpp>
>          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This is the same issue as already adresses previously with PR9657 [1] but
the test for SketchObject was added later [2].

[1]: https://github.com/FreeCAD/FreeCAD/pull/9657
[2]: https://github.com/FreeCAD/FreeCAD/commit/532b391b6971c7ce1dee4bbe0e782ce070051db9
2023-08-13 08:17:26 -07:00
Jonas Bähr 561ae14204 minor reformat: break lines, one per item 2023-08-13 08:17:26 -07:00
Roy-043 bf645981dd Draft: make_sketch should not change Autoconstraints of sketch (#10181) 2023-08-13 11:37:18 +02:00
Roy-043 ab97f80507 Draft: Fix SVG "Edges not ordered" issue (#10116) 2023-08-13 11:36:18 +02:00
Chris Hennes 1294cb7ce5 Update translations 2023-08-08 18:55:57 -05:00
Syres916 0bb03bd219 [Import] Dxf Fix regression from https://github.com/FreeCAD/FreeCAD/commit/1f6fd1b
See discussion https://forum.freecad.org/viewtopic.php?t=80040&sid=9937b585c8681fe5a2d27f37dcd3f163
2023-08-04 14:52:05 +02:00
Adrián Insaurralde Avalos 41b058e208 Rename cmake flag for unit tests to ENABLE_DEVELOPER_TESTS
To differentiate from the previously existing BUILD_TEST that controls building the Test WB
2023-08-01 19:51:39 -05:00
Chris Hennes 97319cc665 Tools: commit the actual NSIS settings used for 0.21 2023-08-01 19:44:08 -05:00
Chris Hennes d89d0e26f7 Remove the 'dev' version indicator 2023-08-01 19:43:27 -05:00
Chris Hennes 148fae183c Update the README 2023-08-01 19:43:05 -05:00
Chris Hennes 463fb03ab6 Gui: Clarify message about FCbak 2023-08-01 23:59:16 +00:00
Yorik van Havre 27b446964a Merged crowdin translations 2023-08-01 12:52:38 +00:00
Paddle e5a00e153d Disable notification area by default for now because it's not polished enough for the 0.21 release. 2023-07-30 20:37:56 -05:00
625 changed files with 26015 additions and 25185 deletions
+4 -5
View File
@@ -4,15 +4,14 @@
# See https://pre-commit.com/hooks.html for more hooks
files: |
(?x)^(
src/Mod/AddonManager|
src/Tools|
tests/src|
src/Mod/Sketcher
tests/src
)
exclude: |
(?x)^(
.*vcproj.*|
.*vcxproj.*
.*vcxproj.*|
src|
tests/src
)
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
+3 -4
View File
@@ -25,11 +25,10 @@ endif()
project(FreeCAD)
set(PACKAGE_VERSION_NAME "Vulcan")
set(PACKAGE_VERSION_MAJOR "0")
set(PACKAGE_VERSION_MINOR "21")
set(PACKAGE_VERSION_PATCH "0") # number of patch release (e.g. "4" for the 0.18.4 release)
set(PACKAGE_VERSION_SUFFIX "dev") # either "dev" for development snapshot or "" (empty string)
set(PACKAGE_VERSION_PATCH "2") # number of patch release (e.g. "4" for the 0.18.4 release)
set(PACKAGE_VERSION_SUFFIX "") # either "dev" for development snapshot or "" (empty string)
set(PACKAGE_BUILD_VERSION "0") # used when the same FreeCAD version will be re-released (for example using an updated LibPack)
set(PACKAGE_VERSION "${PACKAGE_VERSION_MAJOR}.${PACKAGE_VERSION_MINOR}.${PACKAGE_VERSION_PATCH}")
@@ -105,7 +104,7 @@ if(MSVC AND FREECAD_LIBPACK_USE AND LIBPACK_FOUND)
CopyLibpackDirectories()
endif()
if (BUILD_TEST)
if (ENABLE_DEVELOPER_TESTS)
add_subdirectory(tests)
endif()
+1 -14
View File
@@ -10,7 +10,7 @@
[Blog](https://blog.freecad.org)
[![Release](https://img.shields.io/github/release/freecad/freecad.svg)](https://github.com/freecad/freecad/releases/latest) [![Master][freecad-master-status]][gitlab-branch-master] [![Crowdin](https://d322cqt584bo4o.cloudfront.net/freecad/localized.svg)](https://crowdin.com/project/freecad) [![Gitter](https://img.shields.io/gitter/room/freecad/freecad.svg)](https://gitter.im/freecad/freecad?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Liberapay](https://img.shields.io/liberapay/receives/FreeCAD.svg?logo=liberapay)](https://liberapay.com/FreeCAD)
[![Release](https://img.shields.io/github/release/freecad/freecad.svg)](https://github.com/freecad/freecad/releases/latest) [![Crowdin](https://d322cqt584bo4o.cloudfront.net/freecad/localized.svg)](https://crowdin.com/project/freecad) [![Liberapay](https://img.shields.io/liberapay/receives/FreeCAD.svg?logo=liberapay)](https://liberapay.com/FreeCAD)
<img src="https://user-images.githubusercontent.com/1828501/174066870-1692005b-f8d7-43fb-a289-6d2f07f73d7f.png" width="800"/>
@@ -53,19 +53,6 @@ For development releases check the [weekly-builds page](https://github.com/FreeC
Other options are described at the [wiki Download page](https://wiki.freecad.org/Download).
Build Status
------------
| Master | 0.20 | Translation |
|:------:|:----:|:-----------:|
|[![Master][freecad-master-status]][gitlab-branch-master]|[![0.20][freecad-0.20-status]][gitlab-branch-0.20]|[![Crowdin](https://d322cqt584bo4o.cloudfront.net/freecad/localized.svg)](https://crowdin.com/project/freecad)|
[freecad-0.20-status]: https://gitlab.com/freecad/FreeCAD-CI/badges/releases/FreeCAD-0-20/pipeline.svg
[freecad-master-status]: https://gitlab.com/freecad/FreeCAD-CI/badges/master/pipeline.svg
[gitlab-branch-0.20]: https://gitlab.com/freecad/FreeCAD-CI/-/commits/releases/FreeCAD-0-20
[gitlab-branch-master]: https://gitlab.com/freecad/FreeCAD-CI/-/commits/master
[travis-builds]: https://travis-ci.org/FreeCAD/FreeCAD/builds
Compiling
---------
@@ -133,6 +133,7 @@ macro(InitializeFreeCADBuildOptions)
option(BUILD_SURFACE "Build the FreeCAD surface module" ON)
option(BUILD_VR "Build the FreeCAD Oculus Rift support (need Oculus SDK 4.x or higher)" OFF)
option(BUILD_CLOUD "Build the FreeCAD cloud module" OFF)
option(ENABLE_DEVELOPER_TESTS "Build the FreeCAD unit tests suit" ON)
if(MSVC)
option(BUILD_FEM_NETGEN "Build the FreeCAD FEM module with the NETGEN mesher" ON)
+1 -1
View File
@@ -76,7 +76,7 @@ macro(PrintFinalReport)
value(CMAKE_CXX_STANDARD)
value(CMAKE_CXX_FLAGS)
value(CMAKE_BUILD_TYPE)
value(BUILD_TEST)
value(ENABLE_DEVELOPER_TESTS)
value(FREECAD_USE_FREETYPE)
value(FREECAD_USE_EXTERNAL_SMESH)
value(BUILD_SMESH)
+1 -1
View File
@@ -23,7 +23,7 @@ if(BUILD_GUI)
list (APPEND FREECAD_QT_COMPONENTS Designer)
endif()
endif()
if (BUILD_TEST)
if (ENABLE_DEVELOPER_TESTS)
list (APPEND FREECAD_QT_COMPONENTS Test)
endif ()
+1 -1
View File
@@ -232,7 +232,7 @@ LDFLAGS='-Wl,--as-needed -Wl,--no-undefined'; export LDFLAGS
%endif
-DPACKAGE_WCREF="%{release} (Git)" \
-DPACKAGE_WCURL="git://github.com/%{github_name}/FreeCAD.git master" \
-DBUILD_TEST=FALSE \
-DENABLE_DEVELOPER_TESTS=FALSE \
../
make fc_version
+12 -2
View File
@@ -210,12 +210,22 @@ PyObject* Application::sLoadFile(PyObject * /*self*/, PyObject *args)
}
}
// path could contain characters that need escaping, such as quote signs
// therefore use its representation in the Python code string
PyObject *pathObj = PyUnicode_FromString(path);
PyObject *pathReprObj = PyObject_Repr(pathObj);
const char *pathRepr = PyUnicode_AsUTF8(pathReprObj);
std::stringstream str;
str << "import " << module << std::endl;
if (fi.hasExtension("FCStd"))
str << module << ".openDocument('" << path << "')" << std::endl;
str << module << ".openDocument(" << pathRepr << ")" << std::endl;
else
str << module << ".insert('" << path << "','" << doc << "')" << std::endl;
str << module << ".insert(" << pathRepr << ",'" << doc << "')" << std::endl;
Py_DECREF(pathObj);
Py_DECREF(pathReprObj);
Base::Interpreter().runString(str.str().c_str());
Py_Return;
}
+1 -1
View File
@@ -67,7 +67,7 @@ Data::Segment* ComplexGeoData::getSubElementByName(const char* name) const
boost::regex ex("^([^0-9]*)([0-9]*)$");
boost::cmatch what;
if (boost::regex_match(name, what, ex)) {
if (name && boost::regex_match(name, what, ex)) {
element = what[1].str();
index = std::atoi(what[2].str().c_str());
}
+8 -4
View File
@@ -830,10 +830,14 @@ Document::Document(const char* documentName)
auto paramGrp {App::GetApplication().GetParameterGroupByPath(
"User parameter:BaseApp/Preferences/Document")};
auto index = static_cast<int>(paramGrp->GetInt("prefLicenseType", 0));
const char* name = App::licenseItems.at(index).at(App::posnOfFullName);
const char* url = App::licenseItems.at(index).at(App::posnOfUrl);
std::string licenseUrl = (paramGrp->GetASCII("prefLicenseUrl", url));
const char* name = "";
const char* url = "";
std::string licenseUrl = "";
if (index >= 0 && index < App::countOfLicenses) {
name = App::licenseItems.at(index).at(App::posnOfFullName);
url = App::licenseItems.at(index).at(App::posnOfUrl);
licenseUrl = (paramGrp->GetASCII("prefLicenseUrl", url));
}
ADD_PROPERTY_TYPE(License, (name), 0, Prop_None, "License string of the Item");
ADD_PROPERTY_TYPE(
LicenseURL, (licenseUrl.c_str()), 0, Prop_None, "URL to the license text/contract");
+5 -1
View File
@@ -24,6 +24,7 @@
#define APP_LICENSE_H
#include <array>
#include <cstring>
#include <string>
namespace App
@@ -64,8 +65,11 @@ constexpr std::array<TLicenseArr, countOfLicenses> licenseItems {{
int constexpr findLicense(const char* identifier)
{
if (!identifier || identifier[0] == '\0') {
return -1;
}
for (int i = 0; i < countOfLicenses; i++) {
if (licenseItems.at(i).at(posnOfIdentifier) == identifier) {
if (strcmp(licenseItems.at(i).at(posnOfIdentifier), identifier) == 0) {
return i;
}
}
+4 -4
View File
@@ -87,9 +87,9 @@ std::string PropertyPythonObject::toString() const
throw Py::Exception();
Py::Callable method(pickle.getAttr(std::string("dumps")));
Py::Object dump;
if (this->object.hasAttr("__getstate__")) {
if (this->object.hasAttr("dumps")) {
Py::Tuple args;
Py::Callable state(this->object.getAttr("__getstate__"));
Py::Callable state(this->object.getAttr("dumps"));
dump = state.apply(args);
}
else if (this->object.hasAttr("__dict__")) {
@@ -129,10 +129,10 @@ void PropertyPythonObject::fromString(const std::string& repr)
args.setItem(0, Py::String(repr));
Py::Object res = method.apply(args);
if (this->object.hasAttr("__setstate__")) {
if (this->object.hasAttr("loads")) {
Py::Tuple args(1);
args.setItem(0, res);
Py::Callable state(this->object.getAttr("__setstate__"));
Py::Callable state(this->object.getAttr("loads"));
state.apply(args);
}
else if (this->object.hasAttr("__dict__")) {
+2 -1
View File
@@ -7,7 +7,8 @@
<location filename="../../Link.cpp" line="119"/>
<source>Stores the last user choice of whether to apply CopyOnChange setup to all links
that reference the same configurable object</source>
<translation>Guarda la última opción de usuario acerca de si aplicar la configuración de CopyOnChange a todos los enlaces que hacen referencia al mismo objeto configurable</translation>
<translation>Almacena la última opción de usuario de si aplicar la configuración de CopyOnChange a todos los enlaces
que hacen referencia al mismo objeto configurable</translation>
</message>
</context>
<context>
+8 -8
View File
@@ -7,8 +7,8 @@
<location filename="../../Link.cpp" line="119"/>
<source>Stores the last user choice of whether to apply CopyOnChange setup to all links
that reference the same configurable object</source>
<translation type="unfinished">Stores the last user choice of whether to apply CopyOnChange setup to all links
that reference the same configurable object</translation>
<translation>Pamti posljednji izbor korisnika o tome treba li primijeniti postavljanje CopyOnChange
na sve veze koje referenciraju isti konfigurabilni objekt</translation>
</message>
</context>
<context>
@@ -24,32 +24,32 @@ that reference the same configurable object</translation>
<message>
<location filename="../../Origin.cpp" line="140"/>
<source>X-axis</source>
<translation type="unfinished">X-axis</translation>
<translation>X-os</translation>
</message>
<message>
<location filename="../../Origin.cpp" line="141"/>
<source>Y-axis</source>
<translation type="unfinished">Y-axis</translation>
<translation>Y-os</translation>
</message>
<message>
<location filename="../../Origin.cpp" line="142"/>
<source>Z-axis</source>
<translation type="unfinished">Z-axis</translation>
<translation>Z-os</translation>
</message>
<message>
<location filename="../../Origin.cpp" line="143"/>
<source>XY-plane</source>
<translation type="unfinished">XY-plane</translation>
<translation>XY-ravnina</translation>
</message>
<message>
<location filename="../../Origin.cpp" line="144"/>
<source>XZ-plane</source>
<translation type="unfinished">XZ-plane</translation>
<translation>XZ-ravnina</translation>
</message>
<message>
<location filename="../../Origin.cpp" line="145"/>
<source>YZ-plane</source>
<translation type="unfinished">YZ-plane</translation>
<translation>YZ-ravnina</translation>
</message>
</context>
<context>
+17 -1
View File
@@ -957,7 +957,8 @@ void InventorBuilder::endSeparator()
* A more elaborate description of the constructor.
*/
Builder3D::Builder3D()
: InventorBuilder(result)
: result{}
, builder{result}
{
}
@@ -1010,6 +1011,21 @@ void Builder3D::saveToFile(const char* FileName)
file << result.str();
}
void Builder3D::addNode(const NodeItem& item)
{
builder.addNode(item);
}
void Builder3D::beginSeparator()
{
builder.beginSeparator();
}
void Builder3D::endSeparator()
{
builder.endSeparator();
}
// -----------------------------------------------------------------------------
template<typename T>
+17 -3
View File
@@ -604,7 +604,6 @@ public:
* \brief Closes the last added separator node.
*/
void endSeparator();
/** @name Appearance handling */
private:
void increaseIndent();
@@ -642,11 +641,11 @@ private:
* \endcode
* \see Base::ConsoleSingleton
*/
class BaseExport Builder3D : public InventorBuilder
class BaseExport Builder3D
{
public:
Builder3D();
virtual ~Builder3D();
~Builder3D();
/// clear the string buffer
void clear();
@@ -659,9 +658,24 @@ public:
void saveToFile(const char* FileName);
//@}
/*!
* \brief addNode
* Writes the content of the added node to the output stream.
*/
void addNode(const NodeItem&);
/*!
* \brief Sets a separator node.
*/
void beginSeparator();
/*!
* \brief Closes the last added separator node.
*/
void endSeparator();
private:
/// the result string
std::stringstream result;
InventorBuilder builder;
};
/**
+13 -3
View File
@@ -1,6 +1,16 @@
EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c
"from distutils.sysconfig import get_python_lib; print(get_python_lib(plat_specific=True))"
OUTPUT_VARIABLE python_libs OUTPUT_STRIP_TRAILING_WHITESPACE )
if (${PYTHON_VERSION_STRING} VERSION_LESS "3.10")
# deprecated distutils package still required for ubuntu 20.04 and similar
# see https://bugs.launchpad.net/ubuntu/+source/python3.8/+bug/2039511
# TODO: remove this once we drop support for 20.04
EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c
"from distutils.sysconfig import get_python_lib; print(get_python_lib(plat_specific=True))"
OUTPUT_VARIABLE python_libs OUTPUT_STRIP_TRAILING_WHITESPACE )
else()
EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} -c
"from sysconfig import get_path; print(get_path('purelib'))"
OUTPUT_VARIABLE python_libs OUTPUT_STRIP_TRAILING_WHITESPACE )
endif()
SET(PYTHON_MAIN_DIR ${python_libs})
set(NAMESPACE_DIR "${CMAKE_BINARY_DIR}/Ext/freecad")
+17 -6
View File
@@ -344,7 +344,7 @@ namespace {
std::stringstream str;
str << "Image formats (";
for (const auto& ext : supportedFormats) {
str << "*." << ext.constData() << " ";
str << "*." << ext.constData() << " *." << ext.toUpper().constData() << " ";
}
str << ")";
@@ -1743,6 +1743,7 @@ void setCategoryFilterRules()
stream << "qt.qpa.xcb.warning=false\n";
stream << "qt.qpa.mime.warning=false\n";
stream << "qt.svg.warning=false\n";
stream << "qt.xkb.compose.warning=false\n";
stream.flush();
QLoggingCategory::setFilterRules(filter);
}
@@ -2530,11 +2531,21 @@ void Application::setStyleSheet(const QString& qssFile, bool tiledBackground)
void Application::checkForDeprecatedSettings()
{
// From 0.21, `FCBak` will be the intended default backup format
// TODO: Check for `FCStd#` and warn user.
bool useFCBakExtension = App::GetApplication().GetParameterGroupByPath
("User parameter:BaseApp/Preferences/Document")->GetBool("UseFCBakExtension", true);
if (!useFCBakExtension) {
Base::Console().Warning("`.FCStd#` backup format is deprecated from 0.21 and may be removed in future versions. Please use `.FCBak` instead.\n");
bool makeBackups = App::GetApplication()
.GetParameterGroupByPath("User parameter:BaseApp/Preferences/Document")
->GetBool("CreateBackupFiles", true);
if (makeBackups) {
bool useFCBakExtension =
App::GetApplication()
.GetParameterGroupByPath("User parameter:BaseApp/Preferences/Document")
->GetBool("UseFCBakExtension", true);
if (!useFCBakExtension) {
// TODO: This should be translated
Base::Console().Warning("The `.FCStd#` backup format is deprecated as of v0.21 and may "
"be removed in future versions.\n"
"To update, check the 'Preferences->General->Document->Use "
"date and FCBak extension' option.\n");
}
}
}
+42
View File
@@ -592,6 +592,47 @@ bool StdCmdDependencyGraph::isActive()
return (getActiveGuiDocument() ? true : false);
}
//===========================================================================
// Std_ExportDependencyGraph
//===========================================================================
DEF_STD_CMD_A(StdCmdExportDependencyGraph)
StdCmdExportDependencyGraph::StdCmdExportDependencyGraph()
: Command("Std_ExportDependencyGraph")
{
sGroup = "Tools";
sMenuText = QT_TR_NOOP("Export dependency graph...");
sToolTipText = QT_TR_NOOP("Export the dependency graph to a file");
sStatusTip = QT_TR_NOOP("Export the dependency graph to a file");
sWhatsThis = "Std_ExportDependencyGraph";
eType = 0;
//sPixmap = "Std_ExportDependencyGraph";
}
void StdCmdExportDependencyGraph::activated(int iMsg)
{
Q_UNUSED(iMsg);
App::Document* doc = App::GetApplication().getActiveDocument();
QString format = QString::fromLatin1("%1 (*.gv)").arg(Gui::GraphvizView::tr("Graphviz format"));
QString fn = Gui::FileDialog::getSaveFileName(Gui::getMainWindow(), Gui::GraphvizView::tr("Export graph"), QString(), format);
if (!fn.isEmpty()) {
QFile file(fn);
if (file.open(QFile::WriteOnly)) {
std::stringstream str;
doc->exportGraphviz(str);
QByteArray buffer = QByteArray::fromStdString(str.str());
file.write(buffer);
file.close();
}
}
}
bool StdCmdExportDependencyGraph::isActive()
{
return (getActiveGuiDocument() ? true : false);
}
//===========================================================================
// Std_New
//===========================================================================
@@ -1905,6 +1946,7 @@ void CreateDocCommands()
rcCmdMgr.addCommand(new StdCmdExport());
rcCmdMgr.addCommand(new StdCmdMergeProjects());
rcCmdMgr.addCommand(new StdCmdDependencyGraph());
rcCmdMgr.addCommand(new StdCmdExportDependencyGraph());
rcCmdMgr.addCommand(new StdCmdSave());
rcCmdMgr.addCommand(new StdCmdSaveAs());
+1 -1
View File
@@ -29,7 +29,7 @@
<string>Enable Notification Area</string>
</property>
<property name="checked">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="prefEntry" stdset="0">
<cstring>NotificationAreaEnabled</cstring>
+5 -1
View File
@@ -84,6 +84,8 @@ void DlgSettingsViewColor::saveSettings()
ui->SelectionColor->onSave();
ui->TreeEditColor->onSave();
ui->TreeActiveColor->onSave();
ui->CbLabelColor->onSave();
ui->CbLabelTextSize->onSave();
}
void DlgSettingsViewColor::loadSettings()
@@ -102,7 +104,9 @@ void DlgSettingsViewColor::loadSettings()
ui->SelectionColor->onRestore();
ui->TreeEditColor->onRestore();
ui->TreeActiveColor->onRestore();
ui->CbLabelColor->onRestore();
ui->CbLabelTextSize->onRestore();
if (ui->radioButtonSimple->isChecked())
onRadioButtonSimpleToggled(true);
else if(ui->radioButtonGradient->isChecked())
+139 -1
View File
@@ -559,7 +559,140 @@
</widget>
</item>
<item>
<spacer name="spacer_3">
<widget class="QGroupBox" name="groupColorBar">
<property name="title">
<string>Color Bar</string>
</property>
<layout class="QGridLayout">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0">
<layout class="QGridLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_CbLabelColor">
<property name="minimumSize">
<size>
<width>240</width>
<height>0</height>
</size>
</property>
<property name="toolTip">
<string/>
</property>
<property name="text">
<string>Label text color</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="Gui::PrefColorButton" name="CbLabelColor">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Color Bar (used in Mesh and FEM Wbs) Label text color</string>
</property>
<property name="color" stdset="0">
<color>
<red>255</red>
<green>255</green>
<blue>255</blue>
</color>
</property>
<property name="prefEntry" stdset="0">
<cstring>CbLabelColor</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>View</cstring>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_CbLabelTextSize">
<property name="text">
<string>Label text size</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="Gui::PrefSpinBox" name="CbLabelTextSize">
<property name="toolTip">
<string>Color Bar (used in Mesh and FEM Wbs) Label Text Size</string>
</property>
<property name="alignment">
<set>Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<property name="minimum">
<number>4</number>
</property>
<property name="maximum">
<number>36</number>
</property>
<property name="value">
<number>13</number>
</property>
<property name="prefEntry" stdset="0">
<cstring>CbLabelTextSize</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>View</cstring>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<spacer name="spacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="spacer_7">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
@@ -594,6 +727,11 @@
<extends>QCheckBox</extends>
<header>Gui/PrefWidgets.h</header>
</customwidget>
<customwidget>
<class>Gui::PrefSpinBox</class>
<extends>QSpinBox</extends>
<header>Gui/PrefWidgets.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>checkBoxPreselection</tabstop>
+2 -1
View File
@@ -671,10 +671,11 @@ void Document::slotNewObject(const App::DocumentObject& Obj)
}
else if (cName!=Obj.getViewProviderName() && !pcProvider->allowOverride(Obj)) {
FC_WARN("View provider type '" << cName << "' does not support " << Obj.getFullName());
delete pcProvider;
pcProvider = nullptr;
cName = Obj.getViewProviderName();
}
else {
else {
break;
}
}
+17 -13
View File
@@ -27,6 +27,7 @@
# include <QButtonGroup>
# include <QCompleter>
# include <QCryptographicHash>
# include <QDialogButtonBox>
# include <QDir>
# include <QGridLayout>
# include <QGroupBox>
@@ -899,16 +900,17 @@ SelectModule::SelectModule (const QString& type, const SelectModule::Dict& types
spacerItem1 = new QSpacerItem(131, 31, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout->addItem(spacerItem1);
okButton = new QPushButton(this);
okButton->setObjectName(QString::fromUtf8("okButton"));
okButton->setText(tr("Select"));
okButton->setEnabled(false);
buttonBox = new QDialogButtonBox(this);
buttonBox->setObjectName(QString::fromUtf8("buttonBox"));
buttonBox->setStandardButtons(QDialogButtonBox::Open | QDialogButtonBox::Cancel);
buttonBox->button(QDialogButtonBox::Open)->setEnabled(false);
hboxLayout->addWidget(okButton);
hboxLayout->addWidget(buttonBox);
gridLayout->addLayout(hboxLayout, 2, 0, 1, 1);
// connections
connect(okButton, &QPushButton::clicked, this, &SelectModule::accept);
connect(buttonBox, &QDialogButtonBox::accepted, this, &SelectModule::accept);
connect(buttonBox, &QDialogButtonBox::rejected, this, &SelectModule::reject);
#if QT_VERSION < QT_VERSION_CHECK(5,15,0)
connect(group, qOverload<int>(&QButtonGroup::buttonClicked), this, &SelectModule::onButtonClicked);
#else
@@ -928,16 +930,13 @@ void SelectModule::accept()
void SelectModule::reject()
{
if (group->checkedButton())
QDialog::reject();
QDialog::reject();
}
void SelectModule::onButtonClicked()
{
if (group->checkedButton())
okButton->setEnabled(true);
else
okButton->setEnabled(false);
QWidget* button = buttonBox->button(QDialogButtonBox::Open);
button->setEnabled(group->checkedButton() != nullptr);
}
QString SelectModule::getModule() const
@@ -1061,8 +1060,13 @@ SelectModule::Dict SelectModule::importHandler(const QStringList& fileNames, con
if (dlg.exec()) {
QString mod = dlg.getModule();
const QStringList& files = fileExtension[it.key()];
for (const auto & file : files)
for (const auto & file : files) {
dict[file] = mod;
}
}
else {
// Cancelled
return {};
}
}
}
+2 -1
View File
@@ -32,6 +32,7 @@
#include <FCGlobal.h>
class QButtonGroup;
class QDialogButtonBox;
class QGridLayout;
class QGroupBox;
class QHBoxLayout;
@@ -269,7 +270,7 @@ private Q_SLOTS:
void onButtonClicked();
private:
QPushButton *okButton;
QDialogButtonBox *buttonBox;
QButtonGroup* group;
QGridLayout *gridLayout;
QHBoxLayout *hboxLayout;
+3 -3
View File
@@ -295,9 +295,9 @@ InitApplications()
Gui.activateWorkbench("NoneWorkbench")
# Register .py, .FCScript and .FCMacro
FreeCAD.addImportType("Inventor V2.1 (*.iv)","FreeCADGui")
FreeCAD.addImportType("VRML V2.0 (*.wrl *.vrml *.wrz *.wrl.gz)","FreeCADGui")
FreeCAD.addImportType("Python (*.py *.FCMacro *.FCScript)","FreeCADGui")
FreeCAD.addImportType("Inventor V2.1 (*.iv *.IV)","FreeCADGui")
FreeCAD.addImportType("VRML V2.0 (*.wrl *.WRL *.vrml *.VRML *.wrz *.WRZ *.wrl.gz *.WRL.GZ)","FreeCADGui")
FreeCAD.addImportType("Python (*.py *.FCMacro *.FCScript *.fcmacro *.fcscript)","FreeCADGui")
FreeCAD.addExportType("Inventor V2.1 (*.iv)","FreeCADGui")
FreeCAD.addExportType("VRML V2.0 (*.wrl *.vrml *.wrz *.wrl.gz)","FreeCADGui")
FreeCAD.addExportType("X3D Extensible 3D (*.x3d *.x3dz)","FreeCADGui")
+19 -9
View File
@@ -440,35 +440,45 @@ QByteArray GraphvizView::exportGraph(const QString& format)
return dotProc.readAll();
}
bool GraphvizView::onMsg(const char* pMsg,const char**)
bool GraphvizView::onMsg(const char* pMsg, const char**)
{
if (strcmp("Save",pMsg) == 0 || strcmp("SaveAs",pMsg) == 0) {
QList< QPair<QString, QString> > formatMap;
formatMap << qMakePair(QString::fromLatin1("%1 (*.gv)").arg(tr("Graphviz format")), QString::fromLatin1("gv"));
formatMap << qMakePair(QString::fromLatin1("%1 (*.png)").arg(tr("PNG format")), QString::fromLatin1("png"));
formatMap << qMakePair(QString::fromLatin1("%1 (*.bmp)").arg(tr("Bitmap format")), QString::fromLatin1("bmp"));
formatMap << qMakePair(QString::fromLatin1("%1 (*.gif)").arg(tr("GIF format")), QString::fromLatin1("gif"));
formatMap << qMakePair(QString::fromLatin1("%1 (*.jpg)").arg(tr("JPG format")), QString::fromLatin1("jpg"));
formatMap << qMakePair(QString::fromLatin1("%1 (*.svg)").arg(tr("SVG format")), QString::fromLatin1("svg"));
formatMap << qMakePair(QString::fromLatin1("%1 (*.pdf)").arg(tr("PDF format")), QString::fromLatin1("pdf"));
//formatMap << qMakePair(tr("VRML format (*.vrml)"), QString::fromLatin1("vrml"));
QStringList filter;
for (QList< QPair<QString, QString> >::iterator it = formatMap.begin(); it != formatMap.end(); ++it)
filter << it->first;
for (const auto & it : qAsConst(formatMap)) {
filter << it.first;
}
QString selectedFilter;
QString fn = Gui::FileDialog::getSaveFileName(this, tr("Export graph"), QString(), filter.join(QLatin1String(";;")), &selectedFilter);
if (!fn.isEmpty()) {
QString format;
for (QList< QPair<QString, QString> >::iterator it = formatMap.begin(); it != formatMap.end(); ++it) {
if (selectedFilter == it->first) {
format = it->second;
for (const auto & it : qAsConst(formatMap)) {
if (selectedFilter == it.first) {
format = it.second;
break;
}
}
QByteArray buffer = exportGraph(format);
if (buffer.isEmpty())
QByteArray buffer;
if (format == QLatin1String("gv")) {
std::stringstream str;
doc.exportGraphviz(str);
buffer = QByteArray::fromStdString(str.str());
}
else {
buffer = exportGraph(format);
}
if (buffer.isEmpty()) {
return true;
}
QFile file(fn);
if (file.open(QFile::WriteOnly)) {
file.write(buffer);
+4 -4
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Пераўтварыць</translation>
</message>
@@ -8555,8 +8555,8 @@ Do you want to specify another directory?</source>
<translation>Экспарт у PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Незахаваны дакумент</translation>
</message>
@@ -10346,8 +10346,8 @@ the current copy will be lost.
<translation>Стварыць новы пусты дакумент</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Без назвы</translation>
</message>
@@ -12713,7 +12713,7 @@ after FreeCAD launches</source>
<message>
<location filename="../TaskView/TaskImage.cpp" line="450"/>
<source>Enter desired distance between the points</source>
<translation>Увядзіце жаданую адлегласць паміж кропкамі</translation>
<translation>Увядзіце патрэбную адлегласць паміж кропкамі</translation>
</message>
</context>
<context>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformar</translation>
</message>
@@ -8543,8 +8543,8 @@ Do you want to specify another directory?</source>
<translation>S'està exportant a PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>El document no s'ha desat</translation>
</message>
@@ -10330,8 +10330,8 @@ la còpia actual es perdrà.</translation>
<translation>Crea un document buit nou</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Sense nom</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformace</translation>
</message>
@@ -8558,8 +8558,8 @@ Do you want to specify another directory?</source>
<translation>Exportovat PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Neuložený dokument</translation>
</message>
@@ -10351,8 +10351,8 @@ na aktuální kopii budou ztraceny.
<translation>Vytvořit nový prázdný dokument</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Nepojmenovaný</translation>
</message>
+6 -6
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformieren</translation>
</message>
@@ -7045,7 +7045,7 @@ How do you want to proceed?</source>
<message>
<location filename="../OpenCascadeNavigationStyle.cpp" line="57"/>
<source>Press CTRL and right mouse button</source>
<translation>Drücken Sie STRG und die Rechte Maustaste</translation>
<translation>Drücken Sie STRG und die rechte Maustaste</translation>
</message>
<message>
<location filename="../OpenCascadeNavigationStyle.cpp" line="59"/>
@@ -7738,7 +7738,7 @@ Möchten Sie ein anderes Verzeichnis angeben?</translation>
<message>
<location filename="../TinkerCADNavigationStyle.cpp" line="57"/>
<source>Press right mouse button</source>
<translation>Rechte Maustaste drücken</translation>
<translation>Drücken Sie die rechte Maustaste</translation>
</message>
<message>
<location filename="../TinkerCADNavigationStyle.cpp" line="59"/>
@@ -7761,7 +7761,7 @@ Möchten Sie ein anderes Verzeichnis angeben?</translation>
<message>
<location filename="../TouchpadNavigationStyle.cpp" line="56"/>
<source>Press ALT button</source>
<translation>Bitte ALT drücken</translation>
<translation>Drücken Sie die ALT-Taste</translation>
</message>
<message>
<location filename="../TouchpadNavigationStyle.cpp" line="58"/>
@@ -8549,8 +8549,8 @@ Möchten Sie ein anderes Verzeichnis angeben?</translation>
<translation>Exportiert als PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Nicht gespeichertes Dokument</translation>
</message>
@@ -10340,8 +10340,8 @@ the current copy will be lost.
<translation>Neues Dokument erstellen</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Unbenannt</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Μετατόπιση</translation>
</message>
@@ -8558,8 +8558,8 @@ Do you want to specify another directory?</source>
<translation>Πραγματοποιείται εξαγωγή αρχείου PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Μη αποθηκευμένο έγγραφο</translation>
</message>
@@ -10350,8 +10350,8 @@ the current copy will be lost.
<translation>Δημιουργήστε ένα νέο κενό έγγραφο</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Ανώνυμο</translation>
</message>
+6 -6
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformar</translation>
</message>
@@ -2209,12 +2209,12 @@ la pantalla de bienvenida</translation>
<message>
<location filename="../DlgGeneralImp.cpp" line="454"/>
<source>Apply the %1 preference pack</source>
<translation>Aplicar el paquete de preferencias %1</translation>
<translation>Aplicar el %1 paquete de preferencias</translation>
</message>
<message>
<location filename="../DlgGeneralImp.cpp" line="515"/>
<source>Choose a FreeCAD config file to import</source>
<translation>Elija un archivo de configuración de FreeCAD para importar</translation>
<translation>Elige un archivo de configuración de FreeCAD para importar</translation>
</message>
<message>
<location filename="../DlgGeneralImp.cpp" line="526"/>
@@ -2386,7 +2386,7 @@ Este archivo ya existe.</translation>
<message>
<location filename="../DlgMacroExecuteImp.cpp" line="447"/>
<source>Do you really want to delete the macro '%1'?</source>
<translation>¿Realmente quiere borrar la macro '%1'?</translation>
<translation>¿Realmente desea eliminar la macro '%1'?</translation>
</message>
<message>
<location filename="../DlgMacroExecuteImp.cpp" line="476"/>
@@ -8553,8 +8553,8 @@ Do you want to specify another directory?</source>
<translation>Exportando a PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Documento sin guardar</translation>
</message>
@@ -10344,8 +10344,8 @@ la copia actual se perderá.
<translation>Crea un documento vacío nuevo</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Sin nombre</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformar</translation>
</message>
@@ -8555,8 +8555,8 @@ Do you want to specify another directory?</source>
<translation>Exportando a PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Documento sin guardar</translation>
</message>
@@ -10346,8 +10346,8 @@ la copia actual se perderá.
<translation>Crea un documento vacío nuevo</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Sin nombre</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformatu</translation>
</message>
@@ -8569,8 +8569,8 @@ Beste direktorio bat aukeratu nahi al duzu?</translation>
<translation>PDFa esportatzen...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Gorde gabeko dokumentua</translation>
</message>
@@ -10361,8 +10361,8 @@ egindako aldaketak galdu egingo direla.</translation>
<translation>Sortu dokumentu huts berri bat</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Izenik gabea</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Muunna</translation>
</message>
@@ -8565,8 +8565,8 @@ Haluatko valita toisen hakemiston?</translation>
<translation>Viedään PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Tallentamaton asiakirja</translation>
</message>
@@ -10357,8 +10357,8 @@ the current copy will be lost.
<translation>Luo uusi tyhjä asiakirja</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Nimetön</translation>
</message>
+5 -5
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformer</translation>
</message>
@@ -5845,7 +5845,7 @@ La colonne "État" indique si le document a pu être récupéré.</translation>
<message>
<location filename="../Placement.ui" line="237"/>
<source>Euler angles (zy'x'')</source>
<translation>Angle d'Euler (zy'x'')</translation>
<translation>Angles d'Euler (zy'x'')</translation>
</message>
<message>
<location filename="../Placement.ui" line="290"/>
@@ -5890,7 +5890,7 @@ La colonne "État" indique si le document a pu être récupéré.</translation>
<message>
<location filename="../Placement.ui" line="451"/>
<source>Apply incremental changes</source>
<translation>Appliquer les modifications incrémentielles</translation>
<translation>Appliquer des modifications incrémentielles</translation>
</message>
<message>
<location filename="../Placement.ui" line="471"/>
@@ -8552,8 +8552,8 @@ Do you want to specify another directory?</source>
<translation>Exportation PDF ...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Document non sauvegardé</translation>
</message>
@@ -10344,8 +10344,8 @@ apportée à la copie en cours sera perdue.
<translation>Créer un nouveau document vide</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Sans nom</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformar</translation>
</message>
@@ -8571,8 +8571,8 @@ Quere especificar outro directorio?</translation>
<translation>Exportando en PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Documento non gardado</translation>
</message>
@@ -10362,8 +10362,8 @@ the current copy will be lost.
<translation>Abrir un documento novo baleiro</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Sen nome</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformiraj</translation>
</message>
@@ -8620,8 +8620,8 @@ Do you want to specify another directory?</source>
<translation>Izvoz PDF ...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Nespremljeni dokument</translation>
</message>
@@ -10424,8 +10424,8 @@ trenutnu kopiju će biti izgubljene.</translation>
<translation>Kreira novi prazni dokument</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Neimenovano</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Átalakítás</translation>
</message>
@@ -8561,8 +8561,8 @@ Meg szeretne adni egy másik könyvtárat?</translation>
<translation>PDF exportálása...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Nem mentett dokumentum</translation>
</message>
@@ -10354,8 +10354,8 @@ az aktuális példány elveszik.
<translation>Új üres munkalap létrehozása</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Névtelen</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Trasforma</translation>
</message>
@@ -8562,8 +8562,8 @@ Vuoi specificare un'altra cartella?</translation>
<translation>Esportazione PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Documento non salvato</translation>
</message>
@@ -10356,8 +10356,8 @@ la copia corrente andranno perse.
<translation>Crea un documento vuoto</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Senza nome</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation></translation>
</message>
@@ -8524,8 +8524,8 @@ Do you want to specify another directory?</source>
<translation>PDF </translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation></translation>
</message>
@@ -10311,8 +10311,8 @@ the current copy will be lost.
<translation></translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Unnamed</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation></translation>
</message>
@@ -8555,8 +8555,8 @@ Do you want to specify another directory?</source>
<translation>PDF- ...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation> </translation>
</message>
@@ -10348,8 +10348,8 @@ the current copy will be lost.
<translation> </translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation></translation>
</message>
+16 -16
View File
@@ -86,7 +86,7 @@
<location filename="../CommandTest.cpp" line="718"/>
<location filename="../CommandTest.cpp" line="719"/>
<source>Run test cases to verify console messages</source>
<translation type="unfinished">Run test cases to verify console messages</translation>
<translation> </translation>
</message>
</context>
<context>
@@ -195,8 +195,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation></translation>
</message>
@@ -5118,13 +5118,13 @@ Larger value eases to pick things, but can make small features impossible to sel
<location filename="../DlgSettingsViewColor.ui" line="329"/>
<location filename="../DlgSettingsViewColor.cpp" line="148"/>
<source>Top:</source>
<translation type="unfinished">Top:</translation>
<translation>:</translation>
</message>
<message>
<location filename="../DlgSettingsViewColor.ui" line="356"/>
<location filename="../DlgSettingsViewColor.cpp" line="149"/>
<source>Middle:</source>
<translation type="unfinished">Middle:</translation>
<translation>:</translation>
</message>
<message>
<location filename="../DlgSettingsViewColor.ui" line="315"/>
@@ -5150,7 +5150,7 @@ Larger value eases to pick things, but can make small features impossible to sel
<location filename="../DlgSettingsViewColor.ui" line="399"/>
<location filename="../DlgSettingsViewColor.cpp" line="150"/>
<source>Bottom:</source>
<translation type="unfinished">Bottom:</translation>
<translation>:</translation>
</message>
<message>
<location filename="../DlgSettingsViewColor.ui" line="433"/>
@@ -5185,7 +5185,7 @@ Larger value eases to pick things, but can make small features impossible to sel
<message>
<location filename="../DlgSettingsViewColor.cpp" line="157"/>
<source>Midway:</source>
<translation type="unfinished">Midway:</translation>
<translation>:</translation>
</message>
<message>
<location filename="../DlgSettingsViewColor.cpp" line="158"/>
@@ -6962,7 +6962,7 @@ How do you want to proceed?</source>
<message>
<location filename="../ManualAlignment.cpp" line="1135"/>
<source>Point_%1</source>
<translation type="unfinished">Point_%1</translation>
<translation>_%1</translation>
</message>
<message>
<location filename="../ManualAlignment.cpp" line="1237"/>
@@ -6982,12 +6982,12 @@ How do you want to proceed?</source>
<message>
<location filename="../ManualAlignment.cpp" line="1262"/>
<source>&amp;Align</source>
<translation type="unfinished">&amp;Align</translation>
<translation>(&amp;A)</translation>
</message>
<message>
<location filename="../ManualAlignment.cpp" line="1263"/>
<source>&amp;Remove last point</source>
<translation type="unfinished">&amp;Remove last point</translation>
<translation> (&amp;R)</translation>
</message>
<message>
<location filename="../ManualAlignment.cpp" line="1265"/>
@@ -8036,7 +8036,7 @@ Do you want to specify another directory?</source>
<message>
<location filename="../Tree.cpp" line="906"/>
<source>Tree settings</source>
<translation type="unfinished">Tree settings</translation>
<translation> </translation>
</message>
<message>
<location filename="../Tree.cpp" line="910"/>
@@ -8557,8 +8557,8 @@ Do you want to specify another directory?</source>
<translation>PDF로 ...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation> </translation>
</message>
@@ -8836,7 +8836,7 @@ Do you want to continue?</source>
<location filename="../NotificationArea.cpp" line="553"/>
<location filename="../NotificationArea.cpp" line="1021"/>
<source>Notifier</source>
<translation type="unfinished">Notifier</translation>
<translation></translation>
</message>
<message>
<location filename="../NotificationArea.cpp" line="553"/>
@@ -8847,7 +8847,7 @@ Do you want to continue?</source>
<message>
<location filename="../NotificationArea.cpp" line="963"/>
<source>Notifier: </source>
<translation type="unfinished">Notifier: </translation>
<translation>: </translation>
</message>
<message>
<location filename="../NotificationArea.cpp" line="965"/>
@@ -10346,8 +10346,8 @@ the current copy will be lost.
<translation> </translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation></translation>
</message>
@@ -12544,7 +12544,7 @@ after FreeCAD launches</source>
<message>
<location filename="../TaskView/TaskImage.ui" line="247"/>
<source>Interactively scale the image by setting a length between two points of the image.</source>
<translation type="unfinished">Interactively scale the image by setting a length between two points of the image.</translation>
<translation> .</translation>
</message>
<message>
<location filename="../TaskView/TaskImage.ui" line="250"/>
@@ -12711,7 +12711,7 @@ after FreeCAD launches</source>
<message>
<location filename="../TaskView/TaskImage.cpp" line="450"/>
<source>Enter desired distance between the points</source>
<translation type="unfinished">Enter desired distance between the points</translation>
<translation> </translation>
</message>
</context>
<context>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformeren</translation>
</message>
@@ -8558,8 +8558,8 @@ Wilt u een andere map opgeven?</translation>
<translation>Exporteren van PDF ...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Niet-opgeslagen document</translation>
</message>
@@ -10350,8 +10350,8 @@ the current copy will be lost.
<translation>Maak een nieuw leeg document</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Naamloos</translation>
</message>
+11 -11
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Przemieszczenie</translation>
</message>
@@ -2339,7 +2339,7 @@ wyświetli ekran powitalny</translation>
<location filename="../DlgMacroExecuteImp.cpp" line="96"/>
<location filename="../DlgMacroExecuteImp.cpp" line="653"/>
<source>Macros</source>
<translation>Makrodefinicje</translation>
<translation>Makropolecenie</translation>
</message>
<message>
<location filename="../DlgMacroExecuteImp.cpp" line="372"/>
@@ -4532,7 +4532,7 @@ Możesz również skorzystać z formatki: John Doe &lt;john@doe.com&gt;</transla
<message>
<location filename="../DlgSettingsMacro.ui" line="14"/>
<source>Macro</source>
<translation>Makrodefinicje</translation>
<translation>Makropolecenia</translation>
</message>
<message>
<location filename="../DlgSettingsMacro.ui" line="20"/>
@@ -6802,7 +6802,7 @@ Do you want to save your changes?</source>
<message>
<location filename="../DlgKeyboardImp.cpp" line="383"/>
<source>Macros</source>
<translation>Makropolecenie</translation>
<translation>Makrodefinicje</translation>
</message>
<message>
<location filename="../Command.cpp" line="1146"/>
@@ -8560,8 +8560,8 @@ Do you want to specify another directory?</source>
<translation>Eksportuj do PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Niezapisany dokument</translation>
</message>
@@ -10352,8 +10352,8 @@ bieżącej kopii zostaną utracone.
<translation>Utwórz nowy pusty dokument</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Nienazwany</translation>
</message>
@@ -11590,7 +11590,7 @@ bieżącej kopii zostaną utracone.
<message>
<location filename="../CommandView.cpp" line="1607"/>
<source>Fullscreen</source>
<translation>Cały ekran</translation>
<translation>Pełny ekran</translation>
</message>
<message>
<location filename="../CommandView.cpp" line="1608"/>
@@ -11828,7 +11828,7 @@ bieżącej kopii zostaną utracone.
<location filename="../CommandView.cpp" line="1670"/>
<location filename="../CommandView.cpp" line="1672"/>
<source>Display the active view either in fullscreen, in undocked or docked mode</source>
<translation>Wyświetl aktywny widok na pełnym ekranie, w trybie niezadokowanym lub zadokowanym</translation>
<translation>Wyświetl aktywny widok w trybie pełnoekranowym, w trybie niezadokowanym lub zadokowanym</translation>
</message>
</context>
<context>
@@ -11836,7 +11836,7 @@ bieżącej kopii zostaną utracone.
<message>
<location filename="../CommandView.cpp" line="1639"/>
<source>Fullscreen</source>
<translation>Pełny ekran</translation>
<translation>Cały ekran</translation>
</message>
<message>
<location filename="../CommandView.cpp" line="1640"/>
@@ -11870,7 +11870,7 @@ bieżącej kopii zostaną utracone.
<location filename="../CommandView.cpp" line="1579"/>
<location filename="../CommandView.cpp" line="1581"/>
<source>Display the active view either in fullscreen, in undocked or docked mode</source>
<translation>Wyświetl aktywny widok w trybie pełnoekranowym, w trybie niezadokowanym lub zadokowanym</translation>
<translation>Wyświetl aktywny widok na pełnym ekranie, w trybie niezadokowanym lub zadokowanym</translation>
</message>
</context>
<context>
@@ -12189,7 +12189,7 @@ Czy nadal chcesz kontynuować?</translation>
<message>
<location filename="../Workbench.cpp" line="547"/>
<source>Macro</source>
<translation>Makropolecenia</translation>
<translation>Makrodefinicje</translation>
</message>
<message>
<location filename="../Workbench.cpp" line="548"/>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformar</translation>
</message>
@@ -8551,8 +8551,8 @@ Do you want to specify another directory?</source>
<translation>Exportar PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Documento não salvo</translation>
</message>
@@ -10340,8 +10340,8 @@ cópia atual será perdida.
<translation>Criar um novo documento vazio</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Sem nome</translation>
</message>
+4 -4
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformar</translation>
</message>
@@ -405,7 +405,7 @@
<message>
<location filename="../DownloadItem.ui" line="14"/>
<source>Form</source>
<translation>Formulário</translation>
<translation>De</translation>
</message>
<message>
<location filename="../DownloadItem.ui" line="29"/>
@@ -8560,8 +8560,8 @@ Quer especificar outro diretório?</translation>
<translation>A exportar PDF ...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Documento não guardado</translation>
</message>
@@ -10351,8 +10351,8 @@ the current copy will be lost.
<translation>Criar um Novo Documento vazio</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Sem nome</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transformare</translation>
</message>
@@ -8560,8 +8560,8 @@ Doriţi să specificaţi un alt director?</translation>
<translation>Export PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Document nesalvat</translation>
</message>
@@ -10351,8 +10351,8 @@ copia curentă va fi pierdută.
<translation>Creaţi un nou document gol</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Nedenumit</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Переместить</translation>
</message>
@@ -8553,8 +8553,8 @@ Do you want to specify another directory?</source>
<translation>Экспорт PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Документ не сохранён</translation>
</message>
@@ -10343,8 +10343,8 @@ the current copy will be lost.
<translation>Создать новый пустой документ</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Безымянный</translation>
</message>
+16 -16
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Preoblikuj</translation>
</message>
@@ -2109,11 +2109,11 @@ Prilagodite jo lahko glede na velikost zaslona ali po lastnem okusu</translation
'ComboView': combine tree view and property view into one panel.
'TreeView and PropertyView': split tree view and property view into separate panel.
'Both': keep all three panels, and you can have two sets of tree view and property view.</source>
<translation>Prilagodi način prikazovanja drevesnega prikaza v plošči (potreben vnovični zagon).
<translation>Prilagodi način prikazovanja drevesnega prikaza v podoknu (potreben vnovični zagon).
"Sestavljen pogled": v eno ploščo združen drevesni pprikaz in lastnostni prikaz.
"Drevesni in Lastnostni prikaz": drevesni in lastnostni prikaz, vsak na svoji plošči.
"Oboje": ohrani vse tri plošče tako, da imate lahko dva drevesna in dva lastnostna prikaza.</translation>
"Sestavljen pogled": v eno podokno združen drevesni prikaz in lastnostni prikaz.
"Drevesni in Lastnostni prikaz": drevesni in lastnostni prikaz, vsak v svojem podoknu.
"Oboje": ohrani vsa tri podokna tako, da imate lahko dva drevesna in dva lastnostna prikaza.</translation>
</message>
<message>
<location filename="../DlgGeneral.ui" line="264"/>
@@ -3237,7 +3237,7 @@ vidno poročevalno pogovorno okno</translation>
<message>
<location filename="../DlgReportView.ui" line="283"/>
<source>Font color for normal messages in Report view panel</source>
<translation>Barva pisave pri običajnih sporočilih in plošči poročevalnega pogleda</translation>
<translation>Barva pisave pri običajnih sporočilih v poročilnem podoknu</translation>
</message>
<message>
<location filename="../DlgReportView.ui" line="306"/>
@@ -3247,7 +3247,7 @@ vidno poročevalno pogovorno okno</translation>
<message>
<location filename="../DlgReportView.ui" line="341"/>
<source>Font color for log messages in Report view panel</source>
<translation>Barva pisave pri dnevniških sporočilih in plošči poročevalnega pogleda</translation>
<translation>Barva pisave pri dnevniških sporočilih v poročilnem podoknu</translation>
</message>
<message>
<location filename="../DlgReportView.ui" line="364"/>
@@ -3257,7 +3257,7 @@ vidno poročevalno pogovorno okno</translation>
<message>
<location filename="../DlgReportView.ui" line="399"/>
<source>Font color for warning messages in Report view panel</source>
<translation>Barva pisave pri opozorilnih sporočilih in plošči poročevalnega pogleda</translation>
<translation>Barva pisave pri opozorilnih sporočilih v poročilnem podoknu</translation>
</message>
<message>
<location filename="../DlgReportView.ui" line="422"/>
@@ -3267,7 +3267,7 @@ vidno poročevalno pogovorno okno</translation>
<message>
<location filename="../DlgReportView.ui" line="457"/>
<source>Font color for error messages in Report view panel</source>
<translation>Barva pisave pri sporočilih o napakah in plošči poročevalnega pogleda</translation>
<translation>Barva pisave pri sporočilih o napakah v poročilnem podoknu</translation>
</message>
<message>
<location filename="../DlgReportView.ui" line="501"/>
@@ -3279,7 +3279,7 @@ vidno poročevalno pogovorno okno</translation>
<source>Internal Python output will be redirected
from Python console to Report view panel</source>
<translation>Pythonov notranji izpis bo preusmerjen s
Pythonove ukazne mize na ploščo poročevalnega pogleda</translation>
Pythonove ukazne mize na poročilno podokno</translation>
</message>
<message>
<location filename="../DlgReportView.ui" line="511"/>
@@ -3291,7 +3291,7 @@ Pythonove ukazne mize na ploščo poročevalnega pogleda</translation>
<source>Internal Python error messages will be redirected
from Python console to Report view panel</source>
<translation>Notranja Pythonova sporočila o napakah bodo preusmerjena
s Pythonove ukazne mize na ploščo poročevalnega pogleda</translation>
s Pythonove ukazne mize na poročilno podokno</translation>
</message>
<message>
<location filename="../DlgReportView.ui" line="531"/>
@@ -6197,7 +6197,7 @@ izbrani pred odprtjem tega pogovrnega okna</translation>
<message>
<location filename="../PropertyView.cpp" line="558"/>
<source>Property View</source>
<translation>Pogled z lastnostmi</translation>
<translation>Lastnostni prikaz</translation>
</message>
</context>
<context>
@@ -8567,8 +8567,8 @@ Ali želite navesti drugo mapo?</translation>
<translation>Izvažanje PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Neshranjen dokument</translation>
</message>
@@ -10361,8 +10361,8 @@ bodo izgubljene.
<translation>Ustvari nov, prazen dokument</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Neimenovan</translation>
</message>
@@ -12474,7 +12474,7 @@ ob zagodu FreeCAD-a</translation>
<message>
<location filename="../TaskView/TaskOrientation.ui" line="53"/>
<source>Reverse direction</source>
<translation type="unfinished">Reverse direction</translation>
<translation>Nasprotna smer</translation>
</message>
<message>
<location filename="../TaskView/TaskOrientation.ui" line="81"/>
@@ -12512,7 +12512,7 @@ ob zagodu FreeCAD-a</translation>
<message>
<location filename="../TaskView/TaskImage.ui" line="76"/>
<source>Reverse direction</source>
<translation type="unfinished">Reverse direction</translation>
<translation>Nasprotna smer</translation>
</message>
<message>
<location filename="../TaskView/TaskImage.ui" line="83"/>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Pomeri</translation>
</message>
@@ -8563,8 +8563,8 @@ Do you want to specify another directory?</source>
<translation>Izvozim PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Nesačuvan dokument</translation>
</message>
@@ -10357,8 +10357,8 @@ the current copy will be lost.
<translation>Napravi novi prazan dokument</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Bez imena</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Помери</translation>
</message>
@@ -8563,8 +8563,8 @@ Do you want to specify another directory?</source>
<translation>Извозим PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Несачуван документ</translation>
</message>
@@ -10357,8 +10357,8 @@ the current copy will be lost.
<translation>Направи нови празан документ</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Без имена</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Omvandla</translation>
</message>
@@ -8565,8 +8565,8 @@ Vill du ange en annan katalog?</translation>
<translation>Exporterar PDF ...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Osparat dokument</translation>
</message>
@@ -10359,8 +10359,8 @@ the current copy will be lost.
<translation>Skapa ett nytt tomt dokument</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Namnlös</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Dönüştür</translation>
</message>
@@ -8562,8 +8562,8 @@ Başka bir dizin belirlemek ister misiniz?</translation>
<translation>PDF dışa aktarılıyor...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Kaydedilmemiş belge</translation>
</message>
@@ -10351,8 +10351,8 @@ the current copy will be lost.
<translation>Yeni, boş bir belge oluştur</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Adsız</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Перетворити</translation>
</message>
@@ -8559,8 +8559,8 @@ Do you want to specify another directory?</source>
<translation>Експорт в PDF ...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>Незбережений документ</translation>
</message>
@@ -10354,8 +10354,8 @@ the current copy will be lost.
<translation>Створює новий порожній документ</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Без назви</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation>Transforma</translation>
</message>
@@ -8548,8 +8548,8 @@ Do you want to specify another directory?</source>
<translation>S'està exportant a PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation>El document no s'ha guardat.</translation>
</message>
@@ -10337,8 +10337,8 @@ the current copy will be lost.
<translation>Crea un document buit nou</translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation>Sense nom</translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation></translation>
</message>
@@ -8533,8 +8533,8 @@ Do you want to specify another directory?</source>
<translation> PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation></translation>
</message>
@@ -10323,8 +10323,8 @@ the current copy will be lost.
<translation></translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation></translation>
</message>
+3 -3
View File
@@ -194,8 +194,8 @@
</message>
<message>
<location filename="../Transform.cpp" line="105"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<location filename="../ViewProviderDragger.cpp" line="222"/>
<location filename="../ViewProviderAnnotation.cpp" line="416"/>
<source>Transform</source>
<translation></translation>
</message>
@@ -8546,8 +8546,8 @@ Do you want to specify another directory?</source>
<translation> PDF...</translation>
</message>
<message>
<location filename="../CommandDoc.cpp" line="1189"/>
<location filename="../MainWindow.cpp" line="692"/>
<location filename="../CommandDoc.cpp" line="1189"/>
<source>Unsaved document</source>
<translation></translation>
</message>
@@ -10327,8 +10327,8 @@ the current copy will be lost.
<translation></translation>
</message>
<message>
<location filename="../DocumentRecovery.cpp" line="393"/>
<location filename="../MainWindow.cpp" line="2053"/>
<location filename="../DocumentRecovery.cpp" line="393"/>
<source>Unnamed</source>
<translation></translation>
</message>
+7 -2
View File
@@ -247,7 +247,7 @@ struct MainWindowP
QMdiArea* mdiArea;
QPointer<MDIView> activeView;
QSignalMapper* windowMapper;
QSplashScreen* splashscreen;
SplashScreen* splashscreen;
StatusBarObserver* status;
bool whatsthis;
QString whatstext;
@@ -394,7 +394,7 @@ MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags f)
auto hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/NotificationArea");
auto notificationAreaEnabled = hGrp->GetBool("NotificationAreaEnabled", true);
auto notificationAreaEnabled = hGrp->GetBool("NotificationAreaEnabled", false);
if(notificationAreaEnabled) {
NotificationArea* notificationArea = new NotificationArea(statusBar());
@@ -1649,6 +1649,11 @@ void MainWindow::startSplasher()
// first search for an external image file
if (hGrp->GetBool("ShowSplasher", true)) {
d->splashscreen = new SplashScreen(this->splashImage());
if (!hGrp->GetBool("ShowSplasherMessages", true)) {
d->splashscreen->setShowMessages(false);
}
d->splashscreen->show();
}
else
+57 -6
View File
@@ -943,6 +943,12 @@ SbRotation NaviCubeImplementation::getNearestOrientation(PickId pickId) {
SbVec3f standardZ;
standardOrientation.multVec(SbVec3f(0, 0, 1), standardZ);
// Cleanup near zero values
for (int i = 0; i < 3; i++) {
if (abs(standardZ[i]) < 1e-6) standardZ[i] = 0.0F;
}
standardZ.normalize();
// Rotate the camera to the selected face by the smallest angle to align the z-axis
SbRotation intermediateOrientation = cameraOrientation * SbRotation(cameraZ, standardZ);
@@ -952,26 +958,71 @@ SbRotation NaviCubeImplementation::getNearestOrientation(PickId pickId) {
SbRotation rotation = intermediateOrientation.inverse() * standardOrientation;
rotation.getValue(axis, angle);
// Make sure the found axis aligns with the standardZ axis
if (standardZ.dot(axis) < 0) {
axis.negate();
angle *= -1;
}
// Make angle positive
if (angle < 0) {
angle += 2 * M_PI;
}
// f is a small value used to control orientation priority when the camera is almost exactly between two
// orientations (e.g. +45 and -45 degrees). The standard orientation is preferred compared to
// +90 and -90 degree orientations and the +90 and -90 degree orientations are preferred compared to an
// upside down standard orientation
float f = angle > M_PI ? 0.00001 : -0.00001;
float f = 0.00001;
// Find the angle to rotate to the nearest orientation
if (m_Faces[pickId].type == ShapeId::Corner) {
// 6 possible orientations for the corners
angle = angle - floor((angle + f + M_PI / 6.0) / (M_PI / 3.0)) * (M_PI / 3.0);
if (angle <= (M_PI / 6 + f)) {
angle = 0;
}
else if (angle <= (M_PI_2 + f)) {
angle = M_PI / 3;
}
else if (angle < (5 * M_PI / 6 - f)) {
angle = 2 * M_PI / 3;
}
else if (angle <= (M_PI + M_PI / 6 + f)) {
angle = M_PI;
}
else if (angle < (M_PI + M_PI_2 - f)) {
angle = M_PI + M_PI / 3;
}
else if (angle < (M_PI + 5 * M_PI / 6 - f)) {
angle = M_PI + 2 * M_PI / 3;
}
else {
angle = 0;
}
}
else {
// 4 possible orientations for the main and edge faces
angle = angle - floor((angle + f + M_PI_4) / M_PI_2) * M_PI_2;
if (angle <= (M_PI_4 + f)) {
angle = 0;
}
else if (angle <= (3 * M_PI_4 + f)) {
angle = M_PI_2;
}
else if (angle < (M_PI + M_PI_4 - f)) {
angle = M_PI;
}
else if (angle < (M_PI + 3 * M_PI_4 - f)) {
angle = M_PI + M_PI_2;
}
else {
angle = 0;
}
}
// Set the rotation to go from the intermediateOrientation to the nearest orientation
rotation.setValue(axis, angle);
// Set the rotation to go from the standard orientation to the nearest orientation
rotation.setValue(standardZ, angle);
return intermediateOrientation * rotation;
return standardOrientation * rotation.inverse();
}
bool NaviCubeImplementation::mouseReleased(short x, short y) {
+2 -1
View File
@@ -1078,8 +1078,9 @@ void NavigationStyle::saveCursorPosition(const SoEvent * const ev)
if (!cam) // no camera
return;
// Get the bounding box center of the physical object group
SoGetBoundingBoxAction action(viewer->getSoRenderManager()->getViewportRegion());
action.apply(viewer->getSceneGraph());
action.apply(viewer->objectGroup);
SbBox3f boundingBox = action.getBoundingBox();
SbVec3f boundingBoxCenter = boundingBox.getCenter();
setRotationCenter(boundingBoxCenter);
-6
View File
@@ -10,12 +10,6 @@
<height>394</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="windowTitle">
<string>Placement</string>
</property>
+27 -18
View File
@@ -226,33 +226,42 @@ void Gui::PreferencePackManager::importConfig(const std::string& packName,
}
void Gui::PreferencePackManager::FindPreferencePacksInPackage(const fs::path &mod)
{
try {
TryFindPreferencePacksInPackage(mod);
}
catch (const std::exception& e) {
Base::Console().Error("%s\n", e.what());
}
catch (...) {
// Failed to read the metadata, or to create the preferencePack based on it...
auto packageMetadataFile = mod / "package.xml";
Base::Console().Error("Failed to read %s\n", packageMetadataFile.string().c_str());
}
}
void PreferencePackManager::TryFindPreferencePacksInPackage(const boost::filesystem::path& mod)
{
auto packageMetadataFile = mod / "package.xml";
static const auto modDirectory = fs::path(App::Application::getUserAppDataDir()) / "Mod" / "SavedPreferencePacks";
static const auto resourcePath = fs::path(App::Application::getResourceDir()) / "Gui" / "PreferencePacks";
if (fs::exists(packageMetadataFile) && fs::is_regular_file(packageMetadataFile)) {
try {
App::Metadata metadata(packageMetadataFile);
auto content = metadata.content();
auto basename = mod.filename().string();
if (mod == modDirectory)
basename = "##USER_SAVED##";
else if (mod == resourcePath)
basename = "##BUILT_IN##";
for (const auto& item : content) {
if (item.first == "preferencepack") {
if (isVisible(basename, item.second.name())) {
PreferencePack newPreferencePack(mod / item.second.name(), item.second);
_preferencePacks.insert(std::make_pair(newPreferencePack.name(), newPreferencePack));
}
App::Metadata metadata(packageMetadataFile);
auto content = metadata.content();
auto basename = mod.filename().string();
if (mod == modDirectory)
basename = "##USER_SAVED##";
else if (mod == resourcePath)
basename = "##BUILT_IN##";
for (const auto& item : content) {
if (item.first == "preferencepack") {
if (isVisible(basename, item.second.name())) {
PreferencePack newPreferencePack(mod / item.second.name(), item.second);
_preferencePacks.insert(std::make_pair(newPreferencePack.name(), newPreferencePack));
}
}
}
catch (...) {
// Failed to read the metadata, or to create the preferencePack based on it...
Base::Console().Error(("Failed to read " + packageMetadataFile.string()).c_str());
}
}
}
+1
View File
@@ -194,6 +194,7 @@ namespace Gui {
private:
void FindPreferencePacksInPackage(const boost::filesystem::path& mod);
void TryFindPreferencePacksInPackage(const boost::filesystem::path& mod);
void BackupCurrentConfig() const;
+23 -7
View File
@@ -170,6 +170,9 @@ public:
if (locale.positiveSign() != plus)
copy.replace(locale.positiveSign(), plus);
QString reverseUnitStr = unitStr;
std::reverse(reverseUnitStr.begin(), reverseUnitStr.end());
//Prep for expression parser
//This regex matches chunks between +,-,$,^ accounting for matching parenthesis.
QRegularExpression chunkRe(QString::fromUtf8("(?<=^|[\\+\\-])((\\((?>[^()]|(?2))*\\))|[^\\+\\-\n])*(?=$|[\\+\\-])"));
@@ -187,18 +190,31 @@ public:
static const std::string regexConstants = "e|ip|lomm|lom";
static const std::string regexNumber = "\\d+\\s*\\.?\\s*\\d*|\\.\\s*\\d+";
//Find units and replace 1/2mm -> 1/2*(1mm), 1^2mm -> 1^2*(1mm)
copyChunk.replace(QRegularExpression(QString::fromStdString("("+regexUnits+")(\\)|(?:\\*|(?:\\)(?:(?:\\s*(?:"+regexConstants+"|\\)(?:[^()]|(?R))*\\((?:"+regexUnitlessFunctions+")|"+regexNumber+"))|(?R))*\\(|(?:\\s*(?:"+regexConstants+"|\\)(?:[^()]|(?R))*\\((?:"+regexUnitlessFunctions+")|"+regexNumber+"))))+[\\/\\^](?!("+regexUnits+")))")), QString::fromUtf8(")\\11(*\\2"));
// If expression does not contain /*() or ^, this regex will not find anything
if (copy.contains(QLatin1Char('/')) || copy.contains(QLatin1Char('*')) || copy.contains(QLatin1Char('(')) || copy.contains(QLatin1Char(')')) || copy.contains(QLatin1Char('^'))){
//Find units and replace 1/2mm -> 1/2*(1mm), 1^2mm -> 1^2*(1mm)
QRegularExpression fixUnits(QString::fromStdString("("+regexUnits+")(\\s*\\)|(?:\\*|(?:\\)(?:(?:\\s*(?:"+regexConstants+"|\\)(?:[^()]|(?R))*\\((?:"+regexUnitlessFunctions+")|"+regexNumber+"))|(?R))*\\(|(?:\\s*(?:"+regexConstants+"|\\)(?:[^()]|(?R))*\\((?:"+regexUnitlessFunctions+")|"+regexNumber+"))))+(?:[\\/\\^]|(.*$))(?!("+regexUnits+")))"));
QRegularExpressionMatch fixUnitsMatch = fixUnits.match(copyChunk);
//3rd capture group being filled indicates regex bailed out; no match.
if (fixUnitsMatch.lastCapturedIndex() == 2 || (fixUnitsMatch.lastCapturedIndex() == 3 && fixUnitsMatch.captured(3).isEmpty())){
QString matchUnits = fixUnitsMatch.captured(1);
QString matchNumbers = fixUnitsMatch.captured(2);
copyChunk.replace(matchUnits+matchNumbers, QString::fromUtf8(")")+matchUnits+QString::fromUtf8("1(*")+matchNumbers);
}
}
//Add default units to string if none are present
QRegularExpression unitsRe(QString::fromStdString("(?<=\\b|[^a-zA-Z])("+regexUnits+")(?=\\b|[^a-zA-Z])|°|||\"|'|\\p{L}\\.\\p{L}|\\[\\p{L}"));
if (!copyChunk.contains(reverseUnitStr)){ // Fast check
QRegularExpression unitsRe(QString::fromStdString("(?<=\\b|[^a-zA-Z])("+regexUnits+")(?=\\b|[^a-zA-Z])|°|||\"|'|\\p{L}\\.\\p{L}|\\[\\p{L}"));
QRegularExpressionMatch match = unitsRe.match(copyChunk);
std::reverse(copyChunk.begin(), copyChunk.end());
if (!match.hasMatch() && !copyChunk.isEmpty()){ //If no units are found, use default units
copyChunk.append(QString::fromUtf8("*(1")+unitStr+QString::fromUtf8(")")); // Add units to the end of chunk *(1unit)
QRegularExpressionMatch match = unitsRe.match(copyChunk);
if (!match.hasMatch() && !copyChunk.isEmpty()) //If no units are found, use default units
copyChunk.prepend(QString::fromUtf8(")")+reverseUnitStr+QString::fromUtf8("1(*")); // Add units to the end of chunk *(1unit)
}
std::reverse(copyChunk.begin(), copyChunk.end());
copy.replace(matchChunk.capturedStart() + lengthOffset,
matchChunk.capturedEnd() - matchChunk.capturedStart(), copyChunk);
lengthOffset += copyChunk.length() - origionalChunk.length();
+44
View File
@@ -90,6 +90,10 @@ TDragger::TDragger()
{
SO_KIT_CONSTRUCTOR(TDragger);
#if defined(Q_OS_MAC)
this->ref();
#endif
SO_KIT_ADD_CATALOG_ENTRY(translatorSwitch, SoSwitch, TRUE, geomSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(translator, SoSeparator, TRUE, translatorSwitch, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(translatorActive, SoSeparator, TRUE, translatorSwitch, "", TRUE);
@@ -130,6 +134,11 @@ TDragger::~TDragger()
{
fieldSensor.setData(nullptr);
fieldSensor.detach();
this->removeStartCallback(&TDragger::startCB);
this->removeMotionCallback(&TDragger::motionCB);
this->removeFinishCallback(&TDragger::finishCB);
removeValueChangedCallback(&TDragger::valueChangedCB);
}
void TDragger::buildFirstInstance()
@@ -198,18 +207,21 @@ SoGroup* TDragger::buildGeometry()
void TDragger::startCB(void *, SoDragger *d)
{
auto sudoThis = static_cast<TDragger *>(d);
assert(sudoThis);
sudoThis->dragStart();
}
void TDragger::motionCB(void *, SoDragger *d)
{
auto sudoThis = static_cast<TDragger *>(d);
assert(sudoThis);
sudoThis->drag();
}
void TDragger::finishCB(void *, SoDragger *d)
{
auto sudoThis = static_cast<TDragger *>(d);
assert(sudoThis);
sudoThis->dragFinish();
}
@@ -367,6 +379,10 @@ RDragger::RDragger()
{
SO_KIT_CONSTRUCTOR(RDragger);
#if defined(Q_OS_MAC)
this->ref();
#endif
SO_KIT_ADD_CATALOG_ENTRY(rotatorSwitch, SoSwitch, TRUE, geomSeparator, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(rotator, SoSeparator, TRUE, rotatorSwitch, "", TRUE);
SO_KIT_ADD_CATALOG_ENTRY(rotatorActive, SoSeparator, TRUE, rotatorSwitch, "", TRUE);
@@ -408,6 +424,11 @@ RDragger::~RDragger()
{
fieldSensor.setData(nullptr);
fieldSensor.detach();
this->removeStartCallback(&RDragger::startCB);
this->removeMotionCallback(&RDragger::motionCB);
this->removeFinishCallback(&RDragger::finishCB);
removeValueChangedCallback(&RDragger::valueChangedCB);
}
void RDragger::buildFirstInstance()
@@ -474,18 +495,21 @@ SoGroup* RDragger::buildGeometry()
void RDragger::startCB(void *, SoDragger *d)
{
auto sudoThis = static_cast<RDragger *>(d);
assert(sudoThis);
sudoThis->dragStart();
}
void RDragger::motionCB(void *, SoDragger *d)
{
auto sudoThis = static_cast<RDragger *>(d);
assert(sudoThis);
sudoThis->drag();
}
void RDragger::finishCB(void *, SoDragger *d)
{
auto sudoThis = static_cast<RDragger *>(d);
assert(sudoThis);
sudoThis->dragFinish();
}
@@ -820,6 +844,17 @@ SoFCCSysDragger::SoFCCSysDragger()
SoFCCSysDragger::~SoFCCSysDragger()
{
translationSensor.setData(nullptr);
translationSensor.detach();
rotationSensor.setData(nullptr);
rotationSensor.detach();
cameraSensor.setData(nullptr);
cameraSensor.detach();
idleSensor.setData(nullptr);
idleSensor.unschedule();
removeValueChangedCallback(&SoFCCSysDragger::valueChangedCB);
removeFinishCallback(&SoFCCSysDragger::finishDragCB, this);
}
@@ -877,6 +912,8 @@ SbBool SoFCCSysDragger::setUpConnections(SbBool onoff, SbBool doitalways)
void SoFCCSysDragger::translationSensorCB(void *f, SoSensor *)
{
auto sudoThis = static_cast<SoFCCSysDragger *>(f);
if(!f)
return;
SbMatrix matrix = sudoThis->getMotionMatrix(); // clazy:exclude=rule-of-two-soft
sudoThis->workFieldsIntoTransform(matrix);
@@ -886,6 +923,8 @@ void SoFCCSysDragger::translationSensorCB(void *f, SoSensor *)
void SoFCCSysDragger::rotationSensorCB(void *f, SoSensor *)
{
auto sudoThis = static_cast<SoFCCSysDragger *>(f);
if(!f)
return;
SbMatrix matrix = sudoThis->getMotionMatrix(); // clazy:exclude=rule-of-two-soft
sudoThis->workFieldsIntoTransform(matrix);
@@ -944,6 +983,8 @@ void SoFCCSysDragger::setUpAutoScale(SoCamera *cameraIn)
void SoFCCSysDragger::cameraCB(void *data, SoSensor *)
{
auto sudoThis = static_cast<SoFCCSysDragger *>(data);
if (!sudoThis)
return;
if (!sudoThis->idleSensor.isScheduled())
sudoThis->idleSensor.schedule();
}
@@ -989,6 +1030,8 @@ void SoFCCSysDragger::handleEvent(SoHandleEventAction * action)
void SoFCCSysDragger::idleCB(void *data, SoSensor *)
{
auto sudoThis = static_cast<SoFCCSysDragger *>(data);
if (!data)
return;
SoField* field = sudoThis->cameraSensor.getAttachedField();
if (field)
{
@@ -1012,6 +1055,7 @@ void SoFCCSysDragger::idleCB(void *data, SoSensor *)
void SoFCCSysDragger::finishDragCB(void *data, SoDragger *)
{
auto sudoThis = static_cast<SoFCCSysDragger *>(data);
assert(sudoThis);
// note: when creating a second view of the document and then closing
// the first viewer it deletes the camera. However, the attached field
+14 -6
View File
@@ -126,15 +126,23 @@ float SoFCColorBarBase::getBounds(const SbVec2s& size, float& fMinX, float&fMinY
// The cam height is set in SoFCColorBarBase::getBoundingWidth to 10.
// Therefore the normalized coordinates are in the range [-5, +5] x [-5ratio, +5ratio] if ratio > 1
// and [-5ratio, +5ratio] x [-5, +5] if ratio < 1.
// We don't want the whole height covered by the color bar (to have e.g space to the axis cross)
// thus we take as base 4.
float baseYValue = 4.0f;
// We don't want the whole height covered by the color bar (to have e.g space to the axis cross
// and the Navigation Cube) thus we take as base 3 or if the height reduces significantly it is 2.5.
float baseYValue;
if (fRatio > 3.0f) {
baseYValue = 2.5f;
}
else {
baseYValue = 3.0f;
}
float barWidth = 0.5f;
// we want the color bar at the rightmost position, therefore we take 5 as base
fMinX = 5.0f * fRatio; // must be scaled with the ratio to assure it stays at the right
// we want the color bar at the rightmost position, therefore we take 4.95 as base
fMinX = 4.95f * fRatio; // must be scaled with the ratio to assure it stays at the right
fMaxX = fMinX + barWidth;
fMinY = -baseYValue;
fMinY = -baseYValue - 0.6f; // Extend shortened bar towards axis cross
fMaxY = baseYValue; // bar has the height of almost whole window height
if (fRatio < 1.0f) {
+14 -4
View File
@@ -28,6 +28,7 @@
# include <Inventor/fields/SoMFString.h>
# include <Inventor/nodes/SoBaseColor.h>
# include <Inventor/nodes/SoCoordinate3.h>
# include <Inventor/nodes/SoFont.h>
# include <Inventor/nodes/SoIndexedFaceSet.h>
# include <Inventor/nodes/SoMaterial.h>
# include <Inventor/nodes/SoText2.h>
@@ -35,6 +36,7 @@
# include <Inventor/nodes/SoTransparencyType.h>
#endif
#include <Base/Parameter.h>
#include "SoFCColorGradient.h"
#include "SoTextLabel.h"
#include "DlgSettingsColorGradientImp.h"
@@ -99,19 +101,27 @@ void SoFCColorGradient::setMarkerLabel(const SoMFString& label)
SbVec2f minPt = _bbox.getMin();
float fStep = (maxPt[1] - minPt[1]) / ((float)num - 1);
auto trans = new SoTransform;
ParameterGrp::handle hGrp = Gui::WindowParameter::getDefaultParameter()->GetGroup("View");
auto LabelTextSize = hGrp->GetInt("CbLabelTextSize", 13);
auto LabelTextColor =
App::Color((uint32_t)hGrp->GetUnsigned("CbLabelColor", 0xffffffff));
auto textFont = new SoFont;
auto color = new SoBaseColor;
textFont->name.setValue("Helvetica,Arial,Times New Roman");
textFont->size.setValue(LabelTextSize);
trans->translation.setValue(maxPt[0] + 0.1f, maxPt[1] - 0.05f + fStep, 0.0f);
color->rgb.setValue(LabelTextColor.r,LabelTextColor.g,LabelTextColor.b);
labels->addChild(trans);
labels->addChild(color);
labels->addChild(textFont);
for (int i = 0; i < num; i++) {
auto trans = new SoTransform;
auto color = new SoBaseColor;
auto text2 = new SoColorBarLabel;
trans->translation.setValue(0, -fStep, 0);
color->rgb.setValue(0, 0, 0);
text2->string.setValue(label[i]);
labels->addChild(trans);
labels->addChild(color);
labels->addChild(text2);
}
}
+1 -1
View File
@@ -288,7 +288,7 @@ SoFCUnifiedSelection::getPickedList(SoHandleEventAction* action, bool singlePick
int cur_prio = getPriority(info.pp);
const SbVec3f& cur_pt = info.pp->getPoint();
if ((cur_prio > picked_prio) && picked_pt.equals(cur_pt, 0.01f)) {
if ((cur_prio > picked_prio) && picked_pt.equals(cur_pt, 0.2F)) {
itPicked = it;
picked_prio = cur_prio;
}
+8
View File
@@ -250,6 +250,14 @@ void SplashScreen::drawContents ( QPainter * painter )
QSplashScreen::drawContents(painter);
}
void SplashScreen::setShowMessages(bool on)
{
messages->bErr = on;
messages->bMsg = on;
messages->bLog = on;
messages->bWrn = on;
}
// ------------------------------------------------------------------------------
AboutDialogFactory* AboutDialogFactory::factory = nullptr;
+2
View File
@@ -44,6 +44,8 @@ public:
explicit SplashScreen( const QPixmap & pixmap = QPixmap ( ), Qt::WindowFlags f = Qt::WindowFlags() );
~SplashScreen() override;
void setShowMessages(bool on);
protected:
void drawContents ( QPainter * painter ) override;
+26
View File
@@ -67,6 +67,16 @@ TaskCSysDragger::~TaskCSysDragger()
Gui::Application::Instance->commandManager().getCommandByName("Std_PerspectiveCamera")->setEnabled(true);
}
void TaskCSysDragger::dragStartCallback(void *, SoDragger *)
{
// This is called when a manipulator is about to manipulating
if(firstDrag)
{
Gui::Application::Instance->activeDocument()->openCommand(QT_TRANSLATE_NOOP("Command", "Transform"));
firstDrag=false;
}
}
void TaskCSysDragger::setupGui()
{
auto incrementsBox = new Gui::TaskView::TaskBox(
@@ -117,6 +127,7 @@ void TaskCSysDragger::onRIncrementSlot(double freshValue)
void TaskCSysDragger::open()
{
dragger->addStartCallback(dragStartCallback, this);
//we can't have user switching camera types while dragger is shown.
Gui::Application::Instance->commandManager().getCommandByName("Std_OrthographicCamera")->setEnabled(false);
Gui::Application::Instance->commandManager().getCommandByName("Std_PerspectiveCamera")->setEnabled(false);
@@ -141,6 +152,7 @@ bool TaskCSysDragger::accept()
if (dObject) {
Gui::Document* document = Gui::Application::Instance->getDocument(dObject->getDocument());
assert(document);
firstDrag = true;
document->commitCommand();
document->resetEdit();
document->getDocument()->recompute();
@@ -148,4 +160,18 @@ bool TaskCSysDragger::accept()
return Gui::TaskView::TaskDialog::accept();
}
bool TaskCSysDragger::reject()
{
App::DocumentObject* dObject = vpObject.getObject();
if (dObject) {
Gui::Document* document = Gui::Application::Instance->getDocument(dObject->getDocument());
assert(document);
firstDrag = true;
document->abortCommand();
document->resetEdit();
document->getDocument()->recompute();
}
return Gui::TaskView::TaskDialog::reject();
}
#include "moc_TaskCSysDragger.cpp"
+6 -1
View File
@@ -20,12 +20,14 @@
* *
***************************************************************************/
#ifndef TASKCSYSDRAGGER_H
#define TASKCSYSDRAGGER_H
#include "TaskView/TaskDialog.h"
#include <App/DocumentObserver.h>
class SoDragger;
namespace Gui
{
@@ -40,13 +42,16 @@ namespace Gui
TaskCSysDragger(ViewProviderDocumentObject *vpObjectIn, SoFCCSysDragger *draggerIn);
~TaskCSysDragger() override;
QDialogButtonBox::StandardButtons getStandardButtons() const override
{ return QDialogButtonBox::Ok;}
{ return QDialogButtonBox::Ok | QDialogButtonBox::Cancel;}
void open() override;
bool accept() override;
bool reject() override;
private Q_SLOTS:
void onTIncrementSlot(double freshValue);
void onRIncrementSlot(double freshValue);
private:
static inline bool firstDrag = true;
static void dragStartCallback(void * data, SoDragger * d);
void setupGui();
App::DocumentObjectT vpObject;
SoFCCSysDragger *dragger;
+31
View File
@@ -411,6 +411,30 @@ void TaskView::keyPressEvent(QKeyEvent* ke)
}
}
void TaskView::triggerMinimumSizeHint()
{
// NOLINTNEXTLINE
QTimer::singleShot(100, this, &TaskView::adjustMinimumSizeHint);
}
void TaskView::adjustMinimumSizeHint()
{
QSize ms = minimumSizeHint();
setMinimumWidth(ms.width());
}
QSize TaskView::minimumSizeHint() const
{
QSize ms = QScrollArea::minimumSizeHint();
int spacing = 0;
if (QLayout* layout = taskPanel->layout()) {
spacing = 2 * layout->spacing();
}
ms.setWidth(taskPanel->minimumSizeHint().width() + spacing);
return ms;
}
void TaskView::slotActiveDocument(const App::Document& doc)
{
Q_UNUSED(doc);
@@ -481,6 +505,7 @@ void TaskView::showDialog(TaskDialog *dlg)
ActiveCtrl->buttonBox->setStandardButtons(dlg->getStandardButtons());
TaskDialogAttorney::setButtonBox(dlg, ActiveCtrl->buttonBox);
// clang-format off
// make connection to the needed signals
connect(ActiveCtrl->buttonBox, &QDialogButtonBox::accepted,
this, &TaskView::accept);
@@ -490,6 +515,7 @@ void TaskView::showDialog(TaskDialog *dlg)
this, &TaskView::helpRequested);
connect(ActiveCtrl->buttonBox, &QDialogButtonBox::clicked,
this, &TaskView::clicked);
// clang-format on
const std::vector<QWidget*>& cont = dlg->getDialogContent();
@@ -520,6 +546,7 @@ void TaskView::showDialog(TaskDialog *dlg)
ActiveDialog->open();
getMainWindow()->updateActions();
triggerMinimumSizeHint();
}
void TaskView::removeDialog()
@@ -558,6 +585,8 @@ void TaskView::removeDialog()
remove->emitDestructionSignal();
delete remove;
}
triggerMinimumSizeHint();
}
void TaskView::updateWatcher()
@@ -595,6 +624,8 @@ void TaskView::updateWatcher()
// give it the focus back.
if (fwp && fwp->isVisible())
fwp->setFocus();
triggerMinimumSizeHint();
}
void TaskView::addTaskWatcher(const std::vector<TaskWatcher*> &Watcher)
+8 -2
View File
@@ -158,15 +158,21 @@ public:
void clearActionStyle();
void restoreActionStyle();
QSize minimumSizeHint() const override;
protected Q_SLOTS:
void accept();
void reject();
void helpRequested();
void clicked (QAbstractButton * button);
private:
void triggerMinimumSizeHint();
void adjustMinimumSizeHint();
protected:
void keyPressEvent(QKeyEvent*) override;
bool event(QEvent*) override;
void keyPressEvent(QKeyEvent* event) override;
bool event(QEvent* event) override;
void addTaskWatcher();
void removeTaskWatcher();
+6 -8
View File
@@ -88,16 +88,14 @@ void Thumbnail::SaveDocFile (Base::Writer &writer) const
if (!this->viewer)
return;
QImage img;
if (this->viewer->isActiveWindow()) {
if (this->viewer->thread() != QThread::currentThread()) {
qWarning("Cannot create a thumbnail from non-GUI thread");
return;
}
QColor invalid;
this->viewer->imageFromFramebuffer(this->size, this->size, 4, invalid, img);
if (this->viewer->thread() != QThread::currentThread()) {
qWarning("Cannot create a thumbnail from non-GUI thread");
return;
}
QColor invalid;
this->viewer->imageFromFramebuffer(this->size, this->size, 4, invalid, img);
// Get app icon and resize to half size to insert in topbottom position over the current view snapshot
QPixmap appIcon = Gui::BitmapFactory().pixmap(App::Application::Config()["AppIcon"].c_str());
QPixmap px = appIcon;
-5
View File
@@ -4179,11 +4179,6 @@ void DocumentItem::updateItemSelection(DocumentObjectItem* item) {
App::DocumentObject* topParent = nullptr;
item->getSubName(str, topParent);
if (topParent) {
if (topParent->hasExtension(App::GeoFeatureGroupExtension::getExtensionClassTypeId())) {
// remove legacy selection, i.e. those without subname
Gui::Selection().rmvSelection(obj->getDocument()->getName(),
obj->getNameInDocument(), nullptr);
}
if (!obj->redirectSubName(str, topParent, nullptr))
str << obj->getNameInDocument() << '.';
obj = topParent;
+26 -4
View File
@@ -332,6 +332,7 @@ View3DInventorViewer::View3DInventorViewer(QWidget* parent, const QtGLWidget* sh
: Quarter::SoQTQuarterAdaptor(parent, sharewidget)
, SelectionObserver(false, ResolveMode::NoResolve)
, editViewProvider(nullptr)
, objectGroup(nullptr)
, navigation(nullptr)
, renderType(Native)
, framebuffer(nullptr)
@@ -350,6 +351,7 @@ View3DInventorViewer::View3DInventorViewer(const QtGLFormat& format, QWidget* pa
: Quarter::SoQTQuarterAdaptor(format, parent, sharewidget)
, SelectionObserver(false, ResolveMode::NoResolve)
, editViewProvider(nullptr)
, objectGroup(nullptr)
, navigation(nullptr)
, renderType(Native)
, framebuffer(nullptr)
@@ -477,6 +479,11 @@ void View3DInventorViewer::init()
pcEditingRoot->addChild(pcEditingTransform);
pcViewProviderRoot->addChild(pcEditingRoot);
// Create group for the physical object
objectGroup = new SoGroup();
objectGroup->ref();
pcViewProviderRoot->addChild(objectGroup);
// Set our own render action which show a bounding box if
// the SoFCSelection::BOX style is set
//
@@ -564,6 +571,8 @@ View3DInventorViewer::~View3DInventorViewer()
coinRemoveAllChildren(this->pcViewProviderRoot);
this->pcViewProviderRoot->unref();
this->pcViewProviderRoot = nullptr;
this->objectGroup->unref();
this->objectGroup = nullptr;
this->backlight->unref();
this->backlight = nullptr;
@@ -754,8 +763,15 @@ void View3DInventorViewer::addViewProvider(ViewProvider* pcProvider)
SoSeparator* root = pcProvider->getRoot();
if (root) {
if(pcProvider->canAddToSceneGraph())
pcViewProviderRoot->addChild(root);
if (pcProvider->canAddToSceneGraph()) {
// Add to the physical object group if related to the physical object otherwise add to the scene graph
if (pcProvider->isPartOfPhysicalObject()) {
objectGroup->addChild(root);
}
else {
pcViewProviderRoot->addChild(root);
}
}
_ViewProviderMap[root] = pcProvider;
}
@@ -779,9 +795,15 @@ void View3DInventorViewer::removeViewProvider(ViewProvider* pcProvider)
SoSeparator* root = pcProvider->getRoot();
if (root) {
int index = pcViewProviderRoot->findChild(root);
if(index>=0)
int index = objectGroup->findChild(root);
if (index >= 0) {
objectGroup->removeChild(index);
}
index = pcViewProviderRoot->findChild(root);
if (index >= 0) {
pcViewProviderRoot->removeChild(index);
}
_ViewProviderMap.erase(root);
}
+3
View File
@@ -483,7 +483,10 @@ private:
SoSeparator * foregroundroot;
SoDirectionalLight* backlight;
// Scene graph root
SoSeparator * pcViewProviderRoot;
// Child group in the scene graph that contains view providers related to the physical object
SoGroup* objectGroup;
std::unique_ptr<View3DInventorSelection> inventorSelection;
+1 -1
View File
@@ -1677,7 +1677,7 @@ void View3DInventorPy::eventCallback(void * ud, SoEventCallback * n)
// Type
dict.setItem("Type", Py::String(std::string(e->getTypeId().getName().getString())));
// Time
dict.setItem("Time", Py::String(std::string(e->getTime().formatDate().getString())));
dict.setItem("Time", Py::String(std::string(e->getTime().formatDate("%Y-%m-%d %H:%M:%S").getString())));
SbVec2s p = n->getEvent()->getPosition();
Py::Tuple pos(2);
pos.setItem(0, Py::Int(p[0]));
+2
View File
@@ -142,6 +142,8 @@ public:
virtual SoSeparator* getBackRoot() const;
///Indicate whether to be added to scene graph or not
virtual bool canAddToSceneGraph() const {return true;}
// Indicate whether to be added to object group (true) or only to scene graph (false)
virtual bool isPartOfPhysicalObject() const {return true;}
/** deliver the children belonging to this object
* this method is used to deliver the objects to
+1 -8
View File
@@ -150,7 +150,6 @@ bool ViewProviderDragger::setEdit(int ModNum)
pcTransform->translation.connectFrom(&csysDragger->translation);
pcTransform->rotation.connectFrom(&csysDragger->rotation);
csysDragger->addStartCallback(dragStartCallback, this);
csysDragger->addFinishCallback(dragFinishCallback, this);
// dragger node is added to viewer's editing root in setEditViewer
@@ -216,12 +215,6 @@ void ViewProviderDragger::unsetEditViewer(Gui::View3DInventorViewer* viewer)
}
}
void ViewProviderDragger::dragStartCallback(void *, SoDragger *)
{
// This is called when a manipulator is about to manipulating
Gui::Application::Instance->activeDocument()->openCommand(QT_TRANSLATE_NOOP("Command", "Transform"));
}
void ViewProviderDragger::dragFinishCallback(void *data, SoDragger *d)
{
// This is called when a manipulator has done manipulating
@@ -230,7 +223,7 @@ void ViewProviderDragger::dragFinishCallback(void *data, SoDragger *d)
auto dragger = static_cast<SoFCCSysDragger *>(d);
updatePlacementFromDragger(sudoThis, dragger);
Gui::Application::Instance->activeDocument()->commitCommand();
//Gui::Application::Instance->activeDocument()->commitCommand();
}
void ViewProviderDragger::updatePlacementFromDragger(ViewProviderDragger* sudoThis, SoFCCSysDragger* draggerIn)
-2
View File
@@ -72,9 +72,7 @@ protected:
SoFCCSysDragger *csysDragger = nullptr;
private:
static void dragStartCallback(void * data, SoDragger * d);
static void dragFinishCallback(void * data, SoDragger * d);
static void updatePlacementFromDragger(ViewProviderDragger *sudoThis, SoFCCSysDragger *draggerIn);
bool checkLink();
+10
View File
@@ -120,6 +120,11 @@ ViewProviderMeasureDistance::~ViewProviderMeasureDistance()
pLines->unref();
}
bool ViewProviderMeasureDistance::isPartOfPhysicalObject() const
{
return false;
}
void ViewProviderMeasureDistance::onChanged(const App::Property* prop)
{
if (prop == &Mirror || prop == &DistFactor) {
@@ -313,6 +318,11 @@ ViewProviderPointMarker::~ViewProviderPointMarker()
pMarker->unref();
}
bool ViewProviderPointMarker::isPartOfPhysicalObject() const
{
return false;
}
void ViewProviderMeasureDistance::measureDistanceCallback(void * ud, SoEventCallback * n)
{
auto view = static_cast<Gui::View3DInventorViewer*>(n->getUserData());
+2
View File
@@ -66,6 +66,7 @@ class GuiExport ViewProviderPointMarker : public ViewProviderDocumentObject
public:
ViewProviderPointMarker();
~ViewProviderPointMarker() override;
bool isPartOfPhysicalObject() const override;
protected:
SoCoordinate3 * pCoords;
@@ -81,6 +82,7 @@ public:
/// Constructor
ViewProviderMeasureDistance();
~ViewProviderMeasureDistance() override;
bool isPartOfPhysicalObject() const override;
// Display properties
App::PropertyColor TextColor;
+4 -4
View File
@@ -83,11 +83,11 @@ void ViewProviderPlane::attach ( App::DocumentObject *obj ) {
auto material = new SoMaterial();
material->transparency.setValue(0.95f);
auto color = new SbColor();
SbColor color;
float alpha = 0.0f;
color->setPackedValue(ViewProviderOrigin::defaultColor, alpha);
material->ambientColor.setValue(*color);
material->diffuseColor.setValue(*color);
color.setPackedValue(ViewProviderOrigin::defaultColor, alpha);
material->ambientColor.setValue(color);
material->diffuseColor.setValue(color);
faceSeparator->addChild(material);
// disable backface culling and render with two-sided lighting
+1
View File
@@ -706,6 +706,7 @@ MenuItem* StdWorkbench::setupMenuBar() const
<< "Std_ViewLoadImage"
<< "Std_SceneInspector"
<< "Std_DependencyGraph"
<< "Std_ExportDependencyGraph"
<< "Std_ProjectUtil"
<< "Separator"
<< "Std_MeasureDistance"
+1
View File
@@ -98,6 +98,7 @@ private:
int main( int argc, char ** argv )
{
#if defined (FC_OS_LINUX) || defined(FC_OS_BSD)
setlocale(LC_ALL, ""); // use native environment settings
// Make sure to setup the Qt locale system before setting LANG and LC_ALL to C.
// which is needed to use the system locale settings.
(void)QLocale::system();
@@ -1272,18 +1272,18 @@ installed addons will be checked for available updates
<translation>Не атрымалася выканаць макрас. Падрабязныя звесткі аб збоі глядзіце ў кансолі.</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../addonmanager_devmode_people_table.py" line="88"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../package_list.py" line="398"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<source>Maintainer</source>
<translation>Суправаджальнік</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../addonmanager_devmode_people_table.py" line="89"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../package_list.py" line="435"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<source>Author</source>
<translation>Аўтар</translation>
</message>
@@ -1499,8 +1499,8 @@ installed addons will be checked for available updates
<translation>Прывязкі Python да QtWebEngine не ўсталяваныя - ужытае замяняе адлюстраванне README.</translation>
</message>
<message>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../package_details.py" line="682"/>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../AddonManagerTest/gui/test_installer_gui.py" line="54"/>
<source>Success</source>
<translation>Паспяхова завершана</translation>
@@ -1632,9 +1632,9 @@ installed addons will be checked for available updates
<translation>Абраць файл гузіку для гэтага элемента зместу</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="732"/>
<location filename="../../addonmanager_devmode_add_content.py" line="293"/>
<location filename="../../addonmanager_devmode_add_content.py" line="332"/>
<location filename="../../addonmanager_devmode.py" line="732"/>
<source>{} is not a subdirectory of {}</source>
<translation>{} не з'яўляецца ўкладзеным каталогам {}</translation>
</message>
@@ -1267,18 +1267,18 @@ installed addons will be checked for available updates
<translation type="unfinished">Execution of macro failed. See console for failure details.</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../addonmanager_devmode_people_table.py" line="88"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../package_list.py" line="398"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<source>Maintainer</source>
<translation type="unfinished">Maintainer</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../addonmanager_devmode_people_table.py" line="89"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../package_list.py" line="435"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<source>Author</source>
<translation>Autor</translation>
</message>
@@ -1494,8 +1494,8 @@ installed addons will be checked for available updates
<translation type="unfinished">QtWebEngine Python bindings not installed -- using fallback README display.</translation>
</message>
<message>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../package_details.py" line="682"/>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../AddonManagerTest/gui/test_installer_gui.py" line="54"/>
<source>Success</source>
<translation type="unfinished">Success</translation>
@@ -1627,9 +1627,9 @@ installed addons will be checked for available updates
<translation type="unfinished">Select an icon file for this content item</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="732"/>
<location filename="../../addonmanager_devmode_add_content.py" line="293"/>
<location filename="../../addonmanager_devmode_add_content.py" line="332"/>
<location filename="../../addonmanager_devmode.py" line="732"/>
<source>{} is not a subdirectory of {}</source>
<translation type="unfinished">{} is not a subdirectory of {}</translation>
</message>
@@ -1269,18 +1269,18 @@ nainstalované doplňky budou zkontrolovány pro dostupné aktualizace
<translation>Provedení makra selhalo. Podrobnosti o selhání viz konzola.</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../addonmanager_devmode_people_table.py" line="88"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../package_list.py" line="398"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<source>Maintainer</source>
<translation>Správce</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../addonmanager_devmode_people_table.py" line="89"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../package_list.py" line="435"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<source>Author</source>
<translation>Autor</translation>
</message>
@@ -1496,8 +1496,8 @@ nainstalované doplňky budou zkontrolovány pro dostupné aktualizace
<translation>QtWebEngine bindings Python není nainstalován -- používá záložní README displej.</translation>
</message>
<message>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../package_details.py" line="682"/>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../AddonManagerTest/gui/test_installer_gui.py" line="54"/>
<source>Success</source>
<translation>Úspěšně</translation>
@@ -1629,9 +1629,9 @@ nainstalované doplňky budou zkontrolovány pro dostupné aktualizace
<translation>Vyberte soubor ikony pro tuto položku obsahu</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="732"/>
<location filename="../../addonmanager_devmode_add_content.py" line="293"/>
<location filename="../../addonmanager_devmode_add_content.py" line="332"/>
<location filename="../../addonmanager_devmode.py" line="732"/>
<source>{} is not a subdirectory of {}</source>
<translation>{} není podadresář {}</translation>
</message>
@@ -1267,18 +1267,18 @@ installed addons will be checked for available updates
<translation>Ausführen des Makros schlug fehl. Siehe Konsole für Fehlerdetails.</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../addonmanager_devmode_people_table.py" line="88"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../package_list.py" line="398"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<source>Maintainer</source>
<translation>Maintainer</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../addonmanager_devmode_people_table.py" line="89"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../package_list.py" line="435"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<source>Author</source>
<translation>Autor</translation>
</message>
@@ -1494,8 +1494,8 @@ installed addons will be checked for available updates
<translation>QtWebEngine Python Bindings nicht installiert -- verwendet Fallback LIESMICH Anzeige.</translation>
</message>
<message>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../package_details.py" line="682"/>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../AddonManagerTest/gui/test_installer_gui.py" line="54"/>
<source>Success</source>
<translation>Erfolgreich</translation>
@@ -1627,9 +1627,9 @@ installed addons will be checked for available updates
<translation>Wählen Sie eine Symboldatei für dieses Inhaltselement</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="732"/>
<location filename="../../addonmanager_devmode_add_content.py" line="293"/>
<location filename="../../addonmanager_devmode_add_content.py" line="332"/>
<location filename="../../addonmanager_devmode.py" line="732"/>
<source>{} is not a subdirectory of {}</source>
<translation>{} ist kein Unterverzeichnis von {}</translation>
</message>
@@ -1982,7 +1982,7 @@ installed addons will be checked for available updates
<message>
<location filename="../../package_list.py" line="408"/>
<source>Tags</source>
<translation>Tags</translation>
<translation>Schlagwörter</translation>
</message>
<message>
<location filename="../../package_list.py" line="428"/>
@@ -2116,7 +2116,7 @@ installed addons will be checked for available updates
<location filename="../../change_branch.py" line="179"/>
<source>Tag</source>
<comment>git terminology</comment>
<translation>Markierung</translation>
<translation>Schlagwort</translation>
</message>
<message>
<location filename="../../change_branch.py" line="262"/>
@@ -1270,18 +1270,18 @@ installed addons will be checked for available updates
<translation type="unfinished">Execution of macro failed. See console for failure details.</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../addonmanager_devmode_people_table.py" line="88"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../package_list.py" line="398"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<source>Maintainer</source>
<translation>Συντηρητής</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../addonmanager_devmode_people_table.py" line="89"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../package_list.py" line="435"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<source>Author</source>
<translation>Συγγραφέας</translation>
</message>
@@ -1497,8 +1497,8 @@ installed addons will be checked for available updates
<translation type="unfinished">QtWebEngine Python bindings not installed -- using fallback README display.</translation>
</message>
<message>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../package_details.py" line="682"/>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../AddonManagerTest/gui/test_installer_gui.py" line="54"/>
<source>Success</source>
<translation type="unfinished">Success</translation>
@@ -1630,9 +1630,9 @@ installed addons will be checked for available updates
<translation type="unfinished">Select an icon file for this content item</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="732"/>
<location filename="../../addonmanager_devmode_add_content.py" line="293"/>
<location filename="../../addonmanager_devmode_add_content.py" line="332"/>
<location filename="../../addonmanager_devmode.py" line="732"/>
<source>{} is not a subdirectory of {}</source>
<translation type="unfinished">{} is not a subdirectory of {}</translation>
</message>
@@ -1267,18 +1267,18 @@ los complementos instalados serán revisados por actualizaciones disponibles
<translation>Falló la ejecución de la macro. Vea la consola para detalles del fallo.</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../addonmanager_devmode_people_table.py" line="88"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../package_list.py" line="398"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<source>Maintainer</source>
<translation>Mantenedor</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../addonmanager_devmode_people_table.py" line="89"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../package_list.py" line="435"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<source>Author</source>
<translation>Autor</translation>
</message>
@@ -1494,8 +1494,8 @@ los complementos instalados serán revisados por actualizaciones disponibles
<translation>No se han instalado enlaces Python QtWebEngine -- usando la pantalla README de respaldo.</translation>
</message>
<message>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../package_details.py" line="682"/>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../AddonManagerTest/gui/test_installer_gui.py" line="54"/>
<source>Success</source>
<translation>Éxito</translation>
@@ -1627,9 +1627,9 @@ los complementos instalados serán revisados por actualizaciones disponibles
<translation>Seleccione un archivo de icono para este elemento de contenido</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="732"/>
<location filename="../../addonmanager_devmode_add_content.py" line="293"/>
<location filename="../../addonmanager_devmode_add_content.py" line="332"/>
<location filename="../../addonmanager_devmode.py" line="732"/>
<source>{} is not a subdirectory of {}</source>
<translation>{} no es un subdirectorio de {}</translation>
</message>
@@ -1266,18 +1266,18 @@ installed addons will be checked for available updates
<translation>Falló la ejecución de la macro. Vea la consola para detalles del fallo.</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../addonmanager_devmode_people_table.py" line="88"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../package_list.py" line="398"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<source>Maintainer</source>
<translation>Mantenedor</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../addonmanager_devmode_people_table.py" line="89"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../package_list.py" line="435"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<source>Author</source>
<translation>Autor</translation>
</message>
@@ -1493,8 +1493,8 @@ installed addons will be checked for available updates
<translation>No se han instalado enlaces Python QtWebEngine -- usando la pantalla README de respaldo.</translation>
</message>
<message>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../package_details.py" line="682"/>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../AddonManagerTest/gui/test_installer_gui.py" line="54"/>
<source>Success</source>
<translation>Éxito</translation>
@@ -1626,9 +1626,9 @@ installed addons will be checked for available updates
<translation>Seleccione un archivo de icono para este elemento de contenido</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="732"/>
<location filename="../../addonmanager_devmode_add_content.py" line="293"/>
<location filename="../../addonmanager_devmode_add_content.py" line="332"/>
<location filename="../../addonmanager_devmode.py" line="732"/>
<source>{} is not a subdirectory of {}</source>
<translation>{} no es un subdirectorio de {}</translation>
</message>
@@ -1269,18 +1269,18 @@ denean gehigarrien eguneraketarik dagoen begiratuko da
<translation>Makroaren exekuzioak huts egin du. Begiratu kontsola xehetasun gehiagorako.</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../addonmanager_devmode_people_table.py" line="88"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../package_list.py" line="398"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<source>Maintainer</source>
<translation>Mantentzailea</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../addonmanager_devmode_people_table.py" line="89"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../package_list.py" line="435"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<source>Author</source>
<translation>Egilea</translation>
</message>
@@ -1496,8 +1496,8 @@ denean gehigarrien eguneraketarik dagoen begiratuko da
<translation>QtWebEngine Python loturak ez daude instalatuta -- ordezko README bistaratzea erabiliko da.</translation>
</message>
<message>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../package_details.py" line="682"/>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../AddonManagerTest/gui/test_installer_gui.py" line="54"/>
<source>Success</source>
<translation>Eginda</translation>
@@ -1629,9 +1629,9 @@ denean gehigarrien eguneraketarik dagoen begiratuko da
<translation>Hautatu ikono-fitxategi bat eduki-elementu honetarako</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="732"/>
<location filename="../../addonmanager_devmode_add_content.py" line="293"/>
<location filename="../../addonmanager_devmode_add_content.py" line="332"/>
<location filename="../../addonmanager_devmode.py" line="732"/>
<source>{} is not a subdirectory of {}</source>
<translation>{} ez da {} direktorioaren azpidirektorio bat</translation>
</message>
@@ -1269,18 +1269,18 @@ installed addons will be checked for available updates
<translation type="unfinished">Execution of macro failed. See console for failure details.</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../addonmanager_devmode_people_table.py" line="88"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../package_list.py" line="398"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<source>Maintainer</source>
<translation>Ylläpitäjä</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../addonmanager_devmode_people_table.py" line="89"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../package_list.py" line="435"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<source>Author</source>
<translation>Kehittäjä</translation>
</message>
@@ -1496,8 +1496,8 @@ installed addons will be checked for available updates
<translation type="unfinished">QtWebEngine Python bindings not installed -- using fallback README display.</translation>
</message>
<message>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../package_details.py" line="682"/>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../AddonManagerTest/gui/test_installer_gui.py" line="54"/>
<source>Success</source>
<translation type="unfinished">Success</translation>
@@ -1629,9 +1629,9 @@ installed addons will be checked for available updates
<translation type="unfinished">Select an icon file for this content item</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="732"/>
<location filename="../../addonmanager_devmode_add_content.py" line="293"/>
<location filename="../../addonmanager_devmode_add_content.py" line="332"/>
<location filename="../../addonmanager_devmode.py" line="732"/>
<source>{} is not a subdirectory of {}</source>
<translation type="unfinished">{} is not a subdirectory of {}</translation>
</message>
@@ -1269,18 +1269,18 @@ les mises à jour disponibles seront vérifiées pour les extensions installées
<translation>L'exécution de la macro a échoué. Voir la console pour les détails de l'échec.</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../addonmanager_devmode_people_table.py" line="88"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<location filename="../../addonmanager_devmode.py" line="116"/>
<location filename="../../package_list.py" line="398"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="47"/>
<source>Maintainer</source>
<translation>Mainteneur</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../addonmanager_devmode_people_table.py" line="89"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<location filename="../../addonmanager_devmode.py" line="117"/>
<location filename="../../package_list.py" line="435"/>
<location filename="../../addonmanager_devmode_person_editor.py" line="50"/>
<source>Author</source>
<translation>Auteur</translation>
</message>
@@ -1496,8 +1496,8 @@ les mises à jour disponibles seront vérifiées pour les extensions installées
<translation>Les bindings Python de QtWebEngine ne sont pas installés -- utilisation de l'affichage README de remplacement.</translation>
</message>
<message>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../package_details.py" line="682"/>
<location filename="../../addonmanager_installer_gui.py" line="476"/>
<location filename="../../AddonManagerTest/gui/test_installer_gui.py" line="54"/>
<source>Success</source>
<translation>Opération réussie</translation>
@@ -1629,9 +1629,9 @@ les mises à jour disponibles seront vérifiées pour les extensions installées
<translation>Sélectionner un fichier d'icône pour cet élément de contenu</translation>
</message>
<message>
<location filename="../../addonmanager_devmode.py" line="732"/>
<location filename="../../addonmanager_devmode_add_content.py" line="293"/>
<location filename="../../addonmanager_devmode_add_content.py" line="332"/>
<location filename="../../addonmanager_devmode.py" line="732"/>
<source>{} is not a subdirectory of {}</source>
<translation>{} n'est pas un sous-répertoire de {}</translation>
</message>

Some files were not shown because too many files have changed in this diff Show More