Merge remote-tracking branch 'upstream/master' into PathArea

This commit is contained in:
Zheng, Lei
2017-01-26 15:47:26 +08:00
141 changed files with 10918 additions and 2814 deletions
Binary file not shown.
Binary file not shown.
+3
View File
@@ -14,6 +14,9 @@ ENDIF(DOCDIR)
add_definitions(-DBOOST_${Boost_VERSION})
#if you want to use the old DAG structure uncomment this line
add_definitions(-DUSE_OLD_DAG)
#write relevant cmake variables to a file for later access with python. Exportet are all variables
#starting with BUILD. As the variable only exists if the user set it to ON a dict is useless, we
#use a python list for export.
+169 -31
View File
@@ -58,11 +58,17 @@ recompute path. Also enables more complicated dependencies beyond trees.
# include <bitset>
#endif
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/subgraph.hpp>
#include <boost/graph/graphviz.hpp>
#ifdef USE_OLD_DAG
#include <boost/graph/topological_sort.hpp>
#include <boost/graph/depth_first_search.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/graph/visitors.hpp>
#include <boost/graph/graphviz.hpp>
#endif //USE_OLD_DAG
#include <boost/bind.hpp>
#include <boost/regex.hpp>
#include <unordered_set>
@@ -138,15 +144,17 @@ struct DocumentP
DocumentObject* activeObject;
Transaction *activeUndoTransaction;
int iTransactionMode;
std::map<Vertex,DocumentObject*> vertexMap;
bool rollback;
bool undoing; ///< document in the middle of undo or redo
std::bitset<32> StatusBits;
int iUndoMode;
unsigned int UndoMemSize;
unsigned int UndoMaxStackSize;
#ifdef USE_OLD_DAG
DependencyList DepList;
std::map<DocumentObject*,Vertex> VertexObjectList;
std::map<Vertex,DocumentObject*> vertexMap;
#endif //USE_OLD_DAG
DocumentP() {
activeObject = 0;
@@ -211,7 +219,7 @@ void Document::exportGraphviz(std::ostream& out) const
{
/* Typedefs for a graph with graphviz attributes */
typedef std::map<std::string, std::string> GraphvizAttributes;
typedef subgraph< adjacency_list<vecS, vecS, directedS,
typedef boost::subgraph< adjacency_list<vecS, vecS, directedS,
property<vertex_attribute_t, GraphvizAttributes>,
property<edge_index_t, int, property<edge_attribute_t, GraphvizAttributes> >,
property<graph_name_t, std::string,
@@ -1667,6 +1675,7 @@ std::vector<App::DocumentObject*> Document::getInList(const DocumentObject* me)
return result;
}
#ifdef USE_OLD_DAG
namespace boost {
// recursive helper function to get all dependencies
void out_edges_recursive(const Vertex& v, const DependencyList& g, std::set<Vertex>& out)
@@ -1752,32 +1761,11 @@ Document::getDependencyList(const std::vector<App::DocumentObject*>& objs) const
ary.push_back(VertexMap[*it]);
return ary;
}
/**
* @brief Signal that object identifiers, typically a property or document object has been renamed.
*
* This function iterates through all document object in the document, and calls its
* renameObjectIdentifiers functions.
*
* @param paths Map with current and new names
*/
void Document::renameObjectIdentifiers(const std::map<App::ObjectIdentifier, App::ObjectIdentifier> &paths)
{
std::map<App::ObjectIdentifier, App::ObjectIdentifier> extendedPaths;
std::map<App::ObjectIdentifier, App::ObjectIdentifier>::const_iterator it = paths.begin();
while (it != paths.end()) {
extendedPaths[it->first.canonicalPath()] = it->second.canonicalPath();
++it;
}
for (std::vector<DocumentObject*>::iterator it = d->objectArray.begin(); it != d->objectArray.end(); ++it)
(*it)->renameObjectIdentifiers(extendedPaths);
}
#endif
void Document::_rebuildDependencyList(void)
{
#ifdef USE_OLD_DAG
d->VertexObjectList.clear();
d->DepList.clear();
// Filling up the adjacency List
@@ -1807,15 +1795,64 @@ void Document::_rebuildDependencyList(void)
add_edge(d->VertexObjectList[It->second],d->VertexObjectList[*It2],d->DepList);
}
}
#endif
}
void Document::recompute()
#ifndef USE_OLD_DAG
std::vector<App::DocumentObject*> Document::getDependencyList(const std::vector<App::DocumentObject*>& objs) const
{
std::vector<App::DocumentObject*> dep;
for (auto obj : objs){
if(!obj)
continue;
std::vector<App::DocumentObject*> objDep = obj->getOutListRecursive();
dep.insert(dep.end(), objDep.begin(), objDep.end());
dep.push_back(obj);
}
// remove duplicate entries and resize the vector
std::sort(dep.begin(), dep.end());
auto newEnd = std::unique(dep.begin(), dep.end());
dep.resize(std::distance(dep.begin(), newEnd));
return dep;
}
#endif // USE_OLD_DAG
/**
* @brief Signal that object identifiers, typically a property or document object has been renamed.
*
* This function iterates through all document object in the document, and calls its
* renameObjectIdentifiers functions.
*
* @param paths Map with current and new names
*/
void Document::renameObjectIdentifiers(const std::map<App::ObjectIdentifier, App::ObjectIdentifier> &paths)
{
std::map<App::ObjectIdentifier, App::ObjectIdentifier> extendedPaths;
std::map<App::ObjectIdentifier, App::ObjectIdentifier>::const_iterator it = paths.begin();
while (it != paths.end()) {
extendedPaths[it->first.canonicalPath()] = it->second.canonicalPath();
++it;
}
for (std::vector<DocumentObject*>::iterator it = d->objectArray.begin(); it != d->objectArray.end(); ++it)
(*it)->renameObjectIdentifiers(extendedPaths);
}
#ifdef USE_OLD_DAG
int Document::recompute()
{
int objectCount = 0;
// The 'SkipRecompute' flag can be (tmp.) set to avoid to many
// time expensive recomputes
bool skip = testStatus(Document::SkipRecompute);
if (skip)
return;
return 0;
// delete recompute log
for (std::vector<App::DocumentObjectExecReturn*>::iterator it=_RecomputeLog.begin();it!=_RecomputeLog.end();++it)
@@ -1835,7 +1872,7 @@ void Document::recompute()
}
catch (const std::exception& e) {
std::cerr << "Document::recompute: " << e.what() << std::endl;
return;
return -1;
}
// caching vertex to DocObject
@@ -1908,8 +1945,9 @@ void Document::recompute()
if ( _recomputeFeature(Cur)) {
// if somthing happen break execution of recompute
d->vertexMap.clear();
return;
return -1;
}
++objectCount;
}
}
@@ -1921,6 +1959,92 @@ void Document::recompute()
d->vertexMap.clear();
signalRecomputed(*this);
return objectCount;
}
#else //ifdef USE_OLD_DAG
int Document::recompute()
{
int objectCount = 0;
// delete recompute log
for (auto LogEntry: _RecomputeLog)
delete LogEntry;
_RecomputeLog.clear();
// get the sorted vector of all objects in the document and go though it from the end
vector<DocumentObject*> topoSortedObjects = topologicalSort();
if (topoSortedObjects.size() != d->objectArray.size()){
cerr << "App::Document::recompute(): topological sort fails, invalid DAG!" << endl;
return -1;
}
for (auto objIt = topoSortedObjects.rbegin(); objIt != topoSortedObjects.rend(); ++objIt){
// ask the object if it should be recomputed
if ((*objIt)->mustExecute() == 1){
objectCount++;
if (_recomputeFeature(*objIt)) {
// if something happen break execution of recompute
return -1;
}
else{
(*objIt)->purgeTouched();
// set all dependent object touched to force recompute
for (auto inObjIt : (*objIt)->getInList())
inObjIt->touch();
}
}
}
#ifdef FC_DEBUG
// check if all objects are recalculated which were thouched
for (auto objectIt : d->objectArray) {
if (objectIt->isTouched())
cerr << "Document::recompute(): " << objectIt->getNameInDocument() << " still touched after recompute" << endl;
}
#endif
return objectCount;
}
#endif // USE_OLD_DAG
std::vector<App::DocumentObject*> Document::topologicalSort() const
{
// topological sort algorithm described here:
// https://de.wikipedia.org/wiki/Topologische_Sortierung#Algorithmus_f.C3.BCr_das_Topologische_Sortieren
vector < App::DocumentObject* > ret;
ret.reserve(d->objectArray.size());
map < App::DocumentObject*,int > countMap;
for (auto objectIt : d->objectArray)
countMap[objectIt] = objectIt->getInList().size();
auto rootObjeIt = find_if(countMap.begin(), countMap.end(), [](pair < App::DocumentObject*, int > count)->bool {
return count.second == 0;
});
if (rootObjeIt == countMap.end()){
cerr << "Document::topologicalSort: cyclic dependency detected (no root object)" << endl;
return ret;
}
while (rootObjeIt != countMap.end()){
rootObjeIt->second = rootObjeIt->second - 1;
for (auto outListIt : rootObjeIt->first->getOutList()){
auto outListMapIt = countMap.find(outListIt);
outListMapIt->second = outListMapIt->second - 1;
}
ret.push_back(rootObjeIt->first);
rootObjeIt = find_if(countMap.begin(), countMap.end(), [](pair < App::DocumentObject*, int > count)->bool {
return count.second == 0;
});
}
return ret;
}
const char * Document::getErrorDescription(const App::DocumentObject*Obj) const
@@ -2182,6 +2306,7 @@ void Document::remObject(const char* sName)
signalTransactionRemove(*pos->second, 0);
}
#ifdef USE_OLD_DAG
if (!d->vertexMap.empty()) {
// recompute of document is running
for (std::map<Vertex,DocumentObject*>::iterator it = d->vertexMap.begin(); it != d->vertexMap.end(); ++it) {
@@ -2191,7 +2316,8 @@ void Document::remObject(const char* sName)
}
}
}
#endif //USE_OLD_DAG
// Before deleting we must nullify all dependant objects
breakDependency(pos->second, true);
@@ -2565,3 +2691,15 @@ PyObject * Document::getPyObject(void)
{
return Py::new_reference_to(DocumentPythonObject);
}
std::vector<App::DocumentObject*> Document::getRootObjects() const
{
std::vector < App::DocumentObject* > ret;
for (auto objectIt : d->objectArray) {
if (objectIt->getInList().empty())
ret.push_back(objectIt);
}
return ret;
}
+8 -4
View File
@@ -37,8 +37,6 @@
#include <stack>
#include <boost/signals.hpp>
#include <boost/graph/adjacency_list.hpp>
namespace Base {
class Writer;
@@ -246,8 +244,8 @@ public:
void setClosable(bool);
/// check whether the document can be closed
bool isClosable() const;
/// Recompute all touched features
void recompute();
/// Recompute all touched features and return the amount of recalculated features
int recompute();
/// Recompute only one feature
void recomputeFeature(DocumentObject* Feat);
/// get the error log from the recompute run
@@ -311,10 +309,15 @@ public:
std::vector<App::DocumentObject*> getInList(const DocumentObject* me) const;
/// Get a complete list of all objects the given objects depend on. The list
/// also contains the given objects!
/// deprecated! Use In- and OutList mimic in the DocumentObject instead!
std::vector<App::DocumentObject*> getDependencyList
(const std::vector<App::DocumentObject*>&) const;
// set Changed
//void setChanged(DocumentObject* change);
/// get a list of topological sorted objects (https://en.wikipedia.org/wiki/Topological_sorting)
std::vector<App::DocumentObject*> topologicalSort() const;
/// get all root objects (objects no other one reference too)
std::vector<App::DocumentObject*> getRootObjects() const;
//@}
/// Function called to signal that an object identifier has been renamed
@@ -352,6 +355,7 @@ protected:
/// helper which Recompute only this feature
bool _recomputeFeature(DocumentObject* Feat);
void _clearRedos();
/// refresh the internal dependency graph
void _rebuildDependencyList(void);
std::string getTransientDirectoryName(const std::string& uuid, const std::string& filename) const;
+173 -1
View File
@@ -182,6 +182,7 @@ std::vector<DocumentObject*> DocumentObject::getOutList(void) const
return ret;
}
#ifdef USE_OLD_DAG
std::vector<App::DocumentObject*> DocumentObject::getInList(void) const
{
if (_pDoc)
@@ -190,6 +191,79 @@ std::vector<App::DocumentObject*> DocumentObject::getInList(void) const
return std::vector<App::DocumentObject*>();
}
#else // ifndef USE_OLD_DAG
std::vector<App::DocumentObject*> DocumentObject::getInList(void) const
{
return _inList;
}
#endif // if USE_OLD_DAG
void _getInListRecursive(std::vector<DocumentObject*>& objSet, const DocumentObject* obj, const DocumentObject* checkObj, int depth)
{
for (const auto objIt : obj->getInList()){
// if the check object is in the recursive inList we have a cycle!
if (objIt == checkObj || depth <= 0){
std::cerr << "DocumentObject::getInListRecursive(): cyclic dependency detected!"<<std::endl;
throw Base::Exception("DocumentObject::getInListRecursive(): cyclic dependency detected!");
}
objSet.push_back(objIt);
_getInListRecursive(objSet, objIt, checkObj,depth-1);
}
}
std::vector<App::DocumentObject*> DocumentObject::getInListRecursive(void) const
{
// number of objects in document is a good estimate in result size
int maxDepth = getDocument()->countObjects() +2;
std::vector<App::DocumentObject*> result;
result.reserve(maxDepth);
// using a rcursie helper to collect all InLists
_getInListRecursive(result, this, this, maxDepth);
// remove duplicate entries and resize the vector
std::sort(result.begin(), result.end());
auto newEnd = std::unique(result.begin(), result.end());
result.resize(std::distance(result.begin(), newEnd));
return result;
}
void _getOutListRecursive(std::vector<DocumentObject*>& objSet, const DocumentObject* obj, const DocumentObject* checkObj, int depth)
{
for (const auto objIt : obj->getOutList()){
// if the check object is in the recursive inList we have a cycle!
if (objIt == checkObj || depth <= 0){
std::cerr << "DocumentObject::getOutListRecursive(): cyclic dependency detected!" << std::endl;
throw Base::Exception("DocumentObject::getOutListRecursive(): cyclic dependency detected!");
}
objSet.push_back(objIt);
_getOutListRecursive(objSet, objIt, checkObj,depth-1);
}
}
std::vector<App::DocumentObject*> DocumentObject::getOutListRecursive(void) const
{
// number of objects in document is a good estimate in result size
int maxDepth = getDocument()->countObjects() + 2;
std::vector<App::DocumentObject*> result;
result.reserve(maxDepth);
// using a recursive helper to collect all OutLists
_getOutListRecursive(result, this, this, maxDepth);
// remove duplicate entries and resize the vector
std::sort(result.begin(), result.end());
auto newEnd = std::unique(result.begin(), result.end());
result.resize(std::distance(result.begin(), newEnd));
return result;
}
DocumentObjectGroup* DocumentObject::getGroup() const
{
return dynamic_cast<DocumentObjectGroup*>(GroupExtension::getGroupOfObject(this));
@@ -229,6 +303,86 @@ bool DocumentObject::testIfLinkDAGCompatible(PropertyLinkSub &linkTo) const
return this->testIfLinkDAGCompatible(linkTo_in_vector);
}
bool DocumentObject::_isInInListRecursive(const DocumentObject* /*act*/,
const DocumentObject* test,
const DocumentObject* checkObj, int depth) const
{
#ifndef USE_OLD_DAG
if (std::find(_inList.begin(), _inList.end(), test) != _inList.end())
return true;
for (auto obj : _inList){
// if the check object is in the recursive inList we have a cycle!
if (obj == checkObj || depth <= 0){
std::cerr << "DocumentObject::getOutListRecursive(): cyclic dependency detected!" << std::endl;
throw Base::Exception("DocumentObject::getOutListRecursive(): cyclic dependency detected!");
}
if (_isInInListRecursive(obj, test, checkObj, depth - 1))
return true;
}
#else
(void)test;
(void)checkObj;
(void)depth;
#endif
return false;
}
bool DocumentObject::isInInListRecursive(DocumentObject *linkTo) const
{
return _isInInListRecursive(this, linkTo, this, getDocument()->countObjects());
}
bool DocumentObject::isInInList(DocumentObject *linkTo) const
{
#ifndef USE_OLD_DAG
if (std::find(_inList.begin(), _inList.end(), linkTo) != _inList.end())
return true;
else
return false;
#else
(void)linkTo;
return false;
#endif
}
bool DocumentObject::_isInOutListRecursive(const DocumentObject* act,
const DocumentObject* test,
const DocumentObject* checkObj, int depth) const
{
#ifndef USE_OLD_DAG
std::vector <DocumentObject*> outList = act->getOutList();
if (std::find(outList.begin(), outList.end(), test) != outList.end())
return true;
for (auto obj : outList){
// if the check object is in the recursive inList we have a cycle!
if (obj == checkObj || depth <= 0){
std::cerr << "DocumentObject::isInOutListRecursive(): cyclic dependency detected!" << std::endl;
throw Base::Exception("DocumentObject::isInOutListRecursive(): cyclic dependency detected!");
}
if (_isInOutListRecursive(obj, test, checkObj, depth - 1))
return true;
}
#else
(void)act;
(void)test;
(void)checkObj;
(void)depth;
#endif
return false;
}
bool DocumentObject::isInOutListRecursive(DocumentObject *linkTo) const
{
return _isInOutListRecursive(this, linkTo, this, getDocument()->countObjects());
}
void DocumentObject::onLostLinkToObject(DocumentObject*)
{
@@ -247,7 +401,6 @@ void DocumentObject::setDocument(App::Document* doc)
void DocumentObject::onBeforeChange(const Property* prop)
{
// Store current name in oldLabel, to be able to easily retrieve old name of document object later
// when renaming expressions.
if (prop == &Label)
@@ -405,3 +558,22 @@ void DocumentObject::unsetupObject()
for(auto ext : vector)
ext->onExtendedUnsetupObject();
}
void App::DocumentObject::_removeBackLink(DocumentObject* rmvObj)
{
#ifndef USE_OLD_DAG
_inList.erase(std::remove(_inList.begin(), _inList.end(), rmvObj), _inList.end());
#else
(void)rmvObj;
#endif
}
void App::DocumentObject::_addBackLink(DocumentObject* newObj)
{
#ifndef USE_OLD_DAG
if ( std::find(_inList.begin(), _inList.end(), newObj) == _inList.end() )
_inList.push_back(newObj);
#else
(void)newObj;
#endif //USE_OLD_DAG
}
+32 -1
View File
@@ -127,13 +127,36 @@ public:
void setStatus(ObjectStatus pos, bool on) {StatusBits.set((size_t)pos, on);}
//@}
/** DAG handling
This part of the interface deals with viewing the document as
an DAG (directed acyclic graph).
*/
//@{
/// returns a list of objects this object is pointing to by Links
std::vector<App::DocumentObject*> getOutList(void) const;
/// returns a list of objects this object is pointing to by Links and all further descended
std::vector<App::DocumentObject*> getOutListRecursive(void) const;
/// get all objects link to this object
std::vector<App::DocumentObject*> getInList(void) const;
/// get all objects link directly or indirectly to this object
std::vector<App::DocumentObject*> getInListRecursive(void) const;
/// get group if object is part of a group, otherwise 0 is returned
DocumentObjectGroup* getGroup() const;
/// test if this object is in the InList and recursive further down
bool isInInListRecursive(DocumentObject* objToTest) const;
/// test if this object is directly (non recursive) in the InList
bool isInInList(DocumentObject* objToTest) const;
/// test if the given object is in the OutList and recursive further down
bool isInOutListRecursive(DocumentObject* objToTest) const;
/// test if this object is directly (non recursive) in the OutList
bool isInOutList(DocumentObject* objToTest) const;
/// internal, used by ProperyLink to maintain DAG back links
void _removeBackLink(DocumentObject*);
/// internal, used by ProperyLink to maintain DAG back links
void _addBackLink(DocumentObject*);
//@}
/**
* @brief testIfLinkIsDAG tests a link that is about to be created for
* circular references.
@@ -149,7 +172,6 @@ public:
bool testIfLinkDAGCompatible(App::PropertyLinkSubList &linksTo) const;
bool testIfLinkDAGCompatible(App::PropertyLinkSub &linkTo) const;
public:
/** mustExecute
* We call this method to check if the object was modified to
@@ -259,6 +281,15 @@ protected: // attributes
// pointer to the document name string (for performance)
const std::string *pcNameInDocument;
private:
// Back pointer to all the fathers in a DAG of the document
// this is used by the document (via friend) to have a effective DAG handling
std::vector<App::DocumentObject*> _inList;
// helper for isInInListRecursive()
bool _isInInListRecursive(const DocumentObject *act, const DocumentObject* test, const DocumentObject* checkObj, int depth) const;
// helper for isInOutListRecursive()
bool _isInOutListRecursive(const DocumentObject *act, const DocumentObject* test, const DocumentObject* checkObj, int depth) const;
};
class AppExport ObjectStatusLocker
+12
View File
@@ -61,12 +61,24 @@
</Documentation>
<Parameter Name="OutList" Type="List"/>
</Attribute>
<Attribute Name="OutListRecursive" ReadOnly="true">
<Documentation>
<UserDocu>A list of all objects this object links to recursivly.</UserDocu>
</Documentation>
<Parameter Name="OutListRecursive" Type="List"/>
</Attribute>
<Attribute Name="InList" ReadOnly="true">
<Documentation>
<UserDocu>A list of all objects which link to this object.</UserDocu>
</Documentation>
<Parameter Name="InList" Type="List"/>
</Attribute>
<Attribute Name="InListRecursive" ReadOnly="true">
<Documentation>
<UserDocu>A list of all objects which link to this object recursivly.</UserDocu>
</Documentation>
<Parameter Name="InListRecursive" Type="List"/>
</Attribute>
<Attribute Name="Name" ReadOnly="true">
<Documentation>
<UserDocu>Return the internal name of this object</UserDocu>
+33
View File
@@ -207,6 +207,22 @@ Py::List DocumentObjectPy::getInList(void) const
return ret;
}
Py::List DocumentObjectPy::getInListRecursive(void) const
{
Py::List ret;
try {
std::vector<DocumentObject*> list = getDocumentObjectPtr()->getInListRecursive();
for (std::vector<DocumentObject*>::iterator It = list.begin(); It != list.end(); ++It)
ret.append(Py::Object((*It)->getPyObject(), true));
}
catch (const Base::Exception& e) {
throw Py::IndexError(e.what());
}
return ret;
}
Py::List DocumentObjectPy::getOutList(void) const
{
Py::List ret;
@@ -218,6 +234,23 @@ Py::List DocumentObjectPy::getOutList(void) const
return ret;
}
Py::List DocumentObjectPy::getOutListRecursive(void) const
{
Py::List ret;
try {
std::vector<DocumentObject*> list = getDocumentObjectPtr()->getOutListRecursive();
// creat the python list for the output
for (std::vector<DocumentObject*>::iterator It = list.begin(); It != list.end(); ++It)
ret.append(Py::Object((*It)->getPyObject(), true));
}
catch (const Base::Exception& e) {
throw Py::IndexError(e.what());
}
return ret;
}
PyObject* DocumentObjectPy::setExpression(PyObject * args)
{
char * path = NULL;
+13 -1
View File
@@ -102,7 +102,7 @@
</Methode>
<Methode Name="recompute">
<Documentation>
<UserDocu>Recompute the document</UserDocu>
<UserDocu>Recompute the document and returns the amount of recomputed features</UserDocu>
</Documentation>
</Methode>
<Methode Name="getObject">
@@ -151,6 +151,18 @@ Both parameters are optional.</UserDocu>
</Documentation>
<Parameter Name="Objects" Type="List" />
</Attribute>
<Attribute Name="ToplogicalSortedObjects" ReadOnly="true">
<Documentation>
<UserDocu>The list of object of this document in topological sorted order</UserDocu>
</Documentation>
<Parameter Name="ToplogicalSortedObjects" Type="List" />
</Attribute>
<Attribute Name="RootObjects" ReadOnly="true">
<Documentation>
<UserDocu>The list of root object of this document</UserDocu>
</Documentation>
<Parameter Name="RootObjects" Type="List" />
</Attribute>
<Attribute Name="UndoMode" ReadOnly="false">
<Documentation>
<UserDocu>The Undo mode of the Document (0 = no Undo, 1 = Undo/Redo)</UserDocu>
+26 -2
View File
@@ -384,8 +384,8 @@ PyObject* DocumentPy::recompute(PyObject * args)
{
if (!PyArg_ParseTuple(args, "")) // convert args: Python->C
return NULL; // NULL triggers exception
getDocumentPtr()->recompute();
Py_Return;
int objectCount = getDocumentPtr()->recompute();
return Py::new_reference_to(Py::Int(objectCount));
}
PyObject* DocumentPy::getObject(PyObject *args)
@@ -490,6 +490,30 @@ Py::List DocumentPy::getObjects(void) const
return res;
}
Py::List DocumentPy::getToplogicalSortedObjects(void) const
{
std::vector<DocumentObject*> objs = getDocumentPtr()->topologicalSort();
Py::List res;
for (std::vector<DocumentObject*>::const_iterator It = objs.begin(); It != objs.end(); ++It)
//Note: Here we must force the Py::Object to own this Python object as getPyObject() increments the counter
res.append(Py::Object((*It)->getPyObject(), true));
return res;
}
Py::List DocumentPy::getRootObjects(void) const
{
std::vector<DocumentObject*> objs = getDocumentPtr()->getRootObjects();
Py::List res;
for (std::vector<DocumentObject*>::const_iterator It = objs.begin(); It != objs.end(); ++It)
//Note: Here we must force the Py::Object to own this Python object as getPyObject() increments the counter
res.append(Py::Object((*It)->getPyObject(), true));
return res;
}
Py::Int DocumentPy::getUndoMode(void) const
{
return Py::Int(getDocumentPtr()->getUndoMode());
+32
View File
@@ -24,8 +24,40 @@
#define APP_FEATUREPYTHONPYIMP_H
#include <Base/BaseClass.h>
#include <Base/Interpreter.h>
#include <App/PropertyContainerPy.h>
#define PYTHON_TYPE_DEF(_class_, _subclass_) \
class _class_ : public _subclass_ \
{ \
public: \
static PyTypeObject Type; \
public: \
_class_(Base::BaseClass *pcObject, PyTypeObject *T = &Type); \
virtual ~_class_(); \
};
#define PYTHON_TYPE_IMP(_class_, _subclass_) \
PyTypeObject _class_::Type = { \
PyObject_HEAD_INIT(&PyType_Type) \
0, \
""#_class_"", \
sizeof(_class_), \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_CLASS, \
""#_class_"", \
0, 0, 0, 0, 0, 0, 0, 0, 0, \
&_subclass_::Type, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 \
}; \
_class_::_class_(Base::BaseClass *pcObject, PyTypeObject *T) \
: _subclass_(reinterpret_cast<_subclass_::PointerType>(pcObject), T) \
{ \
} \
_class_::~_class_() \
{ \
}
namespace App
{
+2
View File
@@ -84,12 +84,14 @@ template<class FeaturePyT>
FeaturePythonPyT<FeaturePyT>::FeaturePythonPyT(Base::BaseClass *pcObject, PyTypeObject *T)
: FeaturePyT(reinterpret_cast<typename FeaturePyT::PointerType>(pcObject), T)
{
Base::PyGILStateLocker lock;
dict_methods = PyDict_New();
}
template<class FeaturePyT>
FeaturePythonPyT<FeaturePyT>::~FeaturePythonPyT()
{
Base::PyGILStateLocker lock;
Py_DECREF(dict_methods);
}
+71
View File
@@ -122,10 +122,49 @@ void PropertyExpressionEngine::Paste(const Property &from)
const PropertyExpressionEngine * fromee = static_cast<const PropertyExpressionEngine*>(&from);
AtomicPropertyChange signaller(*this);
#ifndef USE_OLD_DAG
//maintain backlinks
ExpressionMap::const_iterator i = expressions.begin();
while (i != expressions.end()) {
std::set<ObjectIdentifier> deps;
i->second.expression->getDeps(deps);
std::set<ObjectIdentifier>::const_iterator j = deps.begin();
while (j != deps.end()) {
const ObjectIdentifier & p = *j;
DocumentObject* docObj = p.getDocumentObject();
if (docObj)
docObj->_removeBackLink(static_cast<App::DocumentObject*>(getContainer()));
++j;
}
++i;
}
#endif
expressions.clear();
for (ExpressionMap::const_iterator it = fromee->expressions.begin(); it != fromee->expressions.end(); ++it) {
expressions[it->first] = ExpressionInfo(boost::shared_ptr<Expression>(it->second.expression->copy()), it->second.comment.c_str());
#ifndef USE_OLD_DAG
//maintain backlinks
std::set<ObjectIdentifier> deps;
it->second.expression->getDeps(deps);
std::set<ObjectIdentifier>::const_iterator j = deps.begin();
while (j != deps.end()) {
const ObjectIdentifier & p = *j;
DocumentObject* docObj = p.getDocumentObject();
if (docObj)
docObj->_addBackLink(static_cast<App::DocumentObject*>(getContainer()));
++j;
}
#endif
expressionChanged(it->first);
}
@@ -364,11 +403,43 @@ void PropertyExpressionEngine::setValue(const ObjectIdentifier & path, boost::sh
AtomicPropertyChange signaller(*this);
expressions[usePath] = ExpressionInfo(expr, comment);
#ifndef USE_OLD_DAG
//maintain the backlinks in the documentobject graph datastructure
std::set<ObjectIdentifier> deps;
expr->getDeps(deps);
std::set<ObjectIdentifier>::const_iterator j = deps.begin();
while (j != deps.end()) {
const ObjectIdentifier & p = *j;
DocumentObject* docObj = p.getDocumentObject();
if (docObj)
docObj->_addBackLink(static_cast<App::DocumentObject*>(getContainer()));
++j;
}
#endif
expressionChanged(usePath);
}
else {
AtomicPropertyChange signaller(*this);
expressions.erase(usePath);
#ifndef USE_OLD_DAG
//maintain the backlinks in the documentobject graph datastructure
std::set<ObjectIdentifier> deps;
expressions[usePath].expression->getDeps(deps);
std::set<ObjectIdentifier>::const_iterator j = deps.begin();
while (j != deps.end()) {
const ObjectIdentifier & p = *j;
DocumentObject* docObj = p.getDocumentObject();
if (docObj)
docObj->_removeBackLink(static_cast<App::DocumentObject*>(getContainer()));
++j;
}
#endif
expressionChanged(usePath);
}
}
+87 -18
View File
@@ -44,9 +44,6 @@ using namespace App;
using namespace Base;
using namespace std;
//**************************************************************************
//**************************************************************************
// PropertyLink
@@ -76,6 +73,13 @@ PropertyLink::~PropertyLink()
void PropertyLink::setValue(App::DocumentObject * lValue)
{
aboutToSetValue();
#ifndef USE_OLD_DAG
// maintain the back link in the DocumentObject class
if(_pcLink)
_pcLink->_removeBackLink(static_cast<DocumentObject*>(getContainer()));
if(lValue)
lValue->_addBackLink(static_cast<DocumentObject*>(getContainer()));
#endif
_pcLink=lValue;
hasSetValue();
}
@@ -163,9 +167,10 @@ Property *PropertyLink::Copy(void) const
void PropertyLink::Paste(const Property &from)
{
aboutToSetValue();
_pcLink = dynamic_cast<const PropertyLink&>(from)._pcLink;
hasSetValue();
if(!from.isDerivedFrom(PropertyLink::getClassTypeId()))
throw Base::Exception("Incompatible proeprty to paste to");
setValue(static_cast<const PropertyLink&>(from)._pcLink);
}
//**************************************************************************
@@ -200,17 +205,37 @@ int PropertyLinkList::getSize(void) const
void PropertyLinkList::setValue(DocumentObject* lValue)
{
#ifndef USE_OLD_DAG
//maintain the back link in the DocumentObject class
for(auto *obj : _lValueList)
obj->_removeBackLink(static_cast<DocumentObject*>(getContainer()));
if(lValue)
lValue->_addBackLink(static_cast<DocumentObject*>(getContainer()));
#endif
if (lValue){
aboutToSetValue();
_lValueList.resize(1);
_lValueList[0] = lValue;
hasSetValue();
}
else {
aboutToSetValue();
_lValueList.clear();
hasSetValue();
}
}
void PropertyLinkList::setValues(const std::vector<DocumentObject*>& lValue)
{
aboutToSetValue();
#ifndef USE_OLD_DAG
//maintain the back link in the DocumentObject class
for(auto *obj : _lValueList)
obj->_removeBackLink(static_cast<DocumentObject*>(getContainer()));
for(auto *obj : lValue)
obj->_addBackLink(static_cast<DocumentObject*>(getContainer()));
#endif
_lValueList = lValue;
hasSetValue();
}
@@ -314,9 +339,7 @@ Property *PropertyLinkList::Copy(void) const
void PropertyLinkList::Paste(const Property &from)
{
aboutToSetValue();
_lValueList = dynamic_cast<const PropertyLinkList&>(from)._lValueList;
hasSetValue();
setValues(dynamic_cast<const PropertyLinkList&>(from)._lValueList);
}
unsigned int PropertyLinkList::getMemSize(void) const
@@ -352,6 +375,12 @@ PropertyLinkSub::~PropertyLinkSub()
void PropertyLinkSub::setValue(App::DocumentObject * lValue, const std::vector<std::string> &SubList)
{
aboutToSetValue();
#ifndef USE_OLD_DAG
if (_pcLinkSub)
_pcLinkSub->_removeBackLink(static_cast<App::DocumentObject*>(getContainer()));
if (lValue)
lValue->_addBackLink(static_cast<App::DocumentObject*>(getContainer()));
#endif
_pcLinkSub=lValue;
_cSubList = SubList;
hasSetValue();
@@ -505,10 +534,7 @@ Property *PropertyLinkSub::Copy(void) const
void PropertyLinkSub::Paste(const Property &from)
{
aboutToSetValue();
_pcLinkSub = dynamic_cast<const PropertyLinkSub&>(from)._pcLinkSub;
_cSubList = dynamic_cast<const PropertyLinkSub&>(from)._cSubList;
hasSetValue();
setValue(dynamic_cast<const PropertyLinkSub&>(from)._pcLinkSub, dynamic_cast<const PropertyLinkSub&>(from)._cSubList);
}
//**************************************************************************
@@ -544,6 +570,14 @@ int PropertyLinkSubList::getSize(void) const
void PropertyLinkSubList::setValue(DocumentObject* lValue,const char* SubName)
{
#ifndef USE_OLD_DAG
//maintain backlinks
for(auto *obj : _lValueList)
obj->_removeBackLink(static_cast<DocumentObject*>(getContainer()));
if (lValue)
lValue->_addBackLink(static_cast<DocumentObject*>(getContainer()));
#endif
if (lValue) {
aboutToSetValue();
_lValueList.resize(1);
@@ -561,9 +595,22 @@ void PropertyLinkSubList::setValue(DocumentObject* lValue,const char* SubName)
}
void PropertyLinkSubList::setValues(const std::vector<DocumentObject*>& lValue,const std::vector<const char*>& lSubNames)
{
{
if (lValue.size() != lSubNames.size())
throw Base::Exception("PropertyLinkSubList::setValues: size of subelements list != size of objects list");
#ifndef USE_OLD_DAG
//maintain backlinks. _lValueList can contain items multiple times, but we trust the document
//object to ensure that this works
for(auto *obj : _lValueList)
obj->_removeBackLink(static_cast<DocumentObject*>(getContainer()));
//maintain backlinks. lValue can contain items multiple times, but we trust the document
//object to ensure that the backlink is only added once
for(auto *obj : lValue)
obj->_addBackLink(static_cast<DocumentObject*>(getContainer()));
#endif
aboutToSetValue();
_lValueList = lValue;
_lSubList.resize(lSubNames.size());
@@ -577,6 +624,19 @@ void PropertyLinkSubList::setValues(const std::vector<DocumentObject*>& lValue,c
{
if (lValue.size() != lSubNames.size())
throw Base::Exception("PropertyLinkSubList::setValues: size of subelements list != size of objects list");
#ifndef USE_OLD_DAG
//maintain backlinks. _lValueList can contain items multiple times, but we trust the document
//object to ensure that this works
for(auto *obj : _lValueList)
obj->_removeBackLink(static_cast<DocumentObject*>(getContainer()));
//maintain backlinks. lValue can contain items multiple times, but we trust the document
//object to ensure that the backlink is only added once
for(auto *obj : lValue)
obj->_addBackLink(static_cast<DocumentObject*>(getContainer()));
#endif
aboutToSetValue();
_lValueList = lValue;
_lSubList = lSubNames;
@@ -585,6 +645,18 @@ void PropertyLinkSubList::setValues(const std::vector<DocumentObject*>& lValue,c
void PropertyLinkSubList::setValue(DocumentObject* lValue, const std::vector<string> &SubList)
{
#ifndef USE_OLD_DAG
//maintain backlinks. _lValueList can contain items multiple times, but we trust the document
//object to ensure that this works
for(auto *obj : _lValueList)
obj->_removeBackLink(static_cast<DocumentObject*>(getContainer()));
//maintain backlinks. lValue can contain items multiple times, but we trust the document
//object to ensure that the backlink is only added once
if(lValue)
lValue->_addBackLink(static_cast<DocumentObject*>(getContainer()));
#endif
aboutToSetValue();
std::size_t size = SubList.size();
this->_lValueList.clear();
@@ -850,10 +922,7 @@ Property *PropertyLinkSubList::Copy(void) const
void PropertyLinkSubList::Paste(const Property &from)
{
aboutToSetValue();
_lValueList = dynamic_cast<const PropertyLinkSubList&>(from)._lValueList;
_lSubList = dynamic_cast<const PropertyLinkSubList&>(from)._lSubList;
hasSetValue();
setValues(dynamic_cast<const PropertyLinkSubList&>(from)._lValueList, dynamic_cast<const PropertyLinkSubList&>(from)._lSubList);
}
unsigned int PropertyLinkSubList::getMemSize (void) const
+16
View File
@@ -148,6 +148,22 @@ PyObject* PyObjectBase::__getattr(PyObject * obj, char *attr)
if (!static_cast<PyObjectBase*>(value)->isConst())
static_cast<PyObjectBase*>(value)->setAttributeOf(attr, pyObj);
}
else if (value && PyCFunction_Check(value)) {
// ExtensionContainerPy::initialization() transfers the methods of an
// extension object by creating PyCFunction objects.
// At this point no 'self' object is passed but is handled and determined
// in ExtensionContainerPy::getCustomAttributes().
// So, if we come through this section then it's an indication that
// something is wrong with the Python types. For example, a C++ class
// that adds an extension uses the same Python type as a wrapper than
// another C++ class without this extension.
PyCFunctionObject* cfunc = reinterpret_cast<PyCFunctionObject*>(value);
if (!cfunc->m_self) {
Py_DECREF(cfunc);
value = 0;
PyErr_Format(PyExc_AttributeError, "<no object bound to built-in method %s>", attr);
}
}
#endif
return value;
}
+26 -6
View File
@@ -56,6 +56,8 @@ public:
// methods
inline double Length (void) const;
inline double Distance(const Vector2d&) const;
inline bool IsEqual(const Vector2d&, double tolerance) const;
// operators
inline Vector2d& operator= (const Vector2d &rclVct);
@@ -86,6 +88,7 @@ public:
inline BoundBox2d (const BoundBox2d &rclBB);
inline BoundBox2d (double fX1, double fY1, double fX2, double fY2);
inline bool IsValid (void);
inline bool IsEqual(const BoundBox2d&, double tolerance) const;
// operators
inline BoundBox2d& operator= (const BoundBox2d& rclBB);
@@ -190,6 +193,18 @@ inline double Vector2d::Length (void) const
return sqrt ((x * x) + (y * y));
}
inline double Vector2d::Distance(const Vector2d& v) const
{
double dx = (x - v.x);
double dy = (y - v.y);
return sqrt(dx*dx + dy*dy);
}
inline bool Vector2d::IsEqual(const Vector2d& v, double tolerance) const
{
return Distance (v) <= tolerance;
}
inline Vector2d& Vector2d::operator= (const Vector2d &rclVct)
{
x = rclVct.x;
@@ -199,8 +214,7 @@ inline Vector2d& Vector2d::operator= (const Vector2d &rclVct)
inline bool Vector2d::operator== (const Vector2d &rclVct) const
{
return (fabs (x - rclVct.x) <= DBL_EPSILON) &&
(fabs (y - rclVct.y) <= DBL_EPSILON);
return (x == rclVct.x) && (y == rclVct.y);
}
inline Vector2d Vector2d::operator+ (const Vector2d &rclVct) const
@@ -355,6 +369,12 @@ inline bool BoundBox2d::IsValid (void)
return (MaxX >= MinX) && (MaxY >= MinY);
}
inline bool BoundBox2d::IsEqual(const BoundBox2d& b, double tolerance) const
{
return Vector2d(MinX,MinY).IsEqual(Vector2d(b.MinX,b.MinY), tolerance) &&
Vector2d(MaxX,MaxY).IsEqual(Vector2d(b.MaxX,b.MaxY), tolerance);
}
inline BoundBox2d& BoundBox2d::operator= (const BoundBox2d& rclBB)
{
MinX = rclBB.MinX;
@@ -366,10 +386,10 @@ inline BoundBox2d& BoundBox2d::operator= (const BoundBox2d& rclBB)
inline bool BoundBox2d::operator== (const BoundBox2d& rclBB) const
{
return (fabs (MinX - rclBB.MinX) <= DBL_EPSILON) &&
(fabs (MinY - rclBB.MinY) <= DBL_EPSILON) &&
(fabs (MaxX - rclBB.MaxX) <= DBL_EPSILON) &&
(fabs (MaxY - rclBB.MaxY) <= DBL_EPSILON);
return (MinX == rclBB.MinX) &&
(MinY == rclBB.MinY) &&
(MaxX == rclBB.MaxX) &&
(MaxY == rclBB.MaxY);
}
inline void BoundBox2d::Add(const Vector2d &rclVct)
+117 -118
View File
@@ -37,90 +37,90 @@
// First check for *WIN64* since the *WIN32* are also set on 64-bit platforms
#if defined(WIN64) || defined(_WIN64) || defined(__WIN64__)
# ifndef FC_OS_WIN32
# define FC_OS_WIN32
# endif
# ifndef FC_OS_WIN64
# define FC_OS_WIN64
# endif
# ifndef FC_OS_WIN32
# define FC_OS_WIN32
# endif
# ifndef FC_OS_WIN64
# define FC_OS_WIN64
# endif
#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
# ifndef FC_OS_WIN32
# define FC_OS_WIN32
# endif
# if defined(__MINGW32__)
# if HAVE_CONFIG_H
# include <config.h>
# endif // HAVE_CONFIG_H
//# define HAVE_INT8_T
//# define HAVE_UINT8_T
//# define HAVE_INT16_T
//# define HAVE_UINT16_T
//# define HAVE_INT32_T
//# define HAVE_UINT32_T
//# define HAVE_INT64_T
//# define HAVE_UINT64_T
//# define HAVE_INTPTR_T
//# define HAVE_UINTPTR_T
# endif
# ifndef FC_OS_WIN32
# define FC_OS_WIN32
# endif
# if defined(__MINGW32__)
# if HAVE_CONFIG_H
# include <config.h>
# endif // HAVE_CONFIG_H
//# define HAVE_INT8_T
//# define HAVE_UINT8_T
//# define HAVE_INT16_T
//# define HAVE_UINT16_T
//# define HAVE_INT32_T
//# define HAVE_UINT32_T
//# define HAVE_INT64_T
//# define HAVE_UINT64_T
//# define HAVE_INTPTR_T
//# define HAVE_UINTPTR_T
# endif
#elif defined(__MWERKS__) && defined(__INTEL__)
# ifndef FC_OS_WIN32
# define FC_OS_WIN32
# endif
# ifndef FC_OS_WIN32
# define FC_OS_WIN32
# endif
#elif defined(__APPLE__)
# ifndef FC_OS_MACOSX
# define FC_OS_MACOSX
# endif
# ifndef FC_OS_MACOSX
# define FC_OS_MACOSX
# endif
#elif defined(linux) || defined(__linux) || defined(__linux__) || defined(__GLIBC__)
# ifndef FC_OS_LINUX
# define FC_OS_LINUX
# endif
# ifndef FC_OS_LINUX
# define FC_OS_LINUX
# endif
#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
# ifndef FC_OS_BSD
# define FC_OS_BSD
# endif
# ifndef FC_OS_BSD
# define FC_OS_BSD
# endif
#elif defined(__CYGWIN__)
# ifndef FC_OS_CYGWIN
# define FC_OS_CYGWIN
# ifndef FC_OS_CYGWIN
# define FC_OS_CYGWIN
// Avoid conflicts with Inventor
# define HAVE_INT8_T
# define HAVE_UINT8_T
# define HAVE_INT16_T
# define HAVE_UINT16_T
# define HAVE_INT32_T
# define HAVE_UINT32_T
# define HAVE_INT64_T
# define HAVE_UINT64_T
# define HAVE_INTPTR_T
# define HAVE_UINTPTR_T
# define HAVE_INT8_T
# define HAVE_UINT8_T
# define HAVE_INT16_T
# define HAVE_UINT16_T
# define HAVE_INT32_T
# define HAVE_UINT32_T
# define HAVE_INT64_T
# define HAVE_UINT64_T
# define HAVE_INTPTR_T
# define HAVE_UINTPTR_T
#endif
//#elif defined(sun) || defined(__sun) || defined(__sun__)
//# if defined(__SVR4)
//# define _FC_OS_SOLARIS
//# else
//# define _FC_OS_SUN_
//# endif
//# if defined(__SVR4)
//# define _FC_OS_SOLARIS
//# else
//# define _FC_OS_SUN_
//# endif
//#elif defined(hpux) || defined(__hpux) || defined(__hpux__)
//# define FC_OS_HPUX_
//# define FC_OS_HPUX_
//#elif defined(__FreeBSD__)
//# define FC_OS_FREEBSD
//# define FC_OS_FREEBSD
//#elif defined(__NetBSD__)
//# define FC_OS_NETBSD
//# define FC_OS_NETBSD
//#elif defined(__OpenBSD__)
//# define FC_OS_OPENBSD
//# define FC_OS_OPENBSD
//#elif defined(sgi) || defined(__sgi)
//# define FC_OS_IRIX
//# define FC_OS_IRIX
//#elif defined(_AIX)
//# define FC_OS_AIX
//# define FC_OS_AIX
//#elif defined(__GNU__)
//# define FC_OS_GNU
//# define FC_OS_GNU
#else
# error "FreeCAD is not ported to this OS yet. For help see www.freecadweb.org"
# error "FreeCAD is not ported to this OS yet. For help see www.freecadweb.org"
#endif
#ifdef FC_OS_WIN32
# define PATHSEP '\\'
# define PATHSEP '\\'
#else
# define PATHSEP '/'
# define PATHSEP '/'
#endif
//**************************************************************************
@@ -132,7 +132,7 @@
#ifndef HAVE_INT8_T
#define HAVE_INT8_T
typedef signed char int8_t;
typedef signed char int8_t;
#endif
#ifndef HAVE_UINT8_T
@@ -178,20 +178,20 @@ typedef unsigned __int64 uint64_t;
// Open CasCade
#ifdef _MSC_VER
# ifndef WNT
# define WNT
# endif
# ifndef WIN32
# define WIN32
# endif
# ifndef _WINDOWS
# define _WINDOWS
# endif
# ifndef WNT
# define WNT
# endif
# ifndef WIN32
# define WIN32
# endif
# ifndef _WINDOWS
# define _WINDOWS
# endif
#endif
#ifdef FC_OS_LINUX
# define LIN
# define LININTEL
# define LIN
# define LININTEL
//# define NO_CXX_EXCEPTION
#endif
@@ -199,19 +199,19 @@ typedef unsigned __int64 uint64_t;
/// enables the use of the OCC DocumentBrowser
#ifndef FC_OS_LINUX
# define FC_USE_OCAFBROWSER
# define FC_USE_OCAFBROWSER
#endif
#ifdef FC_OCC_DEBUG
# ifdef FC_DEBUG
# define DEBUG 1
# else
# undef DEBUG
# ifndef NDEBUG
# define NDEBUG
# endif
# endif
# ifdef FC_DEBUG
# define DEBUG 1
# else
# undef DEBUG
# ifndef NDEBUG
# define NDEBUG
# endif
# endif
#endif
@@ -281,49 +281,49 @@ typedef unsigned __int64 uint64_t;
// Don't catch C++ exceptions in DEBUG!
#ifdef FC_DEBUG
# define DONT_CATCH_CXX_EXCEPTIONS 1
# define DBG_TRY
# define DBG_CATCH(X)
# define DBG_TRY
# define DBG_CATCH(X)
#else
/// used to switch a catch with the debug state
# define DBG_TRY try {
# define DBG_TRY try {
/// see docu DBGTRY
# define DBG_CATCH(X) }catch(...) { X }
# define DBG_CATCH(X) } catch (...) { X }
#endif
//**************************************************************************
// Windows import export DLL defines
#if defined (FC_OS_WIN32) || defined(FC_OS_CYGWIN)
# ifdef FCApp
# define AppExport __declspec(dllexport)
# define DataExport __declspec(dllexport)
# else
# define AppExport __declspec(dllimport)
# define DataExport __declspec(dllimport)
# endif
# ifdef FCBase
# define BaseExport __declspec(dllexport)
# else
# define BaseExport __declspec(dllimport)
# endif
# ifdef FCGui
# define GuiExport __declspec(dllexport)
# else
# define GuiExport __declspec(dllimport)
# endif
# ifdef FCApp
# define AppExport __declspec(dllexport)
# define DataExport __declspec(dllexport)
# else
# define AppExport __declspec(dllimport)
# define DataExport __declspec(dllimport)
# endif
# ifdef FCBase
# define BaseExport __declspec(dllexport)
# else
# define BaseExport __declspec(dllimport)
# endif
# ifdef FCGui
# define GuiExport __declspec(dllexport)
# else
# define GuiExport __declspec(dllimport)
# endif
#else
# ifndef BaseExport
# define BaseExport
# endif
# ifndef GuiExport
# define GuiExport
# endif
# ifndef AppExport
# define AppExport
# endif
# ifndef DataExport
# define DataExport
# endif
# ifndef BaseExport
# define BaseExport
# endif
# ifndef GuiExport
# define GuiExport
# endif
# ifndef AppExport
# define AppExport
# endif
# ifndef DataExport
# define DataExport
# endif
#endif
@@ -342,5 +342,4 @@ typedef unsigned __int64 uint64_t;
//# define _PreComp_ // use precompiled header
#endif
#endif //FC_CONFIG_H
+4 -4
View File
@@ -230,10 +230,10 @@ struct PyMethodDef FreeCADGui_methods[] = {
Gui::MDIView* Application::activeView(void) const
{
if (activeDocument())
return activeDocument()->getActiveView();
else
return NULL;
if (activeDocument())
return activeDocument()->getActiveView();
else
return NULL;
}
} // namespace Gui
+2
View File
@@ -1070,6 +1070,7 @@ SET(FreeCADGui_CPP_SRCS
Document.cpp
DocumentModel.cpp
DocumentPyImp.cpp
DocumentObserver.cpp
ExpressionBinding.cpp
GraphicsViewZoom.cpp
ExpressionCompleter.cpp
@@ -1094,6 +1095,7 @@ SET(FreeCADGui_SRCS
BitmapFactory.h
Document.h
DocumentModel.h
DocumentObserver.h
ExpressionBinding.cpp
ExpressionCompleter.h
FreeCADGuiInit.py
+15 -1
View File
@@ -93,6 +93,7 @@ void DlgPropertyLink::findObjects(bool on)
QString docName = link[0];
QString objName = link[1];
QString parName = link[3];
QString searchText = ui->searchBox->text();
App::Document* doc = App::GetApplication().getDocument((const char*)docName.toLatin1());
if (doc) {
@@ -128,7 +129,13 @@ void DlgPropertyLink::findObjects(bool on)
std::vector<App::DocumentObject*> obj = doc->getObjectsOfType(baseType);
for (std::vector<App::DocumentObject*>::iterator it = obj.begin(); it != obj.end(); ++it) {
Gui::ViewProvider* vp = Gui::Application::Instance->getViewProvider(*it);
if (vp) {
bool nameOk = true;
if (!searchText.isEmpty()) {
QString label = QString::fromUtf8((*it)->Label.getValue());
if (!label.contains(searchText,Qt::CaseInsensitive))
nameOk = false;
}
if (vp && nameOk) {
// filter out the objects
if (std::find(outList.begin(), outList.end(), *it) == outList.end()) {
QListWidgetItem* item = new QListWidgetItem(ui->listWidget);
@@ -148,4 +155,11 @@ void DlgPropertyLink::on_checkObjectType_toggled(bool on)
findObjects(on);
}
void DlgPropertyLink::on_searchBox_textChanged(const QString& /*search*/)
{
ui->listWidget->clear();
bool on = ui->checkObjectType->isChecked();
findObjects(on);
}
#include "moc_DlgPropertyLink.cpp"
+1
View File
@@ -42,6 +42,7 @@ public:
private Q_SLOTS:
void on_checkObjectType_toggled(bool);
void on_searchBox_textChanged(const QString&);
private:
void findObjects(bool on);
+22 -4
View File
@@ -14,17 +14,35 @@
<string>Link</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QListWidget" name="listWidget"/>
</item>
<item row="1" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Search</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="searchBox">
<property name="toolTip">
<string>A search pattern to filter the results above</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="checkObjectType">
<property name="text">
<string>Show all object types</string>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="0" column="0">
<widget class="QListWidget" name="listWidget"/>
</item>
<item row="5" column="0">
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+137
View File
@@ -0,0 +1,137 @@
/***************************************************************************
* Copyright (c) 2008 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., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#include "PreCompiled.h"
#ifndef _PreComp_
# include <sstream>
#endif
#include <boost/signals.hpp>
#include <boost/bind.hpp>
#include "Application.h"
#include "Document.h"
#include "ViewProviderDocumentObject.h"
#include "DocumentObserver.h"
using namespace Gui;
DocumentObserver::DocumentObserver()
{
}
DocumentObserver::~DocumentObserver()
{
}
void DocumentObserver::attachDocument(Document* doc)
{
detachDocument();
if (doc == nullptr)
return;
this->connectDocumentCreatedObject = doc->signalNewObject.connect(boost::bind
(&DocumentObserver::slotCreatedObject, this, _1));
this->connectDocumentDeletedObject = doc->signalDeletedObject.connect(boost::bind
(&DocumentObserver::slotDeletedObject, this, _1));
this->connectDocumentChangedObject = doc->signalChangedObject.connect(boost::bind
(&DocumentObserver::slotChangedObject, this, _1, _2));
this->connectDocumentRelabelObject = doc->signalRelabelObject.connect(boost::bind
(&DocumentObserver::slotRelabelObject, this, _1));
this->connectDocumentActivateObject = doc->signalActivatedObject.connect(boost::bind
(&DocumentObserver::slotActivatedObject, this, _1));
this->connectDocumentEditObject = doc->signalInEdit.connect(boost::bind
(&DocumentObserver::slotEnterEditObject, this, _1));
this->connectDocumentResetObject = doc->signalResetEdit.connect(boost::bind
(&DocumentObserver::slotResetEditObject, this, _1));
this->connectDocumentUndo = doc->signalUndoDocument.connect(boost::bind
(&DocumentObserver::slotUndoDocument, this, _1));
this->connectDocumentRedo = doc->signalRedoDocument.connect(boost::bind
(&DocumentObserver::slotRedoDocument, this, _1));
}
void DocumentObserver::detachDocument()
{
this->connectDocumentCreatedObject.disconnect();
this->connectDocumentDeletedObject.disconnect();
this->connectDocumentChangedObject.disconnect();
this->connectDocumentRelabelObject.disconnect();
this->connectDocumentActivateObject.disconnect();
this->connectDocumentEditObject.disconnect();
this->connectDocumentResetObject.disconnect();
this->connectDocumentUndo.disconnect();
this->connectDocumentRedo.disconnect();
}
void DocumentObserver::enableNotifications(DocumentObserver::Notifications value)
{
this->connectDocumentCreatedObject.block(!(value & Create));
this->connectDocumentDeletedObject.block(!(value & Delete));
this->connectDocumentChangedObject.block(!(value & Change));
this->connectDocumentRelabelObject.block(!(value & Relabel));
this->connectDocumentActivateObject.block(!(value & Activate));
this->connectDocumentEditObject.block(!(value & Edit));
this->connectDocumentResetObject.block(!(value & Reset));
this->connectDocumentUndo.block(!(value & Undo));
this->connectDocumentRedo.block(!(value & Redo));
}
void DocumentObserver::slotUndoDocument(const Document& /*Doc*/)
{
}
void DocumentObserver::slotRedoDocument(const Document& /*Doc*/)
{
}
void DocumentObserver::slotCreatedObject(const ViewProviderDocumentObject& /*Obj*/)
{
}
void DocumentObserver::slotDeletedObject(const ViewProviderDocumentObject& /*Obj*/)
{
}
void DocumentObserver::slotChangedObject(const ViewProviderDocumentObject& /*Obj*/,
const App::Property& /*Prop*/)
{
}
void DocumentObserver::slotRelabelObject(const ViewProviderDocumentObject& /*Obj*/)
{
}
void DocumentObserver::slotActivatedObject(const ViewProviderDocumentObject& /*Obj*/)
{
}
void DocumentObserver::slotEnterEditObject(const ViewProviderDocumentObject& /*Obj*/)
{
}
void DocumentObserver::slotResetEditObject(const ViewProviderDocumentObject& /*Obj*/)
{
}
+115
View File
@@ -0,0 +1,115 @@
/***************************************************************************
* Copyright (c) 2008 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., 59 Temple Place, *
* Suite 330, Boston, MA 02111-1307, USA *
* *
***************************************************************************/
#ifndef GUI_DOCUMENTOBSERVER_H
#define GUI_DOCUMENTOBSERVER_H
#include <Base/BaseClass.h>
#include <boost/signals.hpp>
#include <QFlags>
namespace App { class Property; }
namespace Gui
{
class Document;
class ViewProviderDocumentObject;
/**
* The DocumentObserver class simplifies the step to write classes that listen
* to what happens inside a document.
* This is very useful for classes that needs to be notified when an observed
* object has changed.
*
* @author Werner Mayer
*/
class GuiExport DocumentObserver
{
public:
enum Notification {
None = 0x0000,
Create = 0x0001,
Delete = 0x0002,
Change = 0x0004,
Relabel = 0x0008,
Activate = 0x0010,
Edit = 0x0020,
Reset = 0x0040,
Undo = 0x0080,
Redo = 0x0100,
All = 0x01ff
};
Q_DECLARE_FLAGS(Notifications, Notification)
/// Constructor
DocumentObserver();
virtual ~DocumentObserver();
/** Attaches to another document, the old document
* is not longer observed then.
*/
void attachDocument(Document*);
/** Detaches from the current document, the document
* is not longer observed then.
*/
void detachDocument();
/** Activates the connection depending on the given value.
*/
void enableNotifications(Notifications value);
private:
/** Notifies when an object has been created. */
virtual void slotCreatedObject(const ViewProviderDocumentObject& Obj);
/** Notifies when the object is about to be removed. */
virtual void slotDeletedObject(const ViewProviderDocumentObject& Obj);
/** The property of an observed object has changed */
virtual void slotChangedObject(const ViewProviderDocumentObject& Obj,
const App::Property& Prop);
/** Notifies when the object has been relabeled. */
virtual void slotRelabelObject(const ViewProviderDocumentObject& Obj);
/** Notifies when the object has been activated. */
virtual void slotActivatedObject(const ViewProviderDocumentObject& Obj);
/** Notifies when the object entered edit mode. */
virtual void slotEnterEditObject(const ViewProviderDocumentObject& Obj);
/** Notifies when the object resets edit mode. */
virtual void slotResetEditObject(const ViewProviderDocumentObject& Obj);
/** Notifies on undo */
virtual void slotUndoDocument(const Document& Doc);
/** Notifies on redo */
virtual void slotRedoDocument(const Document& Doc);
private:
typedef boost::BOOST_SIGNALS_NAMESPACE::scoped_connection Connection;
Connection connectDocumentCreatedObject;
Connection connectDocumentDeletedObject;
Connection connectDocumentChangedObject;
Connection connectDocumentRelabelObject;
Connection connectDocumentActivateObject;
Connection connectDocumentEditObject;
Connection connectDocumentResetObject;
Connection connectDocumentUndo;
Connection connectDocumentRedo;
};
} //namespace Gui
#endif // GUI_DOCUMENTOBSERVER_H
+2 -2
View File
@@ -183,11 +183,11 @@ void ViewProviderGroupExtension::extensionHide(void) {
bool ViewProviderGroupExtension::extensionOnDelete(const std::vector< std::string >& ) {
auto* group = getExtendedViewProvider()->getObject()->getExtensionByType<App::GroupExtension>();
// If the group is nonempty ask the user if he wants to delete it's content
// If the group is nonempty ask the user if he wants to delete its content
if ( group->Group.getSize () ) {
QMessageBox::StandardButton choice =
QMessageBox::question ( 0, QObject::tr ( "Delete group content?" ),
QObject::tr ( "The %1 is not empty, delete it's content as well?")
QObject::tr ( "The %1 is not empty, delete its content as well?")
.arg ( QString::fromUtf8 ( getExtendedViewProvider()->getObject()->Label.getValue () ) ),
QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes );
+7 -3
View File
@@ -32,6 +32,8 @@
# include <QPixmap>
# include <QTextStream>
# include <QTimer>
# include <QApplication>
# include <QPalette>
#endif
#include <Base/Tools.h>
@@ -3369,20 +3371,22 @@ LinkLabel::~LinkLabel()
void LinkLabel::setPropertyLink(const QStringList& o)
{
link = o;
QString linkcolor = QApplication::palette().color(QPalette::Link).name();
QString text = QString::fromLatin1(
"<html><head><style type=\"text/css\">"
"p, li { white-space: pre-wrap; }"
"</style></head><body>"
"<p>"
"<a href=\"%1.%2\"><span style=\" text-decoration: underline; color:#0000ff;\">%3</span></a>"
"<a href=\"%1.%2\"><span style=\" text-decoration: underline; color:%3;\">%4</span></a>"
"<span> </span>"
"<a href=\"@__edit_link_prop__@\"><span style=\" text-decoration: underline; color:#0000ff;\">%4</span></a>"
"<a href=\"@__edit_link_prop__@\"><span style=\" text-decoration: underline; color:%5;\">%6</span></a>"
"</p></body></html>"
)
.arg(link[0])
.arg(link[1])
.arg(linkcolor)
.arg(link[2])
.arg(linkcolor)
.arg(tr("Edit..."));
setText(text);
}
+3 -1
View File
@@ -244,7 +244,9 @@ Building creation aborted.\n" )
ss += "]"
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Building"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeBuilding("+ss+")")
FreeCADGui.doCommand("obj = Arch.makeBuilding("+ss+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
+7 -3
View File
@@ -356,7 +356,7 @@ def closeHole(shape):
for face in shape.Faces:
for edge in face.Edges:
hc = edge.hashCode()
if lut.has_key(hc):
if hc in lut:
lut[hc] = lut[hc] + 1
else:
lut[hc] = 1
@@ -1290,9 +1290,11 @@ class _CommandComponent:
if sel:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Component"))
FreeCADGui.addModule("Arch")
FreeCADGui.addModule("Draft")
FreeCADGui.Control.closeDialog()
for o in sel:
FreeCADGui.doCommand("Arch.makeComponent(FreeCAD.ActiveDocument."+o.Name+")")
FreeCADGui.doCommand("obj = Arch.makeComponent(FreeCAD.ActiveDocument."+o.Name+")")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
@@ -1313,9 +1315,11 @@ class _CommandCloneComponent:
if sel:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Component"))
FreeCADGui.addModule("Arch")
FreeCADGui.addModule("Draft")
FreeCADGui.Control.closeDialog()
for o in sel:
FreeCADGui.doCommand("Arch.cloneComponent(FreeCAD.ActiveDocument."+o.Name+")")
FreeCADGui.doCommand("obj = Arch.cloneComponent(FreeCAD.ActiveDocument."+o.Name+")")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
+3 -1
View File
@@ -192,7 +192,9 @@ class _CommandEquipment:
base = s[0].Name
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Equipment")))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeEquipment(FreeCAD.ActiveDocument." + base + ")")
FreeCADGui.doCommand("obj = Arch.makeEquipment(FreeCAD.ActiveDocument." + base + ")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
# get diffuse color info from base object
+3 -1
View File
@@ -103,7 +103,9 @@ Floor creation aborted.\n" )
ss += "]"
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Floor"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeFloor("+ss+")")
FreeCADGui.doCommand("obj = Arch.makeFloor("+ss+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
+3 -1
View File
@@ -84,7 +84,9 @@ class _CommandFrame:
if len(s) == 2:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Frame"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeFrame(FreeCAD.ActiveDocument."+s[0].Name+",FreeCAD.ActiveDocument."+s[1].Name+")")
FreeCADGui.doCommand("obj = Arch.makeFrame(FreeCAD.ActiveDocument."+s[0].Name+",FreeCAD.ActiveDocument."+s[1].Name+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
+3 -1
View File
@@ -151,8 +151,10 @@ class CommandPanel:
return
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Panel")))
FreeCADGui.addModule("Arch")
FreeCADGui.addModule("Draft")
for obj in sel:
FreeCADGui.doCommand("Arch.makePanel(FreeCAD.ActiveDocument." + obj.Name + ",thickness=" + str(self.Thickness) + ")")
FreeCADGui.doCommand("obj = Arch.makePanel(FreeCAD.ActiveDocument." + obj.Name + ",thickness=" + str(self.Thickness) + ")")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
+9 -3
View File
@@ -117,12 +117,16 @@ class _CommandPipe:
if len(obj.Shape.Wires) == 1:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Pipe"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makePipe(FreeCAD.ActiveDocument."+obj.Name+")")
FreeCADGui.doCommand("obj = Arch.makePipe(FreeCAD.ActiveDocument."+obj.Name+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
else:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Pipe"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makePipe()")
FreeCADGui.doCommand("obj = Arch.makePipe()")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
@@ -159,7 +163,9 @@ class _CommandPipeConnector:
o += "]"
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Connector"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makePipeConnector("+o+")")
FreeCADGui.doCommand("obj = Arch.makePipeConnector("+o+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
+6 -2
View File
@@ -139,7 +139,9 @@ class _CommandRoof:
idx = int(sel.SubElementNames[0][4:])
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Roof"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeRoof(FreeCAD.ActiveDocument."+obj.Name+","+str(idx)+")")
FreeCADGui.doCommand("obj = Arch.makeRoof(FreeCAD.ActiveDocument."+obj.Name+","+str(idx)+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
@@ -147,7 +149,9 @@ class _CommandRoof:
if obj.Shape.Wires:
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Roof"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeRoof(FreeCAD.ActiveDocument."+obj.Name+")")
FreeCADGui.doCommand("obj = Arch.makeRoof(FreeCAD.ActiveDocument."+obj.Name+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
+1 -1
View File
@@ -137,7 +137,7 @@ def getSVG(section,allOn=False,renderMode="Wireframe",showHidden=False,showFill=
If showFill is True, the cut areas get filled with a pattern"""
if not section.Objects:
return
return ""
import Part,DraftGeomUtils
p = FreeCAD.Placement(section.Placement)
direction = p.Rotation.multVec(FreeCAD.Vector(0,0,1))
+3 -1
View File
@@ -290,7 +290,9 @@ Site creation aborted." )
ss += "]"
FreeCAD.ActiveDocument.openTransaction(translate("Arch","Create Site"))
FreeCADGui.addModule("Arch")
FreeCADGui.doCommand("Arch.makeSite("+ss+")")
FreeCADGui.doCommand("obj = Arch.makeSite("+ss+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
+4 -2
View File
@@ -229,9 +229,11 @@ class _CommandSpace:
if sel:
FreeCADGui.Control.closeDialog()
if len(sel) == 1:
FreeCADGui.doCommand("Arch.makeSpace(FreeCADGui.Selection.getSelection())")
FreeCADGui.doCommand("obj = Arch.makeSpace(FreeCADGui.Selection.getSelection())")
else:
FreeCADGui.doCommand("Arch.makeSpace(FreeCADGui.Selection.getSelectionEx())")
FreeCADGui.doCommand("obj = Arch.makeSpace(FreeCADGui.Selection.getSelectionEx())")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
else:
+4 -2
View File
@@ -91,9 +91,11 @@ class _CommandStairs:
FreeCADGui.addModule("Arch")
if len(FreeCADGui.Selection.getSelection()) == 1:
n = FreeCADGui.Selection.getSelection()[0].Name
FreeCADGui.doCommand("Arch.makeStairs(baseobj=FreeCAD.ActiveDocument."+n+")")
FreeCADGui.doCommand("obj = Arch.makeStairs(baseobj=FreeCAD.ActiveDocument."+n+")")
else:
FreeCADGui.doCommand("Arch.makeStairs(steps="+str(p.GetInt("StairsSteps",17))+")")
FreeCADGui.doCommand("obj = Arch.makeStairs(steps="+str(p.GetInt("StairsSteps",17))+")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
+9 -3
View File
@@ -155,9 +155,11 @@ class _CommandStructure:
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Structural System")))
FreeCADGui.addModule("Arch")
if st:
FreeCADGui.doCommand("Arch.makeStructuralSystem(" + ArchCommands.getStringList(st) + "," + ArchCommands.getStringList(ax) + ")")
FreeCADGui.doCommand("obj = Arch.makeStructuralSystem(" + ArchCommands.getStringList(st) + "," + ArchCommands.getStringList(ax) + ")")
else:
FreeCADGui.doCommand("Arch.makeStructuralSystem(axes=" + ArchCommands.getStringList(ax) + ")")
FreeCADGui.doCommand("obj = Arch.makeStructuralSystem(axes=" + ArchCommands.getStringList(ax) + ")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
@@ -165,7 +167,9 @@ class _CommandStructure:
FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Structure")))
FreeCADGui.addModule("Arch")
for obj in sel:
FreeCADGui.doCommand("Arch.makeStructure(FreeCAD.ActiveDocument." + obj.Name + ")")
FreeCADGui.doCommand("obj = Arch.makeStructure(FreeCAD.ActiveDocument." + obj.Name + ")")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
@@ -226,6 +230,8 @@ class _CommandStructure:
FreeCADGui.doCommand('s = Arch.makeStructure(length='+str(self.Length)+',width='+str(self.Width)+',height='+str(self.Height)+')')
FreeCADGui.doCommand('s.Placement.Base = '+DraftVecUtils.toString(point))
FreeCADGui.doCommand('s.Placement.Rotation=s.Placement.Rotation.multiply(FreeCAD.DraftWorkingPlane.getRotation().Rotation)')
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(s)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
if self.continueCmd:
+7 -3
View File
@@ -198,12 +198,14 @@ class _CommandWall:
if selobj.HasSubObjects:
if "Face" in selobj.SubElementNames[0]:
idx = int(selobj.SubElementNames[0][4:])
FreeCADGui.doCommand("Arch.makeWall(FreeCAD.ActiveDocument."+selobj.Object.Name+",face="+str(idx)+")")
FreeCADGui.doCommand("obj = Arch.makeWall(FreeCAD.ActiveDocument."+selobj.Object.Name+",face="+str(idx)+")")
spacedone = True
if not spacedone:
FreeCADGui.doCommand('Arch.makeWall(FreeCAD.ActiveDocument.'+selobj.Object.Name+')')
FreeCADGui.doCommand('obj = Arch.makeWall(FreeCAD.ActiveDocument.'+selobj.Object.Name+')')
else:
FreeCADGui.doCommand('Arch.makeWall(FreeCAD.ActiveDocument.'+selobj.Object.Name+')')
FreeCADGui.doCommand('obj = Arch.makeWall(FreeCAD.ActiveDocument.'+selobj.Object.Name+')')
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(obj)")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
done = True
@@ -273,6 +275,8 @@ class _CommandWall:
FreeCADGui.doCommand('base.addGeometry(trace)')
FreeCADGui.doCommand('wall = Arch.makeWall(base,width='+str(self.Width)+',height='+str(self.Height)+',align="'+str(self.Align)+'")')
FreeCADGui.doCommand('wall.Normal = FreeCAD.DraftWorkingPlane.axis')
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("Draft.autogroup(wall)")
def update(self,point,info):
"this function is called by the Snapper when the mouse is moved"
+1 -1
View File
@@ -57,7 +57,7 @@ class ArchWorkbench(Workbench):
"Draft_Clone"]
self.draftextratools = ["Draft_WireToBSpline","Draft_AddPoint","Draft_DelPoint","Draft_ShapeString",
"Draft_PathArray","Draft_Mirror","Draft_Stretch"]
self.draftcontexttools = ["Draft_ApplyStyle","Draft_ToggleDisplayMode","Draft_AddToGroup",
self.draftcontexttools = ["Draft_ApplyStyle","Draft_ToggleDisplayMode","Draft_AddToGroup","Draft_AutoGroup",
"Draft_SelectGroup","Draft_SelectPlane",
"Draft_ShowSnapBar","Draft_ToggleGrid","Draft_UndoLine",
"Draft_FinishLine","Draft_CloseLine"]
+173 -60
View File
@@ -233,7 +233,7 @@ def getGroupNames():
glist = []
doc = FreeCAD.ActiveDocument
for obj in doc.Objects:
if obj.TypeId == "App::DocumentObjectGroup":
if obj.isDerivedFrom("App::DocumentObjectGroup") or (getType(obj) in ["Floor","Building","Site"]):
glist.append(obj.Name)
return glist
@@ -243,6 +243,23 @@ def ungroup(obj):
grp = FreeCAD.ActiveDocument.getObject(g)
if grp.hasObject(obj):
grp.removeObject(obj)
def autogroup(obj):
"adds a given object to the autogroup, if applicable"
if FreeCAD.GuiUp:
if hasattr(FreeCADGui,"draftToolBar"):
if hasattr(FreeCADGui.draftToolBar,"autogroup") and (not FreeCADGui.draftToolBar.isConstructionMode()):
if FreeCADGui.draftToolBar.autogroup != None:
g = FreeCAD.ActiveDocument.getObject(FreeCADGui.draftToolBar.autogroup)
if g:
found = False
for o in g.Group:
if o.Name == obj.Name:
found = True
if not found:
gr = g.Group
gr.append(obj)
g.Group = gr
def dimSymbol(symbol=None,invert=False):
"returns the current dim symbol from the preferences as a pivy SoMarkerSet"
@@ -433,7 +450,7 @@ def formatObject(target,origin=None):
fcol = (float(fcol[0]),float(fcol[1]),float(fcol[2]),0.0)
lw = ui.linewidth
fs = ui.fontsize
if not origin:
if not origin or not hasattr(origin,'ViewObject'):
if "FontSize" in obrep.PropertiesList: obrep.FontSize = fs
if "TextColor" in obrep.PropertiesList: obrep.TextColor = col
if "LineWidth" in obrep.PropertiesList: obrep.LineWidth = lw
@@ -1168,6 +1185,7 @@ def extrude(obj,vector,solid=False):
if gui:
obj.ViewObject.Visibility = False
formatObject(newobj,obj)
select(newobj)
FreeCAD.ActiveDocument.recompute()
return newobj
@@ -1203,6 +1221,7 @@ def fuse(object1,object2):
object1.ViewObject.Visibility = False
object2.ViewObject.Visibility = False
formatObject(obj,object1)
select(obj)
FreeCAD.ActiveDocument.recompute()
return obj
@@ -1215,6 +1234,7 @@ def cut(object1,object2):
object1.ViewObject.Visibility = False
object2.ViewObject.Visibility = False
formatObject(obj,object1)
select(obj)
FreeCAD.ActiveDocument.recompute()
return obj
@@ -1282,7 +1302,7 @@ def move(objectslist,vector,copy=False):
if copy and getParam("selectBaseObjects",False):
select(objectslist)
else:
select(newobjlist)
select(newobjlist)
if len(newobjlist) == 1: return newobjlist[0]
return newobjlist
@@ -1438,7 +1458,8 @@ def scale(objectslist,delta=Vector(1,1,1),center=Vector(0,0,0),copy=False,legacy
elif (obj.TypeId == "App::Annotation"):
factor = delta.x * delta.y * delta.z * obj.ViewObject.FontSize.Value
obj.ViewObject.Fontsize = factor
if copy: formatObject(newobj,obj)
if copy:
formatObject(newobj,obj)
newobjlist.append(newobj)
if copy and getParam("selectBaseObjects",False):
select(objectslist)
@@ -1830,6 +1851,8 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct
def getDiscretized(edge):
ml = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetFloat("svgDiscretization",10.0)
if ml == 0:
ml = 10
d = int(edge.Length/ml)
if d == 0:
d = 1
@@ -2484,12 +2507,32 @@ def makeShape2DView(baseobj,projectionVector=None,facenumbers=[]):
FreeCAD.ActiveDocument.recompute()
return obj
def makeSketch(objectslist,autoconstraints=False,addTo=None,delete=False,name="Sketch"):
'''makeSketch(objectslist,[autoconstraints],[addTo],[delete],[name]): makes a Sketch
objectslist with the given Draft objects. If autoconstraints is True,
constraints will be automatically added to wire nodes, rectangles
and circles. If addTo is an existing sketch, geometry will be added to it instead of
creating a new one. If delete is True, the original object will be deleted'''
def makeSketch(objectslist,autoconstraints=False,addTo=None,
delete=False,name="Sketch",radiusPrecision=-1):
'''makeSketch(objectslist,[autoconstraints],[addTo],[delete],[name],[radiusPrecision]):
Makes a Sketch objectslist with the given Draft objects.
* objectlist: can be single or list of objects of Draft type objects,
Part::Feature, Part.Shape, or mix of them.
* autoconstraints(False): if True, constraints will be automatically added to
wire nodes, rectangles and circles.
* addTo(None) : if set to an existing sketch, geometry will be added to it
instead of creating a new one.
* delete(False): if True, the original object will be deleted.
If set to a string 'all' the object and all its linked object will be
deleted
* name('Sketch'): the name for the new sketch object
* radiusPrecision(-1): If <0, disable radius constraint. If =0, add indiviaul
radius constraint. If >0, the radius will be rounded according to this
precision, and 'Equal' constraint will be added to curve with equal
radius within precision.'''
import Part, DraftGeomUtils
from Sketcher import Constraint
import Sketcher
@@ -2501,20 +2544,46 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,delete=False,name="S
MiddlePoint = 3
deletable = None
if not isinstance(objectslist,list):
if not isinstance(objectslist,(list,tuple)):
objectslist = [objectslist]
for obj in objectslist:
if not DraftGeomUtils.isPlanar(obj.Shape):
if isinstance(obj,Part.Shape):
shape = obj
elif not obj.isDerivedFrom("Part::Feature"):
FreeCAD.Console.PrintError(translate("draft","not shape found"))
return None
else:
shape = obj.Shape
if not DraftGeomUtils.isPlanar(shape):
FreeCAD.Console.PrintError(translate("draft","All Shapes must be co-planar"))
return None
if addTo:
nobj = addTo
else:
nobj = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject", "Sketch")
nobj = FreeCAD.ActiveDocument.addObject("Sketcher::SketchObject", name)
deletable = nobj
nobj.ViewObject.Autoconstraints = False
startc = 0
endc = 0
# Collect constraints and add in one go to improve performance
constraints = []
radiuses = {}
def addRadiusConstraint(edge):
try:
if radiusPrecision<0:
return
if radiusPrecision==0:
constraints.append(Constraint('Radius',
nobj.GeometryCount-1, edge.Curve.Radius))
return
r = round(edge.Curve.Radius,radiusPrecision)
constraints.append(Constraint('Equal',
radiuses[r],nobj.GeometryCount-1))
except KeyError:
radiuses[r] = nobj.GeometryCount-1
constraints.append(Constraint('Radius',nobj.GeometryCount-1, r))
except AttributeError:
pass
rotation = None
for obj in objectslist:
@@ -2541,8 +2610,7 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,delete=False,name="S
last = math.radians(obj.LastAngle)
arc = Part.ArcOfCircle(circle, first, last)
nobj.addGeometry(arc)
# TODO add Radius constraits
addRadiusConstraint(edge)
ok = True
elif tp == "Rectangle":
if rotation is None:
@@ -2554,14 +2622,14 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,delete=False,name="S
last = nobj.GeometryCount - 1
segs = [last-3,last-2,last-1,last]
if obj.Placement.Rotation.Q == (0,0,0,1):
nobj.addConstraint(Constraint("Coincident",last-3,EndPoint,last-2,StartPoint))
nobj.addConstraint(Constraint("Coincident",last-2,EndPoint,last-1,StartPoint))
nobj.addConstraint(Constraint("Coincident",last-1,EndPoint,last,StartPoint))
nobj.addConstraint(Constraint("Coincident",last,EndPoint,last-3,StartPoint))
nobj.addConstraint(Constraint("Horizontal",last-3))
nobj.addConstraint(Constraint("Vertical",last-2))
nobj.addConstraint(Constraint("Horizontal",last-1))
nobj.addConstraint(Constraint("Vertical",last))
constraints.append(Constraint("Coincident",last-3,EndPoint,last-2,StartPoint))
constraints.append(Constraint("Coincident",last-2,EndPoint,last-1,StartPoint))
constraints.append(Constraint("Coincident",last-1,EndPoint,last,StartPoint))
constraints.append(Constraint("Coincident",last,EndPoint,last-3,StartPoint))
constraints.append(Constraint("Horizontal",last-3))
constraints.append(Constraint("Vertical",last-2))
constraints.append(Constraint("Horizontal",last-1))
constraints.append(Constraint("Vertical",last))
ok = True
elif tp in ["Wire","Polygon"]:
if obj.FilletRadius.Value == 0:
@@ -2592,67 +2660,112 @@ def makeSketch(objectslist,autoconstraints=False,addTo=None,delete=False,name="S
last = nobj.GeometryCount
segs = list(range(last-len(obj.Shape.Edges),last-1))
for seg in segs:
nobj.addConstraint(Constraint("Coincident",seg,EndPoint,seg+1,StartPoint))
constraints.append(Constraint("Coincident",seg,EndPoint,seg+1,StartPoint))
if DraftGeomUtils.isAligned(nobj.Geometry[seg],"x"):
nobj.addConstraint(Constraint("Vertical",seg))
constraints.append(Constraint("Vertical",seg))
elif DraftGeomUtils.isAligned(nobj.Geometry[seg],"y"):
nobj.addConstraint(Constraint("Horizontal",seg))
constraints.append(Constraint("Horizontal",seg))
if closed:
nobj.addConstraint(Constraint("Coincident",last-1,EndPoint,segs[0],StartPoint))
constraints.append(Constraint("Coincident",last-1,EndPoint,segs[0],StartPoint))
ok = True
elif obj.isDerivedFrom("Part::Feature"):
if not DraftGeomUtils.isPlanar(obj.Shape):
elif tp == 'Shape' or obj.isDerivedFrom("Part::Feature"):
shape = obj if tp == 'Shape' else obj.Shape
if not DraftGeomUtils.isPlanar(shape):
FreeCAD.Console.PrintError(translate("draft","The given object is not planar and cannot be converted into a sketch."))
return None
if rotation is None:
#rotation = obj.Placement.Rotation
norm = DraftGeomUtils.getNormal(obj.Shape)
norm = DraftGeomUtils.getNormal(shape)
if norm:
rotation = FreeCAD.Rotation(FreeCAD.Vector(0,0,1),norm)
else:
FreeCAD.Console.PrintWarning(translate("draft","Unable to guess the normal direction of this object"))
rotation = FreeCAD.Rotation()
norm = obj.Placement.Rotation.Axis
for e in obj.Shape.Edges:
for e in shape.Edges:
if DraftGeomUtils.geomType(e) in ["BSplineCurve","BezierCurve"]:
FreeCAD.Console.PrintError(translate("draft","BSplines and Bezier curves are not supported by this tool"))
return None
# if not addTo:
# nobj.Placement.Rotation = DraftGeomUtils.calculatePlacement(obj.Shape).Rotation
# nobj.Placement.Rotation = DraftGeomUtils.calculatePlacement(shape).Rotation
if autoconstraints:
for wire in obj.Shape.Wires:
for edge in wire.OrderedEdges:
nobj.addGeometry(DraftGeomUtils.orientEdge(edge))
endc += 1
segs = list(range(startc,endc))
for seg in segs:
for wire in shape.Wires:
last_count = nobj.GeometryCount
edges = wire.OrderedEdges
for edge in edges:
nobj.addGeometry(DraftGeomUtils.orientEdge(
edge,norm,make_arc=True))
addRadiusConstraint(edge)
for i,g in enumerate(nobj.Geometry[last_count:]):
if edges[i].Closed:
continue
seg = last_count+i
if DraftGeomUtils.isAligned(g,"x"):
constraints.append(Constraint("Vertical",seg))
elif DraftGeomUtils.isAligned(g,"y"):
constraints.append(Constraint("Horizontal",seg))
if seg == nobj.GeometryCount-1:
if wire.isClosed:
if nobj.Geometry[seg].EndPoint == nobj.Geometry[startc].StartPoint:
nobj.addConstraint(Constraint("Coincident",seg,EndPoint,startc,StartPoint))
elif nobj.Geometry[seg].StartPoint == nobj.Geometry[startc].EndPoint:
nobj.addConstraint(Constraint("Coincident",seg,StartPoint,startc,EndPoint))
if not wire.isClosed():
break
g2 = nobj.Geometry[last_count]
seg2 = last_count
else:
if nobj.Geometry[seg].EndPoint == nobj.Geometry[seg+1].StartPoint:
nobj.addConstraint(Constraint("Coincident",seg,EndPoint,seg+1,StartPoint))
elif nobj.Geometry[seg].StartPoint == nobj.Geometry[seg+1].EndPoint:
nobj.addConstraint(Constraint("Coincident",seg,StartPoint,seg+1,EndPoint))
if DraftGeomUtils.isAligned(nobj.Geometry[seg],"x"):
nobj.addConstraint(Constraint("Vertical",seg))
elif DraftGeomUtils.isAligned(nobj.Geometry[seg],"y"):
nobj.addConstraint(Constraint("Horizontal",seg))
startc = endc
seg2 = seg+1
g2 = nobj.Geometry[seg2]
end1 = g.value(g.LastParameter)
start2 = g2.value(g2.FirstParameter)
if DraftVecUtils.equals(end1,start2) :
constraints.append(Constraint(
"Coincident",seg,EndPoint,seg2,StartPoint))
continue
end2 = g2.value(g2.LastParameter)
start1 = g.value(g.FirstParameter)
if DraftVecUtils.equals(end2,start1):
constraints.append(Constraint(
"Coincident",seg,StartPoint,seg2,EndPoint))
elif DraftVecUtils.equals(start1,start2):
constraints.append(Constraint(
"Coincident",seg,StartPoint,seg2,StartPoint))
elif DraftVecUtils.equals(end1,end2):
constraints.append(Constraint(
"Coincident",seg,EndPoint,seg2,EndPoint))
else:
for edge in obj.Shape.Edges:
nobj.addGeometry(DraftGeomUtils.orientEdge(edge,norm))
for wire in shape.Wires:
for edge in wire.OrderedEdges:
nobj.addGeometry(DraftGeomUtils.orientEdge(
edge,norm,make_arc=True))
ok = True
formatObject(nobj,obj)
if ok and delete:
FreeCAD.ActiveDocument.removeObject(obj.Name)
if ok and delete and obj.isDerivedFrom("Part::Feature"):
doc = obj.Document
def delObj(obj):
if obj.InList:
FreeCAD.Console.PrintWarning(translate("draft",
"Cannot delete object {} with dependency\n".format(obj.Label)))
else:
doc.removeObject(obj.Name)
try:
if delete == 'all':
objs = [obj]
while objs:
obj = objs[0]
objs = objs[1:] + obj.OutList
delObj(obj)
else:
delObj(obj)
except Exception as ex:
FreeCAD.Console.PrintWarning(translate("draft",
"Failed to delete object {}: {}\n".format(obj.Label,ex)))
if rotation:
nobj.Placement.Rotation = rotation
else:
print("-----error!!! rotation is still None...")
nobj.addConstraint(constraints)
FreeCAD.ActiveDocument.recompute()
return nobj
@@ -2685,6 +2798,7 @@ def makePoint(X=0, Y=0, Z=0,color=None,name = "Point", point_size= 5):
obj.ViewObject.PointColor = (float(color[0]), float(color[1]), float(color[2]))
obj.ViewObject.PointSize = point_size
obj.ViewObject.Visibility = True
select(obj)
FreeCAD.ActiveDocument.recompute()
return obj
@@ -2878,6 +2992,7 @@ def makeFacebinder(selectionset,name="Facebinder"):
_ViewProviderFacebinder(fb.ViewObject)
faces = []
fb.Proxy.addSubobjects(fb,selectionset)
select(fb)
return fb
@@ -3240,7 +3355,6 @@ def upgrade(objects,delete=False,force=None):
deleteList = []
for n in names:
FreeCAD.ActiveDocument.removeObject(n)
return [addList,deleteList]
def downgrade(objects,delete=False,force=None):
@@ -3441,7 +3555,6 @@ def downgrade(objects,delete=False,force=None):
deleteList = []
for n in names:
FreeCAD.ActiveDocument.removeObject(n)
return [addList,deleteList]
+4 -1
View File
@@ -535,7 +535,7 @@ def pocket2d(shape,offset):
offsetWires = [o for o in offsetWires if o != None]
return offsetWires
def orientEdge(edge, normal=None):
def orientEdge(edge, normal=None, make_arc=False):
"""Re-orients 'edge' such that it is in the x-y plane. If 'normal' is passed, this
is used as the basis for the rotation, otherwise the Placement property of 'edge'
is used"""
@@ -555,6 +555,9 @@ def orientEdge(edge, normal=None):
edge.rotate(base, axis, angle)
if isinstance(edge.Curve,Part.Line):
return Part.LineSegment(edge.Curve,edge.FirstParameter,edge.LastParameter)
elif make_arc and isinstance(edge.Curve,Part.Circle) and not edge.Closed:
return Part.ArcOfCircle(edge.Curve, edge.FirstParameter,
edge.LastParameter,edge.Curve.Axis.z>0)
return edge.Curve
def mirror (point, edge):
+31 -4
View File
@@ -256,6 +256,7 @@ class DraftToolBar:
self.y = 0
self.z = 0
self.uiloader = FreeCADGui.UiLoader()
self.autogroup = None
if self.taskmode:
# add only a dummy widget, since widgets are created on demand
@@ -334,13 +335,14 @@ class DraftToolBar:
return lineedit
def _inputfield (self,name, layout, hide=True, width=None):
p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/General")
bsize = p.GetInt("ToolbarIconSize",24)-2
inputfield = self.uiloader.createWidget("Gui::InputField")
inputfield.setObjectName(name)
if hide: inputfield.hide()
if not width: width = 800
inputfield.setMaximumSize(QtCore.QSize(width,bsize))
if not width:
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
inputfield.setSizePolicy(sizePolicy)
else:
inputfield.setMaximumWidth(width)
layout.addWidget(inputfield)
return inputfield
@@ -603,6 +605,8 @@ class DraftToolBar:
self.widthButton.setSuffix("px")
self.fontsizeButton = self._spinbox("fontsizeButton",self.bottomtray, val=self.fontsize,vmax=999, hide=False,double=True,size=(bsize * 3,bsize))
self.applyButton = self._pushbutton("applyButton", self.toptray, hide=False, icon='Draft_Apply',width=22)
self.autoGroupButton = self._pushbutton("autoGroup",self.bottomtray,icon="Draft_AutoGroup_off",hide=False,width=120)
self.autoGroupButton.setText("None")
QtCore.QObject.connect(self.wplabel,QtCore.SIGNAL("pressed()"),self.selectplane)
QtCore.QObject.connect(self.colorButton,QtCore.SIGNAL("pressed()"),self.getcol)
@@ -611,6 +615,7 @@ class DraftToolBar:
QtCore.QObject.connect(self.fontsizeButton,QtCore.SIGNAL("valueChanged(double)"),self.setfontsize)
QtCore.QObject.connect(self.applyButton,QtCore.SIGNAL("pressed()"),self.apply)
QtCore.QObject.connect(self.constrButton,QtCore.SIGNAL("toggled(bool)"),self.toggleConstrMode)
QtCore.QObject.connect(self.autoGroupButton,QtCore.SIGNAL("pressed()"),self.runAutoGroup)
def setupStyle(self):
style = "#constrButton:Checked {background-color: "
@@ -724,6 +729,7 @@ class DraftToolBar:
self.fontsizeButton.setToolTip(translate("draft", "Font Size"))
self.applyButton.setToolTip(translate("draft", "Apply to selected objects"))
self.constrButton.setToolTip(translate("draft", "Toggles Construction Mode"))
self.autoGroupButton.setToolTip(translate("draft", "Sets/unsets auto-grouping"))
#---------------------------------------------------------------------------
# Interface modes
@@ -1727,6 +1733,27 @@ class DraftToolBar:
self.radiusValue.setText(t)
self.radiusValue.setFocus()
def runAutoGroup(self):
FreeCADGui.runCommand("Draft_AutoGroup")
def setAutoGroup(self,value=None):
if value == None:
self.autogroup = None
self.autoGroupButton.setText("None")
self.autoGroupButton.setIcon(QtGui.QIcon(':/icons/Draft_AutoGroup_off.svg'))
self.autoGroupButton.setDown(False)
else:
obj = FreeCAD.ActiveDocument.getObject(value)
if obj:
self.autogroup = value
self.autoGroupButton.setText(obj.Label)
self.autoGroupButton.setIcon(QtGui.QIcon(':/icons/Draft_AutoGroup_on.svg'))
self.autoGroupButton.setDown(False)
else:
self.autogroup = None
self.autoGroupButton.setText("None")
self.autoGroupButton.setIcon(QtGui.QIcon(':/icons/Draft_AutoGroup_off.svg'))
self.autoGroupButton.setDown(False)
def show(self):
if not self.taskmode:
+118 -44
View File
@@ -475,14 +475,16 @@ class Line(Creator):
'line.Z1 = '+str(p1.z),
'line.X2 = '+str(p2.x),
'line.Y2 = '+str(p2.y),
'line.Z2 = '+str(p2.z)])
'line.Z2 = '+str(p2.z),
'Draft.autogroup(line)'])
else:
# building command string
rot,sup,pts,fil = self.getStrings()
FreeCADGui.addModule("Draft")
self.commit(translate("draft","Create DWire"),
['points='+pts,
'Draft.makeWire(points,closed='+str(closed)+',face='+fil+',support='+sup+')'])
'line = Draft.makeWire(points,closed='+str(closed)+',face='+fil+',support='+sup+')',
'Draft.autogroup(line)'])
Creator.finish(self)
if self.ui:
if self.ui.continueMode:
@@ -609,7 +611,7 @@ class Wire(Line):
rems = ["FreeCAD.ActiveDocument.removeObject(\""+o.Name+"\")" for o in FreeCADGui.Selection.getSelection()]
FreeCADGui.addModule("Draft")
todo.delayCommit([(translate("draft","Convert to Wire"),
['Draft.makeWire(['+pts+'])']+rems)])
['wire = Draft.makeWire(['+pts+'])']+rems+['Draft.autogroup(wire)'])])
return
Line.Activated(self,name=translate("draft","DWire"))
@@ -703,8 +705,9 @@ class BSpline(Line):
rot,sup,pts,fil = self.getStrings()
FreeCADGui.addModule("Draft")
self.commit(translate("draft","Create BSpline"),
['points='+pts,
'Draft.makeBSpline(points,closed='+str(closed)+',face='+fil+',support='+sup+')'])
['points = '+pts,
'spline = Draft.makeBSpline(points,closed='+str(closed)+',face='+fil+',support='+sup+')',
'Draft.autogroup(spline)'])
except:
print("Draft: error delaying commit")
Creator.finish(self)
@@ -806,8 +809,9 @@ class BezCurve(Line):
rot,sup,pts,fil = self.getStrings()
FreeCADGui.addModule("Draft")
self.commit(translate("draft","Create BezCurve"),
['points='+pts,
'Draft.makeBezCurve(points,closed='+str(closed)+',support='+sup+')'])
['points = '+pts,
'bez = Draft.makeBezCurve(points,closed='+str(closed)+',support='+sup+')',
'Draft.autogroup(bez)'])
except:
print("Draft: error delaying commit")
Creator.finish(self)
@@ -919,15 +923,15 @@ class Rectangle(Creator):
try:
# building command string
rot,sup,pts,fil = self.getStrings()
base = p1
if length < 0:
length = -length
base = base.add((p1.sub(p4)).negative())
if height < 0:
height = -height
base = base.add((p1.sub(p2)).negative())
if Draft.getParam("UsePartPrimitives",False):
# Use Part Primitive
base = p1
if length < 0:
length = -length
base = base.add((p1.sub(p4)).negative())
if height < 0:
height = -height
base = base.add((p1.sub(p2)).negative())
self.commit(translate("draft","Create Plane"),
['plane = FreeCAD.ActiveDocument.addObject("Part::Plane","Plane")',
'plane.Length = '+str(length),
@@ -935,14 +939,16 @@ class Rectangle(Creator):
'pl = FreeCAD.Placement()',
'pl.Rotation.Q='+rot,
'pl.Base = '+DraftVecUtils.toString(base),
'plane.Placement = pl'])
'plane.Placement = pl',
'Draft.autogroup(plane)'])
else:
FreeCADGui.addModule("Draft")
self.commit(translate("draft","Create Rectangle"),
['pl = FreeCAD.Placement()',
'pl.Rotation.Q = '+rot,
'pl.Base = '+DraftVecUtils.toString(p1),
'Draft.makeRectangle(length='+str(length)+',height='+str(height)+',placement=pl,face='+fil+',support='+sup+')'])
'pl.Base = '+DraftVecUtils.toString(base),
'rec = Draft.makeRectangle(length='+str(length)+',height='+str(height)+',placement=pl,face='+fil+',support='+sup+')',
'Draft.autogroup(rec)'])
except:
print("Draft: error delaying commit")
self.finish(cont=True)
@@ -1193,7 +1199,8 @@ class Arc(Creator):
'pl = FreeCAD.Placement()',
'pl.Rotation.Q = '+rot,
'pl.Base = '+DraftVecUtils.toString(self.center),
'circle.Placement = pl'])
'circle.Placement = pl',
'Draft.autogroup(circle)'])
else:
# building command string
FreeCADGui.addModule("Draft")
@@ -1201,7 +1208,8 @@ class Arc(Creator):
['pl=FreeCAD.Placement()',
'pl.Rotation.Q='+rot,
'pl.Base='+DraftVecUtils.toString(self.center),
'Draft.makeCircle(radius='+str(self.rad)+',placement=pl,face='+fil+',support='+sup+')'])
'circle = Draft.makeCircle(radius='+str(self.rad)+',placement=pl,face='+fil+',support='+sup+')',
'Draft.autogroup(circle)'])
except:
print("Draft: error delaying commit")
else:
@@ -1226,7 +1234,8 @@ class Arc(Creator):
'pl = FreeCAD.Placement()',
'pl.Rotation.Q = '+rot,
'pl.Base = '+DraftVecUtils.toString(self.center),
'circle.Placement = pl'])
'circle.Placement = pl',
'Draft.autogroup(circle)'])
else:
# building command string
FreeCADGui.addModule("Draft")
@@ -1234,7 +1243,8 @@ class Arc(Creator):
['pl=FreeCAD.Placement()',
'pl.Rotation.Q='+rot,
'pl.Base='+DraftVecUtils.toString(self.center),
'Draft.makeCircle(radius='+str(self.rad)+',placement=pl,face='+fil+',startangle='+str(sta)+',endangle='+str(end)+',support='+sup+')'])
'circle = Draft.makeCircle(radius='+str(self.rad)+',placement=pl,face='+fil+',startangle='+str(sta)+',endangle='+str(end)+',support='+sup+')',
'Draft.autogroup(circle)'])
except:
print("Draft: error delaying commit")
self.finish(cont=True)
@@ -1449,15 +1459,17 @@ class Polygon(Creator):
'pol.Polygon = ' + str(self.ui.numFaces.value()),
'pol.Circumradius = ' + str(self.rad),
'pol.Placement = pl',
'Draft.autogroup(pol)'
'FreeCAD.ActiveDocument.recompute()'])
else:
# building command string
FreeCADGui.addModule("Draft")
self.commit(translate("draft","Create Polygon"),
['pl=FreeCAD.Placement()',
'pl.Rotation.Q=' + rot,
'pl.Base=' + DraftVecUtils.toString(self.center),
'Draft.makePolygon(' + str(self.ui.numFaces.value()) + ',radius=' + str(self.rad) + ',inscribed=True,placement=pl,face=' + fil + ',support=' + sup + ')'])
'pl.Rotation.Q = ' + rot,
'pl.Base = ' + DraftVecUtils.toString(self.center),
'pol = Draft.makePolygon(' + str(self.ui.numFaces.value()) + ',radius=' + str(self.rad) + ',inscribed=True,placement=pl,face=' + fil + ',support=' + sup + ')',
'Draft.autogroup(pol)'])
FreeCAD.ActiveDocument.recompute()
self.finish(cont=True)
@@ -1553,14 +1565,16 @@ class Ellipse(Creator):
'pl = FreeCAD.Placement()',
'pl.Rotation.Q='+rot,
'pl.Base = '+DraftVecUtils.toString(center),
'ellipse.Placement = pl'])
'ellipse.Placement = pl',
'Draft.autogroup(ellipse)'])
else:
FreeCADGui.addModule("Draft")
self.commit(translate("draft","Create Ellipse"),
['pl = FreeCAD.Placement()',
'pl.Rotation.Q='+rot,
'pl.Rotation.Q = '+rot,
'pl.Base = '+DraftVecUtils.toString(center),
'Draft.makeEllipse('+str(r1)+','+str(r2)+',placement=pl,face='+fil+',support='+sup+')'])
'ellipse = Draft.makeEllipse('+str(r1)+','+str(r2)+',placement=pl,face='+fil+',support='+sup+')',
'Draft.autogroup(ellipse)'])
except:
print("Draft: Error: Unable to create object.")
self.finish(cont=True)
@@ -1646,7 +1660,8 @@ class Text(Creator):
tx += ']'
FreeCADGui.addModule("Draft")
self.commit(translate("draft","Create Text"),
['Draft.makeText('+tx+',point='+DraftVecUtils.toString(self.node[0])+')'])
['text = Draft.makeText('+tx+',point='+DraftVecUtils.toString(self.node[0])+')',
'Draft.autogroup(text)'])
self.finish(cont=True)
@@ -1779,8 +1794,9 @@ class Dimension(Creator):
p3 = Vector(pt.point.getValues()[2].getValue())
FreeCADGui.addModule("Draft")
self.commit(translate("draft","Create Dimension"),
['Draft.makeDimension('+DraftVecUtils.toString(p1)+','+DraftVecUtils.toString(p2)+','+DraftVecUtils.toString(p3)+')',
'FreeCAD.ActiveDocument.removeObject("'+o.Name+'")'])
['dim = Draft.makeDimension('+DraftVecUtils.toString(p1)+','+DraftVecUtils.toString(p2)+','+DraftVecUtils.toString(p3)+')',
'FreeCAD.ActiveDocument.removeObject("'+o.Name+'")',
'Draft.autogroup(dim)'])
def createObject(self):
"creates an object in the current doc"
@@ -1793,24 +1809,30 @@ class Dimension(Creator):
v2 = DraftGeomUtils.vec(self.edges[1])
normal = DraftVecUtils.toString((v1.cross(v2)).normalize())
self.commit(translate("draft","Create Dimension"),
['Draft.makeAngularDimension(center='+DraftVecUtils.toString(self.center)+',angles=['+str(self.angledata[0])+','+str(self.angledata[1])+'],p3='+DraftVecUtils.toString(self.node[-1])+',normal='+normal+')'])
['dim = Draft.makeAngularDimension(center='+DraftVecUtils.toString(self.center)+',angles=['+str(self.angledata[0])+','+str(self.angledata[1])+'],p3='+DraftVecUtils.toString(self.node[-1])+',normal='+normal+')',
'Draft.autogroup(dim)'])
elif self.link and (not self.arcmode):
ops = []
if self.force == 1:
self.commit(translate("draft","Create Dimension"),
['dim = Draft.makeDimension(FreeCAD.ActiveDocument.'+self.link[0].Name+','+str(self.link[1])+','+str(self.link[2])+','+DraftVecUtils.toString(self.node[2])+')','dim.Direction=FreeCAD.Vector(0,1,0)'])
['dim = Draft.makeDimension(FreeCAD.ActiveDocument.'+self.link[0].Name+','+str(self.link[1])+','+str(self.link[2])+','+DraftVecUtils.toString(self.node[2])+')','dim.Direction=FreeCAD.Vector(0,1,0)',
'Draft.autogroup(dim)'])
elif self.force == 2:
self.commit(translate("draft","Create Dimension"),
['dim = Draft.makeDimension(FreeCAD.ActiveDocument.'+self.link[0].Name+','+str(self.link[1])+','+str(self.link[2])+','+DraftVecUtils.toString(self.node[2])+')','dim.Direction=FreeCAD.Vector(1,0,0)'])
['dim = Draft.makeDimension(FreeCAD.ActiveDocument.'+self.link[0].Name+','+str(self.link[1])+','+str(self.link[2])+','+DraftVecUtils.toString(self.node[2])+')','dim.Direction=FreeCAD.Vector(1,0,0)',
'Draft.autogroup(dim)'])
else:
self.commit(translate("draft","Create Dimension"),
['Draft.makeDimension(FreeCAD.ActiveDocument.'+self.link[0].Name+','+str(self.link[1])+','+str(self.link[2])+','+DraftVecUtils.toString(self.node[2])+')'])
['dim = Draft.makeDimension(FreeCAD.ActiveDocument.'+self.link[0].Name+','+str(self.link[1])+','+str(self.link[2])+','+DraftVecUtils.toString(self.node[2])+')',
'Draft.autogroup(dim)'])
elif self.arcmode:
self.commit(translate("draft","Create Dimension"),
['Draft.makeDimension(FreeCAD.ActiveDocument.'+self.link[0].Name+','+str(self.link[1])+',"'+str(self.arcmode)+'",'+DraftVecUtils.toString(self.node[2])+')'])
['dim = Draft.makeDimension(FreeCAD.ActiveDocument.'+self.link[0].Name+','+str(self.link[1])+',"'+str(self.arcmode)+'",'+DraftVecUtils.toString(self.node[2])+')',
'Draft.autogroup(dim)'])
else:
self.commit(translate("draft","Create Dimension"),
['Draft.makeDimension('+DraftVecUtils.toString(self.node[0])+','+DraftVecUtils.toString(self.node[1])+','+DraftVecUtils.toString(self.node[2])+')'])
['dim = Draft.makeDimension('+DraftVecUtils.toString(self.node[0])+','+DraftVecUtils.toString(self.node[1])+','+DraftVecUtils.toString(self.node[2])+')',
'Draft.autogroup(dim)'])
if self.ui.continueMode:
self.cont = self.node[2]
if not self.dir:
@@ -2064,7 +2086,8 @@ class ShapeString(Creator):
'plm.Base='+DraftVecUtils.toString(self.ssBase),
'plm.Rotation.Q='+qr,
'ss.Placement=plm',
'ss.Support='+sup])
'ss.Support='+sup,
'Draft.autogroup(ss)'])
except Exception as e:
msg("Draft_ShapeString: error delaying commit", "error")
self.finish()
@@ -4609,16 +4632,18 @@ class Point(Creator):
commitlist = []
if Draft.getParam("UsePartPrimitives",False):
# using
commitlist.append((translate("draft","Create Point"),
commitlist.append(translate("draft","Create Point"),
['point = FreeCAD.ActiveDocument.addObject("Part::Vertex","Point")',
'point.X = '+str(self.stack[0][0]),
'point.Y = '+str(self.stack[0][1]),
'point.Z = '+str(self.stack[0][2])]))
'point.Z = '+str(self.stack[0][2]),
'Draft.autogroup(point)'])
else:
# building command string
FreeCADGui.addModule("Draft")
commitlist.append((translate("draft","Create Point"),
['Draft.makePoint('+str(self.stack[0][0])+','+str(self.stack[0][1])+','+str(self.stack[0][2])+')']))
commitlist.append(translate("draft","Create Point"),
['point = Draft.makePoint('+str(self.stack[0][0])+','+str(self.stack[0][1])+','+str(self.stack[0][2])+')',
'Draft.autogroup(point)'])
todo.delayCommit(commitlist)
FreeCADGui.Snapper.off()
self.finish()
@@ -4740,7 +4765,8 @@ class Draft_Facebinder(Creator):
FreeCAD.ActiveDocument.openTransaction("Facebinder")
FreeCADGui.addModule("Draft")
FreeCADGui.doCommand("s = FreeCADGui.Selection.getSelectionEx()")
FreeCADGui.doCommand("Draft.makeFacebinder(s)")
FreeCADGui.doCommand("f = Draft.makeFacebinder(s)")
FreeCADGui.doCommand('Draft.autogroup(f)')
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
self.finish()
@@ -4772,11 +4798,13 @@ class VisGroup():
FreeCADGui.addModule("Draft")
if len(s) == 1:
if s[0].isDerivedFrom("App::DocumentObjectGroup"):
FreeCADGui.doCommand("Draft.makeVisGroup(FreeCAD.ActiveDocument."+s[0].Name+")")
FreeCADGui.doCommand("v = Draft.makeVisGroup(FreeCAD.ActiveDocument."+s[0].Name+")")
FreeCADGui.doCommand('Draft.autogroup(v)')
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
return
FreeCADGui.doCommand("Draft.makeVisGroup()")
FreeCADGui.doCommand("v = Draft.makeVisGroup()")
FreeCADGui.doCommand('Draft.autogroup(v)')
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
@@ -4957,6 +4985,51 @@ class Draft_Slope():
FreeCADGui.Control.closeDialog()
FreeCAD.ActiveDocument.recompute()
class SetAutoGroup():
"The SetAutoGroup FreeCAD command definition"
def GetResources(self):
return {'Pixmap' : 'Draft_AutoGroup',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Draft_AutoGroup", "AutoGroup"),
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Draft_AutoGroup", "Select a group to automatically add all Draft & Arch objects to")}
def IsActive(self):
if FreeCADGui.ActiveDocument:
return True
else:
return False
def Activated(self):
if hasattr(FreeCADGui,"draftToolBar"):
self.ui = FreeCADGui.draftToolBar
s = FreeCADGui.Selection.getSelection()
if len(s) == 1:
if s[0].isDerivedFrom("App::DocumentObjectGroup") or (Draft.getType(s[0]) in ["Site","Building","Floor"]):
self.ui.setAutoGroup(s[0].Name)
return
self.groups = ["None"]
gn = Draft.getGroupNames()
if gn:
self.groups.extend(gn)
self.labels = ["None"]
for g in gn:
o = FreeCAD.ActiveDocument.getObject(g)
if o:
self.labels.append(o.Label)
self.ui.sourceCmd = self
self.ui.popupMenu(self.labels)
def proceed(self,labelname):
self.ui.sourceCmd = None
if labelname == "None":
self.ui.setAutoGroup(None)
else:
if labelname in self.labels:
i = self.labels.index(labelname)
self.ui.setAutoGroup(self.groups[i])
#---------------------------------------------------------------------------
# Snap tools
#---------------------------------------------------------------------------
@@ -5198,6 +5271,7 @@ FreeCADGui.addCommand('Draft_Shape2DView',Shape2DView())
FreeCADGui.addCommand('Draft_ShowSnapBar',ShowSnapBar())
FreeCADGui.addCommand('Draft_ToggleGrid',ToggleGrid())
FreeCADGui.addCommand('Draft_FlipDimension',Draft_FlipDimension())
FreeCADGui.addCommand('Draft_AutoGroup',SetAutoGroup())
# snap commands
FreeCADGui.addCommand('Draft_Snap_Lock',Draft_Snap_Lock())
+1 -1
View File
@@ -79,7 +79,7 @@ class DraftWorkbench (Workbench):
"Draft_PathArray","Draft_Clone","Draft_Drawing","Draft_Mirror","Draft_Stretch"]
self.treecmdList = ["Draft_ApplyStyle","Draft_ToggleDisplayMode","Draft_AddToGroup",
"Draft_SelectGroup","Draft_SelectPlane",
"Draft_ShowSnapBar","Draft_ToggleGrid"]
"Draft_ShowSnapBar","Draft_ToggleGrid","Draft_AutoGroup"]
self.lineList = ["Draft_UndoLine","Draft_FinishLine","Draft_CloseLine"]
self.utils = ["Draft_VisGroup","Draft_Heal","Draft_FlipDimension",
"Draft_ToggleConstructionMode","Draft_ToggleContinueMode","Draft_Edit",
+3
View File
@@ -72,6 +72,9 @@
<file>icons/Draft_Slope.svg</file>
<file>icons/DraftWorkbench.svg</file>
<file>icons/Draft_Stretch.svg</file>
<file>icons/Draft_AutoGroup.svg</file>
<file>icons/Draft_AutoGroup_on.svg</file>
<file>icons/Draft_AutoGroup_off.svg</file>
<file>patterns/concrete.svg</file>
<file>patterns/cross.svg</file>
<file>patterns/line.svg</file>
@@ -0,0 +1,453 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64px"
height="64px"
id="svg3612"
version="1.1"
inkscape:version="0.92.0 r15299"
sodipodi:docname="Draft_AutoGroup.svg">
<defs
id="defs3614">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective3620" />
<inkscape:perspective
id="perspective3588"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3692"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient3144-6">
<stop
id="stop3146-9"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3148-2"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3701">
<stop
id="stop3703"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3705"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-6"
id="radialGradient3688"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<linearGradient
id="linearGradient3708">
<stop
id="stop3710"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3712"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<inkscape:perspective
id="perspective3805"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-0-0"
id="linearGradient3934"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.2210246,-0.5789261,-0.71699693,-0.35346705,519.98085,464.19243)"
x1="696.67322"
y1="77.046234"
x2="654.80023"
y2="115.01974" />
<linearGradient
id="linearGradient3864-0-0">
<stop
id="stop3866-5-7"
offset="0"
style="stop-color:#0619c0;stop-opacity:1;" />
<stop
id="stop3868-7-6"
offset="1"
style="stop-color:#379cfb;stop-opacity:1;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="linearGradient3942"
x1="597.77283"
y1="44.024342"
x2="619.30328"
y2="30.27434"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3377">
<stop
id="stop3379"
offset="0"
style="stop-color:#ffaa00;stop-opacity:1;" />
<stop
id="stop3381"
offset="1"
style="stop-color:#faff2b;stop-opacity:1;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-0"
id="linearGradient3657"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.2210246,-0.5789261,-0.71699693,-0.35346705,536.41251,472.3612)"
x1="696.67322"
y1="77.046234"
x2="650.70459"
y2="139.40982" />
<linearGradient
id="linearGradient3864-0">
<stop
id="stop3866-5"
offset="0"
style="stop-color:#0619c0;stop-opacity:1;" />
<stop
id="stop3868-7"
offset="1"
style="stop-color:#379cfb;stop-opacity:1;" />
</linearGradient>
<inkscape:perspective
id="perspective3902"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
id="linearGradient3841-0-3">
<stop
id="stop3843-1-3"
offset="0"
style="stop-color:#0619c0;stop-opacity:1;" />
<stop
id="stop3845-0-8"
offset="1"
style="stop-color:#379cfb;stop-opacity:1;" />
</linearGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
fy="114.5684"
fx="20.892099"
r="5.256"
cy="114.5684"
cx="20.892099"
id="aigrd2">
<stop
id="stop15566"
style="stop-color:#F0F0F0"
offset="0" />
<stop
id="stop15568"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
offset="1.0000000" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
fy="64.567902"
fx="20.892099"
r="5.257"
cy="64.567902"
cx="20.892099"
id="aigrd3">
<stop
id="stop15573"
style="stop-color:#F0F0F0"
offset="0" />
<stop
id="stop15575"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
offset="1.0000000" />
</radialGradient>
<linearGradient
id="linearGradient15662">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop15664" />
<stop
style="stop-color:#f8f8f8;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop15666" />
</linearGradient>
<radialGradient
r="86.70845"
fy="35.736916"
fx="33.966679"
cy="35.736916"
cx="33.966679"
gradientTransform="matrix(0.96049297,0,0,1.041132,-52.144249,-702.33158)"
gradientUnits="userSpaceOnUse"
id="radialGradient4452"
xlink:href="#linearGradient259"
inkscape:collect="always" />
<linearGradient
id="linearGradient259">
<stop
style="stop-color:#fafafa;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop260" />
<stop
style="stop-color:#bbbbbb;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop261" />
</linearGradient>
<radialGradient
r="37.751713"
fy="3.7561285"
fx="8.824419"
cy="3.7561285"
cx="8.824419"
gradientTransform="matrix(0.96827297,0,0,1.032767,-48.790699,-701.68513)"
gradientUnits="userSpaceOnUse"
id="radialGradient4454"
xlink:href="#linearGradient269"
inkscape:collect="always" />
<linearGradient
id="linearGradient269">
<stop
style="stop-color:#a3a3a3;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop270" />
<stop
style="stop-color:#4c4c4c;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop271" />
</linearGradient>
<radialGradient
r="86.70845"
fy="43.717598"
fx="3.7745965"
cy="43.717598"
cx="3.7745965"
gradientTransform="matrix(4.7474974e-4,1.1562124,-1.3743496,4.6927601e-4,63.8109,7.049203)"
gradientUnits="userSpaceOnUse"
id="radialGradient3972"
xlink:href="#linearGradient259"
inkscape:collect="always" />
<radialGradient
r="37.751713"
fy="43.445751"
fx="0.28083447"
cy="43.445751"
cx="0.28083447"
gradientTransform="matrix(4.7859521e-4,1.1655777,-1.3633075,4.6550565e-4,62.959207,11.086395)"
gradientUnits="userSpaceOnUse"
id="radialGradient3974"
xlink:href="#linearGradient269"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3895"
id="linearGradient3909"
x1="43"
y1="22"
x2="48"
y2="44"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3895">
<stop
style="stop-color:#729fcf;stop-opacity:1;"
offset="0"
id="stop3897" />
<stop
style="stop-color:#204a87;stop-opacity:1;"
offset="1"
id="stop3899" />
</linearGradient>
<linearGradient
gradientTransform="translate(-17,5)"
y2="44"
x2="48"
y1="22"
x1="43"
gradientUnits="userSpaceOnUse"
id="linearGradient3023"
xlink:href="#linearGradient3895"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient259"
id="radialGradient4608"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(4.7474974e-4,1.1562124,-1.3743496,4.6927601e-4,63.8109,7.049203)"
cx="3.7745965"
cy="43.717598"
fx="3.7745965"
fy="43.717598"
r="86.70845" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.2695983"
inkscape:cx="44.716174"
inkscape:cy="23.11306"
inkscape:current-layer="g4636"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1051"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-bbox="true">
<inkscape:grid
type="xygrid"
id="grid3071"
empspacing="2"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#radialGradient4608);fill-opacity:1;fill-rule:nonzero;stroke:#707070;stroke-width:1.85646296;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
d="M 19.578125,8 5.4042969,8.0058594 C 5.1706901,8.005955 4.9823344,8.2113736 4.9824219,8.4667969 l 0.00391,7.9042971 c -2.596e-4,0.01067 -0.00391,0.02052 -0.00391,0.03125 L 5,55.617188 C 5.0003146,56.383475 5.677268,57.000287 6.5175781,57 L 57.5,56.982422 c 0.84031,-2.87e-4 1.517893,-0.618479 1.517578,-1.384766 L 59,16.382812 C 58.999685,15.616525 58.322732,14.999713 57.482422,15 H 25 L 20,8.4609375 C 19.999913,8.2055142 19.811732,7.9999044 19.578125,8 Z"
id="rect15391"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccc" />
<path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.85646296;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
d="M 18.578125,10 H 7.421875 C 7.1882682,10.000096 6.9999125,10.205514 7,10.460938 L 7.00391,15.96875 7,16 v 38 c 0,1 0,1 1,1 h 48 c 1,0 1,0 1,-1 V 18 c 0,-1 0,-1 -1,-1 H 24 L 19,10.460938 C 18.999913,10.205514 18.811732,9.9999044 18.578125,10 Z"
id="rect15391-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccc" />
<g
id="g4636"
transform="rotate(90,38,36)">
<path
inkscape:export-ydpi="4.1683898"
inkscape:export-xdpi="4.1683898"
inkscape:export-filename="/home/yorik/Documents/Lab/Draft/icons/changeprop.png"
sodipodi:nodetypes="cccccccc"
id="path3343"
d="M 30,20 V 30 L 7,30 V 44 H 30 V 54 L 48,37 Z"
style="fill:url(#linearGradient3023);fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:export-ydpi="4.1683898"
inkscape:export-xdpi="4.1683898"
inkscape:export-filename="/home/yorik/Documents/Lab/Draft/icons/changeprop.png"
sodipodi:nodetypes="cccccccc"
id="path3343-2"
d="M 32.006611,24.642998 32,32 H 9 V 42 H 32 L 31.9934,49.357002 45,37 Z"
style="fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
</g>
</g>
<metadata
id="metadata4251">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<cc:license
rdf:resource="" />
<dc:date>Mon Oct 10 13:44:52 2011 +0000</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>[wmayer]</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/Mod/Draft/Resources/icons/Draft_Drawing.svg</dc:identifier>
<dc:relation>http://www.freecadweb.org/wiki/index.php?title=Artwork</dc:relation>
<dc:contributor>
<cc:Agent>
<dc:title>[agryson] Alexander Gryson</dc:title>
</cc:Agent>
</dc:contributor>
<dc:subject>
<rdf:Bag>
<rdf:li>arrow</rdf:li>
<rdf:li>page</rdf:li>
<rdf:li>shapes</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:description>An arrow pointing from left to right onto a page with shapes drawn on it</dc:description>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

@@ -0,0 +1,464 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64px"
height="64px"
id="svg3612"
version="1.1"
inkscape:version="0.92.0 r15299"
sodipodi:docname="Draft_AutoGroup_off.svg">
<defs
id="defs3614">
<linearGradient
id="linearGradient4680">
<stop
id="stop4676"
offset="0"
style="stop-color:#d95f57;stop-opacity:1" />
<stop
id="stop4678"
offset="1"
style="stop-color:#390c0c;stop-opacity:1" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective3620" />
<inkscape:perspective
id="perspective3588"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3692"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient3144-6">
<stop
id="stop3146-9"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3148-2"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3701">
<stop
id="stop3703"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3705"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-6"
id="radialGradient3688"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<linearGradient
id="linearGradient3708">
<stop
id="stop3710"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3712"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<inkscape:perspective
id="perspective3805"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-0-0"
id="linearGradient3934"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.2210246,-0.5789261,-0.71699693,-0.35346705,519.98085,464.19243)"
x1="696.67322"
y1="77.046234"
x2="654.80023"
y2="115.01974" />
<linearGradient
id="linearGradient3864-0-0">
<stop
id="stop3866-5-7"
offset="0"
style="stop-color:#0619c0;stop-opacity:1;" />
<stop
id="stop3868-7-6"
offset="1"
style="stop-color:#379cfb;stop-opacity:1;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="linearGradient3942"
x1="597.77283"
y1="44.024342"
x2="619.30328"
y2="30.27434"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3377">
<stop
id="stop3379"
offset="0"
style="stop-color:#ffaa00;stop-opacity:1;" />
<stop
id="stop3381"
offset="1"
style="stop-color:#faff2b;stop-opacity:1;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-0"
id="linearGradient3657"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.2210246,-0.5789261,-0.71699693,-0.35346705,536.41251,472.3612)"
x1="696.67322"
y1="77.046234"
x2="650.70459"
y2="139.40982" />
<linearGradient
id="linearGradient3864-0">
<stop
id="stop3866-5"
offset="0"
style="stop-color:#0619c0;stop-opacity:1;" />
<stop
id="stop3868-7"
offset="1"
style="stop-color:#379cfb;stop-opacity:1;" />
</linearGradient>
<inkscape:perspective
id="perspective3902"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
id="linearGradient3841-0-3">
<stop
id="stop3843-1-3"
offset="0"
style="stop-color:#0619c0;stop-opacity:1;" />
<stop
id="stop3845-0-8"
offset="1"
style="stop-color:#379cfb;stop-opacity:1;" />
</linearGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
fy="114.5684"
fx="20.892099"
r="5.256"
cy="114.5684"
cx="20.892099"
id="aigrd2">
<stop
id="stop15566"
style="stop-color:#F0F0F0"
offset="0" />
<stop
id="stop15568"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
offset="1.0000000" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
fy="64.567902"
fx="20.892099"
r="5.257"
cy="64.567902"
cx="20.892099"
id="aigrd3">
<stop
id="stop15573"
style="stop-color:#F0F0F0"
offset="0" />
<stop
id="stop15575"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
offset="1.0000000" />
</radialGradient>
<linearGradient
id="linearGradient15662">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop15664" />
<stop
style="stop-color:#f8f8f8;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop15666" />
</linearGradient>
<radialGradient
r="86.70845"
fy="35.736916"
fx="33.966679"
cy="35.736916"
cx="33.966679"
gradientTransform="matrix(0.96049297,0,0,1.041132,-52.144249,-702.33158)"
gradientUnits="userSpaceOnUse"
id="radialGradient4452"
xlink:href="#linearGradient259"
inkscape:collect="always" />
<linearGradient
id="linearGradient259">
<stop
style="stop-color:#fafafa;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop260" />
<stop
style="stop-color:#bbbbbb;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop261" />
</linearGradient>
<radialGradient
r="37.751713"
fy="3.7561285"
fx="8.824419"
cy="3.7561285"
cx="8.824419"
gradientTransform="matrix(0.96827297,0,0,1.032767,-48.790699,-701.68513)"
gradientUnits="userSpaceOnUse"
id="radialGradient4454"
xlink:href="#linearGradient269"
inkscape:collect="always" />
<linearGradient
id="linearGradient269">
<stop
style="stop-color:#a3a3a3;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop270" />
<stop
style="stop-color:#4c4c4c;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop271" />
</linearGradient>
<radialGradient
r="86.70845"
fy="43.717598"
fx="3.7745965"
cy="43.717598"
cx="3.7745965"
gradientTransform="matrix(4.7474974e-4,1.1562124,-1.3743496,4.6927601e-4,63.8109,7.049203)"
gradientUnits="userSpaceOnUse"
id="radialGradient3972"
xlink:href="#linearGradient259"
inkscape:collect="always" />
<radialGradient
r="37.751713"
fy="43.445751"
fx="0.28083447"
cy="43.445751"
cx="0.28083447"
gradientTransform="matrix(4.7859521e-4,1.1655777,-1.3633075,4.6550565e-4,62.959207,11.086395)"
gradientUnits="userSpaceOnUse"
id="radialGradient3974"
xlink:href="#linearGradient269"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3895"
id="linearGradient3909"
x1="43"
y1="22"
x2="48"
y2="44"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3895">
<stop
style="stop-color:#729fcf;stop-opacity:1;"
offset="0"
id="stop3897" />
<stop
style="stop-color:#204a87;stop-opacity:1;"
offset="1"
id="stop3899" />
</linearGradient>
<linearGradient
gradientTransform="translate(-17,5)"
y2="44"
x2="48"
y1="22"
x1="43"
gradientUnits="userSpaceOnUse"
id="linearGradient3023"
xlink:href="#linearGradient3895"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4680"
id="radialGradient4608"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(4.7474974e-4,1.1562124,-1.3743496,4.6927601e-4,63.8109,7.049203)"
cx="3.7745965"
cy="43.717598"
fx="3.7745965"
fy="43.717598"
r="86.70845" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="4.6239102"
inkscape:cx="40.128646"
inkscape:cy="34.861394"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1051"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-bbox="true">
<inkscape:grid
type="xygrid"
id="grid3071"
empspacing="2"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#radialGradient4608);fill-opacity:1;fill-rule:nonzero;stroke:#482626;stroke-width:1.85646296;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
d="M 19.578125,8 5.4042969,8.0058594 C 5.1706901,8.005955 4.9823344,8.2113736 4.9824219,8.4667969 l 0.00391,7.9042971 c -2.596e-4,0.01067 -0.00391,0.02052 -0.00391,0.03125 L 5,55.617188 C 5.0003146,56.383475 5.677268,57.000287 6.5175781,57 L 57.5,56.982422 c 0.84031,-2.87e-4 1.517893,-0.618479 1.517578,-1.384766 L 59,16.382812 C 58.999685,15.616525 58.322732,14.999713 57.482422,15 H 25 L 20,8.4609375 C 19.999913,8.2055142 19.811732,7.9999044 19.578125,8 Z"
id="rect15391"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccc" />
<path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#fd8b88;stroke-width:1.85646296;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
d="M 18.578125,10 H 7.421875 C 7.1882682,10.000096 6.9999125,10.205514 7,10.460938 L 7.00391,15.96875 7,16 v 38 c 0,1 0,1 1,1 h 48 c 1,0 1,0 1,-1 V 18 c 0,-1 0,-1 -1,-1 H 24 L 19,10.460938 C 18.999913,10.205514 18.811732,9.9999044 18.578125,10 Z"
id="rect15391-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccc" />
<g
id="g4636"
transform="rotate(90,38,36)">
<path
inkscape:export-ydpi="4.1683898"
inkscape:export-xdpi="4.1683898"
inkscape:export-filename="/home/yorik/Documents/Lab/Draft/icons/changeprop.png"
sodipodi:nodetypes="cccccccc"
id="path3343"
d="M 30,20 V 30 L 7,30 V 44 H 30 V 54 L 48,37 Z"
style="fill:url(#linearGradient3023);fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:export-ydpi="4.1683898"
inkscape:export-xdpi="4.1683898"
inkscape:export-filename="/home/yorik/Documents/Lab/Draft/icons/changeprop.png"
sodipodi:nodetypes="cccccccc"
id="path3343-2"
d="M 32.006611,24.642998 32,32 H 9 V 42 H 32 L 31.9934,49.357002 45,37 Z"
style="fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
</g>
</g>
<metadata
id="metadata4251">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<cc:license
rdf:resource="" />
<dc:date>Mon Oct 10 13:44:52 2011 +0000</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>[wmayer]</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/Mod/Draft/Resources/icons/Draft_Drawing.svg</dc:identifier>
<dc:relation>http://www.freecadweb.org/wiki/index.php?title=Artwork</dc:relation>
<dc:contributor>
<cc:Agent>
<dc:title>[agryson] Alexander Gryson</dc:title>
</cc:Agent>
</dc:contributor>
<dc:subject>
<rdf:Bag>
<rdf:li>arrow</rdf:li>
<rdf:li>page</rdf:li>
<rdf:li>shapes</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:description>An arrow pointing from left to right onto a page with shapes drawn on it</dc:description>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

@@ -0,0 +1,464 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64px"
height="64px"
id="svg3612"
version="1.1"
inkscape:version="0.92.0 r15299"
sodipodi:docname="Draft_AutoGroup_on.svg">
<defs
id="defs3614">
<linearGradient
id="linearGradient4680">
<stop
id="stop4676"
offset="0"
style="stop-color:#78d957;stop-opacity:1" />
<stop
id="stop4678"
offset="1"
style="stop-color:#0f390c;stop-opacity:1" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective3620" />
<inkscape:perspective
id="perspective3588"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3692"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient3144-6">
<stop
id="stop3146-9"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3148-2"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<linearGradient
id="linearGradient3701">
<stop
id="stop3703"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3705"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3144-6"
id="radialGradient3688"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.6985294,0,202.82863)"
cx="225.26402"
cy="672.79736"
fx="225.26402"
fy="672.79736"
r="34.345188" />
<linearGradient
id="linearGradient3708">
<stop
id="stop3710"
style="stop-color:#ffffff;stop-opacity:1"
offset="0" />
<stop
id="stop3712"
style="stop-color:#ffffff;stop-opacity:0"
offset="1" />
</linearGradient>
<inkscape:perspective
id="perspective3805"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-0-0"
id="linearGradient3934"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.2210246,-0.5789261,-0.71699693,-0.35346705,519.98085,464.19243)"
x1="696.67322"
y1="77.046234"
x2="654.80023"
y2="115.01974" />
<linearGradient
id="linearGradient3864-0-0">
<stop
id="stop3866-5-7"
offset="0"
style="stop-color:#0619c0;stop-opacity:1;" />
<stop
id="stop3868-7-6"
offset="1"
style="stop-color:#379cfb;stop-opacity:1;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3377"
id="linearGradient3942"
x1="597.77283"
y1="44.024342"
x2="619.30328"
y2="30.27434"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3377">
<stop
id="stop3379"
offset="0"
style="stop-color:#ffaa00;stop-opacity:1;" />
<stop
id="stop3381"
offset="1"
style="stop-color:#faff2b;stop-opacity:1;" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3864-0"
id="linearGradient3657"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.2210246,-0.5789261,-0.71699693,-0.35346705,536.41251,472.3612)"
x1="696.67322"
y1="77.046234"
x2="650.70459"
y2="139.40982" />
<linearGradient
id="linearGradient3864-0">
<stop
id="stop3866-5"
offset="0"
style="stop-color:#0619c0;stop-opacity:1;" />
<stop
id="stop3868-7"
offset="1"
style="stop-color:#379cfb;stop-opacity:1;" />
</linearGradient>
<inkscape:perspective
id="perspective3902"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
id="linearGradient5048">
<stop
style="stop-color:black;stop-opacity:0;"
offset="0"
id="stop5050" />
<stop
id="stop5056"
offset="0.5"
style="stop-color:black;stop-opacity:1;" />
<stop
style="stop-color:black;stop-opacity:0;"
offset="1"
id="stop5052" />
</linearGradient>
<linearGradient
id="linearGradient3841-0-3">
<stop
id="stop3843-1-3"
offset="0"
style="stop-color:#0619c0;stop-opacity:1;" />
<stop
id="stop3845-0-8"
offset="1"
style="stop-color:#379cfb;stop-opacity:1;" />
</linearGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
fy="114.5684"
fx="20.892099"
r="5.256"
cy="114.5684"
cx="20.892099"
id="aigrd2">
<stop
id="stop15566"
style="stop-color:#F0F0F0"
offset="0" />
<stop
id="stop15568"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
offset="1.0000000" />
</radialGradient>
<radialGradient
gradientUnits="userSpaceOnUse"
fy="64.567902"
fx="20.892099"
r="5.257"
cy="64.567902"
cx="20.892099"
id="aigrd3">
<stop
id="stop15573"
style="stop-color:#F0F0F0"
offset="0" />
<stop
id="stop15575"
style="stop-color:#9a9a9a;stop-opacity:1.0000000;"
offset="1.0000000" />
</radialGradient>
<linearGradient
id="linearGradient15662">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop15664" />
<stop
style="stop-color:#f8f8f8;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop15666" />
</linearGradient>
<radialGradient
r="86.70845"
fy="35.736916"
fx="33.966679"
cy="35.736916"
cx="33.966679"
gradientTransform="matrix(0.96049297,0,0,1.041132,-52.144249,-702.33158)"
gradientUnits="userSpaceOnUse"
id="radialGradient4452"
xlink:href="#linearGradient259"
inkscape:collect="always" />
<linearGradient
id="linearGradient259">
<stop
style="stop-color:#fafafa;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop260" />
<stop
style="stop-color:#bbbbbb;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop261" />
</linearGradient>
<radialGradient
r="37.751713"
fy="3.7561285"
fx="8.824419"
cy="3.7561285"
cx="8.824419"
gradientTransform="matrix(0.96827297,0,0,1.032767,-48.790699,-701.68513)"
gradientUnits="userSpaceOnUse"
id="radialGradient4454"
xlink:href="#linearGradient269"
inkscape:collect="always" />
<linearGradient
id="linearGradient269">
<stop
style="stop-color:#a3a3a3;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop270" />
<stop
style="stop-color:#4c4c4c;stop-opacity:1.0000000;"
offset="1.0000000"
id="stop271" />
</linearGradient>
<radialGradient
r="86.70845"
fy="43.717598"
fx="3.7745965"
cy="43.717598"
cx="3.7745965"
gradientTransform="matrix(4.7474974e-4,1.1562124,-1.3743496,4.6927601e-4,63.8109,7.049203)"
gradientUnits="userSpaceOnUse"
id="radialGradient3972"
xlink:href="#linearGradient259"
inkscape:collect="always" />
<radialGradient
r="37.751713"
fy="43.445751"
fx="0.28083447"
cy="43.445751"
cx="0.28083447"
gradientTransform="matrix(4.7859521e-4,1.1655777,-1.3633075,4.6550565e-4,62.959207,11.086395)"
gradientUnits="userSpaceOnUse"
id="radialGradient3974"
xlink:href="#linearGradient269"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3895"
id="linearGradient3909"
x1="43"
y1="22"
x2="48"
y2="44"
gradientUnits="userSpaceOnUse" />
<linearGradient
id="linearGradient3895">
<stop
style="stop-color:#729fcf;stop-opacity:1;"
offset="0"
id="stop3897" />
<stop
style="stop-color:#204a87;stop-opacity:1;"
offset="1"
id="stop3899" />
</linearGradient>
<linearGradient
gradientTransform="translate(-17,5)"
y2="44"
x2="48"
y1="22"
x1="43"
gradientUnits="userSpaceOnUse"
id="linearGradient3023"
xlink:href="#linearGradient3895"
inkscape:collect="always" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4680"
id="radialGradient4608"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(4.7474974e-4,1.1562124,-1.3743496,4.6927601e-4,63.8109,7.049203)"
cx="3.7745965"
cy="43.717598"
fx="3.7745965"
fy="43.717598"
r="86.70845" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="4.6239102"
inkscape:cx="40.128646"
inkscape:cy="34.861394"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1051"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-bbox="true">
<inkscape:grid
type="xygrid"
id="grid3071"
empspacing="2"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:url(#radialGradient4608);fill-opacity:1;fill-rule:nonzero;stroke:#284826;stroke-width:1.85646296;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
d="M 19.578125,8 5.4042969,8.0058594 C 5.1706901,8.005955 4.9823344,8.2113736 4.9824219,8.4667969 l 0.00391,7.9042971 c -2.596e-4,0.01067 -0.00391,0.02052 -0.00391,0.03125 L 5,55.617188 C 5.0003146,56.383475 5.677268,57.000287 6.5175781,57 L 57.5,56.982422 c 0.84031,-2.87e-4 1.517893,-0.618479 1.517578,-1.384766 L 59,16.382812 C 58.999685,15.616525 58.322732,14.999713 57.482422,15 H 25 L 20,8.4609375 C 19.999913,8.2055142 19.811732,7.9999044 19.578125,8 Z"
id="rect15391"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccc" />
<path
style="color:#000000;display:block;overflow:visible;visibility:visible;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#a1fd88;stroke-width:1.85646296;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none"
d="M 18.578125,10 H 7.421875 C 7.1882682,10.000096 6.9999125,10.205514 7,10.460938 L 7.00391,15.96875 7,16 v 38 c 0,1 0,1 1,1 h 48 c 1,0 1,0 1,-1 V 18 c 0,-1 0,-1 -1,-1 H 24 L 19,10.460938 C 18.999913,10.205514 18.811732,9.9999044 18.578125,10 Z"
id="rect15391-2"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccccccccccccc" />
<g
id="g4636"
transform="rotate(90,38,36)">
<path
inkscape:export-ydpi="4.1683898"
inkscape:export-xdpi="4.1683898"
inkscape:export-filename="/home/yorik/Documents/Lab/Draft/icons/changeprop.png"
sodipodi:nodetypes="cccccccc"
id="path3343"
d="M 30,20 V 30 L 7,30 V 44 H 30 V 54 L 48,37 Z"
style="fill:url(#linearGradient3023);fill-opacity:1;fill-rule:evenodd;stroke:#0b1521;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
<path
inkscape:export-ydpi="4.1683898"
inkscape:export-xdpi="4.1683898"
inkscape:export-filename="/home/yorik/Documents/Lab/Draft/icons/changeprop.png"
sodipodi:nodetypes="cccccccc"
id="path3343-2"
d="M 32.006611,24.642998 32,32 H 9 V 42 H 32 L 31.9934,49.357002 45,37 Z"
style="fill:none;stroke:#729fcf;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:connector-curvature="0" />
</g>
</g>
<metadata
id="metadata4251">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<cc:license
rdf:resource="" />
<dc:date>Mon Oct 10 13:44:52 2011 +0000</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>[wmayer]</dc:title>
</cc:Agent>
</dc:creator>
<dc:rights>
<cc:Agent>
<dc:title>FreeCAD LGPL2+</dc:title>
</cc:Agent>
</dc:rights>
<dc:publisher>
<cc:Agent>
<dc:title>FreeCAD</dc:title>
</cc:Agent>
</dc:publisher>
<dc:identifier>FreeCAD/src/Mod/Draft/Resources/icons/Draft_Drawing.svg</dc:identifier>
<dc:relation>http://www.freecadweb.org/wiki/index.php?title=Artwork</dc:relation>
<dc:contributor>
<cc:Agent>
<dc:title>[agryson] Alexander Gryson</dc:title>
</cc:Agent>
</dc:contributor>
<dc:subject>
<rdf:Bag>
<rdf:li>arrow</rdf:li>
<rdf:li>page</rdf:li>
<rdf:li>shapes</rdf:li>
</rdf:Bag>
</dc:subject>
<dc:description>An arrow pointing from left to right onto a page with shapes drawn on it</dc:description>
</cc:Work>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 15 KiB

+1 -1
View File
@@ -124,7 +124,7 @@ class DraftTest(unittest.TestCase):
FreeCAD.Console.PrintLog ('Checking Draft Rotate...\n')
l = Draft.makeLine(FreeCAD.Vector(2,0,0),FreeCAD.Vector(4,0,0))
Draft.rotate(l,90)
self.failUnless(l.Start == FreeCAD.Vector(0,2,0),"Draft Rotate failed")
self.assertTrue(l.Start.isEqual(FreeCAD.Vector(0,2,0), 1e-12),"Draft Rotate failed")
def testOffset(self):
FreeCAD.Console.PrintLog ('Checking Draft Offset...\n')
+4
View File
@@ -100,6 +100,10 @@ def convertToDxf(dwgfilename):
basename = os.path.basename(dwgfilename)
cmdline = '"%s" "%s" "%s" "ACAD2000" "DXF" "0" "1" "%s"' % (teigha, indir, outdir, basename)
print("Converting: " + cmdline)
if isinstance(cmdline,unicode):
import sys
encoding = sys.getfilesystemencoding()
cmdline = cmdline.encode(encoding)
subprocess.call(cmdline, shell=True) #os.system(cmdline)
result = outdir + os.sep + os.path.splitext(basename)[0] + ".dxf"
if os.path.exists(result):
+36 -5
View File
@@ -41,6 +41,7 @@
#include <Base/TimeInfo.h>
#include <Base/Console.h>
#include <Base/Type.h>
#include <Base/Parameter.h>
#include <App/Application.h>
#include <App/Document.h>
@@ -109,7 +110,13 @@ template<class TWriter> void writeVTKFile(const char* filename, vtkSmartPointer<
writer->Write();
}
void FemVTKTools::importVTKMesh(vtkSmartPointer<vtkDataSet> dataset, FemMesh* mesh)
/*
double scale = 1000;
p[0] = p[0]* scale; // scale back to mm
p[1] = p[1]* scale;
p[1] = p[1]* scale;
*/
void FemVTKTools::importVTKMesh(vtkSmartPointer<vtkDataSet> dataset, FemMesh* mesh, float scale)
{
const vtkIdType nPoints = dataset->GetNumberOfPoints();
const vtkIdType nCells = dataset->GetNumberOfCells();
@@ -126,7 +133,7 @@ void FemVTKTools::importVTKMesh(vtkSmartPointer<vtkDataSet> dataset, FemMesh* me
for(vtkIdType i=0; i<nPoints; i++)
{
double* p = dataset->GetPoint(i);
meshds->AddNodeWithID(p[0], p[1], p[2], i+1);
meshds->AddNodeWithID(p[0]*scale, p[1]*scale, p[2]*scale, i+1);
}
for(vtkIdType iCell=0; iCell<nCells; iCell++)
@@ -487,7 +494,14 @@ App::DocumentObject* FemVTKTools::readFluidicResult(const char* filename, App::D
Base::TimeInfo Start;
Base::Console().Log("Start: read FemResult with FemMesh from VTK file ======================\n");
Base::FileInfo f(filename);
auto hGrp = App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Units");
int unitSchema = hGrp->GetInt("UserSchema",0);
float scale = 1.0;
if(unitSchema == 0) // standard mm
{
scale = 1000.0; // convert from meter in length of CFD result file
}
vtkSmartPointer<vtkDataSet> ds;
if(f.hasExtension("vtu"))
{
@@ -528,7 +542,7 @@ App::DocumentObject* FemVTKTools::readFluidicResult(const char* filename, App::D
App::DocumentObject* mesh = pcDoc->addObject("Fem::FemMeshObject", "ResultMesh");
FemMesh* fmesh = new FemMesh(); // PropertyFemMesh instance is responsible to relase FemMesh ??
importVTKMesh(dataset, fmesh);
importVTKMesh(dataset, fmesh, scale);
static_cast<PropertyFemMesh*>(mesh->getPropertyByName("FemMesh"))->setValue(*fmesh);
static_cast<App::PropertyLink*>(result->getPropertyByName("Mesh"))->setValue(mesh);
// PropertyLink is the property type to store DocumentObject pointer
@@ -636,20 +650,37 @@ void FemVTKTools::importFluidicResult(vtkSmartPointer<vtkDataSet> dataset, App::
vtkSmartPointer<vtkDataArray> vel = pd->GetArray(vars["Velocity"]);
if(nPoints && vel && vel->GetNumberOfComponents() == 3) {
std::vector<Base::Vector3d> vec(nPoints);
double vmin=1.0e100, vmean=0.0, vmax=0.0; // only velocity magnitude is calc in c++
double vmin=1.0e100, vmean=0.0, vmax=0.0;
//stat of Vx, Vy, Vz is not necessary
double vmins[3] = {0.0, 0.0, 0.0};
double vmeans[3] = {0.0, 0.0, 0.0};
double vmaxs[3] = {0.0, 0.0, 0.0};
for(vtkIdType i=0; i<nPoints; ++i) {
double *p = vel->GetTuple(i); // both vtkFloatArray and vtkDoubleArray return double* for GetTuple(i)
double vmag = std::sqrt(p[0]*p[0] + p[1]*p[1] + p[2]*p[2]);
for(int ii=0; ii<3; ii++) {
vmeans[ii] += p[ii];
if(p[ii] > vmaxs[ii]) vmaxs[ii] = p[ii];
if(p[ii] < vmins[ii]) vmins[ii] = p[ii];
}
vmean += vmag;
if(vmag > vmax) vmax = vmag;
if(vmag < vmin) vmin = vmag;
vec[i] = (Base::Vector3d(p[0], p[1], p[2]));
nodeIds[i] = i;
}
for(int ii=0; ii<3; ii++) {
stats[ii*3] = vmins[ii];
stats[ii*3 + 2] = vmaxs[ii];
stats[ii*3 + 1] = vmeans[ii]/nPoints;
}
int index = varids["Umag"];
stats[index*3] = vmin;
stats[index*3 + 2] = vmax;
stats[index*3 + 1] = vmean/nPoints;
App::PropertyVectorList* velocity = static_cast<App::PropertyVectorList*>(res->getPropertyByName("Velocity"));
if(velocity) {
//PropertyVectorList will not show up in PropertyEditor
+1 -1
View File
@@ -46,7 +46,7 @@ namespace Fem
/*!
FemMesh import from vtkUnstructuredGrid instance
*/
static void importVTKMesh(vtkSmartPointer<vtkDataSet> grid, FemMesh* mesh);
static void importVTKMesh(vtkSmartPointer<vtkDataSet> grid, FemMesh* mesh, float scale = 1.0);
/*!
FemMesh read from vtkUnstructuredGrid data file
*/
+1 -1
View File
@@ -213,7 +213,7 @@ class FemInputWriterCcx(FemInputWriter.FemInputWriter):
inpfileMain.write('** written by write_node_sets_constraints_fixed\n')
inpfileMain.write('** written by write_node_sets_constraints_displacement\n')
inpfileMain.write('** written by write_node_sets_constraints_planerotation\n')
if self.fixed_objects:
if self.fixed_objects or self.displacement_objects or self.planerotation_objects:
inpfileMain.write('*INCLUDE,INPUT=' + include_name + "_Node_sets.inp \n")
inpfileMain.write('\n***********************************************************\n')
+1
View File
@@ -36,6 +36,7 @@
<file>icons/fem-frequency-analysis.svg</file>
<file>icons/fem-inp-editor.svg</file>
<file>icons/fem-material.svg</file>
<file>icons/fem-material-fluid.svg</file>
<file>icons/fem-material-nonlinear.svg</file>
<file>icons/fem-plane.svg</file>
<file>icons/fem-purge-results.svg</file>
@@ -0,0 +1,532 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="64px"
height="64px"
id="svg2816"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="fem-material-fluid.svg">
<defs
id="defs2818">
<linearGradient
inkscape:collect="always"
id="linearGradient4044">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop4046" />
<stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop4048" />
</linearGradient>
<linearGradient
id="linearGradient3681">
<stop
id="stop3697"
offset="0"
style="stop-color:#fff110;stop-opacity:1;" />
<stop
style="stop-color:#cf7008;stop-opacity:1;"
offset="1"
id="stop3685" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective2824" />
<inkscape:perspective
id="perspective3622"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3622-9"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3653"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3675"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3697"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3720"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3742"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3764"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3785"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3806"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3806-3"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3835"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3614"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3614-8"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3643"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3643-3"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3672"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3672-5"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3701"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3701-8"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective3746"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<pattern
patternTransform="matrix(0.67643728,-0.81829155,2.4578314,1.8844554,-26.450606,18.294947)"
id="pattern5231"
xlink:href="#Strips1_1-4"
inkscape:collect="always" />
<inkscape:perspective
id="perspective5224"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<pattern
inkscape:stockid="Stripes 1:1"
id="Strips1_1-4"
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,3.4760987,3.534923)"
height="1"
width="2"
patternUnits="userSpaceOnUse"
inkscape:collect="always">
<rect
id="rect4483-4"
height="2"
width="1"
y="-0.5"
x="0"
style="fill:black;stroke:none" />
</pattern>
<inkscape:perspective
id="perspective5224-9"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<pattern
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,39.618381,8.9692804)"
id="pattern5231-4"
xlink:href="#Strips1_1-6"
inkscape:collect="always" />
<inkscape:perspective
id="perspective5224-3"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<pattern
inkscape:stockid="Stripes 1:1"
id="Strips1_1-6"
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,3.4760987,3.534923)"
height="1"
width="2"
patternUnits="userSpaceOnUse"
inkscape:collect="always">
<rect
id="rect4483-0"
height="2"
width="1"
y="-0.5"
x="0"
style="fill:black;stroke:none" />
</pattern>
<pattern
patternTransform="matrix(0.66513382,-1.0631299,2.4167603,2.4482973,-49.762569,2.9546807)"
id="pattern5296"
xlink:href="#pattern5231-3"
inkscape:collect="always" />
<inkscape:perspective
id="perspective5288"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<pattern
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,-26.336284,10.887197)"
id="pattern5231-3"
xlink:href="#Strips1_1-4-3"
inkscape:collect="always" />
<pattern
inkscape:stockid="Stripes 1:1"
id="Strips1_1-4-3"
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,3.4760987,3.534923)"
height="1"
width="2"
patternUnits="userSpaceOnUse"
inkscape:collect="always">
<rect
id="rect4483-4-6"
height="2"
width="1"
y="-0.5"
x="0"
style="fill:black;stroke:none" />
</pattern>
<pattern
patternTransform="matrix(0.42844886,-0.62155849,1.5567667,1.431396,27.948414,13.306456)"
id="pattern5330"
xlink:href="#Strips1_1-9"
inkscape:collect="always" />
<inkscape:perspective
id="perspective5323"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<pattern
inkscape:stockid="Stripes 1:1"
id="Strips1_1-9"
patternTransform="matrix(0.66772843,-1.0037085,2.4261878,2.3114548,3.4760987,3.534923)"
height="1"
width="2"
patternUnits="userSpaceOnUse"
inkscape:collect="always">
<rect
id="rect4483-3"
height="2"
width="1"
y="-0.5"
x="0"
style="fill:black;stroke:none" />
</pattern>
<inkscape:perspective
id="perspective5361"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective5383"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective5411"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3681"
id="linearGradient3687"
x1="37.89756"
y1="41.087898"
x2="4.0605712"
y2="40.168594"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3681"
id="linearGradient3695"
x1="31.777767"
y1="40.24213"
x2="68.442062"
y2="54.041203"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.25023482,-0.66040068,0.68751357,0.24036653,-8.7488565,43.149938)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient12512"
id="radialGradient278"
gradientUnits="userSpaceOnUse"
cx="55"
cy="125"
fx="55"
fy="125"
r="14.375" />
<linearGradient
id="linearGradient12512">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop12513" />
<stop
style="stop-color:#fff520;stop-opacity:0.89108908;"
offset="0.50000000"
id="stop12517" />
<stop
style="stop-color:#fff300;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop12514" />
</linearGradient>
<radialGradient
r="14.375"
fy="125"
fx="55"
cy="125"
cx="55"
gradientUnits="userSpaceOnUse"
id="radialGradient4017"
xlink:href="#linearGradient12512"
inkscape:collect="always" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient4044"
id="linearGradient4060"
x1="15.78776"
y1="50.394047"
x2="27.641447"
y2="39.95837"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3006889,0,0,0.42340995,-4.2689268,33.381825)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient12512-2"
id="radialGradient278-5"
gradientUnits="userSpaceOnUse"
cx="55"
cy="125"
fx="55"
fy="125"
r="14.375" />
<linearGradient
id="linearGradient12512-2">
<stop
style="stop-color:#ffffff;stop-opacity:1.0000000;"
offset="0.0000000"
id="stop12513-3" />
<stop
style="stop-color:#fff520;stop-opacity:0.89108908;"
offset="0.50000000"
id="stop12517-1" />
<stop
style="stop-color:#fff300;stop-opacity:0.0000000;"
offset="1.0000000"
id="stop12514-6" />
</linearGradient>
<filter
style="color-interpolation-filters:sRGB;"
inkscape:label="Blur"
id="filter3399">
<feGaussianBlur
stdDeviation="2 2"
result="blur"
id="feGaussianBlur3401" />
</filter>
<filter
inkscape:label="Blur Double"
inkscape:menu="Blurs"
inkscape:menu-tooltip="Overlays two copies with different blur amounts and modifiable blend and composite"
style="color-interpolation-filters:sRGB;"
id="filter3435">
<feGaussianBlur
stdDeviation="5"
result="fbSourceGraphic"
id="feGaussianBlur3437" />
<feGaussianBlur
stdDeviation="0.01"
in="SourceGraphic"
result="result1"
id="feGaussianBlur3439" />
<feComposite
in2="result1"
operator="arithmetic"
in="fbSourceGraphic"
k2="0.5"
k3="0.5"
result="result2"
id="feComposite3441" />
<feBlend
in2="fbSourceGraphic"
mode="normal"
result="result3"
id="feBlend3443" />
</filter>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="3.8890872"
inkscape:cx="-18.452064"
inkscape:cy="14.197821"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:snap-bbox-midpoints="true"
inkscape:object-paths="true"
inkscape:object-nodes="true"
inkscape:window-width="1280"
inkscape:window-height="758"
inkscape:window-x="65"
inkscape:window-y="24"
inkscape:window-maximized="0" />
<metadata
id="metadata2821">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<ellipse
style="fill:#000080;fill-opacity:1;stroke:url(#linearGradient4060);stroke-width:1.48421645;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;filter:url(#filter3435)"
id="path4042"
cx="31.683996"
cy="50.300598"
rx="27.257332"
ry="8.8730106"
transform="matrix(0.99177198,0,0,1.1723755,0.26069664,-7.1278108)" />
<ellipse
style="color:#000000;display:block;visibility:visible;fill:#000080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.25000024;marker:none;filter:url(#filter3399)"
id="path12511"
inkscape:export-filename="/home/jimmac/ximian_art/icons/nautilus/suse93/stock_new-16.png"
inkscape:export-xdpi="33.852203"
inkscape:export-ydpi="33.852203"
cx="32.326824"
cy="18.083538"
rx="11.117324"
ry="14.425747" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 17 KiB

+10 -13
View File
@@ -137,24 +137,14 @@
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<item row="3" column="0">
<item row="4" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Density</string>
<string>Density </string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="pushButton_saveas">
<property name="text">
<string>save as name</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="edit_name"/>
</item>
<item row="3" column="1">
<item row="4" column="1">
<widget class="Gui::InputField" name="input_fd_density">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@@ -576,6 +566,13 @@
<string>External material resources</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QPushButton" name="pushButton_saveas">
<property name="text">
<string>save customed material</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_MatWeb">
<property name="text">
+68 -109
View File
@@ -37,24 +37,26 @@ import unittest
mesh_name = 'Mesh'
home_path = FreeCAD.getHomePath()
temp_dir = tempfile.gettempdir()
temp_dir = tempfile.gettempdir() + '/FEM_unittests'
test_file_dir = home_path + 'Mod/Fem/test_files/ccx'
static_base_name = 'cube_static'
frequency_base_name = 'cube_frequency'
thermomech_base_name = 'spine_thermomech'
static_analysis_dir = temp_dir + '/FEM_static'
frequency_analysis_dir = temp_dir + '/FEM_frequency'
thermomech_analysis_dir = temp_dir + '/FEM_thermomech'
static_save_fc_file = static_analysis_dir + '/' + static_base_name + '.fcstd'
static_analysis_inp_file = test_file_dir + '/' + static_base_name + '.inp'
static_expected_values = test_file_dir + "/cube_static_expected_values"
frequency_base_name = 'cube_frequency'
frequency_analysis_dir = temp_dir + '/FEM_frequency'
frequency_save_fc_file = frequency_analysis_dir + '/' + frequency_base_name + '.fcstd'
frequency_analysis_inp_file = test_file_dir + '/' + frequency_base_name + '.inp'
frequency_expected_values = test_file_dir + "/cube_frequency_expected_values"
thermomech_base_name = 'spine_thermomech'
thermomech_analysis_dir = temp_dir + '/FEM_thermomech'
thermomech_save_fc_file = thermomech_analysis_dir + '/' + thermomech_base_name + '.fcstd'
thermomech_analysis_inp_file = test_file_dir + '/' + thermomech_base_name + '.inp'
thermomech_expected_values = test_file_dir + "/spine_thermomech_expected_values"
static_save_fc_file = static_analysis_dir + '/' + static_base_name + '.fcstd'
frequency_save_fc_file = frequency_analysis_dir + '/' + frequency_base_name + '.fcstd'
thermomech_save_fc_file = thermomech_analysis_dir + '/' + thermomech_base_name + '.fcstd'
mesh_points_file = test_file_dir + '/mesh_points.csv'
mesh_volumes_file = test_file_dir + '/mesh_volumes.csv'
@@ -141,52 +143,6 @@ class FemTest(unittest.TestCase):
def save_file(self, fc_file_name):
self.active_doc.saveAs(fc_file_name)
def force_unix_line_ends(self, line_list):
new_line_list = []
for l in line_list:
if l.endswith("\r\n"):
l = l[:-2] + '\n'
new_line_list.append(l)
return new_line_list
def compare_inp_files(self, file_name1, file_name2):
file1 = open(file_name1, 'r')
f1 = file1.readlines()
file1.close()
lf1 = [l for l in f1 if not (l.startswith('** written ') or l.startswith('** file '))]
lf1 = self.force_unix_line_ends(lf1)
file2 = open(file_name2, 'r')
f2 = file2.readlines()
file2.close()
lf2 = [l for l in f2 if not (l.startswith('** written ') or l.startswith('** file '))]
lf2 = self.force_unix_line_ends(lf2)
import difflib
diff = difflib.unified_diff(lf1, lf2, n=0)
result = ''
for l in diff:
result += l
if result:
result = "Comparing {} to {} failed!\n".format(file_name1, file_name2) + result
return result
def compare_stats(self, fea, stat_file=None):
if stat_file:
sf = open(stat_file, 'r')
sf_content = sf.readlines()
sf.close()
sf_content = self.force_unix_line_ends(sf_content)
stat_types = ["U1", "U2", "U3", "Uabs", "Sabs"]
stats = []
for s in stat_types:
stats.append("{}: {}\n".format(s, fea.get_stats(s)))
if sf_content != stats:
fcc_print("Expected stats from {}".format(stat_file))
fcc_print(sf_content)
fcc_print("Stats read from {}.frd file".format(fea.base_name))
fcc_print(stats)
return True
return False
def test_new_analysis(self):
# static
fcc_print('--------------- Start of FEM tests ---------------')
@@ -245,7 +201,7 @@ class FemTest(unittest.TestCase):
self.assertFalse(error, "Writing failed")
fcc_print('Comparing {} to {}/{}.inp'.format(static_analysis_inp_file, static_analysis_dir, mesh_name))
ret = self.compare_inp_files(static_analysis_inp_file, static_analysis_dir + "/" + mesh_name + '.inp')
ret = compare_inp_files(static_analysis_inp_file, static_analysis_dir + "/" + mesh_name + '.inp')
self.assertFalse(ret, "FemToolsCcx write_inp_file test failed.\n{}".format(ret))
fcc_print('Setting up working directory to {} in order to read simulated calculations'.format(test_file_dir))
@@ -268,7 +224,7 @@ class FemTest(unittest.TestCase):
self.assertTrue(fea.results_present, "Cannot read results from {}.frd frd file".format(fea.base_name))
fcc_print('Reading stats from result object for static analysis...')
ret = self.compare_stats(fea, static_expected_values)
ret = compare_stats(fea, static_expected_values)
self.assertFalse(ret, "Invalid results read from .frd file")
fcc_print('Save FreeCAD file for static analysis to {}...'.format(static_save_fc_file))
@@ -294,7 +250,7 @@ class FemTest(unittest.TestCase):
self.assertFalse(error, "Writing failed")
fcc_print('Comparing {} to {}/{}.inp'.format(frequency_analysis_inp_file, frequency_analysis_dir, mesh_name))
ret = self.compare_inp_files(frequency_analysis_inp_file, frequency_analysis_dir + "/" + mesh_name + '.inp')
ret = compare_inp_files(frequency_analysis_inp_file, frequency_analysis_dir + "/" + mesh_name + '.inp')
self.assertFalse(ret, "FemToolsCcx write_inp_file test failed.\n{}".format(ret))
fcc_print('Setting up working directory to {} in order to read simulated calculations'.format(test_file_dir))
@@ -317,7 +273,7 @@ class FemTest(unittest.TestCase):
self.assertTrue(fea.results_present, "Cannot read results from {}.frd frd file".format(fea.base_name))
fcc_print('Reading stats from result object for frequency analysis...')
ret = self.compare_stats(fea, frequency_expected_values)
ret = compare_stats(fea, frequency_expected_values)
self.assertFalse(ret, "Invalid results read from .frd file")
fcc_print('Save FreeCAD file for frequency analysis to {}...'.format(frequency_save_fc_file))
@@ -413,52 +369,6 @@ class TherMechFemTest(unittest.TestCase):
def save_file(self, fc_file_name):
self.active_doc.saveAs(fc_file_name)
def force_unix_line_ends(self, line_list):
new_line_list = []
for l in line_list:
if l.endswith("\r\n"):
l = l[:-2] + '\n'
new_line_list.append(l)
return new_line_list
def compare_inp_files(self, file_name1, file_name2):
file1 = open(file_name1, 'r')
f1 = file1.readlines()
file1.close()
lf1 = [l for l in f1 if not l.startswith('** written ') if not l.startswith('** file ')]
lf1 = self.force_unix_line_ends(lf1)
file2 = open(file_name2, 'r')
f2 = file2.readlines()
file2.close()
lf2 = [l for l in f2 if not l.startswith('** written ') if not l.startswith('** file ')]
lf2 = self.force_unix_line_ends(lf2)
import difflib
diff = difflib.unified_diff(lf1, lf2, n=0)
result = ''
for l in diff:
result += l
if result:
result = "Comparing {} to {} failed!\n".format(file_name1, file_name2) + result
return result
def compare_stats(self, fea, stat_file=None):
if stat_file:
sf = open(stat_file, 'r')
sf_content = sf.readlines()
sf.close()
sf_content = self.force_unix_line_ends(sf_content)
stat_types = ["U1", "U2", "U3", "Uabs", "Sabs"]
stats = []
for s in stat_types:
stats.append("{}: {}\n".format(s, fea.get_stats(s)))
if sf_content != stats:
fcc_print("Expected stats from {}".format(stat_file))
fcc_print(sf_content)
fcc_print("Stats read from {}.frd file".format(fea.base_name))
fcc_print(stats)
return True
return False
def test_new_analysis(self):
fcc_print('--------------- Start of FEM tests ---------------')
fcc_print('Checking FEM new analysis...')
@@ -521,7 +431,7 @@ class TherMechFemTest(unittest.TestCase):
self.assertFalse(error, "Writing failed")
fcc_print('Comparing {} to {}/{}.inp'.format(thermomech_analysis_inp_file, thermomech_analysis_dir, mesh_name))
ret = self.compare_inp_files(thermomech_analysis_inp_file, thermomech_analysis_dir + "/" + mesh_name + '.inp')
ret = compare_inp_files(thermomech_analysis_inp_file, thermomech_analysis_dir + "/" + mesh_name + '.inp')
self.assertFalse(ret, "FemToolsCcx write_inp_file test failed.\n{}".format(ret))
fcc_print('Setting up working directory to {} in order to read simulated calculations'.format(test_file_dir))
@@ -544,7 +454,7 @@ class TherMechFemTest(unittest.TestCase):
self.assertTrue(fea.results_present, "Cannot read results from {}.frd frd file".format(fea.base_name))
fcc_print('Reading stats from result object for thermomech analysis...')
ret = self.compare_stats(fea, thermomech_expected_values)
ret = compare_stats(fea, thermomech_expected_values)
self.assertFalse(ret, "Invalid results read from .frd file")
fcc_print('Save FreeCAD file for thermomech analysis to {}...'.format(thermomech_save_fc_file))
@@ -559,6 +469,55 @@ class TherMechFemTest(unittest.TestCase):
# helpers
def compare_inp_files(file_name1, file_name2):
file1 = open(file_name1, 'r')
f1 = file1.readlines()
file1.close()
lf1 = [l for l in f1 if not (l.startswith('** written ') or l.startswith('** file '))]
lf1 = force_unix_line_ends(lf1)
file2 = open(file_name2, 'r')
f2 = file2.readlines()
file2.close()
lf2 = [l for l in f2 if not (l.startswith('** written ') or l.startswith('** file '))]
lf2 = force_unix_line_ends(lf2)
import difflib
diff = difflib.unified_diff(lf1, lf2, n=0)
result = ''
for l in diff:
result += l
if result:
result = "Comparing {} to {} failed!\n".format(file_name1, file_name2) + result
return result
def compare_stats(fea, stat_file=None):
if stat_file:
sf = open(stat_file, 'r')
sf_content = sf.readlines()
sf.close()
sf_content = force_unix_line_ends(sf_content)
stat_types = ["U1", "U2", "U3", "Uabs", "Sabs"]
stats = []
for s in stat_types:
stats.append("{}: {}\n".format(s, fea.get_stats(s)))
if sf_content != stats:
fcc_print("Expected stats from {}".format(stat_file))
fcc_print(sf_content)
fcc_print("Stats read from {}.frd file".format(fea.base_name))
fcc_print(stats)
return True
return False
def force_unix_line_ends(line_list):
new_line_list = []
for l in line_list:
if l.endswith("\r\n"):
l = l[:-2] + '\n'
new_line_list.append(l)
return new_line_list
def run_fem_unittests():
import unittest
suite = unittest.TestSuite()
@@ -638,7 +597,7 @@ def create_test_results():
stats_thermomech = [] # we only have one result object so we are fine
for s in stat_types:
stats_thermomech.append("{}: {}\n".format(s, fea.get_stats(s)))
thermomech_expected_values_file = thermomech_analysis_dir + '/expected_values_thermomech'
thermomech_expected_values_file = thermomech_analysis_dir + '/spine_thermomech_expected_values'
f = open(thermomech_expected_values_file, 'w')
for s in stats_thermomech:
f.write(s)
@@ -657,12 +616,12 @@ def create_test_results():
'''
update the results in FEM untit tests:
update the results of FEM unit tests:
import TestFem
TestFem.create_test_results()
copy result files from FEM test directories into the src dirctory
copy result files from your_temp_directory/FEM_unittests/ test directories into the src dirctory
compare the results with git difftool
run make
start FreeCAD and run FEM unit test
+1 -1
View File
@@ -38,7 +38,7 @@ class _CommandMaterialFluid(FemCommands):
"the Fem_MaterialFluid command definition"
def __init__(self):
super(_CommandMaterialFluid, self).__init__()
self.resources = {'Pixmap': 'fem-material',
self.resources = {'Pixmap': 'fem-material-fluid',
'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_MaterialFluid", "FEM material for Fluid"),
'Accel': "M, M",
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_MaterialFluid", "Creates a FEM material for Fluid")}
+72 -8
View File
@@ -30,6 +30,8 @@ __url__ = "http://www.freecadweb.org"
import FreeCAD
import FreeCADGui
from PySide import QtGui
from PySide.QtGui import QFileDialog
# from PySide.QtGui import QMessageBox
from PySide import QtCore
import Units
@@ -51,8 +53,8 @@ class _TaskPanelFemMaterial:
self.references_shape_type = None
self.form = FreeCADGui.PySideUic.loadUi(FreeCAD.getHomePath() + "Mod/Fem/TaskPanelFemMaterial.ui")
QtCore.QObject.connect(self.form.pushButton_MatWeb, QtCore.SIGNAL("clicked()"), self.goMatWeb)
QtCore.QObject.connect(self.form.pushButton_saveas, QtCore.SIGNAL("clicked()"), self.saveas_material)
QtCore.QObject.connect(self.form.pushButton_MatWeb, QtCore.SIGNAL("clicked()"), self.goto_MatWeb)
QtCore.QObject.connect(self.form.pushButton_saveas, QtCore.SIGNAL("clicked()"), self.export_material)
QtCore.QObject.connect(self.form.cb_materials, QtCore.SIGNAL("activated(int)"), self.choose_material)
QtCore.QObject.connect(self.form.pushButton_Reference, QtCore.SIGNAL("clicked()"), self.add_references)
QtCore.QObject.connect(self.form.rb_standard, QtCore.SIGNAL("toggled(bool)"), self.choose_selection_mode_standard)
@@ -154,7 +156,7 @@ class _TaskPanelFemMaterial:
return False
return True
def goMatWeb(self):
def goto_MatWeb(self):
import webbrowser
webbrowser.open("http://matweb.com")
@@ -353,6 +355,7 @@ class _TaskPanelFemMaterial:
self.form.cb_materials.addItem(QtGui.QIcon(":/icons/help-browser.svg"), material_name, material_name)
self.materials[material_name] = material
######################## material import and export ###################
def import_materials(self):
self.materials = {}
self.pathList = []
@@ -388,7 +391,7 @@ class _TaskPanelFemMaterial:
use_mat_from_config_dir = self.fem_prefs.GetBool("UseMaterialsFromConfigDir", True)
if use_mat_from_config_dir:
user_mat_dirname = FreeCAD.getUserAppDataDir() + "Materials"
user_mat_dirname = FreeCAD.getUserAppDataDir() + "FluidMaterial"
self.add_mat_dir(user_mat_dirname, ":/icons/preferences-general.svg")
use_mat_from_custom_dir = self.fem_prefs.GetBool("UseMaterialsFromCustomDir", True)
@@ -413,10 +416,71 @@ class _TaskPanelFemMaterial:
for mat in material_name_list:
self.form.cb_materials.addItem(QtGui.QIcon(icon), mat[0], mat[1])
def saveas_material(self):
import Material
mat_file_extension = ".FCMat"
# overwritinig warning, save to customed dir, material name check
def export_FCMat(self, fileName, matDict):
"""
Write a material dictionary to a FCMat file, a version without group support, with Python3
<https://github.com/FreeCAD/FreeCAD/blob/master/src/Mod/Material/Material.py>
"""
try:
import ConfigParser as configparser
except:
import configparser # Python 3
# himport string
Config = configparser.ConfigParser()
Config.optionxform = str # disable conversion all uppercase leter in key into lower case
# ignore creating group, just fill all into group 'FCMat'
grp = 'FCMat'
if not Config.has_section(grp):
Config.add_section(grp)
for x in matDict.keys():
Config.set(grp, x, matDict[x])
Preamble = "# This is a FreeCAD material-card file\n\n"
# Writing our configuration file to 'example.cfg'
with open(fileName, 'wb') as configfile:
configfile.write(Preamble)
Config.write(configfile)
def export_material(self):
import os
if self.obj.Category == 'Fluid':
MaterialDir = 'FluidMaterial'
else:
MaterialDir = 'Material'
_UseMaterialsFromCustomDir = self.fem_prefs.GetBool("UseMaterialsFromCustomDir", True)
_dir = self.fem_prefs.GetString("CustomMaterialsDir", "")
if _UseMaterialsFromCustomDir and _dir != "" and os.path.isdir(_dir):
TargetDir = self.fem_prefs.GetString("CustomMaterialsDir", "")
elif self.fem_prefs.GetBool("UseMaterialsFromConfigDir", True):
TargetDir = FreeCAD.getUserAppDataDir() + os.path.sep + MaterialDir # $HOME/.FreeCAD
else:
FreeCAD.Console.PrintMessage("Customed material saving directory is not setup in Fem preference")
if not os.path.exists(TargetDir):
os.mkdir(TargetDir)
saveName, Filter = QFileDialog.getSaveFileName(None, "Save a Material property file", TargetDir, "*.FCMat")
if not saveName == "":
print(saveName)
knownMaterials = [self.form.cb_materials.itemText(i) for i in range(self.form.cb_materials.count())]
material_name = os.path.basename(saveName[:-len('.FCMat')])
if material_name not in knownMaterials:
self.export_FCMat(saveName, self.obj.Material)
FreeCAD.Console.PrintMessage("Sucessfully save the Material property file: " + saveName + "\n")
else:
self.export_FCMat(saveName, self.obj.Material)
FreeCAD.Console.PrintMessage("Sucessfully overwritren the Material property file: " + saveName + "\n")
"""
msgBox = QMessageBox()
msgBox.setText("FcMat file name {} has existed in {} or system folder, overwriting?\n".format(saveName, TargetDir))
msgBox.addButton(QMessageBox.Yes)
msgBox.addButton(QMessageBox.No)
msgBox.setDefaultButton(QMessageBox.No)
ret = msgBox.exec_()
if ret == QMessageBox.Yes:
self.export_FCMat(saveName, self.obj.Material)
FreeCAD.Console.PrintMessage("Sucessfully overwritren the Material property file: "+ saveName + "\n")
"""
###################geometry reference selection #################
def references_list_right_clicked(self, QPos):
+1 -1
View File
@@ -166,7 +166,7 @@ class _TaskPanelFemMeshGmsh:
if self.analysis:
for m in FemGui.getActiveAnalysis().Member:
if m.Name == self.mesh_obj.Name:
print(self.analysis.Name)
print('Active analysis found: ' + self.analysis.Name)
return
else:
# print('Mesh is not member of active analysis, means no group meshing')
+47 -30
View File
@@ -69,38 +69,55 @@ class _ViewProviderFemMeshGmsh:
if not gui_doc.getInEdit():
# may be go the other way around and just activate the analysis the user has doubleClicked on ?!
# not a fast one, we need to iterate over all member of all analysis to know to which analyis the object belongs too!!!
if FemGui.getActiveAnalysis() is not None:
if FemGui.getActiveAnalysis().Document is FreeCAD.ActiveDocument:
if self.Object in FemGui.getActiveAnalysis().Member:
if not gui_doc.getInEdit():
gui_doc.setEdit(vobj.Object.Name)
else:
FreeCAD.Console.PrintError('Activate the analysis this mesh belongs to!\n')
else:
print('Mesh does not belong to the active analysis.')
for o in gui_doc.Document.Objects:
if o.isDerivedFrom('Fem::FemAnalysisPython'):
for m in o.Member:
if m == self.Object:
FemGui.setActiveAnalysis(o)
print('Analysis the Mesh belongs too was activated.')
gui_doc.setEdit(vobj.Object.Name)
break
else:
FreeCAD.Console.PrintError('Active Analysis is not in active Document!\n')
else:
# no active analysis, we gone have a look if the obj belongs to a non active analysis,
for o in gui_doc.Document.Objects:
if o.isDerivedFrom('Fem::FemAnalysisPython'):
for m in o.Member:
if m == self.Object:
FemGui.setActiveAnalysis(o)
print('Analysis the Mesh belongs too was activated.')
# first check if there is an analysis in the active document
found_an_analysis = False
for o in gui_doc.Document.Objects:
if o.isDerivedFrom('Fem::FemAnalysisPython'):
found_an_analysis = True
break
if found_an_analysis:
if FemGui.getActiveAnalysis() is not None:
if FemGui.getActiveAnalysis().Document is FreeCAD.ActiveDocument:
if self.Object in FemGui.getActiveAnalysis().Member:
if not gui_doc.getInEdit():
gui_doc.setEdit(vobj.Object.Name)
break
else:
FreeCAD.Console.PrintError('Activate the analysis this GMSH FEM mesh object belongs too!\n')
else:
print('GMSH FEM mesh object does not belong to the active analysis.')
found_mesh_analysis = False
for o in gui_doc.Document.Objects:
if o.isDerivedFrom('Fem::FemAnalysisPython'):
for m in o.Member:
if m == self.Object:
found_mesh_analysis = True
FemGui.setActiveAnalysis(o)
print('The analysis the GMSH FEM mesh object belongs too was found and activated: ' + o.Name)
gui_doc.setEdit(vobj.Object.Name)
break
if not found_mesh_analysis:
print('GMSH FEM mesh object does not belong to an analysis. Analysis group meshing will be deactivated.')
gui_doc.setEdit(vobj.Object.Name)
else:
FreeCAD.Console.PrintError('Active analysis is not in active document.')
else:
print('Mesh GMSH object does not belong to an analysis. Group meshing will is deactivated.')
gui_doc.setEdit(vobj.Object.Name)
print('No active analysis in active document, we gone have a look if the GMSH FEM mesh object belongs to a non active analysis.')
found_mesh_analysis = False
for o in gui_doc.Document.Objects:
if o.isDerivedFrom('Fem::FemAnalysisPython'):
for m in o.Member:
if m == self.Object:
found_mesh_analysis = True
FemGui.setActiveAnalysis(o)
print('The analysis the GMSH FEM mesh object belongs too was found and activated: ' + o.Name)
gui_doc.setEdit(vobj.Object.Name)
break
if not found_mesh_analysis:
print('GMSH FEM mesh object does not belong to an analysis. Analysis group meshing will be deactivated.')
gui_doc.setEdit(vobj.Object.Name)
else:
print('No analysis in the active document.')
gui_doc.setEdit(vobj.Object.Name)
else:
FreeCAD.Console.PrintError('Active Task Dialog found! Please close this one first!\n')
return True
File diff suppressed because it is too large Load Diff
+133 -131
View File
@@ -1,9 +1,11 @@
1C
1UUSER
1UDATE 14.march.2016
1UTIME 18:14:12
1UDATE 22.january.2017
1UTIME 14:44:34
1UHOST
1UPGM CalculiX
1UVERSION Version 2.10
1UCOMPILETIME Sa 5. Mär 12:23:33 CET 2016
1UDIR
1UDBN
1UMAT 1MECHANICALMATERIAL
@@ -290,263 +292,263 @@
-1 280 1.25000E+00 7.50000E+00 3.75000E+00
-3
3C 129 1
-1 633 6 0 1
-1 1 6 0 1
-2 95 98 47 196 103 197 198 200 199 201
-1 634 6 0 1
-1 2 6 0 1
-2 147 121 145 196 203 202 161 205 204 206
-1 635 6 0 1
-1 3 6 0 1
-2 73 70 27 121 84 80 83 208 207 136
-1 636 6 0 1
-1 4 6 0 1
-2 72 170 30 171 209 187 75 210 181 194
-1 637 6 0 1
-1 5 6 0 1
-2 9 98 47 95 101 197 54 102 103 198
-1 638 6 0 1
-1 6 6 0 1
-2 172 70 30 71 211 78 186 212 93 91
-1 639 6 0 1
-1 7 6 0 1
-2 170 99 36 174 213 119 184 191 214 190
-1 640 6 0 1
-1 8 6 0 1
-2 12 47 149 145 57 215 150 152 216 155
-1 641 6 0 1
-1 9 6 0 1
-2 70 27 123 72 80 143 217 79 77 218
-1 642 6 0 1
-1 10 6 0 1
-2 39 147 121 145 160 203 132 159 161 202
-1 643 6 0 1
-1 11 6 0 1
-2 70 120 121 196 219 134 207 221 220 204
-1 644 6 0 1
-1 12 6 0 1
-2 70 172 170 196 211 183 222 221 223 224
-1 645 6 0 1
-1 13 6 0 1
-2 95 99 170 195 104 213 225 227 226 228
-1 646 6 0 1
-1 14 6 0 1
-2 145 45 47 196 229 56 216 206 230 201
-1 647 6 0 1
-1 15 6 0 1
-2 70 123 120 195 217 126 219 232 231 233
-1 648 6 0 1
-1 16 6 0 1
-2 47 45 95 196 56 234 198 201 230 200
-1 649 6 0 1
-1 17 6 0 1
-2 121 120 145 196 134 235 202 204 220 206
-1 650 6 0 1
-1 18 6 0 1
-2 145 39 120 121 159 133 235 202 132 134
-1 651 6 0 1
-1 19 6 0 1
-2 70 120 27 121 219 137 80 207 134 136
-1 652 6 0 1
-1 20 6 0 1
-2 9 47 45 95 54 56 52 102 198 234
-1 653 6 0 1
-1 21 6 0 1
-2 70 27 120 123 80 137 219 217 143 126
-1 654 6 0 1
-1 22 6 0 1
-2 45 47 12 145 56 57 58 229 216 152
-1 655 6 0 1
-1 23 6 0 1
-2 170 95 36 99 225 109 184 213 104 119
-1 656 6 0 1
-1 24 6 0 1
-2 195 45 145 196 237 229 236 238 230 206
-1 657 6 0 1
-1 25 6 0 1
-2 95 45 195 196 234 237 227 200 230 238
-1 658 6 0 1
-1 26 6 0 1
-2 170 95 195 196 225 227 228 224 200 238
-1 659 6 0 1
-1 27 6 0 1
-2 70 170 195 196 222 228 232 221 224 238
-1 660 6 0 1
-1 28 6 0 1
-2 195 120 70 196 233 219 232 238 220 221
-1 661 6 0 1
-1 29 6 0 1
-2 145 120 195 196 235 233 236 206 220 238
-1 662 6 0 1
-1 30 6 0 1
-2 74 24 148 196 86 165 239 241 240 242
-1 663 6 0 1
-1 31 6 0 1
-2 21 74 97 196 88 243 114 244 241 245
-1 664 6 0 1
-1 32 6 0 1
-2 148 33 97 196 167 116 246 242 247 245
-1 665 6 0 1
-1 33 6 0 1
-2 173 124 42 195 248 129 175 250 249 251
-1 666 6 0 1
-1 34 6 0 1
-2 48 15 124 195 64 144 252 254 253 249
-1 667 6 0 1
-1 35 6 0 1
-2 18 48 173 195 68 255 188 256 254 250
-1 668 6 0 1
-1 36 6 0 1
-2 74 70 24 196 89 85 86 241 221 240
-1 669 6 0 1
-1 37 6 0 1
-2 170 18 173 195 189 188 177 228 256 250
-1 670 6 0 1
-1 38 6 0 1
-2 70 74 21 196 89 88 90 221 241 244
-1 671 6 0 1
-1 39 6 0 1
-2 120 123 42 195 126 125 127 233 231 251
-1 672 6 0 1
-1 40 6 0 1
-2 170 173 42 195 177 175 178 228 250 251
-1 673 6 0 1
-1 41 6 0 1
-2 42 124 120 195 129 130 127 251 249 233
-1 674 6 0 1
-1 42 6 0 1
-2 15 122 120 195 138 140 139 253 257 233
-1 675 6 0 1
-1 43 6 0 1
-2 124 15 120 195 144 139 130 249 253 233
-1 676 6 0 1
-1 44 6 0 1
-2 15 48 45 195 64 66 67 253 254 237
-1 677 6 0 1
-1 45 6 0 1
-2 24 147 145 196 163 161 164 240 205 206
-1 678 6 0 1
-1 46 6 0 1
-2 95 97 33 196 113 116 115 200 245 247
-1 679 6 0 1
-1 47 6 0 1
-2 33 98 95 196 118 103 115 247 199 200
-1 680 6 0 1
-1 48 6 0 1
-2 95 96 21 196 107 111 110 200 258 244
-1 681 6 0 1
-1 49 6 0 1
-2 97 95 21 196 113 110 114 245 200 244
-1 682 6 0 1
-1 50 6 0 1
-2 145 33 148 196 168 167 166 206 247 242
-1 683 6 0 1
-1 51 6 0 1
-2 24 145 148 196 164 166 165 240 206 242
-1 684 6 0 1
-1 52 6 0 1
-2 18 45 48 195 63 66 68 256 237 254
-1 685 6 0 1
-1 53 6 0 1
-2 45 18 46 195 63 62 53 237 256 259
-1 686 6 0 1
-1 54 6 0 1
-2 48 124 173 195 252 248 255 254 249 250
-1 687 6 0 1
-1 55 6 0 1
-2 148 97 74 196 246 243 239 242 245 241
-1 688 6 0 1
-1 56 6 0 1
-2 74 24 5 148 86 25 87 239 165 169
-1 689 6 0 1
-1 57 6 0 1
-2 3 49 122 15 60 260 141 16 69 138
-1 690 6 0 1
-1 58 6 0 1
-2 146 12 49 3 153 59 261 156 14 60
-1 691 6 0 1
-1 59 6 0 1
-2 15 124 4 48 144 131 17 64 252 65
-1 692 6 0 1
-1 60 6 0 1
-2 149 1 47 12 151 55 215 150 13 57
-1 693 6 0 1
-1 61 6 0 1
-2 147 7 73 24 162 82 262 163 26 81
-1 694 6 0 1
-1 62 6 0 1
-2 36 172 6 96 182 185 38 108 263 112
-1 695 6 0 1
-1 63 6 0 1
-2 98 47 1 9 197 55 100 101 54 10
-1 696 6 0 1
-1 64 6 0 1
-2 2 174 46 18 192 264 50 19 193 62
-1 697 6 0 1
-1 65 6 0 1
-2 1 149 98 33 151 265 100 34 157 118
-1 698 6 0 1
-1 66 6 0 1
-2 48 173 4 18 255 176 65 68 188 20
-1 699 6 0 1
-1 67 6 0 1
-2 30 72 171 8 75 210 194 32 76 180
-1 700 6 0 1
-1 68 6 0 1
-2 97 21 5 74 114 22 117 243 88 87
-1 701 6 0 1
-1 69 6 0 1
-2 9 46 2 99 51 50 11 105 266 106
-1 702 6 0 1
-1 70 6 0 1
-2 8 123 171 42 128 267 180 44 125 179
-1 703 6 0 1
-1 71 6 0 1
-2 97 5 33 148 117 35 116 246 169 167
-1 704 6 0 1
-1 72 6 0 1
-2 99 174 2 36 214 192 106 119 190 37
-1 705 6 0 1
-1 73 6 0 1
-2 173 124 4 42 248 131 176 175 129 43
-1 706 6 0 1
-1 74 6 0 1
-2 3 122 146 39 141 268 156 40 142 158
-1 707 6 0 1
-1 75 6 0 1
-2 8 72 123 27 76 218 128 29 77 143
-1 708 6 0 1
-1 76 6 0 1
-2 71 172 6 30 212 185 92 91 186 31
-1 709 6 0 1
-1 77 6 0 1
-2 147 121 7 39 203 135 162 160 132 41
-1 710 6 0 1
-1 78 6 0 1
-2 73 121 27 7 208 136 83 82 135 28
-1 711 6 0 1
-1 79 6 0 1
-2 71 6 96 21 92 112 269 94 23 111
-1 712 6 0 1
-1 80 6 0 1
-2 146 49 122 3 261 260 268 156 60 141
-1 713 6 0 1
-1 81 6 0 1
-2 2 46 174 99 50 264 192 106 266 214
-1 714 6 0 1
-1 82 6 0 1
-2 123 171 72 8 267 210 218 128 180 76
-1 715 6 0 1
-1 83 6 0 1
-2 7 73 121 147 82 208 135 162 262 203
-1 716 6 0 1
-1 84 6 0 1
-2 173 4 124 48 176 131 248 255 65 252
-1 717 6 0 1
-1 85 6 0 1
-2 96 172 6 71 263 185 112 269 212 92
-1 718 6 0 1
-1 86 6 0 1
-2 74 5 97 148 87 117 243 239 169 246
-1 719 6 0 1
-1 87 6 0 1
-2 1 98 149 47 100 265 151 55 197 215
-1 720 6 0 1
-1 88 6 0 1
-2 147 121 70 73 203 207 270 262 208 84
-1 721 6 0 1
-1 89 6 0 1
-2 121 147 70 196 203 270 207 204 205 221
-1 722 6 0 1
-1 90 6 0 1
-2 147 70 24 73 270 85 163 262 84 81
-1 723 6 0 1
-1 91 6 0 1
-2 70 147 24 196 270 163 85 221 205 240
-1 724 6 0 1
-1 92 6 0 1
-2 146 195 45 145 272 237 271 154 236 229
-1 725 6 0 1
-1 93 6 0 1
-2 12 45 146 49 58 271 153 59 61 261
-1 726 6 0 1
-1 94 6 0 1
-2 146 45 12 145 271 58 153 154 229 152
-1 727 6 0 1
-1 95 6 0 1
-2 98 47 145 149 197 216 273 265 215 155
-1 728 6 0 1
-1 96 6 0 1
-2 145 47 98 196 216 197 273 206 201 199
-1 729 6 0 1
-1 97 6 0 1
-2 33 98 145 149 118 273 168 157 265 155
-1 730 6 0 1
-1 98 6 0 1
-2 145 98 33 196 273 118 168 206 199 247
-1 731 6 0 1
-1 99 6 0 1
-2 95 196 172 96 200 223 274 107 258 263
-1 732 6 0 1
-1 100 6 0 1
-2 172 196 95 170 223 200 274 183 224 225
-1 733 6 0 1
-1 101 6 0 1
-2 36 95 172 96 109 274 182 108 107 263
-1 734 6 0 1
-1 102 6 0 1
-2 172 95 36 170 274 109 182 183 225 184
-1 735 6 0 1
-1 103 6 0 1
-2 96 70 172 71 275 211 263 269 93 212
-1 736 6 0 1
-1 104 6 0 1
-2 172 70 96 196 211 275 263 223 221 258
-1 737 6 0 1
-1 105 6 0 1
-2 96 21 70 71 111 90 275 269 94 93
-1 738 6 0 1
-1 106 6 0 1
-2 70 21 96 196 90 111 275 221 244 258
-1 739 6 0 1
-1 107 6 0 1
-2 45 195 99 95 237 226 276 234 227 104
-1 740 6 0 1
-1 108 6 0 1
-2 99 195 45 46 226 237 276 266 259 53
-1 741 6 0 1
-1 109 6 0 1
-2 9 45 99 95 52 276 105 102 234 104
-1 742 6 0 1
-1 110 6 0 1
-2 99 45 9 46 276 52 105 266 53 51
-1 743 6 0 1
-1 111 6 0 1
-2 123 170 72 171 277 209 218 267 181 210
-1 744 6 0 1
-1 112 6 0 1
-2 42 170 123 171 178 277 125 179 181 267
-1 745 6 0 1
-1 113 6 0 1
-2 170 42 123 195 178 125 277 228 251 231
-1 746 6 0 1
-1 114 6 0 1
-2 170 70 123 72 222 217 277 209 79 218
-1 747 6 0 1
-1 115 6 0 1
-2 123 70 170 195 217 222 277 231 232 228
-1 748 6 0 1
-1 116 6 0 1
-2 120 146 195 122 278 272 233 140 268 257
-1 749 6 0 1
-1 117 6 0 1
-2 146 120 195 145 278 233 272 154 235 236
-1 750 6 0 1
-1 118 6 0 1
-2 39 146 120 122 158 278 133 142 268 140
-1 751 6 0 1
-1 119 6 0 1
-2 146 39 120 145 158 133 278 154 159 235
-1 752 6 0 1
-1 120 6 0 1
-2 46 99 170 174 266 213 279 264 214 191
-1 753 6 0 1
-1 121 6 0 1
-2 170 99 46 195 213 266 279 228 226 259
-1 754 6 0 1
-1 122 6 0 1
-2 18 46 170 174 62 279 189 193 264 191
-1 755 6 0 1
-1 123 6 0 1
-2 170 46 18 195 279 62 189 228 259 256
-1 756 6 0 1
-1 124 6 0 1
-2 70 30 170 172 78 187 222 211 186 183
-1 757 6 0 1
-1 125 6 0 1
-2 170 30 70 72 187 78 222 209 75 79
-1 758 6 0 1
-1 126 6 0 1
-2 122 45 146 195 280 271 268 257 237 272
-1 759 6 0 1
-1 127 6 0 1
-2 146 45 122 49 271 280 268 261 61 260
-1 760 6 0 1
-1 128 6 0 1
-2 122 15 45 195 138 67 280 257 253 237
-1 761 6 0 1
-1 129 6 0 1
-2 45 15 122 49 67 138 280 61 69 260
-3
1PSTEP 1 1 1
+132 -132
View File
@@ -280,135 +280,135 @@
279, 2.5, 3.75, 8.75
280, 1.25, 7.5, 3.75
*Element, TYPE=C3D10, ELSET=Eall
633, 95, 98, 47, 196, 103, 197, 198, 200, 199, 201
634, 147, 121, 145, 196, 203, 202, 161, 205, 204, 206
635, 73, 70, 27, 121, 84, 80, 83, 208, 207, 136
636, 72, 170, 30, 171, 209, 187, 75, 210, 181, 194
637, 9, 98, 47, 95, 101, 197, 54, 102, 103, 198
638, 172, 70, 30, 71, 211, 78, 186, 212, 93, 91
639, 170, 99, 36, 174, 213, 119, 184, 191, 214, 190
640, 12, 47, 149, 145, 57, 215, 150, 152, 216, 155
641, 70, 27, 123, 72, 80, 143, 217, 79, 77, 218
642, 39, 147, 121, 145, 160, 203, 132, 159, 161, 202
643, 70, 120, 121, 196, 219, 134, 207, 221, 220, 204
644, 70, 172, 170, 196, 211, 183, 222, 221, 223, 224
645, 95, 99, 170, 195, 104, 213, 225, 227, 226, 228
646, 145, 45, 47, 196, 229, 56, 216, 206, 230, 201
647, 70, 123, 120, 195, 217, 126, 219, 232, 231, 233
648, 47, 45, 95, 196, 56, 234, 198, 201, 230, 200
649, 121, 120, 145, 196, 134, 235, 202, 204, 220, 206
650, 145, 39, 120, 121, 159, 133, 235, 202, 132, 134
651, 70, 120, 27, 121, 219, 137, 80, 207, 134, 136
652, 9, 47, 45, 95, 54, 56, 52, 102, 198, 234
653, 70, 27, 120, 123, 80, 137, 219, 217, 143, 126
654, 45, 47, 12, 145, 56, 57, 58, 229, 216, 152
655, 170, 95, 36, 99, 225, 109, 184, 213, 104, 119
656, 195, 45, 145, 196, 237, 229, 236, 238, 230, 206
657, 95, 45, 195, 196, 234, 237, 227, 200, 230, 238
658, 170, 95, 195, 196, 225, 227, 228, 224, 200, 238
659, 70, 170, 195, 196, 222, 228, 232, 221, 224, 238
660, 195, 120, 70, 196, 233, 219, 232, 238, 220, 221
661, 145, 120, 195, 196, 235, 233, 236, 206, 220, 238
662, 74, 24, 148, 196, 86, 165, 239, 241, 240, 242
663, 21, 74, 97, 196, 88, 243, 114, 244, 241, 245
664, 148, 33, 97, 196, 167, 116, 246, 242, 247, 245
665, 173, 124, 42, 195, 248, 129, 175, 250, 249, 251
666, 48, 15, 124, 195, 64, 144, 252, 254, 253, 249
667, 18, 48, 173, 195, 68, 255, 188, 256, 254, 250
668, 74, 70, 24, 196, 89, 85, 86, 241, 221, 240
669, 170, 18, 173, 195, 189, 188, 177, 228, 256, 250
670, 70, 74, 21, 196, 89, 88, 90, 221, 241, 244
671, 120, 123, 42, 195, 126, 125, 127, 233, 231, 251
672, 170, 173, 42, 195, 177, 175, 178, 228, 250, 251
673, 42, 124, 120, 195, 129, 130, 127, 251, 249, 233
674, 15, 122, 120, 195, 138, 140, 139, 253, 257, 233
675, 124, 15, 120, 195, 144, 139, 130, 249, 253, 233
676, 15, 48, 45, 195, 64, 66, 67, 253, 254, 237
677, 24, 147, 145, 196, 163, 161, 164, 240, 205, 206
678, 95, 97, 33, 196, 113, 116, 115, 200, 245, 247
679, 33, 98, 95, 196, 118, 103, 115, 247, 199, 200
680, 95, 96, 21, 196, 107, 111, 110, 200, 258, 244
681, 97, 95, 21, 196, 113, 110, 114, 245, 200, 244
682, 145, 33, 148, 196, 168, 167, 166, 206, 247, 242
683, 24, 145, 148, 196, 164, 166, 165, 240, 206, 242
684, 18, 45, 48, 195, 63, 66, 68, 256, 237, 254
685, 45, 18, 46, 195, 63, 62, 53, 237, 256, 259
686, 48, 124, 173, 195, 252, 248, 255, 254, 249, 250
687, 148, 97, 74, 196, 246, 243, 239, 242, 245, 241
688, 74, 24, 5, 148, 86, 25, 87, 239, 165, 169
689, 3, 49, 122, 15, 60, 260, 141, 16, 69, 138
690, 146, 12, 49, 3, 153, 59, 261, 156, 14, 60
691, 15, 124, 4, 48, 144, 131, 17, 64, 252, 65
692, 149, 1, 47, 12, 151, 55, 215, 150, 13, 57
693, 147, 7, 73, 24, 162, 82, 262, 163, 26, 81
694, 36, 172, 6, 96, 182, 185, 38, 108, 263, 112
695, 98, 47, 1, 9, 197, 55, 100, 101, 54, 10
696, 2, 174, 46, 18, 192, 264, 50, 19, 193, 62
697, 1, 149, 98, 33, 151, 265, 100, 34, 157, 118
698, 48, 173, 4, 18, 255, 176, 65, 68, 188, 20
699, 30, 72, 171, 8, 75, 210, 194, 32, 76, 180
700, 97, 21, 5, 74, 114, 22, 117, 243, 88, 87
701, 9, 46, 2, 99, 51, 50, 11, 105, 266, 106
702, 8, 123, 171, 42, 128, 267, 180, 44, 125, 179
703, 97, 5, 33, 148, 117, 35, 116, 246, 169, 167
704, 99, 174, 2, 36, 214, 192, 106, 119, 190, 37
705, 173, 124, 4, 42, 248, 131, 176, 175, 129, 43
706, 3, 122, 146, 39, 141, 268, 156, 40, 142, 158
707, 8, 72, 123, 27, 76, 218, 128, 29, 77, 143
708, 71, 172, 6, 30, 212, 185, 92, 91, 186, 31
709, 147, 121, 7, 39, 203, 135, 162, 160, 132, 41
710, 73, 121, 27, 7, 208, 136, 83, 82, 135, 28
711, 71, 6, 96, 21, 92, 112, 269, 94, 23, 111
712, 146, 49, 122, 3, 261, 260, 268, 156, 60, 141
713, 2, 46, 174, 99, 50, 264, 192, 106, 266, 214
714, 123, 171, 72, 8, 267, 210, 218, 128, 180, 76
715, 7, 73, 121, 147, 82, 208, 135, 162, 262, 203
716, 173, 4, 124, 48, 176, 131, 248, 255, 65, 252
717, 96, 172, 6, 71, 263, 185, 112, 269, 212, 92
718, 74, 5, 97, 148, 87, 117, 243, 239, 169, 246
719, 1, 98, 149, 47, 100, 265, 151, 55, 197, 215
720, 147, 121, 70, 73, 203, 207, 270, 262, 208, 84
721, 121, 147, 70, 196, 203, 270, 207, 204, 205, 221
722, 147, 70, 24, 73, 270, 85, 163, 262, 84, 81
723, 70, 147, 24, 196, 270, 163, 85, 221, 205, 240
724, 146, 195, 45, 145, 272, 237, 271, 154, 236, 229
725, 12, 45, 146, 49, 58, 271, 153, 59, 61, 261
726, 146, 45, 12, 145, 271, 58, 153, 154, 229, 152
727, 98, 47, 145, 149, 197, 216, 273, 265, 215, 155
728, 145, 47, 98, 196, 216, 197, 273, 206, 201, 199
729, 33, 98, 145, 149, 118, 273, 168, 157, 265, 155
730, 145, 98, 33, 196, 273, 118, 168, 206, 199, 247
731, 95, 196, 172, 96, 200, 223, 274, 107, 258, 263
732, 172, 196, 95, 170, 223, 200, 274, 183, 224, 225
733, 36, 95, 172, 96, 109, 274, 182, 108, 107, 263
734, 172, 95, 36, 170, 274, 109, 182, 183, 225, 184
735, 96, 70, 172, 71, 275, 211, 263, 269, 93, 212
736, 172, 70, 96, 196, 211, 275, 263, 223, 221, 258
737, 96, 21, 70, 71, 111, 90, 275, 269, 94, 93
738, 70, 21, 96, 196, 90, 111, 275, 221, 244, 258
739, 45, 195, 99, 95, 237, 226, 276, 234, 227, 104
740, 99, 195, 45, 46, 226, 237, 276, 266, 259, 53
741, 9, 45, 99, 95, 52, 276, 105, 102, 234, 104
742, 99, 45, 9, 46, 276, 52, 105, 266, 53, 51
743, 123, 170, 72, 171, 277, 209, 218, 267, 181, 210
744, 42, 170, 123, 171, 178, 277, 125, 179, 181, 267
745, 170, 42, 123, 195, 178, 125, 277, 228, 251, 231
746, 170, 70, 123, 72, 222, 217, 277, 209, 79, 218
747, 123, 70, 170, 195, 217, 222, 277, 231, 232, 228
748, 120, 146, 195, 122, 278, 272, 233, 140, 268, 257
749, 146, 120, 195, 145, 278, 233, 272, 154, 235, 236
750, 39, 146, 120, 122, 158, 278, 133, 142, 268, 140
751, 146, 39, 120, 145, 158, 133, 278, 154, 159, 235
752, 46, 99, 170, 174, 266, 213, 279, 264, 214, 191
753, 170, 99, 46, 195, 213, 266, 279, 228, 226, 259
754, 18, 46, 170, 174, 62, 279, 189, 193, 264, 191
755, 170, 46, 18, 195, 279, 62, 189, 228, 259, 256
756, 70, 30, 170, 172, 78, 187, 222, 211, 186, 183
757, 170, 30, 70, 72, 187, 78, 222, 209, 75, 79
758, 122, 45, 146, 195, 280, 271, 268, 257, 237, 272
759, 146, 45, 122, 49, 271, 280, 268, 261, 61, 260
760, 122, 15, 45, 195, 138, 67, 280, 257, 253, 237
761, 45, 15, 122, 49, 67, 138, 280, 61, 69, 260
1, 95, 98, 47, 196, 103, 197, 198, 200, 199, 201
2, 147, 121, 145, 196, 203, 202, 161, 205, 204, 206
3, 73, 70, 27, 121, 84, 80, 83, 208, 207, 136
4, 72, 170, 30, 171, 209, 187, 75, 210, 181, 194
5, 9, 98, 47, 95, 101, 197, 54, 102, 103, 198
6, 172, 70, 30, 71, 211, 78, 186, 212, 93, 91
7, 170, 99, 36, 174, 213, 119, 184, 191, 214, 190
8, 12, 47, 149, 145, 57, 215, 150, 152, 216, 155
9, 70, 27, 123, 72, 80, 143, 217, 79, 77, 218
10, 39, 147, 121, 145, 160, 203, 132, 159, 161, 202
11, 70, 120, 121, 196, 219, 134, 207, 221, 220, 204
12, 70, 172, 170, 196, 211, 183, 222, 221, 223, 224
13, 95, 99, 170, 195, 104, 213, 225, 227, 226, 228
14, 145, 45, 47, 196, 229, 56, 216, 206, 230, 201
15, 70, 123, 120, 195, 217, 126, 219, 232, 231, 233
16, 47, 45, 95, 196, 56, 234, 198, 201, 230, 200
17, 121, 120, 145, 196, 134, 235, 202, 204, 220, 206
18, 145, 39, 120, 121, 159, 133, 235, 202, 132, 134
19, 70, 120, 27, 121, 219, 137, 80, 207, 134, 136
20, 9, 47, 45, 95, 54, 56, 52, 102, 198, 234
21, 70, 27, 120, 123, 80, 137, 219, 217, 143, 126
22, 45, 47, 12, 145, 56, 57, 58, 229, 216, 152
23, 170, 95, 36, 99, 225, 109, 184, 213, 104, 119
24, 195, 45, 145, 196, 237, 229, 236, 238, 230, 206
25, 95, 45, 195, 196, 234, 237, 227, 200, 230, 238
26, 170, 95, 195, 196, 225, 227, 228, 224, 200, 238
27, 70, 170, 195, 196, 222, 228, 232, 221, 224, 238
28, 195, 120, 70, 196, 233, 219, 232, 238, 220, 221
29, 145, 120, 195, 196, 235, 233, 236, 206, 220, 238
30, 74, 24, 148, 196, 86, 165, 239, 241, 240, 242
31, 21, 74, 97, 196, 88, 243, 114, 244, 241, 245
32, 148, 33, 97, 196, 167, 116, 246, 242, 247, 245
33, 173, 124, 42, 195, 248, 129, 175, 250, 249, 251
34, 48, 15, 124, 195, 64, 144, 252, 254, 253, 249
35, 18, 48, 173, 195, 68, 255, 188, 256, 254, 250
36, 74, 70, 24, 196, 89, 85, 86, 241, 221, 240
37, 170, 18, 173, 195, 189, 188, 177, 228, 256, 250
38, 70, 74, 21, 196, 89, 88, 90, 221, 241, 244
39, 120, 123, 42, 195, 126, 125, 127, 233, 231, 251
40, 170, 173, 42, 195, 177, 175, 178, 228, 250, 251
41, 42, 124, 120, 195, 129, 130, 127, 251, 249, 233
42, 15, 122, 120, 195, 138, 140, 139, 253, 257, 233
43, 124, 15, 120, 195, 144, 139, 130, 249, 253, 233
44, 15, 48, 45, 195, 64, 66, 67, 253, 254, 237
45, 24, 147, 145, 196, 163, 161, 164, 240, 205, 206
46, 95, 97, 33, 196, 113, 116, 115, 200, 245, 247
47, 33, 98, 95, 196, 118, 103, 115, 247, 199, 200
48, 95, 96, 21, 196, 107, 111, 110, 200, 258, 244
49, 97, 95, 21, 196, 113, 110, 114, 245, 200, 244
50, 145, 33, 148, 196, 168, 167, 166, 206, 247, 242
51, 24, 145, 148, 196, 164, 166, 165, 240, 206, 242
52, 18, 45, 48, 195, 63, 66, 68, 256, 237, 254
53, 45, 18, 46, 195, 63, 62, 53, 237, 256, 259
54, 48, 124, 173, 195, 252, 248, 255, 254, 249, 250
55, 148, 97, 74, 196, 246, 243, 239, 242, 245, 241
56, 74, 24, 5, 148, 86, 25, 87, 239, 165, 169
57, 3, 49, 122, 15, 60, 260, 141, 16, 69, 138
58, 146, 12, 49, 3, 153, 59, 261, 156, 14, 60
59, 15, 124, 4, 48, 144, 131, 17, 64, 252, 65
60, 149, 1, 47, 12, 151, 55, 215, 150, 13, 57
61, 147, 7, 73, 24, 162, 82, 262, 163, 26, 81
62, 36, 172, 6, 96, 182, 185, 38, 108, 263, 112
63, 98, 47, 1, 9, 197, 55, 100, 101, 54, 10
64, 2, 174, 46, 18, 192, 264, 50, 19, 193, 62
65, 1, 149, 98, 33, 151, 265, 100, 34, 157, 118
66, 48, 173, 4, 18, 255, 176, 65, 68, 188, 20
67, 30, 72, 171, 8, 75, 210, 194, 32, 76, 180
68, 97, 21, 5, 74, 114, 22, 117, 243, 88, 87
69, 9, 46, 2, 99, 51, 50, 11, 105, 266, 106
70, 8, 123, 171, 42, 128, 267, 180, 44, 125, 179
71, 97, 5, 33, 148, 117, 35, 116, 246, 169, 167
72, 99, 174, 2, 36, 214, 192, 106, 119, 190, 37
73, 173, 124, 4, 42, 248, 131, 176, 175, 129, 43
74, 3, 122, 146, 39, 141, 268, 156, 40, 142, 158
75, 8, 72, 123, 27, 76, 218, 128, 29, 77, 143
76, 71, 172, 6, 30, 212, 185, 92, 91, 186, 31
77, 147, 121, 7, 39, 203, 135, 162, 160, 132, 41
78, 73, 121, 27, 7, 208, 136, 83, 82, 135, 28
79, 71, 6, 96, 21, 92, 112, 269, 94, 23, 111
80, 146, 49, 122, 3, 261, 260, 268, 156, 60, 141
81, 2, 46, 174, 99, 50, 264, 192, 106, 266, 214
82, 123, 171, 72, 8, 267, 210, 218, 128, 180, 76
83, 7, 73, 121, 147, 82, 208, 135, 162, 262, 203
84, 173, 4, 124, 48, 176, 131, 248, 255, 65, 252
85, 96, 172, 6, 71, 263, 185, 112, 269, 212, 92
86, 74, 5, 97, 148, 87, 117, 243, 239, 169, 246
87, 1, 98, 149, 47, 100, 265, 151, 55, 197, 215
88, 147, 121, 70, 73, 203, 207, 270, 262, 208, 84
89, 121, 147, 70, 196, 203, 270, 207, 204, 205, 221
90, 147, 70, 24, 73, 270, 85, 163, 262, 84, 81
91, 70, 147, 24, 196, 270, 163, 85, 221, 205, 240
92, 146, 195, 45, 145, 272, 237, 271, 154, 236, 229
93, 12, 45, 146, 49, 58, 271, 153, 59, 61, 261
94, 146, 45, 12, 145, 271, 58, 153, 154, 229, 152
95, 98, 47, 145, 149, 197, 216, 273, 265, 215, 155
96, 145, 47, 98, 196, 216, 197, 273, 206, 201, 199
97, 33, 98, 145, 149, 118, 273, 168, 157, 265, 155
98, 145, 98, 33, 196, 273, 118, 168, 206, 199, 247
99, 95, 196, 172, 96, 200, 223, 274, 107, 258, 263
100, 172, 196, 95, 170, 223, 200, 274, 183, 224, 225
101, 36, 95, 172, 96, 109, 274, 182, 108, 107, 263
102, 172, 95, 36, 170, 274, 109, 182, 183, 225, 184
103, 96, 70, 172, 71, 275, 211, 263, 269, 93, 212
104, 172, 70, 96, 196, 211, 275, 263, 223, 221, 258
105, 96, 21, 70, 71, 111, 90, 275, 269, 94, 93
106, 70, 21, 96, 196, 90, 111, 275, 221, 244, 258
107, 45, 195, 99, 95, 237, 226, 276, 234, 227, 104
108, 99, 195, 45, 46, 226, 237, 276, 266, 259, 53
109, 9, 45, 99, 95, 52, 276, 105, 102, 234, 104
110, 99, 45, 9, 46, 276, 52, 105, 266, 53, 51
111, 123, 170, 72, 171, 277, 209, 218, 267, 181, 210
112, 42, 170, 123, 171, 178, 277, 125, 179, 181, 267
113, 170, 42, 123, 195, 178, 125, 277, 228, 251, 231
114, 170, 70, 123, 72, 222, 217, 277, 209, 79, 218
115, 123, 70, 170, 195, 217, 222, 277, 231, 232, 228
116, 120, 146, 195, 122, 278, 272, 233, 140, 268, 257
117, 146, 120, 195, 145, 278, 233, 272, 154, 235, 236
118, 39, 146, 120, 122, 158, 278, 133, 142, 268, 140
119, 146, 39, 120, 145, 158, 133, 278, 154, 159, 235
120, 46, 99, 170, 174, 266, 213, 279, 264, 214, 191
121, 170, 99, 46, 195, 213, 266, 279, 228, 226, 259
122, 18, 46, 170, 174, 62, 279, 189, 193, 264, 191
123, 170, 46, 18, 195, 279, 62, 189, 228, 259, 256
124, 70, 30, 170, 172, 78, 187, 222, 211, 186, 183
125, 170, 30, 70, 72, 187, 78, 222, 209, 75, 79
126, 122, 45, 146, 195, 280, 271, 268, 257, 237, 272
127, 146, 45, 122, 49, 271, 280, 268, 261, 61, 260
128, 122, 15, 45, 195, 138, 67, 280, 257, 253, 237
129, 45, 15, 122, 49, 67, 138, 280, 61, 69, 260
@@ -522,9 +522,9 @@ S
***********************************************************
** CalculiX Input file
** written by write_footer function
** written by --> FreeCAD 0.16.5838 +1 (Git)
** written on --> Mon Oct 26 18:34:01 2015
** file name -->
** written by --> FreeCAD 0.17.9749 (Git)
** written on --> Sun Jan 22 14:32:18 2017
** file name --> cube_static.fcstd
** analysis name --> Analysis
**
**
File diff suppressed because it is too large Load Diff
+133 -131
View File
@@ -1,9 +1,11 @@
1C
1UUSER
1UDATE 14.march.2016
1UTIME 18:14:12
1UDATE 22.january.2017
1UTIME 14:44:34
1UHOST
1UPGM CalculiX
1UVERSION Version 2.10
1UCOMPILETIME Sa 5. Mär 12:23:33 CET 2016
1UDIR
1UDBN
1UMAT 1MECHANICALMATERIAL
@@ -290,263 +292,263 @@
-1 280 1.25000E+00 7.50000E+00 3.75000E+00
-3
3C 129 1
-1 633 6 0 1
-1 1 6 0 1
-2 95 98 47 196 103 197 198 200 199 201
-1 634 6 0 1
-1 2 6 0 1
-2 147 121 145 196 203 202 161 205 204 206
-1 635 6 0 1
-1 3 6 0 1
-2 73 70 27 121 84 80 83 208 207 136
-1 636 6 0 1
-1 4 6 0 1
-2 72 170 30 171 209 187 75 210 181 194
-1 637 6 0 1
-1 5 6 0 1
-2 9 98 47 95 101 197 54 102 103 198
-1 638 6 0 1
-1 6 6 0 1
-2 172 70 30 71 211 78 186 212 93 91
-1 639 6 0 1
-1 7 6 0 1
-2 170 99 36 174 213 119 184 191 214 190
-1 640 6 0 1
-1 8 6 0 1
-2 12 47 149 145 57 215 150 152 216 155
-1 641 6 0 1
-1 9 6 0 1
-2 70 27 123 72 80 143 217 79 77 218
-1 642 6 0 1
-1 10 6 0 1
-2 39 147 121 145 160 203 132 159 161 202
-1 643 6 0 1
-1 11 6 0 1
-2 70 120 121 196 219 134 207 221 220 204
-1 644 6 0 1
-1 12 6 0 1
-2 70 172 170 196 211 183 222 221 223 224
-1 645 6 0 1
-1 13 6 0 1
-2 95 99 170 195 104 213 225 227 226 228
-1 646 6 0 1
-1 14 6 0 1
-2 145 45 47 196 229 56 216 206 230 201
-1 647 6 0 1
-1 15 6 0 1
-2 70 123 120 195 217 126 219 232 231 233
-1 648 6 0 1
-1 16 6 0 1
-2 47 45 95 196 56 234 198 201 230 200
-1 649 6 0 1
-1 17 6 0 1
-2 121 120 145 196 134 235 202 204 220 206
-1 650 6 0 1
-1 18 6 0 1
-2 145 39 120 121 159 133 235 202 132 134
-1 651 6 0 1
-1 19 6 0 1
-2 70 120 27 121 219 137 80 207 134 136
-1 652 6 0 1
-1 20 6 0 1
-2 9 47 45 95 54 56 52 102 198 234
-1 653 6 0 1
-1 21 6 0 1
-2 70 27 120 123 80 137 219 217 143 126
-1 654 6 0 1
-1 22 6 0 1
-2 45 47 12 145 56 57 58 229 216 152
-1 655 6 0 1
-1 23 6 0 1
-2 170 95 36 99 225 109 184 213 104 119
-1 656 6 0 1
-1 24 6 0 1
-2 195 45 145 196 237 229 236 238 230 206
-1 657 6 0 1
-1 25 6 0 1
-2 95 45 195 196 234 237 227 200 230 238
-1 658 6 0 1
-1 26 6 0 1
-2 170 95 195 196 225 227 228 224 200 238
-1 659 6 0 1
-1 27 6 0 1
-2 70 170 195 196 222 228 232 221 224 238
-1 660 6 0 1
-1 28 6 0 1
-2 195 120 70 196 233 219 232 238 220 221
-1 661 6 0 1
-1 29 6 0 1
-2 145 120 195 196 235 233 236 206 220 238
-1 662 6 0 1
-1 30 6 0 1
-2 74 24 148 196 86 165 239 241 240 242
-1 663 6 0 1
-1 31 6 0 1
-2 21 74 97 196 88 243 114 244 241 245
-1 664 6 0 1
-1 32 6 0 1
-2 148 33 97 196 167 116 246 242 247 245
-1 665 6 0 1
-1 33 6 0 1
-2 173 124 42 195 248 129 175 250 249 251
-1 666 6 0 1
-1 34 6 0 1
-2 48 15 124 195 64 144 252 254 253 249
-1 667 6 0 1
-1 35 6 0 1
-2 18 48 173 195 68 255 188 256 254 250
-1 668 6 0 1
-1 36 6 0 1
-2 74 70 24 196 89 85 86 241 221 240
-1 669 6 0 1
-1 37 6 0 1
-2 170 18 173 195 189 188 177 228 256 250
-1 670 6 0 1
-1 38 6 0 1
-2 70 74 21 196 89 88 90 221 241 244
-1 671 6 0 1
-1 39 6 0 1
-2 120 123 42 195 126 125 127 233 231 251
-1 672 6 0 1
-1 40 6 0 1
-2 170 173 42 195 177 175 178 228 250 251
-1 673 6 0 1
-1 41 6 0 1
-2 42 124 120 195 129 130 127 251 249 233
-1 674 6 0 1
-1 42 6 0 1
-2 15 122 120 195 138 140 139 253 257 233
-1 675 6 0 1
-1 43 6 0 1
-2 124 15 120 195 144 139 130 249 253 233
-1 676 6 0 1
-1 44 6 0 1
-2 15 48 45 195 64 66 67 253 254 237
-1 677 6 0 1
-1 45 6 0 1
-2 24 147 145 196 163 161 164 240 205 206
-1 678 6 0 1
-1 46 6 0 1
-2 95 97 33 196 113 116 115 200 245 247
-1 679 6 0 1
-1 47 6 0 1
-2 33 98 95 196 118 103 115 247 199 200
-1 680 6 0 1
-1 48 6 0 1
-2 95 96 21 196 107 111 110 200 258 244
-1 681 6 0 1
-1 49 6 0 1
-2 97 95 21 196 113 110 114 245 200 244
-1 682 6 0 1
-1 50 6 0 1
-2 145 33 148 196 168 167 166 206 247 242
-1 683 6 0 1
-1 51 6 0 1
-2 24 145 148 196 164 166 165 240 206 242
-1 684 6 0 1
-1 52 6 0 1
-2 18 45 48 195 63 66 68 256 237 254
-1 685 6 0 1
-1 53 6 0 1
-2 45 18 46 195 63 62 53 237 256 259
-1 686 6 0 1
-1 54 6 0 1
-2 48 124 173 195 252 248 255 254 249 250
-1 687 6 0 1
-1 55 6 0 1
-2 148 97 74 196 246 243 239 242 245 241
-1 688 6 0 1
-1 56 6 0 1
-2 74 24 5 148 86 25 87 239 165 169
-1 689 6 0 1
-1 57 6 0 1
-2 3 49 122 15 60 260 141 16 69 138
-1 690 6 0 1
-1 58 6 0 1
-2 146 12 49 3 153 59 261 156 14 60
-1 691 6 0 1
-1 59 6 0 1
-2 15 124 4 48 144 131 17 64 252 65
-1 692 6 0 1
-1 60 6 0 1
-2 149 1 47 12 151 55 215 150 13 57
-1 693 6 0 1
-1 61 6 0 1
-2 147 7 73 24 162 82 262 163 26 81
-1 694 6 0 1
-1 62 6 0 1
-2 36 172 6 96 182 185 38 108 263 112
-1 695 6 0 1
-1 63 6 0 1
-2 98 47 1 9 197 55 100 101 54 10
-1 696 6 0 1
-1 64 6 0 1
-2 2 174 46 18 192 264 50 19 193 62
-1 697 6 0 1
-1 65 6 0 1
-2 1 149 98 33 151 265 100 34 157 118
-1 698 6 0 1
-1 66 6 0 1
-2 48 173 4 18 255 176 65 68 188 20
-1 699 6 0 1
-1 67 6 0 1
-2 30 72 171 8 75 210 194 32 76 180
-1 700 6 0 1
-1 68 6 0 1
-2 97 21 5 74 114 22 117 243 88 87
-1 701 6 0 1
-1 69 6 0 1
-2 9 46 2 99 51 50 11 105 266 106
-1 702 6 0 1
-1 70 6 0 1
-2 8 123 171 42 128 267 180 44 125 179
-1 703 6 0 1
-1 71 6 0 1
-2 97 5 33 148 117 35 116 246 169 167
-1 704 6 0 1
-1 72 6 0 1
-2 99 174 2 36 214 192 106 119 190 37
-1 705 6 0 1
-1 73 6 0 1
-2 173 124 4 42 248 131 176 175 129 43
-1 706 6 0 1
-1 74 6 0 1
-2 3 122 146 39 141 268 156 40 142 158
-1 707 6 0 1
-1 75 6 0 1
-2 8 72 123 27 76 218 128 29 77 143
-1 708 6 0 1
-1 76 6 0 1
-2 71 172 6 30 212 185 92 91 186 31
-1 709 6 0 1
-1 77 6 0 1
-2 147 121 7 39 203 135 162 160 132 41
-1 710 6 0 1
-1 78 6 0 1
-2 73 121 27 7 208 136 83 82 135 28
-1 711 6 0 1
-1 79 6 0 1
-2 71 6 96 21 92 112 269 94 23 111
-1 712 6 0 1
-1 80 6 0 1
-2 146 49 122 3 261 260 268 156 60 141
-1 713 6 0 1
-1 81 6 0 1
-2 2 46 174 99 50 264 192 106 266 214
-1 714 6 0 1
-1 82 6 0 1
-2 123 171 72 8 267 210 218 128 180 76
-1 715 6 0 1
-1 83 6 0 1
-2 7 73 121 147 82 208 135 162 262 203
-1 716 6 0 1
-1 84 6 0 1
-2 173 4 124 48 176 131 248 255 65 252
-1 717 6 0 1
-1 85 6 0 1
-2 96 172 6 71 263 185 112 269 212 92
-1 718 6 0 1
-1 86 6 0 1
-2 74 5 97 148 87 117 243 239 169 246
-1 719 6 0 1
-1 87 6 0 1
-2 1 98 149 47 100 265 151 55 197 215
-1 720 6 0 1
-1 88 6 0 1
-2 147 121 70 73 203 207 270 262 208 84
-1 721 6 0 1
-1 89 6 0 1
-2 121 147 70 196 203 270 207 204 205 221
-1 722 6 0 1
-1 90 6 0 1
-2 147 70 24 73 270 85 163 262 84 81
-1 723 6 0 1
-1 91 6 0 1
-2 70 147 24 196 270 163 85 221 205 240
-1 724 6 0 1
-1 92 6 0 1
-2 146 195 45 145 272 237 271 154 236 229
-1 725 6 0 1
-1 93 6 0 1
-2 12 45 146 49 58 271 153 59 61 261
-1 726 6 0 1
-1 94 6 0 1
-2 146 45 12 145 271 58 153 154 229 152
-1 727 6 0 1
-1 95 6 0 1
-2 98 47 145 149 197 216 273 265 215 155
-1 728 6 0 1
-1 96 6 0 1
-2 145 47 98 196 216 197 273 206 201 199
-1 729 6 0 1
-1 97 6 0 1
-2 33 98 145 149 118 273 168 157 265 155
-1 730 6 0 1
-1 98 6 0 1
-2 145 98 33 196 273 118 168 206 199 247
-1 731 6 0 1
-1 99 6 0 1
-2 95 196 172 96 200 223 274 107 258 263
-1 732 6 0 1
-1 100 6 0 1
-2 172 196 95 170 223 200 274 183 224 225
-1 733 6 0 1
-1 101 6 0 1
-2 36 95 172 96 109 274 182 108 107 263
-1 734 6 0 1
-1 102 6 0 1
-2 172 95 36 170 274 109 182 183 225 184
-1 735 6 0 1
-1 103 6 0 1
-2 96 70 172 71 275 211 263 269 93 212
-1 736 6 0 1
-1 104 6 0 1
-2 172 70 96 196 211 275 263 223 221 258
-1 737 6 0 1
-1 105 6 0 1
-2 96 21 70 71 111 90 275 269 94 93
-1 738 6 0 1
-1 106 6 0 1
-2 70 21 96 196 90 111 275 221 244 258
-1 739 6 0 1
-1 107 6 0 1
-2 45 195 99 95 237 226 276 234 227 104
-1 740 6 0 1
-1 108 6 0 1
-2 99 195 45 46 226 237 276 266 259 53
-1 741 6 0 1
-1 109 6 0 1
-2 9 45 99 95 52 276 105 102 234 104
-1 742 6 0 1
-1 110 6 0 1
-2 99 45 9 46 276 52 105 266 53 51
-1 743 6 0 1
-1 111 6 0 1
-2 123 170 72 171 277 209 218 267 181 210
-1 744 6 0 1
-1 112 6 0 1
-2 42 170 123 171 178 277 125 179 181 267
-1 745 6 0 1
-1 113 6 0 1
-2 170 42 123 195 178 125 277 228 251 231
-1 746 6 0 1
-1 114 6 0 1
-2 170 70 123 72 222 217 277 209 79 218
-1 747 6 0 1
-1 115 6 0 1
-2 123 70 170 195 217 222 277 231 232 228
-1 748 6 0 1
-1 116 6 0 1
-2 120 146 195 122 278 272 233 140 268 257
-1 749 6 0 1
-1 117 6 0 1
-2 146 120 195 145 278 233 272 154 235 236
-1 750 6 0 1
-1 118 6 0 1
-2 39 146 120 122 158 278 133 142 268 140
-1 751 6 0 1
-1 119 6 0 1
-2 146 39 120 145 158 133 278 154 159 235
-1 752 6 0 1
-1 120 6 0 1
-2 46 99 170 174 266 213 279 264 214 191
-1 753 6 0 1
-1 121 6 0 1
-2 170 99 46 195 213 266 279 228 226 259
-1 754 6 0 1
-1 122 6 0 1
-2 18 46 170 174 62 279 189 193 264 191
-1 755 6 0 1
-1 123 6 0 1
-2 170 46 18 195 279 62 189 228 259 256
-1 756 6 0 1
-1 124 6 0 1
-2 70 30 170 172 78 187 222 211 186 183
-1 757 6 0 1
-1 125 6 0 1
-2 170 30 70 72 187 78 222 209 75 79
-1 758 6 0 1
-1 126 6 0 1
-2 122 45 146 195 280 271 268 257 237 272
-1 759 6 0 1
-1 127 6 0 1
-2 146 45 122 49 271 280 268 261 61 260
-1 760 6 0 1
-1 128 6 0 1
-2 122 15 45 195 138 67 280 257 253 237
-1 761 6 0 1
-1 129 6 0 1
-2 45 15 122 49 67 138 280 61 69 260
-3
1PSTEP 1 1 1
+147 -147
View File
@@ -280,135 +280,135 @@
279, 2.5, 3.75, 8.75
280, 1.25, 7.5, 3.75
*Element, TYPE=C3D10, ELSET=Eall
633, 95, 98, 47, 196, 103, 197, 198, 200, 199, 201
634, 147, 121, 145, 196, 203, 202, 161, 205, 204, 206
635, 73, 70, 27, 121, 84, 80, 83, 208, 207, 136
636, 72, 170, 30, 171, 209, 187, 75, 210, 181, 194
637, 9, 98, 47, 95, 101, 197, 54, 102, 103, 198
638, 172, 70, 30, 71, 211, 78, 186, 212, 93, 91
639, 170, 99, 36, 174, 213, 119, 184, 191, 214, 190
640, 12, 47, 149, 145, 57, 215, 150, 152, 216, 155
641, 70, 27, 123, 72, 80, 143, 217, 79, 77, 218
642, 39, 147, 121, 145, 160, 203, 132, 159, 161, 202
643, 70, 120, 121, 196, 219, 134, 207, 221, 220, 204
644, 70, 172, 170, 196, 211, 183, 222, 221, 223, 224
645, 95, 99, 170, 195, 104, 213, 225, 227, 226, 228
646, 145, 45, 47, 196, 229, 56, 216, 206, 230, 201
647, 70, 123, 120, 195, 217, 126, 219, 232, 231, 233
648, 47, 45, 95, 196, 56, 234, 198, 201, 230, 200
649, 121, 120, 145, 196, 134, 235, 202, 204, 220, 206
650, 145, 39, 120, 121, 159, 133, 235, 202, 132, 134
651, 70, 120, 27, 121, 219, 137, 80, 207, 134, 136
652, 9, 47, 45, 95, 54, 56, 52, 102, 198, 234
653, 70, 27, 120, 123, 80, 137, 219, 217, 143, 126
654, 45, 47, 12, 145, 56, 57, 58, 229, 216, 152
655, 170, 95, 36, 99, 225, 109, 184, 213, 104, 119
656, 195, 45, 145, 196, 237, 229, 236, 238, 230, 206
657, 95, 45, 195, 196, 234, 237, 227, 200, 230, 238
658, 170, 95, 195, 196, 225, 227, 228, 224, 200, 238
659, 70, 170, 195, 196, 222, 228, 232, 221, 224, 238
660, 195, 120, 70, 196, 233, 219, 232, 238, 220, 221
661, 145, 120, 195, 196, 235, 233, 236, 206, 220, 238
662, 74, 24, 148, 196, 86, 165, 239, 241, 240, 242
663, 21, 74, 97, 196, 88, 243, 114, 244, 241, 245
664, 148, 33, 97, 196, 167, 116, 246, 242, 247, 245
665, 173, 124, 42, 195, 248, 129, 175, 250, 249, 251
666, 48, 15, 124, 195, 64, 144, 252, 254, 253, 249
667, 18, 48, 173, 195, 68, 255, 188, 256, 254, 250
668, 74, 70, 24, 196, 89, 85, 86, 241, 221, 240
669, 170, 18, 173, 195, 189, 188, 177, 228, 256, 250
670, 70, 74, 21, 196, 89, 88, 90, 221, 241, 244
671, 120, 123, 42, 195, 126, 125, 127, 233, 231, 251
672, 170, 173, 42, 195, 177, 175, 178, 228, 250, 251
673, 42, 124, 120, 195, 129, 130, 127, 251, 249, 233
674, 15, 122, 120, 195, 138, 140, 139, 253, 257, 233
675, 124, 15, 120, 195, 144, 139, 130, 249, 253, 233
676, 15, 48, 45, 195, 64, 66, 67, 253, 254, 237
677, 24, 147, 145, 196, 163, 161, 164, 240, 205, 206
678, 95, 97, 33, 196, 113, 116, 115, 200, 245, 247
679, 33, 98, 95, 196, 118, 103, 115, 247, 199, 200
680, 95, 96, 21, 196, 107, 111, 110, 200, 258, 244
681, 97, 95, 21, 196, 113, 110, 114, 245, 200, 244
682, 145, 33, 148, 196, 168, 167, 166, 206, 247, 242
683, 24, 145, 148, 196, 164, 166, 165, 240, 206, 242
684, 18, 45, 48, 195, 63, 66, 68, 256, 237, 254
685, 45, 18, 46, 195, 63, 62, 53, 237, 256, 259
686, 48, 124, 173, 195, 252, 248, 255, 254, 249, 250
687, 148, 97, 74, 196, 246, 243, 239, 242, 245, 241
688, 74, 24, 5, 148, 86, 25, 87, 239, 165, 169
689, 3, 49, 122, 15, 60, 260, 141, 16, 69, 138
690, 146, 12, 49, 3, 153, 59, 261, 156, 14, 60
691, 15, 124, 4, 48, 144, 131, 17, 64, 252, 65
692, 149, 1, 47, 12, 151, 55, 215, 150, 13, 57
693, 147, 7, 73, 24, 162, 82, 262, 163, 26, 81
694, 36, 172, 6, 96, 182, 185, 38, 108, 263, 112
695, 98, 47, 1, 9, 197, 55, 100, 101, 54, 10
696, 2, 174, 46, 18, 192, 264, 50, 19, 193, 62
697, 1, 149, 98, 33, 151, 265, 100, 34, 157, 118
698, 48, 173, 4, 18, 255, 176, 65, 68, 188, 20
699, 30, 72, 171, 8, 75, 210, 194, 32, 76, 180
700, 97, 21, 5, 74, 114, 22, 117, 243, 88, 87
701, 9, 46, 2, 99, 51, 50, 11, 105, 266, 106
702, 8, 123, 171, 42, 128, 267, 180, 44, 125, 179
703, 97, 5, 33, 148, 117, 35, 116, 246, 169, 167
704, 99, 174, 2, 36, 214, 192, 106, 119, 190, 37
705, 173, 124, 4, 42, 248, 131, 176, 175, 129, 43
706, 3, 122, 146, 39, 141, 268, 156, 40, 142, 158
707, 8, 72, 123, 27, 76, 218, 128, 29, 77, 143
708, 71, 172, 6, 30, 212, 185, 92, 91, 186, 31
709, 147, 121, 7, 39, 203, 135, 162, 160, 132, 41
710, 73, 121, 27, 7, 208, 136, 83, 82, 135, 28
711, 71, 6, 96, 21, 92, 112, 269, 94, 23, 111
712, 146, 49, 122, 3, 261, 260, 268, 156, 60, 141
713, 2, 46, 174, 99, 50, 264, 192, 106, 266, 214
714, 123, 171, 72, 8, 267, 210, 218, 128, 180, 76
715, 7, 73, 121, 147, 82, 208, 135, 162, 262, 203
716, 173, 4, 124, 48, 176, 131, 248, 255, 65, 252
717, 96, 172, 6, 71, 263, 185, 112, 269, 212, 92
718, 74, 5, 97, 148, 87, 117, 243, 239, 169, 246
719, 1, 98, 149, 47, 100, 265, 151, 55, 197, 215
720, 147, 121, 70, 73, 203, 207, 270, 262, 208, 84
721, 121, 147, 70, 196, 203, 270, 207, 204, 205, 221
722, 147, 70, 24, 73, 270, 85, 163, 262, 84, 81
723, 70, 147, 24, 196, 270, 163, 85, 221, 205, 240
724, 146, 195, 45, 145, 272, 237, 271, 154, 236, 229
725, 12, 45, 146, 49, 58, 271, 153, 59, 61, 261
726, 146, 45, 12, 145, 271, 58, 153, 154, 229, 152
727, 98, 47, 145, 149, 197, 216, 273, 265, 215, 155
728, 145, 47, 98, 196, 216, 197, 273, 206, 201, 199
729, 33, 98, 145, 149, 118, 273, 168, 157, 265, 155
730, 145, 98, 33, 196, 273, 118, 168, 206, 199, 247
731, 95, 196, 172, 96, 200, 223, 274, 107, 258, 263
732, 172, 196, 95, 170, 223, 200, 274, 183, 224, 225
733, 36, 95, 172, 96, 109, 274, 182, 108, 107, 263
734, 172, 95, 36, 170, 274, 109, 182, 183, 225, 184
735, 96, 70, 172, 71, 275, 211, 263, 269, 93, 212
736, 172, 70, 96, 196, 211, 275, 263, 223, 221, 258
737, 96, 21, 70, 71, 111, 90, 275, 269, 94, 93
738, 70, 21, 96, 196, 90, 111, 275, 221, 244, 258
739, 45, 195, 99, 95, 237, 226, 276, 234, 227, 104
740, 99, 195, 45, 46, 226, 237, 276, 266, 259, 53
741, 9, 45, 99, 95, 52, 276, 105, 102, 234, 104
742, 99, 45, 9, 46, 276, 52, 105, 266, 53, 51
743, 123, 170, 72, 171, 277, 209, 218, 267, 181, 210
744, 42, 170, 123, 171, 178, 277, 125, 179, 181, 267
745, 170, 42, 123, 195, 178, 125, 277, 228, 251, 231
746, 170, 70, 123, 72, 222, 217, 277, 209, 79, 218
747, 123, 70, 170, 195, 217, 222, 277, 231, 232, 228
748, 120, 146, 195, 122, 278, 272, 233, 140, 268, 257
749, 146, 120, 195, 145, 278, 233, 272, 154, 235, 236
750, 39, 146, 120, 122, 158, 278, 133, 142, 268, 140
751, 146, 39, 120, 145, 158, 133, 278, 154, 159, 235
752, 46, 99, 170, 174, 266, 213, 279, 264, 214, 191
753, 170, 99, 46, 195, 213, 266, 279, 228, 226, 259
754, 18, 46, 170, 174, 62, 279, 189, 193, 264, 191
755, 170, 46, 18, 195, 279, 62, 189, 228, 259, 256
756, 70, 30, 170, 172, 78, 187, 222, 211, 186, 183
757, 170, 30, 70, 72, 187, 78, 222, 209, 75, 79
758, 122, 45, 146, 195, 280, 271, 268, 257, 237, 272
759, 146, 45, 122, 49, 271, 280, 268, 261, 61, 260
760, 122, 15, 45, 195, 138, 67, 280, 257, 253, 237
761, 45, 15, 122, 49, 67, 138, 280, 61, 69, 260
1, 95, 98, 47, 196, 103, 197, 198, 200, 199, 201
2, 147, 121, 145, 196, 203, 202, 161, 205, 204, 206
3, 73, 70, 27, 121, 84, 80, 83, 208, 207, 136
4, 72, 170, 30, 171, 209, 187, 75, 210, 181, 194
5, 9, 98, 47, 95, 101, 197, 54, 102, 103, 198
6, 172, 70, 30, 71, 211, 78, 186, 212, 93, 91
7, 170, 99, 36, 174, 213, 119, 184, 191, 214, 190
8, 12, 47, 149, 145, 57, 215, 150, 152, 216, 155
9, 70, 27, 123, 72, 80, 143, 217, 79, 77, 218
10, 39, 147, 121, 145, 160, 203, 132, 159, 161, 202
11, 70, 120, 121, 196, 219, 134, 207, 221, 220, 204
12, 70, 172, 170, 196, 211, 183, 222, 221, 223, 224
13, 95, 99, 170, 195, 104, 213, 225, 227, 226, 228
14, 145, 45, 47, 196, 229, 56, 216, 206, 230, 201
15, 70, 123, 120, 195, 217, 126, 219, 232, 231, 233
16, 47, 45, 95, 196, 56, 234, 198, 201, 230, 200
17, 121, 120, 145, 196, 134, 235, 202, 204, 220, 206
18, 145, 39, 120, 121, 159, 133, 235, 202, 132, 134
19, 70, 120, 27, 121, 219, 137, 80, 207, 134, 136
20, 9, 47, 45, 95, 54, 56, 52, 102, 198, 234
21, 70, 27, 120, 123, 80, 137, 219, 217, 143, 126
22, 45, 47, 12, 145, 56, 57, 58, 229, 216, 152
23, 170, 95, 36, 99, 225, 109, 184, 213, 104, 119
24, 195, 45, 145, 196, 237, 229, 236, 238, 230, 206
25, 95, 45, 195, 196, 234, 237, 227, 200, 230, 238
26, 170, 95, 195, 196, 225, 227, 228, 224, 200, 238
27, 70, 170, 195, 196, 222, 228, 232, 221, 224, 238
28, 195, 120, 70, 196, 233, 219, 232, 238, 220, 221
29, 145, 120, 195, 196, 235, 233, 236, 206, 220, 238
30, 74, 24, 148, 196, 86, 165, 239, 241, 240, 242
31, 21, 74, 97, 196, 88, 243, 114, 244, 241, 245
32, 148, 33, 97, 196, 167, 116, 246, 242, 247, 245
33, 173, 124, 42, 195, 248, 129, 175, 250, 249, 251
34, 48, 15, 124, 195, 64, 144, 252, 254, 253, 249
35, 18, 48, 173, 195, 68, 255, 188, 256, 254, 250
36, 74, 70, 24, 196, 89, 85, 86, 241, 221, 240
37, 170, 18, 173, 195, 189, 188, 177, 228, 256, 250
38, 70, 74, 21, 196, 89, 88, 90, 221, 241, 244
39, 120, 123, 42, 195, 126, 125, 127, 233, 231, 251
40, 170, 173, 42, 195, 177, 175, 178, 228, 250, 251
41, 42, 124, 120, 195, 129, 130, 127, 251, 249, 233
42, 15, 122, 120, 195, 138, 140, 139, 253, 257, 233
43, 124, 15, 120, 195, 144, 139, 130, 249, 253, 233
44, 15, 48, 45, 195, 64, 66, 67, 253, 254, 237
45, 24, 147, 145, 196, 163, 161, 164, 240, 205, 206
46, 95, 97, 33, 196, 113, 116, 115, 200, 245, 247
47, 33, 98, 95, 196, 118, 103, 115, 247, 199, 200
48, 95, 96, 21, 196, 107, 111, 110, 200, 258, 244
49, 97, 95, 21, 196, 113, 110, 114, 245, 200, 244
50, 145, 33, 148, 196, 168, 167, 166, 206, 247, 242
51, 24, 145, 148, 196, 164, 166, 165, 240, 206, 242
52, 18, 45, 48, 195, 63, 66, 68, 256, 237, 254
53, 45, 18, 46, 195, 63, 62, 53, 237, 256, 259
54, 48, 124, 173, 195, 252, 248, 255, 254, 249, 250
55, 148, 97, 74, 196, 246, 243, 239, 242, 245, 241
56, 74, 24, 5, 148, 86, 25, 87, 239, 165, 169
57, 3, 49, 122, 15, 60, 260, 141, 16, 69, 138
58, 146, 12, 49, 3, 153, 59, 261, 156, 14, 60
59, 15, 124, 4, 48, 144, 131, 17, 64, 252, 65
60, 149, 1, 47, 12, 151, 55, 215, 150, 13, 57
61, 147, 7, 73, 24, 162, 82, 262, 163, 26, 81
62, 36, 172, 6, 96, 182, 185, 38, 108, 263, 112
63, 98, 47, 1, 9, 197, 55, 100, 101, 54, 10
64, 2, 174, 46, 18, 192, 264, 50, 19, 193, 62
65, 1, 149, 98, 33, 151, 265, 100, 34, 157, 118
66, 48, 173, 4, 18, 255, 176, 65, 68, 188, 20
67, 30, 72, 171, 8, 75, 210, 194, 32, 76, 180
68, 97, 21, 5, 74, 114, 22, 117, 243, 88, 87
69, 9, 46, 2, 99, 51, 50, 11, 105, 266, 106
70, 8, 123, 171, 42, 128, 267, 180, 44, 125, 179
71, 97, 5, 33, 148, 117, 35, 116, 246, 169, 167
72, 99, 174, 2, 36, 214, 192, 106, 119, 190, 37
73, 173, 124, 4, 42, 248, 131, 176, 175, 129, 43
74, 3, 122, 146, 39, 141, 268, 156, 40, 142, 158
75, 8, 72, 123, 27, 76, 218, 128, 29, 77, 143
76, 71, 172, 6, 30, 212, 185, 92, 91, 186, 31
77, 147, 121, 7, 39, 203, 135, 162, 160, 132, 41
78, 73, 121, 27, 7, 208, 136, 83, 82, 135, 28
79, 71, 6, 96, 21, 92, 112, 269, 94, 23, 111
80, 146, 49, 122, 3, 261, 260, 268, 156, 60, 141
81, 2, 46, 174, 99, 50, 264, 192, 106, 266, 214
82, 123, 171, 72, 8, 267, 210, 218, 128, 180, 76
83, 7, 73, 121, 147, 82, 208, 135, 162, 262, 203
84, 173, 4, 124, 48, 176, 131, 248, 255, 65, 252
85, 96, 172, 6, 71, 263, 185, 112, 269, 212, 92
86, 74, 5, 97, 148, 87, 117, 243, 239, 169, 246
87, 1, 98, 149, 47, 100, 265, 151, 55, 197, 215
88, 147, 121, 70, 73, 203, 207, 270, 262, 208, 84
89, 121, 147, 70, 196, 203, 270, 207, 204, 205, 221
90, 147, 70, 24, 73, 270, 85, 163, 262, 84, 81
91, 70, 147, 24, 196, 270, 163, 85, 221, 205, 240
92, 146, 195, 45, 145, 272, 237, 271, 154, 236, 229
93, 12, 45, 146, 49, 58, 271, 153, 59, 61, 261
94, 146, 45, 12, 145, 271, 58, 153, 154, 229, 152
95, 98, 47, 145, 149, 197, 216, 273, 265, 215, 155
96, 145, 47, 98, 196, 216, 197, 273, 206, 201, 199
97, 33, 98, 145, 149, 118, 273, 168, 157, 265, 155
98, 145, 98, 33, 196, 273, 118, 168, 206, 199, 247
99, 95, 196, 172, 96, 200, 223, 274, 107, 258, 263
100, 172, 196, 95, 170, 223, 200, 274, 183, 224, 225
101, 36, 95, 172, 96, 109, 274, 182, 108, 107, 263
102, 172, 95, 36, 170, 274, 109, 182, 183, 225, 184
103, 96, 70, 172, 71, 275, 211, 263, 269, 93, 212
104, 172, 70, 96, 196, 211, 275, 263, 223, 221, 258
105, 96, 21, 70, 71, 111, 90, 275, 269, 94, 93
106, 70, 21, 96, 196, 90, 111, 275, 221, 244, 258
107, 45, 195, 99, 95, 237, 226, 276, 234, 227, 104
108, 99, 195, 45, 46, 226, 237, 276, 266, 259, 53
109, 9, 45, 99, 95, 52, 276, 105, 102, 234, 104
110, 99, 45, 9, 46, 276, 52, 105, 266, 53, 51
111, 123, 170, 72, 171, 277, 209, 218, 267, 181, 210
112, 42, 170, 123, 171, 178, 277, 125, 179, 181, 267
113, 170, 42, 123, 195, 178, 125, 277, 228, 251, 231
114, 170, 70, 123, 72, 222, 217, 277, 209, 79, 218
115, 123, 70, 170, 195, 217, 222, 277, 231, 232, 228
116, 120, 146, 195, 122, 278, 272, 233, 140, 268, 257
117, 146, 120, 195, 145, 278, 233, 272, 154, 235, 236
118, 39, 146, 120, 122, 158, 278, 133, 142, 268, 140
119, 146, 39, 120, 145, 158, 133, 278, 154, 159, 235
120, 46, 99, 170, 174, 266, 213, 279, 264, 214, 191
121, 170, 99, 46, 195, 213, 266, 279, 228, 226, 259
122, 18, 46, 170, 174, 62, 279, 189, 193, 264, 191
123, 170, 46, 18, 195, 279, 62, 189, 228, 259, 256
124, 70, 30, 170, 172, 78, 187, 222, 211, 186, 183
125, 170, 30, 70, 72, 187, 78, 222, 209, 75, 79
126, 122, 45, 146, 195, 280, 271, 268, 257, 237, 272
127, 146, 45, 122, 49, 271, 280, 268, 261, 61, 260
128, 122, 15, 45, 195, 138, 67, 280, 257, 253, 237
129, 45, 15, 122, 49, 67, 138, 280, 61, 69, 260
@@ -548,22 +548,22 @@ FemConstraintFixed,3
** written by write_constraints_pressure function
*DLOAD
** FemConstraintPressure: face load
635,P1,1000.0
638,P3,1000.0
641,P2,1000.0
668,P1,1000.0
670,P1,1000.0
688,P1,1000.0
693,P3,1000.0
699,P2,1000.0
700,P3,1000.0
707,P2,1000.0
708,P4,1000.0
710,P4,1000.0
711,P2,1000.0
722,P3,1000.0
737,P3,1000.0
757,P3,1000.0
3,P1,1000.0
6,P3,1000.0
9,P2,1000.0
36,P1,1000.0
38,P1,1000.0
56,P1,1000.0
61,P3,1000.0
67,P2,1000.0
68,P3,1000.0
75,P2,1000.0
76,P4,1000.0
78,P4,1000.0
79,P2,1000.0
90,P3,1000.0
105,P3,1000.0
125,P3,1000.0
***********************************************************
** Outputs --> frd file
@@ -585,8 +585,8 @@ S
***********************************************************
** CalculiX Input file
** written by write_footer function
** written by --> FreeCAD 0.16.5838 +1 (Git)
** written on --> Mon Oct 26 18:28:42 2015
** written by --> FreeCAD 0.17.9749 (Git)
** written on --> Sun Jan 22 14:28:56 2017
** file name -->
** analysis name --> Analysis
**
+129 -129
View File
@@ -1,129 +1,129 @@
633, 95, 98, 47, 196, 103, 197, 198, 200, 199, 201,
634, 147, 121, 145, 196, 203, 202, 161, 205, 204, 206,
635, 73, 70, 27, 121, 84, 80, 83, 208, 207, 136,
636, 72, 170, 30, 171, 209, 187, 75, 210, 181, 194,
637, 9, 98, 47, 95, 101, 197, 54, 102, 103, 198,
638, 172, 70, 30, 71, 211, 78, 186, 212, 93, 91,
639, 170, 99, 36, 174, 213, 119, 184, 191, 214, 190,
640, 12, 47, 149, 145, 57, 215, 150, 152, 216, 155,
641, 70, 27, 123, 72, 80, 143, 217, 79, 77, 218,
642, 39, 147, 121, 145, 160, 203, 132, 159, 161, 202,
643, 70, 120, 121, 196, 219, 134, 207, 221, 220, 204,
644, 70, 172, 170, 196, 211, 183, 222, 221, 223, 224,
645, 95, 99, 170, 195, 104, 213, 225, 227, 226, 228,
646, 145, 45, 47, 196, 229, 56, 216, 206, 230, 201,
647, 70, 123, 120, 195, 217, 126, 219, 232, 231, 233,
648, 47, 45, 95, 196, 56, 234, 198, 201, 230, 200,
649, 121, 120, 145, 196, 134, 235, 202, 204, 220, 206,
650, 145, 39, 120, 121, 159, 133, 235, 202, 132, 134,
651, 70, 120, 27, 121, 219, 137, 80, 207, 134, 136,
652, 9, 47, 45, 95, 54, 56, 52, 102, 198, 234,
653, 70, 27, 120, 123, 80, 137, 219, 217, 143, 126,
654, 45, 47, 12, 145, 56, 57, 58, 229, 216, 152,
655, 170, 95, 36, 99, 225, 109, 184, 213, 104, 119,
656, 195, 45, 145, 196, 237, 229, 236, 238, 230, 206,
657, 95, 45, 195, 196, 234, 237, 227, 200, 230, 238,
658, 170, 95, 195, 196, 225, 227, 228, 224, 200, 238,
659, 70, 170, 195, 196, 222, 228, 232, 221, 224, 238,
660, 195, 120, 70, 196, 233, 219, 232, 238, 220, 221,
661, 145, 120, 195, 196, 235, 233, 236, 206, 220, 238,
662, 74, 24, 148, 196, 86, 165, 239, 241, 240, 242,
663, 21, 74, 97, 196, 88, 243, 114, 244, 241, 245,
664, 148, 33, 97, 196, 167, 116, 246, 242, 247, 245,
665, 173, 124, 42, 195, 248, 129, 175, 250, 249, 251,
666, 48, 15, 124, 195, 64, 144, 252, 254, 253, 249,
667, 18, 48, 173, 195, 68, 255, 188, 256, 254, 250,
668, 74, 70, 24, 196, 89, 85, 86, 241, 221, 240,
669, 170, 18, 173, 195, 189, 188, 177, 228, 256, 250,
670, 70, 74, 21, 196, 89, 88, 90, 221, 241, 244,
671, 120, 123, 42, 195, 126, 125, 127, 233, 231, 251,
672, 170, 173, 42, 195, 177, 175, 178, 228, 250, 251,
673, 42, 124, 120, 195, 129, 130, 127, 251, 249, 233,
674, 15, 122, 120, 195, 138, 140, 139, 253, 257, 233,
675, 124, 15, 120, 195, 144, 139, 130, 249, 253, 233,
676, 15, 48, 45, 195, 64, 66, 67, 253, 254, 237,
677, 24, 147, 145, 196, 163, 161, 164, 240, 205, 206,
678, 95, 97, 33, 196, 113, 116, 115, 200, 245, 247,
679, 33, 98, 95, 196, 118, 103, 115, 247, 199, 200,
680, 95, 96, 21, 196, 107, 111, 110, 200, 258, 244,
681, 97, 95, 21, 196, 113, 110, 114, 245, 200, 244,
682, 145, 33, 148, 196, 168, 167, 166, 206, 247, 242,
683, 24, 145, 148, 196, 164, 166, 165, 240, 206, 242,
684, 18, 45, 48, 195, 63, 66, 68, 256, 237, 254,
685, 45, 18, 46, 195, 63, 62, 53, 237, 256, 259,
686, 48, 124, 173, 195, 252, 248, 255, 254, 249, 250,
687, 148, 97, 74, 196, 246, 243, 239, 242, 245, 241,
688, 74, 24, 5, 148, 86, 25, 87, 239, 165, 169,
689, 3, 49, 122, 15, 60, 260, 141, 16, 69, 138,
690, 146, 12, 49, 3, 153, 59, 261, 156, 14, 60,
691, 15, 124, 4, 48, 144, 131, 17, 64, 252, 65,
692, 149, 1, 47, 12, 151, 55, 215, 150, 13, 57,
693, 147, 7, 73, 24, 162, 82, 262, 163, 26, 81,
694, 36, 172, 6, 96, 182, 185, 38, 108, 263, 112,
695, 98, 47, 1, 9, 197, 55, 100, 101, 54, 10,
696, 2, 174, 46, 18, 192, 264, 50, 19, 193, 62,
697, 1, 149, 98, 33, 151, 265, 100, 34, 157, 118,
698, 48, 173, 4, 18, 255, 176, 65, 68, 188, 20,
699, 30, 72, 171, 8, 75, 210, 194, 32, 76, 180,
700, 97, 21, 5, 74, 114, 22, 117, 243, 88, 87,
701, 9, 46, 2, 99, 51, 50, 11, 105, 266, 106,
702, 8, 123, 171, 42, 128, 267, 180, 44, 125, 179,
703, 97, 5, 33, 148, 117, 35, 116, 246, 169, 167,
704, 99, 174, 2, 36, 214, 192, 106, 119, 190, 37,
705, 173, 124, 4, 42, 248, 131, 176, 175, 129, 43,
706, 3, 122, 146, 39, 141, 268, 156, 40, 142, 158,
707, 8, 72, 123, 27, 76, 218, 128, 29, 77, 143,
708, 71, 172, 6, 30, 212, 185, 92, 91, 186, 31,
709, 147, 121, 7, 39, 203, 135, 162, 160, 132, 41,
710, 73, 121, 27, 7, 208, 136, 83, 82, 135, 28,
711, 71, 6, 96, 21, 92, 112, 269, 94, 23, 111,
712, 146, 49, 122, 3, 261, 260, 268, 156, 60, 141,
713, 2, 46, 174, 99, 50, 264, 192, 106, 266, 214,
714, 123, 171, 72, 8, 267, 210, 218, 128, 180, 76,
715, 7, 73, 121, 147, 82, 208, 135, 162, 262, 203,
716, 173, 4, 124, 48, 176, 131, 248, 255, 65, 252,
717, 96, 172, 6, 71, 263, 185, 112, 269, 212, 92,
718, 74, 5, 97, 148, 87, 117, 243, 239, 169, 246,
719, 1, 98, 149, 47, 100, 265, 151, 55, 197, 215,
720, 147, 121, 70, 73, 203, 207, 270, 262, 208, 84,
721, 121, 147, 70, 196, 203, 270, 207, 204, 205, 221,
722, 147, 70, 24, 73, 270, 85, 163, 262, 84, 81,
723, 70, 147, 24, 196, 270, 163, 85, 221, 205, 240,
724, 146, 195, 45, 145, 272, 237, 271, 154, 236, 229,
725, 12, 45, 146, 49, 58, 271, 153, 59, 61, 261,
726, 146, 45, 12, 145, 271, 58, 153, 154, 229, 152,
727, 98, 47, 145, 149, 197, 216, 273, 265, 215, 155,
728, 145, 47, 98, 196, 216, 197, 273, 206, 201, 199,
729, 33, 98, 145, 149, 118, 273, 168, 157, 265, 155,
730, 145, 98, 33, 196, 273, 118, 168, 206, 199, 247,
731, 95, 196, 172, 96, 200, 223, 274, 107, 258, 263,
732, 172, 196, 95, 170, 223, 200, 274, 183, 224, 225,
733, 36, 95, 172, 96, 109, 274, 182, 108, 107, 263,
734, 172, 95, 36, 170, 274, 109, 182, 183, 225, 184,
735, 96, 70, 172, 71, 275, 211, 263, 269, 93, 212,
736, 172, 70, 96, 196, 211, 275, 263, 223, 221, 258,
737, 96, 21, 70, 71, 111, 90, 275, 269, 94, 93,
738, 70, 21, 96, 196, 90, 111, 275, 221, 244, 258,
739, 45, 195, 99, 95, 237, 226, 276, 234, 227, 104,
740, 99, 195, 45, 46, 226, 237, 276, 266, 259, 53,
741, 9, 45, 99, 95, 52, 276, 105, 102, 234, 104,
742, 99, 45, 9, 46, 276, 52, 105, 266, 53, 51,
743, 123, 170, 72, 171, 277, 209, 218, 267, 181, 210,
744, 42, 170, 123, 171, 178, 277, 125, 179, 181, 267,
745, 170, 42, 123, 195, 178, 125, 277, 228, 251, 231,
746, 170, 70, 123, 72, 222, 217, 277, 209, 79, 218,
747, 123, 70, 170, 195, 217, 222, 277, 231, 232, 228,
748, 120, 146, 195, 122, 278, 272, 233, 140, 268, 257,
749, 146, 120, 195, 145, 278, 233, 272, 154, 235, 236,
750, 39, 146, 120, 122, 158, 278, 133, 142, 268, 140,
751, 146, 39, 120, 145, 158, 133, 278, 154, 159, 235,
752, 46, 99, 170, 174, 266, 213, 279, 264, 214, 191,
753, 170, 99, 46, 195, 213, 266, 279, 228, 226, 259,
754, 18, 46, 170, 174, 62, 279, 189, 193, 264, 191,
755, 170, 46, 18, 195, 279, 62, 189, 228, 259, 256,
756, 70, 30, 170, 172, 78, 187, 222, 211, 186, 183,
757, 170, 30, 70, 72, 187, 78, 222, 209, 75, 79,
758, 122, 45, 146, 195, 280, 271, 268, 257, 237, 272,
759, 146, 45, 122, 49, 271, 280, 268, 261, 61, 260,
760, 122, 15, 45, 195, 138, 67, 280, 257, 253, 237,
761, 45, 15, 122, 49, 67, 138, 280, 61, 69, 260,
1, 95, 98, 47, 196, 103, 197, 198, 200, 199, 201,
2, 147, 121, 145, 196, 203, 202, 161, 205, 204, 206,
3, 73, 70, 27, 121, 84, 80, 83, 208, 207, 136,
4, 72, 170, 30, 171, 209, 187, 75, 210, 181, 194,
5, 9, 98, 47, 95, 101, 197, 54, 102, 103, 198,
6, 172, 70, 30, 71, 211, 78, 186, 212, 93, 91,
7, 170, 99, 36, 174, 213, 119, 184, 191, 214, 190,
8, 12, 47, 149, 145, 57, 215, 150, 152, 216, 155,
9, 70, 27, 123, 72, 80, 143, 217, 79, 77, 218,
10, 39, 147, 121, 145, 160, 203, 132, 159, 161, 202,
11, 70, 120, 121, 196, 219, 134, 207, 221, 220, 204,
12, 70, 172, 170, 196, 211, 183, 222, 221, 223, 224,
13, 95, 99, 170, 195, 104, 213, 225, 227, 226, 228,
14, 145, 45, 47, 196, 229, 56, 216, 206, 230, 201,
15, 70, 123, 120, 195, 217, 126, 219, 232, 231, 233,
16, 47, 45, 95, 196, 56, 234, 198, 201, 230, 200,
17, 121, 120, 145, 196, 134, 235, 202, 204, 220, 206,
18, 145, 39, 120, 121, 159, 133, 235, 202, 132, 134,
19, 70, 120, 27, 121, 219, 137, 80, 207, 134, 136,
20, 9, 47, 45, 95, 54, 56, 52, 102, 198, 234,
21, 70, 27, 120, 123, 80, 137, 219, 217, 143, 126,
22, 45, 47, 12, 145, 56, 57, 58, 229, 216, 152,
23, 170, 95, 36, 99, 225, 109, 184, 213, 104, 119,
24, 195, 45, 145, 196, 237, 229, 236, 238, 230, 206,
25, 95, 45, 195, 196, 234, 237, 227, 200, 230, 238,
26, 170, 95, 195, 196, 225, 227, 228, 224, 200, 238,
27, 70, 170, 195, 196, 222, 228, 232, 221, 224, 238,
28, 195, 120, 70, 196, 233, 219, 232, 238, 220, 221,
29, 145, 120, 195, 196, 235, 233, 236, 206, 220, 238,
30, 74, 24, 148, 196, 86, 165, 239, 241, 240, 242,
31, 21, 74, 97, 196, 88, 243, 114, 244, 241, 245,
32, 148, 33, 97, 196, 167, 116, 246, 242, 247, 245,
33, 173, 124, 42, 195, 248, 129, 175, 250, 249, 251,
34, 48, 15, 124, 195, 64, 144, 252, 254, 253, 249,
35, 18, 48, 173, 195, 68, 255, 188, 256, 254, 250,
36, 74, 70, 24, 196, 89, 85, 86, 241, 221, 240,
37, 170, 18, 173, 195, 189, 188, 177, 228, 256, 250,
38, 70, 74, 21, 196, 89, 88, 90, 221, 241, 244,
39, 120, 123, 42, 195, 126, 125, 127, 233, 231, 251,
40, 170, 173, 42, 195, 177, 175, 178, 228, 250, 251,
41, 42, 124, 120, 195, 129, 130, 127, 251, 249, 233,
42, 15, 122, 120, 195, 138, 140, 139, 253, 257, 233,
43, 124, 15, 120, 195, 144, 139, 130, 249, 253, 233,
44, 15, 48, 45, 195, 64, 66, 67, 253, 254, 237,
45, 24, 147, 145, 196, 163, 161, 164, 240, 205, 206,
46, 95, 97, 33, 196, 113, 116, 115, 200, 245, 247,
47, 33, 98, 95, 196, 118, 103, 115, 247, 199, 200,
48, 95, 96, 21, 196, 107, 111, 110, 200, 258, 244,
49, 97, 95, 21, 196, 113, 110, 114, 245, 200, 244,
50, 145, 33, 148, 196, 168, 167, 166, 206, 247, 242,
51, 24, 145, 148, 196, 164, 166, 165, 240, 206, 242,
52, 18, 45, 48, 195, 63, 66, 68, 256, 237, 254,
53, 45, 18, 46, 195, 63, 62, 53, 237, 256, 259,
54, 48, 124, 173, 195, 252, 248, 255, 254, 249, 250,
55, 148, 97, 74, 196, 246, 243, 239, 242, 245, 241,
56, 74, 24, 5, 148, 86, 25, 87, 239, 165, 169,
57, 3, 49, 122, 15, 60, 260, 141, 16, 69, 138,
58, 146, 12, 49, 3, 153, 59, 261, 156, 14, 60,
59, 15, 124, 4, 48, 144, 131, 17, 64, 252, 65,
60, 149, 1, 47, 12, 151, 55, 215, 150, 13, 57,
61, 147, 7, 73, 24, 162, 82, 262, 163, 26, 81,
62, 36, 172, 6, 96, 182, 185, 38, 108, 263, 112,
63, 98, 47, 1, 9, 197, 55, 100, 101, 54, 10,
64, 2, 174, 46, 18, 192, 264, 50, 19, 193, 62,
65, 1, 149, 98, 33, 151, 265, 100, 34, 157, 118,
66, 48, 173, 4, 18, 255, 176, 65, 68, 188, 20,
67, 30, 72, 171, 8, 75, 210, 194, 32, 76, 180,
68, 97, 21, 5, 74, 114, 22, 117, 243, 88, 87,
69, 9, 46, 2, 99, 51, 50, 11, 105, 266, 106,
70, 8, 123, 171, 42, 128, 267, 180, 44, 125, 179,
71, 97, 5, 33, 148, 117, 35, 116, 246, 169, 167,
72, 99, 174, 2, 36, 214, 192, 106, 119, 190, 37,
73, 173, 124, 4, 42, 248, 131, 176, 175, 129, 43,
74, 3, 122, 146, 39, 141, 268, 156, 40, 142, 158,
75, 8, 72, 123, 27, 76, 218, 128, 29, 77, 143,
76, 71, 172, 6, 30, 212, 185, 92, 91, 186, 31,
77, 147, 121, 7, 39, 203, 135, 162, 160, 132, 41,
78, 73, 121, 27, 7, 208, 136, 83, 82, 135, 28,
79, 71, 6, 96, 21, 92, 112, 269, 94, 23, 111,
80, 146, 49, 122, 3, 261, 260, 268, 156, 60, 141,
81, 2, 46, 174, 99, 50, 264, 192, 106, 266, 214,
82, 123, 171, 72, 8, 267, 210, 218, 128, 180, 76,
83, 7, 73, 121, 147, 82, 208, 135, 162, 262, 203,
84, 173, 4, 124, 48, 176, 131, 248, 255, 65, 252,
85, 96, 172, 6, 71, 263, 185, 112, 269, 212, 92,
86, 74, 5, 97, 148, 87, 117, 243, 239, 169, 246,
87, 1, 98, 149, 47, 100, 265, 151, 55, 197, 215,
88, 147, 121, 70, 73, 203, 207, 270, 262, 208, 84,
89, 121, 147, 70, 196, 203, 270, 207, 204, 205, 221,
90, 147, 70, 24, 73, 270, 85, 163, 262, 84, 81,
91, 70, 147, 24, 196, 270, 163, 85, 221, 205, 240,
92, 146, 195, 45, 145, 272, 237, 271, 154, 236, 229,
93, 12, 45, 146, 49, 58, 271, 153, 59, 61, 261,
94, 146, 45, 12, 145, 271, 58, 153, 154, 229, 152,
95, 98, 47, 145, 149, 197, 216, 273, 265, 215, 155,
96, 145, 47, 98, 196, 216, 197, 273, 206, 201, 199,
97, 33, 98, 145, 149, 118, 273, 168, 157, 265, 155,
98, 145, 98, 33, 196, 273, 118, 168, 206, 199, 247,
99, 95, 196, 172, 96, 200, 223, 274, 107, 258, 263,
100, 172, 196, 95, 170, 223, 200, 274, 183, 224, 225,
101, 36, 95, 172, 96, 109, 274, 182, 108, 107, 263,
102, 172, 95, 36, 170, 274, 109, 182, 183, 225, 184,
103, 96, 70, 172, 71, 275, 211, 263, 269, 93, 212,
104, 172, 70, 96, 196, 211, 275, 263, 223, 221, 258,
105, 96, 21, 70, 71, 111, 90, 275, 269, 94, 93,
106, 70, 21, 96, 196, 90, 111, 275, 221, 244, 258,
107, 45, 195, 99, 95, 237, 226, 276, 234, 227, 104,
108, 99, 195, 45, 46, 226, 237, 276, 266, 259, 53,
109, 9, 45, 99, 95, 52, 276, 105, 102, 234, 104,
110, 99, 45, 9, 46, 276, 52, 105, 266, 53, 51,
111, 123, 170, 72, 171, 277, 209, 218, 267, 181, 210,
112, 42, 170, 123, 171, 178, 277, 125, 179, 181, 267,
113, 170, 42, 123, 195, 178, 125, 277, 228, 251, 231,
114, 170, 70, 123, 72, 222, 217, 277, 209, 79, 218,
115, 123, 70, 170, 195, 217, 222, 277, 231, 232, 228,
116, 120, 146, 195, 122, 278, 272, 233, 140, 268, 257,
117, 146, 120, 195, 145, 278, 233, 272, 154, 235, 236,
118, 39, 146, 120, 122, 158, 278, 133, 142, 268, 140,
119, 146, 39, 120, 145, 158, 133, 278, 154, 159, 235,
120, 46, 99, 170, 174, 266, 213, 279, 264, 214, 191,
121, 170, 99, 46, 195, 213, 266, 279, 228, 226, 259,
122, 18, 46, 170, 174, 62, 279, 189, 193, 264, 191,
123, 170, 46, 18, 195, 279, 62, 189, 228, 259, 256,
124, 70, 30, 170, 172, 78, 187, 222, 211, 186, 183,
125, 170, 30, 70, 72, 187, 78, 222, 209, 75, 79,
126, 122, 45, 146, 195, 280, 271, 268, 257, 237, 272,
127, 146, 45, 122, 49, 271, 280, 268, 261, 61, 260,
128, 122, 15, 45, 195, 138, 67, 280, 257, 253, 237,
129, 45, 15, 122, 49, 67, 138, 280, 61, 69, 260,
1 633 1 95 98 47 196 103 197 198 200 199 201
2 634 2 147 121 145 196 203 202 161 205 204 206
3 635 3 73 70 27 121 84 80 83 208 207 136
4 636 4 72 170 30 171 209 187 75 210 181 194
5 637 5 9 98 47 95 101 197 54 102 103 198
6 638 6 172 70 30 71 211 78 186 212 93 91
7 639 7 170 99 36 174 213 119 184 191 214 190
8 640 8 12 47 149 145 57 215 150 152 216 155
9 641 9 70 27 123 72 80 143 217 79 77 218
10 642 10 39 147 121 145 160 203 132 159 161 202
11 643 11 70 120 121 196 219 134 207 221 220 204
12 644 12 70 172 170 196 211 183 222 221 223 224
13 645 13 95 99 170 195 104 213 225 227 226 228
14 646 14 145 45 47 196 229 56 216 206 230 201
15 647 15 70 123 120 195 217 126 219 232 231 233
16 648 16 47 45 95 196 56 234 198 201 230 200
17 649 17 121 120 145 196 134 235 202 204 220 206
18 650 18 145 39 120 121 159 133 235 202 132 134
19 651 19 70 120 27 121 219 137 80 207 134 136
20 652 20 9 47 45 95 54 56 52 102 198 234
21 653 21 70 27 120 123 80 137 219 217 143 126
22 654 22 45 47 12 145 56 57 58 229 216 152
23 655 23 170 95 36 99 225 109 184 213 104 119
24 656 24 195 45 145 196 237 229 236 238 230 206
25 657 25 95 45 195 196 234 237 227 200 230 238
26 658 26 170 95 195 196 225 227 228 224 200 238
27 659 27 70 170 195 196 222 228 232 221 224 238
28 660 28 195 120 70 196 233 219 232 238 220 221
29 661 29 145 120 195 196 235 233 236 206 220 238
30 662 30 74 24 148 196 86 165 239 241 240 242
31 663 31 21 74 97 196 88 243 114 244 241 245
32 664 32 148 33 97 196 167 116 246 242 247 245
33 665 33 173 124 42 195 248 129 175 250 249 251
34 666 34 48 15 124 195 64 144 252 254 253 249
35 667 35 18 48 173 195 68 255 188 256 254 250
36 668 36 74 70 24 196 89 85 86 241 221 240
37 669 37 170 18 173 195 189 188 177 228 256 250
38 670 38 70 74 21 196 89 88 90 221 241 244
39 671 39 120 123 42 195 126 125 127 233 231 251
40 672 40 170 173 42 195 177 175 178 228 250 251
41 673 41 42 124 120 195 129 130 127 251 249 233
42 674 42 15 122 120 195 138 140 139 253 257 233
43 675 43 124 15 120 195 144 139 130 249 253 233
44 676 44 15 48 45 195 64 66 67 253 254 237
45 677 45 24 147 145 196 163 161 164 240 205 206
46 678 46 95 97 33 196 113 116 115 200 245 247
47 679 47 33 98 95 196 118 103 115 247 199 200
48 680 48 95 96 21 196 107 111 110 200 258 244
49 681 49 97 95 21 196 113 110 114 245 200 244
50 682 50 145 33 148 196 168 167 166 206 247 242
51 683 51 24 145 148 196 164 166 165 240 206 242
52 684 52 18 45 48 195 63 66 68 256 237 254
53 685 53 45 18 46 195 63 62 53 237 256 259
54 686 54 48 124 173 195 252 248 255 254 249 250
55 687 55 148 97 74 196 246 243 239 242 245 241
56 688 56 74 24 5 148 86 25 87 239 165 169
57 689 57 3 49 122 15 60 260 141 16 69 138
58 690 58 146 12 49 3 153 59 261 156 14 60
59 691 59 15 124 4 48 144 131 17 64 252 65
60 692 60 149 1 47 12 151 55 215 150 13 57
61 693 61 147 7 73 24 162 82 262 163 26 81
62 694 62 36 172 6 96 182 185 38 108 263 112
63 695 63 98 47 1 9 197 55 100 101 54 10
64 696 64 2 174 46 18 192 264 50 19 193 62
65 697 65 1 149 98 33 151 265 100 34 157 118
66 698 66 48 173 4 18 255 176 65 68 188 20
67 699 67 30 72 171 8 75 210 194 32 76 180
68 700 68 97 21 5 74 114 22 117 243 88 87
69 701 69 9 46 2 99 51 50 11 105 266 106
70 702 70 8 123 171 42 128 267 180 44 125 179
71 703 71 97 5 33 148 117 35 116 246 169 167
72 704 72 99 174 2 36 214 192 106 119 190 37
73 705 73 173 124 4 42 248 131 176 175 129 43
74 706 74 3 122 146 39 141 268 156 40 142 158
75 707 75 8 72 123 27 76 218 128 29 77 143
76 708 76 71 172 6 30 212 185 92 91 186 31
77 709 77 147 121 7 39 203 135 162 160 132 41
78 710 78 73 121 27 7 208 136 83 82 135 28
79 711 79 71 6 96 21 92 112 269 94 23 111
80 712 80 146 49 122 3 261 260 268 156 60 141
81 713 81 2 46 174 99 50 264 192 106 266 214
82 714 82 123 171 72 8 267 210 218 128 180 76
83 715 83 7 73 121 147 82 208 135 162 262 203
84 716 84 173 4 124 48 176 131 248 255 65 252
85 717 85 96 172 6 71 263 185 112 269 212 92
86 718 86 74 5 97 148 87 117 243 239 169 246
87 719 87 1 98 149 47 100 265 151 55 197 215
88 720 88 147 121 70 73 203 207 270 262 208 84
89 721 89 121 147 70 196 203 270 207 204 205 221
90 722 90 147 70 24 73 270 85 163 262 84 81
91 723 91 70 147 24 196 270 163 85 221 205 240
92 724 92 146 195 45 145 272 237 271 154 236 229
93 725 93 12 45 146 49 58 271 153 59 61 261
94 726 94 146 45 12 145 271 58 153 154 229 152
95 727 95 98 47 145 149 197 216 273 265 215 155
96 728 96 145 47 98 196 216 197 273 206 201 199
97 729 97 33 98 145 149 118 273 168 157 265 155
98 730 98 145 98 33 196 273 118 168 206 199 247
99 731 99 95 196 172 96 200 223 274 107 258 263
100 732 100 172 196 95 170 223 200 274 183 224 225
101 733 101 36 95 172 96 109 274 182 108 107 263
102 734 102 172 95 36 170 274 109 182 183 225 184
103 735 103 96 70 172 71 275 211 263 269 93 212
104 736 104 172 70 96 196 211 275 263 223 221 258
105 737 105 96 21 70 71 111 90 275 269 94 93
106 738 106 70 21 96 196 90 111 275 221 244 258
107 739 107 45 195 99 95 237 226 276 234 227 104
108 740 108 99 195 45 46 226 237 276 266 259 53
109 741 109 9 45 99 95 52 276 105 102 234 104
110 742 110 99 45 9 46 276 52 105 266 53 51
111 743 111 123 170 72 171 277 209 218 267 181 210
112 744 112 42 170 123 171 178 277 125 179 181 267
113 745 113 170 42 123 195 178 125 277 228 251 231
114 746 114 170 70 123 72 222 217 277 209 79 218
115 747 115 123 70 170 195 217 222 277 231 232 228
116 748 116 120 146 195 122 278 272 233 140 268 257
117 749 117 146 120 195 145 278 233 272 154 235 236
118 750 118 39 146 120 122 158 278 133 142 268 140
119 751 119 146 39 120 145 158 133 278 154 159 235
120 752 120 46 99 170 174 266 213 279 264 214 191
121 753 121 170 99 46 195 213 266 279 228 226 259
122 754 122 18 46 170 174 62 279 189 193 264 191
123 755 123 170 46 18 195 279 62 189 228 259 256
124 756 124 70 30 170 172 78 187 222 211 186 183
125 757 125 170 30 70 72 187 78 222 209 75 79
126 758 126 122 45 146 195 280 271 268 257 237 272
127 759 127 146 45 122 49 271 280 268 261 61 260
128 760 128 122 15 45 195 138 67 280 257 253 237
129 761 129 45 15 122 49 67 138 280 61 69 260
+48 -48
View File
@@ -49,51 +49,51 @@
stresses (elem, integ.pnt.,sxx,syy,szz,sxy,sxz,syz) for set EALL and time 0.1000000E+01
37 1 3.404960E+00 -1.223741E+00 -1.146617E+01 -1.014816E+00 5.721404E-01 1.914876E+00
37 2 1.400224E+00 -2.953124E+00 -1.263874E+01 -6.892873E-01 7.925952E-01 2.418160E-02
37 3 -1.932021E-02 4.145572E+00 1.075800E+01 1.341622E-01 -1.077867E+00 -8.810057E-01
37 4 8.558867E-01 2.410724E+00 5.031899E+00 -4.538675E-01 -8.363957E-01 -8.545765E-01
38 1 -2.390976E-01 -6.281387E-01 -3.372011E-01 -4.253012E-01 -4.313375E-01 -3.639082E-02
38 2 -7.078629E-01 -1.051329E+00 9.460542E-02 3.391396E-02 6.619598E-02 -1.109819E-01
38 3 -4.586067E-01 -6.902739E-01 2.326885E-01 4.933190E-02 -3.895851E-01 2.906021E-01
38 4 8.177110E-01 6.474442E-01 1.691349E-01 -5.346077E-02 3.495037E-01 1.078309E-01
39 1 -3.738220E-01 5.244382E-02 5.043071E-02 -4.322174E-02 -5.119367E-02 -6.329539E-02
39 2 -4.870176E-01 -1.365642E-01 -3.659017E-02 -8.585698E-02 -1.108073E-01 5.250735E-02
39 3 -4.940118E-01 -4.307143E-02 -1.464103E-01 -1.050280E-01 -7.625476E-02 6.477853E-02
39 4 8.967718E-01 1.138003E-01 1.116798E-01 1.910842E-01 1.655394E-01 -5.121702E-02
40 1 4.012653E-01 3.057826E-02 5.455659E-01 1.235586E-01 -1.238112E-01 6.349248E-02
40 2 -8.194046E-04 -3.368150E-01 -6.142789E-01 2.034512E-01 3.075178E-01 -1.461547E-01
40 3 2.066455E-01 2.004212E-01 -5.374576E-02 2.225878E-01 2.561197E-01 1.619756E-01
40 4 4.741484E-01 1.602642E-01 5.137134E-01 2.176972E-01 -5.926745E-03 -2.173092E-02
41 1 -7.946980E-01 -4.942827E-01 -5.447915E-01 -1.912366E-01 -1.683255E-01 -2.154803E-01
41 2 1.223945E+00 7.271678E-01 7.742165E-01 1.161181E-01 9.021013E-02 2.591346E-01
41 3 -6.114285E-01 -1.081211E-01 -5.044171E-01 -1.959176E-01 -1.243099E-01 -8.182985E-03
41 4 -6.040667E-01 -4.628108E-01 -1.156609E-01 -1.356655E-01 -1.859799E-01 -1.577666E-02
42 1 -2.158509E-01 -5.325126E-01 -4.515843E-01 -3.866704E-01 -4.162330E-01 -4.108670E-02
42 2 -6.757261E-01 -4.613765E-02 -8.915881E-01 2.110811E-01 -5.724646E-02 -1.256511E-01
42 3 8.281455E-01 2.923749E-01 6.409637E-01 3.355626E-01 1.417774E-02 2.255109E-02
42 4 -4.816843E-01 -1.251024E-01 -7.976278E-01 -1.806942E-01 6.804089E-02 3.420348E-01
43 1 3.148795E-01 4.842984E-01 -1.212845E-01 -1.396304E-01 1.576929E-01 5.180396E-02
43 2 1.572111E-01 -5.768416E-01 -1.511784E-01 3.266388E-01 8.790621E-02 -1.028829E-01
43 3 4.376864E-01 4.768444E-01 1.206219E-01 -1.718879E-02 2.159821E-01 -1.329976E-02
43 4 3.287772E-01 -3.254589E-02 1.220524E-01 2.782618E-01 2.770364E-01 1.119853E-01
44 1 5.701030E-01 2.661561E-01 2.350779E-01 2.473974E-01 1.920553E-01 -8.597329E-02
44 2 -5.767263E+00 -1.361109E+00 -2.493103E+00 1.062399E+00 1.121190E+00 -7.464096E-02
44 3 -2.791280E+00 -2.396505E-01 -1.198247E+00 8.020567E-01 4.148892E-01 2.533118E-01
44 4 4.664713E+00 1.415554E+00 2.781100E+00 -1.310904E+00 -5.274516E-01 -6.913113E-01
45 1 6.199650E-01 3.396960E-01 1.887766E-01 2.972053E-01 1.410676E-01 -8.629576E-02
45 2 -5.726302E+00 -2.197206E+00 -1.667618E+00 9.736955E-01 1.208750E+00 -6.498466E-02
45 3 4.686756E+00 2.719609E+00 1.615152E+00 -6.160644E-01 -1.223586E+00 -7.749438E-01
45 4 -2.704298E+00 -1.154649E+00 -6.016097E-01 4.111997E-01 8.008334E-01 3.444956E-01
46 1 -5.437203E+00 -2.644227E+01 -2.765793E+01 8.276053E-01 9.432501E-01 1.482137E-01
46 2 -4.193540E-01 -2.423150E+01 -2.544716E+01 -1.315881E-01 -8.004705E-02 1.482137E-01
46 3 -3.379018E+00 -2.551852E+01 -2.673417E+01 1.043734E+00 2.548021E-01 1.482137E-01
46 4 6.954096E+00 1.762891E+01 1.247931E+01 -1.762986E+00 -5.844363E-01 6.278434E-01
47 1 -3.459645E+00 -2.680162E+01 -2.553961E+01 2.300758E-01 1.008848E+00 1.532041E-01
47 2 -4.441059E-01 -2.549031E+01 -2.422831E+01 -5.195025E-02 -1.737574E-01 1.532041E-01
47 3 -5.461955E+00 -2.770109E+01 -2.643908E+01 9.072431E-01 8.495398E-01 1.532041E-01
47 4 6.904522E+00 1.232019E+01 1.766614E+01 -5.323384E-01 -1.829156E+00 6.489831E-01
48 1 1.094742E-01 1.057881E+01 3.957891E+00 -1.038625E+00 4.987185E-01 -7.917258E-01
48 2 8.440135E-01 5.019593E+00 2.575092E+00 -9.132367E-01 -2.821124E-01 -7.648862E-01
48 3 1.344229E+00 -1.260257E+01 -2.845529E+00 6.886793E-01 -8.322797E-01 -1.251042E-01
48 4 3.283453E+00 -1.148053E+01 -1.218374E+00 5.266032E-01 -1.187474E+00 1.955865E+00
1 1 3.404960E+00 -1.223741E+00 -1.146617E+01 -1.014816E+00 5.721404E-01 1.914876E+00
1 2 1.400224E+00 -2.953124E+00 -1.263874E+01 -6.892873E-01 7.925952E-01 2.418160E-02
1 3 -1.932021E-02 4.145572E+00 1.075800E+01 1.341622E-01 -1.077867E+00 -8.810057E-01
1 4 8.558867E-01 2.410724E+00 5.031899E+00 -4.538675E-01 -8.363957E-01 -8.545765E-01
2 1 -2.390976E-01 -6.281387E-01 -3.372011E-01 -4.253012E-01 -4.313375E-01 -3.639082E-02
2 2 -7.078629E-01 -1.051329E+00 9.460542E-02 3.391396E-02 6.619598E-02 -1.109819E-01
2 3 -4.586067E-01 -6.902739E-01 2.326885E-01 4.933190E-02 -3.895851E-01 2.906021E-01
2 4 8.177110E-01 6.474442E-01 1.691349E-01 -5.346077E-02 3.495037E-01 1.078309E-01
3 1 -3.738220E-01 5.244382E-02 5.043071E-02 -4.322174E-02 -5.119367E-02 -6.329539E-02
3 2 -4.870176E-01 -1.365642E-01 -3.659017E-02 -8.585698E-02 -1.108073E-01 5.250735E-02
3 3 -4.940118E-01 -4.307143E-02 -1.464103E-01 -1.050280E-01 -7.625476E-02 6.477853E-02
3 4 8.967718E-01 1.138003E-01 1.116798E-01 1.910842E-01 1.655394E-01 -5.121702E-02
4 1 4.012653E-01 3.057826E-02 5.455659E-01 1.235586E-01 -1.238112E-01 6.349248E-02
4 2 -8.194046E-04 -3.368150E-01 -6.142789E-01 2.034512E-01 3.075178E-01 -1.461547E-01
4 3 2.066455E-01 2.004212E-01 -5.374576E-02 2.225878E-01 2.561197E-01 1.619756E-01
4 4 4.741484E-01 1.602642E-01 5.137134E-01 2.176972E-01 -5.926745E-03 -2.173092E-02
5 1 -7.946980E-01 -4.942827E-01 -5.447915E-01 -1.912366E-01 -1.683255E-01 -2.154803E-01
5 2 1.223945E+00 7.271678E-01 7.742165E-01 1.161181E-01 9.021013E-02 2.591346E-01
5 3 -6.114285E-01 -1.081211E-01 -5.044171E-01 -1.959176E-01 -1.243099E-01 -8.182985E-03
5 4 -6.040667E-01 -4.628108E-01 -1.156609E-01 -1.356655E-01 -1.859799E-01 -1.577666E-02
6 1 -2.158509E-01 -5.325126E-01 -4.515843E-01 -3.866704E-01 -4.162330E-01 -4.108670E-02
6 2 -6.757261E-01 -4.613765E-02 -8.915881E-01 2.110811E-01 -5.724646E-02 -1.256511E-01
6 3 8.281455E-01 2.923749E-01 6.409637E-01 3.355626E-01 1.417774E-02 2.255109E-02
6 4 -4.816843E-01 -1.251024E-01 -7.976278E-01 -1.806942E-01 6.804089E-02 3.420348E-01
7 1 3.148795E-01 4.842984E-01 -1.212845E-01 -1.396304E-01 1.576929E-01 5.180396E-02
7 2 1.572111E-01 -5.768416E-01 -1.511784E-01 3.266388E-01 8.790621E-02 -1.028829E-01
7 3 4.376864E-01 4.768444E-01 1.206219E-01 -1.718879E-02 2.159821E-01 -1.329976E-02
7 4 3.287772E-01 -3.254589E-02 1.220524E-01 2.782618E-01 2.770364E-01 1.119853E-01
8 1 5.701030E-01 2.661561E-01 2.350779E-01 2.473974E-01 1.920553E-01 -8.597329E-02
8 2 -5.767263E+00 -1.361109E+00 -2.493103E+00 1.062399E+00 1.121190E+00 -7.464096E-02
8 3 -2.791280E+00 -2.396505E-01 -1.198247E+00 8.020567E-01 4.148892E-01 2.533118E-01
8 4 4.664713E+00 1.415554E+00 2.781100E+00 -1.310904E+00 -5.274516E-01 -6.913113E-01
9 1 6.199650E-01 3.396960E-01 1.887766E-01 2.972053E-01 1.410676E-01 -8.629576E-02
9 2 -5.726302E+00 -2.197206E+00 -1.667618E+00 9.736955E-01 1.208750E+00 -6.498466E-02
9 3 4.686756E+00 2.719609E+00 1.615152E+00 -6.160644E-01 -1.223586E+00 -7.749438E-01
9 4 -2.704298E+00 -1.154649E+00 -6.016097E-01 4.111997E-01 8.008334E-01 3.444956E-01
10 1 -5.437203E+00 -2.644227E+01 -2.765793E+01 8.276053E-01 9.432501E-01 1.482137E-01
10 2 -4.193540E-01 -2.423150E+01 -2.544716E+01 -1.315881E-01 -8.004705E-02 1.482137E-01
10 3 -3.379018E+00 -2.551852E+01 -2.673417E+01 1.043734E+00 2.548021E-01 1.482137E-01
10 4 6.954096E+00 1.762891E+01 1.247931E+01 -1.762986E+00 -5.844363E-01 6.278434E-01
11 1 -3.459645E+00 -2.680162E+01 -2.553961E+01 2.300758E-01 1.008848E+00 1.532041E-01
11 2 -4.441059E-01 -2.549031E+01 -2.422831E+01 -5.195025E-02 -1.737574E-01 1.532041E-01
11 3 -5.461955E+00 -2.770109E+01 -2.643908E+01 9.072431E-01 8.495398E-01 1.532041E-01
11 4 6.904522E+00 1.232019E+01 1.766614E+01 -5.323384E-01 -1.829156E+00 6.489831E-01
12 1 1.094742E-01 1.057881E+01 3.957891E+00 -1.038625E+00 4.987185E-01 -7.917258E-01
12 2 8.440135E-01 5.019593E+00 2.575092E+00 -9.132367E-01 -2.821124E-01 -7.648862E-01
12 3 1.344229E+00 -1.260257E+01 -2.845529E+00 6.886793E-01 -8.322797E-01 -1.251042E-01
12 4 3.283453E+00 -1.148053E+01 -1.218374E+00 5.266032E-01 -1.187474E+00 1.955865E+00
+16 -14
View File
@@ -1,9 +1,11 @@
1C
1UUSER
1UDATE 28.july.2016
1UTIME 10:14:28
1UDATE 22.january.2017
1UTIME 14:44:35
1UHOST
1UPGM CalculiX
1UVERSION Version 2.10
1UCOMPILETIME Sa 5. Mär 12:23:33 CET 2016
1UDIR
1UDBN
1UMAT 1MECHANICALMATERIAL
@@ -55,29 +57,29 @@
-1 45 1.52908E+02 1.27000E+01 1.27000E+01
-3
3C 12 1
-1 37 6 0 1
-1 1 6 0 1
-2 5 6 12 11 26 43 33 20 37 34
-1 38 6 0 1
-1 2 6 0 1
-2 9 12 11 2 44 34 39 15 45 38
-1 39 6 0 1
-1 3 6 0 1
-2 3 4 1 12 27 36 22 24 41 35
-1 40 6 0 1
-1 4 6 0 1
-2 2 12 11 1 45 34 38 25 35 21
-1 41 6 0 1
-1 5 6 0 1
-2 2 12 1 4 45 35 25 16 41 36
-1 42 6 0 1
-1 6 6 0 1
-2 9 12 2 10 44 45 15 31 42 32
-1 43 6 0 1
-1 7 6 0 1
-2 2 12 4 10 45 41 16 32 42 18
-1 44 6 0 1
-1 8 6 0 1
-2 9 12 10 6 44 42 31 14 43 30
-1 45 6 0 1
-1 9 6 0 1
-2 9 12 6 11 44 43 14 39 34 37
-1 46 6 0 1
-1 10 6 0 1
-2 6 7 5 12 29 19 26 43 23 33
-1 47 6 0 1
-1 11 6 0 1
-2 8 7 6 12 28 29 13 40 23 43
-1 48 6 0 1
-1 12 6 0 1
-2 12 10 6 8 42 30 43 40 17 13
-3
1PSTEP 1 1 1
+31 -31
View File
@@ -45,18 +45,18 @@
44, 100.482, 12.7, 12.7
45, 152.908, 12.7, 12.7
*Element, TYPE=C3D10, ELSET=Eall
37, 5, 6, 12, 11, 26, 43, 33, 20, 37, 34
38, 9, 12, 11, 2, 44, 34, 39, 15, 45, 38
39, 3, 4, 1, 12, 27, 36, 22, 24, 41, 35
40, 2, 12, 11, 1, 45, 34, 38, 25, 35, 21
41, 2, 12, 1, 4, 45, 35, 25, 16, 41, 36
42, 9, 12, 2, 10, 44, 45, 15, 31, 42, 32
43, 2, 12, 4, 10, 45, 41, 16, 32, 42, 18
44, 9, 12, 10, 6, 44, 42, 31, 14, 43, 30
45, 9, 12, 6, 11, 44, 43, 14, 39, 34, 37
46, 6, 7, 5, 12, 29, 19, 26, 43, 23, 33
47, 8, 7, 6, 12, 28, 29, 13, 40, 23, 43
48, 12, 10, 6, 8, 42, 30, 43, 40, 17, 13
1, 5, 6, 12, 11, 26, 43, 33, 20, 37, 34
2, 9, 12, 11, 2, 44, 34, 39, 15, 45, 38
3, 3, 4, 1, 12, 27, 36, 22, 24, 41, 35
4, 2, 12, 11, 1, 45, 34, 38, 25, 35, 21
5, 2, 12, 1, 4, 45, 35, 25, 16, 41, 36
6, 9, 12, 2, 10, 44, 45, 15, 31, 42, 32
7, 2, 12, 4, 10, 45, 41, 16, 32, 42, 18
8, 9, 12, 10, 6, 44, 42, 31, 14, 43, 30
9, 9, 12, 6, 11, 44, 43, 14, 39, 34, 37
10, 6, 7, 5, 12, 29, 19, 26, 43, 23, 33
11, 8, 7, 6, 12, 28, 29, 13, 40, 23, 43
12, 12, 10, 6, 8, 42, 30, 43, 40, 17, 13
@@ -157,25 +157,25 @@ FemConstraintTemperature,11,11,310.93
** written by write_constraints_heatflux function
*FILM
** Heat flux on face Face3
39,F2,255.3722,0.005678
43,F3,255.3722,0.005678
47,F2,255.3722,0.005678
48,F2,255.3722,0.005678
3,F2,255.3722,0.005678
7,F3,255.3722,0.005678
11,F2,255.3722,0.005678
12,F2,255.3722,0.005678
** Heat flux on face Face4
37,F2,255.3722,0.005678
38,F4,255.3722,0.005678
40,F4,255.3722,0.005678
45,F4,255.3722,0.005678
1,F2,255.3722,0.005678
2,F4,255.3722,0.005678
4,F4,255.3722,0.005678
9,F4,255.3722,0.005678
** Heat flux on face Face5
37,F4,255.3722,0.005678
39,F4,255.3722,0.005678
40,F3,255.3722,0.005678
46,F3,255.3722,0.005678
1,F4,255.3722,0.005678
3,F4,255.3722,0.005678
4,F3,255.3722,0.005678
10,F3,255.3722,0.005678
** Heat flux on face Face6
42,F4,255.3722,0.005678
43,F4,255.3722,0.005678
44,F4,255.3722,0.005678
48,F3,255.3722,0.005678
6,F4,255.3722,0.005678
7,F4,255.3722,0.005678
8,F4,255.3722,0.005678
12,F3,255.3722,0.005678
***********************************************************
** Outputs --> frd file
@@ -197,9 +197,9 @@ S
***********************************************************
** CalculiX Input file
** written by write_footer function
** written by --> FreeCAD 0.17.8088 (Git)
** written on --> Thu Jul 28 10:14:28 2016
** file name --> FEM_spine.fcstd
** written by --> FreeCAD 0.17.9749 (Git)
** written on --> Sun Jan 22 14:33:57 2017
** file name -->
** analysis name --> Analysis
**
**
@@ -1,5 +1,5 @@
U1: (-0.000942455, 0.0030585454755555556, 0.00729818)
U2: (-0.00163382, 0.0006165889555555556, 0.00222318)
U3: (-0.00185329, 0.0005439136222222222, 0.00220675)
Uabs: (0.0, 0.003644782698151031, 0.007325712241135124)
Sabs: (0.30712297252407333, 7.747458526266711, 35.86180372766652)
U1: (-0.000942455, 0.0030585454755555556, 0.00729818)
U2: (-0.00163382, 0.0006165889555555556, 0.00222318)
U3: (-0.00185329, 0.0005439136222222222, 0.00220675)
Uabs: (0.0, 0.003644782698151031, 0.007325712241135124)
Sabs: (0.30712297252407333, 7.747458526266711, 35.86180372766652)
+12 -12
View File
@@ -1,12 +1,12 @@
37,5,6,12,11,26,43,33,20,37,34
38,9,12,11,2,44,34,39,15,45,38
39,3,4,1,12,27,36,22,24,41,35
40,2,12,11,1,45,34,38,25,35,21
41,2,12,1,4,45,35,25,16,41,36
42,9,12,2,10,44,45,15,31,42,32
43,2,12,4,10,45,41,16,32,42,18
44,9,12,10,6,44,42,31,14,43,30
45,9,12,6,11,44,43,14,39,34,37
46,6,7,5,12,29,19,26,43,23,33
47,8,7,6,12,28,29,13,40,23,43
48,12,10,6,8,42,30,43,40,17,13
1,5,6,12,11,26,43,33,20,37,34
2,9,12,11,2,44,34,39,15,45,38
3,3,4,1,12,27,36,22,24,41,35
4,2,12,11,1,45,34,38,25,35,21
5,2,12,1,4,45,35,25,16,41,36
6,9,12,2,10,44,45,15,31,42,32
7,2,12,4,10,45,41,16,32,42,18
8,9,12,10,6,44,42,31,14,43,30
9,9,12,6,11,44,43,14,39,34,37
10,6,7,5,12,29,19,26,43,23,33
11,8,7,6,12,28,29,13,40,23,43
12,12,10,6,8,42,30,43,40,17,13
1 1 5 6 12 11 26 43 33 20 37 37 34
2 2 9 12 11 2 44 34 39 15 45 38 45 38
3 3 3 4 1 12 27 36 22 24 41 39 41 35
4 4 2 12 11 1 45 34 38 25 35 40 35 21
5 5 2 12 1 4 45 35 25 16 41 41 36
6 6 9 12 2 10 44 45 15 31 42 42 32
7 7 2 12 4 10 45 41 16 32 42 43 42 18
8 8 9 12 10 6 44 42 31 14 43 44 43 30
9 9 9 12 6 11 44 43 14 39 34 45 34 37
10 10 6 7 5 12 29 19 26 43 23 46 23 33
11 11 8 7 6 12 28 29 13 40 23 47 23 43
12 12 12 10 6 8 42 30 43 40 17 48 17 13
+2 -2
View File
@@ -281,7 +281,7 @@ def process_emp(doc,filename,placement,board_thickness):
comps=dict(comps)
grp=doc.addObject("App::DocumentObjectGroup", "EMP Models")
for place_item in placement:
if comps.has_key(place_item[1]):
if place_item[1] in comps:
doc_comp=doc.addObject("Part::Feature",place_item[0])
FreeCAD.Console.PrintMessage("Adding EMP model "+str(place_item[0])+"\n")
doc_comp.Shape=comps[place_item[1]][0]
@@ -362,7 +362,7 @@ def place_steps(doc,placement,board_thickness):
step_dict=dict(step_dict)
grp=doc.addObject("App::DocumentObjectGroup", "Step Models")
for place_item in placement:
if step_dict.has_key(place_item[2]):
if place_item[2] in step_dict:
step_model=doc.addObject("Part::Feature",place_item[0]+"_s")
FreeCAD.Console.PrintMessage("Adding STEP model "+str(place_item[0])+"\n")
#if prev_step!=place_item[2]:
+1 -1
View File
@@ -46,7 +46,7 @@ class Type(object):
if type(self._typedef) == str:
if self._scope == None:
raise AssertionError('No scope defined for this type')
elif vars(self._scope).has_key(self._typedef):
elif self._typedef in vars(self._scope):
return vars(self._scope)[self._typedef]
else:
raise TypeError("Type '%s' is not defined in given scope"%self._typedef)
@@ -70,7 +70,7 @@ class ENUMERATION(object):
"""
def __init__(self,*kargs,**args):
# first defining the scope
if args.has_key('scope'):
if 'scope' in args:
self._scope = args['scope']
else:
self._scope = None
@@ -96,7 +96,7 @@ class ENUMERATION(object):
# has the same name as an enum id, it will replace it in the current scope.
#
for enum_id_name in self._enum_id_names:
if not vars(self._scope).has_key(enum_id_name):
if enum_id_name not in vars(self._scope):
vars(self._scope)[enum_id_name] = self.__getattribute__(enum_id_name)
def get_enum_ids(self):
@@ -109,7 +109,7 @@ class SELECT(object):
"""
def __init__(self,*kargs,**args):
# first defining the scope
if args.has_key('scope'):
if 'scope' in args:
self._scope = args['scope']
else:
self._scope = None
+4 -4
View File
@@ -107,11 +107,11 @@ class SimpleParser:
for i in self._p21loader._instances_definition.keys():
#print i
if not self.instanceMape.has_key(i):
if i not in self.instanceMape:
self._create_entity_instance(i)
def _create_entity_instance(self, instance_id):
if self._p21loader._instances_definition.has_key(instance_id):
if instance_id in self._p21loader._instances_definition:
instance_definition = self._p21loader._instances_definition[instance_id]
#print "Instance definition to process",instance_definition
# first find class name
@@ -144,11 +144,11 @@ class SimpleParser:
elif i[0] == '#':
key = int(i[1:])
#print 'Item: ',int(i[1:])
if self.instanceMape.has_key(key):
if key in self.instanceMape:
attrList[n] = self.instanceMape[key]
else:
self._create_entity_instance(key)
if not self.instanceMape.has_key(key):
if key not in self.instanceMape:
raise NameError("Needed instance not instanciated: ",key)
else:
attrList[n] = self.instanceMape[key]
+1 -1
View File
@@ -5,7 +5,7 @@ Description = None
Density = 0 kg/m^3
DynamicViscosity = 0 kg/m/s
KinematicViscosity = 0 m^2/s
VolumetricExpansionCoefficient = 0 m/m/K
VolumetricThermalExpansionCoefficient = 0 m/m/K
SpecificHeat = 0 J/kg/K
ThermalConductivity = 0 W/m/K
+1 -1
View File
@@ -7,7 +7,7 @@ Density = 998 kg/m^3
DynamicViscosity = 1.003e-3 kg/m/s
KinematicViscosity = 1.005 m^2/s
VolumetricExpansionCoefficient = 2.07e-4 m/m/K
VolumetricThermalExpansionCoefficient = 2.07e-4 m/m/K
SpecificHeat = 4.182 J/kg/K
ThermalConductivity = 0.591 W/m/K
+1
View File
@@ -460,6 +460,7 @@ PyMODINIT_FUNC initPart()
Part::Geometry ::init();
Part::GeomPoint ::init();
Part::GeomCurve ::init();
Part::GeomBoundedCurve ::init();
Part::GeomBezierCurve ::init();
Part::GeomBSplineCurve ::init();
Part::GeomConic ::init();
+14
View File
@@ -71,7 +71,21 @@ int BSplineCurvePy::PyInit(PyObject* args, PyObject* /*kwd*/)
return 0;
}
PyObject* obj;
// poles, [ periodic, degree, interpolate ]
obj = buildFromPoles(args);
if (obj) {
Py_DECREF(obj);
return 0;
}
else if (PyErr_ExceptionMatches(PartExceptionOCCError)) {
return -1;
}
PyErr_SetString(PyExc_TypeError, "B-Spline constructor accepts:\n"
"-- poles, [ periodic, degree, interpolate ]\n"
"-- empty parameter list\n");
return -1;
}
+10
View File
@@ -25,6 +25,7 @@
#ifndef _PreComp_
#endif
#include <Mod/Part/App/BodyBasePy.h>
#include <App/Application.h>
#include <App/Document.h>
#include <Base/Placement.h>
@@ -98,4 +99,13 @@ void BodyBase::onChanged (const App::Property* prop) {
Part::Feature::onChanged ( prop );
}
PyObject* BodyBase::getPyObject()
{
if (PythonObject.is(Py::_None())){
// ref counter is set to 1
PythonObject = Py::Object(new BodyBasePy(this),true);
}
return Py::new_reference_to(PythonObject);
}
} /* Part */
+1
View File
@@ -78,6 +78,7 @@ public:
* TODO introduce a findBodiesOf() if needed (2015-08-04, Fat-Zer)
*/
static BodyBase* findBodyOf(const App::DocumentObject* f);
virtual PyObject* getPyObject();
protected:
/// If BaseFeature is getting changed and Tip points to it resets the Tip
+312 -52
View File
@@ -385,10 +385,9 @@ bool GeomCurve::closestParameter(const Base::Vector3d& point, double &u) const
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
std::cout << e->GetMessageString() << std::endl;
return false;
throw Base::RuntimeError(e->GetMessageString());
}
return false;
}
@@ -409,22 +408,48 @@ bool GeomCurve::closestParameterToBasicCurve(const Base::Vector3d& point, double
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
std::cout << e->GetMessageString() << std::endl;
return false;
throw Base::RuntimeError(e->GetMessageString());
}
return false;
}
else {
return this->closestParameter(point, u);
}
}
// -------------------------------------------------
TYPESYSTEM_SOURCE_ABSTRACT(Part::GeomBoundedCurve, Part::GeomCurve)
GeomBoundedCurve::GeomBoundedCurve()
{
}
GeomBoundedCurve::~GeomBoundedCurve()
{
}
Base::Vector3d GeomBoundedCurve::getStartPoint() const
{
Handle_Geom_BoundedCurve curve = Handle_Geom_BoundedCurve::DownCast(handle());
gp_Pnt pnt = curve->StartPoint();
return Base::Vector3d(pnt.X(), pnt.Y(), pnt.Z());
}
Base::Vector3d GeomBoundedCurve::getEndPoint() const
{
Handle_Geom_BoundedCurve curve = Handle_Geom_BoundedCurve::DownCast(handle());
gp_Pnt pnt = curve->EndPoint();
return Base::Vector3d(pnt.X(), pnt.Y(), pnt.Z());
}
// -------------------------------------------------
TYPESYSTEM_SOURCE(Part::GeomBezierCurve,Part::GeomCurve)
TYPESYSTEM_SOURCE(Part::GeomBezierCurve,Part::GeomBoundedCurve)
GeomBezierCurve::GeomBezierCurve()
{
@@ -473,7 +498,7 @@ PyObject *GeomBezierCurve::getPyObject(void)
// -------------------------------------------------
TYPESYSTEM_SOURCE(Part::GeomBSplineCurve,Part::GeomCurve)
TYPESYSTEM_SOURCE(Part::GeomBSplineCurve,Part::GeomBoundedCurve)
GeomBSplineCurve::GeomBSplineCurve()
{
@@ -528,13 +553,34 @@ void GeomBSplineCurve::setPole(int index, const Base::Vector3d& pole, double wei
try {
gp_Pnt pnt(pole.x,pole.y,pole.z);
if (weight < 0.0)
myCurve->SetPole(index+1,pnt);
myCurve->SetPole(index,pnt);
else
myCurve->SetPole(index+1,pnt,weight);
myCurve->SetPole(index,pnt,weight);
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
std::cout << e->GetMessageString() << std::endl;
throw Base::RuntimeError(e->GetMessageString());
}
}
void GeomBSplineCurve::setPoles(const std::vector<Base::Vector3d>& poles, const std::vector<double>& weights)
{
if (poles.size() != weights.size())
throw Base::ValueError("knots and multiplicities mismatch");
Standard_Integer index=1;
for (std::size_t it = 0; it < poles.size(); it++, index++) {
setPole(index, poles[it], weights[it]);
}
}
void GeomBSplineCurve::setPoles(const std::vector<Base::Vector3d>& poles)
{
Standard_Integer index=1;
for (std::vector<Base::Vector3d>::const_iterator it = poles.begin(); it != poles.end(); ++it, index++){
setPole(index, *it);
}
}
@@ -552,6 +598,108 @@ std::vector<Base::Vector3d> GeomBSplineCurve::getPoles() const
return poles;
}
std::vector<double> GeomBSplineCurve::getWeights() const
{
std::vector<double> weights;
weights.reserve(myCurve->NbPoles());
TColStd_Array1OfReal w(1,myCurve->NbPoles());
myCurve->Weights(w);
for (Standard_Integer i=w.Lower(); i<=w.Upper(); i++) {
const Standard_Real& real = w(i);
weights.push_back(real);
}
return weights;
}
void GeomBSplineCurve::setWeights(const std::vector<double>& weights)
{
try {
Standard_Integer index=1;
for (std::vector<double>::const_iterator it = weights.begin(); it != weights.end(); ++it, index++){
myCurve->SetWeight(index, *it);
}
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::RuntimeError(e->GetMessageString());
}
}
void GeomBSplineCurve::setKnot(int index, const double val, int mult)
{
try {
if (mult < 0)
myCurve->SetKnot(index, val);
else
myCurve->SetKnot(index, val, mult);
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::RuntimeError(e->GetMessageString());
}
}
void GeomBSplineCurve::setKnots(const std::vector<double>& knots)
{
Standard_Integer index=1;
for (std::vector<double>::const_iterator it = knots.begin(); it != knots.end(); ++it, index++) {
setKnot(index, *it);
}
}
void GeomBSplineCurve::setKnots(const std::vector<double>& knots, const std::vector<int>& multiplicities)
{
if (knots.size() != multiplicities.size())
throw Base::ValueError("knots and multiplicities mismatch");
Standard_Integer index=1;
for (std::size_t it = 0; it < knots.size(); it++, index++) {
setKnot(index, knots[it], multiplicities[it]);
}
}
std::vector<double> GeomBSplineCurve::getKnots() const
{
std::vector<double> knots;
knots.reserve(myCurve->NbKnots());
TColStd_Array1OfReal k(1,myCurve->NbKnots());
myCurve->Knots(k);
for (Standard_Integer i=k.Lower(); i<=k.Upper(); i++) {
const Standard_Real& real = k(i);
knots.push_back(real);
}
return knots;
}
std::vector<int> GeomBSplineCurve::getMultiplicities() const
{
std::vector<int> mults;
mults.reserve(myCurve->NbKnots());
TColStd_Array1OfInteger m(1,myCurve->NbKnots());
myCurve->Multiplicities(m);
for (Standard_Integer i=m.Lower(); i<=m.Upper(); i++) {
const Standard_Integer& nm = m(i);
mults.push_back(nm);
}
return mults;
}
int GeomBSplineCurve::getDegree() const
{
return myCurve->Degree();
}
bool GeomBSplineCurve::isPeriodic() const
{
return myCurve->IsPeriodic()==Standard_True;
}
bool GeomBSplineCurve::join(const Handle_Geom_BSplineCurve& spline)
{
GeomConvert_CompCurveToBSplineCurve ccbc(this->myCurve);
@@ -651,9 +799,121 @@ void GeomBSplineCurve::makeC1Continuous(double tol, double ang_tol)
}
// Persistence implementer
unsigned int GeomBSplineCurve::getMemSize (void) const {assert(0); return 0;/* not implemented yet */}
void GeomBSplineCurve::Save (Base::Writer &/*writer*/) const {assert(0); /* not implemented yet */}
void GeomBSplineCurve::Restore (Base::XMLReader &/*reader*/) {assert(0); /* not implemented yet */}
unsigned int GeomBSplineCurve::getMemSize (void) const
{
return sizeof(Geom_BSplineCurve);
}
void GeomBSplineCurve::Save(Base::Writer& writer) const
{
// save the attributes of the father class
GeomCurve::Save(writer);
std::vector<Base::Vector3d> poles = this->getPoles();
std::vector<double> weights = this->getWeights();
std::vector<double> knots = this->getKnots();
std::vector<int> mults = this->getMultiplicities();
int degree = this->getDegree();
bool isperiodic = this->isPeriodic();
writer.Stream()
<< writer.ind()
<< "<BSplineCurve "
<< "PolesCount=\"" << poles.size() <<
"\" KnotsCount=\"" << knots.size() <<
"\" Degree=\"" << degree <<
"\" IsPeriodic=\"" << (int) isperiodic <<
"\">" << endl;
writer.incInd();
std::vector<Base::Vector3d>::const_iterator itp;
std::vector<double>::const_iterator itw;
for (itp = poles.begin(), itw = weights.begin(); itp != poles.end() && itw != weights.end(); ++itp, ++itw) {
writer.Stream()
<< writer.ind()
<< "<Pole "
<< "X=\"" << (*itp).x <<
"\" Y=\"" << (*itp).y <<
"\" Z=\"" << (*itp).z <<
"\" Weight=\"" << (*itw) <<
"\"/>" << endl;
}
std::vector<double>::const_iterator itk;
std::vector<int>::const_iterator itm;
for (itk = knots.begin(), itm = mults.begin(); itk != knots.end() && itm != mults.end(); ++itk, ++itm) {
writer.Stream()
<< writer.ind()
<< "<Knot "
<< "Value=\"" << (*itk)
<< "\" Mult=\"" << (*itm) <<
"\"/>" << endl;
}
writer.decInd();
writer.Stream() << writer.ind() << "</BSplineCurve>" << endl ;
}
void GeomBSplineCurve::Restore(Base::XMLReader& reader)
{
// read the attributes of the father class
GeomCurve::Restore(reader);
reader.readElement("BSplineCurve");
// get the value of my attribute
int polescount = reader.getAttributeAsInteger("PolesCount");
int knotscount = reader.getAttributeAsInteger("KnotsCount");
int degree = reader.getAttributeAsInteger("Degree");
bool isperiodic = (bool) reader.getAttributeAsInteger("IsPeriodic");
// Handle_Geom_BSplineCurve spline = new
// Geom_BSplineCurve(occpoles,occweights,occknots,occmults,degree,
// PyObject_IsTrue(periodic) ? Standard_True : Standard_False,
// PyObject_IsTrue(CheckRational) ? Standard_True : Standard_False);
TColgp_Array1OfPnt p(1,polescount);
TColStd_Array1OfReal w(1,polescount);
TColStd_Array1OfReal k(1,knotscount);
TColStd_Array1OfInteger m(1,knotscount);
for (int i = 1; i <= polescount; i++) {
reader.readElement("Pole");
double X = reader.getAttributeAsFloat("X");
double Y = reader.getAttributeAsFloat("Y");
double Z = reader.getAttributeAsFloat("Z");
double W = reader.getAttributeAsFloat("Weight");
p.SetValue(i, gp_Pnt(X,Y,Z));
w.SetValue(i, W);
}
for (int i = 1; i <= knotscount; i++) {
reader.readElement("Knot");
double val = reader.getAttributeAsFloat("Value");
Standard_Integer mult = reader.getAttributeAsInteger("Mult");
k.SetValue(i, val);
m.SetValue(i, mult);
}
reader.readEndElement("BSplineCurve");
// Geom_BSplineCurve(occpoles,occweights,occknots,occmults,degree,periodic,CheckRational
try {
Handle_Geom_BSplineCurve spline = new Geom_BSplineCurve(p, w, k, m, degree, isperiodic ? Standard_True : Standard_False, Standard_False);
if (!spline.IsNull())
this->myCurve = spline;
else
throw Base::RuntimeError("BSpline restore failed");
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::RuntimeError(e->GetMessageString());
}
}
PyObject *GeomBSplineCurve::getPyObject(void)
{
@@ -690,7 +950,7 @@ void GeomConic::setLocation(const Base::Vector3d& Center)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -712,7 +972,7 @@ void GeomConic::setCenter(const Base::Vector3d& Center)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -761,7 +1021,7 @@ void GeomConic::setAngleXU(double angle)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -853,7 +1113,7 @@ void GeomArcOfConic::setCenter(const Base::Vector3d& Center)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -868,7 +1128,7 @@ void GeomArcOfConic::setLocation(const Base::Vector3d& Center)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -930,7 +1190,7 @@ void GeomArcOfConic::setAngleXU(double angle)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -976,7 +1236,7 @@ void GeomArcOfConic::setXAxisDir(const Base::Vector3d& newdir)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1028,7 +1288,7 @@ void GeomCircle::setRadius(double Radius)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1088,7 +1348,7 @@ void GeomCircle::Restore(Base::XMLReader& reader)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1154,7 +1414,7 @@ void GeomArcOfCircle::setRadius(double Radius)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1227,7 +1487,7 @@ void GeomArcOfCircle::setRange(double u, double v, bool emulateCCWXY)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1301,7 +1561,7 @@ void GeomArcOfCircle::Restore(Base::XMLReader &reader)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1356,7 +1616,7 @@ void GeomEllipse::setMajorRadius(double Radius)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1375,7 +1635,7 @@ void GeomEllipse::setMinorRadius(double Radius)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1413,7 +1673,7 @@ void GeomEllipse::setMajorAxisDir(Base::Vector3d newdir)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1495,7 +1755,7 @@ void GeomEllipse::Restore(Base::XMLReader& reader)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1564,7 +1824,7 @@ void GeomArcOfEllipse::setMajorRadius(double Radius)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1583,7 +1843,7 @@ void GeomArcOfEllipse::setMinorRadius(double Radius)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1625,7 +1885,7 @@ void GeomArcOfEllipse::setMajorAxisDir(Base::Vector3d newdir)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1672,7 +1932,7 @@ void GeomArcOfEllipse::setRange(double u, double v, bool emulateCCWXY)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1765,7 +2025,7 @@ void GeomArcOfEllipse::Restore(Base::XMLReader &reader)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1820,7 +2080,7 @@ void GeomHyperbola::setMajorRadius(double Radius)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1839,7 +2099,7 @@ void GeomHyperbola::setMinorRadius(double Radius)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1915,7 +2175,7 @@ void GeomHyperbola::Restore(Base::XMLReader& reader)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1979,7 +2239,7 @@ void GeomArcOfHyperbola::setMajorRadius(double Radius)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -1998,7 +2258,7 @@ void GeomArcOfHyperbola::setMinorRadius(double Radius)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -2041,7 +2301,7 @@ void GeomArcOfHyperbola::setMajorAxisDir(Base::Vector3d newdir)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -2058,7 +2318,7 @@ void GeomArcOfHyperbola::getRange(double& u, double& v, bool emulateCCWXY) const
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
u = myCurve->FirstParameter();
@@ -2080,7 +2340,7 @@ void GeomArcOfHyperbola::setRange(double u, double v, bool emulateCCWXY)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -2172,7 +2432,7 @@ void GeomArcOfHyperbola::Restore(Base::XMLReader &reader)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -2226,7 +2486,7 @@ void GeomParabola::setFocal(double length)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -2300,7 +2560,7 @@ void GeomParabola::Restore(Base::XMLReader& reader)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -2364,7 +2624,7 @@ void GeomArcOfParabola::setFocal(double length)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -2389,7 +2649,7 @@ void GeomArcOfParabola::getRange(double& u, double& v, bool emulateCCWXY) const
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
u = myCurve->FirstParameter();
@@ -2410,7 +2670,7 @@ void GeomArcOfParabola::setRange(double u, double v, bool emulateCCWXY)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -2500,7 +2760,7 @@ void GeomArcOfParabola::Restore(Base::XMLReader &reader)
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
@@ -2690,7 +2950,7 @@ void GeomLineSegment::setPoints(const Base::Vector3d& Start, const Base::Vector3
}
catch (Standard_Failure) {
Handle_Standard_Failure e = Standard_Failure::Caught();
throw Base::Exception(e->GetMessageString());
throw Base::RuntimeError(e->GetMessageString());
}
}
+25 -2
View File
@@ -130,7 +130,19 @@ public:
bool closestParameterToBasicCurve(const Base::Vector3d& point, double &u) const;
};
class PartExport GeomBezierCurve : public GeomCurve
class PartExport GeomBoundedCurve : public GeomCurve
{
TYPESYSTEM_HEADER();
public:
GeomBoundedCurve();
virtual ~GeomBoundedCurve();
// Geometry helper
virtual Base::Vector3d getStartPoint() const;
virtual Base::Vector3d getEndPoint() const;
};
class PartExport GeomBezierCurve : public GeomBoundedCurve
{
TYPESYSTEM_HEADER();
public:
@@ -153,7 +165,7 @@ private:
Handle_Geom_BezierCurve myCurve;
};
class PartExport GeomBSplineCurve : public GeomCurve
class PartExport GeomBSplineCurve : public GeomBoundedCurve
{
TYPESYSTEM_HEADER();
public:
@@ -183,7 +195,18 @@ public:
int countPoles() const;
void setPole(int index, const Base::Vector3d&, double weight=-1);
void setPoles(const std::vector<Base::Vector3d>& poles, const std::vector<double>& weights);
void setPoles(const std::vector<Base::Vector3d>& poles);
void setWeights(const std::vector<double>& weights);
void setKnot(int index, const double val, int mult=-1);
void setKnots(const std::vector<double>& knots);
void setKnots(const std::vector<double>& knots, const std::vector<int>& multiplicities);
std::vector<Base::Vector3d> getPoles() const;
std::vector<double> getWeights() const;
std::vector<double> getKnots() const;
std::vector<int> getMultiplicities() const;
int getDegree() const;
bool isPeriodic() const;
bool join(const Handle_Geom_BSplineCurve&);
void makeC1Continuous(double, double);
std::list<Geometry*> toBiArcs(double tolerance) const;
+15
View File
@@ -63,6 +63,8 @@
#include "PrimitiveFeature.h"
#include <Mod/Part/App/PartFeaturePy.h>
#include <App/FeaturePythonPyImp.h>
#include <Base/Console.h>
#include <Base/Exception.h>
#include <Base/Reader.h>
@@ -105,6 +107,19 @@ App::DocumentObjectExecReturn* Primitive::execute(void) {
return Part::Feature::execute();
}
namespace Part {
PYTHON_TYPE_DEF(PrimitivePy, PartFeaturePy)
PYTHON_TYPE_IMP(PrimitivePy, PartFeaturePy)
}
PyObject* Primitive::getPyObject()
{
if (PythonObject.is(Py::_None())){
// ref counter is set to 1
PythonObject = Py::Object(new PrimitivePy(this),true);
}
return Py::new_reference_to(PythonObject);
}
void Primitive::Restore(Base::XMLReader &reader)
{
+1
View File
@@ -44,6 +44,7 @@ public:
/// recalculate the feature
App::DocumentObjectExecReturn *execute(void);
short mustExecute() const;
PyObject* getPyObject();
//@}
protected:
@@ -30,10 +30,13 @@
#include "DatumPoint.h"
#include "DatumCS.h"
#include <Mod/Part/App/modelRefine.h>
#include <Mod/Part/App/PartFeaturePy.h>
#include <Base/Exception.h>
#include <Base/Tools.h>
#include <App/Document.h>
#include <App/Application.h>
#include <App/FeaturePythonPyImp.h>
#include <BRepPrimAPI_MakeBox.hxx>
#include <BRepBuilderAPI_GTransform.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
@@ -152,6 +155,18 @@ void FeaturePrimitive::onChanged(const App::Property* prop)
FeatureAddSub::onChanged(prop);
}
PYTHON_TYPE_DEF(PrimitivePy, Part::PartFeaturePy)
PYTHON_TYPE_IMP(PrimitivePy, Part::PartFeaturePy)
PyObject* FeaturePrimitive::getPyObject()
{
if (PythonObject.is(Py::_None())){
// ref counter is set to 1
PythonObject = Py::Object(new PrimitivePy(this),true);
}
return Py::new_reference_to(PythonObject);
}
PROPERTY_SOURCE(PartDesign::Box, PartDesign::FeaturePrimitive)
Box::Box()
+3 -2
View File
@@ -54,14 +54,15 @@ public:
virtual const char* getViewProviderName(void) const {
return "PartDesignGui::ViewProviderPrimitive";
}
Type getPrimitiveType() {return primitiveType;};
Type getPrimitiveType() {return primitiveType;}
TopoDS_Shape refineShapeIfActive(const TopoDS_Shape& oldShape) const;
virtual void onChanged(const App::Property* prop);
virtual PyObject* getPyObject();
/// Do nothing, just to suppress warning, must be redefined in derived classes
virtual App::DocumentObjectExecReturn* execute() {
return PartDesign::FeatureAddSub::execute();
};
}
protected:
//make the boolean ops with the primitives provided by the derived features
App::DocumentObjectExecReturn* execute(const TopoDS_Shape& primitiveShape);
@@ -45,7 +45,17 @@ TaskFeatureParameters::TaskFeatureParameters(PartDesignGui::ViewProvider *vp, QW
const std::string& pixmapname, const QString& parname)
: TaskBox(Gui::BitmapFactory().pixmap(pixmapname.c_str()),parname,true, parent),
vp(vp), blockUpdate(false)
{ }
{
Gui::Document* doc = vp->getDocument();
this->attachDocument(doc);
this->enableNotifications(DocumentObserver::Delete);
}
void TaskFeatureParameters::slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj)
{
if (this->vp == &Obj)
this->vp = nullptr;
}
void TaskFeatureParameters::onUpdateView(bool on)
{
+10 -4
View File
@@ -26,25 +26,27 @@
#include <Gui/TaskView/TaskView.h>
#include <Gui/TaskView/TaskDialog.h>
#include <Gui/DocumentObserver.h>
#include "ViewProvider.h"
namespace PartDesignGui {
/// Convenience class to collect common methods for all SketchBased features
class TaskFeatureParameters : public Gui::TaskView::TaskBox
class TaskFeatureParameters : public Gui::TaskView::TaskBox,
public Gui::DocumentObserver
{
Q_OBJECT
public:
TaskFeatureParameters(PartDesignGui::ViewProvider* vp, QWidget *parent,
const std::string& pixmapname, const QString& parname);
virtual ~TaskFeatureParameters() {};
virtual ~TaskFeatureParameters() {}
/// save field history
virtual void saveHistory(void) {};
virtual void saveHistory(void) {}
/// apply changes made in the parameters input to the model via commands
virtual void apply() {};
virtual void apply() {}
void recomputeFeature();
@@ -52,6 +54,10 @@ protected Q_SLOTS:
// TODO Add update view to all dialogs (2015-12-05, Fat-Zer)
void onUpdateView(bool on);
private:
/** Notifies when the object is about to be removed. */
virtual void slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj);
protected:
PartDesignGui::ViewProvider *vp;
/// Lock updateUI(), applying changes to the underlying feature and calling recomputeFeature()
@@ -370,18 +370,18 @@ unsigned TaskLinearPatternParameters::getOccurrences(void) const
return ui->spinOccurrences->value();
}
TaskLinearPatternParameters::~TaskLinearPatternParameters()
{
//hide the parts coordinate system axis for selection
PartDesign::Body * body = PartDesign::Body::findBodyOf ( getObject() );
if(body) {
PartDesign::Body * body = PartDesign::Body::findBodyOf(getObject());
if (body) {
try {
App::Origin *origin = body->getOrigin();
ViewProviderOrigin* vpOrigin;
vpOrigin = static_cast<ViewProviderOrigin*>(Gui::Application::Instance->getViewProvider(origin));
vpOrigin->resetTemporaryVisibility();
} catch (const Base::Exception &ex) {
}
catch (const Base::Exception &ex) {
Base::Console().Error ("%s\n", ex.what () );
}
}
+38 -33
View File
@@ -67,7 +67,7 @@ using namespace Gui;
// Task Parameter
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TaskPipeParameters::TaskPipeParameters(ViewProviderPipe *PipeView,bool /*newObj*/, QWidget *parent)
TaskPipeParameters::TaskPipeParameters(ViewProviderPipe *PipeView, bool /*newObj*/, QWidget *parent)
: TaskSketchBasedParameters(PipeView, parent, "PartDesign_Additive_Pipe",tr("Pipe parameters"))
{
// we need a separate container widget to add all controls to
@@ -84,15 +84,15 @@ TaskPipeParameters::TaskPipeParameters(ViewProviderPipe *PipeView,bool /*newObj*
this, SLOT(onButtonRefRemove(bool)));
connect(ui->buttonProfileBase, SIGNAL(toggled(bool)),
this, SLOT(onBaseButton(bool)));
this->groupLayout()->addWidget(proxy);
PartDesign::Pipe* pipe = static_cast<PartDesign::Pipe*>(PipeView->getObject());
Gui::Document* doc = Gui::Application::Instance->activeDocument();
//make sure th euser sees al important things: the
//spine/auxillery spine he already selected
if(pipe->Spine.getValue()) {
Gui::Document* doc = PipeView->getDocument();
//make sure the user sees all important things: the
//spine/auxilliary spine he already selected
if (pipe->Spine.getValue()) {
auto* svp = doc->getViewProvider(pipe->Spine.getValue());
spineShow = svp->isShow();
svp->setVisible(true);
@@ -104,9 +104,9 @@ TaskPipeParameters::TaskPipeParameters(ViewProviderPipe *PipeView,bool /*newObj*
std::vector<std::string> strings = pipe->Spine.getSubValues();
for (std::vector<std::string>::const_iterator i = strings.begin(); i != strings.end(); i++)
ui->listWidgetReferences->addItem(QString::fromStdString(*i));
ui->comboBoxTransition->setCurrentIndex(pipe->Transition.getValue());
updateUI();
}
@@ -151,18 +151,21 @@ void TaskPipeParameters::onSelectionChanged(const Gui::SelectionChanges& msg)
TaskPipeParameters::~TaskPipeParameters()
{
PartDesign::Pipe* pipe = static_cast<PartDesign::Pipe*>(vp->getObject());
Gui::Document* doc = Gui::Application::Instance->activeDocument();
//make sure th euser sees al important things: the
//spine/auxillery spine he already selected
if(pipe->Spine.getValue()) {
auto* svp = doc->getViewProvider(pipe->Spine.getValue());
svp->setVisible(spineShow);
spineShow = false;
if (vp) {
PartDesign::Pipe* pipe = static_cast<PartDesign::Pipe*>(vp->getObject());
Gui::Document* doc = vp->getDocument();
//make sure the user sees all important things: the
//spine/auxilliary spine he already selected
if (pipe->Spine.getValue()) {
auto* svp = doc->getViewProvider(pipe->Spine.getValue());
svp->setVisible(spineShow);
spineShow = false;
}
static_cast<ViewProviderPipe*>(vp)->highlightReferences(false, false);
}
static_cast<ViewProviderPipe*>(vp)->highlightReferences(false, false);
delete ui;
}
@@ -340,20 +343,22 @@ TaskPipeOrientation::TaskPipeOrientation(ViewProviderPipe* PipeView, bool /*newO
updateUI(pipe->Mode.getValue());
}
TaskPipeOrientation::~TaskPipeOrientation() {
TaskPipeOrientation::~TaskPipeOrientation()
{
if (vp) {
PartDesign::Pipe* pipe = static_cast<PartDesign::Pipe*>(vp->getObject());
Gui::Document* doc = vp->getDocument();
PartDesign::Pipe* pipe = static_cast<PartDesign::Pipe*>(vp->getObject());
Gui::Document* doc = Gui::Application::Instance->activeDocument();
//make sure th euser sees al important things: the base feature to select edges and the
//spine/auxillery spine he already selected
if(pipe->AuxillerySpine.getValue()) {
auto* svp = doc->getViewProvider(pipe->AuxillerySpine.getValue());
svp->setVisible(auxSpineShow);
auxSpineShow = false;
//make sure the user sees al important things: the base feature to select edges and the
//spine/auxilliary spine he already selected
if (pipe->AuxillerySpine.getValue()) {
auto* svp = doc->getViewProvider(pipe->AuxillerySpine.getValue());
svp->setVisible(auxSpineShow);
auxSpineShow = false;
}
static_cast<ViewProviderPipe*>(vp)->highlightReferences(false, true);
}
static_cast<ViewProviderPipe*>(vp)->highlightReferences(false, true);
}
void TaskPipeOrientation::onOrientationChanged(int idx) {
@@ -220,7 +220,11 @@ TaskBoxPrimitives::TaskBoxPrimitives(ViewProviderPrimitive* vp, QWidget* parent)
if(i != index)
ui.widgetStack->widget(i)->setSizePolicy(QSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored));
}
Gui::Document* doc = vp->getDocument();
this->attachDocument(doc);
this->enableNotifications(DocumentObserver::Delete);
//show the parts coordinate system axis for selection
PartDesign::Body * body = PartDesign::Body::findBodyOf(vp->getObject());
if(body) {
@@ -241,8 +245,8 @@ TaskBoxPrimitives::TaskBoxPrimitives(ViewProviderPrimitive* vp, QWidget* parent)
TaskBoxPrimitives::~TaskBoxPrimitives()
{
//hide the parts coordinate system axis for selection
PartDesign::Body * body = PartDesign::Body::findBodyOf ( vp->getObject() );
if(body) {
PartDesign::Body * body = vp ? PartDesign::Body::findBodyOf(vp->getObject()) : 0;
if (body) {
try {
App::Origin *origin = body->getOrigin();
Gui::ViewProviderOrigin* vpOrigin;
@@ -254,6 +258,12 @@ TaskBoxPrimitives::~TaskBoxPrimitives()
}
}
void TaskBoxPrimitives::slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj)
{
if (this->vp == &Obj)
this->vp = nullptr;
}
void TaskBoxPrimitives::onBoxHeightChanged(double v) {
PartDesign::Box* box = static_cast<PartDesign::Box*>(vp->getObject());
box->Height.setValue(v);
@@ -26,6 +26,7 @@
#include <Gui/TaskView/TaskView.h>
#include <Gui/Selection.h>
#include <Gui/DocumentObserver.h>
#include <Gui/TaskView/TaskDialog.h>
#include "TaskSketchBasedParameters.h"
@@ -49,7 +50,8 @@ namespace PartDesignGui {
namespace s = boost::signals;
class TaskBoxPrimitives : public Gui::TaskView::TaskBox
class TaskBoxPrimitives : public Gui::TaskView::TaskBox,
public Gui::DocumentObserver
{
Q_OBJECT
@@ -98,7 +100,11 @@ public Q_SLOTS:
void onWedgeX2inChanged(double);
void onWedgeZ2maxChanged(double);
void onWedgeZ2inChanged(double);
private:
/** Notifies when the object is about to be removed. */
virtual void slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj);
private:
QWidget* proxy;
Ui_DlgPrimitives ui;
@@ -361,8 +361,8 @@ bool TaskRevolutionParameters::getReversed(void) const
TaskRevolutionParameters::~TaskRevolutionParameters()
{
//hide the parts coordinate system axis for selection
PartDesign::Body * body = PartDesign::Body::findBodyOf ( vp->getObject() );
if ( body ) {
PartDesign::Body * body = vp ? PartDesign::Body::findBodyOf(vp->getObject()) : 0;
if (body) {
try {
App::Origin *origin = body->getOrigin();
ViewProviderOrigin* vpOrigin;
@@ -375,7 +375,7 @@ TaskRevolutionParameters::~TaskRevolutionParameters()
delete ui;
for(size_t i = 0 ; i < axesInList.size() ; i++ ){
for (size_t i = 0; i < axesInList.size(); i++) {
delete axesInList[i];
}
}
@@ -72,6 +72,12 @@ TaskTransformedParameters::TaskTransformedParameters(ViewProviderTransformed *Tr
blockUpdate(false)
{
selectionMode = none;
if (TransformedView) {
Gui::Document* doc = TransformedView->getDocument();
this->attachDocument(doc);
this->enableNotifications(DocumentObserver::Delete);
}
}
TaskTransformedParameters::TaskTransformedParameters(TaskMultiTransformParameters *parentTask)
@@ -92,6 +98,12 @@ TaskTransformedParameters::~TaskTransformedParameters()
Gui::Selection().rmvSelectionGate();
}
void TaskTransformedParameters::slotDeletedObject(const Gui::ViewProviderDocumentObject& Obj)
{
if (TransformedView == &Obj)
TransformedView = nullptr;
}
bool TaskTransformedParameters::isViewUpdated() const
{
return (blockUpdate == false);
@@ -264,17 +276,18 @@ PartDesignGui::ViewProviderTransformed *TaskTransformedParameters::getTopTransfo
}
PartDesign::Transformed *TaskTransformedParameters::getTopTransformedObject() const {
App::DocumentObject *transform = getTopTransformedView()->getObject();
assert (transform->isDerivedFrom(PartDesign::Transformed::getClassTypeId()));
return static_cast<PartDesign::Transformed*>(transform);
App::DocumentObject *transform = getTopTransformedView()->getObject();
assert (transform->isDerivedFrom(PartDesign::Transformed::getClassTypeId()));
return static_cast<PartDesign::Transformed*>(transform);
}
PartDesign::Transformed *TaskTransformedParameters::getObject() const {
if (insideMultiTransform)
return parentTask->getSubFeature();
else
else if (TransformedView)
return static_cast<PartDesign::Transformed*>(TransformedView->getObject());
else
return nullptr;
}
Part::Feature *TaskTransformedParameters::getBaseObject() const {

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