This commit is contained in:
Patrick Felixberger
2020-02-20 16:59:05 +01:00
11 changed files with 482 additions and 33 deletions

View File

@@ -257,6 +257,7 @@ Property *DocumentObjectT::getProperty() const {
return obj->getPropertyByName(property.c_str());
return 0;
}
// -----------------------------------------------------------------------------
SubObjectT::SubObjectT()
@@ -387,6 +388,138 @@ std::vector<App::DocumentObject*> SubObjectT::getSubObjectList() const {
}
// -----------------------------------------------------------------------------
class DocumentWeakPtrT::Private {
public:
Private(App::Document* doc) : _document(doc) {
if (doc) {
connectApplicationDeletedDocument = App::GetApplication().signalDeleteDocument.connect(boost::bind
(&Private::deletedDocument, this, _1));
}
}
void deletedDocument(const App::Document& doc) {
if (_document == &doc)
reset();
}
void reset() {
connectApplicationDeletedDocument.disconnect();
_document = nullptr;
}
App::Document* _document;
typedef boost::signals2::scoped_connection Connection;
Connection connectApplicationDeletedDocument;
};
DocumentWeakPtrT::DocumentWeakPtrT(App::Document* doc) noexcept
: d(new Private(doc))
{
}
DocumentWeakPtrT::~DocumentWeakPtrT()
{
}
void DocumentWeakPtrT::reset() noexcept
{
d->reset();
}
bool DocumentWeakPtrT::expired() const noexcept
{
return (d->_document == nullptr);
}
App::Document* DocumentWeakPtrT::operator->() noexcept
{
return d->_document;
}
// -----------------------------------------------------------------------------
class DocumentObjectWeakPtrT::Private {
public:
Private(App::DocumentObject* obj) : object(obj), indocument(false) {
if (obj) {
indocument = true;
connectApplicationDeletedDocument = App::GetApplication().signalDeleteDocument.connect(boost::bind
(&Private::deletedDocument, this, _1));
App::Document* doc = obj->getDocument();
connectDocumentCreatedObject = doc->signalNewObject.connect(boost::bind
(&Private::createdObject, this, _1));
connectDocumentDeletedObject = doc->signalDeletedObject.connect(boost::bind
(&Private::deletedObject, this, _1));
}
}
void deletedDocument(const App::Document& doc) {
// When deleting document then there is no way to undo it
if (object && object->getDocument() == &doc) {
reset();
}
}
void createdObject(const App::DocumentObject& obj) {
// When undoing the removal
if (object == &obj) {
indocument = true;
}
}
void deletedObject(const App::DocumentObject& obj) {
if (object == &obj) {
indocument = false;
}
}
void reset() {
connectApplicationDeletedDocument.disconnect();
connectDocumentCreatedObject.disconnect();
connectDocumentDeletedObject.disconnect();
object = nullptr;
indocument = false;
}
App::DocumentObject* get() const {
return indocument ? object : nullptr;
}
App::DocumentObject* object;
bool indocument;
typedef boost::signals2::scoped_connection Connection;
Connection connectApplicationDeletedDocument;
Connection connectDocumentCreatedObject;
Connection connectDocumentDeletedObject;
};
DocumentObjectWeakPtrT::DocumentObjectWeakPtrT(App::DocumentObject* obj) noexcept
: d(new Private(obj))
{
}
DocumentObjectWeakPtrT::~DocumentObjectWeakPtrT()
{
}
App::DocumentObject* DocumentObjectWeakPtrT::_get() const noexcept
{
return d->get();
}
void DocumentObjectWeakPtrT::reset() noexcept
{
d->reset();
}
bool DocumentObjectWeakPtrT::expired() const noexcept
{
return !d->indocument;
}
App::DocumentObject* DocumentObjectWeakPtrT::operator->() noexcept
{
return d->get();
}
// -----------------------------------------------------------------------------
DocumentObserver::DocumentObserver() : _document(0)
{
this->connectApplicationCreatedDocument = App::GetApplication().signalNewDocument.connect(boost::bind

View File

@@ -27,6 +27,7 @@
#include <Base/BaseClass.h>
#include <boost/signals2.hpp>
#include <set>
#include <memory>
namespace App
{
@@ -144,7 +145,7 @@ private:
std::string property;
};
class AppExport SubObjectT: public DocumentObjectT
class AppExport SubObjectT : public DocumentObjectT
{
public:
/*! Constructor */
@@ -205,6 +206,82 @@ private:
std::string subname;
};
/**
* @brief The DocumentWeakPtrT class
*/
class AppExport DocumentWeakPtrT
{
public:
DocumentWeakPtrT(App::Document*) noexcept;
~DocumentWeakPtrT();
/*!
* \brief reset
* Releases the reference to the managed object. After the call *this manages no object.
*/
void reset() noexcept;
/*!
* \brief expired
* \return true if the managed object has already been deleted, false otherwise.
*/
bool expired() const noexcept;
/*!
* \brief operator ->
* \return pointer to the document
*/
App::Document* operator->() noexcept;
private:
// disable
DocumentWeakPtrT(const DocumentWeakPtrT&);
DocumentWeakPtrT& operator=(const DocumentWeakPtrT&);
class Private;
std::unique_ptr<Private> d;
};
/**
* @brief The DocumentObjectWeakPtrT class
*/
class AppExport DocumentObjectWeakPtrT
{
public:
DocumentObjectWeakPtrT(App::DocumentObject*) noexcept;
~DocumentObjectWeakPtrT();
/*!
* \brief reset
* Releases the reference to the managed object. After the call *this manages no object.
*/
void reset() noexcept;
/*!
* \brief expired
* \return true if the managed object has already been deleted, false otherwise.
*/
bool expired() const noexcept;
/*!
* \brief operator ->
* \return pointer to the document
*/
App::DocumentObject* operator->() noexcept;
/*! Get a pointer to the object or 0 if it doesn't exist any more or the type doesn't match. */
template<typename T>
inline T* get() const noexcept
{
return Base::freecad_dynamic_cast<T>(_get());
}
private:
App::DocumentObject* _get() const noexcept;
// disable
DocumentObjectWeakPtrT(const DocumentObjectWeakPtrT&);
DocumentObjectWeakPtrT& operator=(const DocumentObjectWeakPtrT&);
private:
class Private;
std::unique_ptr<Private> d;
};
/**
* The DocumentObserver class simplfies the step to write classes that listen
* to what happens inside a document.

View File

@@ -199,6 +199,137 @@ std::string ViewProviderT::getObjectPython() const
// -----------------------------------------------------------------------------
class DocumentWeakPtrT::Private {
public:
Private(Gui::Document* doc) : _document(doc) {
if (doc) {
connectApplicationDeletedDocument = doc->signalDeleteDocument.connect(boost::bind
(&Private::deletedDocument, this, _1));
}
}
void deletedDocument(const Gui::Document& doc) {
if (_document == &doc)
reset();
}
void reset() {
connectApplicationDeletedDocument.disconnect();
_document = nullptr;
}
Gui::Document* _document;
typedef boost::signals2::scoped_connection Connection;
Connection connectApplicationDeletedDocument;
};
DocumentWeakPtrT::DocumentWeakPtrT(Gui::Document* doc) noexcept
: d(new Private(doc))
{
}
DocumentWeakPtrT::~DocumentWeakPtrT()
{
}
void DocumentWeakPtrT::reset() noexcept
{
d->reset();
}
bool DocumentWeakPtrT::expired() const noexcept
{
return (d->_document == nullptr);
}
Gui::Document* DocumentWeakPtrT::operator->() noexcept
{
return d->_document;
}
// -----------------------------------------------------------------------------
class ViewProviderWeakPtrT::Private {
public:
Private(ViewProviderDocumentObject* obj) : object(obj), indocument(false) {
if (obj) {
indocument = true;
Gui::Document* doc = obj->getDocument();
connectApplicationDeletedDocument = doc->signalDeleteDocument.connect(boost::bind
(&Private::deletedDocument, this, _1));
connectDocumentCreatedObject = doc->signalNewObject.connect(boost::bind
(&Private::createdObject, this, _1));
connectDocumentDeletedObject = doc->signalDeletedObject.connect(boost::bind
(&Private::deletedObject, this, _1));
}
}
void deletedDocument(const Gui::Document& doc) {
// When deleting document then there is no way to undo it
if (object && object->getDocument() == &doc) {
reset();
}
}
void createdObject(const Gui::ViewProvider& obj) {
// When undoing the removal
if (object == &obj) {
indocument = true;
}
}
void deletedObject(const Gui::ViewProvider& obj) {
if (object == &obj) {
indocument = false;
}
}
void reset() {
connectApplicationDeletedDocument.disconnect();
connectDocumentCreatedObject.disconnect();
connectDocumentDeletedObject.disconnect();
object = nullptr;
indocument = false;
}
ViewProviderDocumentObject* get() const {
return indocument ? object : nullptr;
}
Gui::ViewProviderDocumentObject* object;
bool indocument;
typedef boost::signals2::scoped_connection Connection;
Connection connectApplicationDeletedDocument;
Connection connectDocumentCreatedObject;
Connection connectDocumentDeletedObject;
};
ViewProviderWeakPtrT::ViewProviderWeakPtrT(ViewProviderDocumentObject* obj) noexcept
: d(new Private(obj))
{
}
ViewProviderWeakPtrT::~ViewProviderWeakPtrT()
{
}
ViewProviderDocumentObject* ViewProviderWeakPtrT::_get() const noexcept
{
return d->get();
}
void ViewProviderWeakPtrT::reset() noexcept
{
d->reset();
}
bool ViewProviderWeakPtrT::expired() const noexcept
{
return !d->indocument;
}
ViewProviderDocumentObject* ViewProviderWeakPtrT::operator->() noexcept
{
return d->get();
}
// -----------------------------------------------------------------------------
DocumentObserver::DocumentObserver()
{
}

View File

@@ -118,6 +118,82 @@ private:
std::string object;
};
/**
* @brief The DocumentWeakPtrT class
*/
class GuiExport DocumentWeakPtrT
{
public:
DocumentWeakPtrT(Gui::Document*) noexcept;
~DocumentWeakPtrT();
/*!
* \brief reset
* Releases the reference to the managed object. After the call *this manages no object.
*/
void reset() noexcept;
/*!
* \brief expired
* \return true if the managed object has already been deleted, false otherwise.
*/
bool expired() const noexcept;
/*!
* \brief operator ->
* \return pointer to the document
*/
Gui::Document* operator->() noexcept;
private:
// disable
DocumentWeakPtrT(const DocumentWeakPtrT&);
DocumentWeakPtrT& operator=(const DocumentWeakPtrT&);
class Private;
std::unique_ptr<Private> d;
};
/**
* @brief The ViewProviderWeakPtrT class
*/
class AppExport ViewProviderWeakPtrT
{
public:
ViewProviderWeakPtrT(ViewProviderDocumentObject*) noexcept;
~ViewProviderWeakPtrT();
/*!
* \brief reset
* Releases the reference to the managed object. After the call *this manages no object.
*/
void reset() noexcept;
/*!
* \brief expired
* \return true if the managed object has already been deleted, false otherwise.
*/
bool expired() const noexcept;
/*!
* \brief operator ->
* \return pointer to the document
*/
ViewProviderDocumentObject* operator->() noexcept;
/*! Get a pointer to the object or 0 if it doesn't exist any more or the type doesn't match. */
template<typename T>
inline T* get() const noexcept
{
return Base::freecad_dynamic_cast<T>(_get());
}
private:
ViewProviderDocumentObject* _get() const noexcept;
// disable
ViewProviderWeakPtrT(const ViewProviderWeakPtrT&);
ViewProviderWeakPtrT& operator=(const ViewProviderWeakPtrT&);
private:
class Private;
std::unique_ptr<Private> d;
};
/**
* The DocumentObserver class simplifies the step to write classes that listen
* to what happens inside a document.

View File

@@ -445,7 +445,8 @@ class _TaskPanelFemResultShow:
if len(plt.get_fignums()) > 0:
plt.show()
else:
QtGui.QMessageBox.information(None,
QtGui.QMessageBox.information(
None,
self.result_obj.Label + " - Information",
"No histogram available.\nPlease select a result type first."
)
@@ -518,11 +519,11 @@ class _TaskPanelFemResultShow:
from ply import yacc
import femtools.tokrules as tokrules
identifiers = [
'x', 'y', 'z', 'T', 'vM', 'Peeq', 'P1', 'P2', 'P3',
'sxx', 'syy', 'szz', 'sxy', 'sxz', 'syz',
'exx', 'eyy', 'ezz', 'exy', 'exz', 'eyz',
'MF', 'NP', 'rx', 'ry', 'rz', 'mc',
's1x', 's1y', 's1z', 's2x', 's2y', 's2z', 's3x', 's3y', 's3z'
"x", "y", "z", "T", "vM", "Peeq", "P1", "P2", "P3",
"sxx", "syy", "szz", "sxy", "sxz", "syz",
"exx", "eyy", "ezz", "exy", "exz", "eyz",
"MF", "NP", "rx", "ry", "rz", "mc",
"s1x", "s1y", "s1z", "s2x", "s2y", "s2z", "s3x", "s3y", "s3z"
]
tokrules.names = {}
for i in identifiers:

View File

@@ -320,7 +320,7 @@ class _FemResultMechanical():
if len(obj.Stats) == 39:
temp = obj.Stats
for i in range(12, -1, -1):
del temp [3 * i + 1]
del temp[3 * i + 1]
obj.Stats = temp
def __getstate__(self):

View File

@@ -89,6 +89,9 @@
# include <BRepFill_Filling.hxx>
#endif
#include <cstdio>
#include <fstream>
#include <CXX/Extensions.hxx>
#include <CXX/Objects.hxx>
@@ -1802,7 +1805,19 @@ private:
try {
if (useFontSpec) {
#ifdef FC_OS_WIN32
// Windows doesn't do Utf8 by default and FreeType doesn't do wchar.
// this is a hacky work around.
// copy fontspec to Ascii temp name
std::string tempFile = Base::FileInfo::getTempFileName(); //utf8/ascii
Base::FileInfo fiIn(fontspec);
fiIn.copyTo(tempFile.c_str());
CharList = FT2FC(unichars,pysize,tempFile.c_str(),height,track);
Base::FileInfo fiTemp(tempFile);
fiTemp.deleteFile();
#else
CharList = FT2FC(unichars,pysize,fontspec,height,track);
#endif
}
else {
CharList = FT2FC(unichars,pysize,dir,fontfile,height,track);

View File

@@ -120,13 +120,23 @@ PyObject* FT2FC(const Py_UNICODE *PyUString,
throw std::runtime_error(ErrorMsg.str());
}
// FT does not return an error if font file not found?
std::ifstream is;
is.open (FontSpec);
if (!is) {
ErrorMsg << "Font file not found: " << FontSpec;
throw std::runtime_error(ErrorMsg.str());
}
#ifdef FC_OS_WIN32
Base::FileInfo fi(FontSpec);
if (!fi.isReadable()) {
ErrorMsg << "Font file not found (Win): " << FontSpec;
throw std::runtime_error(ErrorMsg.str());
}
#else
// FT does not return an error if font file not found?
std::ifstream is;
is.open (FontSpec);
if (!is) {
ErrorMsg << "Font file not found: " << FontSpec;
throw std::runtime_error(ErrorMsg.str());
}
#endif
error = FT_New_Face(FTLib,FontSpec,FaceIndex, &FTFont);
if(error) {

View File

@@ -284,7 +284,7 @@
</widget>
</item>
<item row="5" column="2">
<widget class="Gui::PrefUnitSpinBox" name="plsb_FontSize" native="true">
<widget class="Gui::PrefUnitSpinBox" name="plsb_FontSize">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -294,7 +294,7 @@
<property name="toolTip">
<string>Dimension font size</string>
</property>
<property name="value" stdset="0">
<property name="value">
<double>4.000000000000000</double>
</property>
<property name="prefEntry" stdset="0">
@@ -306,7 +306,7 @@
</widget>
</item>
<item row="8" column="2">
<widget class="Gui::PrefUnitSpinBox" name="plsb_ArrowSize" native="true">
<widget class="Gui::PrefUnitSpinBox" name="plsb_ArrowSize">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
@@ -316,7 +316,7 @@
<property name="toolTip">
<string>Dimension arrowhead size</string>
</property>
<property name="value" stdset="0">
<property name="value">
<double>5.000000000000000</double>
</property>
<property name="prefEntry" stdset="0">
@@ -821,20 +821,23 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="currentIndex">
<number>1</number>
</property>
<property name="prefEntry" stdset="0">
<cstring>SectionLineStyle</cstring>
<cstring>SectionLineStandard</cstring>
</property>
<property name="prefPath" stdset="0">
<cstring>Mod/TechDraw/General</cstring>
<cstring>Mod/TechDraw/Standards</cstring>
</property>
<item>
<property name="text">
<string>ISO</string>
<string>ANSI</string>
</property>
</item>
<item>
<property name="text">
<string>ANSI</string>
<string>ISO</string>
</property>
</item>
</widget>

View File

@@ -39,6 +39,9 @@
#include "QGIView.h"
#include "QGISectionLine.h"
#define ANSISTANDARD 0
#define ISOSTANDARD 1
using namespace TechDrawGui;
using namespace TechDraw;
@@ -82,8 +85,8 @@ void QGISectionLine::makeLine()
QPointF beginExtLine1,beginExtLine2; //ext line start pts for measure Start side and measure End side
QPointF endExtLine1, endExtLine2;
QPointF offsetDir(m_arrowDir.x,-m_arrowDir.y);
int format = getPrefSectionFormat();
if (format == 0) { //"ASME"
int format = getPrefSectionStandard();
if (format == ANSISTANDARD) { //"ASME"/"ANSI"
//draw from section line endpoint
QPointF offsetBegin = m_extLen * offsetDir;
beginExtLine1 = m_start; //from
@@ -115,8 +118,8 @@ void QGISectionLine::makeLine()
void QGISectionLine::makeArrows()
{
int format = getPrefSectionFormat();
if (format == 0) {
int format = getPrefSectionStandard();
if (format == ANSISTANDARD) {
makeArrowsTrad();
} else {
makeArrowsISO();
@@ -180,8 +183,8 @@ void QGISectionLine::makeArrowsTrad()
void QGISectionLine::makeSymbols()
{
int format = getPrefSectionFormat();
if (format == 0) {
int format = getPrefSectionStandard();
if (format == ANSISTANDARD) {
makeSymbolsTrad();
} else {
makeSymbolsISO();
@@ -291,11 +294,11 @@ Qt::PenStyle QGISectionLine::getSectionStyle()
}
//ASME("traditional") vs ISO("reference arrow method") arrows
int QGISectionLine::getPrefSectionFormat()
int QGISectionLine::getPrefSectionStandard()
{
Base::Reference<ParameterGrp> hGrp = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/Format");
int format = hGrp->GetInt("SectionFormat", 0);
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/Standards");
int format = hGrp->GetInt("SectionLineStandard", ISOSTANDARD);
return format;
}

View File

@@ -67,7 +67,7 @@ protected:
void makeSymbolsTrad();
void makeSymbolsISO();
void setTools();
int getPrefSectionFormat();
int getPrefSectionStandard();
private:
char* m_symbol;