Merge branch 'master' of ssh://free-cad.git.sourceforge.net/gitroot/free-cad/free-cad into sanguinariojoe-ship

This commit is contained in:
Jose Luis Cercos Pita 2012-09-07 10:50:27 +02:00
commit 263363895a
512 changed files with 176905 additions and 107718 deletions

View File

@ -77,10 +77,10 @@ SET(CMAKE_INSTALL_DOCDIR doc CACHE PATH "Output directory for documentation and
SET(RESOURCEDIR "${CMAKE_INSTALL_DATADIR}")
SET(DOCDIR "${CMAKE_INSTALL_DOCDIR}")
MESSAGE("prefix: ${CMAKE_INSTALL_PREFIX}")
MESSAGE("datadir: ${CMAKE_INSTALL_DATADIR}")
MESSAGE("docdir: ${CMAKE_INSTALL_DOCDIR}")
MESSAGE("includedir: ${CMAKE_INSTALL_INCLUDEDIR}")
MESSAGE( STATUS "prefix: ${CMAKE_INSTALL_PREFIX}")
MESSAGE(STATUS "datadir: ${CMAKE_INSTALL_DATADIR}")
MESSAGE(STATUS "docdir: ${CMAKE_INSTALL_DOCDIR}")
MESSAGE(STATUS "includedir: ${CMAKE_INSTALL_INCLUDEDIR}")
# ==============================================================================
# == Win32 is default behaviour use the LibPack copied in Source tree ==========

View File

@ -278,28 +278,29 @@ set(ODE_FOUND TRUE)
# OCC
set(OCC_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/OpenCascade)
set(OCC_LIBRARIES
TKFillet
TKMesh
TKernel
TKG2d
TKG3d
TKMath
TKIGES
TKSTL
TKShHealing
TKXSBase
TKBool
TKBO
TKBRep
TKTopAlgo
TKGeomAlgo
TKGeomBase
TKOffset
TKPrim
TKSTEP
TKSTEPBase
TKSTEPAttr
TKHLR
TKFillet
TKMesh
TKernel
TKG2d
TKG3d
TKMath
TKIGES
TKSTL
TKShHealing
TKXSBase
TKBool
TKBO
TKBRep
TKTopAlgo
TKGeomAlgo
TKGeomBase
TKOffset
TKPrim
TKSTEP
TKSTEPBase
TKSTEPAttr
TKHLR
TKFeat
)
set(OCC_LIBRARY_DIR
${FREECAD_LIBPACK_DIR}/lib

View File

@ -284,28 +284,29 @@ set(OPENCV_FOUND TRUE)
# OCC
set(OCC_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/OpenCascade)
set(OCC_LIBRARIES
TKFillet
TKMesh
TKernel
TKG2d
TKG3d
TKMath
TKIGES
TKSTL
TKShHealing
TKXSBase
TKBool
TKBO
TKBRep
TKTopAlgo
TKGeomAlgo
TKGeomBase
TKOffset
TKPrim
TKSTEP
TKSTEPBase
TKSTEPAttr
TKHLR
TKFillet
TKMesh
TKernel
TKG2d
TKG3d
TKMath
TKIGES
TKSTL
TKShHealing
TKXSBase
TKBool
TKBO
TKBRep
TKTopAlgo
TKGeomAlgo
TKGeomBase
TKOffset
TKPrim
TKSTEP
TKSTEPBase
TKSTEPAttr
TKHLR
TKFeat
)
set(OCC_LIBRARY_DIR
${FREECAD_LIBPACK_DIR}/lib

View File

@ -284,16 +284,16 @@ set(OPENCV_FOUND TRUE)
# OCC
set(OCC_INCLUDE_DIR ${FREECAD_LIBPACK_DIR}/include/OpenCascade)
set(OCC_LIBRARIES
TKFillet
TKMesh
TKernel
TKG2d
TKG3d
TKMath
TKIGES
TKSTL
TKShHealing
TKXSBase
TKFillet
TKMesh
TKernel
TKG2d
TKG3d
TKMath
TKIGES
TKSTL
TKShHealing
TKXSBase
TKBool
TKXSBase
TKXCAF
@ -302,18 +302,19 @@ set(OCC_LIBRARIES
TKSTEP
TKIGES
TKXDESTEP
TKXDEIGES
TKBO
TKBRep
TKTopAlgo
TKGeomAlgo
TKGeomBase
TKOffset
TKPrim
TKSTEP
TKSTEPBase
TKSTEPAttr
TKHLR
TKXDEIGES
TKBO
TKBRep
TKTopAlgo
TKGeomAlgo
TKGeomBase
TKOffset
TKPrim
TKSTEP
TKSTEPBase
TKSTEPAttr
TKHLR
TKFeat
)
set(OCC_LIBRARY_DIR
${FREECAD_LIBPACK_DIR}/lib

View File

@ -1339,7 +1339,7 @@ void Application::LoadParameters(void)
// fix weird error while linking boost (all versions of VC)
// VS2010: https://sourceforge.net/apps/phpbb/free-cad/viewtopic.php?f=4&t=1886&p=12553&hilit=boost%3A%3Afilesystem%3A%3Aget#p12553
namespace boost { namespace program_options { std::string arg="arg"; } }
#if (defined (BOOST_VERSION) && (BOOST_VERSION == 104100))
#if (defined (BOOST_VERSION) && (BOOST_VERSION >= 104100))
namespace boost { namespace program_options {
const unsigned options_description::m_default_line_length = 80;
} }

View File

@ -294,6 +294,7 @@ void PropertyPythonObject::Restore(Base::XMLReader &reader)
else {
bool load_json=false;
bool load_pickle=false;
bool load_failed=false;
std::string buffer = reader.getAttribute("value");
if (reader.hasAttribute("encoded") &&
strcmp(reader.getAttribute("encoded"),"yes") == 0) {
@ -312,7 +313,16 @@ void PropertyPythonObject::Restore(Base::XMLReader &reader)
end = buffer.end();
if (reader.hasAttribute("module") && reader.hasAttribute("class")) {
Py::Module mod(PyImport_ImportModule(reader.getAttribute("module")),true);
this->object = PyInstance_NewRaw(mod.getAttr(reader.getAttribute("class")).ptr(), 0);
PyObject* cls = mod.getAttr(reader.getAttribute("class")).ptr();
if (PyClass_Check(cls)) {
this->object = PyInstance_NewRaw(cls, 0);
}
else if (PyType_Check(cls)) {
this->object = PyType_GenericAlloc((PyTypeObject*)cls, 0);
}
else {
throw Py::TypeError("neither class nor type object");
}
load_json = true;
}
else if (boost::regex_search(start, end, what, pickle)) {
@ -327,6 +337,8 @@ void PropertyPythonObject::Restore(Base::XMLReader &reader)
catch (Py::Exception&) {
Base::PyException e; // extract the Python error text
Base::Console().Warning("PropertyPythonObject::Restore: %s\n", e.what());
this->object = Py::None();
load_failed = true;
}
aboutToSetValue();
@ -334,7 +346,7 @@ void PropertyPythonObject::Restore(Base::XMLReader &reader)
this->fromString(buffer);
else if (load_pickle)
this->loadPickle(buffer);
else
else if (!load_failed)
Base::Console().Warning("PropertyPythonObject::Restore: unsupported serialisation: %s\n", buffer.c_str());
restoreObject(reader);
hasSetValue();

View File

@ -152,6 +152,7 @@ SET(FreeCADBase_XML_SRCS
SOURCE_GROUP("XML" FILES ${FreeCADBase_XML_SRCS})
set(FreeCADBase_MOC_HDRS
Debugger.h
FutureWatcherProgress.h
)
fc_wrap_cpp(FreeCADBase_MOC_SRCS ${FreeCADBase_MOC_HDRS})
@ -182,6 +183,7 @@ SET(FreeCADBase_CPP_SRCS
BoundBoxPyImp.cpp
Builder3D.cpp
Console.cpp
Debugger.cpp
Exception.cpp
Factory.cpp
FileInfo.cpp
@ -234,6 +236,7 @@ SET(FreeCADBase_HPP_SRCS
BoundBox.h
Builder3D.h
Console.h
Debugger.h
Exception.h
Factory.h
FileInfo.h

80
src/Base/Debugger.cpp Normal file
View File

@ -0,0 +1,80 @@
/***************************************************************************
* Copyright (c) 2012 Werner Mayer <wmayer[at]users.sourceforge.net> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 51 Franklin Street, *
* Fifth Floor, Boston, MA 02110-1301, USA *
* *
***************************************************************************/
#include "PreCompiled.h"
#ifndef _PreComp_
# include <QCoreApplication>
# include <QEvent>
#endif
#include "Debugger.h"
#include "Console.h"
using namespace Base;
Debugger::Debugger(QObject* parent)
: QObject(parent), isAttached(false)
{
}
Debugger::~Debugger()
{
}
void Debugger::attach()
{
QCoreApplication::instance()->installEventFilter(this);
isAttached = true;
}
void Debugger::detach()
{
QCoreApplication::instance()->removeEventFilter(this);
isAttached = false;
}
bool Debugger::eventFilter(QObject*, QEvent* event)
{
if (event->type() == QEvent::KeyPress) {
if (loop.isRunning()) {
loop.quit();
return true;
}
}
return false;
}
int Debugger::exec()
{
if (isAttached)
Base::Console().Message("TO CONTINUE PRESS ANY KEY...\n");
return loop.exec();
}
void Debugger::quit()
{
loop.quit();
}
#include "moc_Debugger.cpp"

76
src/Base/Debugger.h Normal file
View File

@ -0,0 +1,76 @@
/***************************************************************************
* Copyright (c) 2012 Werner Mayer <wmayer[at]users.sourceforge.net> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 51 Franklin Street, *
* Fifth Floor, Boston, MA 02110-1301, USA *
* *
***************************************************************************/
#ifndef BASE_DEBUGGER_H
#define BASE_DEBUGGER_H
#include <QObject>
#include <QEventLoop>
namespace Base {
/**
This is a utility class to break the application at a point to inspect e.g. the result of
an algorithm.
You usually use it like this
\code
...
Base::Debugger dbg;
dbg.attach();
dbg.exec();
...
\endcode
Or you can connect it with a button and let the user click it in order to continue.
\code
QPushButton* btn = new QPushButton();
btn->setText("Continue");
btn->show();
Base::Debugger dbg;
connect(btn, SIGNAL(clicked()), &dbg, SLOT(quit()));
dbg.exec();
\endcode
\author Werner Mayer
*/
class BaseExport Debugger : public QObject
{
Q_OBJECT
public:
Debugger(QObject* parent=0);
~Debugger();
void attach();
void detach();
bool eventFilter(QObject*, QEvent*);
int exec();
public Q_SLOTS:
void quit();
private:
bool isAttached;
QEventLoop loop;
};
}
#endif // BASE_DEBUGGER_H

View File

@ -587,6 +587,16 @@ void Matrix_invert (Matrix a, Matrix inva)
Matrix_gauss(temp,inva);
}
void Matrix4D::inverseOrthogonal(void)
{
Base::Vector3d c(dMtrx4D[0][3],dMtrx4D[1][3],dMtrx4D[2][3]);
transpose();
c = this->operator * (c);
dMtrx4D[0][3] = -c.x; dMtrx4D[3][0] = 0;
dMtrx4D[1][3] = -c.y; dMtrx4D[3][1] = 0;
dMtrx4D[2][3] = -c.z; dMtrx4D[3][2] = 0;
}
void Matrix4D::inverseGauss (void)
{
double matrix [16];

View File

@ -135,6 +135,8 @@ public:
void transform (const Vector3f& rclVct, const Matrix4D& rclMtrx);
void transform (const Vector3d& rclVct, const Matrix4D& rclMtrx);
void inverse (void);
/// if matrix is orthogonal a special way of getting the inverse is used
void inverseOrthogonal(void);
void inverseGauss (void);
void transpose (void);
//@}

View File

@ -1131,10 +1131,16 @@ int ParameterManager::LoadDocument(const char* sFileName)
errorsOccured = true;
}
if (errorsOccured)
if (errorsOccured) {
delete parser;
delete errReporter;
return 0;
}
_pDocument = parser->adoptDocument();
delete parser;
delete errReporter;
_pDocument = parser->getDocument();
if (!_pDocument)
throw Exception("Malformed Parameter document: Invalid document");

View File

@ -105,6 +105,8 @@
// QtCore
#include <QBuffer>
#include <QByteArray>
#include <QCoreApplication>
#include <QEvent>
#include <QIODevice>
#include <QDataStream>
#include <QWriteLocker>

View File

@ -193,17 +193,21 @@ void Gui::GUIApplicationNativeEventAware::Move3d(HANDLE device, std::vector<floa
if (!currentWidget)
currentWidget = mainWindow;
int x, y, z, rx, ry, rz;
x = ceil(motionData[0])*(-1);
y = ceil(motionData[1]);
z = ceil(motionData[2]);
rx = ceil(motionData[3])*(-1);
ry = ceil(motionData[4]);
rz = ceil(motionData[5]);
motionDataArray[0] = ceil(motionData[0]);
motionDataArray[1] = ceil(motionData[1]);
motionDataArray[2] = ceil(motionData[2]);
motionDataArray[3] = ceil(motionData[3]);
motionDataArray[4] = ceil(motionData[4]);
motionDataArray[5] = ceil(motionData[5]);
if (!setOSIndependentMotionData()) return;
importSettings();
Spaceball::MotionEvent *motionEvent = new Spaceball::MotionEvent();
motionEvent->setTranslations(x, y, z);
motionEvent->setRotations(rx, ry, rz);
motionEvent->setTranslations(motionDataArray[0], motionDataArray[1], motionDataArray[2]);
motionEvent->setRotations(motionDataArray[3], motionDataArray[4], motionDataArray[5]);
this->postEvent(currentWidget, motionEvent);
}

View File

@ -115,14 +115,14 @@
<property name="spacing">
<number>6</number>
</property>
<item row="3" column="0">
<item row="4" column="0">
<widget class="QLabel" name="labelPlatform">
<property name="text">
<string>Platform</string>
</property>
</widget>
</item>
<item row="3" column="1">
<item row="4" column="1">
<widget class="QLabel" name="labelBuildPlatform">
<property name="text">
<string notr="true">&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;/head&gt;&lt;body style=&quot; white-space: pre-wrap; font-family:MS Shell Dlg 2; font-size:7.8pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Unknown&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
@ -171,34 +171,48 @@
</property>
</widget>
</item>
<item row="5" column="0">
<item row="6" column="0">
<widget class="QLabel" name="labelBranch">
<property name="text">
<string notr="true">Branch</string>
</property>
</widget>
</item>
<item row="5" column="1">
<item row="6" column="1">
<widget class="QLabel" name="labelBuildBranch">
<property name="text">
<string notr="true">&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;/head&gt;&lt;body style=&quot; white-space: pre-wrap; font-family:MS Shell Dlg 2; font-size:7.8pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Unknown&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="6" column="1">
<item row="7" column="1">
<widget class="QLabel" name="labelBuildHash">
<property name="text">
<string notr="true">&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;/head&gt;&lt;body style=&quot; white-space: pre-wrap; font-family:MS Shell Dlg 2; font-size:7.8pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Unknown&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
<item row="6" column="0">
<item row="7" column="0">
<widget class="QLabel" name="labelHash">
<property name="text">
<string notr="true">Hash</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="labelOS">
<property name="text">
<string>Operating system</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="labelBuildOS">
<property name="text">
<string notr="true">&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;/head&gt;&lt;body style=&quot; white-space: pre-wrap; font-family:MS Shell Dlg 2; font-size:7.8pt; font-weight:400; font-style:normal; text-decoration:none;&quot;&gt;&lt;p style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:8pt;&quot;&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;Unknown&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>

View File

@ -1457,9 +1457,10 @@ namespace Gui {
*/
class GUIApplication : public GUIApplicationNativeEventAware
{
int systemExit;
public:
GUIApplication(int & argc, char ** argv)
: GUIApplicationNativeEventAware(argc, argv)
GUIApplication(int & argc, char ** argv, int exitcode)
: GUIApplicationNativeEventAware(argc, argv), systemExit(exitcode)
{
}
@ -1480,6 +1481,10 @@ public:
else
return QApplication::notify(receiver, event);
}
catch (const Base::SystemExitException&) {
qApp->exit(systemExit);
return true;
}
catch (const Base::Exception& e) {
Base::Console().Error("Unhandled Base::Exception caught in GUIApplication::notify.\n"
"The error message is: %s\n", e.what());
@ -1543,7 +1548,8 @@ void Application::runApplication(void)
Base::Console().Log("Init: Creating Gui::Application and QApplication\n");
// if application not yet created by the splasher
int argc = App::Application::GetARGC();
GUIApplication mainApp(argc, App::Application::GetARGV());
int systemExit = 1000;
GUIApplication mainApp(argc, App::Application::GetARGV(), systemExit);
// set application icon and window title
const std::map<std::string,std::string>& cfg = App::Application::Config();
std::map<std::string,std::string>::const_iterator it;
@ -1716,9 +1722,15 @@ void Application::runApplication(void)
Base::Console().Log("Init: Entering event loop\n");
try {
mainApp.exec();
int ret = mainApp.exec();
if (ret == systemExit)
throw Base::SystemExitException();
}
catch(...) {
catch (const Base::SystemExitException&) {
Base::Console().Message("System exit\n");
throw;
}
catch (...) {
// catching nasty stuff coming out of the event loop
App::Application::destructObserver();
Base::Console().Error("Event loop left through unhandled exception\n");

View File

@ -104,6 +104,7 @@ set(Gui_MOC_HDRS
DlgCommandsImp.h
DlgCustomizeImp.h
DlgCustomizeSpaceball.h
DlgCustomizeSpNavSettings.h
DlgDisplayPropertiesImp.h
DlgEditorImp.h
DlgGeneralImp.h
@ -190,6 +191,7 @@ SET(Gui_UIC_SRCS
DlgAuthorization.ui
DlgChooseIcon.ui
DlgCommands.ui
DlgCustomizeSpNavSettings.ui
DlgDisplayProperties.ui
DlgEditor.ui
DlgGeneral.ui
@ -338,6 +340,7 @@ SET(Dialog_Customize_CPP_SRCS
DlgCommandsImp.cpp
DlgCustomizeImp.cpp
DlgCustomizeSpaceball.cpp
DlgCustomizeSpNavSettings.cpp
DlgKeyboardImp.cpp
DlgToolbarsImp.cpp
)
@ -346,6 +349,7 @@ SET(Dialog_Customize_HPP_SRCS
DlgCommandsImp.h
DlgCustomizeImp.h
DlgCustomizeSpaceball.h
DlgCustomizeSpNavSettings.h
DlgKeyboardImp.h
DlgToolbarsImp.h
)
@ -355,6 +359,7 @@ SET(Dialog_Customize_SRCS
DlgActions.ui
DlgChooseIcon.ui
DlgCommands.ui
DlgCustomizeSpNavSettings.ui
DlgKeyboard.ui
DlgToolbars.ui
)

View File

@ -281,6 +281,9 @@ void Command::invoke(int i)
if (isActive())
activated( i );
}
catch (const Base::SystemExitException&) {
throw;
}
catch (Base::PyException &e) {
e.ReportException();
Base::Console().Error("Stack Trace: %s\n",e.getStackTrace().c_str());

View File

@ -576,7 +576,7 @@ void CreateStdCommands(void)
rcCmdMgr.addCommand(new StdCmdOnlineHelpWebsite());
rcCmdMgr.addCommand(new StdCmdFreeCADWebsite());
rcCmdMgr.addCommand(new StdCmdPythonWebsite());
rcCmdMgr.addCommand(new StdCmdMeasurementSimple());
//rcCmdMgr.addCommand(new StdCmdMeasurementSimple());
//rcCmdMgr.addCommand(new StdCmdDownloadOnlineHelp());
//rcCmdMgr.addCommand(new StdCmdDescription());
}

View File

@ -0,0 +1,312 @@
/***************************************************************************
* Copyright (c) 2012 Petar Perisin <petar.perisin@gmail.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#include "PreCompiled.h"
#include "DlgCustomizeSpNavSettings.h"
#include "GuiApplicationNativeEventAware.h"
#include "Application.h"
using namespace Gui::Dialog;
DlgCustomizeSpNavSettings::DlgCustomizeSpNavSettings(QWidget *parent) :
CustomizeActionPage(parent)
{
GUIApplicationNativeEventAware *app = qobject_cast<GUIApplicationNativeEventAware *>(QApplication::instance());
if (!app)
return;
if (!app->isSpaceballPresent())
{
this->setWindowTitle(tr("Spaceball Motion"));
this->setMessage(tr("No Spaceball Present"));
return;
}
this->setupUi(this);
initialize();
}
DlgCustomizeSpNavSettings::~DlgCustomizeSpNavSettings()
{
}
void DlgCustomizeSpNavSettings::setMessage(const QString& message)
{
QLabel *messageLabel = new QLabel(message,this);
QVBoxLayout *layout = new QVBoxLayout();
QHBoxLayout *layout2 = new QHBoxLayout();
layout2->addStretch();
layout2->addWidget(messageLabel);
layout2->addStretch();
layout->addItem(layout2);
this->setLayout(layout);
}
void DlgCustomizeSpNavSettings::changeEvent(QEvent *e)
{
if (e->type() == QEvent::LanguageChange) {
this->retranslateUi(this);
}
QWidget::changeEvent(e);
}
ParameterGrp::handle DlgCustomizeSpNavSettings::spaceballMotionGroup() const
{
static ParameterGrp::handle group = App::GetApplication().GetUserParameter().GetGroup("BaseApp")->GetGroup("Spaceball")->GetGroup("Motion");
return group;
}
void DlgCustomizeSpNavSettings::on_ButtonCalibrate_clicked()
{
spaceballMotionGroup()->SetBool("Calibrate", true);
}
void DlgCustomizeSpNavSettings::initialize()
{
CBDominant->setChecked(spaceballMotionGroup()->GetBool("Dominant", false));
CBFlipYZ->setChecked(spaceballMotionGroup()->GetBool("FlipYZ", false));
CBRotations->setChecked(spaceballMotionGroup()->GetBool("Rotations", true));
CBTranslations->setChecked(spaceballMotionGroup()->GetBool("Translations", true));
SliderGlobal->setValue(spaceballMotionGroup()->GetInt("GlobalSensitivity", 0));
CBEnablePanLR ->setChecked(spaceballMotionGroup()->GetBool("PanLREnable", true));
CBReversePanLR->setChecked(spaceballMotionGroup()->GetBool("PanLRReverse", false));
SliderPanLR ->setValue(spaceballMotionGroup()->GetInt("PanLRSensitivity", 0));
CBEnablePanUD ->setChecked(spaceballMotionGroup()->GetBool("PanUDEnable", true));
CBReversePanUD->setChecked(spaceballMotionGroup()->GetBool("PanUDReverse", false));
SliderPanUD ->setValue(spaceballMotionGroup()->GetInt("PanUDSensitivity", 0));
CBEnableZoom ->setChecked(spaceballMotionGroup()->GetBool("ZoomEnable", true));
CBReverseZoom->setChecked(spaceballMotionGroup()->GetBool("ZoomReverse", false));
SliderZoom ->setValue(spaceballMotionGroup()->GetInt("ZoomSensitivity", 0));
CBEnableTilt ->setChecked(spaceballMotionGroup()->GetBool("TiltEnable", true));
CBReverseTilt->setChecked(spaceballMotionGroup()->GetBool("TiltReverse", false));
SliderTilt ->setValue(spaceballMotionGroup()->GetInt("TiltSensitivity", 0));
CBEnableRoll ->setChecked(spaceballMotionGroup()->GetBool("RollEnable", true));
CBReverseRoll->setChecked(spaceballMotionGroup()->GetBool("RollReverse", false));
SliderRoll ->setValue(spaceballMotionGroup()->GetInt("RollSensitivity", 0));
CBEnableSpin ->setChecked(spaceballMotionGroup()->GetBool("SpinEnable", true));
CBReverseSpin->setChecked(spaceballMotionGroup()->GetBool("SpinReverse", false));
SliderSpin ->setValue(spaceballMotionGroup()->GetInt("SpinSensitivity", 0));
CBEnableTilt ->setEnabled(CBRotations->isChecked());
CBReverseTilt->setEnabled(CBRotations->isChecked() && CBEnableTilt->isChecked());
SliderTilt ->setEnabled(CBRotations->isChecked() && CBEnableTilt->isChecked());
CBEnableRoll ->setEnabled(CBRotations->isChecked());
CBReverseRoll->setEnabled(CBRotations->isChecked() && CBEnableRoll->isChecked());
SliderRoll ->setEnabled(CBRotations->isChecked() && CBEnableRoll->isChecked());
CBEnableSpin ->setEnabled(CBRotations->isChecked());
CBReverseSpin->setEnabled(CBRotations->isChecked() && CBEnableSpin->isChecked());
SliderSpin ->setEnabled(CBRotations->isChecked() && CBEnableSpin->isChecked());
CBEnablePanLR ->setEnabled(CBTranslations->isChecked());
CBReversePanLR->setEnabled(CBTranslations->isChecked() && CBEnablePanLR->isChecked());
SliderPanLR ->setEnabled(CBTranslations->isChecked() && CBEnablePanLR->isChecked());
CBEnablePanUD ->setEnabled(CBTranslations->isChecked());
CBReversePanUD->setEnabled(CBTranslations->isChecked() && CBEnablePanUD->isChecked());
SliderPanUD ->setEnabled(CBTranslations->isChecked() && CBEnablePanUD->isChecked());
CBEnableZoom ->setEnabled(CBTranslations->isChecked());
CBReverseZoom ->setEnabled(CBTranslations->isChecked() && CBEnableZoom->isChecked());
SliderZoom ->setEnabled(CBTranslations->isChecked() && CBEnableZoom->isChecked());
}
void DlgCustomizeSpNavSettings::on_ButtonDefaultSpNavMotions_clicked()
{
spaceballMotionGroup()->Clear();
initialize();
}
void DlgCustomizeSpNavSettings::on_CBDominant_clicked()
{
spaceballMotionGroup()->SetBool("Dominant", CBDominant->isChecked());
}
void DlgCustomizeSpNavSettings::on_CBFlipYZ_clicked()
{
spaceballMotionGroup()->SetBool("FlipYZ", CBFlipYZ->isChecked());
}
void DlgCustomizeSpNavSettings::on_CBRotations_clicked()
{
spaceballMotionGroup()->SetBool("Rotations", CBRotations->isChecked());
CBEnableTilt ->setEnabled(CBRotations->isChecked());
CBReverseTilt->setEnabled(CBRotations->isChecked() && CBEnableTilt->isChecked());
SliderTilt ->setEnabled(CBRotations->isChecked() && CBEnableTilt->isChecked());
CBEnableRoll ->setEnabled(CBRotations->isChecked());
CBReverseRoll->setEnabled(CBRotations->isChecked() && CBEnableRoll->isChecked());
SliderRoll ->setEnabled(CBRotations->isChecked() && CBEnableRoll->isChecked());
CBEnableSpin ->setEnabled(CBRotations->isChecked());
CBReverseSpin->setEnabled(CBRotations->isChecked() && CBEnableSpin->isChecked());
SliderSpin ->setEnabled(CBRotations->isChecked() && CBEnableSpin->isChecked());
}
void DlgCustomizeSpNavSettings::on_CBTranslations_clicked()
{
spaceballMotionGroup()->SetBool("Translations", CBTranslations->isChecked());
CBEnablePanLR ->setEnabled(CBTranslations->isChecked());
CBReversePanLR->setEnabled(CBTranslations->isChecked() && CBEnablePanLR->isChecked());
SliderPanLR ->setEnabled(CBTranslations->isChecked() && CBEnablePanLR->isChecked());
CBEnablePanUD ->setEnabled(CBTranslations->isChecked());
CBReversePanUD->setEnabled(CBTranslations->isChecked() && CBEnablePanUD->isChecked());
SliderPanUD ->setEnabled(CBTranslations->isChecked() && CBEnablePanUD->isChecked());
CBEnableZoom ->setEnabled(CBTranslations->isChecked());
CBReverseZoom ->setEnabled(CBTranslations->isChecked() && CBEnableZoom->isChecked());
SliderZoom ->setEnabled(CBTranslations->isChecked() && CBEnableZoom->isChecked());
}
void DlgCustomizeSpNavSettings::on_SliderGlobal_sliderReleased()
{
spaceballMotionGroup()->SetInt("GlobalSensitivity", SliderGlobal->value());
}
void DlgCustomizeSpNavSettings::on_CBEnablePanLR_clicked()
{
spaceballMotionGroup()->SetBool("PanLREnable", CBEnablePanLR->isChecked());
CBReversePanLR->setEnabled(CBEnablePanLR->isChecked());
SliderPanLR ->setEnabled(CBEnablePanLR->isChecked());
}
void DlgCustomizeSpNavSettings::on_CBReversePanLR_clicked()
{
spaceballMotionGroup()->SetBool("PanLRReverse", CBReversePanLR->isChecked());
}
void DlgCustomizeSpNavSettings::on_SliderPanLR_sliderReleased()
{
spaceballMotionGroup()->SetInt("PanLRSensitivity", SliderPanLR->value());
}
void DlgCustomizeSpNavSettings::on_CBEnablePanUD_clicked()
{
spaceballMotionGroup()->SetBool("PanUDEnable", CBEnablePanUD->isChecked());
CBReversePanUD->setEnabled(CBEnablePanUD->isChecked());
SliderPanUD ->setEnabled(CBEnablePanUD->isChecked());
}
void DlgCustomizeSpNavSettings::on_CBReversePanUD_clicked()
{
spaceballMotionGroup()->SetBool("PanUDReverse", CBReversePanUD->isChecked());
}
void DlgCustomizeSpNavSettings::on_SliderPanUD_sliderReleased()
{
spaceballMotionGroup()->SetInt("PanUDSensitivity", SliderPanUD->value());
}
void DlgCustomizeSpNavSettings::on_CBEnableZoom_clicked()
{
spaceballMotionGroup()->SetBool("ZoomEnable", CBEnableZoom->isChecked());
CBReverseZoom ->setEnabled(CBEnableZoom->isChecked());
SliderZoom ->setEnabled(CBEnableZoom->isChecked());
}
void DlgCustomizeSpNavSettings::on_CBReverseZoom_clicked()
{
spaceballMotionGroup()->SetBool("ZoomReverse", CBReverseZoom->isChecked());
}
void DlgCustomizeSpNavSettings::on_SliderZoom_sliderReleased()
{
spaceballMotionGroup()->SetInt("ZoomSensitivity", SliderZoom->value());
}
void DlgCustomizeSpNavSettings::on_CBEnableTilt_clicked()
{
spaceballMotionGroup()->SetBool("TiltEnable", CBEnableTilt->isChecked());
CBReverseTilt->setEnabled(CBEnableTilt->isChecked());
SliderTilt ->setEnabled(CBEnableTilt->isChecked());
}
void DlgCustomizeSpNavSettings::on_CBReverseTilt_clicked()
{
spaceballMotionGroup()->SetBool("TiltReverse", CBReverseTilt->isChecked());
}
void DlgCustomizeSpNavSettings::on_SliderTilt_sliderReleased()
{
spaceballMotionGroup()->SetInt("TiltSensitivity", SliderTilt->value());
}
void DlgCustomizeSpNavSettings::on_CBEnableRoll_clicked()
{
spaceballMotionGroup()->SetBool("RollEnable", CBEnableRoll->isChecked());
CBReverseRoll->setEnabled(CBEnableRoll->isChecked());
SliderRoll ->setEnabled(CBEnableRoll->isChecked());
}
void DlgCustomizeSpNavSettings::on_CBReverseRoll_clicked()
{
spaceballMotionGroup()->SetBool("RollReverse", CBReverseRoll->isChecked());
}
void DlgCustomizeSpNavSettings::on_SliderRoll_sliderReleased()
{
spaceballMotionGroup()->SetInt("RollSensitivity", SliderRoll->value());
}
void DlgCustomizeSpNavSettings::on_CBEnableSpin_clicked()
{
spaceballMotionGroup()->SetBool("SpinEnable", CBEnableSpin->isChecked());
CBReverseSpin->setEnabled(CBEnableSpin->isChecked());
SliderSpin ->setEnabled(CBEnableSpin->isChecked());
}
void DlgCustomizeSpNavSettings::on_CBReverseSpin_clicked()
{
spaceballMotionGroup()->SetBool("SpinReverse", CBReverseSpin->isChecked());
}
void DlgCustomizeSpNavSettings::on_SliderSpin_sliderReleased()
{
spaceballMotionGroup()->SetInt("SpinSensitivity", SliderSpin->value());
}
void DlgCustomizeSpNavSettings::onAddMacroAction(const QByteArray &macroName)
{
//don't need to do anything here.
}
void DlgCustomizeSpNavSettings::onRemoveMacroAction(const QByteArray &macroName)
{
//don't need to do anything here.
}
void DlgCustomizeSpNavSettings::onModifyMacroAction(const QByteArray &macroName)
{
//don't need to do anything here.
}
#include "moc_DlgCustomizeSpNavSettings.cpp"

View File

@ -0,0 +1,85 @@
/***************************************************************************
* Copyright (c) 2012 Petar Perisin <petar.perisin@gmail.com> *
* *
* This file is part of the FreeCAD CAx development system. *
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License as published by the Free Software Foundation; either *
* version 2 of the License, or (at your option) any later version. *
* *
* This library is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Library General Public License for more details. *
* *
* You should have received a copy of the GNU Library General Public *
* License along with this library; see the file COPYING.LIB. If not, *
* write to the Free Software Foundation, Inc., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#ifndef DLGCUSTOMIZESPNAVSETTINGS_H
#define DLGCUSTOMIZESPNAVSETTINGS_H
#include "ui_DlgCustomizeSpNavSettings.h"
#include "PropertyPage.h"
#include <Base/Parameter.h>
namespace Gui
{
namespace Dialog
{
class DlgCustomizeSpNavSettings : public CustomizeActionPage, public Ui_DlgCustomizeSpNavSettings
{
Q_OBJECT
public:
explicit DlgCustomizeSpNavSettings(QWidget *parent = 0);
~DlgCustomizeSpNavSettings();
protected Q_SLOTS:
void onAddMacroAction(const QByteArray&);
void onRemoveMacroAction(const QByteArray&);
void onModifyMacroAction(const QByteArray&);
void on_CBDominant_clicked();
void on_CBFlipYZ_clicked();
void on_CBRotations_clicked();
void on_CBTranslations_clicked();
void on_SliderGlobal_sliderReleased();
void on_CBEnablePanLR_clicked();
void on_CBReversePanLR_clicked();
void on_SliderPanLR_sliderReleased();
void on_CBEnablePanUD_clicked();
void on_CBReversePanUD_clicked();
void on_SliderPanUD_sliderReleased();
void on_CBEnableZoom_clicked();
void on_CBReverseZoom_clicked();
void on_SliderZoom_sliderReleased();
void on_CBEnableTilt_clicked();
void on_CBReverseTilt_clicked();
void on_SliderTilt_sliderReleased();
void on_CBEnableRoll_clicked();
void on_CBReverseRoll_clicked();
void on_SliderRoll_sliderReleased();
void on_CBEnableSpin_clicked();
void on_CBReverseSpin_clicked();
void on_SliderSpin_sliderReleased();
void on_ButtonDefaultSpNavMotions_clicked();
void on_ButtonCalibrate_clicked();
protected:
void changeEvent(QEvent *e);
private:
ParameterGrp::handle spaceballMotionGroup() const;
void setMessage(const QString& message);
void initialize();
};
}
}
#endif // DLGCUSTOMIZESPNAVSETTINGS_H

View File

@ -0,0 +1,534 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DlgCustomizeSpNavSettings</class>
<widget class="QWidget" name="DlgCustomizeSpNavSettings">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>439</width>
<height>537</height>
</rect>
</property>
<property name="windowTitle">
<string>Spaceball Motion</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="labelSlow">
<property name="text">
<string>Global Sensitivity: </string>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="SliderGlobal">
<property name="minimum">
<number>-50</number>
</property>
<property name="maximum">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<widget class="QCheckBox" name="CBDominant">
<property name="text">
<string>Dominant Mode</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CBFlipYZ">
<property name="text">
<string>Flip Y/Z</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_11">
<item>
<widget class="QCheckBox" name="CBTranslations">
<property name="text">
<string>Enable Translations</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CBRotations">
<property name="text">
<string>Enable Rotations</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="ButtonCalibrate">
<property name="text">
<string>Calibrate</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="ButtonDefaultSpNavMotions">
<property name="text">
<string>Default</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>116</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="ImagePanLR">
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="Icons/resource.qrc">:/icons/SpNav-PanLR.png</pixmap>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="ImagePanUD">
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="Icons/resource.qrc">:/icons/SpNav-PanUD.png</pixmap>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="ImageZoom">
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="Icons/resource.qrc">:/icons/SpNav-Zoom.png</pixmap>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="imageTilt">
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="Icons/resource.qrc">:/icons/SpNav-Tilt.png</pixmap>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="ImageRoll">
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="Icons/resource.qrc">:/icons/SpNav-Roll.png</pixmap>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="ImageSpin">
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="Icons/resource.qrc">:/icons/SpNav-Spin.png</pixmap>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_9">
<property name="spacing">
<number>20</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="CBEnablePanLR">
<property name="text">
<string>Enable</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CBReversePanLR">
<property name="text">
<string>Reverse</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="CBEnablePanUD">
<property name="text">
<string>Enable</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CBReversePanUD">
<property name="text">
<string>Reverse</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_5">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="CBEnableZoom">
<property name="text">
<string>Enable</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CBReverseZoom">
<property name="text">
<string>Reverse</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_6">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="CBEnableTilt">
<property name="text">
<string>Enable</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CBReverseTilt">
<property name="text">
<string>Reverse</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_7">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="CBEnableRoll">
<property name="text">
<string>Enable</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CBReverseRoll">
<property name="text">
<string>Reverse</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_8">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="CBEnableSpin">
<property name="text">
<string>Enable</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="CBReverseSpin">
<property name="text">
<string>Reverse</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="spacing">
<number>30</number>
</property>
<item>
<widget class="QSlider" name="SliderPanLR">
<property name="minimum">
<number>-50</number>
</property>
<property name="maximum">
<number>50</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="SliderPanUD">
<property name="minimum">
<number>-50</number>
</property>
<property name="maximum">
<number>50</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="SliderZoom">
<property name="minimum">
<number>-50</number>
</property>
<property name="maximum">
<number>50</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="SliderTilt">
<property name="minimum">
<number>-50</number>
</property>
<property name="maximum">
<number>50</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="SliderRoll">
<property name="minimum">
<number>-50</number>
</property>
<property name="maximum">
<number>50</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="SliderSpin">
<property name="minimum">
<number>-50</number>
</property>
<property name="maximum">
<number>50</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="pageStep">
<number>1</number>
</property>
<property name="value">
<number>0</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="tickPosition">
<enum>QSlider::TicksBelow</enum>
</property>
<property name="tickInterval">
<number>10</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
<include location="Icons/resource.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -525,7 +525,7 @@ DlgCustomizeSpaceball::DlgCustomizeSpaceball(QWidget *parent)
: CustomizeActionPage(parent), buttonView(0), buttonModel(0),
commandView(0), commandModel(0), clearButton(0), printReference(0)
{
this->setWindowTitle(tr("Spaceball"));
this->setWindowTitle(tr("Spaceball Buttons"));
GUIApplicationNativeEventAware *app = qobject_cast<GUIApplicationNativeEventAware *>(QApplication::instance());
if (!app)
return;
@ -555,7 +555,11 @@ void DlgCustomizeSpaceball::setMessage(const QString& message)
{
QLabel *messageLabel = new QLabel(message,this);
QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(messageLabel);
QHBoxLayout *layout2 = new QHBoxLayout();
layout2->addStretch();
layout2->addWidget(messageLabel);
layout2->addStretch();
layout->addItem(layout2);
this->setLayout(layout);
}

View File

@ -66,10 +66,14 @@ void DlgSettingsViewColor::saveSettings()
checkBoxSelection->onSave();
HighlightColor->onSave();
SelectionColor->onSave();
CursorTextColor->onSave();
EditedEdgeColor->onSave();
EditedVertexColor->onSave();
ConstructionColor->onSave();
FullyConstrainedColor->onSave();
DefaultShapeColor->onSave();
DefaultShapeLineColor->onSave();
DefaultShapeLineWidth->onSave();
}
void DlgSettingsViewColor::loadSettings()
@ -85,10 +89,14 @@ void DlgSettingsViewColor::loadSettings()
checkBoxSelection->onRestore();
HighlightColor->onRestore();
SelectionColor->onRestore();
CursorTextColor->onRestore();
EditedEdgeColor->onRestore();
EditedVertexColor->onRestore();
ConstructionColor->onRestore();
FullyConstrainedColor->onRestore();
DefaultShapeColor->onRestore();
DefaultShapeLineColor->onRestore();
DefaultShapeLineWidth->onRestore();
}
/**

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>601</width>
<height>407</height>
<height>445</height>
</rect>
</property>
<property name="windowTitle">
@ -361,7 +361,20 @@
<string>Default colors</string>
</property>
<layout class="QGridLayout" name="colgridLayout">
<item row="0" column="0">
<item row="2" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0">
<layout class="QGridLayout" name="_2">
<property name="margin">
<number>0</number>
@ -369,7 +382,7 @@
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="0">
<item row="1" column="0">
<widget class="QLabel" name="label">
<property name="minimumSize">
<size>
@ -382,28 +395,28 @@
</property>
</widget>
</item>
<item row="1" column="0">
<item row="2" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Edited vertex color</string>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Construction geometry</string>
</property>
</widget>
</item>
<item row="3" column="0">
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Fully constrained geometry</string>
</property>
</widget>
</item>
<item row="2" column="1">
<item row="3" column="1">
<widget class="Gui::PrefColorButton" name="ConstructionColor">
<property name="toolTip">
<string>The color of construction geometry in edit mode</string>
@ -423,7 +436,7 @@
</property>
</widget>
</item>
<item row="3" column="1">
<item row="4" column="1">
<widget class="Gui::PrefColorButton" name="FullyConstrainedColor">
<property name="toolTip">
<string>The color of fully constrained geometry in edit mode</string>
@ -443,7 +456,7 @@
</property>
</widget>
</item>
<item row="1" column="1">
<item row="2" column="1">
<widget class="Gui::PrefColorButton" name="EditedVertexColor">
<property name="toolTip">
<string>The color of vertices being edited</string>
@ -463,7 +476,7 @@
</property>
</widget>
</item>
<item row="0" column="1">
<item row="1" column="1">
<widget class="Gui::PrefColorButton" name="EditedEdgeColor">
<property name="toolTip">
<string>The color of edges being edited</string>
@ -483,20 +496,124 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Cursor text color</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="Gui::PrefColorButton" name="CursorTextColor">
<property name="color">
<color>
<red>0</red>
<green>0</green>
<blue>255</blue>
</color>
</property>
<property name="prefEntry" stdset="0">
<cstring>CursorTextColor</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>View</cstring>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
<item row="0" column="0">
<layout class="QGridLayout" name="_1">
<item row="0" column="0">
<widget class="QLabel" name="label_6">
<property name="minimumSize">
<size>
<width>240</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Default shape color</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="Gui::PrefColorButton" name="DefaultShapeColor">
<property name="toolTip">
<string>The default color for new shapes</string>
</property>
<property name="color">
<color>
<red>204</red>
<green>204</green>
<blue>204</blue>
</color>
</property>
<property name="prefEntry" stdset="0">
<cstring>DefaultShapeColor</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>View</cstring>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<layout class="QGridLayout" name="_5">
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<property name="minimumSize">
<size>
<width>182</width>
<height>0</height>
</size>
</property>
<property name="text">
<string>Default line width and color</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="Gui::PrefColorButton" name="DefaultShapeLineColor">
<property name="toolTip">
<string>The default line color for new shapes</string>
</property>
<property name="color">
<color>
<red>25</red>
<green>25</green>
<blue>25</blue>
</color>
</property>
<property name="prefEntry" stdset="0">
<cstring>DefaultShapeLineColor</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>View</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="Gui::PrefSpinBox" name="DefaultShapeLineWidth">
<property name="toolTip">
<string>The default line thickness for new shapes</string>
</property>
<property name="suffix">
<string>px</string>
</property>
<property name="value">
<number>2</number>
</property>
<property name="prefEntry" stdset="0">
<cstring>DefaultShapeLineWidth</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>View</cstring>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
@ -509,6 +626,11 @@
<extends>QPushButton</extends>
<header>Gui/Widgets.h</header>
</customwidget>
<customwidget>
<class>Gui::PrefSpinBox</class>
<extends>QSpinBox</extends>
<header>Gui/PrefWidgets.h</header>
</customwidget>
<customwidget>
<class>Gui::PrefColorButton</class>
<extends>Gui::ColorButton</extends>
@ -530,6 +652,11 @@
<tabstop>checkBoxSelection</tabstop>
<tabstop>HighlightColor</tabstop>
<tabstop>SelectionColor</tabstop>
<tabstop>CursorTextColor</tabstop>
<tabstop>EditedEdgeColor</tabstop>
<tabstop>EditedVertexColor</tabstop>
<tabstop>ConstructionColor</tabstop>
<tabstop>FullyConstrainedColor</tabstop>
<tabstop>radioButtonSimple</tabstop>
<tabstop>radioButtonGradient</tabstop>
<tabstop>checkMidColor</tabstop>

View File

@ -187,6 +187,9 @@ bool Document::setEdit(Gui::ViewProvider* p, int ModNum)
View3DInventor *activeView = dynamic_cast<View3DInventor *>(getActiveView());
if (activeView && activeView->getViewer()->setEditingViewProvider(p,ModNum)) {
d->_pcInEdit = p;
Gui::TaskView::TaskDialog* dlg = Gui::Control().activeDialog();
if (dlg)
dlg->setDocumentName(this->getDocument()->getName());
if (d->_pcInEdit->isDerivedFrom(ViewProviderDocumentObject::getClassTypeId()))
signalInEdit(*(static_cast<ViewProviderDocumentObject*>(d->_pcInEdit)));
}

View File

@ -32,6 +32,7 @@
#include <Base/Console.h>
#include "GuiApplicationNativeEventAware.h"
#include "SpaceballEvent.h"
#include "Application.h"
//linux dependency libspnav-dev
#ifdef Q_WS_X11
@ -128,6 +129,184 @@ bool Gui::GUIApplicationNativeEventAware::processSpaceballEvent(QObject *object,
return true;
}
float Gui::GUIApplicationNativeEventAware::convertPrefToSensitivity(int value)
{
if (value < 0)
{
return ((0.9/50)*float(value) + 1);
}
else
{
return ((2.5/50)*float(value) + 1);
}
}
// This function modifies motionDataArray to be OS independent
// on some OSes these axes are inverted, and some are switched - this method sets them up like this:
// motionDataArray[0] - pan Left - Right with mouse - pan Left(Left) - Right(Left) on screen
// motionDataArray[1] - pan Front - Back with mouse - pan Up(Front) - Down(Back) on screen
// motionDataArray[2] - pan Up - Down with mouse - zoom In(Up) - Out(Down) on screen
// motionDataArray[3] - lean mouse Left-Right - rotate around Vertical axis on screen
// motionDataArray[4] - lean mouse Front - Back - rotate around Horizointal axis on screen on screen
// motionDataArray[5] - Spin mouse - rotate around "Zoom" axis on screen
bool Gui::GUIApplicationNativeEventAware::setOSIndependentMotionData()
{
#ifdef SPNAV_FOUND
int temp;
motionDataArray[0] = -motionDataArray[0];
motionDataArray[3] = -motionDataArray[3];
temp = motionDataArray[1];
motionDataArray[1] = -motionDataArray[2];
motionDataArray[2] = -temp;
temp = motionDataArray[4];
motionDataArray[4] = -motionDataArray[5];
motionDataArray[5] = -temp;
#elif _USE_3DCONNEXION_SDK
motionDataArray[0] = -motionDataArray[0];
motionDataArray[3] = -motionDataArray[3];
#else
return false;
#endif
return true;
}
void Gui::GUIApplicationNativeEventAware::importSettings()
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().GetGroup("BaseApp")->GetGroup("Spaceball")->GetGroup("Motion");
// here I import settings from a dialog. For now they are set as is
bool dominant = group->GetBool("Dominant"); // Is dominant checked
bool flipXY = group->GetBool("FlipYZ");; // Is Flip X/Y checked
float generalSensitivity = convertPrefToSensitivity(group->GetInt("GlobalSensitivity"));
// array that has stored info about "Enabled" checkboxes of all axes
bool enabled[6];
enabled[0] = group->GetBool("Translations", true) && group->GetBool("PanLREnable", true);
enabled[1] = group->GetBool("Translations", true) && group->GetBool("PanUDEnable", true);
enabled[2] = group->GetBool("Translations", true) && group->GetBool("ZoomEnable", true);
enabled[3] = group->GetBool("Rotations", true) && group->GetBool("TiltEnable", true);
enabled[4] = group->GetBool("Rotations", true) && group->GetBool("RollEnable", true);
enabled[5] = group->GetBool("Rotations", true) && group->GetBool("SpinEnable", true);
// array that has stored info about "Reversed" checkboxes of all axes
bool reversed[6];
reversed[0] = group->GetBool("PanLRReverse");
reversed[1] = group->GetBool("PanUDReverse");
reversed[2] = group->GetBool("ZoomReverse");
reversed[3] = group->GetBool("TiltReverse");
reversed[4] = group->GetBool("RollReverse");
reversed[5] = group->GetBool("SpinReverse");
// array that has stored info about sliders - on each slider you need to use method DlgSpaceballSettings::GetValuefromSlider
// which will convert <-50, 50> linear integers from slider to <0.1, 10> exponential floating values
float sensitivity[6];
sensitivity[0] = convertPrefToSensitivity(group->GetInt("PanLRSensitivity"));
sensitivity[1] = convertPrefToSensitivity(group->GetInt("PanUDSensitivity"));
sensitivity[2] = convertPrefToSensitivity(group->GetInt("ZoomSensitivity"));
sensitivity[3] = convertPrefToSensitivity(group->GetInt("TiltSensitivity"));
sensitivity[4] = convertPrefToSensitivity(group->GetInt("RollSensitivity"));
sensitivity[5] = convertPrefToSensitivity(group->GetInt("SpinSensitivity"));
if (group->GetBool("Calibrate"))
{
group->SetInt("CalibrationX",motionDataArray[0]);
group->SetInt("CalibrationY",motionDataArray[1]);
group->SetInt("CalibrationZ",motionDataArray[2]);
group->SetInt("CalibrationXr",motionDataArray[3]);
group->SetInt("CalibrationYr",motionDataArray[4]);
group->SetInt("CalibrationZr",motionDataArray[5]);
group->RemoveBool("Calibrate");
return;
}
else
{
motionDataArray[0] = motionDataArray[0] - group->GetInt("CalibrationX");
motionDataArray[1] = motionDataArray[1] - group->GetInt("CalibrationY");
motionDataArray[2] = motionDataArray[2] - group->GetInt("CalibrationZ");
motionDataArray[3] = motionDataArray[3] - group->GetInt("CalibrationXr");
motionDataArray[4] = motionDataArray[4] - group->GetInt("CalibrationYr");
motionDataArray[5] = motionDataArray[5] - group->GetInt("CalibrationZr");
}
int i;
if (flipXY) {
bool tempBool;
float tempFloat;
tempBool = enabled[1];
enabled[1] = enabled[2];
enabled[2] = tempBool;
tempBool = enabled[4];
enabled[4] = enabled[5];
enabled[5] = tempBool;
tempBool = reversed[1];
reversed[1] = reversed[2];
reversed[2] = tempBool;
tempBool = reversed[4];
reversed[4] = reversed[5];
reversed[5] = tempBool;
tempFloat = sensitivity[1];
sensitivity[1] = sensitivity[2];
sensitivity[2] = tempFloat;
tempFloat = sensitivity[4];
sensitivity[4] = sensitivity[5];
sensitivity[5] = tempFloat;
i = motionDataArray[1];
motionDataArray[1] = motionDataArray[2];
motionDataArray[2] = - i;
i = motionDataArray[4];
motionDataArray[4] = motionDataArray[5];
motionDataArray[5] = - i;
}
if (dominant) { // if dominant is checked
int max = 0;
bool flag = false;
for (i = 0; i < 6; ++i) {
if (abs(motionDataArray[i]) > abs(max)) max = motionDataArray[i];
}
for (i = 0; i < 6; ++i) {
if ((motionDataArray[i] != max) || (flag)) {
motionDataArray[i] = 0;
} else if (motionDataArray[i] == max) {
flag = true;
}
}
}
for (i = 0; i < 6; ++i) {
if (motionDataArray[i] != 0) {
if (enabled[i] == false)
motionDataArray[i] = 0;
else {
if (reversed[i] == true)
motionDataArray[i] = - motionDataArray[i];
motionDataArray[i] = (int)((float)(motionDataArray[i]) * sensitivity[i] * generalSensitivity);
}
}
}
}
#ifdef Q_WS_X11
bool Gui::GUIApplicationNativeEventAware::x11EventFilter(XEvent *event)
{
@ -142,9 +321,21 @@ bool Gui::GUIApplicationNativeEventAware::x11EventFilter(XEvent *event)
if (navEvent.type == SPNAV_EVENT_MOTION)
{
motionDataArray[0] = navEvent.motion.x;
motionDataArray[1] = navEvent.motion.y;
motionDataArray[2] = navEvent.motion.z;
motionDataArray[3] = navEvent.motion.rx;
motionDataArray[4] = navEvent.motion.ry;
motionDataArray[5] = navEvent.motion.rz;
if (!setOSIndependentMotionData()) return false;
importSettings();
Spaceball::MotionEvent *motionEvent = new Spaceball::MotionEvent();
motionEvent->setTranslations(navEvent.motion.x, navEvent.motion.y, navEvent.motion.z);
motionEvent->setRotations(navEvent.motion.rx, navEvent.motion.ry, navEvent.motion.rz);
motionEvent->setTranslations(motionDataArray[0], motionDataArray[1], motionDataArray[2]);
motionEvent->setRotations(motionDataArray[3], motionDataArray[4], motionDataArray[5]);
this->postEvent(currentWidget, motionEvent);
return true;
}

View File

@ -36,7 +36,7 @@ class QMainWindow;
#include <vector>
#include <map>
// #define _WIN32_WINNT 0x0501 //target at least windows XP
//#define _WIN32_WINNT 0x0501 //target at least windows XP
#include <Windows.h>
@ -56,6 +56,10 @@ namespace Gui
private:
bool spaceballPresent;
QMainWindow *mainWindow;
int motionDataArray[6];
bool setOSIndependentMotionData();
void importSettings();
float convertPrefToSensitivity(int value);
// For X11
#ifdef Q_WS_X11

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 145 KiB

View File

@ -78,5 +78,11 @@
<file>Tree_Dimension.svg</file>
<file>Tree_Python.svg</file>
<file>spaceball_button.svg</file>
<file>SpNav-PanLR.png</file>
<file>SpNav-PanUD.png</file>
<file>SpNav-Roll.png</file>
<file>SpNav-Spin.png</file>
<file>SpNav-Tilt.png</file>
<file>SpNav-Zoom.png</file>
</qresource>
</RCC>

View File

@ -63,6 +63,44 @@
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::ActionSelector</name>
<message>
<source>Available:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Selected:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Move up</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Move down</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::AlignmentView</name>
<message>
<source>Movable object</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed object</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::BlenderNavigationStyle</name>
<message>
@ -160,6 +198,10 @@
<source>License...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy to clipboard</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::ButtonModel</name>
@ -708,10 +750,6 @@ Please define another shortcut.</source>
<source>Viewing mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Display mode:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Plot mode:</source>
<translation type="unfinished"></translation>
@ -736,6 +774,10 @@ Please define another shortcut.</source>
<source>Color plot:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Document window:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::DlgEditorSettings</name>
@ -1482,6 +1524,14 @@ Specify another directory, please.</source>
<source>Invert zoom</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Zoom at cursor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Zoom step</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::DlgSettings3DViewImp</name>
@ -1722,6 +1772,10 @@ Specify another directory, please.</source>
<source>Items</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Current line highlight</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::DlgSettingsImage</name>
@ -1956,6 +2010,14 @@ Specify another directory, please.</source>
<source>Macro path</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>General macro settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Run macros in local environment</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::DlgSettingsUnits</name>
@ -2046,14 +2108,6 @@ Specify another directory, please.</source>
<source>Fully constrained geometry</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The color of construction geometry in editmode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The color of fully constrained geometry in editmode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The color of vertices being edited</source>
<translation type="unfinished"></translation>
@ -2062,6 +2116,42 @@ Specify another directory, please.</source>
<source>The color of edges being edited</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The color of construction geometry in edit mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The color of fully constrained geometry in edit mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cursor text color</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Default shape color</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The default color for new shapes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Default line width and color</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The default line color for new shapes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The default line thickness for new shapes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>px</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::DlgTipOfTheDay</name>
@ -2124,7 +2214,39 @@ Specify another directory, please.</source>
<context>
<name>Gui::Dialog::DownloadDialog</name>
<message>
<source>Canceled.</source>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Close</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>There already exists a file called %1 in the current directory. Overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to save the file %1: %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download failed: %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloaded %1 to current directory.</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -2162,6 +2284,13 @@ Specify another directory, please.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::LicenseDialog</name>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::MouseButtons</name>
<message>
@ -2847,6 +2976,25 @@ Do you want to save your changes?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::LocationWidget</name>
<message>
<source>X:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Y:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Z:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Direction:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::MacroCommand</name>
<message>
@ -2877,6 +3025,88 @@ Do you want to save your changes?</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::ManualAlignment</name>
<message>
<source>Manual alignment</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The alignment is already in progress.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Alignment[*]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please, select at least one point in the left and the right view</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please, select at least %1 points in the left and the right view</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please pick points in the left and right view</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The alignment has finished</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The alignment has been canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Too few points picked in the left view. At least %1 points are needed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Too few points picked in the right view. At least %1 points are needed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Different number of points picked in left and right view.
On the left view %1 points are picked,
on the right view %2 points are picked.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Try to align group of views</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The alignment failed.
How do you want to proceed?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ignore</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Abort</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Different number of points picked in left and right view. On the left view %1 points are picked, on the right view %2 points are picked.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Point picked at (%1,%2,%3)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No point was picked</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::NetworkRetriever</name>
<message>
@ -3020,6 +3250,10 @@ Do you want to exit without saving your data?</source>
<source>Select All</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Clear console</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::PythonEditor</name>
@ -3158,10 +3392,6 @@ Do you want to specify another directory?</source>
</context>
<context>
<name>Gui::TaskView::TaskAppearance</name>
<message>
<source>Display mode:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Plot mode:</source>
<translation type="unfinished"></translation>
@ -3182,6 +3412,10 @@ Do you want to specify another directory?</source>
<source>Appearance</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Document window:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::TaskView::TaskEditControl</name>
@ -3206,9 +3440,21 @@ Do you want to specify another directory?</source>
</message>
</context>
<context>
<name>Gui::Translator</name>
<name>Gui::TouchpadNavigationStyle</name>
<message>
<source>English</source>
<source>Press left mouse button</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Press SHIFT button</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Press ALT button</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Press PgUp/PgDown button</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -3464,14 +3710,6 @@ Do you want to specify another directory?</source>
<source>A general error occurred while loading the workbench</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>File not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cannot open file %1</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Save views...</source>
<translation type="unfinished"></translation>
@ -3769,6 +4007,17 @@ You either have to finish or cancel the editing in the task panel.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdBoxSelection</name>
<message>
<source>Standard-View</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Box selection</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdAbout</name>
<message>
@ -3829,6 +4078,21 @@ You either have to finish or cancel the editing in the task panel.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdAlignment</name>
<message>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Alignment...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Align the selected objects</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdArrangeIcons</name>
<message>
@ -3945,21 +4209,6 @@ You either have to finish or cancel the editing in the task panel.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdDDuplicateSelection</name>
<message>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Duplicate selection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Put duplicates of the selected objects to the active document</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdDelete</name>
<message>
@ -4106,6 +4355,40 @@ You either have to finish or cancel the editing in the task panel.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdDuplicateSelection</name>
<message>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Duplicate selection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Put duplicates of the selected objects to the active document</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdEdit</name>
<message>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggle &amp;Edit mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggles the selected object&apos;s edit mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enters or leaves the selected object&apos;s edit mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdExport</name>
<message>
@ -4121,7 +4404,26 @@ You either have to finish or cancel the editing in the task panel.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Supported formats</source>
<source>No selection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please select first the objects you want to export.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdExportGraphviz</name>
<message>
<source>Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Dependency graph...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show the dependency graph of the objects in the active document</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -4297,11 +4599,11 @@ You either have to finish or cancel the editing in the task panel.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Mesure distance</source>
<source>Measures distance between two selected objects</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Measures distance between two selected objects</source>
<source>Measure distance</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -4354,21 +4656,6 @@ You either have to finish or cancel the editing in the task panel.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdOnlineHelpPython</name>
<message>
<source>Help</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Python Manuals</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show the Python documentation</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdOnlineHelpWebsite</name>
<message>
@ -5183,6 +5470,36 @@ You either have to finish or cancel the editing in the task panel.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdViewRotateLeft</name>
<message>
<source>Standard-View</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rotate Left</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rotate the view by 90° counter-clockwise</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdViewRotateRight</name>
<message>
<source>Standard-View</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rotate Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rotate the view by 90° clockwise</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdViewTop</name>
<message>
@ -5366,6 +5683,34 @@ You either have to finish or cancel the editing in the task panel.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Std_ExportGraphviz</name>
<message>
<source>Graphviz not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Graphviz couldn&apos;t be found on your system.
Do you want to specify its installation path if it&apos;s already installed?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Graphviz installation path</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Dependency graph</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Graphviz failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Graphviz failed to create an image file</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Workbench</name>
<message>

File diff suppressed because it is too large Load Diff

View File

@ -23,35 +23,35 @@
<source>Angle Snap</source>
<translation>Einrastwinkel</translation>
</message>
<message>
<message utf8="true">
<source>1 °</source>
<translation>1 °</translation>
</message>
<message>
<message utf8="true">
<source>2 °</source>
<translation>2 °</translation>
</message>
<message>
<message utf8="true">
<source>5 °</source>
<translation>5 °</translation>
</message>
<message>
<message utf8="true">
<source>10 °</source>
<translation>10 °</translation>
</message>
<message>
<message utf8="true">
<source>20 °</source>
<translation>20 °</translation>
</message>
<message>
<message utf8="true">
<source>45 °</source>
<translation>45 °</translation>
</message>
<message>
<message utf8="true">
<source>90 °</source>
<translation>90 °</translation>
</message>
<message>
<message utf8="true">
<source>180 °</source>
<translation>180 °</translation>
</message>
@ -63,6 +63,44 @@
<translation>kein</translation>
</message>
</context>
<context>
<name>Gui::ActionSelector</name>
<message>
<source>Available:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Selected:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add</source>
<translation type="unfinished">Hinzufügen</translation>
</message>
<message>
<source>Remove</source>
<translation type="unfinished">Entfernen</translation>
</message>
<message>
<source>Move up</source>
<translation type="unfinished">Noch oben verschieben</translation>
</message>
<message>
<source>Move down</source>
<translation type="unfinished">Nache unten verschieben</translation>
</message>
</context>
<context>
<name>Gui::AlignmentView</name>
<message>
<source>Movable object</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Fixed object</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::BlenderNavigationStyle</name>
<message>
@ -160,6 +198,10 @@
<source>License...</source>
<translation>Lizenz...</translation>
</message>
<message>
<source>Copy to clipboard</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::ButtonModel</name>
@ -213,11 +255,11 @@
<source>Angle</source>
<translation>Winkel</translation>
</message>
<message>
<message utf8="true">
<source>90°</source>
<translation>90°</translation>
</message>
<message>
<message utf8="true">
<source>-90°</source>
<translation>-90 °</translation>
</message>
@ -711,7 +753,7 @@ Wählen Sie bitte eine andere Tastenkombination.</translation>
</message>
<message>
<source>Display mode:</source>
<translation>Anzeigemodus:</translation>
<translation type="obsolete">Anzeigemodus:</translation>
</message>
<message>
<source>Plot mode:</source>
@ -737,6 +779,10 @@ Wählen Sie bitte eine andere Tastenkombination.</translation>
<source>Color plot:</source>
<translation>Farb-Plot:</translation>
</message>
<message>
<source>Document window:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::DlgEditorSettings</name>
@ -1486,6 +1532,14 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
<source>Invert zoom</source>
<translation>Zoom umkehren</translation>
</message>
<message>
<source>Zoom at cursor</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Zoom step</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::DlgSettings3DViewImp</name>
@ -1727,6 +1781,10 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
<source>Items</source>
<translation>Elemente</translation>
</message>
<message>
<source>Current line highlight</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::DlgSettingsImage</name>
@ -1850,11 +1908,11 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
<source>QSXGA 2560 x 2048</source>
<translation>QSXGA 2560 x 2024</translation>
</message>
<message>
<message utf8="true">
<source>QUXGA 3200 × 2400</source>
<translation>QUXGA 3200 x 2400</translation>
</message>
<message>
<message utf8="true">
<source>HUXGA 6400 × 4800</source>
<translation>HUXGA 6400 x 4800</translation>
</message>
@ -1961,6 +2019,14 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
<source>Macro path</source>
<translation>Makro-Zielpfad</translation>
</message>
<message>
<source>General macro settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Run macros in local environment</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::DlgSettingsUnits</name>
@ -2053,11 +2119,11 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
</message>
<message>
<source>The color of construction geometry in editmode</source>
<translation>Die Farbe der Konstruktionsgeometrien im Editier-Modus</translation>
<translation type="obsolete">Die Farbe der Konstruktionsgeometrien im Editier-Modus</translation>
</message>
<message>
<source>The color of fully constrained geometry in editmode</source>
<translation>Die Farbe der komplett festgelegten Geometrien im Editier-Modus</translation>
<translation type="obsolete">Die Farbe der komplett festgelegten Geometrien im Editier-Modus</translation>
</message>
<message>
<source>The color of vertices being edited</source>
@ -2067,6 +2133,42 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
<source>The color of edges being edited</source>
<translation>Die Farbe der zu bearbeitenden Kanten</translation>
</message>
<message>
<source>The color of construction geometry in edit mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The color of fully constrained geometry in edit mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cursor text color</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Default shape color</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The default color for new shapes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Default line width and color</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The default line color for new shapes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The default line thickness for new shapes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>px</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::DlgTipOfTheDay</name>
@ -2131,7 +2233,43 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
<name>Gui::Dialog::DownloadDialog</name>
<message>
<source>Canceled.</source>
<translation>Abgebrochen.</translation>
<translation type="obsolete">Abgebrochen.</translation>
</message>
<message>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Cancel</source>
<translation type="unfinished">Abbrechen</translation>
</message>
<message>
<source>Close</source>
<translation type="unfinished">Schließen</translation>
</message>
<message>
<source>There already exists a file called %1 in the current directory. Overwrite?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Unable to save the file %1: %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Downloading %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download canceled.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Download failed: %1.</source>
<translation type="unfinished">Download fehlgeschlagen: %1.</translation>
</message>
<message>
<source>Downloaded %1 to current directory.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -2168,6 +2306,13 @@ Wählen Sie bitte ein anderes Verzeichnis aus.</translation>
<translation>OK</translation>
</message>
</context>
<context>
<name>Gui::Dialog::LicenseDialog</name>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Dialog::MouseButtons</name>
<message>
@ -2856,6 +3001,25 @@ Sollen die Änderungen gespeichert werden?</translation>
<translation>Benutzerdefiniert...</translation>
</message>
</context>
<context>
<name>Gui::LocationWidget</name>
<message>
<source>X:</source>
<translation type="unfinished">X:</translation>
</message>
<message>
<source>Y:</source>
<translation type="unfinished">Y:</translation>
</message>
<message>
<source>Z:</source>
<translation type="unfinished">Z:</translation>
</message>
<message>
<source>Direction:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::MacroCommand</name>
<message>
@ -2886,6 +3050,88 @@ Sollen die Änderungen gespeichert werden?</translation>
<translation>Alles schließen</translation>
</message>
</context>
<context>
<name>Gui::ManualAlignment</name>
<message>
<source>Manual alignment</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The alignment is already in progress.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Alignment[*]</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please, select at least one point in the left and the right view</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please, select at least %1 points in the left and the right view</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please pick points in the left and right view</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The alignment has finished</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The alignment has been canceled</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Too few points picked in the left view. At least %1 points are needed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Too few points picked in the right view. At least %1 points are needed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Different number of points picked in left and right view.
On the left view %1 points are picked,
on the right view %2 points are picked.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Try to align group of views</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The alignment failed.
How do you want to proceed?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Retry</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Ignore</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Abort</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Different number of points picked in left and right view. On the left view %1 points are picked, on the right view %2 points are picked.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Point picked at (%1,%2,%3)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No point was picked</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::NetworkRetriever</name>
<message>
@ -3031,6 +3277,10 @@ Wollen Sie sie beenden, ohne Ihre Daten zu speichern?</translation>
<source>Select All</source>
<translation>Alles auswählen</translation>
</message>
<message>
<source>Clear console</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::PythonEditor</name>
@ -3175,7 +3425,7 @@ Möchten Sie ein anderes Verzeichnis angeben?</translation>
<name>Gui::TaskView::TaskAppearance</name>
<message>
<source>Display mode:</source>
<translation>Anzeigemodus:</translation>
<translation type="obsolete">Anzeigemodus:</translation>
</message>
<message>
<source>Plot mode:</source>
@ -3197,6 +3447,10 @@ Möchten Sie ein anderes Verzeichnis angeben?</translation>
<source>Appearance</source>
<translation>Erscheinungsbild</translation>
</message>
<message>
<source>Document window:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::TaskView::TaskEditControl</name>
@ -3220,11 +3474,30 @@ Möchten Sie ein anderes Verzeichnis angeben?</translation>
<translation>Selektion bearbeiten</translation>
</message>
</context>
<context>
<name>Gui::TouchpadNavigationStyle</name>
<message>
<source>Press left mouse button</source>
<translation type="unfinished">Drücken Sie die linke Maustaste</translation>
</message>
<message>
<source>Press SHIFT button</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Press ALT button</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Press PgUp/PgDown button</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Gui::Translator</name>
<message>
<source>English</source>
<translation>Englisch</translation>
<translation type="obsolete">Englisch</translation>
</message>
</context>
<context>
@ -3481,11 +3754,11 @@ Möchten Sie ein anderes Verzeichnis angeben?</translation>
</message>
<message>
<source>File not found</source>
<translation>Datei nicht gefunden</translation>
<translation type="obsolete">Datei nicht gefunden</translation>
</message>
<message>
<source>Cannot open file %1</source>
<translation>Kann Datei %1 nicht öffnen</translation>
<translation type="obsolete">Kann Datei %1 nicht öffnen</translation>
</message>
<message>
<source>Save views...</source>
@ -3792,6 +4065,17 @@ You either have to finish or cancel the editing in the task panel.</source>
Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufgabenfensters abbrechen.</translation>
</message>
</context>
<context>
<name>StdBoxSelection</name>
<message>
<source>Standard-View</source>
<translation type="unfinished">Standardansicht</translation>
</message>
<message>
<source>Box selection</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdAbout</name>
<message>
@ -3852,6 +4136,21 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
<translation>Vorheriges Fenster aktivieren</translation>
</message>
</context>
<context>
<name>StdCmdAlignment</name>
<message>
<source>Edit</source>
<translation type="unfinished">Bearbeiten</translation>
</message>
<message>
<source>Alignment...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Align the selected objects</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdArrangeIcons</name>
<message>
@ -3972,15 +4271,15 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
<name>StdCmdDDuplicateSelection</name>
<message>
<source>Edit</source>
<translation>Bearbeiten</translation>
<translation type="obsolete">Bearbeiten</translation>
</message>
<message>
<source>Duplicate selection</source>
<translation>Auswahl duplizieren</translation>
<translation type="obsolete">Auswahl duplizieren</translation>
</message>
<message>
<source>Put duplicates of the selected objects to the active document</source>
<translation>Duplikate der selektierten Objekte in aktives Dokument einfügen</translation>
<translation type="obsolete">Duplikate der selektierten Objekte in aktives Dokument einfügen</translation>
</message>
</context>
<context>
@ -4129,6 +4428,40 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
<translation>Zeichenstil</translation>
</message>
</context>
<context>
<name>StdCmdDuplicateSelection</name>
<message>
<source>Edit</source>
<translation type="unfinished">Bearbeiten</translation>
</message>
<message>
<source>Duplicate selection</source>
<translation type="unfinished">Auswahl duplizieren</translation>
</message>
<message>
<source>Put duplicates of the selected objects to the active document</source>
<translation type="unfinished">Duplikate der selektierten Objekte in aktives Dokument einfügen</translation>
</message>
</context>
<context>
<name>StdCmdEdit</name>
<message>
<source>Edit</source>
<translation type="unfinished">Bearbeiten</translation>
</message>
<message>
<source>Toggle &amp;Edit mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Toggles the selected object&apos;s edit mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Enters or leaves the selected object&apos;s edit mode</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdExport</name>
<message>
@ -4145,7 +4478,30 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
</message>
<message>
<source>Supported formats</source>
<translation>Unterstützte Formate</translation>
<translation type="obsolete">Unterstützte Formate</translation>
</message>
<message>
<source>No selection</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please select first the objects you want to export.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdExportGraphviz</name>
<message>
<source>Tools</source>
<translation type="unfinished">Werkzeuge</translation>
</message>
<message>
<source>Dependency graph...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Show the dependency graph of the objects in the active document</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
@ -4321,12 +4677,16 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
</message>
<message>
<source>Mesure distance</source>
<translation>Abstand messen</translation>
<translation type="obsolete">Abstand messen</translation>
</message>
<message>
<source>Measures distance between two selected objects</source>
<translation>Misst die Distanz zwischen zwei ausgewählten Objekten</translation>
</message>
<message>
<source>Measure distance</source>
<translation type="unfinished">Abstand messen</translation>
</message>
</context>
<context>
<name>StdCmdMergeProjects</name>
@ -4381,15 +4741,15 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
<name>StdCmdOnlineHelpPython</name>
<message>
<source>Help</source>
<translation>Hilfe</translation>
<translation type="obsolete">Hilfe</translation>
</message>
<message>
<source>Python Manuals</source>
<translation>Python-Handbuch</translation>
<translation type="obsolete">Python-Handbuch</translation>
</message>
<message>
<source>Show the Python documentation</source>
<translation>Python-Dokumentation anzeigen</translation>
<translation type="obsolete">Python-Dokumentation anzeigen</translation>
</message>
</context>
<context>
@ -5206,6 +5566,36 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
<translation>Rechtsansicht</translation>
</message>
</context>
<context>
<name>StdCmdViewRotateLeft</name>
<message>
<source>Standard-View</source>
<translation type="unfinished">Standardansicht</translation>
</message>
<message>
<source>Rotate Left</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rotate the view by 90° counter-clockwise</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdViewRotateRight</name>
<message>
<source>Standard-View</source>
<translation type="unfinished">Standardansicht</translation>
</message>
<message>
<source>Rotate Right</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Rotate the view by 90° clockwise</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>StdCmdViewTop</name>
<message>
@ -5389,6 +5779,34 @@ Sie müssen entweder den Bearbeitungsvorgang fertigstellen oder mittels des Aufg
<translation>Drahtgitter-Modus</translation>
</message>
</context>
<context>
<name>Std_ExportGraphviz</name>
<message>
<source>Graphviz not found</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Graphviz couldn&apos;t be found on your system.
Do you want to specify its installation path if it&apos;s already installed?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Graphviz installation path</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Dependency graph</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Graphviz failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Graphviz failed to create an image file</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Workbench</name>
<message>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -233,7 +233,7 @@ void MacroManager::run(MacroType eType,const char *sName)
Base::Interpreter().runFile(sName, this->localEnv);
}
catch (const Base::SystemExitException&) {
qApp->quit();
throw;
}
catch (const Base::PyException& e) {
Base::Console().Error("%s%s: %s\n",

View File

@ -1157,8 +1157,7 @@ void MainWindow::delayedStartup()
App::Application::processCmdLineFiles();
}
catch (const Base::SystemExitException&) {
QApplication::quit();
return;
throw;
}
const std::map<std::string,std::string>& cfg = App::Application::Config();

View File

@ -345,11 +345,24 @@ int PolyPickerSelection::mouseButtonEvent( const SoMouseButtonEvent * const e, c
m_iXnew = pos.x(); m_iYnew = pos.y();
m_iXold = pos.x(); m_iYold = pos.y();
}
} break;
default:
{
} break;
}
}
// release
else {
switch (button)
{
case SoMouseButtonEvent::BUTTON2:
{
QCursor cur = _pcView3D->getWidget()->cursor();
_pcView3D->getWidget()->setCursor(m_cPrevCursor);
// _pcView3D->getGLWidget()->releaseMouse();
// The pop-up menu should be shown when releasing mouse button because
// otherwise the navigation style doesn't get the UP event and gets into
// an inconsistent state.
int id = popupMenu();
if (id == Finish || id == Cancel) {
releaseMouseModel();

View File

@ -442,13 +442,8 @@ void PythonConsole::OnChange( Base::Subject<const char*> &rCaller,const char* sR
void PythonConsole::keyPressEvent(QKeyEvent * e)
{
bool restartHistory = true;
QTextCursor cursor = this->textCursor();
// construct reference cursor at begin of input line ...
QTextCursor inputLineBegin = cursor;
inputLineBegin.movePosition( QTextCursor::End );
inputLineBegin.movePosition( QTextCursor::StartOfLine );
inputLineBegin.movePosition( QTextCursor::Right, QTextCursor::MoveAnchor, promptLength );
QTextCursor cursor = this->textCursor();
QTextCursor inputLineBegin = this->inputBegin();
if (cursor < inputLineBegin)
{
@ -579,6 +574,9 @@ void PythonConsole::keyPressEvent(QKeyEvent * e)
// the event and afterwards update the list widget
if (d->callTipsList->isVisible())
{ d->callTipsList->validateCursor(); }
// disable history restart if input line changed
restartHistory &= (inputLine != inputBlock.text().mid(promptLength));
}
// any cursor move resets the history to its latest item.
if (restartHistory)
@ -709,7 +707,7 @@ void PythonConsole::runSource(const QString& line)
}
if (ret == QMessageBox::Yes) {
PyErr_Clear();
qApp->quit();
throw;
}
else {
PyErr_Clear();
@ -806,6 +804,21 @@ void PythonConsole::changeEvent(QEvent *e)
TextEdit::changeEvent(e);
}
void PythonConsole::mouseReleaseEvent( QMouseEvent *e )
{
TextEdit::mouseReleaseEvent( e );
if (e->button() == Qt::LeftButton)
{
QTextCursor cursor = this->textCursor();
if (cursor.hasSelection() == false
&& cursor < this->inputBegin())
{
cursor.movePosition( QTextCursor::End );
this->setTextCursor( cursor );
}
}
}
/**
* Drops the event \a e and writes the right Python command.
*/
@ -904,6 +917,16 @@ void PythonConsole::insertFromMimeData (const QMimeData * source)
}
}
QTextCursor PythonConsole::inputBegin( void ) const
{
// construct cursor at begin of input line ...
QTextCursor inputLineBegin( this->textCursor() );
inputLineBegin.movePosition( QTextCursor::End );
inputLineBegin.movePosition( QTextCursor::StartOfLine );
inputLineBegin.movePosition( QTextCursor::Right, QTextCursor::MoveAnchor, promptLength );
return inputLineBegin;
}
QMimeData * PythonConsole::createMimeDataFromSelection () const
{
QMimeData* mime = new QMimeData();

View File

@ -126,6 +126,7 @@ protected:
void dragEnterEvent ( QDragEnterEvent * e );
void dragMoveEvent ( QDragMoveEvent * e );
void changeEvent ( QEvent * e );
void mouseReleaseEvent( QMouseEvent * e );
void overrideCursor(const QString& txt);
@ -134,6 +135,7 @@ protected:
bool canInsertFromMimeData ( const QMimeData * source ) const;
QMimeData * createMimeDataFromSelection () const;
void insertFromMimeData ( const QMimeData * source );
QTextCursor inputBegin( void ) const;
private:
void runSource(const QString&);

View File

@ -22,6 +22,7 @@
#include "PreCompiled.h"
#include "SpaceballEvent.h"
#include "Application.h"
using namespace Spaceball;
@ -40,12 +41,12 @@ MotionEvent::MotionEvent() : EventBase(static_cast<QEvent::Type>(MotionEventType
MotionEvent::MotionEvent(const MotionEvent& in) : EventBase(static_cast<QEvent::Type>(MotionEventType))
{
xTrans = in.xTrans;
yTrans = in.yTrans;
zTrans = in.zTrans;
xRot = in.xRot;
yRot = in.yRot;
zRot = in.zRot;
xTrans = in.xTrans;
yTrans = in.yTrans;
zTrans = in.zTrans;
xRot = in.xRot;
yRot = in.yRot;
zRot = in.zRot;
handled = in.handled;
}

View File

@ -235,7 +235,7 @@ AboutDialog::~AboutDialog()
delete ui;
}
static QString getPlatform()
static QString getOperatingSystem()
{
#if defined (Q_OS_WIN32)
switch(QSysInfo::windowsVersion())
@ -309,9 +309,13 @@ void AboutDialog::setupLabels()
date.replace(QString::fromAscii("Unknown"), disda);
ui->labelBuildDate->setText(date);
QString os = ui->labelBuildOS->text();
os.replace(QString::fromAscii("Unknown"), getOperatingSystem());
ui->labelBuildOS->setText(os);
QString platform = ui->labelBuildPlatform->text();
platform.replace(QString::fromAscii("Unknown"),
QString::fromAscii("%1 (%2-bit)").arg(getPlatform()).arg(QSysInfo::WordSize));
QString::fromAscii("%1-bit").arg(QSysInfo::WordSize));
ui->labelBuildPlatform->setText(platform);
// branch name
@ -399,7 +403,8 @@ void AboutDialog::on_copyButton_clicked()
QString major = QString::fromAscii(config["BuildVersionMajor"].c_str());
QString minor = QString::fromAscii(config["BuildVersionMinor"].c_str());
QString build = QString::fromAscii(config["BuildRevision"].c_str());
str << "Platform: " << getPlatform() << " (" << QSysInfo::WordSize << "-bit)" << endl;
str << "OS: " << getOperatingSystem() << endl;
str << "Platform: " << QSysInfo::WordSize << "-bit" << endl;
str << "Version: " << major << "." << minor << "." << build << endl;
it = config.find("BuildRevisionBranch");
if (it != config.end())

View File

@ -69,6 +69,8 @@ public:
const std::string& getDocumentName() const
{ return documentName; }
void setDocumentName(const std::string& doc)
{ documentName = doc; }
virtual bool isAllowedAlterDocument(void) const
{ return false; }
virtual bool isAllowedAlterView(void) const
@ -94,6 +96,8 @@ protected:
/// List of TaskBoxes of that dialog
std::vector<QWidget*> Content;
ButtonPosition pos;
private:
std::string documentName;
};

View File

@ -142,29 +142,10 @@ void ViewProvider::setUpdatesEnabled (bool enable)
void ViewProvider::eventCallback(void * ud, SoEventCallback * node)
{
const SoEvent * ev = node->getEvent();
Gui::View3DInventorViewer* view = reinterpret_cast<Gui::View3DInventorViewer*>(node->getUserData());
Gui::View3DInventorViewer* viewer = reinterpret_cast<Gui::View3DInventorViewer*>(node->getUserData());
ViewProvider *self = reinterpret_cast<ViewProvider*>(ud);
assert(self);
// Calculate 3d point to the mouse position
SbVec3f point, norm;
point = view->getPointOnScreen(ev->getPosition());
norm = view->getViewDirection();
// for convenience make a pick ray action to get the (potentially) picked entity in the provider
//SoPickedPoint* Point = self->getPointOnRay(point,norm,*view);
SoSeparator* root = new SoSeparator;
root->ref();
root->addChild(view->getCamera());
root->addChild(self->pcRoot);
SoRayPickAction rp(view->getViewportRegion());
rp.setPoint(ev->getPosition());
rp.apply(root);
root->unref();
SoPickedPoint* pp = rp.getPickedPoint();
try {
// Keyboard events
if (ev->getTypeId().isDerivedFrom(SoKeyboardEvent::getClassTypeId())) {
@ -192,12 +173,12 @@ void ViewProvider::eventCallback(void * ud, SoEventCallback * node)
const SbBool press = event->getState() == SoButtonEvent::DOWN ? TRUE : FALSE;
// call the virtual method
if (self->mouseButtonPressed(button,press,point,norm,pp))
if (self->mouseButtonPressed(button,press,ev->getPosition(),viewer))
node->setHandled();
}
// Mouse Movement handling
else if (ev->getTypeId().isDerivedFrom(SoLocation2Event::getClassTypeId())) {
if (self->mouseMove(point,norm,pp))
if (self->mouseMove(ev->getPosition(),viewer))
node->setHandled();
}
}
@ -352,11 +333,28 @@ PyObject* ViewProvider::getPyObject()
return pyViewObject;
}
SoPickedPoint* ViewProvider::getPointOnRay(const SbVec3f& pos,const SbVec3f& dir, const View3DInventorViewer& viewer) const
SoPickedPoint* ViewProvider::getPointOnRay(const SbVec2s& pos, const View3DInventorViewer* viewer) const
{
// for convenience make a pick ray action to get the (potentially) picked entity in the provider
SoSeparator* root = new SoSeparator;
root->ref();
root->addChild(viewer->getCamera());
root->addChild(pcRoot);
SoRayPickAction rp(viewer->getViewportRegion());
rp.setPoint(pos);
rp.apply(root);
root->unref();
SoPickedPoint* pick = rp.getPickedPoint();
return (pick ? new SoPickedPoint(*pick) : 0);
}
SoPickedPoint* ViewProvider::getPointOnRay(const SbVec3f& pos,const SbVec3f& dir, const View3DInventorViewer* viewer) const
{
// Note: There seems to be a bug with setRay() which causes SoRayPickAction
// to fail to get intersections between the ray and a line
SoRayPickAction rp(viewer.getViewportRegion());
SoRayPickAction rp(viewer->getViewportRegion());
rp.setRay(pos,dir);
rp.apply(pcRoot);

View File

@ -30,6 +30,7 @@
#include <QIcon>
#include <boost/signals.hpp>
class SbVec2s;
class SbVec3f;
class SoNode;
class SoPath;
@ -220,11 +221,12 @@ public:
/// is called by the tree if the user double click on the object
virtual bool doubleClicked(void) { return false; }
/// is called when the provider is in edit and the mouse is moved
virtual bool mouseMove(const SbVec3f &pos, const SbVec3f &norm, const SoPickedPoint* pp)
virtual bool mouseMove(const SbVec2s &cursorPos,
View3DInventorViewer* viewer)
{ return false; }
/// is called when the Provider is in edit and the mouse is clicked
virtual bool mouseButtonPressed(int Button, bool pressed, const SbVec3f &pos,
const SbVec3f &norm, const SoPickedPoint* pp)
virtual bool mouseButtonPressed(int button, bool pressed, const SbVec2s &cursorPos,
const View3DInventorViewer* viewer)
{ return false; }
/// set up the context-menu with the supported edit modes
virtual void setupContextMenu(QMenu*, QObject*, const char*) {}
@ -264,8 +266,11 @@ protected:
void setDefaultMode(int);
//@}
/// Helper method to get picked entities while editing
SoPickedPoint* getPointOnRay(const SbVec3f& pos,const SbVec3f& dir,
const View3DInventorViewer& viewer) const;
SoPickedPoint* getPointOnRay(const SbVec2s& pos,
const View3DInventorViewer* viewer) const;
/// Helper method to get picked entities while editing
SoPickedPoint* getPointOnRay(const SbVec3f& pos, const SbVec3f& dir,
const View3DInventorViewer* viewer) const;
/// Reimplemented from subclass
void onChanged(const App::Property* prop);

View File

@ -63,14 +63,17 @@
using namespace Gui;
PROPERTY_SOURCE(Gui::ViewProviderGeometryObject, Gui::ViewProviderDocumentObject)
const App::PropertyIntegerConstraint::Constraints intPercent = {0,100,1};
ViewProviderGeometryObject::ViewProviderGeometryObject() : pcBoundSwitch(0)
{
ADD_PROPERTY(ShapeColor,(0.8f,0.8f,0.8f));
ParameterGrp::handle hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View");
unsigned long shcol = hGrp->GetUnsigned("DefaultShapeColor",3435973887UL); // light gray (204,204,204)
float r,g,b;
r = ((shcol >> 24) & 0xff) / 255.0; g = ((shcol >> 16) & 0xff) / 255.0; b = ((shcol >> 8) & 0xff) / 255.0;
ADD_PROPERTY(ShapeColor,(r, g, b));
ADD_PROPERTY(Transparency,(0));
Transparency.setConstraints(&intPercent);
App::Material mat(App::Material::DEFAULT);
@ -86,7 +89,8 @@ ViewProviderGeometryObject::ViewProviderGeometryObject() : pcBoundSwitch(0)
pcShapeMaterial = new SoMaterial;
pcShapeMaterial->ref();
ShapeMaterial.touch();
//ShapeMaterial.touch(); materials are rarely used, so better to initialize with default shape color
ShapeColor.touch();
pcBoundingBox = new Gui::SoFCBoundingBox;
pcBoundingBox->ref();

View File

@ -498,6 +498,8 @@ const char* ViewProviderPythonFeatureImp::getDefaultDisplayMode() const
Py::Callable method(vp.getAttr(std::string("getDefaultDisplayMode")));
Py::Tuple args(0);
Py::String str(method.apply(args));
if (str.isUnicode())
str = str.encode("ascii"); // json converts strings into unicode
mode = str.as_std_string();
return mode.c_str();
}

View File

@ -45,6 +45,7 @@
#include "DlgCommandsImp.h"
#include "DlgKeyboardImp.h"
#include "DlgCustomizeSpaceball.h"
#include "DlgCustomizeSpNavSettings.h"
using namespace Gui;
using namespace Gui::Dialog;
@ -75,6 +76,7 @@ WidgetFactorySupplier::WidgetFactorySupplier()
new CustomPageProducer<DlgCustomToolbarsImp>;
//new CustomPageProducer<DlgCustomToolBoxbarsImp>;
new CustomPageProducer<DlgCustomActionsImp>;
new CustomPageProducer<DlgCustomizeSpNavSettings>;
new CustomPageProducer<DlgCustomizeSpaceball>;
// ADD YOUR PREFERENCE WIDGETS HERE

View File

@ -300,6 +300,9 @@ int main( int argc, char ** argv )
else
App::Application::runApplication();
}
catch (const Base::SystemExitException&) {
exit(0);
}
catch (const Base::Exception& e) {
Base::Console().Error("%s\n", e.what());
}

View File

@ -101,6 +101,13 @@ class _Axis:
if geoms:
obj.Shape = Part.Compound(geoms)
obj.Placement = pl
def __getstate__(self):
return self.Type
def __setstate__(self,state):
if state:
self.Type = state
class _ViewProviderAxis:
"A View Provider for the Axis object"
@ -252,7 +259,6 @@ class _ViewProviderAxis:
return None
class _AxisTaskPanel:
'''The editmode TaskPanel for Axis objects'''
def __init__(self):

View File

@ -43,6 +43,22 @@ def getStringList(objects):
result += "]"
return result
def getDefaultColor(objectType):
'''getDefaultColor(string): returns a color value for the given object
type (Wall, Structure, Window)'''
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch")
if objectType == "Wall":
c = p.GetUnsigned("WallColor")
elif objectType == "Structure":
c = p.GetUnsigned("StructureColor")
else:
c = p.GetUnsigned("WindowsColor")
r = float((c>>24)&0xFF)/255.0
g = float((c>>16)&0xFF)/255.0
b = float((c>>8)&0xFF)/255.0
result = (r,g,b,1.0)
return result
def addComponents(objectsList,host):
'''addComponents(objectsList,hostObject): adds the given object or the objects
from the given list as components to the given host Object. Use this for
@ -83,6 +99,12 @@ def addComponents(objectsList,host):
if hasattr(o,"Shape"):
a.append(o)
host.Objects = a
elif host.isDerivedFrom("App::DocumentObjectGroup"):
c = host.Group
for o in objectsList:
if not o in c:
c.append(o)
host.Group = c
def removeComponents(objectsList,host=None):
'''removeComponents(objectsList,[hostObject]): removes the given component or
@ -95,9 +117,7 @@ def removeComponents(objectsList,host=None):
if Draft.getType(host) in ["Wall","Structure"]:
if hasattr(host,"Axes"):
a = host.Axes
print a
for o in objectsList[:]:
print o.Name
if o in a:
a.remove(o)
objectsList.remove(o)
@ -111,10 +131,10 @@ def removeComponents(objectsList,host=None):
if o.Base.Support:
if isinstance(o.Base.Support,tuple):
if o.Base.Support[0].Name == host.Name:
print "removing sketch support to avoid cross-referencing"
FreeCAD.Console.PrintMessage(str(translate("Arch","removing sketch support to avoid cross-referencing")))
o.Base.Support = None
elif o.Base.Support.Name == host.Name:
print "removing sketch support to avoid cross-referencing"
FreeCAD.Console.PrintMessage(str(translate("Arch","removing sketch support to avoid cross-referencing")))
o.Base.Support = None
host.Subtractions = s
else:
@ -262,41 +282,106 @@ def closeHole(shape):
else:
return solid
def getCutVolume(cutplane,shapes):
"""getCutVolume(cutplane,shapes): returns a cut face and a cut volume
from the given shapes and the given cutting plane"""
import Part
placement = FreeCAD.Placement(cutplane.Placement)
# building boundbox
bb = shapes[0].BoundBox
for sh in shapes[1:]:
bb.add(sh.BoundBox)
bb.enlarge(1)
um = vm = wm = 0
ax = placement.Rotation.multVec(FreeCAD.Vector(0,0,1))
u = placement.Rotation.multVec(FreeCAD.Vector(1,0,0))
v = placement.Rotation.multVec(FreeCAD.Vector(0,1,0))
if not bb.isCutPlane(placement.Base,ax):
FreeCAD.Console.PrintMessage(str(translate("Arch","No objects are cut by the plane")))
return None,None,None
else:
corners = [FreeCAD.Vector(bb.XMin,bb.YMin,bb.ZMin),
FreeCAD.Vector(bb.XMin,bb.YMax,bb.ZMin),
FreeCAD.Vector(bb.XMax,bb.YMin,bb.ZMin),
FreeCAD.Vector(bb.XMax,bb.YMax,bb.ZMin),
FreeCAD.Vector(bb.XMin,bb.YMin,bb.ZMax),
FreeCAD.Vector(bb.XMin,bb.YMax,bb.ZMax),
FreeCAD.Vector(bb.XMax,bb.YMin,bb.ZMax),
FreeCAD.Vector(bb.XMax,bb.YMax,bb.ZMax)]
for c in corners:
dv = c.sub(placement.Base)
um1 = DraftVecUtils.project(dv,u).Length
um = max(um,um1)
vm1 = DraftVecUtils.project(dv,v).Length
vm = max(vm,vm1)
wm1 = DraftVecUtils.project(dv,ax).Length
wm = max(wm,wm1)
p1 = FreeCAD.Vector(-um,vm,0)
p2 = FreeCAD.Vector(um,vm,0)
p3 = FreeCAD.Vector(um,-vm,0)
p4 = FreeCAD.Vector(-um,-vm,0)
cutface = Part.makePolygon([p1,p2,p3,p4,p1])
cutface = Part.Face(cutface)
cutface.Placement = placement
cutnormal = DraftVecUtils.scaleTo(ax,wm)
cutvolume = cutface.extrude(cutnormal)
cutnormal = DraftVecUtils.neg(cutnormal)
invcutvolume = cutface.extrude(cutnormal)
return cutface,cutvolume,invcutvolume
def getShapeFromMesh(mesh):
import Part, MeshPart
if mesh.isSolid() and (mesh.countComponents() == 1):
# use the best method
faces = []
for f in mesh.Facets:
p=f.Points+[f.Points[0]]
pts = []
for pp in p:
pts.append(FreeCAD.Vector(pp[0],pp[1],pp[2]))
faces.append(Part.Face(Part.makePolygon(pts)))
shell = Part.makeShell(faces)
solid = Part.Solid(shell)
solid = solid.removeSplitter()
return solid
faces = []
segments = mesh.getPlanarSegments(0.001) # use rather strict tolerance here
for i in segments:
if len(i) > 0:
wires = MeshPart.wireFromSegment(mesh, i)
if wires:
faces.append(makeFace(wires))
try:
se = Part.makeShell(faces)
except:
return None
else:
try:
solid = Part.Solid(se)
except:
return se
else:
return solid
def meshToShape(obj,mark=True):
'''meshToShape(object,[mark]): turns a mesh into a shape, joining coplanar facets. If
mark is True (default), non-solid objects will be marked in red'''
name = obj.Name
import Part, MeshPart, DraftGeomUtils
if "Mesh" in obj.PropertiesList:
faces = []
mesh = obj.Mesh
plac = obj.Placement
segments = mesh.getPlanarSegments(0.001) # use rather strict tolerance here
print len(segments)," segments ",segments
for i in segments:
print "treating",segments.index(i),i
if len(i) > 0:
wires = MeshPart.wireFromSegment(mesh, i)
print "wire done"
print wires
if wires:
faces.append(makeFace(wires))
print "done facing"
print "faces",faces
try:
se = Part.makeShell(faces)
solid = Part.Solid(se)
except:
raise
else:
if solid.isClosed():
solid = getShapeFromMesh(mesh)
if solid:
if solid.isClosed() and solid.isValid():
FreeCAD.ActiveDocument.removeObject(name)
newobj = FreeCAD.ActiveDocument.addObject("Part::Feature",name)
newobj.Shape = solid
newobj.Placement = plac
if not solid.isClosed():
if (not solid.isClosed()) or (not solid.isValid()):
if mark:
newobj.ViewObject.ShapeColor = (1.0,0.0,0.0,1.0)
return newobj
@ -382,8 +467,8 @@ def download(url):
else:
return filepath
def check(objectslist,includehidden=True):
"""check(objectslist,includehidden=True): checks if the given objects contain only solids"""
def check(objectslist,includehidden=False):
"""check(objectslist,includehidden=False): checks if the given objects contain only solids"""
objs = Draft.getGroupContents(objectslist)
if not includehidden:
objs = Draft.removeHidden(objs)
@ -393,20 +478,20 @@ def check(objectslist,includehidden=True):
bad.append([o,"is not a Part-based object"])
else:
s = o.Shape
if not s.isClosed():
bad.append([o,"is not closed"])
if (not s.isClosed()) and (not (Draft.getType(o) == "Axis")):
bad.append([o,str(translate("Arch","is not closed"))])
elif not s.isValid():
bad.append([o,"is not valid"])
elif not s.Solids:
bad.append([o,"doesn't contain any solid"])
bad.append([o,str(translate("Arch","is not valid"))])
elif (not s.Solids) and (not (Draft.getType(o) == "Axis")):
bad.append([o,str(translate("Arch","doesn't contain any solid"))])
else:
f = 0
for sol in s.Solids:
f += len(sol.Faces)
if not sol.isClosed():
bad.append([o,"contains a non-closed solid"])
bad.append([o,str(translate("Arch","contains a non-closed solid"))])
if len(s.Faces) != f:
bad.append([o,"contains faces that are not part of any solid"])
bad.append([o,str(translate("Arch","contains faces that are not part of any solid"))])
return bad
@ -508,7 +593,7 @@ class _CommandMeshToShape:
def GetResources(self):
return {'Pixmap' : 'Arch_MeshToShape',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Arch_MeshToShape","Mesh to Shape"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_MeshToPart","Turns selected meshes into Part Shape objects")}
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Arch_MeshToShape","Turns selected meshes into Part Shape objects")}
def IsActive(self):
if FreeCADGui.Selection.getSelection():
@ -613,7 +698,7 @@ class _CommandCheck:
def Activated(self):
result = check(FreeCADGui.Selection.getSelection())
if not result:
FreeCAD.Console.PrintMessage("All good! no problems found")
FreeCAD.Console.PrintMessage(str(translate("Arch","All good! no problems found")))
else:
FreeCADGui.Selection.clearSelection()
for i in result:

View File

@ -27,6 +27,7 @@ __url__ = "http://free-cad.sourceforge.net"
import FreeCAD,FreeCADGui
from PyQt4 import QtGui,QtCore
from DraftTools import translate
def addToComponent(compobject,addobject,mod=None):
'''addToComponent(compobject,addobject,mod): adds addobject
@ -264,6 +265,13 @@ class Component:
obj.Proxy = self
self.Type = "Component"
self.Subvolume = None
def __getstate__(self):
return self.Type
def __setstate__(self,state):
if state:
self.Type = state
class ViewProviderComponent:
"A default View Provider for Component objects"
@ -317,7 +325,7 @@ class ArchSelectionObserver:
def addSelection(self,document, object, element, position):
if object == self.watched.Name:
if not element:
print "closing Sketch edit"
FreeCAD.Console.PrintMessage(str(translate("Arch","closing Sketch edit")))
if self.hide:
self.origin.ViewObject.Transparency = 0
self.origin.ViewObject.Selectable = True

View File

@ -83,10 +83,11 @@ class _Floor:
self.Object = obj
def __getstate__(self):
return None
return self.Type
def __setstate__(self,state):
return None
if state:
self.Type = state
def execute(self,obj):
pass

View File

@ -110,6 +110,13 @@ class _SectionPlane:
def getNormal(self,obj):
return obj.Shape.Faces[0].normalAt(0,0)
def __getstate__(self):
return self.Type
def __setstate__(self,state):
if state:
self.Type = state
class _ViewProviderSectionPlane(ArchComponent.ViewProviderComponent):
"A View Provider for Section Planes"
def __init__(self,vobj):
@ -180,16 +187,24 @@ class _ViewProviderSectionPlane(ArchComponent.ViewProviderComponent):
vobj.Object.Proxy.execute(vobj.Object)
return
def __getstate__(self):
return None
def __setstate__(self,state):
return None
class _ArchDrawingView:
def __init__(self, obj):
obj.addProperty("App::PropertyLink","Source","Base","The linked object")
obj.addProperty("App::PropertyEnumeration","RenderingMode","Drawing View","The rendering mode to use")
obj.addProperty("App::PropertyBool","ShowCut","Drawing View","If cut geometry is shown or not")
obj.addProperty("App::PropertyFloat","LineWidth","Drawing View","The line width of the rendered objects")
obj.RenderingMode = ["Solid","Wireframe"]
obj.RenderingMode = "Solid"
obj.RenderingMode = "Wireframe"
obj.LineWidth = 0.35
obj.ShowCut = False
obj.Proxy = self
self.Type = "DrawingView"
self.Type = "ArchSectionView"
def execute(self, obj):
if obj.Source:
@ -197,59 +212,163 @@ class _ArchDrawingView:
def onChanged(self, obj, prop):
if prop in ["Source","RenderingMode"]:
self.buildSVG(obj)
obj.ViewResult = self.updateSVG(obj)
def updateSVG(self, obj,join=False):
"encapsulates a svg fragment into a transformation node"
def __getstate__(self):
return self.Type
def __setstate__(self,state):
if state:
self.Type = state
def getDisplayModes(self,vobj):
modes=["Default"]
return modes
def setDisplayMode(self,mode):
return mode
def getFlatShape(self):
"returns a flat shape representation of the view"
if hasattr(self,"baseshape"):
import Drawing
[V0,V1,H0,H1] = Drawing.project(self.baseshape,self.direction)
return V0.Edges+V1.Edges
else:
FreeCAD.Console.PrintMessage(str(translate("Arch","No shape has been computed yet, select wireframe rendering and render again")))
return None
def getDXF(self):
"returns a flat shape representation of the view"
if hasattr(self,"baseshape"):
import Drawing
[V0,V1,H0,H1] = Drawing.project(self.baseshape,self.direction)
DxfOutput = Drawing.projectToDXF(self.baseshape,self.direction)
return DxfOutput
else:
FreeCAD.Console.PrintMessage(str(translate("Arch","No shape has been computed yet, select wireframe rendering and render again")))
return None
def buildSVG(self, obj,join=False):
"creates a svg representation"
import Part, DraftGeomUtils
if hasattr(obj,"Source"):
if obj.Source:
if obj.Source.Objects:
objs = Draft.getGroupContents(obj.Source.Objects)
objs = Draft.getGroupContents(obj.Source.Objects,walls=True)
objs = Draft.removeHidden(objs)
svg = ''
self.svg = ''
# generating SVG
linewidth = obj.LineWidth/obj.Scale
if obj.RenderingMode == "Solid":
# render using the Arch Vector Renderer
import ArchVRM
render = ArchVRM.Renderer()
render.setWorkingPlane(obj.Source.Placement)
render.addObjects(Draft.getGroupContents(objs,walls=True))
render.cut(obj.Source.Shape)
svg += render.getViewSVG(linewidth=linewidth)
svg += render.getSectionSVG(linewidth=linewidth*2)
render.addObjects(objs)
if hasattr(obj,"ShowCut"):
render.cut(obj.Source.Shape,obj.ShowCut)
else:
render.cut(obj.Source.Shape)
self.svg += render.getViewSVG(linewidth="LWPlaceholder")
self.svg += render.getSectionSVG(linewidth="SWPLaceholder")
if hasattr(obj,"ShowCut"):
if obj.ShowCut:
self.svg += render.getHiddenSVG(linewidth="LWPlaceholder")
# print render.info()
else:
# render using the Drawing module
import Drawing
import Drawing, Part
shapes = []
hshapes = []
sshapes = []
p = FreeCAD.Placement(obj.Source.Placement)
self.direction = p.Rotation.multVec(FreeCAD.Vector(0,0,1))
for o in objs:
if o.isDerivedFrom("Part::Feature"):
shapes.append(o.Shape)
if o.Shape.isValid():
shapes.extend(o.Shape.Solids)
else:
FreeCAD.Console.PrintWarning(str(translate("Arch","Skipping invalid object: "))+o.Name)
cutface,cutvolume,invcutvolume = ArchCommands.getCutVolume(obj.Source.Shape.copy(),shapes)
if cutvolume:
nsh = []
for sh in shapes:
for sol in sh.Solids:
if sol.Volume < 0:
sol.reverse()
c = sol.cut(cutvolume)
s = sol.section(cutface)
nsh.extend(c.Solids)
sshapes.append(s)
if hasattr(obj,"ShowCut"):
if obj.ShowCut:
c = sol.cut(invcutvolume)
hshapes.append(c)
shapes = nsh
if shapes:
base = shapes.pop()
for sh in shapes:
base = base.fuse(sh)
svgf = Drawing.projectToSVG(base,DraftVecUtils.neg(direction))
if svgf:
svgf = svgf.replace('stroke-width="0.35"','stroke-width="' + str(linewidth) + 'px"')
svgf = svgf.replace('stroke-width:0.01','stroke-width:' + str(linewidth) + 'px')
svg += svgf
self.shapes = shapes
self.baseshape = Part.makeCompound(shapes)
svgf = Drawing.projectToSVG(self.baseshape,self.direction)
if svgf:
svgf = svgf.replace('stroke-width="0.35"','stroke-width="LWPlaceholder"')
svgf = svgf.replace('stroke-width="1"','stroke-width="LWPlaceholder"')
svgf = svgf.replace('stroke-width:0.01','stroke-width:LWPlaceholder')
self.svg += svgf
if hshapes:
hshapes = Part.makeCompound(hshapes)
svgh = Drawing.projectToSVG(hshapes,self.direction)
if svgh:
svgh = svgh.replace('stroke-width="0.35"','stroke-width="LWPlaceholder"')
svgh = svgh.replace('stroke-width="1"','stroke-width="LWPlaceholder"')
svgh = svgh.replace('stroke-width:0.01','stroke-width:LWPlaceholder')
svgh = svgh.replace('fill="none"','fill="none"\nstroke-dasharray="0.09,0.05"')
self.svg += svgh
if sshapes:
edges = []
for s in sshapes:
edges.extend(s.Edges)
wires = DraftGeomUtils.findWires(edges)
faces = []
for w in wires:
if (w.ShapeType == "Wire") and w.isClosed():
faces.append(Part.Face(w))
sshapes = Part.makeCompound(faces)
svgs = Drawing.projectToSVG(sshapes,self.direction)
if svgs:
svgs = svgs.replace('stroke-width="0.35"','stroke-width="SWPlaceholder"')
svgs = svgs.replace('stroke-width="1"','stroke-width="SWPlaceholder"')
svgs = svgs.replace('stroke-width:0.01','stroke-width:SWPlaceholder')
self.svg += svgs
result = ''
result += '<g id="' + obj.Name + '"'
result += ' transform="'
result += 'rotate('+str(obj.Rotation)+','+str(obj.X)+','+str(obj.Y)+') '
result += 'translate('+str(obj.X)+','+str(obj.Y)+') '
result += 'scale('+str(obj.Scale)+','+str(-obj.Scale)+')'
result += '">\n'
result += svg
result += '</g>\n'
# print "complete node:",result
return result
return ''
def updateSVG(self, obj):
"Formats and places the calculated svg stuff on the page"
if not hasattr(self,"svg"):
self.buildSVG(obj)
else:
if not self.svg:
self.buildSVG(obj)
if not hasattr(self,"svg"):
return ''
linewidth = obj.LineWidth/obj.Scale
st = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").GetFloat("CutLineThickness")
if not st:
st = 2
svg = self.svg.replace('LWPlaceholder', str(linewidth) + 'px')
svg = svg.replace('SWPlaceholder', str(linewidth*st) + 'px')
result = ''
result += '<g id="' + obj.Name + '"'
result += ' transform="'
result += 'rotate('+str(obj.Rotation)+','+str(obj.X)+','+str(obj.Y)+') '
result += 'translate('+str(obj.X)+','+str(obj.Y)+') '
result += 'scale('+str(obj.Scale)+','+str(-obj.Scale)+')'
result += '">\n'
result += svg
result += '</g>\n'
# print "complete node:",result
return result
FreeCADGui.addCommand('Arch_SectionPlane',_CommandSectionPlane())

View File

@ -44,12 +44,7 @@ def makeStructure(baseobj=None,length=1,width=1,height=1,name=str(translate("Arc
obj.Width = width
obj.Height = height
obj.Length = length
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch")
c = p.GetUnsigned("StructureColor")
r = float((c>>24)&0xFF)/255.0
g = float((c>>16)&0xFF)/255.0
b = float((c>>8)&0xFF)/255.0
obj.ViewObject.ShapeColor = (r,g,b,1.0)
obj.ViewObject.ShapeColor = ArchCommands.getDefaultColor("Structure")
return obj
def makeStructuralSystem(objects,axes):
@ -171,7 +166,13 @@ class _Structure(ArchComponent.Component):
elif (len(base.Wires) == 1):
if base.Wires[0].isClosed():
base = Part.Face(base.Wires[0])
base = base.extrude(normal)
base = base.extrude(normal)
elif obj.Base.isDerivedFrom("Mesh::Feature"):
if obj.Base.Mesh.isSolid():
if obj.Base.Mesh.countComponents() == 1:
sh = ArchCommands.getShapeFromMesh(obj.Base.Mesh)
if sh.isClosed() and sh.isValid() and sh.Solids:
base = sh
else:
if obj.Normal == Vector(0,0,0):
normal = Vector(0,0,1)
@ -222,8 +223,14 @@ class _Structure(ArchComponent.Component):
else:
if base:
if not base.isNull():
base = base.removeSplitter()
obj.Shape = base
if base.isValid() and base.Solids:
if base.Volume < 0:
base.reverse()
if base.Volume < 0:
FreeCAD.Console.PrintError(str(translate("Arch","Couldn't compute the wall shape")))
return
base = base.removeSplitter()
obj.Shape = base
if not DraftGeomUtils.isNull(pl):
obj.Placement = pl

View File

@ -25,12 +25,13 @@
import FreeCAD,math,Part,ArchCommands,DraftVecUtils,DraftGeomUtils
DEBUG = True # if we want debug messages
MAXLOOP = 10 # the max number of loop before abort
# WARNING: in this module, faces are lists whose first item is the actual OCC face, the
# other items being additional information such as color, etc.
DEBUG = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch").GetBool("ShowVRMDebug")
class Renderer:
"A renderer object"
def __init__(self,wp=None):
@ -73,6 +74,7 @@ class Renderer:
self.iscut = False
self.joined = False
self.sections = []
self.hiddenEdges = []
def setWorkingPlane(self,wp):
"sets a Draft WorkingPlane or Placement for this renderer"
@ -151,6 +153,8 @@ class Renderer:
self.faces = [self.projectFace(f) for f in self.faces]
if self.sections:
self.sections = [self.projectFace(f) for f in self.sections]
if self.hiddenEdges:
self.hiddenEdges = [self.projectEdge(e) for e in self.hiddenEdges]
self.oriented = True
#print "VRM: end reorient"
@ -200,6 +204,14 @@ class Renderer:
#print "VRM: projectFace end: ",len(sh.Vertexes)," verts"
return [sh]+face[1:]
def projectEdge(self,edge):
"projects a single edge on the WP"
if len(edge.Vertexes) > 1:
v1 = self.wp.getLocalCoords(edge.Vertexes[0].Point)
v2 = self.wp.getLocalCoords(edge.Vertexes[-1].Point)
return Part.Line(v1,v2).toShape()
return edge
def flattenFace(self,face):
"Returns a face where all vertices have Z = 0"
wires = []
@ -219,7 +231,7 @@ class Renderer:
else:
return [sh]+face[1:]
def cut(self,cutplane):
def cut(self,cutplane,hidden=False):
"Cuts through the shapes with a given cut plane and builds section faces"
if DEBUG: print "\n\n======> Starting cut\n\n"
if self.iscut:
@ -228,42 +240,11 @@ class Renderer:
if DEBUG: print "No objects to make sections"
else:
fill = (1.0,1.0,1.0,1.0)
placement = FreeCAD.Placement(cutplane.Placement)
# building boundbox
bb = self.shapes[0][0].BoundBox
for sh in self.shapes[1:]:
bb.add(sh[0].BoundBox)
bb.enlarge(1)
um = vm = wm = 0
if not bb.isCutPlane(placement.Base,self.wp.axis):
if DEBUG: print "No objects are cut by the plane"
else:
corners = [FreeCAD.Vector(bb.XMin,bb.YMin,bb.ZMin),
FreeCAD.Vector(bb.XMin,bb.YMax,bb.ZMin),
FreeCAD.Vector(bb.XMax,bb.YMin,bb.ZMin),
FreeCAD.Vector(bb.XMax,bb.YMax,bb.ZMin),
FreeCAD.Vector(bb.XMin,bb.YMin,bb.ZMax),
FreeCAD.Vector(bb.XMin,bb.YMax,bb.ZMax),
FreeCAD.Vector(bb.XMax,bb.YMin,bb.ZMax),
FreeCAD.Vector(bb.XMax,bb.YMax,bb.ZMax)]
for c in corners:
dv = c.sub(placement.Base)
um1 = DraftVecUtils.project(dv,self.wp.u).Length
um = max(um,um1)
vm1 = DraftVecUtils.project(dv,self.wp.v).Length
vm = max(vm,vm1)
wm1 = DraftVecUtils.project(dv,self.wp.axis).Length
wm = max(wm,wm1)
p1 = FreeCAD.Vector(-um,vm,0)
p2 = FreeCAD.Vector(um,vm,0)
p3 = FreeCAD.Vector(um,-vm,0)
p4 = FreeCAD.Vector(-um,-vm,0)
cutface = Part.makePolygon([p1,p2,p3,p4,p1])
cutface = Part.Face(cutface)
cutface.Placement = placement
cutnormal = DraftVecUtils.scaleTo(self.wp.axis,wm)
cutvolume = cutface.extrude(cutnormal)
shps = []
for sh in self.shapes:
shps.append(sh[0])
cutface,cutvolume,invcutvolume = ArchCommands.getCutVolume(cutplane,shps)
if cutface and cutvolume:
shapes = []
faces = []
sections = []
@ -277,6 +258,9 @@ class Renderer:
if DraftGeomUtils.isCoplanar([f,cutface]):
print "COPLANAR"
sections.append([f,fill])
if hidden:
c = sol.cut(invcutvolume)
self.hiddenEdges.extend(c.Edges)
self.shapes = shapes
self.faces = faces
self.sections = sections
@ -586,7 +570,8 @@ class Renderer:
v = e.Vertexes[-1].Point
svg += 'A '+ tostr(r) + ' '+ tostr(r) +' 0 0 1 '+ tostr(v.x) +' '
svg += tostr(v.y) + ' '
svg += 'Z '
if len(edges) > 1:
svg += 'Z '
return svg
def getViewSVG(self,linewidth=0.01):
@ -639,4 +624,25 @@ class Renderer:
svg += 'fill-rule: evenodd'
svg += '"/>\n'
return svg
def getHiddenSVG(self,linewidth=0.02):
"Returns a SVG fragment from cut geometry"
if DEBUG: print "Printing ", len(self.sections), " hidden faces"
if not self.oriented:
self.reorient()
svg = ''
for e in self.hiddenEdges:
svg +='<path '
svg += 'd="'
svg += self.getPathData(e)
svg += '" '
svg += 'stroke="#000000" '
svg += 'stroke-width="' + str(linewidth) + '" '
svg += 'style="stroke-width:' + str(linewidth) + ';'
svg += 'stroke-miterlimit:1;'
svg += 'stroke-linejoin:round;'
svg += 'stroke-dasharray:0.09,0.05;'
svg += 'fill:none;'
svg += '"/>\n'
return svg

View File

@ -21,7 +21,7 @@
#* *
#***************************************************************************
import FreeCAD,FreeCADGui,Draft,ArchComponent,DraftVecUtils
import FreeCAD,FreeCADGui,Draft,ArchComponent,DraftVecUtils,ArchCommands
from FreeCAD import Vector
from PyQt4 import QtCore
from DraftTools import translate
@ -37,17 +37,16 @@ def makeWall(baseobj=None,width=None,height=None,align="Center",name=str(transla
obj = FreeCAD.ActiveDocument.addObject("Part::FeaturePython",name)
_Wall(obj)
_ViewProviderWall(obj.ViewObject)
if baseobj: obj.Base = baseobj
if width: obj.Width = width
if height: obj.Height = height
if baseobj:
obj.Base = baseobj
if width:
obj.Width = width
if height:
obj.Height = height
obj.Align = align
if obj.Base: obj.Base.ViewObject.hide()
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch")
c = p.GetUnsigned("WallColor")
r = float((c>>24)&0xFF)/255.0
g = float((c>>16)&0xFF)/255.0
b = float((c>>8)&0xFF)/255.0
obj.ViewObject.ShapeColor = (r,g,b,1.0)
if obj.Base:
obj.Base.ViewObject.hide()
obj.ViewObject.ShapeColor = ArchCommands.getDefaultColor("Wall")
return obj
def joinWalls(walls):
@ -358,31 +357,44 @@ class _Wall(ArchComponent.Component):
base = None
if obj.Base.isDerivedFrom("Part::Feature"):
if not obj.Base.Shape.isNull():
base = obj.Base.Shape.copy()
if base.Solids:
pass
elif base.Faces and (not obj.ForceWire):
if height:
norm = normal.multiply(height)
base = base.extrude(norm)
elif base.Wires:
temp = None
for wire in obj.Base.Shape.Wires:
if obj.Base.Shape.isValid():
base = obj.Base.Shape.copy()
if base.Solids:
pass
elif base.Faces and (not obj.ForceWire):
if height:
norm = normal.multiply(height)
base = base.extrude(norm)
elif base.Wires:
temp = None
for wire in obj.Base.Shape.Wires:
sh = getbase(wire)
if temp:
temp = temp.fuse(sh)
else:
temp = sh
base = temp
elif base.Edges:
wire = Part.Wire(base.Edges)
sh = getbase(wire)
if temp:
temp = temp.fuse(sh)
else:
temp = sh
base = temp
elif base.Edges:
wire = Part.Wire(base.Edges)
sh = getbase(wire)
if sh:
if sh:
base = sh
else:
base = None
FreeCAD.Console.PrintError(str(translate("Arch","Error: Invalid base object")))
elif obj.Base.isDerivedFrom("Mesh::Feature"):
if obj.Base.Mesh.isSolid():
if obj.Base.Mesh.countComponents() == 1:
sh = ArchCommands.getShapeFromMesh(obj.Base.Mesh)
if sh.isClosed() and sh.isValid() and sh.Solids and (not sh.isNull()):
base = sh
else:
FreeCAD.Console.PrintError(str(translate("Arch","Error: Invalid base object")))
else:
FreeCAD.Console.PrintWarning(str(translate("Arch","This mesh is an invalid solid")))
obj.Base.ViewObject.show()
if base:
for app in obj.Additions:
if Draft.getType(app) == "Window":
# window
@ -419,13 +431,19 @@ class _Wall(ArchComponent.Component):
hole.ViewObject.hide() # to be removed
if not base.isNull():
try:
base = base.removeSplitter()
except:
FreeCAD.Console.PrintError(str(translate("Arch","Error removing splitter from wall shape")))
obj.Shape = base
if not DraftGeomUtils.isNull(pl):
obj.Placement = pl
if base.isValid() and base.Solids:
if base.Volume < 0:
base.reverse()
if base.Volume < 0:
FreeCAD.Console.PrintError(str(translate("Arch","Couldn't compute the wall shape")))
return
try:
base = base.removeSplitter()
except:
FreeCAD.Console.PrintError(str(translate("Arch","Error removing splitter from wall shape")))
obj.Shape = base
if not DraftGeomUtils.isNull(pl):
obj.Placement = pl
class _ViewProviderWall(ArchComponent.ViewProviderComponent):
"A View Provider for the Wall object"

View File

@ -21,7 +21,7 @@
#* *
#***************************************************************************
import FreeCAD,FreeCADGui,Draft,ArchComponent,DraftVecUtils
import FreeCAD,FreeCADGui,Draft,ArchComponent,DraftVecUtils,ArchCommands
from FreeCAD import Vector
from PyQt4 import QtCore,QtGui
from DraftTools import translate
@ -49,12 +49,7 @@ def makeWindow(baseobj=None,width=None,name=str(translate("Arch","Window"))):
if obj.Base:
obj.Base.ViewObject.DisplayMode = "Wireframe"
obj.Base.ViewObject.hide()
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Arch")
c = p.GetUnsigned("WindowColor")
r = float((c>>24)&0xFF)/255.0
g = float((c>>16)&0xFF)/255.0
b = float((c>>8)&0xFF)/255.0
obj.ViewObject.ShapeColor = (r,g,b,1.0)
obj.ViewObject.ShapeColor = ArchCommands.getDefaultColor("Window")
return obj
def makeDefaultWindowPart(obj):
@ -166,7 +161,6 @@ class _Window(ArchComponent.Component):
if zof:
zov = DraftVecUtils.scaleTo(norm,zof)
shape.translate(zov)
print shape
shapes.append(shape)
if shapes:
obj.Shape = Part.makeCompound(shapes)
@ -445,10 +439,7 @@ class _ArchWindowTaskPanel:
self.obj.WindowParts = parts
self.update()
else:
FreeCAD.Console.PrintWarning(str(
QtGui.QApplication.translate(
"Arch", "Unable to create component",
None, QtGui.QApplication.UnicodeUTF8)))
FreeCAD.Console.PrintWarning(str(translate("Arch", "Unable to create component")))
self.newtitle.setVisible(False)
self.new1.setVisible(False)

View File

@ -2,8 +2,8 @@
# Resource object code
#
# Created: Sun Jul 22 16:38:54 2012
# by: The Resource Compiler for PyQt (Qt v4.8.1)
# Created: Sun Aug 5 16:52:51 2012
# by: The Resource Compiler for PyQt (Qt v4.8.2)
#
# WARNING! All changes made in this file will be lost!
@ -6042,85 +6042,100 @@ qt_resource_data = "\
\x00\x00\x00\x12\x00\x57\x00\x65\x00\x72\x00\x6b\x00\x7a\x00\x65\
\x00\x75\x00\x67\x00\x65\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05\
\x54\x6f\x6f\x6c\x73\x07\x00\x00\x00\x04\x61\x72\x63\x68\x01\
\x00\x00\x04\xd0\
\x00\x00\x05\xb5\
\x00\
\x00\x1e\xaa\x78\x9c\xed\x59\x6d\x6f\xdb\x36\x10\xfe\x9e\x5f\x41\
\xe8\xd3\x06\x6c\x95\xed\xd8\x6e\x13\xc8\x2a\xd6\x74\x79\x01\x5a\
\x2c\x81\xd3\xe6\xe3\x20\x4b\x67\x8b\xab\x24\x7a\x24\x95\xd8\xfd\
\xf5\x3d\x92\x92\x65\xbd\x58\x89\x63\x27\x01\x82\x00\x31\x22\xf2\
\x4e\xc7\xe3\xc3\xe3\xa3\x3b\xd2\xf9\xb8\x88\x23\x72\x0b\x5c\x50\
\x96\x8c\xac\xee\xbb\x8e\x45\x20\xf1\x59\x40\x93\xd9\xc8\xfa\x76\
\x7d\xfa\xe7\x07\xeb\xa3\x7b\xe0\xa4\xb4\x50\xea\xa3\x92\x7b\x40\
\x1c\x3f\xf2\x84\x70\xcf\x52\x7a\x7c\xfc\x99\x7a\x11\x9b\xe1\xff\
\x68\x36\x06\x29\xf1\x65\xf1\x17\xf7\x43\xc7\x36\x3a\xa8\x7c\x47\
\x83\x19\x48\xa2\xdb\x23\xeb\xea\x46\x37\x2d\x92\x78\x31\x8c\xac\
\x36\x1b\x6a\x28\xe2\xcc\x39\x9b\x03\x97\xcb\xec\x85\x19\xb0\x18\
\x24\x5f\x6a\x21\x71\x38\xf8\x52\x3f\x11\x67\xe1\x76\x1c\x7b\x91\
\x35\x96\xaa\xb1\xcc\x1a\xe8\x81\x0c\xdd\xc1\xfb\x81\x63\x9b\x47\
\xd3\x1d\x02\x9d\x85\xd2\x1d\xf6\x8e\x1c\x3b\x7b\xd6\x36\xed\xdc\
\xa8\x63\xe7\x83\x37\x79\x72\x47\x93\x80\xdd\x5d\x53\x19\x41\xe6\
\x8c\x90\x1c\x7d\x77\xcf\x20\x01\xee\x45\x44\x64\x73\x71\xec\x4c\
\x50\x37\x19\x79\x4b\x96\x16\xd8\x7c\xff\xc4\x16\x5f\x74\x57\x66\
\xb1\x32\xa4\x98\x7b\x3e\x1a\xb2\xb2\x09\x24\x69\x3c\x01\xee\x0e\
\x1d\x3b\x7b\x32\xee\xaf\x8f\x50\x33\x11\x7b\x7c\x46\x93\x8a\x85\
\xa3\x56\x0b\x54\x42\x5c\x20\xb9\xbe\x96\x67\x9c\xa5\x73\xf4\x39\
\x5f\xcd\x59\xde\x36\xea\xb5\xc1\x65\x01\x56\x03\x5e\x6a\xcd\xc9\
\xb8\x01\xb4\xba\x4f\xad\xd0\x65\x83\x61\xd4\x4a\xea\x7b\x91\xe9\
\xfd\xb7\x57\x8c\x5b\x4c\xa8\xc1\xd0\x79\xcd\x50\xc8\x38\xfd\xc9\
\x12\xd9\x60\xaa\x6a\xac\x0e\xd1\x17\x6f\x02\x51\x6e\x29\x52\x8d\
\xd2\xeb\x0d\x18\xc1\x42\x96\x14\x56\x38\x7d\x86\xa9\x97\x46\x68\
\x9a\x45\x8c\x93\x29\xfe\xee\xbc\x28\xaa\x22\xd5\x0c\x97\xe9\x34\
\xbe\xad\x39\x6f\x97\xbd\xaf\x4d\x46\x05\x1c\xf0\x1a\x0e\x63\xdd\
\xdd\x3a\x0d\xd4\x05\x54\x95\xc8\x1b\x95\xd9\x00\x86\x9a\x7b\x25\
\x8f\x8f\xcf\x57\xf6\x1c\x5b\x77\xde\x37\x81\xfa\x7e\xa0\x3f\xe1\
\x9c\x26\xb8\x52\x42\x06\xb8\xdd\x46\x56\xa7\x0a\x1d\x6a\x94\x7a\
\x72\x36\xe8\x77\x4a\x64\xb0\x92\x66\x44\xd0\xeb\x94\x38\xa1\x70\
\xab\x6a\x70\x03\xd2\x06\xb8\x2d\x90\x2e\x87\x8d\xa6\xc5\x4b\x0e\
\xd3\x13\xb5\xd6\x9f\x52\x29\x11\xc6\x7c\x93\x29\xd9\x1c\x65\x3a\
\x0e\x26\x46\xd6\x1a\x51\x8c\x45\xd7\x74\xde\x1c\x54\xd7\x21\x15\
\x04\xff\x64\x08\x24\xa8\x05\x58\x02\x77\xe4\x06\x83\x8c\xb0\xc9\
\x7f\x48\x8a\x0f\x8f\xb5\x9a\x13\xda\x66\xc5\x05\xdd\x57\xc1\x9f\
\x43\xe0\xf6\x06\x03\x45\xc2\x41\x45\x34\xe3\x00\x89\xdb\x3d\xc2\
\xa5\x31\x8f\x65\xf1\x24\x4a\xc1\xed\xbe\x47\xa9\x7e\x2a\x2f\x5b\
\x6d\xa8\x87\x79\xad\x60\xfe\x3b\x51\x9f\x9b\x8d\x11\xe6\x67\x88\
\x28\x98\xf4\x6a\xe1\x60\x8f\x05\x49\x0d\x77\xe9\xc9\xf0\xfe\xd1\
\xbe\xb2\xc0\xce\xbe\xb3\xfb\xda\xfd\x8e\x6d\x98\x70\x45\x93\x25\
\xf1\xae\xa4\xb9\x13\x65\xee\x8d\x30\x51\x90\xfa\x32\xe5\xf0\x72\
\xac\x79\x0f\xfd\xbf\xf1\xe6\x73\xf2\xe6\x7d\xdf\xe2\xdd\x98\x73\
\x9c\x47\xdb\xf3\xd2\x67\x77\xd0\x69\xa1\xcf\xe1\x51\x1b\x7d\x7e\
\x18\xbe\x10\x7d\xae\xb0\x7a\xe3\xd0\xcd\x89\xe7\x70\xb7\xc4\x73\
\xb0\xbf\xc4\x53\xd7\x3e\x2f\x48\xa2\xfd\x37\x12\xdd\x8c\xf5\x73\
\x93\xe8\x61\xeb\x62\x6c\x43\x5d\x83\xa3\x16\xe6\x3a\xec\xb5\x31\
\x57\xff\xa5\x98\xeb\x46\xef\x85\xd7\x4b\x5b\x65\x61\xc9\xd6\x9a\
\xde\x23\x4e\x09\x8a\x8f\xef\xc3\xce\x09\x2e\x4e\x4f\x08\x8d\xe7\
\x8c\xcb\x7d\x1f\x0e\xec\xef\x68\x60\xf0\x70\x86\x2e\xb6\x59\x08\
\xfe\x8f\x75\x7c\x56\x7b\x4c\x09\x26\xc5\x71\x4a\x33\x56\x6d\x39\
\xca\xc5\x14\xd3\x13\x93\xa6\x68\x63\x10\xfc\xa1\xf3\x15\x84\xf2\
\x9f\x39\x24\xe3\x10\xb0\xb6\x33\x98\x82\x62\x75\x6c\x4d\x80\xa4\
\x42\xe9\x61\x3d\xc3\x90\xe7\x67\x44\xb2\x4c\x85\xc4\x8c\xeb\x77\
\x89\x5c\xce\xb7\x48\xa1\xb7\xf8\xd4\x7c\x13\x55\xe7\xa6\xc4\xbb\
\xf5\x28\x7e\xc0\x22\x78\xfc\x80\x5b\x6c\x67\x9c\xfc\xc5\xd4\x5f\
\x39\xf0\x2a\xb7\xf4\xee\x71\x7e\xf8\x14\x71\xbe\x4b\x36\x7e\xc2\
\xc1\x93\x20\x88\x26\x17\xa1\x93\x14\xf0\xfc\xd0\x1c\x2a\x9a\xf4\
\x5b\x47\xed\x53\x04\xad\x26\x38\xcc\x8e\x70\x93\x24\x98\x77\x08\
\x32\x59\xee\xba\x43\xb6\x08\x58\x5f\xcf\x1c\x63\x56\xbb\x21\xde\
\x02\xb6\x31\x60\xfb\x4f\x12\xb0\xed\x99\xcf\xe6\x88\xb9\x30\x7c\
\x3a\x4d\x79\x42\x75\x81\xf8\x9b\xef\x25\x24\xf6\x7e\x80\xa6\xe7\
\x98\x05\x10\x91\x10\xbc\xdb\xe5\xef\xcf\x12\x43\x86\xdf\x31\x86\
\x4e\x73\x8f\x5e\x65\x18\x6d\x9f\xca\x94\xaa\x90\x3c\x69\x28\x1f\
\x7f\x3f\xa4\xf8\x28\xea\x8e\xef\x99\x8d\x52\xd5\x51\x4f\x60\xb6\
\xa8\x35\xca\x65\x46\x56\x61\xf4\x6a\x15\x46\x5e\x5c\xf4\x6b\xc5\
\x45\xa9\xae\xa8\xba\x52\xaa\x26\x0a\x90\xd6\x90\x5c\x83\x31\xdb\
\x97\xf9\x69\x48\x76\x5d\x35\xb2\x86\x16\x31\xf7\x4e\x23\xab\xdb\
\xb5\x6c\xa5\x39\xa7\x8b\xd8\x9b\x4f\xd3\xc4\x57\x40\xb9\xff\x5f\
\xea\xf6\x29\x67\xf1\x57\x1a\xc3\x98\xa5\xdc\xc7\x18\xac\x68\xa9\
\xab\xc7\x54\x48\x16\x9b\x11\x85\xf6\x64\xbd\xc7\x78\xb9\x76\x3d\
\xb9\x56\xc2\x14\x57\x92\x6a\x3d\x16\x12\x92\x40\xb8\x57\x97\xa9\
\x08\x73\x79\xde\x79\x60\xe0\xf2\x02\x9c\x36\x5a\xb1\xcd\x95\xa5\
\x78\x17\x2a\xe4\x74\xaf\x46\xa0\x3a\x70\xbb\x27\x95\x82\xaa\xd1\
\x9b\xba\xcb\x9b\x5c\x52\xd6\xf6\xe7\x56\xc6\x73\xcd\x08\x15\xd2\
\xdd\x9d\x29\x77\xe8\xeb\x61\x0e\x42\x2f\xb6\xd0\x61\xe1\xb3\x24\
\x01\xbd\xd8\xaa\xed\xd8\x29\x75\x0f\x7e\x01\x09\x6b\xe1\xfc\
\x00\x27\xfd\x78\x9c\xed\x5a\x6d\x4f\xe3\x38\x10\xfe\xce\xaf\xb0\
\xf2\xe9\x4e\xba\x23\xa5\x50\x58\x50\x9a\xd5\x2d\x1c\x0b\xd2\xae\
\x8e\xbd\xb2\xbb\x1f\x4f\x69\x32\x6d\x7c\x9b\xd8\x39\xc7\xa1\xed\
\xfe\xfa\x1b\xdb\x49\xd3\xbc\x34\x50\x5a\x40\x42\x20\x10\xb1\xc7\
\x9d\x19\x3f\x9e\x79\x3c\x76\xe3\xbc\x9f\xc7\x11\xb9\x03\x91\x52\
\xce\x86\xd6\xc1\x7e\xcf\x22\xc0\x7c\x1e\x50\x36\x1d\x5a\x5f\x6f\
\x2f\x7f\x7f\x67\xbd\x77\xf7\x9c\x8c\x96\x83\x8e\x70\x90\xbb\x47\
\x1c\x3f\xf2\xd2\xd4\xfd\x98\xd1\xb3\xb3\x0b\xea\x45\x7c\x8a\xff\
\xa3\xe9\x08\xa4\xc4\x0f\xa7\x7f\x08\x3f\x74\x6c\x33\x06\x07\xcf\
\x68\x30\x05\x49\x74\x7b\x68\x7d\xf9\xae\x9b\x16\x61\x5e\x0c\x43\
\xab\x4b\x87\x32\x45\x9c\x44\xf0\x04\x84\x5c\xe4\x1f\x98\x02\x8f\
\x41\x8a\x85\x16\x12\x47\x80\x2f\xf5\x13\x71\xe6\x6e\xcf\xb1\xe7\
\x79\x63\xa1\x1a\x8b\xbc\x81\x1e\xc8\xd0\x1d\x9c\x0c\x1c\xdb\x3c\
\x9a\xee\x10\xe8\x34\x94\xee\x71\xff\xd4\xb1\xf3\x67\xad\xd3\x2e\
\x94\x3a\x76\x61\xbc\xcd\x93\x19\x65\x01\x9f\xdd\x52\x19\x41\xee\
\x4c\x2a\x05\xfa\xee\x7e\x04\x06\xc2\x8b\x48\x9a\xcf\xc5\xb1\x73\
\x41\x53\x65\xe4\x2d\x78\x56\x62\xf3\xed\x03\x9f\x7f\xd2\x5d\xb9\
\xc6\x9a\xc9\x34\xf1\x7c\x54\x64\xe5\x13\x60\x59\x3c\x06\xe1\x1e\
\x3b\x76\xfe\x64\xdc\x5f\xb5\xd0\x50\x11\x7b\x62\x4a\x59\x4d\xc3\
\x69\xa7\x06\x2a\x21\x2e\x91\x5c\x5d\xcb\x8f\x82\x67\x09\xfa\x5c\
\xac\xe6\xb4\x68\x9b\xe1\x0d\xe3\xb2\x04\xab\x05\x2f\xb5\xe6\x64\
\xd4\x02\x5a\xd3\xa7\x4e\xe8\x72\x63\x18\xb5\x92\xfa\x5e\x64\x7a\
\xff\xe9\x97\x76\xcb\x09\xb5\x28\xba\x6a\x28\x0a\xb9\xa0\x3f\x39\
\x93\x2d\xaa\xea\xca\x9a\x10\x7d\xf2\xc6\x10\x15\x9a\x22\xd5\xa8\
\x7c\xbc\x05\x23\x98\xcb\xca\x80\x25\x4e\x17\x30\xf1\xb2\x08\x55\
\xf3\x88\x0b\x32\xc1\xbf\x99\x17\x45\x75\xa4\xda\xe1\x32\x9d\xc6\
\xb7\x15\xe7\xed\xaa\xf7\x8d\xc9\xa8\x80\x03\xd1\xc0\x61\xa4\xbb\
\x3b\xa7\x81\x63\x01\x87\x4a\xe4\x8d\xda\x6c\x00\x43\xcd\xfd\x22\
\xcf\xce\xae\x96\xfa\x1c\x5b\x77\xde\x37\x81\x66\x3e\xd0\x9f\x70\
\x45\x19\xae\x54\x2a\x03\x4c\xb7\xa1\xd5\xab\x43\x87\x23\x2a\x3d\
\x05\x1b\x1c\xf5\x2a\x64\xb0\x94\xe6\x44\xd0\xef\x55\x38\xa1\x74\
\xab\xae\x70\x0d\xd2\x06\xb8\x0d\x90\xae\x86\x8d\xa6\xc5\x1b\x01\
\x93\x73\xb5\xd6\x1f\x32\x29\x11\xc6\x22\xc9\x94\x2c\x41\x99\x8e\
\x83\xb1\x91\x75\x46\x14\xe7\xd1\x2d\x4d\xda\x83\xea\x36\xa4\x29\
\xc1\x5f\x19\x02\x09\x1a\x01\xc6\x60\x46\xbe\x63\x90\x11\x3e\xfe\
\x17\x49\xf1\xe1\xb1\xd6\x70\x42\xeb\xac\xb9\xa0\xfb\x6a\xf8\x0b\
\x08\xdc\xfe\x60\xa0\x48\x38\xa8\x89\xa6\x02\x80\xb9\x07\xa7\xb8\
\x34\xe6\xb1\x2a\x1e\x47\x19\xb8\x07\x27\x28\xd5\x4f\xd5\x65\x6b\
\x98\x7a\x98\xd7\x0a\xe6\x3f\x99\xda\x6e\xd6\x46\x98\x9f\x23\xa2\
\x60\xd2\xab\x85\xc6\x1e\x0b\x92\x32\x77\xe3\xc9\xf0\x7e\x6b\x9f\
\x79\x60\xe7\xfb\xec\xae\xb2\xdf\xb1\x0d\x13\x2e\x69\xb2\x22\xde\
\x96\x34\xb7\xa2\xcc\x9d\x11\x26\x0a\x32\x5f\x66\x02\x5e\x8e\x35\
\xef\xa1\xff\x37\xde\x7c\x4e\xde\xbc\x6f\x2f\xde\x8e\x39\x47\x45\
\xb4\x3d\x2f\x7d\x1e\x0c\x7a\x1d\xf4\x79\x7c\xda\x45\x9f\xef\x8e\
\x5f\x88\x3e\x97\x58\xbd\x71\xe8\xfa\xc2\xf3\x78\xbb\xc2\x73\xb0\
\xbb\xc2\x53\x9f\x7d\x5e\x90\x44\x8f\xde\x48\x74\x3d\xd6\xcf\x4d\
\xa2\x87\x9d\x8b\xb1\x09\x75\x0d\x4e\x3b\x98\xeb\xb0\xdf\xc5\x5c\
\x47\x2f\xc5\x5c\xdf\x75\x2e\xbc\x5e\xda\xaa\x0a\x2b\xba\x56\xc6\
\x3d\xe2\x96\xa0\xdc\x7c\x1f\x76\x4f\x70\x7d\x79\x4e\x68\x9c\x70\
\x21\x77\x7d\x39\xb0\xbb\xab\x81\xc1\xc3\x19\xba\x4c\xb3\x10\xfc\
\x1f\xab\xf8\x2c\x73\x4c\x09\xc6\xe5\x75\x4a\x3b\x56\x5d\x35\xca\
\xf5\x04\xcb\x13\x53\xa6\x68\x65\x10\xfc\xa6\xeb\x15\x84\xf2\xaf\
\x04\xd8\x28\x04\x3c\xdb\x19\x4c\x41\xb1\x3a\xb6\xc6\x40\xb2\x54\
\x8d\xc3\xf3\x0c\x47\x9e\x9f\x12\xc9\xf3\x21\x24\xe6\x42\x7f\x96\
\xc8\x45\xb2\x41\x09\xbd\xc1\x56\xf3\x35\xad\x3b\x37\x21\xde\x9d\
\x47\x71\x03\x8b\xe0\xf1\x06\x37\x48\x67\x9c\xfc\xf5\xc4\x5f\x3a\
\xf0\x2a\x53\x7a\xfb\x38\x3f\x7c\x8a\x38\xdf\xa6\x1a\x3f\x17\xe0\
\x49\x48\x89\x26\x97\x54\x17\x29\xe0\xf9\xa1\xb9\x54\x34\xe5\xb7\
\x8e\xda\xa7\x08\x5a\x4d\x70\x58\x1d\x61\x92\x30\xac\x3b\x52\x32\
\x5e\x6c\x9b\x21\x1b\x04\xac\xaf\x67\x8e\x31\xab\xdd\x48\xdf\x02\
\xb6\x35\x60\x8f\x9e\x24\x60\xbb\x2b\x9f\xf5\x11\x73\x6d\xf8\x74\
\x92\x09\x46\xf5\x01\xf1\x17\xdf\x63\x24\xf6\x7e\x80\xa6\xe7\x98\
\x07\x10\x91\x10\xbc\xbb\xc5\xaf\xcf\x12\x43\x86\xdf\x31\x86\x2e\
\x0b\x8f\x5e\x65\x18\x3d\x5d\x29\x73\xb8\x59\x29\xd3\xbf\x20\x02\
\x58\x00\xaa\xb1\xf3\x6f\x3a\x0e\x77\x57\xce\x9c\x3c\x49\xd6\x74\
\x1f\xde\x3a\x69\x7e\x14\xf2\x19\x09\x60\x9c\x4d\x09\x65\x48\xf2\
\xb1\x3e\xe4\x91\x20\x53\x52\xd2\x01\xeb\x06\xf1\xbb\x3e\x6d\xb5\
\x75\x63\x01\xcb\x25\xe3\x46\x0c\x69\xea\x4d\x9f\x89\xeb\x95\x03\
\xdf\xfe\xfe\x7c\xa1\x2c\xbf\xca\x0c\xdd\x3e\x64\xdf\x6d\x77\x47\
\xf2\x58\x46\x3f\x47\x2f\x3d\xdc\x89\x53\x12\x51\xa6\x58\x9c\xfa\
\x3f\x18\x86\x06\x11\x2a\x42\x5f\xee\xa2\xa4\x7b\x3e\x6f\x17\x25\
\x3b\xb9\x28\xb9\xe0\x19\x1e\x4f\x46\x09\x65\x6d\xbc\x17\x68\x69\
\x8a\xd2\xad\xce\x72\xa3\x04\x7c\x3a\xa1\x58\xe3\x2a\x16\x8a\x3d\
\x86\x45\x26\x45\xf6\xd1\x15\xc3\x1d\x85\x19\x04\xf5\xd8\x8b\xb3\
\x54\xaa\x03\x9d\x97\x24\x11\x45\x31\x9e\xe4\x7c\x8c\x53\x35\x6a\
\x0b\xbe\xba\xf3\xa2\x0c\x6a\x3e\x9a\x39\xba\xfd\xfd\x5e\xf5\xc7\
\xb1\x73\xc9\x53\xb2\x22\xe6\xde\x27\x9c\xd2\x6d\x31\xef\x57\xc9\
\x8c\x9b\xd7\x2e\x15\x62\x28\x6a\x84\xea\x57\xf7\x0f\xe1\x83\x92\
\x0a\xbe\xe5\x3a\x2a\x44\xd0\xac\x57\x36\x48\xff\x6a\xe6\xe7\x49\
\xdf\x6f\x24\x7d\x91\xef\x47\x8d\x7c\xaf\xa4\x7a\xdd\x95\x4a\x82\
\x97\x20\xad\x20\xb9\x02\x63\xbe\xd5\x14\xdf\xe4\xe4\xaf\xda\x0c\
\xad\x63\x8b\x98\x77\x66\x86\xd6\xc1\x81\x65\xab\x91\x09\x9d\xc7\
\x5e\x32\xc9\x98\xaf\x80\x72\xff\xbb\xd1\xed\x4b\xc1\xe3\xcf\x98\
\x90\x23\x9e\x09\x1f\xeb\xe7\xda\x28\xf5\xda\x14\xa6\x23\x8f\x8d\
\xc5\x54\x7b\xb2\xda\x63\xbc\x5c\x79\xb5\x6a\xe5\xfa\xb5\x7c\x9d\
\x4a\xad\xc7\x5c\x62\x09\x92\xba\x5f\x6e\xb2\x34\x2c\xe4\x45\xe7\
\x9e\x81\xcb\xc3\x12\x45\x69\xb1\xcd\xeb\x56\xe9\x7e\xa8\x90\xd3\
\xbd\x1a\x81\xba\xe1\x6e\x4f\x6a\x97\xc1\xad\xde\x34\x5d\x5e\xe7\
\x92\xd2\xb6\x3b\xb7\xf2\x6a\xb3\x1d\xa1\x52\xfa\x2c\xce\x54\xf6\
\x81\x76\x8f\x6a\x43\xb6\x77\xab\xda\xa1\xdf\xb8\x13\x90\xea\x18\
\x4c\x75\xb4\xfa\x9c\x31\xd0\x31\xa8\xda\x8e\x9d\x51\x77\xef\x7f\
\xd6\x19\x97\xf4\
\x00\x00\x07\x4c\
\x00\
\x00\x29\xd1\x78\x9c\xed\x59\x5b\x8f\xe2\x46\x16\x7e\xef\x5f\xe1\
@ -11371,35 +11386,35 @@ qt_resource_struct = "\
\x00\x00\x01\x8a\x00\x00\x00\x00\x00\x01\x00\x01\x1d\x6e\
\x00\x00\x00\xba\x00\x00\x00\x00\x00\x01\x00\x00\x6c\x7e\
\x00\x00\x00\x38\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
\x00\x00\x05\x6e\x00\x01\x00\x00\x00\x01\x00\x02\x52\xde\
\x00\x00\x04\x7a\x00\x00\x00\x00\x00\x01\x00\x02\x15\x0f\
\x00\x00\x03\x16\x00\x00\x00\x00\x00\x01\x00\x01\xb7\x13\
\x00\x00\x06\x9e\x00\x01\x00\x00\x00\x01\x00\x02\xa9\x48\
\x00\x00\x05\x40\x00\x01\x00\x00\x00\x01\x00\x02\x4c\x0c\
\x00\x00\x03\x50\x00\x01\x00\x00\x00\x01\x00\x01\xc5\x82\
\x00\x00\x03\xa2\x00\x01\x00\x00\x00\x01\x00\x01\xd9\x09\
\x00\x00\x02\xba\x00\x01\x00\x00\x00\x01\x00\x01\x9c\x71\
\x00\x00\x06\x38\x00\x00\x00\x00\x00\x01\x00\x02\x86\x04\
\x00\x00\x04\xba\x00\x00\x00\x00\x00\x01\x00\x02\x2e\xe9\
\x00\x00\x04\x5a\x00\x01\x00\x00\x00\x01\x00\x02\x0d\x47\
\x00\x00\x02\x98\x00\x01\x00\x00\x00\x01\x00\x01\x93\x78\
\x00\x00\x06\x0e\x00\x01\x00\x00\x00\x01\x00\x02\x7e\x6f\
\x00\x00\x03\x7e\x00\x01\x00\x00\x00\x01\x00\x01\xce\xda\
\x00\x00\x02\x4e\x00\x01\x00\x00\x00\x01\x00\x01\x82\xd0\
\x00\x00\x02\x78\x00\x01\x00\x00\x00\x01\x00\x01\x8c\x78\
\x00\x00\x04\xea\x00\x01\x00\x00\x00\x01\x00\x02\x3e\x57\
\x00\x00\x04\x0e\x00\x00\x00\x00\x00\x01\x00\x01\xf5\x04\
\x00\x00\x05\x18\x00\x01\x00\x00\x00\x01\x00\x02\x43\xa7\
\x00\x00\x04\x38\x00\x01\x00\x00\x00\x01\x00\x02\x05\x85\
\x00\x00\x05\x98\x00\x00\x00\x00\x00\x01\x00\x02\x59\xb8\
\x00\x00\x03\xc6\x00\x01\x00\x00\x00\x01\x00\x01\xde\x20\
\x00\x00\x05\xe2\x00\x01\x00\x00\x00\x01\x00\x02\x75\xf5\
\x00\x00\x05\xc2\x00\x01\x00\x00\x00\x01\x00\x02\x6b\xbb\
\x00\x00\x04\x9a\x00\x01\x00\x00\x00\x01\x00\x02\x28\xd1\
\x00\x00\x06\x64\x00\x00\x00\x00\x00\x01\x00\x02\x97\xd3\
\x00\x00\x02\xec\x00\x00\x00\x00\x00\x01\x00\x01\xa4\xb3\
\x00\x00\x03\xf0\x00\x00\x00\x00\x00\x01\x00\x01\xe6\x08\
\x00\x00\x02\x1a\x00\x01\x00\x00\x00\x01\x00\x01\x7b\x80\
\x00\x00\x05\x6e\x00\x01\x00\x00\x00\x01\x00\x02\x53\xc3\
\x00\x00\x04\x7a\x00\x00\x00\x00\x00\x01\x00\x02\x15\xf4\
\x00\x00\x03\x16\x00\x00\x00\x00\x00\x01\x00\x01\xb7\xf8\
\x00\x00\x06\x9e\x00\x01\x00\x00\x00\x01\x00\x02\xaa\x2d\
\x00\x00\x05\x40\x00\x01\x00\x00\x00\x01\x00\x02\x4c\xf1\
\x00\x00\x03\x50\x00\x01\x00\x00\x00\x01\x00\x01\xc6\x67\
\x00\x00\x03\xa2\x00\x01\x00\x00\x00\x01\x00\x01\xd9\xee\
\x00\x00\x02\xba\x00\x01\x00\x00\x00\x01\x00\x01\x9d\x56\
\x00\x00\x06\x38\x00\x00\x00\x00\x00\x01\x00\x02\x86\xe9\
\x00\x00\x04\xba\x00\x00\x00\x00\x00\x01\x00\x02\x2f\xce\
\x00\x00\x04\x5a\x00\x01\x00\x00\x00\x01\x00\x02\x0e\x2c\
\x00\x00\x02\x98\x00\x01\x00\x00\x00\x01\x00\x01\x94\x5d\
\x00\x00\x06\x0e\x00\x01\x00\x00\x00\x01\x00\x02\x7f\x54\
\x00\x00\x03\x7e\x00\x01\x00\x00\x00\x01\x00\x01\xcf\xbf\
\x00\x00\x02\x4e\x00\x01\x00\x00\x00\x01\x00\x01\x83\xb5\
\x00\x00\x02\x78\x00\x01\x00\x00\x00\x01\x00\x01\x8d\x5d\
\x00\x00\x04\xea\x00\x01\x00\x00\x00\x01\x00\x02\x3f\x3c\
\x00\x00\x04\x0e\x00\x00\x00\x00\x00\x01\x00\x01\xf5\xe9\
\x00\x00\x05\x18\x00\x01\x00\x00\x00\x01\x00\x02\x44\x8c\
\x00\x00\x04\x38\x00\x01\x00\x00\x00\x01\x00\x02\x06\x6a\
\x00\x00\x05\x98\x00\x00\x00\x00\x00\x01\x00\x02\x5a\x9d\
\x00\x00\x03\xc6\x00\x01\x00\x00\x00\x01\x00\x01\xdf\x05\
\x00\x00\x05\xe2\x00\x01\x00\x00\x00\x01\x00\x02\x76\xda\
\x00\x00\x05\xc2\x00\x01\x00\x00\x00\x01\x00\x02\x6c\xa0\
\x00\x00\x04\x9a\x00\x01\x00\x00\x00\x01\x00\x02\x29\xb6\
\x00\x00\x06\x64\x00\x00\x00\x00\x00\x01\x00\x02\x98\xb8\
\x00\x00\x02\xec\x00\x00\x00\x00\x00\x01\x00\x01\xa5\x98\
\x00\x00\x03\xf0\x00\x00\x00\x00\x00\x01\x00\x01\xe6\xed\
\x00\x00\x02\x1a\x00\x01\x00\x00\x00\x01\x00\x01\x7c\x65\
\x00\x00\x01\xf2\x00\x01\x00\x00\x00\x01\x00\x01\x76\xac\
"

View File

@ -3,43 +3,525 @@
<context>
<name>Arch</name>
<message>
<location filename="Component.py" line="151"/>
<location filename="ArchWindow.py" line="472"/>
<source>Components</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Component.py" line="153"/>
<source>Remove child</source>
<location filename="ArchComponent.py" line="248"/>
<source>Components of this object</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Component.py" line="154"/>
<source>Components of this object</source>
<location filename="ArchComponent.py" line="253"/>
<source>Axes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchAxis.py" line="60"/>
<source>Create Axis</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchAxis.py" line="74"/>
<source>The intervals between axes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchAxis.py" line="75"/>
<source>The angles of each axis</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchAxis.py" line="76"/>
<source>The length of the axes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchAxis.py" line="109"/>
<source>The size of the axis bubbles</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchAxis.py" line="110"/>
<source>The numeration style</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="466"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="467"/>
<source>Add</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchAxis.py" line="353"/>
<source>Distances and angles between axes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchAxis.py" line="354"/>
<source>Axis</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchAxis.py" line="354"/>
<source>Distance</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchAxis.py" line="354"/>
<source>Angle</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchBuilding.py" line="32"/>
<source>Building</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchSite.py" line="55"/>
<source>Type conversion</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchBuilding.py" line="63"/>
<source> Create Building</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchFloor.py" line="70"/>
<source>Floor</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="131"/>
<source>removing sketch support to avoid cross-referencing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="294"/>
<source>No objects are cut by the plane</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="476"/>
<source>is not closed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="478"/>
<source>is not valid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="480"/>
<source>doesn&apos;t contain any solid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="486"/>
<source>contains a non-closed solid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="488"/>
<source>contains faces that are not part of any solid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="509"/>
<source>Grouping</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="539"/>
<source>Ungrouping</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="573"/>
<source>Split Mesh</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="611"/>
<source>Mesh to Shape</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="695"/>
<source>All good! no problems found</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchComponent.py" line="249"/>
<source>Base component</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchComponent.py" line="250"/>
<source>Additions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchComponent.py" line="251"/>
<source>Subtractions</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchComponent.py" line="252"/>
<source>Objects</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchComponent.py" line="321"/>
<source>closing Sketch edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchFloor.py" line="79"/>
<source>The height of this floor</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchRoof.py" line="33"/>
<source>Roof</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchRoof.py" line="76"/>
<source>Create Roof</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchRoof.py" line="83"/>
<source>Unable to create a roof</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchRoof.py" line="85"/>
<source>No object selected</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchRoof.py" line="91"/>
<source>The angle of this roof</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchRoof.py" line="93"/>
<source>The face number of the base object used to build this roof</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchSectionPlane.py" line="55"/>
<source>Page</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchSectionPlane.py" line="65"/>
<source>View of</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchSectionPlane.py" line="84"/>
<source>Create Section Plane</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchSectionPlane.py" line="95"/>
<source>The objects that must be considered by this section plane. Empty means all document</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchSectionPlane.py" line="116"/>
<source>The display size of this section plane</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchSectionPlane.py" line="236"/>
<source>No shape has been computed yet, select wireframe rendering and render again</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchSectionPlane.py" line="280"/>
<source>Skipping invalid object: </source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchSite.py" line="32"/>
<source>Site</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchSite.py" line="73"/>
<source>Create Site</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchStructure.py" line="33"/>
<source>Structure</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchStructure.py" line="71"/>
<source>Create Structure</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchStructure.py" line="93"/>
<source>The length of this element, if not based on a profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchStructure.py" line="95"/>
<source>The width of this element, if not based on a profile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchStructure.py" line="97"/>
<source>The height or extrusion depth of this element. Keep 0 for automatic</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchStructure.py" line="99"/>
<source>Axes systems this structure is built on</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="256"/>
<source>The normal extrusion direction of this object (keep (0,0,0) for automatic normal)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchStructure.py" line="103"/>
<source>The element numbers to exclude when this structure is based on axes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="438"/>
<source>Couldn&apos;t compute the wall shape</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="33"/>
<source>Wall</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="151"/>
<source>Create Wall</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="175"/>
<source>WallTrace</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="197"/>
<source>Wall options</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="201"/>
<source>Width</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="209"/>
<source>Height</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="217"/>
<source>Alignment</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="224"/>
<source>Continue</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="250"/>
<source>The width of this wall. Not used if this wall is based on a face</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="252"/>
<source>The height of this wall. Keep 0 for automatic. Not used if this wall is based on a solid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="254"/>
<source>The alignment of this wall on its base object, if applicable</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="258"/>
<source>If True, if this wall is based on a face, it will use its border wire as trace, and disconsider the face.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="384"/>
<source>Error: Invalid base object</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="393"/>
<source>This mesh is an invalid solid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWall.py" line="443"/>
<source>Error removing splitter from wall shape</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="33"/>
<source>Window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="93"/>
<source>Create Window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="114"/>
<source>the components of this window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="442"/>
<source>Unable to create component</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="468"/>
<source>Edit</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="469"/>
<source>Create/update component</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="470"/>
<source>Base 2D object</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="476"/>
<source>Wires</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="473"/>
<source>Create new component</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="474"/>
<source>Name</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="475"/>
<source>Type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="477"/>
<source>Thickness</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchWindow.py" line="478"/>
<source>Z offset</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="importDAE.py" line="40"/>
<source>pycollada not found, no collada support.
</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="importDAE.py" line="74"/>
<source>Error: Couldn&apos;t determine character encoding</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="importDAE.py" line="152"/>
<source>file %s successfully created.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="importIFC.py" line="83"/>
<source>Error: Couldn&apos;t determine character encoding
</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="importIFC.py" line="105"/>
<source>Couldn&apos;t locate IfcOpenShell
</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="importIFC.py" line="121"/>
<source>IFC Schema not found, IFC import disabled.
</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="importOBJ.py" line="95"/>
<source>successfully written </source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_Add</name>
<message>
<location filename="Commands.py" line="221"/>
<location filename="ArchCommands.py" line="498"/>
<source>Add component</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Commands.py" line="222"/>
<location filename="ArchCommands.py" line="499"/>
<source>Adds the selected components to the active object</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_Axis</name>
<message>
<location filename="ArchAxis.py" line="55"/>
<source>Axis</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchAxis.py" line="57"/>
<source>Creates an axis system.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_Building</name>
<message>
<location filename="Building.py" line="47"/>
<location filename="ArchBuilding.py" line="46"/>
<source>Building</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Building.py" line="49"/>
<location filename="ArchBuilding.py" line="48"/>
<source>Creates a building object including selected objects.</source>
<translation type="unfinished"></translation>
</message>
@ -47,54 +529,80 @@
<context>
<name>Arch_Cell</name>
<message>
<location filename="Cell.py" line="49"/>
<location filename="ArchCell.py" line="50"/>
<source>Cell</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Cell.py" line="51"/>
<location filename="ArchCell.py" line="52"/>
<source>Creates a cell object including selected objects</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_Check</name>
<message>
<location filename="ArchCommands.py" line="683"/>
<source>Check</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="684"/>
<source>Checks the selected objects for problems</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_CloseHoles</name>
<message>
<location filename="ArchCommands.py" line="664"/>
<source>Close holes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="665"/>
<source>Closes holes in open shapes, turning them solids</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_Floor</name>
<message>
<location filename="Floor.py" line="48"/>
<location filename="ArchFloor.py" line="47"/>
<source>Floor</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Floor.py" line="50"/>
<location filename="ArchFloor.py" line="49"/>
<source>Creates a floor object including selected objects</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_MeshToPart</name>
<message>
<location filename="Commands.py" line="294"/>
<source>Turns selected meshes into Part Shape objects</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_MeshToShape</name>
<message>
<location filename="Commands.py" line="293"/>
<location filename="ArchCommands.py" line="589"/>
<source>Mesh to Shape</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchCommands.py" line="590"/>
<source>Turns selected meshes into Part Shape objects</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_Remove</name>
<message>
<location filename="Commands.py" line="242"/>
<location filename="ArchCommands.py" line="528"/>
<source>Remove component</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Commands.py" line="243"/>
<location filename="ArchCommands.py" line="529"/>
<source>Remove the selected components from their parents, or create a hole in a component</source>
<translation type="unfinished"></translation>
</message>
@ -102,38 +610,51 @@
<context>
<name>Arch_RemoveShape</name>
<message>
<location filename="Commands.py" line="350"/>
<location filename="ArchCommands.py" line="647"/>
<source>Remove Shape from Arch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Commands.py" line="351"/>
<location filename="ArchCommands.py" line="648"/>
<source>Removes cubic shapes from Arch components</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_Roof</name>
<message>
<location filename="ArchRoof.py" line="50"/>
<source>Roof</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="ArchRoof.py" line="52"/>
<source>Creates a roof object from the selected face of an object</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_SectionPlane</name>
<message>
<location filename="SectionPlane.py" line="12"/>
<location filename="ArchSectionPlane.py" line="73"/>
<source>Section Plane</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="SectionPlane.py" line="13"/>
<source>Adds a section plane object to the document</source>
<location filename="ArchSectionPlane.py" line="74"/>
<source>Creates a section plane object, including the selected objects</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Arch_SelectNonSolidMeshes</name>
<message>
<location filename="Commands.py" line="325"/>
<location filename="ArchCommands.py" line="622"/>
<source>Select non-manifold meshes</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Commands.py" line="326"/>
<location filename="ArchCommands.py" line="623"/>
<source>Selects all non-manifold meshes from the document or from the selected groups</source>
<translation type="unfinished"></translation>
</message>
@ -141,12 +662,12 @@
<context>
<name>Arch_Site</name>
<message>
<location filename="Site.py" line="45"/>
<location filename="ArchSite.py" line="46"/>
<source>Site</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Site.py" line="47"/>
<location filename="ArchSite.py" line="48"/>
<source>Creates a site object including selected objects.</source>
<translation type="unfinished"></translation>
</message>
@ -154,12 +675,12 @@
<context>
<name>Arch_SplitMesh</name>
<message>
<location filename="Commands.py" line="266"/>
<location filename="ArchCommands.py" line="561"/>
<source>Split Mesh</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Commands.py" line="267"/>
<location filename="ArchCommands.py" line="562"/>
<source>Splits selected meshes into independent components</source>
<translation type="unfinished"></translation>
</message>
@ -167,12 +688,12 @@
<context>
<name>Arch_Structure</name>
<message>
<location filename="Structure.py" line="63"/>
<location filename="ArchStructure.py" line="66"/>
<source>Structure</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Structure.py" line="65"/>
<location filename="ArchStructure.py" line="68"/>
<source>Creates a structure object from scratch or from a selected object (sketch, wire, face or solid)</source>
<translation type="unfinished"></translation>
</message>
@ -180,12 +701,12 @@
<context>
<name>Arch_Wall</name>
<message>
<location filename="Wall.py" line="56"/>
<location filename="ArchWall.py" line="100"/>
<source>Wall</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Wall.py" line="58"/>
<location filename="ArchWall.py" line="102"/>
<source>Creates a wall object from scratch or from a selected object (wire, face or solid)</source>
<translation type="unfinished"></translation>
</message>
@ -193,13 +714,13 @@
<context>
<name>Arch_Window</name>
<message>
<location filename="Window.py" line="53"/>
<location filename="ArchWindow.py" line="74"/>
<source>Window</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="Window.py" line="55"/>
<source>Creates a window object from scratch or from a selected object (wire, rectangle or sketch)</source>
<location filename="ArchWindow.py" line="76"/>
<source>Creates a window object from a selected object (wire, rectangle or sketch)</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -235,32 +756,113 @@
<source>This is the default color for new Structure objects</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="122"/>
<source>Default color for windows</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="164"/>
<source>IFC import</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="172"/>
<source>If this is checked, the IFCOpenShell importer will be used, allowing to import more IFC types</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="175"/>
<source>Use IFCOpenShell if available</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="192"/>
<source>Creates groups for each Arch object type</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="195"/>
<source>Group components by types</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="212"/>
<source>Import furniture (can make the model heavy)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="230"/>
<source>2D rendering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="238"/>
<source>Show debug information during 2D rendering</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="241"/>
<source>Show renderer debug messages</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="258"/>
<source>Cut areas line thickness ratio</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="archprefs-base.ui" line="278"/>
<source>Specifies how many times the viewed line thickness must be applied to cut lines</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>arch</name>
<message>
<location filename="InitGui.py" line="50"/>
<location filename="InitGui.py" line="86"/>
<source>Arch tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="InitGui.py" line="51"/>
<location filename="InitGui.py" line="87"/>
<source>Draft tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="InitGui.py" line="53"/>
<source>Architecture</source>
<location filename="InitGui.py" line="88"/>
<source>Draft mod tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="InitGui.py" line="52"/>
<source>Tools</source>
<location filename="InitGui.py" line="91"/>
<source>&amp;Architecture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="InitGui.py" line="54"/>
<source>Draft</source>
<location filename="InitGui.py" line="89"/>
<source>Conversion Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="InitGui.py" line="90"/>
<source>Calculation Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="InitGui.py" line="93"/>
<source>&amp;Draft</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="InitGui.py" line="93"/>
<source>Context Tools</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="InitGui.py" line="127"/>
<source>pycollada not found, collada support will be disabled.
</source>
<translation type="unfinished"></translation>
</message>
</context>

View File

@ -224,6 +224,75 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>2D rendering</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_7">
<item>
<widget class="Gui::PrefCheckBox" name="gui::prefcheckbox_4">
<property name="toolTip">
<string>Show debug information during 2D rendering</string>
</property>
<property name="text">
<string>Show renderer debug messages</string>
</property>
<property name="prefEntry" stdset="0">
<cstring>ShowVRMDebug</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Arch</cstring>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Cut areas line thickness ratio</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="Gui::PrefDoubleSpinBox" name="gui::prefdoublespinbox">
<property name="toolTip">
<string>Specifies how many times the viewed line thickness must be applied to cut lines</string>
</property>
<property name="value">
<double>2.000000000000000</double>
</property>
<property name="prefEntry" stdset="0">
<cstring>CutLineThickness</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/Arch</cstring>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
@ -257,6 +326,11 @@
<extends>QCheckBox</extends>
<header>Gui/PrefWidgets.h</header>
</customwidget>
<customwidget>
<class>Gui::PrefDoubleSpinBox</class>
<extends>QDoubleSpinBox</extends>
<header>Gui/PrefWidgets.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>

View File

@ -22,6 +22,7 @@
#***************************************************************************
import FreeCAD, Mesh, os, numpy
from DraftTools import translate
__title__="FreeCAD Collada importer"
__author__ = "Yorik van Havre"
@ -36,7 +37,7 @@ def checkCollada():
try:
import collada
except:
FreeCAD.Console.PrintError("pycollada not found, no collada support.\n")
FreeCAD.Console.PrintError(str(translate("Arch","pycollada not found, no collada support.\n")))
return False
else:
return True
@ -70,7 +71,7 @@ def decode(name):
try:
decodedName = (name.decode("latin1"))
except UnicodeDecodeError:
print "ifc: error: couldn't determine character encoding"
FreeCAD.Console.PrintError(str(translate("Arch","Error: Couldn't determine character encoding")))
decodedName = name
return decodedName
@ -148,4 +149,4 @@ def export(exportList,filename):
colmesh.scenes.append(myscene)
colmesh.scene = myscene
colmesh.write(filename)
print "file ",filename," successfully created."
FreeCAD.Console.PrintMessage(str(translate("Arch","file %s successfully created.")) % filename)

View File

@ -22,6 +22,7 @@
#***************************************************************************
import ifcReader, FreeCAD, Arch, Draft, os, sys, time, Part, DraftVecUtils
from DraftTools import translate
__title__="FreeCAD IFC importer"
__author__ = "Yorik van Havre"
@ -79,7 +80,7 @@ def decode(name):
try:
decodedName = (name.decode("latin1"))
except UnicodeDecodeError:
print "ifc: error: couldn't determine character encoding"
FreeCAD.Console.PrintError(str(translate("Arch", "Error: Couldn't determine character encoding\n")))
decodedName = name
return decodedName
@ -101,7 +102,7 @@ def getIfcOpenShell():
global IfcImport
import IfcImport
except:
print "Couldn't import IfcOpenShell"
FreeCAD.Console.PrintMessage(str(translate("Arch","Couldn't locate IfcOpenShell\n")))
return False
else:
return True
@ -117,7 +118,7 @@ def read(filename):
if DEBUG: print "opening",filename,"..."
ifc = ifcReader.IfcDocument(filename,schema=schema,debug=DEBUG)
else:
FreeCAD.Console.PrintWarning("IFC Schema not found, IFC import disabled.\n")
FreeCAD.Console.PrintWarning(str(translate("Arch","IFC Schema not found, IFC import disabled.\n")))
return None
t2 = time.time()
if DEBUG: print "Successfully loaded",ifc,"in %s s" % ((t2-t1))
@ -419,7 +420,8 @@ def getShape(obj):
m[1], m[4], m[7], m[10],
m[2], m[5], m[8], m[11],
0, 0, 0, 1)
sh.Placement = FreeCAD.Placement(mat)
sh.Placement = FreeCAD.Placement(mat)
if DEBUG: print "getting Shape from ",obj
return sh
def getWire(entity,placement=None):

View File

@ -22,6 +22,7 @@
#***************************************************************************
import FreeCAD, DraftGeomUtils, Part, Draft
from DraftTools import translate
p = Draft.precision()
@ -91,7 +92,7 @@ def export(exportList,filename):
for f in flist:
outfile.write("f" + f + "\n")
outfile.close()
FreeCAD.Console.PrintMessage("successfully written "+filename)
FreeCAD.Console.PrintMessage(str(translate("Arch","successfully written "))+filename)

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Samevoeging</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Samevoeging</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Samevoeging</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Samevoeging</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Beperking met 'n as...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Beperking met &apos;n as...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>definieer 'n bewegingsbeperking tussen twee voorwerpe met 'n as</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>definieer &apos;n bewegingsbeperking tussen twee voorwerpe met &apos;n as</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Samevoeging</translation>
<source>Assembly</source>
<translation type="obsolete">Samevoeging</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Baugruppe</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Baugruppe</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Baugruppe</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Baugruppe</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Achseneinschränkung...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Achseneinschränkung...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>Festlegen der Achsen-Einschränkung zwischen zwei Objekten</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>Festlegen der Achsen-Einschränkung zwischen zwei Objekten</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Baugruppe</translation>
<source>Assembly</source>
<translation type="obsolete">Baugruppe</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Ensamblaje</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Ensamblaje</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Ensamblaje</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Ensamblaje</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Restricción de eje...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Restricción de eje...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>definir una restricción de eje entre dos objetos</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>definir una restricción de eje entre dos objetos</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Ensamblaje</translation>
<source>Assembly</source>
<translation type="obsolete">Ensamblaje</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Kokoonpano</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Kokoonpano</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Kokoonpano</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Kokoonpano</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Akseli rajoite...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Akseli rajoite...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>aseta akselirajoite kahden kohteen välille</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>aseta akselirajoite kahden kohteen välille</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Kokoonpano</translation>
<source>Assembly</source>
<translation type="obsolete">Kokoonpano</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Assemblage</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Assemblage</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Assemblage</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Assemblage</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Contrainte axiale...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Contrainte axiale...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>définir une contrainte axiale entre deux objets</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>définir une contrainte axiale entre deux objets</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Assemblage</translation>
<source>Assembly</source>
<translation type="obsolete">Assemblage</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Montaža</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Montaža</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Montaža</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Montaža</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Ograničena osovina...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Ograničena osovina...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>postaviti ograničenja osovine između dva objekta</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>postaviti ograničenja osovine između dva objekta</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Montaža</translation>
<source>Assembly</source>
<translation type="obsolete">Montaža</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Összeállítás</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Összeállítás</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Összeállítás</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Összeállítás</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Tengely menti kötés...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Tengely menti kötés...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>tengely kötést hoz létre két tárgy között</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>tengely kötést hoz létre két tárgy között</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Összeállítás</translation>
<source>Assembly</source>
<translation type="obsolete">Összeállítás</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Assembly</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Assembly</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Assembly</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Assembly</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Vincolo assiale...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Vincolo assiale...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>Imposta un vincolo assiale tra due oggetti</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>Imposta un vincolo assiale tra due oggetti</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Assembly</translation>
<source>Assembly</source>
<translation type="obsolete">Assembly</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation></translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation></translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation></translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation></translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation></translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation></translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation></translation>
<source>Assembly</source>
<translation type="obsolete"></translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Samenstelling</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Samenstelling</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Samenstelling</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Samenstelling</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>As-beperking...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>As-beperking...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>Stel een as-beperking tussen twee objecten in</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>Stel een as-beperking tussen twee objecten in</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Samenstelling</translation>
<source>Assembly</source>
<translation type="obsolete">Samenstelling</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Montering</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Montering</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Montering</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Montering</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Aksellås...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Aksellås...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>sett en aksellås mellom to objekter</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>sett en aksellås mellom to objekter</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Montering</translation>
<source>Assembly</source>
<translation type="obsolete">Montering</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Złożenie</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Złożenie</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Złożenie</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Złożenie</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Ograniczenie osi ...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Ograniczenie osi ...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>ustaw graniczną między dwoma obiektami</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>ustaw graniczną między dwoma obiektami</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Złożenie</translation>
<source>Assembly</source>
<translation type="obsolete">Złożenie</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Assemblagem</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Assemblagem</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Assemblagem</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Assemblagem</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Restrição de eixo...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Restrição de eixo...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>definir uma restrição de eixo entre dois objetos</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>definir uma restrição de eixo entre dois objetos</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Assemblagem</translation>
<source>Assembly</source>
<translation type="obsolete">Assemblagem</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Сборка</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Сборка</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Сборка</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Сборка</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Ограничение оси...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Ограничение оси...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>задать ось, ограниченную двумя объектами</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>задать ось, ограниченную двумя объектами</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Сборка</translation>
<source>Assembly</source>
<translation type="obsolete">Сборка</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Ihopsättning</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Ihopsättning</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Ihopsättning</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Ihopsättning</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Begränsningsaxel...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Begränsningsaxel...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>Sätt en axelbegränsning mellan två objekt</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>Sätt en axelbegränsning mellan två objekt</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Ihopsättning</translation>
<source>Assembly</source>
<translation type="obsolete">Ihopsättning</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Збірка</translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation>Збірка</translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Збірка</translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation>Збірка</translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>Обмеження осі...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>Обмеження осі...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation>задати вісь обмежену двома об'єктами</translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation>задати вісь обмежену двома об&apos;єктами</translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation>Збірка</translation>
<source>Assembly</source>
<translation type="obsolete">Збірка</translation>
</message>
</context>
</context>
</TS>

View File

@ -1,35 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS>
<context>
<TS version="2.0">
<context>
<name>AssemblyGui::Workbench</name>
<message>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation></translation>
<location filename="../../Workbench.cpp" line="+50"/>
<source>Assembly</source>
<translation></translation>
</message>
</context>
<context>
</context>
<context>
<name>CmdAssemblyConstraintAxle</name>
<message>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation></translation>
<location filename="../../Command.cpp" line="+42"/>
<source>Assembly</source>
<translation></translation>
</message>
<message>
<source>Constraint Axle...</source>
<translation>...</translation>
<location line="+1"/>
<source>Constraint Axle...</source>
<translation>...</translation>
</message>
<message>
<source>set a axle constraint between two objects</source>
<translation></translation>
<location line="+1"/>
<source>set a axle constraint between two objects</source>
<translation></translation>
</message>
</context>
<context>
</context>
<context>
<name>Workbench</name>
<message>
<source>Assembly</source>
<translation></translation>
<source>Assembly</source>
<translation type="obsolete"></translation>
</message>
</context>
</context>
</TS>

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