Merge Fem developer branch
@@ -163,7 +163,6 @@ protected:
|
||||
return Base::Vector3f((float)tmp.x,(float)tmp.y,(float)tmp.z);
|
||||
}
|
||||
|
||||
//Base::Matrix4D _Mtrx;
|
||||
};
|
||||
|
||||
} //namespace App
|
||||
|
||||
@@ -71,6 +71,7 @@ Py::Object ComplexGeoDataPy::getMatrix(void) const
|
||||
return Py::Matrix(getComplexGeoDataPtr()->getTransform());
|
||||
}
|
||||
|
||||
// FIXME would be better to call it setTransform() as in all other interfaces...
|
||||
void ComplexGeoDataPy::setMatrix(Py::Object arg)
|
||||
{
|
||||
PyObject* p = arg.ptr();
|
||||
|
||||
@@ -52,13 +52,6 @@ PROPERTY_SOURCE_TEMPLATE(App::MaterialObjectPython, App::MaterialObject)
|
||||
template<> const char* App::MaterialObjectPython::getViewProviderName(void) const {
|
||||
return "Gui::ViewProviderMaterialObjectPython";
|
||||
}
|
||||
template<> PyObject* App::MaterialObjectPython::getPyObject(void) {
|
||||
if (PythonObject.is(Py::_None())) {
|
||||
// ref counter is set to 1
|
||||
PythonObject = Py::Object(new App::DocumentObjectPy(this),true);
|
||||
}
|
||||
return Py::new_reference_to(PythonObject);
|
||||
}
|
||||
/// @endcond
|
||||
|
||||
// explicit template instantiation
|
||||
|
||||
@@ -667,13 +667,13 @@ PyObject *PropertyIntegerList::getPyObject(void)
|
||||
|
||||
void PropertyIntegerList::setPyObject(PyObject *value)
|
||||
{
|
||||
if (PyList_Check(value)) {
|
||||
Py_ssize_t nSize = PyList_Size(value);
|
||||
if (PySequence_Check(value)) {
|
||||
Py_ssize_t nSize = PySequence_Size(value);
|
||||
std::vector<long> values;
|
||||
values.resize(nSize);
|
||||
|
||||
for (Py_ssize_t i=0; i<nSize;++i) {
|
||||
PyObject* item = PyList_GetItem(value, i);
|
||||
PyObject* item = PySequence_GetItem(value, i);
|
||||
if (!PyInt_Check(item)) {
|
||||
std::string error = std::string("type in list must be int, not ");
|
||||
error += item->ob_type->tp_name;
|
||||
@@ -688,7 +688,7 @@ void PropertyIntegerList::setPyObject(PyObject *value)
|
||||
setValue(PyInt_AsLong(value));
|
||||
}
|
||||
else {
|
||||
std::string error = std::string("type must be int or list of int, not ");
|
||||
std::string error = std::string("type must be int or a sequence of int, not ");
|
||||
error += value->ob_type->tp_name;
|
||||
throw Base::TypeError(error);
|
||||
}
|
||||
|
||||
@@ -1468,6 +1468,9 @@ bool StdCmdToggleNavigation::isActive(void)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#if 0 // old Axis command
|
||||
// Command to show/hide axis cross
|
||||
class StdCmdAxisCross : public Gui::Command
|
||||
{
|
||||
@@ -1549,6 +1552,50 @@ protected:
|
||||
}
|
||||
}
|
||||
};
|
||||
#else
|
||||
//===========================================================================
|
||||
// Std_ViewExample1
|
||||
//===========================================================================
|
||||
DEF_STD_CMD_A(StdCmdAxisCross);
|
||||
|
||||
StdCmdAxisCross::StdCmdAxisCross()
|
||||
: Command("Std_AxisCross")
|
||||
{
|
||||
sGroup = QT_TR_NOOP("Standard-View");
|
||||
sMenuText = QT_TR_NOOP("Toggle axis cross");
|
||||
sToolTipText = QT_TR_NOOP("Toggle axis cross");
|
||||
sStatusTip = QT_TR_NOOP("Toggle axis cross");
|
||||
sWhatsThis = "Std_AxisCross";
|
||||
}
|
||||
|
||||
void StdCmdAxisCross::activated(int iMsg)
|
||||
{
|
||||
Gui::View3DInventor* view = qobject_cast<View3DInventor*>(Gui::getMainWindow()->activeWindow());
|
||||
if (view ){
|
||||
if(view->getViewer()->hasAxisCross()== false)
|
||||
doCommand(Command::Gui,"Gui.ActiveDocument.ActiveView.setAxisCross(True)");
|
||||
else
|
||||
doCommand(Command::Gui,"Gui.ActiveDocument.ActiveView.setAxisCross(False)");
|
||||
}
|
||||
}
|
||||
|
||||
bool StdCmdAxisCross::isActive(void)
|
||||
{
|
||||
Gui::View3DInventor* view = qobject_cast<View3DInventor*>(Gui::getMainWindow()->activeWindow());
|
||||
if (view && view->getViewer()->hasAxisCross()) {
|
||||
if (!_pcAction->isChecked())
|
||||
_pcAction->setChecked(true);
|
||||
}
|
||||
else {
|
||||
if (_pcAction->isChecked())
|
||||
_pcAction->setChecked(false);
|
||||
}
|
||||
if (view ) return true;
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
//===========================================================================
|
||||
// Std_ViewExample1
|
||||
@@ -1556,7 +1603,7 @@ protected:
|
||||
DEF_STD_CMD_A(StdCmdViewExample1);
|
||||
|
||||
StdCmdViewExample1::StdCmdViewExample1()
|
||||
: Command("Std_ViewExample1")
|
||||
: Command("Std_AxisCross")
|
||||
{
|
||||
sGroup = QT_TR_NOOP("Standard-View");
|
||||
sMenuText = QT_TR_NOOP("Inventor example #1");
|
||||
|
||||
@@ -100,6 +100,8 @@
|
||||
#include "SoFCUnifiedSelection.h"
|
||||
#include "SoFCInteractiveElement.h"
|
||||
#include "SoFCBoundingBox.h"
|
||||
#include "SoAxisCrossKit.h"
|
||||
|
||||
#include "Selection.h"
|
||||
#include "SoFCSelectionAction.h"
|
||||
#include "SoFCVectorizeU3DAction.h"
|
||||
@@ -140,7 +142,7 @@ SOQT_OBJECT_ABSTRACT_SOURCE(View3DInventorViewer);
|
||||
View3DInventorViewer::View3DInventorViewer (QWidget *parent, const char *name,
|
||||
SbBool embed, Type type, SbBool build)
|
||||
: inherited (parent, name, embed, type, build), editViewProvider(0), navigation(0),
|
||||
framebuffer(0), editing(FALSE), redirected(FALSE), allowredir(FALSE)
|
||||
framebuffer(0), editing(FALSE), redirected(FALSE), allowredir(FALSE),axisCross(0),axisGroup(0)
|
||||
{
|
||||
Gui::Selection().Attach(this);
|
||||
|
||||
@@ -170,6 +172,18 @@ View3DInventorViewer::View3DInventorViewer (QWidget *parent, const char *name,
|
||||
backgroundroot->ref();
|
||||
this->backgroundroot->addChild(cam);
|
||||
|
||||
//SoShapeHints* pShapeHints = new SoShapeHints;
|
||||
//pShapeHints->shapeType = SoShapeHints::UNKNOWN_SHAPE_TYPE;
|
||||
//pShapeHints->vertexOrdering = SoShapeHints::COUNTERCLOCKWISE;
|
||||
//pShapeHints->ref();
|
||||
//this->backgroundroot->addChild(pShapeHints);
|
||||
|
||||
//SoLightModel* pcLightModel = new SoLightModel();
|
||||
////pcLightModel->model = SoLightModel::PHONG;
|
||||
//pcLightModel->model = SoLightModel::BASE_COLOR;
|
||||
//this->backgroundroot->addChild(pcLightModel);
|
||||
|
||||
|
||||
// Background stuff
|
||||
pcBackGround = new SoFCBackgroundGradient;
|
||||
pcBackGround->ref();
|
||||
@@ -457,6 +471,38 @@ void View3DInventorViewer::setEnabledFPSCounter(bool on)
|
||||
#endif
|
||||
}
|
||||
|
||||
void View3DInventorViewer::setAxisCross(bool b)
|
||||
{
|
||||
SoNode* scene = getSceneGraph();
|
||||
SoSeparator* sep = static_cast<SoSeparator*>(scene);
|
||||
|
||||
if(b){
|
||||
if(!axisGroup){
|
||||
axisCross = new Gui::SoShapeScale;
|
||||
Gui::SoAxisCrossKit* axisKit = new Gui::SoAxisCrossKit();
|
||||
axisKit->set("xAxis.appearance.drawStyle", "lineWidth 2");
|
||||
axisKit->set("yAxis.appearance.drawStyle", "lineWidth 2");
|
||||
axisKit->set("zAxis.appearance.drawStyle", "lineWidth 2");
|
||||
axisCross->setPart("shape", axisKit);
|
||||
axisCross->scaleFactor = 1.0f;
|
||||
axisGroup = new SoSkipBoundingGroup;
|
||||
axisGroup->addChild(axisCross);
|
||||
|
||||
sep->addChild(axisGroup);
|
||||
}
|
||||
}else{
|
||||
if(axisGroup){
|
||||
sep->removeChild(axisGroup);
|
||||
axisGroup = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
bool View3DInventorViewer::hasAxisCross(void)
|
||||
{
|
||||
return axisGroup;
|
||||
}
|
||||
|
||||
|
||||
void View3DInventorViewer::setNavigationType(Base::Type t)
|
||||
{
|
||||
if (t.isBad())
|
||||
|
||||
@@ -48,6 +48,7 @@ class SbBox2s;
|
||||
class SoVectorizeAction;
|
||||
class QGLFramebufferObject;
|
||||
class QImage;
|
||||
class SoGroup;
|
||||
|
||||
namespace Gui {
|
||||
|
||||
@@ -58,6 +59,7 @@ class SoFCUnifiedSelection;
|
||||
class Document;
|
||||
class SoFCUnifiedSelection;
|
||||
class GLGraphicsItem;
|
||||
class SoShapeScale;
|
||||
|
||||
/** The Inventor viewer
|
||||
*
|
||||
@@ -272,6 +274,10 @@ public:
|
||||
const SbColor& midColor);
|
||||
void setEnabledFPSCounter(bool b);
|
||||
void setNavigationType(Base::Type);
|
||||
|
||||
void setAxisCross(bool b);
|
||||
bool hasAxisCross(void);
|
||||
|
||||
NavigationStyle* navigationStyle() const;
|
||||
|
||||
void setDocument(Gui::Document *pcDocument);
|
||||
@@ -304,6 +310,7 @@ private:
|
||||
static void drawArrow(void);
|
||||
void setCursorRepresentation(int mode);
|
||||
|
||||
|
||||
private:
|
||||
std::set<ViewProvider*> _ViewProviderSet;
|
||||
std::map<SoSeparator*,ViewProvider*> _ViewProviderMap;
|
||||
@@ -321,8 +328,13 @@ private:
|
||||
SoFCUnifiedSelection* selectionRoot;
|
||||
QGLFramebufferObject* framebuffer;
|
||||
|
||||
// small axis cross in the corner
|
||||
SbBool axiscrossEnabled;
|
||||
int axiscrossSize;
|
||||
// big one in the middle
|
||||
SoShapeScale* axisCross;
|
||||
SoGroup* axisGroup;
|
||||
|
||||
|
||||
SbBool editing;
|
||||
QCursor editCursor;
|
||||
|
||||
@@ -140,6 +140,9 @@ void View3DInventorPy::init_type()
|
||||
add_varargs_method("listNavigationTypes",&View3DInventorPy::listNavigationTypes,"listNavigationTypes()");
|
||||
add_varargs_method("getNavigationType",&View3DInventorPy::getNavigationType,"getNavigationType()");
|
||||
add_varargs_method("setNavigationType",&View3DInventorPy::setNavigationType,"setNavigationType()");
|
||||
add_varargs_method("setAxisCross",&View3DInventorPy::setAxisCross,"switch the big axis-cross on and off");
|
||||
add_varargs_method("hasAxisCross",&View3DInventorPy::hasAxisCross,"check if the big axis-cross is on or off()");
|
||||
|
||||
}
|
||||
|
||||
View3DInventorPy::View3DInventorPy(View3DInventor *vi)
|
||||
@@ -2047,3 +2050,20 @@ Py::Object View3DInventorPy::removeEventCallbackPivy(const Py::Tuple& args)
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
Py::Object View3DInventorPy::setAxisCross(const Py::Tuple& args)
|
||||
{
|
||||
int ok;
|
||||
if (!PyArg_ParseTuple(args.ptr(), "i", &ok))
|
||||
throw Py::Exception();
|
||||
_view->getViewer()->setAxisCross(ok!=0);
|
||||
return Py::None();
|
||||
}
|
||||
|
||||
Py::Object View3DInventorPy::hasAxisCross(const Py::Tuple& args)
|
||||
{
|
||||
if (!PyArg_ParseTuple(args.ptr(), ""))
|
||||
throw Py::Exception();
|
||||
SbBool ok = _view->getViewer()->hasAxisCross();
|
||||
return Py::Boolean(ok ? true : false);
|
||||
}
|
||||
@@ -93,6 +93,8 @@ public:
|
||||
Py::Object listNavigationTypes(const Py::Tuple&);
|
||||
Py::Object getNavigationType(const Py::Tuple&);
|
||||
Py::Object setNavigationType(const Py::Tuple&);
|
||||
Py::Object setAxisCross(const Py::Tuple&);
|
||||
Py::Object hasAxisCross(const Py::Tuple&);
|
||||
|
||||
private:
|
||||
static void eventCallback(void * ud, SoEventCallback * n);
|
||||
|
||||
@@ -383,6 +383,41 @@ bool ViewProviderPythonFeatureImp::unsetEdit(int ModNum)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ViewProviderPythonFeatureImp::doubleClicked(void)
|
||||
{
|
||||
// Run the onChanged method of the proxy object.
|
||||
Base::PyGILStateLocker lock;
|
||||
try {
|
||||
App::Property* proxy = object->getPropertyByName("Proxy");
|
||||
if (proxy && proxy->getTypeId() == App::PropertyPythonObject::getClassTypeId()) {
|
||||
Py::Object vp = static_cast<App::PropertyPythonObject*>(proxy)->getValue();
|
||||
if (vp.hasAttr(std::string("doubleClicked"))) {
|
||||
if (vp.hasAttr("__object__")) {
|
||||
Py::Callable method(vp.getAttr(std::string("doubleClicked")));
|
||||
Py::Tuple args;
|
||||
//args.setItem(0, Py::Int(ModNum));
|
||||
Py::Boolean ok(method.apply(args));
|
||||
return (bool)ok;
|
||||
}
|
||||
else {
|
||||
Py::Callable method(vp.getAttr(std::string("doubleClicked")));
|
||||
Py::Tuple args(1);
|
||||
args.setItem(0, Py::Object(object->getPyObject(), true));
|
||||
Py::Boolean ok(method.apply(args));
|
||||
return (bool)ok;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Py::Exception&) {
|
||||
Base::PyException e; // extract the Python error text
|
||||
e.ReportException();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
void ViewProviderPythonFeatureImp::attach(App::DocumentObject *pcObject)
|
||||
{
|
||||
// Run the attach method of the proxy object.
|
||||
|
||||
@@ -52,6 +52,7 @@ public:
|
||||
std::vector<Base::Vector3d> getSelectionShape(const char* Element) const;
|
||||
bool setEdit(int ModNum);
|
||||
bool unsetEdit(int ModNum);
|
||||
bool doubleClicked(void);
|
||||
|
||||
/** @name Update data methods*/
|
||||
//@{
|
||||
@@ -308,6 +309,15 @@ protected:
|
||||
if (!ok) ViewProviderT::unsetEdit(ModNum);
|
||||
}
|
||||
|
||||
virtual bool doubleClicked(void)
|
||||
{
|
||||
bool ok = imp->doubleClicked();
|
||||
if (!ok)
|
||||
return ViewProviderT::doubleClicked();
|
||||
else
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
ViewProviderPythonFeatureImp* imp;
|
||||
App::DynamicProperty *props;
|
||||
|
||||
@@ -19,7 +19,6 @@ ELSE(EIGEN3_FOUND)
|
||||
MESSAGE("Due to the missing Eigen3 library the Sketcher module won't be built")
|
||||
MESSAGE("Due to the missing Eigen3 library the Robot module won't be built")
|
||||
ENDIF(EIGEN3_FOUND)
|
||||
add_subdirectory(Machining_Distortion)
|
||||
|
||||
add_subdirectory(ReverseEngineering)
|
||||
add_subdirectory(MeshPart)
|
||||
|
||||
@@ -114,6 +114,7 @@ void AppFemExport initFem()
|
||||
// This function is responsible for adding inherited slots from a type's base class.
|
||||
|
||||
Fem::FemAnalysis ::init();
|
||||
Fem::FemAnalysisPython ::init();
|
||||
Fem::FemMesh ::init();
|
||||
Fem::FemMeshObject ::init();
|
||||
Fem::FemMeshShapeObject ::init();
|
||||
|
||||
@@ -28,7 +28,6 @@ link_directories(${OCC_LIBRARY_DIR})
|
||||
if(FREECAD_BUILD_FEM_NETGEN)
|
||||
set(Fem_LIBS
|
||||
Part
|
||||
Mesh
|
||||
FreeCADApp
|
||||
StdMeshers
|
||||
NETGENPlugin
|
||||
@@ -37,7 +36,6 @@ if(FREECAD_BUILD_FEM_NETGEN)
|
||||
else(FREECAD_BUILD_FEM_NETGEN)
|
||||
set(Fem_LIBS
|
||||
Part
|
||||
Mesh
|
||||
FreeCADApp
|
||||
StdMeshers
|
||||
SMESH
|
||||
@@ -132,7 +130,10 @@ fc_target_copy_resource(Fem
|
||||
${Driver_Resources}
|
||||
Init.py
|
||||
convert2TetGen.py
|
||||
FemLib.py)
|
||||
FemLib.py
|
||||
MechanicalAnalysis.py
|
||||
MechanicalMaterial.py
|
||||
)
|
||||
|
||||
|
||||
if(MSVC)
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include "FemAnalysis.h"
|
||||
#include <App/DocumentObjectPy.h>
|
||||
#include <Base/Placement.h>
|
||||
#include <Base/Uuid.h>
|
||||
|
||||
using namespace Fem;
|
||||
using namespace App;
|
||||
@@ -38,7 +39,9 @@ PROPERTY_SOURCE(Fem::FemAnalysis, App::DocumentObject)
|
||||
|
||||
FemAnalysis::FemAnalysis()
|
||||
{
|
||||
Base::Uuid id;
|
||||
ADD_PROPERTY_TYPE(Member,(0), "Analysis member",Prop_None,"All objects belonging to the Analysis");
|
||||
ADD_PROPERTY_TYPE(Uid,(id),0,App::Prop_None,"UUID of the Analysis");
|
||||
}
|
||||
|
||||
FemAnalysis::~FemAnalysis()
|
||||
@@ -63,3 +66,26 @@ void FemAnalysis::onChanged(const Property* prop)
|
||||
{
|
||||
App::DocumentObject::onChanged(prop);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Python feature ---------------------------------------------------------
|
||||
|
||||
namespace App {
|
||||
/// @cond DOXERR
|
||||
PROPERTY_SOURCE_TEMPLATE(Fem::FemAnalysisPython, Fem::FemAnalysis)
|
||||
template<> const char* Fem::FemAnalysisPython::getViewProviderName(void) const {
|
||||
return "FemGui::ViewProviderFemAnalysisPython";
|
||||
}
|
||||
//template<> PyObject* Fem::FemAnalysisPython::getPyObject(void) {
|
||||
// if (PythonObject.is(Py::_None())) {
|
||||
// // ref counter is set to 1
|
||||
// PythonObject = Py::Object(new App::DocumentObjectPy(this),true);
|
||||
// }
|
||||
// return Py::new_reference_to(PythonObject);
|
||||
//}
|
||||
/// @endcond
|
||||
|
||||
// explicit template instantiation
|
||||
template class AppFemExport FeaturePythonT<Fem::FemAnalysis>;
|
||||
}
|
||||
@@ -27,6 +27,8 @@
|
||||
|
||||
#include <App/DocumentObject.h>
|
||||
#include <App/PropertyLinks.h>
|
||||
#include <App/FeaturePython.h>
|
||||
|
||||
|
||||
|
||||
namespace Fem
|
||||
@@ -51,13 +53,20 @@ public:
|
||||
virtual short mustExecute(void) const;
|
||||
virtual PyObject *getPyObject(void);
|
||||
|
||||
/// Member objects of the Analysis
|
||||
App::PropertyLinkList Member;
|
||||
/// unique identifier of the Analysis
|
||||
App::PropertyUUID Uid;
|
||||
|
||||
|
||||
protected:
|
||||
/// get called by the container when a property has changed
|
||||
virtual void onChanged (const App::Property* prop);
|
||||
};
|
||||
|
||||
typedef App::FeaturePythonT<FemAnalysis> FemAnalysisPython;
|
||||
|
||||
|
||||
} //namespace Fem
|
||||
|
||||
|
||||
|
||||
@@ -125,6 +125,8 @@ void FemMesh::copyMeshData(const FemMesh& mesh)
|
||||
//int numPris = info.NbPrisms();
|
||||
//int numHedr = info.NbPolyhedrons();
|
||||
|
||||
_Mtrx = mesh._Mtrx;
|
||||
|
||||
SMESHDS_Mesh* meshds = this->myMesh->GetMeshDS();
|
||||
meshds->ClearMesh();
|
||||
|
||||
@@ -415,6 +417,8 @@ void FemMesh::readNastran(const std::string &Filename)
|
||||
Base::TimeInfo Start;
|
||||
Base::Console().Log("Start: FemMesh::readNastran() =================================\n");
|
||||
|
||||
_Mtrx = Base::Matrix4D();
|
||||
|
||||
std::ifstream inputfile;
|
||||
inputfile.open(Filename.c_str());
|
||||
inputfile.seekg(std::ifstream::beg);
|
||||
@@ -575,6 +579,7 @@ void FemMesh::readNastran(const std::string &Filename)
|
||||
void FemMesh::read(const char *FileName)
|
||||
{
|
||||
Base::FileInfo File(FileName);
|
||||
_Mtrx = Base::Matrix4D();
|
||||
|
||||
// checking on the file
|
||||
if (!File.isReadable())
|
||||
@@ -604,7 +609,7 @@ void FemMesh::read(const char *FileName)
|
||||
}
|
||||
}
|
||||
|
||||
void FemMesh::writeABAQUS(const std::string &Filename, Base::Placement* placement) const
|
||||
void FemMesh::writeABAQUS(const std::string &Filename) const
|
||||
{
|
||||
std::ofstream anABAQUS_Output;
|
||||
anABAQUS_Output.open(Filename.c_str());
|
||||
@@ -612,29 +617,16 @@ void FemMesh::writeABAQUS(const std::string &Filename, Base::Placement* placemen
|
||||
|
||||
//Extract Nodes and Elements of the current SMESH datastructure
|
||||
SMDS_NodeIteratorPtr aNodeIter = myMesh->GetMeshDS()->nodesIterator();
|
||||
if (placement)
|
||||
{
|
||||
Base::Vector3d current_node;
|
||||
Base::Matrix4D matrix = placement->toMatrix();
|
||||
for (;aNodeIter->more();) {
|
||||
const SMDS_MeshNode* aNode = aNodeIter->next();
|
||||
current_node.Set(aNode->X(),aNode->Y(),aNode->Z());
|
||||
current_node = matrix * current_node;
|
||||
anABAQUS_Output << aNode->GetID() << ","
|
||||
<< current_node.x << ","
|
||||
<< current_node.y << ","
|
||||
<< current_node.z << std::endl;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (;aNodeIter->more();) {
|
||||
const SMDS_MeshNode* aNode = aNodeIter->next();
|
||||
anABAQUS_Output << aNode->GetID() << ","
|
||||
<< aNode->X() << ","
|
||||
<< aNode->Y() << ","
|
||||
<< aNode->Z() << std::endl;
|
||||
}
|
||||
|
||||
Base::Vector3d current_node;
|
||||
for (;aNodeIter->more();) {
|
||||
const SMDS_MeshNode* aNode = aNodeIter->next();
|
||||
current_node.Set(aNode->X(),aNode->Y(),aNode->Z());
|
||||
current_node = _Mtrx * current_node;
|
||||
anABAQUS_Output << aNode->GetID() << ","
|
||||
<< current_node.x << ","
|
||||
<< current_node.y << ","
|
||||
<< current_node.z << std::endl;
|
||||
}
|
||||
|
||||
anABAQUS_Output << "*Element, TYPE=C3D10, ELSET=Eall" << std::endl;
|
||||
@@ -650,19 +642,10 @@ void FemMesh::writeABAQUS(const std::string &Filename, Base::Placement* placemen
|
||||
//I absolute dont understand the scheme behind it but somehow its working like this
|
||||
apair.first = aVol->GetID();
|
||||
apair.second.clear();
|
||||
//apair.second.push_back(aVol->GetNode(0)->GetID());
|
||||
//apair.second.push_back(aVol->GetNode(2)->GetID());
|
||||
//apair.second.push_back(aVol->GetNode(1)->GetID());
|
||||
//apair.second.push_back(aVol->GetNode(3)->GetID());
|
||||
//apair.second.push_back(aVol->GetNode(6)->GetID());
|
||||
//apair.second.push_back(aVol->GetNode(5)->GetID());
|
||||
//apair.second.push_back(aVol->GetNode(4)->GetID());
|
||||
//apair.second.push_back(aVol->GetNode(8)->GetID());
|
||||
//apair.second.push_back(aVol->GetNode(9)->GetID());
|
||||
//apair.second.push_back(aVol->GetNode(7)->GetID());
|
||||
|
||||
//Neuer Versuch
|
||||
apair.second.push_back(aVol->GetNode(1)->GetID());
|
||||
apair.second.push_back(aVol->GetNode(2)->GetID());
|
||||
apair.second.push_back(aVol->GetNode(0)->GetID());
|
||||
apair.second.push_back(aVol->GetNode(2)->GetID());
|
||||
apair.second.push_back(aVol->GetNode(3)->GetID());
|
||||
apair.second.push_back(aVol->GetNode(4)->GetID());
|
||||
@@ -671,7 +654,8 @@ void FemMesh::writeABAQUS(const std::string &Filename, Base::Placement* placemen
|
||||
apair.second.push_back(aVol->GetNode(8)->GetID());
|
||||
apair.second.push_back(aVol->GetNode(7)->GetID());
|
||||
apair.second.push_back(aVol->GetNode(9)->GetID());
|
||||
temp_map.insert(apair);
|
||||
|
||||
temp_map.insert(apair);
|
||||
}
|
||||
|
||||
std::map<int,std::vector<int> >::iterator it_map;
|
||||
@@ -725,10 +709,49 @@ unsigned int FemMesh::getMemSize (void) const
|
||||
|
||||
void FemMesh::Save (Base::Writer &writer) const
|
||||
{
|
||||
//See SaveDocFile(), RestoreDocFile()
|
||||
writer.Stream() << writer.ind() << "<FemMesh file=\"" ;
|
||||
writer.Stream() << writer.addFile("FemMesh.unv", this) << "\"";
|
||||
writer.Stream() << " a11=\"" << _Mtrx[0][0] << "\" a12=\"" << _Mtrx[0][1] << "\" a13=\"" << _Mtrx[0][2] << "\" a14=\"" << _Mtrx[0][3] << "\"";
|
||||
writer.Stream() << " a21=\"" << _Mtrx[1][0] << "\" a22=\"" << _Mtrx[1][1] << "\" a23=\"" << _Mtrx[1][2] << "\" a24=\"" << _Mtrx[1][3] << "\"";
|
||||
writer.Stream() << " a31=\"" << _Mtrx[2][0] << "\" a32=\"" << _Mtrx[2][1] << "\" a33=\"" << _Mtrx[2][2] << "\" a34=\"" << _Mtrx[2][3] << "\"";
|
||||
writer.Stream() << " a41=\"" << _Mtrx[3][0] << "\" a42=\"" << _Mtrx[3][1] << "\" a43=\"" << _Mtrx[3][2] << "\" a44=\"" << _Mtrx[3][3] << "\"";
|
||||
writer.Stream() << "/>" << std::endl;
|
||||
|
||||
|
||||
}
|
||||
|
||||
void FemMesh::Restore(Base::XMLReader &reader)
|
||||
{
|
||||
|
||||
reader.readElement("FemMesh");
|
||||
std::string file (reader.getAttribute("file") );
|
||||
|
||||
if (!file.empty()) {
|
||||
// initate a file read
|
||||
reader.addFile(file.c_str(),this);
|
||||
}
|
||||
if( reader.hasAttribute("a11")){
|
||||
_Mtrx[0][0] = (float)reader.getAttributeAsFloat("a11");
|
||||
_Mtrx[0][1] = (float)reader.getAttributeAsFloat("a12");
|
||||
_Mtrx[0][2] = (float)reader.getAttributeAsFloat("a13");
|
||||
_Mtrx[0][3] = (float)reader.getAttributeAsFloat("a14");
|
||||
|
||||
_Mtrx[1][0] = (float)reader.getAttributeAsFloat("a21");
|
||||
_Mtrx[1][1] = (float)reader.getAttributeAsFloat("a22");
|
||||
_Mtrx[1][2] = (float)reader.getAttributeAsFloat("a23");
|
||||
_Mtrx[1][3] = (float)reader.getAttributeAsFloat("a24");
|
||||
|
||||
_Mtrx[2][0] = (float)reader.getAttributeAsFloat("a31");
|
||||
_Mtrx[2][1] = (float)reader.getAttributeAsFloat("a32");
|
||||
_Mtrx[2][2] = (float)reader.getAttributeAsFloat("a33");
|
||||
_Mtrx[2][3] = (float)reader.getAttributeAsFloat("a34");
|
||||
|
||||
_Mtrx[3][0] = (float)reader.getAttributeAsFloat("a41");
|
||||
_Mtrx[3][1] = (float)reader.getAttributeAsFloat("a42");
|
||||
_Mtrx[3][2] = (float)reader.getAttributeAsFloat("a43");
|
||||
_Mtrx[3][3] = (float)reader.getAttributeAsFloat("a44");
|
||||
}
|
||||
}
|
||||
|
||||
void FemMesh::SaveDocFile (Base::Writer &writer) const
|
||||
@@ -795,34 +818,28 @@ void FemMesh::transformGeometry(const Base::Matrix4D& rclTrf)
|
||||
void FemMesh::setTransform(const Base::Matrix4D& rclTrf)
|
||||
{
|
||||
// Placement handling, no geometric transformation
|
||||
_Mtrx = rclTrf;
|
||||
}
|
||||
|
||||
Base::Matrix4D FemMesh::getTransform(void) const
|
||||
{
|
||||
Base::Matrix4D mtrx;
|
||||
return mtrx;
|
||||
return _Mtrx;
|
||||
}
|
||||
|
||||
Base::BoundBox3d FemMesh::getBoundBox(void) const
|
||||
{
|
||||
Base::BoundBox3d box;
|
||||
try {
|
||||
// If the shape is empty an exception may be thrown
|
||||
Bnd_Box bounds;
|
||||
BRepBndLib::Add(myMesh->GetShapeToMesh(), bounds);
|
||||
bounds.SetGap(0.0);
|
||||
Standard_Real xMin, yMin, zMin, xMax, yMax, zMax;
|
||||
bounds.Get(xMin, yMin, zMin, xMax, yMax, zMax);
|
||||
|
||||
box.MinX = xMin;
|
||||
box.MaxX = xMax;
|
||||
box.MinY = yMin;
|
||||
box.MaxY = yMax;
|
||||
box.MinZ = zMin;
|
||||
box.MaxZ = zMax;
|
||||
}
|
||||
catch (Standard_Failure) {
|
||||
}
|
||||
SMESHDS_Mesh* data = const_cast<SMESH_Mesh*>(getSMesh())->GetMeshDS();
|
||||
|
||||
SMDS_NodeIteratorPtr aNodeIter = data->nodesIterator();
|
||||
for (;aNodeIter->more();) {
|
||||
const SMDS_MeshNode* aNode = aNodeIter->next();
|
||||
Base::Vector3d vec(aNode->X(),aNode->Y(),aNode->Z());
|
||||
// Apply the matrix to hold the BoundBox in absolute space.
|
||||
vec = _Mtrx * vec;
|
||||
box.Add(vec);
|
||||
}
|
||||
|
||||
return box;
|
||||
}
|
||||
@@ -852,3 +869,25 @@ Data::Segment* FemMesh::getSubElement(const char* Type, unsigned long n) const
|
||||
//return new ShapeSegment(getSubShape(temp.c_str()));
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct Fem::FemMesh::FemMeshInfo FemMesh::getInfo(void) const{
|
||||
|
||||
struct FemMeshInfo rtrn;
|
||||
|
||||
SMESHDS_Mesh* data = const_cast<SMESH_Mesh*>(getSMesh())->GetMeshDS();
|
||||
const SMDS_MeshInfo& info = data->GetMeshInfo();
|
||||
rtrn.numFaces = data->NbFaces();
|
||||
rtrn.numNode = info.NbNodes();
|
||||
rtrn.numTria = info.NbTriangles();
|
||||
rtrn.numQuad = info.NbQuadrangles();
|
||||
rtrn.numPoly = info.NbPolygons();
|
||||
rtrn.numVolu = info.NbVolumes();
|
||||
rtrn.numTetr = info.NbTetras();
|
||||
rtrn.numHexa = info.NbHexas();
|
||||
rtrn.numPyrd = info.NbPyramids();
|
||||
rtrn.numPris = info.NbPrisms();
|
||||
rtrn.numHedr = info.NbPolyhedrons();
|
||||
|
||||
return rtrn;
|
||||
|
||||
}
|
||||
@@ -104,16 +104,35 @@ public:
|
||||
void transformGeometry(const Base::Matrix4D &rclMat);
|
||||
//@}
|
||||
|
||||
struct FemMeshInfo {
|
||||
int numFaces;
|
||||
int numNode;
|
||||
int numTria;
|
||||
int numQuad;
|
||||
int numPoly;
|
||||
int numVolu;
|
||||
int numTetr;
|
||||
int numHexa;
|
||||
int numPyrd;
|
||||
int numPris;
|
||||
int numHedr;
|
||||
};
|
||||
|
||||
///
|
||||
struct FemMeshInfo getInfo(void) const;
|
||||
|
||||
/// import from files
|
||||
void read(const char *FileName);
|
||||
void write(const char *FileName) const;
|
||||
void writeABAQUS(const std::string &Filename, Base::Placement* = 0) const;
|
||||
void writeABAQUS(const std::string &Filename) const;
|
||||
|
||||
private:
|
||||
void copyMeshData(const FemMesh&);
|
||||
void readNastran(const std::string &Filename);
|
||||
|
||||
private:
|
||||
/// positioning matrix
|
||||
Base::Matrix4D _Mtrx;
|
||||
SMESH_Gen *myGen;
|
||||
SMESH_Mesh *myMesh;
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#endif
|
||||
|
||||
#include "FemMeshObject.h"
|
||||
#include "FemMesh.h"
|
||||
#include <App/DocumentObjectPy.h>
|
||||
#include <Base/Placement.h>
|
||||
|
||||
@@ -62,4 +63,10 @@ PyObject *FemMeshObject::getPyObject()
|
||||
void FemMeshObject::onChanged(const Property* prop)
|
||||
{
|
||||
App::GeoFeature::onChanged(prop);
|
||||
|
||||
// if the placement has changed apply the change to the mesh data as well
|
||||
if (prop == &this->Placement) {
|
||||
const_cast<Fem::FemMesh&>(this->FemMesh.getValue()).setTransform(this->Placement.getValue().toMatrix());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -138,23 +138,12 @@ unsigned int PropertyFemMesh::getMemSize (void) const
|
||||
|
||||
void PropertyFemMesh::Save (Base::Writer &writer) const
|
||||
{
|
||||
if (!writer.isForceXML()) {
|
||||
//See SaveDocFile(), RestoreDocFile()
|
||||
writer.Stream() << writer.ind() << "<FemMesh file=\""
|
||||
<< writer.addFile("FemMesh.unv", this)
|
||||
<< "\"/>" << std::endl;
|
||||
}
|
||||
_FemMesh->Save(writer);
|
||||
}
|
||||
|
||||
void PropertyFemMesh::Restore(Base::XMLReader &reader)
|
||||
{
|
||||
reader.readElement("FemMesh");
|
||||
std::string file (reader.getAttribute("file") );
|
||||
|
||||
if (!file.empty()) {
|
||||
// initate a file read
|
||||
reader.addFile(file.c_str(),this);
|
||||
}
|
||||
_FemMesh->Restore(reader);
|
||||
}
|
||||
|
||||
void PropertyFemMesh::SaveDocFile (Base::Writer &writer) const
|
||||
|
||||
@@ -78,19 +78,30 @@
|
||||
<Documentation>
|
||||
<UserDocu>Use a Placement object to perform a translation or rotation</UserDocu>
|
||||
</Documentation>
|
||||
</Methode>
|
||||
<Methode Name="copy">
|
||||
<Documentation>
|
||||
<UserDocu>Make a copy of this FEM mesh.</UserDocu>
|
||||
</Documentation>
|
||||
</Methode>
|
||||
<Attribute Name="NodeCount" ReadOnly="true">
|
||||
<Documentation>
|
||||
<UserDocu>Number of nodes in the Mesh.</UserDocu>
|
||||
</Documentation>
|
||||
<Parameter Name="NodeCount" Type="Int"/>
|
||||
</Attribute>
|
||||
<Attribute Name="EdgeCount" ReadOnly="true">
|
||||
</Methode>
|
||||
<Methode Name="copy">
|
||||
<Documentation>
|
||||
<UserDocu>Make a copy of this FEM mesh.</UserDocu>
|
||||
</Documentation>
|
||||
</Methode>
|
||||
<Methode Name="getNodeById">
|
||||
<Documentation>
|
||||
<UserDocu>Get the node position vector by an Node-ID</UserDocu>
|
||||
</Documentation>
|
||||
</Methode>
|
||||
<Attribute Name="Nodes" ReadOnly="true">
|
||||
<Documentation>
|
||||
<UserDocu>Dictionary of Nodes by ID (int ID:Vector())</UserDocu>
|
||||
</Documentation>
|
||||
<Parameter Name="Nodes" Type="Dict"/>
|
||||
</Attribute>
|
||||
<Attribute Name="NodeCount" ReadOnly="true">
|
||||
<Documentation>
|
||||
<UserDocu>Number of nodes in the Mesh.</UserDocu>
|
||||
</Documentation>
|
||||
<Parameter Name="NodeCount" Type="Int"/>
|
||||
</Attribute>
|
||||
<Attribute Name="EdgeCount" ReadOnly="true">
|
||||
<Documentation>
|
||||
<UserDocu>Number of edges in the Mesh.</UserDocu>
|
||||
</Documentation>
|
||||
|
||||
@@ -63,9 +63,38 @@ PyObject *FemMeshPy::PyMake(struct _typeobject *, PyObject *, PyObject *) // Py
|
||||
// constructor method
|
||||
int FemMeshPy::PyInit(PyObject* args, PyObject* /*kwd*/)
|
||||
{
|
||||
PyObject *pcObj=0;
|
||||
if (!PyArg_ParseTuple(args, "|O", &pcObj)) // convert args: Python->C
|
||||
return -1; // NULL triggers exception
|
||||
|
||||
try {
|
||||
// if no mesh is given
|
||||
if (!pcObj) return 0;
|
||||
if (PyObject_TypeCheck(pcObj, &(FemMeshPy::Type))) {
|
||||
getFemMeshPtr()->operator= (*static_cast<FemMeshPy*>(pcObj)->getFemMeshPtr());
|
||||
}
|
||||
else {
|
||||
PyErr_Format(PyExc_TypeError, "Cannot create a FemMesh out of a '%s'",
|
||||
pcObj->ob_type->tp_name);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
catch (const Base::Exception &e) {
|
||||
PyErr_SetString(PyExc_Exception,e.what());
|
||||
return -1;
|
||||
}
|
||||
catch (const std::exception &e) {
|
||||
PyErr_SetString(PyExc_Exception,e.what());
|
||||
return -1;
|
||||
}
|
||||
catch (const Py::Exception&) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// ===== Methods ============================================================
|
||||
|
||||
PyObject* FemMeshPy::setShape(PyObject *args)
|
||||
@@ -400,17 +429,11 @@ PyObject* FemMeshPy::write(PyObject *args)
|
||||
PyObject* FemMeshPy::writeABAQUS(PyObject *args)
|
||||
{
|
||||
char* filename;
|
||||
PyObject* plm=0;
|
||||
if (!PyArg_ParseTuple(args, "s|O!", &filename, &(Base::PlacementPy::Type),&plm))
|
||||
if (!PyArg_ParseTuple(args, "s", &filename))
|
||||
return 0;
|
||||
|
||||
try {
|
||||
Base::Placement* placement = 0;
|
||||
if (plm) {
|
||||
placement = static_cast<Base::PlacementPy*>(plm)->getPlacementPtr();
|
||||
}
|
||||
|
||||
getFemMeshPtr()->writeABAQUS(filename, placement);
|
||||
getFemMeshPtr()->writeABAQUS(filename);
|
||||
}
|
||||
catch (const std::exception& e) {
|
||||
PyErr_SetString(PyExc_Exception, e.what());
|
||||
@@ -437,8 +460,51 @@ PyObject* FemMeshPy::setTransform(PyObject *args)
|
||||
Py_Return;
|
||||
}
|
||||
|
||||
PyObject* FemMeshPy::getNodeById(PyObject *args)
|
||||
{
|
||||
int id;
|
||||
if (!PyArg_ParseTuple(args, "i", &id))
|
||||
return 0;
|
||||
|
||||
Base::Matrix4D Mtrx = getFemMeshPtr()->getTransform();
|
||||
const SMDS_MeshNode* aNode = getFemMeshPtr()->getSMesh()->GetMeshDS()->FindNode(id);
|
||||
|
||||
if(aNode){
|
||||
Base::Vector3d vec(aNode->X(),aNode->Y(),aNode->Z());
|
||||
vec = Mtrx * vec;
|
||||
return new Base::VectorPy( vec );
|
||||
}else{
|
||||
PyErr_SetString(PyExc_Exception, "No valid ID");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ===== Atributes ============================================================
|
||||
|
||||
Py::Dict FemMeshPy::getNodes(void) const
|
||||
{
|
||||
//int count = getFemMeshPtr()->getSMesh()->GetMeshDS()->NbNodes();
|
||||
//Py::Tuple tup(count);
|
||||
Py::Dict dict;
|
||||
|
||||
// get the actuall transform of the FemMesh
|
||||
Base::Matrix4D Mtrx = getFemMeshPtr()->getTransform();
|
||||
|
||||
SMDS_NodeIteratorPtr aNodeIter = getFemMeshPtr()->getSMesh()->GetMeshDS()->nodesIterator();
|
||||
for (int i=0;aNodeIter->more();i++) {
|
||||
const SMDS_MeshNode* aNode = aNodeIter->next();
|
||||
Base::Vector3d vec(aNode->X(),aNode->Y(),aNode->Z());
|
||||
// Apply the matrix to hold the BoundBox in absolute space.
|
||||
vec = Mtrx * vec;
|
||||
int id = aNode->GetID();
|
||||
|
||||
dict[Py::Int(id)] = Py::asObject(new Base::VectorPy( vec ));
|
||||
}
|
||||
|
||||
return dict;
|
||||
}
|
||||
|
||||
Py::Int FemMeshPy::getNodeCount(void) const
|
||||
{
|
||||
return Py::Int(getFemMeshPtr()->getSMesh()->NbNodes());
|
||||
|
||||
@@ -154,7 +154,7 @@ App::DocumentObjectExecReturn *FemMeshShapeNetgenObject::execute(void)
|
||||
// return Py::new_reference_to(PythonObject);
|
||||
//}
|
||||
|
||||
void FemMeshShapeNetgenObject::onChanged(const Property* prop)
|
||||
{
|
||||
App::GeoFeature::onChanged(prop);
|
||||
}
|
||||
//void FemMeshShapeNetgenObject::onChanged(const Property* prop)
|
||||
//{
|
||||
// Fem::FemMeshShapeObject::onChanged(prop);
|
||||
//}
|
||||
|
||||
@@ -62,7 +62,7 @@ public:
|
||||
|
||||
protected:
|
||||
/// get called by the container when a property has changed
|
||||
virtual void onChanged (const App::Property* prop);
|
||||
//virtual void onChanged (const App::Property* prop);
|
||||
};
|
||||
|
||||
} //namespace Fem
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2013 - Juergen Riegel <FreeCAD@juergen-riegel.net> *
|
||||
#* *
|
||||
#* This program is free software; you can redistribute it and/or modify *
|
||||
#* it under the terms of the GNU Lesser General Public License (LGPL) *
|
||||
#* as published by the Free Software Foundation; either version 2 of *
|
||||
#* the License, or (at your option) any later version. *
|
||||
#* for detail see the LICENCE text file. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
def DebugLoad():
|
||||
import MechanicalAnalysis,MechanicalMaterial
|
||||
reload(MechanicalAnalysis)
|
||||
reload(MechanicalMaterial)
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#endif
|
||||
|
||||
#include <Base/Console.h>
|
||||
#include <Base/Interpreter.h>
|
||||
#include <Gui/Application.h>
|
||||
#include <Gui/Language/Translator.h>
|
||||
#include "ViewProviderFemMesh.h"
|
||||
@@ -77,7 +78,8 @@ void FemGuiExport initFemGui()
|
||||
|
||||
// addition objects
|
||||
FemGui::Workbench ::init();
|
||||
FemGui::ViewProviderAnalysis ::init();
|
||||
FemGui::ViewProviderFemAnalysis ::init();
|
||||
FemGui::ViewProviderFemAnalysisPython ::init();
|
||||
FemGui::ViewProviderFemMesh ::init();
|
||||
FemGui::ViewProviderFemMeshShape ::init();
|
||||
FemGui::ViewProviderFemMeshShapeNetgen ::init();
|
||||
@@ -92,6 +94,12 @@ void FemGuiExport initFemGui()
|
||||
FemGui::ViewProviderFemConstraintGear ::init();
|
||||
FemGui::ViewProviderFemConstraintPulley ::init();
|
||||
|
||||
Base::Interpreter().loadModule("MechanicalAnalysis");
|
||||
Base::Interpreter().loadModule("MechanicalMaterial");
|
||||
|
||||
Base::Interpreter().loadModule("FemLib");
|
||||
|
||||
|
||||
// add resources and reloads the translators
|
||||
loadFemResource();
|
||||
}
|
||||
|
||||
@@ -24,10 +24,21 @@ include_directories(
|
||||
|
||||
link_directories(${OCC_LIBRARY_DIR})
|
||||
|
||||
|
||||
|
||||
set(FemGui_LIBS
|
||||
Fem
|
||||
FreeCADGui
|
||||
)
|
||||
|
||||
generate_from_xml(ViewProviderFemMeshPy)
|
||||
|
||||
SET(Python_SRCS
|
||||
ViewProviderFemMeshPy.xml
|
||||
ViewProviderFemMeshPyImp.cpp
|
||||
)
|
||||
SOURCE_GROUP("Python" FILES ${Python_SRCS})
|
||||
|
||||
|
||||
set(FemGui_MOC_HDRS
|
||||
Hypothesis.h
|
||||
@@ -167,6 +178,7 @@ SET(FemGui_SRCS_Module
|
||||
SOURCE_GROUP("Module" FILES ${FemGui_SRCS_Module})
|
||||
|
||||
SET(FemGui_SRCS
|
||||
${Python_SRCS}
|
||||
${FemGui_DLG_SRCS}
|
||||
${FemResource_SRCS}
|
||||
${FemGui_SRCS_ViewProvider}
|
||||
@@ -183,7 +195,10 @@ target_link_libraries(FemGui ${FemGui_LIBS})
|
||||
fc_target_copy_resource(FemGui
|
||||
${CMAKE_SOURCE_DIR}/src/Mod/Fem
|
||||
${CMAKE_BINARY_DIR}/Mod/Fem
|
||||
InitGui.py)
|
||||
InitGui.py
|
||||
MechanicalMaterial.ui
|
||||
MechanicalAnalysis.ui
|
||||
)
|
||||
|
||||
if(MSVC)
|
||||
set_target_properties(FemGui PROPERTIES SUFFIX ".pyd")
|
||||
|
||||
@@ -121,7 +121,7 @@ CmdFemCreateAnalysis::CmdFemCreateAnalysis()
|
||||
sToolTipText = QT_TR_NOOP("Create a FEM analysis");
|
||||
sWhatsThis = sToolTipText;
|
||||
sStatusTip = sToolTipText;
|
||||
sPixmap = "Fem_FemMesh";
|
||||
sPixmap = "Fem_Analysis";
|
||||
}
|
||||
|
||||
void CmdFemCreateAnalysis::activated(int iMsg)
|
||||
@@ -166,6 +166,70 @@ void CmdFemCreateAnalysis::activated(int iMsg)
|
||||
}
|
||||
|
||||
bool CmdFemCreateAnalysis::isActive(void)
|
||||
{
|
||||
return !ActiveAnalysis;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//=====================================================================================
|
||||
DEF_STD_CMD_A(CmdFemAddPart);
|
||||
|
||||
CmdFemAddPart::CmdFemAddPart()
|
||||
: Command("Fem_FemAddPart")
|
||||
{
|
||||
sAppModule = "Fem";
|
||||
sGroup = QT_TR_NOOP("Fem");
|
||||
sMenuText = QT_TR_NOOP("Add a part to the Analysis");
|
||||
sToolTipText = QT_TR_NOOP("Add a part to the Analysis");
|
||||
sWhatsThis = sToolTipText;
|
||||
sStatusTip = sToolTipText;
|
||||
sPixmap = "Fem_AddFemMesh";
|
||||
}
|
||||
|
||||
void CmdFemAddPart::activated(int iMsg)
|
||||
{
|
||||
#ifndef FCWithNetgen
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("Your FreeCAD is build without NETGEN support. Meshing will not work...."));
|
||||
return;
|
||||
#endif
|
||||
|
||||
std::vector<Gui::SelectionObject> selection = getSelection().getSelectionEx();
|
||||
|
||||
if (selection.size() != 1) {
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"),
|
||||
QObject::tr("Select an edge, face or body. Only one body is allowed."));
|
||||
return;
|
||||
}
|
||||
|
||||
if (!selection[0].isObjectTypeOf(Part::Feature::getClassTypeId())){
|
||||
QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong object type"),
|
||||
QObject::tr("Fillet works only on parts"));
|
||||
return;
|
||||
}
|
||||
|
||||
Part::Feature *base = static_cast<Part::Feature*>(selection[0].getObject());
|
||||
|
||||
std::string AnalysisName = getUniqueObjectName("FemAnalysis");
|
||||
|
||||
std::string MeshName = getUniqueObjectName((std::string(base->getNameInDocument()) +"_Mesh").c_str());
|
||||
|
||||
|
||||
openCommand("Create FEM analysis");
|
||||
doCommand(Doc,"App.activeDocument().addObject('Fem::FemAnalysis','%s')",AnalysisName.c_str());
|
||||
doCommand(Doc,"App.activeDocument().addObject('Fem::FemMeshShapeNetgenObject','%s')",MeshName.c_str());
|
||||
doCommand(Doc,"App.activeDocument().ActiveObject.Shape = App.activeDocument().%s",base->getNameInDocument());
|
||||
doCommand(Doc,"App.activeDocument().%s.Member = App.activeDocument().%s",AnalysisName.c_str(),MeshName.c_str());
|
||||
addModule(Gui,"FemGui");
|
||||
doCommand(Gui,"FemGui.setActiveAnalysis(App.activeDocument().%s)",AnalysisName.c_str());
|
||||
|
||||
updateActive();
|
||||
|
||||
}
|
||||
|
||||
bool CmdFemAddPart::isActive(void)
|
||||
{
|
||||
if (Gui::Control().activeDialog())
|
||||
return false;
|
||||
@@ -173,6 +237,7 @@ bool CmdFemCreateAnalysis::isActive(void)
|
||||
return Gui::Selection().countObjectsOfType(type) > 0;
|
||||
}
|
||||
|
||||
|
||||
//=====================================================================================
|
||||
|
||||
DEF_STD_CMD_A(CmdFemConstraintBearing);
|
||||
@@ -568,7 +633,8 @@ void CreateFemCommands(void)
|
||||
{
|
||||
Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager();
|
||||
rcCmdMgr.addCommand(new CmdFemCreateFromShape());
|
||||
rcCmdMgr.addCommand(new CmdFemCreateAnalysis());
|
||||
//rcCmdMgr.addCommand(new CmdFemCreateAnalysis());
|
||||
rcCmdMgr.addCommand(new CmdFemAddPart());
|
||||
rcCmdMgr.addCommand(new CmdFemCreateNodesSet());
|
||||
rcCmdMgr.addCommand(new CmdFemDefineNodesSet());
|
||||
rcCmdMgr.addCommand(new CmdFemConstraintBearing());
|
||||
|
||||
@@ -2,11 +2,18 @@
|
||||
<qresource>
|
||||
<file>icons/Fem_FemMesh.svg</file>
|
||||
<file>icons/Fem_FemMesh_createnodebypoly.svg</file>
|
||||
<file>icons/Fem_ConstraintForce.svg</file>
|
||||
<file>icons/Fem_ConstraintFixed.svg</file>
|
||||
<file>icons/Fem_ConstraintBearing.svg</file>
|
||||
<file>icons/Fem_ConstraintGear.svg</file>
|
||||
<file>icons/Fem_ConstraintPulley.svg</file>
|
||||
<file>icons/Fem_AddFemMesh.svg</file>
|
||||
<file>icons/Fem_Analysis.svg</file>
|
||||
<file>icons/Fem_ConstraintForce.svg</file>
|
||||
<file>icons/Fem_ConstraintFixed.svg</file>
|
||||
<file>icons/Fem_ConstraintBearing.svg</file>
|
||||
<file>icons/Fem_ConstraintGear.svg</file>
|
||||
<file>icons/Fem_ConstraintPulley.svg</file>
|
||||
<file>icons/Fem_AddFemMesh.svg</file>
|
||||
<file>icons/Fem_AddMaterial.svg</file>
|
||||
<file>icons/Fem_AddPart.svg</file>
|
||||
<file>icons/Fem_Material.svg</file>
|
||||
<file>icons/Fem_NewAnalysis.svg</file>
|
||||
<file>translations/Fem_af.qm</file>
|
||||
<file>translations/Fem_de.qm</file>
|
||||
<file>translations/Fem_fi.qm</file>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
id="svg2860"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="MachDist_FemMesh.svg"
|
||||
sodipodi:docname="MachDist_AddFemMesh.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
version="1.1">
|
||||
<defs
|
||||
@@ -98,6 +98,7 @@
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
121
src/Mod/Fem/Gui/Resources/icons/Fem_Analysis.svg
Normal file
@@ -0,0 +1,121 @@
|
||||
<?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="svg2860"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="Fem_FemMesh.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
version="1.1">
|
||||
<defs
|
||||
id="defs2862">
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3377"
|
||||
id="radialGradient3692"
|
||||
cx="45.883327"
|
||||
cy="28.869568"
|
||||
fx="45.883327"
|
||||
fy="28.869568"
|
||||
r="19.467436"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3377"
|
||||
id="radialGradient3703"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="135.38333"
|
||||
cy="97.369568"
|
||||
fx="135.38333"
|
||||
fy="97.369568"
|
||||
r="19.467436"
|
||||
gradientTransform="matrix(0.97435,0.2250379,-0.4623105,2.0016728,48.487554,-127.99883)" />
|
||||
<linearGradient
|
||||
id="linearGradient3377">
|
||||
<stop
|
||||
id="stop3379"
|
||||
offset="0"
|
||||
style="stop-color:#faff2b;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3381"
|
||||
offset="1"
|
||||
style="stop-color:#ffaa00;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3377"
|
||||
id="radialGradient3705"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="148.88333"
|
||||
cy="81.869568"
|
||||
fx="148.88333"
|
||||
fy="81.869568"
|
||||
r="19.467436"
|
||||
gradientTransform="matrix(1.3852588,-5.1367833e-2,3.7056289e-2,0.9993132,-60.392403,7.7040438)" />
|
||||
<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="perspective2868" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.5"
|
||||
inkscape:cx="-0.90909091"
|
||||
inkscape:cy="29.272727"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="750"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata2865">
|
||||
<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:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:64px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffff00;fill-opacity:1;stroke:#241c1c;font-family:DejaVu Serif;-inkscape-font-specification:DejaVu Serif"
|
||||
x="10.909091"
|
||||
y="54.909092"
|
||||
id="text3014"
|
||||
sodipodi:linespacing="125%"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3016"
|
||||
x="10.909091"
|
||||
y="54.909092">A</tspan></text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -77,6 +77,8 @@ TaskCreateNodeSet::TaskCreateNodeSet(Fem::FemSetNodesObject *pcObject,QWidget *p
|
||||
QObject::connect(ui->toolButton_Pick,SIGNAL(clicked()),this,SLOT(Pick()));
|
||||
QObject::connect(ui->comboBox,SIGNAL(activated (int)),this,SLOT(SwitchMethod(int)));
|
||||
|
||||
// check if the Link to the FemMesh is defined
|
||||
assert(pcObject->FemMesh.getValue<Fem::FemMeshObject*>());
|
||||
MeshViewProvider = dynamic_cast<ViewProviderFemMesh*>(Gui::Application::Instance->getViewProvider( pcObject->FemMesh.getValue<Fem::FemMeshObject*>()));
|
||||
assert(MeshViewProvider);
|
||||
|
||||
|
||||
@@ -77,11 +77,13 @@ void TaskDlgMeshShapeNetgen::open()
|
||||
void TaskDlgMeshShapeNetgen::clicked(int button)
|
||||
{
|
||||
try {
|
||||
if(QDialogButtonBox::Apply == button)
|
||||
if(QDialogButtonBox::Apply == button && param->touched)
|
||||
{
|
||||
Gui::WaitCursor wc;
|
||||
// May throw an exception which we must handle here
|
||||
FemMeshShapeNetgenObject->execute();
|
||||
param->setInfo();
|
||||
param->touched = false;
|
||||
}
|
||||
}
|
||||
catch (const Base::Exception& e) {
|
||||
@@ -92,8 +94,11 @@ void TaskDlgMeshShapeNetgen::clicked(int button)
|
||||
bool TaskDlgMeshShapeNetgen::accept()
|
||||
{
|
||||
try {
|
||||
Gui::WaitCursor wc;
|
||||
FemMeshShapeNetgenObject->recompute();
|
||||
if(param->touched)
|
||||
{
|
||||
Gui::WaitCursor wc;
|
||||
FemMeshShapeNetgenObject->recompute();
|
||||
}
|
||||
//FemSetNodesObject->Label.setValue(name->name);
|
||||
Gui::Command::doCommand(Gui::Command::Gui,"Gui.activeDocument().resetEdit()");
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
#include <Gui/View3DInventorViewer.h>
|
||||
#include <Gui/Utilities.h>
|
||||
#include <Mod/Fem/App/FemMeshShapeNetgenObject.h>
|
||||
#include <Mod/Fem/App/FemMesh.h>
|
||||
|
||||
|
||||
using namespace FemGui;
|
||||
@@ -77,6 +78,12 @@ TaskTetParameter::TaskTetParameter(Fem::FemMeshShapeNetgenObject *pcObject,QWidg
|
||||
QObject::connect(ui->spinBox_SegsPerRadius,SIGNAL(valueChanged (int)),this,SLOT(setSegsPerRadius(int)));
|
||||
QObject::connect(ui->checkBox_Optimize,SIGNAL(stateChanged (int)),this,SLOT(setOptimize(int)));
|
||||
|
||||
if(pcObject->FemMesh.getValue().getInfo().numNode == 0)
|
||||
touched = true;
|
||||
else
|
||||
touched = false;
|
||||
|
||||
setInfo();
|
||||
}
|
||||
|
||||
TaskTetParameter::~TaskTetParameter()
|
||||
@@ -97,45 +104,64 @@ void TaskTetParameter::SwitchMethod(int Value)
|
||||
}
|
||||
|
||||
pcObject->Fininess.setValue(Value);
|
||||
touched = true;
|
||||
}
|
||||
|
||||
void TaskTetParameter::maxSizeValueChanged(double Value)
|
||||
{
|
||||
pcObject->MaxSize.setValue(Value);
|
||||
touched = true;
|
||||
|
||||
}
|
||||
|
||||
void TaskTetParameter::setQuadric(int s)
|
||||
{
|
||||
pcObject->SecondOrder.setValue(s!=0);
|
||||
touched = true;
|
||||
}
|
||||
|
||||
void TaskTetParameter::setGrothRate(double v)
|
||||
{
|
||||
pcObject->GrothRate.setValue(v);
|
||||
touched = true;
|
||||
|
||||
}
|
||||
|
||||
void TaskTetParameter::setSegsPerEdge(int v)
|
||||
{
|
||||
pcObject->NbSegsPerEdge.setValue(v);
|
||||
touched = true;
|
||||
|
||||
}
|
||||
|
||||
void TaskTetParameter::setSegsPerRadius(int v)
|
||||
{
|
||||
pcObject->NbSegsPerRadius.setValue(v);
|
||||
touched = true;
|
||||
|
||||
}
|
||||
|
||||
void TaskTetParameter::setOptimize(int v)
|
||||
{
|
||||
pcObject->Optimize.setValue(v!=0);
|
||||
touched = true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void TaskTetParameter::setInfo(void)
|
||||
{
|
||||
Fem::FemMesh::FemMeshInfo info = pcObject->FemMesh.getValue().getInfo();
|
||||
//Base::BoundBox3d bndBox = pcObject->FemMesh.getValue().getBoundBox();
|
||||
|
||||
|
||||
ui->lineEdit_InfoNodes ->setText(QString::number(info.numNode));
|
||||
ui->lineEdit_InfoTriangle ->setText(QString::number(info.numFaces));
|
||||
ui->lineEdit_InfoTet ->setText(QString::number(info.numTetr));
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#include "moc_TaskTetParameter.cpp"
|
||||
|
||||
@@ -59,6 +59,9 @@ public:
|
||||
~TaskTetParameter();
|
||||
|
||||
ViewProviderFemMeshShapeNetgen * MeshViewProvider;
|
||||
void setInfo(void);
|
||||
|
||||
bool touched;
|
||||
|
||||
private Q_SLOTS:
|
||||
void SwitchMethod(int Value);
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>221</width>
|
||||
<height>196</height>
|
||||
<height>311</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
@@ -148,6 +148,62 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Node count: </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="lineEdit_InfoNodes">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Triangle count:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="lineEdit_InfoTriangle">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string>Tetraeder count:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="lineEdit_InfoTet">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
|
||||
@@ -45,21 +45,21 @@ using namespace FemGui;
|
||||
|
||||
|
||||
|
||||
PROPERTY_SOURCE(FemGui::ViewProviderAnalysis, Gui::ViewProviderDocumentObject)
|
||||
PROPERTY_SOURCE(FemGui::ViewProviderFemAnalysis, Gui::ViewProviderDocumentObject)
|
||||
|
||||
|
||||
ViewProviderAnalysis::ViewProviderAnalysis()
|
||||
ViewProviderFemAnalysis::ViewProviderFemAnalysis()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
ViewProviderAnalysis::~ViewProviderAnalysis()
|
||||
ViewProviderFemAnalysis::~ViewProviderFemAnalysis()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool ViewProviderAnalysis::doubleClicked(void)
|
||||
bool ViewProviderFemAnalysis::doubleClicked(void)
|
||||
{
|
||||
Gui::Command::assureWorkbench("FemWorkbench");
|
||||
Gui::Command::addModule(Gui::Command::Gui,"FemGui");
|
||||
@@ -67,21 +67,21 @@ bool ViewProviderAnalysis::doubleClicked(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<App::DocumentObject*> ViewProviderAnalysis::claimChildren(void)const
|
||||
std::vector<App::DocumentObject*> ViewProviderFemAnalysis::claimChildren(void)const
|
||||
{
|
||||
std::vector<App::DocumentObject*> temp(static_cast<Fem::FemAnalysis*>(getObject())->Member.getValues());
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
//std::vector<App::DocumentObject*> ViewProviderAnalysis::claimChildren3D(void)const
|
||||
//std::vector<App::DocumentObject*> ViewProviderFemAnalysis::claimChildren3D(void)const
|
||||
//{
|
||||
//
|
||||
// //return static_cast<Assembly::ConstraintGroup*>(getObject())->Constraints.getValues();
|
||||
// return std::vector<App::DocumentObject*> ();
|
||||
//}
|
||||
|
||||
void ViewProviderAnalysis::setupContextMenu(QMenu* menu, QObject* receiver, const char* member)
|
||||
void ViewProviderFemAnalysis::setupContextMenu(QMenu* menu, QObject* receiver, const char* member)
|
||||
{
|
||||
//QAction* act;
|
||||
//act = menu->addAction(QObject::tr("Edit pad"), receiver, member);
|
||||
@@ -89,7 +89,7 @@ void ViewProviderAnalysis::setupContextMenu(QMenu* menu, QObject* receiver, cons
|
||||
//PartGui::ViewProviderPart::setupContextMenu(menu, receiver, member);
|
||||
}
|
||||
|
||||
bool ViewProviderAnalysis::setEdit(int ModNum)
|
||||
bool ViewProviderFemAnalysis::setEdit(int ModNum)
|
||||
{
|
||||
if (ModNum == ViewProvider::Default ) {
|
||||
//// When double-clicking on the item for this pad the
|
||||
@@ -128,7 +128,7 @@ bool ViewProviderAnalysis::setEdit(int ModNum)
|
||||
}
|
||||
}
|
||||
|
||||
void ViewProviderAnalysis::unsetEdit(int ModNum)
|
||||
void ViewProviderFemAnalysis::unsetEdit(int ModNum)
|
||||
{
|
||||
if (ModNum == ViewProvider::Default) {
|
||||
// when pressing ESC make sure to close the dialog
|
||||
@@ -139,7 +139,7 @@ void ViewProviderAnalysis::unsetEdit(int ModNum)
|
||||
}
|
||||
}
|
||||
|
||||
bool ViewProviderAnalysis::onDelete(const std::vector<std::string> &)
|
||||
bool ViewProviderFemAnalysis::onDelete(const std::vector<std::string> &)
|
||||
{
|
||||
//// get the support and Sketch
|
||||
//PartDesign::Pad* pcPad = static_cast<PartDesign::Pad*>(getObject());
|
||||
@@ -157,4 +157,15 @@ bool ViewProviderAnalysis::onDelete(const std::vector<std::string> &)
|
||||
// Gui::Application::Instance->getViewProvider(pcSupport)->show();
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// Python feature -----------------------------------------------------------------------
|
||||
|
||||
namespace Gui {
|
||||
/// @cond DOXERR
|
||||
PROPERTY_SOURCE_TEMPLATE(FemGui::ViewProviderFemAnalysisPython, FemGui::ViewProviderFemAnalysis)
|
||||
/// @endcond
|
||||
|
||||
// explicit template instantiation
|
||||
template class FemGuiExport ViewProviderPythonFeatureT<ViewProviderFemAnalysis>;
|
||||
}
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
#include <Gui/ViewProviderGeometryObject.h>
|
||||
#include <Gui/ViewProviderBuilder.h>
|
||||
#include <Gui/ViewProviderPythonFeature.h>
|
||||
|
||||
class SoCoordinate3;
|
||||
class SoDrawStyle;
|
||||
@@ -39,16 +40,16 @@ namespace FemGui
|
||||
|
||||
|
||||
|
||||
class FemGuiExport ViewProviderAnalysis : public Gui::ViewProviderDocumentObject
|
||||
class FemGuiExport ViewProviderFemAnalysis : public Gui::ViewProviderDocumentObject
|
||||
{
|
||||
PROPERTY_HEADER(FemGui::ViewProviderAnalysis);
|
||||
|
||||
public:
|
||||
/// constructor.
|
||||
ViewProviderAnalysis();
|
||||
ViewProviderFemAnalysis();
|
||||
|
||||
/// destructor.
|
||||
~ViewProviderAnalysis();
|
||||
~ViewProviderFemAnalysis();
|
||||
|
||||
virtual bool doubleClicked(void);
|
||||
|
||||
@@ -65,6 +66,8 @@ protected:
|
||||
|
||||
};
|
||||
|
||||
typedef Gui::ViewProviderPythonFeatureT<ViewProviderFemAnalysis> ViewProviderFemAnalysisPython;
|
||||
|
||||
} //namespace FemGui
|
||||
|
||||
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
#endif
|
||||
|
||||
#include "ViewProviderFemMesh.h"
|
||||
#include "ViewProviderFemMeshPy.h"
|
||||
|
||||
#include <Mod/Fem/App/FemMeshObject.h>
|
||||
#include <Mod/Fem/App/FemMesh.h>
|
||||
@@ -183,7 +184,7 @@ ViewProviderFemMesh::ViewProviderFemMesh()
|
||||
|
||||
pShapeHints = new SoShapeHints;
|
||||
pShapeHints->shapeType = SoShapeHints::SOLID;
|
||||
pShapeHints->vertexOrdering = SoShapeHints::CLOCKWISE;
|
||||
pShapeHints->vertexOrdering = SoShapeHints::COUNTERCLOCKWISE;
|
||||
pShapeHints->ref();
|
||||
|
||||
pcMatBinding = new SoMaterialBinding;
|
||||
@@ -231,6 +232,9 @@ void ViewProviderFemMesh::attach(App::DocumentObject *pcObj)
|
||||
{
|
||||
ViewProviderGeometryObject::attach(pcObj);
|
||||
|
||||
// Move 'coords' before the switch
|
||||
//pcRoot->insertChild(pcCoords,pcRoot->findChild(reinterpret_cast<const SoNode*>(pcModeSwitch)));
|
||||
|
||||
// Annotation sets
|
||||
SoGroup* pcAnotRoot = new SoAnnotation();
|
||||
|
||||
@@ -318,6 +322,8 @@ void ViewProviderFemMesh::attach(App::DocumentObject *pcObj)
|
||||
|
||||
addDisplayMaskMode(pcElemNodesRoot, "Elements & Nodes");
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
void ViewProviderFemMesh::setDisplayMode(const char* ModeName)
|
||||
@@ -472,6 +478,25 @@ void ViewProviderFemMesh::resetHighlightNodes(void)
|
||||
pcAnoCoords->point.setNum(0);
|
||||
}
|
||||
|
||||
PyObject * ViewProviderFemMesh::getPyObject()
|
||||
{
|
||||
if (PythonObject.is(Py::_None())){
|
||||
// ref counter is set to 1
|
||||
PythonObject = Py::Object(new ViewProviderFemMeshPy(this),true);
|
||||
}
|
||||
return Py::new_reference_to(PythonObject);
|
||||
}
|
||||
|
||||
void ViewProviderFemMesh::setColorByNodeId(const std::map<long,App::Color> &NodeColorMap)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void ViewProviderFemMesh::resetColorByNodeId(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
@@ -770,15 +795,15 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)];
|
||||
int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)];
|
||||
int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)];
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx1);
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx2);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0);
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx2,nIdx3);
|
||||
@@ -789,8 +814,8 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)];
|
||||
int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)];
|
||||
int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)];
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx1);
|
||||
@@ -802,8 +827,8 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)];
|
||||
int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)];
|
||||
int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)];
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx1);
|
||||
@@ -815,8 +840,8 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)];
|
||||
int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)];
|
||||
int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)];
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx2);
|
||||
@@ -828,8 +853,8 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx0 = mapNodeIndex[facesHelper[l].Element->GetNode(0)];
|
||||
int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)];
|
||||
int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)];
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx2);
|
||||
@@ -848,15 +873,15 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)];
|
||||
int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)];
|
||||
int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)];
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx1);
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx3);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0);
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx2,nIdx1);
|
||||
@@ -868,15 +893,15 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx5 = mapNodeIndex[facesHelper[l].Element->GetNode(5)];
|
||||
int nIdx6 = mapNodeIndex[facesHelper[l].Element->GetNode(6)];
|
||||
int nIdx7 = mapNodeIndex[facesHelper[l].Element->GetNode(7)];
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = nIdx7;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx4,nIdx5);
|
||||
insEdgeVec(EdgeMap,nIdx4,nIdx7);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,1);
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx7;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx6,nIdx5);
|
||||
@@ -888,15 +913,15 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx1 = mapNodeIndex[facesHelper[l].Element->GetNode(1)];
|
||||
int nIdx4 = mapNodeIndex[facesHelper[l].Element->GetNode(4)];
|
||||
int nIdx5 = mapNodeIndex[facesHelper[l].Element->GetNode(5)];
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx0);
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx5);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,2);
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx4,nIdx0);
|
||||
@@ -908,15 +933,15 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx2 = mapNodeIndex[facesHelper[l].Element->GetNode(2)];
|
||||
int nIdx5 = mapNodeIndex[facesHelper[l].Element->GetNode(5)];
|
||||
int nIdx6 = mapNodeIndex[facesHelper[l].Element->GetNode(6)];
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx5);
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx2);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,3);
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx6,nIdx5);
|
||||
@@ -928,15 +953,15 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)];
|
||||
int nIdx6 = mapNodeIndex[facesHelper[l].Element->GetNode(6)];
|
||||
int nIdx7 = mapNodeIndex[facesHelper[l].Element->GetNode(7)];
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx7;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx3,nIdx2);
|
||||
insEdgeVec(EdgeMap,nIdx3,nIdx7);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,4);
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx7;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx6,nIdx2);
|
||||
@@ -948,15 +973,15 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx3 = mapNodeIndex[facesHelper[l].Element->GetNode(3)];
|
||||
int nIdx4 = mapNodeIndex[facesHelper[l].Element->GetNode(4)];
|
||||
int nIdx7 = mapNodeIndex[facesHelper[l].Element->GetNode(7)];
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx4);
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx3);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,5);
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = nIdx7;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx7,nIdx4);
|
||||
@@ -977,8 +1002,8 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx6 = mapNodeIndex[facesHelper[l].Element->GetNode(6)];
|
||||
// create triangle number 1 ----------------------------------------------
|
||||
// fill in the node indexes in CLOCKWISE order
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
// add the two edge segments for that triangle
|
||||
@@ -987,24 +1012,24 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
// rember the element and face number for that triangle
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0);
|
||||
// create triangle number 2 ----------------------------------------------
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx2,nIdx6);
|
||||
insEdgeVec(EdgeMap,nIdx2,nIdx5);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0);
|
||||
// create triangle number 3 ----------------------------------------------
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx5);
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx4);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,0);
|
||||
// create triangle number 4 ----------------------------------------------
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
// this triangle has no edge (inner triangle).
|
||||
@@ -1016,29 +1041,29 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx4 = mapNodeIndex[facesHelper[l].Element->GetNode(4)];
|
||||
int nIdx7 = mapNodeIndex[facesHelper[l].Element->GetNode(7)];
|
||||
int nIdx8 = mapNodeIndex[facesHelper[l].Element->GetNode(8)];
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx7;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx7);
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx4);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,1);
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = nIdx8;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx8);
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx4);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,1);
|
||||
indices[index++] = nIdx8;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = nIdx8;
|
||||
indices[index++] = nIdx7;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx3,nIdx7);
|
||||
insEdgeVec(EdgeMap,nIdx3,nIdx8);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,1);
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = nIdx8;
|
||||
indices[index++] = nIdx4;
|
||||
indices[index++] = nIdx7;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,1);
|
||||
@@ -1050,29 +1075,29 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx5 = mapNodeIndex[facesHelper[l].Element->GetNode(5)];
|
||||
int nIdx8 = mapNodeIndex[facesHelper[l].Element->GetNode(8)];
|
||||
int nIdx9 = mapNodeIndex[facesHelper[l].Element->GetNode(9)];
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx1;
|
||||
indices[index++] = nIdx8;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx5);
|
||||
insEdgeVec(EdgeMap,nIdx1,nIdx8);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,2);
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx9;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx2,nIdx5);
|
||||
insEdgeVec(EdgeMap,nIdx2,nIdx9);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,2);
|
||||
indices[index++] = nIdx9;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = nIdx9;
|
||||
indices[index++] = nIdx8;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx3,nIdx9);
|
||||
insEdgeVec(EdgeMap,nIdx3,nIdx8);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,2);
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx9;
|
||||
indices[index++] = nIdx5;
|
||||
indices[index++] = nIdx8;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,2);
|
||||
@@ -1084,29 +1109,29 @@ void ViewProviderFEMMeshBuilder::createMesh(const App::Property* prop, SoCoordin
|
||||
int nIdx6 = mapNodeIndex[facesHelper[l].Element->GetNode(6)];
|
||||
int nIdx7 = mapNodeIndex[facesHelper[l].Element->GetNode(7)];
|
||||
int nIdx9 = mapNodeIndex[facesHelper[l].Element->GetNode(9)];
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = nIdx0;
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = nIdx7;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx6);
|
||||
insEdgeVec(EdgeMap,nIdx0,nIdx7);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,3);
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = nIdx2;
|
||||
indices[index++] = nIdx9;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx2,nIdx6);
|
||||
insEdgeVec(EdgeMap,nIdx2,nIdx9);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,3);
|
||||
indices[index++] = nIdx9;
|
||||
indices[index++] = nIdx7;
|
||||
indices[index++] = nIdx9;
|
||||
indices[index++] = nIdx3;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
insEdgeVec(EdgeMap,nIdx3,nIdx9);
|
||||
insEdgeVec(EdgeMap,nIdx3,nIdx7);
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,3);
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = nIdx7;
|
||||
indices[index++] = nIdx6;
|
||||
indices[index++] = nIdx9;
|
||||
indices[index++] = SO_END_FACE_INDEX;
|
||||
vFaceElementIdx[indexIdx++] = ElemFold(facesHelper[l].ElementNumber,3);
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
#include <Gui/ViewProviderGeometryObject.h>
|
||||
#include <Gui/ViewProviderBuilder.h>
|
||||
|
||||
#include <CXX/Objects.hxx>
|
||||
|
||||
class SoCoordinate3;
|
||||
class SoDrawStyle;
|
||||
class SoIndexedFaceSet;
|
||||
@@ -94,9 +96,26 @@ public:
|
||||
// interface methodes
|
||||
void setHighlightNodes(const std::set<long>&);
|
||||
void resetHighlightNodes(void);
|
||||
|
||||
/** @name Postprocessing
|
||||
* this interfaces apply post processing stuff to the View-
|
||||
* Provider. They can override the positioning and the color
|
||||
* color or certain elements.
|
||||
*/
|
||||
//@{
|
||||
/// set the color for each node
|
||||
void setColorByNodeId(const std::map<long,App::Color> &NodeColorMap);
|
||||
/// reset the view of the node colors
|
||||
void resetColorByNodeId(void);
|
||||
//@}
|
||||
|
||||
|
||||
PyObject *getPyObject();
|
||||
|
||||
private:
|
||||
static App::PropertyFloatConstraint::Constraints floatRange;
|
||||
|
||||
Py::Object PythonObject;
|
||||
|
||||
protected:
|
||||
/// get called by the container whenever a property has been changed
|
||||
|
||||
36
src/Mod/Fem/Gui/ViewProviderFemMeshPy.xml
Normal file
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<GenerateModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="generateMetaModel_Module.xsd">
|
||||
<PythonExport
|
||||
Father="ViewProviderPy"
|
||||
Name="ViewProviderFemMeshPy"
|
||||
Twin="ViewProviderFemMesh"
|
||||
TwinPointer="ViewProviderFemMesh"
|
||||
Include="Mod/Fem/Gui/ViewProviderFemMesh.h"
|
||||
Namespace="FemGui"
|
||||
FatherInclude="Gui/ViewProviderPy.h"
|
||||
FatherNamespace="Gui"
|
||||
Constructor="false"
|
||||
Delete="false">
|
||||
<Documentation>
|
||||
<Author Licence="LGPL" Name="Juergen Riegel" EMail="Juergen.Riegel@web.de" />
|
||||
<UserDocu>ViewProviderFemMesh class</UserDocu>
|
||||
</Documentation>
|
||||
<Methode Name="animate">
|
||||
<Documentation>
|
||||
<UserDocu></UserDocu>
|
||||
</Documentation>
|
||||
</Methode>
|
||||
<Attribute Name="NodeColor" ReadOnly="false">
|
||||
<Documentation>
|
||||
<UserDocu>Pose of Axis 1 in degrees</UserDocu>
|
||||
</Documentation>
|
||||
<Parameter Name="NodeColor" Type="Dict"/>
|
||||
</Attribute>
|
||||
<Attribute Name="HighlightedNodes" ReadOnly="false">
|
||||
<Documentation>
|
||||
<UserDocu>Pose of Axis 1 in degrees</UserDocu>
|
||||
</Documentation>
|
||||
<Parameter Name="HighlightedNodes" Type="List"/>
|
||||
</Attribute>
|
||||
</PythonExport>
|
||||
</GenerateModel>
|
||||
83
src/Mod/Fem/Gui/ViewProviderFemMeshPyImp.cpp
Normal file
@@ -0,0 +1,83 @@
|
||||
|
||||
#include "PreCompiled.h"
|
||||
|
||||
#include "Mod/Fem/Gui/ViewProviderFemMesh.h"
|
||||
|
||||
// inclusion of the generated files (generated out of ViewProviderFemMeshPy.xml)
|
||||
#include "ViewProviderFemMeshPy.h"
|
||||
#include "ViewProviderFemMeshPy.cpp"
|
||||
|
||||
using namespace FemGui;
|
||||
|
||||
// returns a string which represents the object e.g. when printed in python
|
||||
std::string ViewProviderFemMeshPy::representation(void) const
|
||||
{
|
||||
return std::string("<ViewProviderFemMesh object>");
|
||||
}
|
||||
|
||||
|
||||
|
||||
PyObject* ViewProviderFemMeshPy::animate(PyObject * /*args*/)
|
||||
{
|
||||
PyErr_SetString(PyExc_NotImplementedError, "Not yet implemented");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Py::Dict ViewProviderFemMeshPy::getNodeColor(void) const
|
||||
{
|
||||
//return Py::List();
|
||||
throw Py::AttributeError("Not yet implemented");
|
||||
}
|
||||
|
||||
void ViewProviderFemMeshPy::setNodeColor(Py::Dict arg)
|
||||
{
|
||||
if(arg.size() == 0)
|
||||
this->getViewProviderFemMeshPtr()->resetColorByNodeId();
|
||||
else {
|
||||
std::map<long,App::Color> NodeColorMap;
|
||||
|
||||
for( Py::Dict::iterator it = arg.begin(); it!= arg.end();++it){
|
||||
Py::Int id((*it).first);
|
||||
Py::Tuple color((*it).second);
|
||||
NodeColorMap[id] = App::Color(Py::Float(color[0]),Py::Float(color[1]),Py::Float(color[2]),0);
|
||||
}
|
||||
this->getViewProviderFemMeshPtr()->setColorByNodeId(NodeColorMap);
|
||||
}
|
||||
|
||||
throw Py::AttributeError("Not yet implemented");
|
||||
}
|
||||
|
||||
Py::List ViewProviderFemMeshPy::getHighlightedNodes(void) const
|
||||
{
|
||||
//return Py::List();
|
||||
throw Py::AttributeError("Not yet implemented");
|
||||
}
|
||||
|
||||
void ViewProviderFemMeshPy::setHighlightedNodes(Py::List arg)
|
||||
{
|
||||
/* std::set<long>& nodeSet;
|
||||
for (Py::List::iterator it = arg.begin(); it != arg.end() && index < 16; ++it) {
|
||||
nodeSet.i (double)Py::Int(*it);
|
||||
}
|
||||
setHighlightNodes*/
|
||||
throw Py::AttributeError("Not yet implemented");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
PyObject *ViewProviderFemMeshPy::getCustomAttributes(const char* /*attr*/) const
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ViewProviderFemMeshPy::setCustomAttributes(const char* /*attr*/, PyObject* /*obj*/)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace FemGui
|
||||
|
||||
class ViewProviderSetNodes : public Gui::ViewProviderGeometryObject
|
||||
{
|
||||
PROPERTY_HEADER(RobotGui::ViewProviderSetNodes);
|
||||
PROPERTY_HEADER(FemGui::ViewProviderSetNodes);
|
||||
|
||||
public:
|
||||
virtual bool doubleClicked(void);
|
||||
|
||||
@@ -56,7 +56,8 @@ Gui::ToolBarItem* Workbench::setupToolBars() const
|
||||
Gui::ToolBarItem* fem = new Gui::ToolBarItem(root);
|
||||
fem->setCommand("FEM");
|
||||
*fem << "Fem_CreateFromShape"
|
||||
<< "Fem_CreateAnalysis"
|
||||
<< "Fem_NewMechanicalAnalysis"
|
||||
<< "Fem_FemAddPart"
|
||||
<< "Fem_CreateNodesSet"
|
||||
<< "Fem_ConstraintFixed"
|
||||
<< "Fem_ConstraintForce"
|
||||
@@ -66,21 +67,23 @@ Gui::ToolBarItem* Workbench::setupToolBars() const
|
||||
return root;
|
||||
}
|
||||
|
||||
Gui::MenuItem* Workbench::setupMenuBar() const
|
||||
{
|
||||
Gui::MenuItem* root = StdWorkbench::setupMenuBar();
|
||||
Gui::MenuItem* item = root->findItem("&Windows");
|
||||
Gui::MenuItem* fem = new Gui::MenuItem;
|
||||
root->insertItem(item, fem);
|
||||
fem->setCommand("&FEM");
|
||||
*fem << "Fem_CreateFromShape"
|
||||
<< "Fem_CreateAnalysis"
|
||||
Gui::MenuItem* Workbench::setupMenuBar() const
|
||||
{
|
||||
Gui::MenuItem* root = StdWorkbench::setupMenuBar();
|
||||
Gui::MenuItem* item = root->findItem("&Windows");
|
||||
Gui::MenuItem* fem = new Gui::MenuItem;
|
||||
root->insertItem(item, fem);
|
||||
fem->setCommand("&FEM");
|
||||
*fem << "Fem_CreateFromShape"
|
||||
<< "Fem_MechanicalMaterial"
|
||||
<< "Fem_NewMechanicalAnalysis"
|
||||
<< "Fem_MechanicalJobControl"
|
||||
<< "Fem_CreateNodesSet"
|
||||
<< "Fem_ConstraintFixed"
|
||||
<< "Fem_ConstraintForce"
|
||||
<< "Fem_ConstraintBearing"
|
||||
<< "Fem_ConstraintGear"
|
||||
<< "Fem_ConstraintPulley";
|
||||
|
||||
return root;
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
257
src/Mod/Fem/MechanicalAnalysis.py
Normal file
@@ -0,0 +1,257 @@
|
||||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2013 - Juergen Riegel <FreeCAD@juergen-riegel.net> *
|
||||
#* *
|
||||
#* This program is free software; you can redistribute it and/or modify *
|
||||
#* it under the terms of the GNU Lesser General Public License (LGPL) *
|
||||
#* as published by the Free Software Foundation; either version 2 of *
|
||||
#* the License, or (at your option) any later version. *
|
||||
#* for detail see the LICENCE text file. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD, Fem, os,sys,string,math,shutil,glob,subprocess,tempfile
|
||||
from ApplyingBC_IC import ApplyingBC_IC
|
||||
|
||||
if FreeCAD.GuiUp:
|
||||
import FreeCADGui,FemGui
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore, QtGui
|
||||
from pivy import coin
|
||||
import PyQt4.uic as uic
|
||||
|
||||
__title__="Machine-Distortion Analysis managment"
|
||||
__author__ = "Juergen Riegel"
|
||||
__url__ = "http://free-cad.sourceforge.net"
|
||||
|
||||
|
||||
def makeMechanicalAnalysis(name):
|
||||
'''makeFemAnalysis(name): makes a Fem Analysis object'''
|
||||
obj = FreeCAD.ActiveDocument.addObject("Fem::FemAnalysisPython",name)
|
||||
_FemAnalysis(obj)
|
||||
_ViewProviderFemAnalysis(obj.ViewObject)
|
||||
#FreeCAD.ActiveDocument.recompute()
|
||||
return obj
|
||||
|
||||
|
||||
class _CommandNewMechanicalAnalysis:
|
||||
"the Fem Analysis command definition"
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'Fem_Analysis',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_Analysis","New mechanical analysis"),
|
||||
'Accel': "A",
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_Analysis","Create a new mechanical analysis")}
|
||||
|
||||
def Activated(self):
|
||||
FreeCAD.ActiveDocument.openTransaction("Create Analysis")
|
||||
FreeCADGui.addModule("FemGui")
|
||||
FreeCADGui.addModule("MechanicalAnalysis")
|
||||
#FreeCADGui.doCommand("FreeCADGui.ActiveDocument.ActiveView.setAxisCross(True)")
|
||||
FreeCADGui.doCommand("MechanicalAnalysis.makeMechanicalAnalysis('MechanicalAnalysis')")
|
||||
FreeCADGui.doCommand("FemGui.setActiveAnalysis(App.activeDocument().ActiveObject)")
|
||||
sel = FreeCADGui.Selection.getSelection()
|
||||
if (len(sel) == 1):
|
||||
if(sel[0].isDerivedFrom("Fem::FemMeshObject")):
|
||||
FreeCADGui.doCommand("App.activeDocument().ActiveObject.Member = App.activeDocument().ActiveObject.Member + [App.activeDocument()."+sel[0].Name+"]")
|
||||
if(sel[0].isDerivedFrom("Part::Feature")):
|
||||
FreeCADGui.doCommand("App.activeDocument().addObject('Fem::FemMeshShapeNetgenObject','"+sel[0].Name +"_Mesh')")
|
||||
FreeCADGui.doCommand("App.activeDocument().ActiveObject.Shape = App.activeDocument()."+sel[0].Name)
|
||||
FreeCADGui.doCommand("FemGui.getActiveAnalysis().Member = FemGui.getActiveAnalysis().Member + [App.activeDocument().ActiveObject]")
|
||||
FreeCADGui.doCommand("Gui.activeDocument().hide('"+sel[0].Name+"')")
|
||||
#FreeCADGui.doCommand("App.activeDocument().ActiveObject.touch()")
|
||||
#FreeCADGui.doCommand("App.activeDocument().recompute()")
|
||||
FreeCADGui.doCommand("Gui.activeDocument().setEdit(App.ActiveDocument.ActiveObject.Name)")
|
||||
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
FreeCADGui.Selection.clearSelection()
|
||||
|
||||
def IsActive(self):
|
||||
import FemGui
|
||||
return FreeCADGui.ActiveDocument != None and FemGui.getActiveAnalysis() == None
|
||||
|
||||
class _CommandMechanicalJobControl:
|
||||
"the Fem JobControl command definition"
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'Fem_NewAnalysis',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_JobControl","Start calculation"),
|
||||
'Accel': "A",
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_Analysis","Dialog to start the calculation of the machanical anlysis")}
|
||||
|
||||
def Activated(self):
|
||||
import FemGui
|
||||
|
||||
taskd = _JobControlTaskPanel(FemGui.getActiveAnalysis())
|
||||
#taskd.obj = vobj.Object
|
||||
taskd.update()
|
||||
FreeCADGui.Control.showDialog(taskd)
|
||||
|
||||
|
||||
def IsActive(self):
|
||||
import FemGui
|
||||
return FreeCADGui.ActiveDocument != None and FemGui.getActiveAnalysis() != None
|
||||
|
||||
|
||||
|
||||
class _FemAnalysis:
|
||||
"The Material object"
|
||||
def __init__(self,obj):
|
||||
self.Type = "FemAnalysis"
|
||||
obj.Proxy = self
|
||||
#obj.Material = StartMat
|
||||
obj.addProperty("App::PropertyString","OutputDir","Base","Directory where the jobs get generated")
|
||||
obj.addProperty("App::PropertyFloat","PlateThikness","Base","Thikness of the plate")
|
||||
|
||||
|
||||
def execute(self,obj):
|
||||
return
|
||||
|
||||
def onChanged(self,obj,prop):
|
||||
if prop in ["MaterialName"]:
|
||||
return
|
||||
|
||||
def __getstate__(self):
|
||||
return self.Type
|
||||
|
||||
def __setstate__(self,state):
|
||||
if state:
|
||||
self.Type = state
|
||||
|
||||
class _ViewProviderFemAnalysis:
|
||||
"A View Provider for the Material object"
|
||||
|
||||
def __init__(self,vobj):
|
||||
#vobj.addProperty("App::PropertyLength","BubbleSize","Base", str(translate("Fem","The size of the axis bubbles")))
|
||||
vobj.Proxy = self
|
||||
|
||||
def getIcon(self):
|
||||
return ":/icons/Fem_FemMesh.svg"
|
||||
|
||||
|
||||
def attach(self, vobj):
|
||||
self.ViewObject = vobj
|
||||
self.Object = vobj.Object
|
||||
self.bubbles = None
|
||||
|
||||
|
||||
def updateData(self, obj, prop):
|
||||
return
|
||||
|
||||
def onChanged(self, vobj, prop):
|
||||
return
|
||||
|
||||
def doubleClicked(self,vobj):
|
||||
taskd = _JobControlTaskPanel(self.Object)
|
||||
taskd.obj = vobj.Object
|
||||
taskd.update()
|
||||
FreeCADGui.Control.showDialog(taskd)
|
||||
return True
|
||||
|
||||
|
||||
def __getstate__(self):
|
||||
return None
|
||||
|
||||
def __setstate__(self,state):
|
||||
return None
|
||||
|
||||
|
||||
class _JobControlTaskPanel:
|
||||
'''The editmode TaskPanel for Material objects'''
|
||||
def __init__(self,object):
|
||||
# the panel has a tree widget that contains categories
|
||||
# for the subcomponents, such as additions, subtractions.
|
||||
# the categories are shown only if they are not empty.
|
||||
form_class, base_class = uic.loadUiType(FreeCAD.getHomePath() + "Mod/Fem/MechanicalAnalysis.ui")
|
||||
|
||||
self.obj = object
|
||||
self.formUi = form_class()
|
||||
self.form = QtGui.QWidget()
|
||||
self.formUi.setupUi(self.form)
|
||||
self.params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Machining_Distortion")
|
||||
|
||||
#Connect Signals and Slots
|
||||
QtCore.QObject.connect(self.formUi.toolButton_chooseOutputDir, QtCore.SIGNAL("clicked()"), self.chooseOutputDir)
|
||||
QtCore.QObject.connect(self.formUi.pushButton_generate, QtCore.SIGNAL("clicked()"), self.run)
|
||||
|
||||
self.update()
|
||||
|
||||
|
||||
|
||||
def getStandardButtons(self):
|
||||
return int(QtGui.QDialogButtonBox.Close)
|
||||
|
||||
def update(self):
|
||||
'fills the widgets'
|
||||
self.formUi.lineEdit_outputDir.setText(self.params.GetString("JobDir",'/'))
|
||||
return
|
||||
|
||||
def accept(self):
|
||||
FreeCADGui.Control.closeDialog()
|
||||
|
||||
|
||||
def reject(self):
|
||||
FreeCADGui.Control.closeDialog()
|
||||
|
||||
def chooseOutputDir(self):
|
||||
print "chooseOutputDir"
|
||||
dirname = QtGui.QFileDialog.getExistingDirectory(None, 'Choose material directory',self.params.GetString("JobDir",'/'))
|
||||
if(dirname):
|
||||
self.params.SetString("JobDir",str(dirname))
|
||||
self.formUi.lineEdit_outputDir.setText(dirname)
|
||||
|
||||
def run(self):
|
||||
dirName = self.formUi.lineEdit_outputDir.text()
|
||||
|
||||
MeshObject = None
|
||||
if FemGui.getActiveAnalysis():
|
||||
for i in FemGui.getActiveAnalysis().Member:
|
||||
if i.isDerivedFrom("Fem::FemMeshObject"):
|
||||
MeshObject = i
|
||||
else:
|
||||
QtGui.QMessageBox.critical(None, "Missing prerequisit","No active Analysis")
|
||||
return
|
||||
|
||||
if not MeshObject:
|
||||
QtGui.QMessageBox.critical(None, "Missing prerequisit","No mesh object in the Analysis")
|
||||
return
|
||||
|
||||
MathObject = None
|
||||
for i in FemGui.getActiveAnalysis().Member:
|
||||
if i.isDerivedFrom("App::MaterialObjectPython"):
|
||||
MathObject = i
|
||||
if not MathObject:
|
||||
QtGui.QMessageBox.critical(None, "Missing prerequisit","No material object in the Analysis")
|
||||
return
|
||||
matmap = MathObject.Material
|
||||
|
||||
IsoNodeObject = None
|
||||
for i in FemGui.getActiveAnalysis().Member:
|
||||
if i.isDerivedFrom("Fem::FemSetNodesObject"):
|
||||
IsoNodeObject = i
|
||||
if not IsoNodeObject:
|
||||
QtGui.QMessageBox.critical(None, "Missing prerequisit","No Isostatic nodes defined in the Analysis")
|
||||
return
|
||||
IsoNodes = IsoNodeObject.Nodes
|
||||
|
||||
filename_without_suffix = MeshObject.Name
|
||||
#current_file_name
|
||||
|
||||
young_modulus = float(matmap['FEM_youngsmodulus'])
|
||||
poisson_ratio = float(matmap['PartDist_poissonratio'])
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
FreeCADGui.addCommand('Fem_NewMechanicalAnalysis',_CommandNewMechanicalAnalysis())
|
||||
FreeCADGui.addCommand('Fem_MechanicalJobControl',_CommandMechanicalJobControl())
|
||||
45
src/Mod/Fem/MechanicalAnalysis.ui
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MechanicalMaterial</class>
|
||||
<widget class="QWidget" name="MechanicalMaterial">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>193</width>
|
||||
<height>354</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Mechanical analysis</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="lineEdit_outputDir"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QToolButton" name="toolButton_chooseOutputDir">
|
||||
<property name="text">
|
||||
<string>...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_generate">
|
||||
<property name="text">
|
||||
<string>Run</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTextEdit" name="textEdit_Output"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
235
src/Mod/Fem/MechanicalMaterial.py
Normal file
@@ -0,0 +1,235 @@
|
||||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2013 - Juergen Riegel <FreeCAD@juergen-riegel.net> *
|
||||
#* *
|
||||
#* This program is free software; you can redistribute it and/or modify *
|
||||
#* it under the terms of the GNU Lesser General Public License (LGPL) *
|
||||
#* as published by the Free Software Foundation; either version 2 of *
|
||||
#* the License, or (at your option) any later version. *
|
||||
#* for detail see the LICENCE text file. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD, Fem
|
||||
|
||||
if FreeCAD.GuiUp:
|
||||
import FreeCADGui,FemGui
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore, QtGui
|
||||
from pivy import coin
|
||||
import PyQt4.uic as uic
|
||||
|
||||
__title__="Machine-Distortion FemSetGeometryObject managment"
|
||||
__author__ = "Juergen Riegel"
|
||||
__url__ = "http://free-cad.sourceforge.net"
|
||||
|
||||
|
||||
|
||||
def makeMechanicalMaterial(name):
|
||||
'''makeMaterial(name): makes an Material
|
||||
name there fore is a material name or an file name for a FCMat file'''
|
||||
obj = FreeCAD.ActiveDocument.addObject("App::MaterialObjectPython",name)
|
||||
_MechanicalMaterial(obj)
|
||||
_ViewProviderMechanicalMaterial(obj.ViewObject)
|
||||
#FreeCAD.ActiveDocument.recompute()
|
||||
return obj
|
||||
|
||||
class _CommandMechanicalMaterial:
|
||||
"the Fem Material command definition"
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'Fem_Material',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("Fem_Material","Mechanical material..."),
|
||||
'Accel': "A, X",
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("Fem_Material","Creates or edit the mechanical material definition.")}
|
||||
|
||||
def Activated(self):
|
||||
MatObj = None
|
||||
for i in FemGui.getActiveAnalysis().Member:
|
||||
if i.isDerivedFrom("App::MaterialObject"):
|
||||
MatObj = i
|
||||
|
||||
if (not MatObj):
|
||||
FreeCAD.ActiveDocument.openTransaction("Create Material")
|
||||
FreeCADGui.addModule("MechanicalMaterial")
|
||||
FreeCADGui.doCommand("MechanicalMaterial.makeMechanicalMaterial('MechanicalMaterial')")
|
||||
FreeCADGui.doCommand("App.activeDocument()."+FemGui.getActiveAnalysis().Name+".Member = App.activeDocument()."+FemGui.getActiveAnalysis().Name+".Member + [App.ActiveDocument.ActiveObject]")
|
||||
FreeCADGui.doCommand("Gui.activeDocument().setEdit(App.ActiveDocument.ActiveObject.Name,0)")
|
||||
#FreeCADGui.doCommand("Fem.makeMaterial()")
|
||||
else:
|
||||
FreeCADGui.doCommand("Gui.activeDocument().setEdit('"+MatObj.Name+"',0)")
|
||||
|
||||
def IsActive(self):
|
||||
if FemGui.getActiveAnalysis():
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
class _MechanicalMaterial:
|
||||
"The Material object"
|
||||
def __init__(self,obj):
|
||||
self.Type = "MechanicaltMaterial"
|
||||
obj.Proxy = self
|
||||
#obj.Material = StartMat
|
||||
|
||||
|
||||
def execute(self,obj):
|
||||
return
|
||||
|
||||
|
||||
class _ViewProviderMechanicalMaterial:
|
||||
"A View Provider for the MechanicalMaterial object"
|
||||
|
||||
def __init__(self,vobj):
|
||||
vobj.Proxy = self
|
||||
|
||||
def getIcon(self):
|
||||
return ":/icons/Fem_Material.svg"
|
||||
|
||||
def attach(self, vobj):
|
||||
self.ViewObject = vobj
|
||||
self.Object = vobj.Object
|
||||
|
||||
|
||||
def updateData(self, obj, prop):
|
||||
return
|
||||
|
||||
def onChanged(self, vobj, prop):
|
||||
return
|
||||
|
||||
def setEdit(self,vobj,mode):
|
||||
taskd = _MechanicalMaterialTaskPanel(self.Object)
|
||||
taskd.obj = vobj.Object
|
||||
taskd.update()
|
||||
FreeCADGui.Control.showDialog(taskd)
|
||||
return True
|
||||
|
||||
def unsetEdit(self,vobj,mode):
|
||||
FreeCADGui.Control.closeDialog()
|
||||
return
|
||||
|
||||
def __getstate__(self):
|
||||
return None
|
||||
|
||||
def __setstate__(self,state):
|
||||
return None
|
||||
|
||||
|
||||
class _MechanicalMaterialTaskPanel:
|
||||
'''The editmode TaskPanel for MechanicalMaterial objects'''
|
||||
def __init__(self,obj):
|
||||
# the panel has a tree widget that contains categories
|
||||
# for the subcomponents, such as additions, subtractions.
|
||||
# the categories are shown only if they are not empty.
|
||||
form_class, base_class = uic.loadUiType(FreeCAD.getHomePath() + "Mod/Fem/MechanicalMaterial.ui")
|
||||
|
||||
self.obj = obj
|
||||
self.formUi = form_class()
|
||||
self.form = QtGui.QWidget()
|
||||
self.formUi.setupUi(self.form)
|
||||
self.params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Fem")
|
||||
|
||||
|
||||
QtCore.QObject.connect(self.formUi.pushButton_MatWeb, QtCore.SIGNAL("clicked()"), self.goMatWeb)
|
||||
QtCore.QObject.connect(self.formUi.comboBox_MaterialsInDir, QtCore.SIGNAL("currentIndexChanged(int)"), self.chooseMat)
|
||||
|
||||
self.update()
|
||||
|
||||
def transferTo(self):
|
||||
"Transfer from the dialog to the object"
|
||||
|
||||
matmap = self.obj.Material
|
||||
|
||||
matmap['Mechanical_youngsmodulus'] = str(self.formUi.spinBox_young_modulus.value() * 1e+6)
|
||||
matmap['FEM_poissonratio'] = str(self.formUi.spinBox_poisson_ratio.value())
|
||||
|
||||
self.obj.Material = matmap
|
||||
|
||||
|
||||
def transferFrom(self):
|
||||
"Transfer from the object to the dialog"
|
||||
matmap = self.obj.Material
|
||||
|
||||
if matmap.has_key('Mechanical_youngsmodulus'):
|
||||
print float(matmap['Mechanical_youngsmodulus'])
|
||||
self.formUi.spinBox_young_modulus.setValue(float(matmap['Mechanical_youngsmodulus'])/1e+6)
|
||||
if matmap.has_key('FEM_poissonratio'):
|
||||
print float(matmap['FEM_poissonratio'])
|
||||
self.formUi.spinBox_poisson_ratio.setValue(float(matmap['FEM_poissonratio']))
|
||||
|
||||
def isAllowedAlterSelection(self):
|
||||
return False
|
||||
|
||||
def isAllowedAlterView(self):
|
||||
return True
|
||||
|
||||
def getStandardButtons(self):
|
||||
return int(QtGui.QDialogButtonBox.Ok) | int(QtGui.QDialogButtonBox.Cancel)
|
||||
|
||||
def update(self):
|
||||
'fills the widgets'
|
||||
self.formUi.spinBox_young_modulus.setValue(0.0)
|
||||
self.formUi.spinBox_poisson_ratio.setValue(0.0)
|
||||
self.transferFrom()
|
||||
self.fillMaterialCombo()
|
||||
|
||||
|
||||
return
|
||||
|
||||
def accept(self):
|
||||
self.transferTo()
|
||||
FreeCADGui.ActiveDocument.resetEdit()
|
||||
|
||||
def reject(self):
|
||||
FreeCADGui.ActiveDocument.resetEdit()
|
||||
|
||||
def saveMat(self):
|
||||
self.transferTo()
|
||||
filename = QtGui.QFileDialog.getSaveFileName(None, 'Save Material file file',self.params.GetString("MaterialDir",'/'),'FreeCAD material file (*.FCMat)')
|
||||
if(filename):
|
||||
import Material
|
||||
Material.exportFCMat(filename,self.obj.Material)
|
||||
|
||||
def goMatWeb(self):
|
||||
import webbrowser
|
||||
webbrowser.open("http://matweb.com")
|
||||
|
||||
def chooseMat(self,index):
|
||||
if index == 0:return
|
||||
import Material
|
||||
print index
|
||||
name = self.pathList[index-1]
|
||||
print 'Import ', str(name)
|
||||
|
||||
self.obj.Material = Material.importFCMat(str(name))
|
||||
print self.obj.Material
|
||||
|
||||
self.transferFrom()
|
||||
|
||||
def fillMaterialCombo(self):
|
||||
import glob,os
|
||||
matmap = self.obj.Material
|
||||
dirname = FreeCAD.ConfigGet("AppHomePath")+"data/Mod/Material/StandardMaterial"
|
||||
self.pathList = glob.glob(dirname + '/*.FCMat')
|
||||
self.formUi.comboBox_MaterialsInDir.clear()
|
||||
if(matmap.has_key('General_name')):
|
||||
self.formUi.comboBox_MaterialsInDir.addItem(matmap['General_name'])
|
||||
else:
|
||||
self.formUi.comboBox_MaterialsInDir.addItem('-> choose Material')
|
||||
for i in self.pathList:
|
||||
self.formUi.comboBox_MaterialsInDir.addItem(os.path.basename(i) )
|
||||
|
||||
|
||||
|
||||
|
||||
FreeCADGui.addCommand('Fem_MechanicalMaterial',_CommandMechanicalMaterial())
|
||||
138
src/Mod/Fem/MechanicalMaterial.ui
Normal file
@@ -0,0 +1,138 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MechanicalMaterial</class>
|
||||
<widget class="QWidget" name="MechanicalMaterial">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>196</width>
|
||||
<height>142</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Mechanical material</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QComboBox" name="comboBox_MaterialsInDir">
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>choose...</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_MatWeb">
|
||||
<property name="text">
|
||||
<string>MatWeb database...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="Line" name="line">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QDoubleSpinBox" name="spinBox_young_modulus">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>2000.000000000000000</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>2.000000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>0.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Young's Mod.(GPa)</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QDoubleSpinBox" name="spinBox_poisson_ratio">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>3</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>1.000000000000000</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>0.300000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Poisson Ratio</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -1,90 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>AligmentParameter</class>
|
||||
<widget class="QWidget" name="AligmentParameter">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>124</width>
|
||||
<height>198</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_FlipX">
|
||||
<property name="text">
|
||||
<string>Flip X</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_FlipY">
|
||||
<property name="text">
|
||||
<string>Flip Y</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton_FlipZ">
|
||||
<property name="text">
|
||||
<string>Flip Z</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Volume</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>X-Size: 0mm</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Y-Size: 0mm</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="font">
|
||||
<font>
|
||||
<weight>75</weight>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Z-Size: 0mm </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -1,75 +0,0 @@
|
||||
def ApplyingBC_IC(Casedir,YoungModulus,PoissonCoeff,OUTER_GRID_No1,OUTER_GRID_No2,OUTER_GRID_No3) :
|
||||
# Variables generales
|
||||
import os,subprocess
|
||||
#
|
||||
AC_file = open (str(Casedir + "/" + "Applied_Conditions.txt"),'w')
|
||||
#
|
||||
# a) BOUNDARY conditions in order to prevent the billet to any solid displacement
|
||||
AC_file.write("** \n")
|
||||
AC_file.write("** BOUNDARY Conditions :\n")
|
||||
AC_file.write("*BOUNDARY\n")
|
||||
AC_file.write("%i, 1, 3\n" %OUTER_GRID_No1)
|
||||
AC_file.write("*BOUNDARY\n")
|
||||
AC_file.write("%i, 2, 3\n" %OUTER_GRID_No2)
|
||||
AC_file.write("*BOUNDARY \n")
|
||||
AC_file.write("%i, 3\n" %OUTER_GRID_No3)
|
||||
AC_file.write("** \n")
|
||||
#
|
||||
# b) MATERIAL description :
|
||||
MAT_NAME = "EL"
|
||||
AC_file.write("*MATERIAL, NAME=%s \n" %MAT_NAME)
|
||||
AC_file.write("*ELASTIC \n")
|
||||
AC_file.write("%f, %f \n" %(YoungModulus,PoissonCoeff))
|
||||
# Assign the material properties to the desired group of elements :
|
||||
AC_file.write("*SOLID SECTION, ELSET=Eall, MATERIAL=%s \n" %MAT_NAME)
|
||||
AC_file.write("** \n")
|
||||
#
|
||||
# c) Define the load :
|
||||
AC_file.write("** LOAD :\n")
|
||||
#-Load_1: Points Loading :
|
||||
#-Load_1: AC_file.write("*NSET, NSET=LOAD \n") # list of Nodes where Concentrated Load will be applied
|
||||
#-Load_1: AC_file.write("??, ??, ??, ... \n")
|
||||
#-Load_2 : For applying Internal (residual) stresses (cf. user-subroutine "sigini.f") :
|
||||
AC_file.write("*INITIAL CONDITIONS, TYPE=STRESS, USER \n")
|
||||
#
|
||||
# d) FEM-calculation pilote :
|
||||
AC_file.write("** \n")
|
||||
AC_file.write("*STEP \n")
|
||||
AC_file.write("*STATIC \n")
|
||||
#-Load_1: AC_file.write("*CLOAD \n") # for Applying Concentrated Load
|
||||
#-Load_1: AC_file.write("LOAD,3,Magnitude_per_Node \n") # force acting in the Z-dir, force magnitude per Node
|
||||
|
||||
#
|
||||
# e) Specify the OUTPUT requested :
|
||||
AC_file.write("** OUTPUT REQUESTS \n")
|
||||
# If one wants to store each 0^th step the results of present calculation for future restarts
|
||||
# AC_file.write("*Restart, write, frequency=0 \n")
|
||||
AC_file.write("*NODE FILE \n")
|
||||
AC_file.write("U \n") # displacements expressed in the GLOBAL Coord System
|
||||
# AC_file.write("** \n")
|
||||
AC_file.write("*EL FILE \n")
|
||||
AC_file.write("S \n") # (Cauchy) Stresses
|
||||
#
|
||||
AC_file.write("*NODE PRINT , NSET=Nall \n")
|
||||
AC_file.write("U \n") # displacements expressed in the GLOBAL Coord System
|
||||
# AC_file.write("** \n")
|
||||
AC_file.write("*EL PRINT , ELSET=Eall \n")
|
||||
AC_file.write("S \n") # (Cauchy) Stresses
|
||||
# AC_file.write("** \n")
|
||||
#
|
||||
AC_file.write("*END STEP")
|
||||
#
|
||||
AC_file.close()
|
||||
os.chdir(str(Casedir))
|
||||
fnull = open(os.devnull, 'w')
|
||||
if os.name != "posix":
|
||||
process = subprocess.Popen("type geometry_fe_input.inp Applied_Conditions.txt> final_fe_input.inp",shell=True)
|
||||
process.wait()
|
||||
process = subprocess.Popen("del /Q geometry_fe_input.inp",shell=True)
|
||||
process.wait()
|
||||
else:
|
||||
commandline = "cat Applied_Conditions.txt >> geometry_fe_input.inp"
|
||||
result = subprocess.call(commandline, shell = True, stdout = fnull, stderr = fnull)
|
||||
#
|
||||
fnull.close()
|
||||
return
|
||||
@@ -1,42 +0,0 @@
|
||||
|
||||
|
||||
# collect all the python files:
|
||||
#FILE( GLOB MachDist_SRCS ./*.py )
|
||||
SET(MachDist_SRCS
|
||||
Init.py
|
||||
InitGui.py
|
||||
ApplyingBC_IC.py
|
||||
mach_dist_gui.py
|
||||
machdist_rc.py
|
||||
Parameter.py
|
||||
postprocess.py
|
||||
postprocess_gui.py
|
||||
calculix_postprocess.py
|
||||
MachiningDistortionCommands.py
|
||||
User_Interface_Mach_Dist.py
|
||||
machdist_rc.py
|
||||
MachDistMaterial.py
|
||||
MachDistMesh.py
|
||||
MachDistAnalysis.py
|
||||
MachDistIsostatic.py
|
||||
MachDistAlignment.py
|
||||
Parameter.ui
|
||||
Material.ui
|
||||
Aligment.ui
|
||||
)
|
||||
SOURCE_GROUP("" FILES ${MachDist_SRCS})
|
||||
|
||||
|
||||
ADD_CUSTOM_TARGET(Machining_Distortion ALL
|
||||
SOURCES ${MachDist_SRCS}
|
||||
)
|
||||
|
||||
fc_copy_sources(Machining_Distortion "${CMAKE_BINARY_DIR}/Mod/Machining_Distortion" ${MachDist_SRCS})
|
||||
|
||||
|
||||
INSTALL(
|
||||
FILES
|
||||
${MachDist_SRCS}
|
||||
DESTINATION
|
||||
Mod/Machining_Distortion
|
||||
)
|
||||
@@ -1,317 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Form</class>
|
||||
<widget class="QWidget" name="Form">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>278</width>
|
||||
<height>144</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="0">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_24">
|
||||
<property name="text">
|
||||
<string>From</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="label_25">
|
||||
<property name="text">
|
||||
<string>To</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="label_26">
|
||||
<property name="text">
|
||||
<string>Intervall</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QSpinBox" name="spinBox_misalignment_x_from">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QSpinBox" name="spinBox_misalignment_x_to">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QSpinBox" name="spinBox_misalignment_x_intervall">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>1</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Angle X-Axis</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QSpinBox" name="spinBox_misalignment_y_from">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QSpinBox" name="spinBox_misalignment_y_to">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QSpinBox" name="spinBox_misalignment_y_intervall">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>1</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="3">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Angle Y-Axis</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QSpinBox" name="spinBox_misalignment_z_from">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QSpinBox" name="spinBox_misalignment_z_to">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="2">
|
||||
<widget class="QSpinBox" name="spinBox_misalignment_z_intervall">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>1</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="3">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Angle Z-Axis</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QSpinBox" name="spinBox_z_level_from">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="layoutDirection">
|
||||
<enum>Qt::LeftToRight</enum>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QSpinBox" name="spinBox_z_level_to">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="2">
|
||||
<widget class="QSpinBox" name="spinBox_z_level_intervall">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>-99</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>1</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="3">
|
||||
<widget class="QLabel" name="label_27">
|
||||
<property name="text">
|
||||
<string>Z-Level</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
<zorder></zorder>
|
||||
<zorder></zorder>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -1,5 +0,0 @@
|
||||
# MachiningDistortion
|
||||
|
||||
# Get the Parameter Group of this module
|
||||
ParGrp = App.ParamGet("System parameter:Modules").GetGroup("MachiningDistortion")
|
||||
|
||||
@@ -1,184 +0,0 @@
|
||||
# MachiningDistortion Gui stuff
|
||||
|
||||
|
||||
class MachiningDistortionWorkbench ( Workbench ):
|
||||
"Test workbench object"
|
||||
Icon = """
|
||||
/* XPM */
|
||||
static const char *test_icon[]={
|
||||
"13 16 88 1",
|
||||
" c None",
|
||||
". c #000000",
|
||||
"+ c #130D02",
|
||||
"@ c #372704",
|
||||
"# c #5C4107",
|
||||
"$ c #5C3F07",
|
||||
"% c #5B3D07",
|
||||
"& c #5B3C07",
|
||||
"* c #5B3A07",
|
||||
"= c #4D3106",
|
||||
"- c #5B4207",
|
||||
"; c #9A7E08",
|
||||
"> c #E4B30C",
|
||||
", c #E7B00C",
|
||||
"' c #E3A70B",
|
||||
") c #E09E0B",
|
||||
"! c #DD950A",
|
||||
"~ c #5D3B07",
|
||||
"{ c #5D4707",
|
||||
"] c #F1CC0E",
|
||||
"^ c #AF900A",
|
||||
"/ c #BF970B",
|
||||
"( c #E7B10C",
|
||||
"_ c #E4A90C",
|
||||
": c #E1A00B",
|
||||
"< c #5D3E07",
|
||||
"[ c #5F4807",
|
||||
"} c #F5D70E",
|
||||
"| c #D7B70C",
|
||||
"1 c #504204",
|
||||
"2 c #EBBC0D",
|
||||
"3 c #E8B30C",
|
||||
"4 c #E5AB0C",
|
||||
"5 c #5E4007",
|
||||
"6 c #604A08",
|
||||
"7 c #F9E10F",
|
||||
"8 c #F6D90E",
|
||||
"9 c #574A05",
|
||||
"0 c #DBB70C",
|
||||
"a c #ECBE0D",
|
||||
"b c #E9B50C",
|
||||
"c c #604307",
|
||||
"d c #604B08",
|
||||
"e c #FDEC10",
|
||||
"f c #FAE30F",
|
||||
"g c #F4D70F",
|
||||
"h c #F3D20E",
|
||||
"i c #F0C90E",
|
||||
"j c #EDC00D",
|
||||
"k c #604507",
|
||||
"l c #FFF110",
|
||||
"m c #FEEE10",
|
||||
"n c #FBE50F",
|
||||
"o c #726607",
|
||||
"p c #EBCD0E",
|
||||
"q c #F1CB0E",
|
||||
"r c #614608",
|
||||
"s c #FFF010",
|
||||
"t c #A3960A",
|
||||
"u c #958509",
|
||||
"v c #F5D60E",
|
||||
"w c #614908",
|
||||
"x c #F9EB10",
|
||||
"y c #716807",
|
||||
"z c #F9E00F",
|
||||
"A c #634B08",
|
||||
"B c #FDEB10",
|
||||
"C c #634D08",
|
||||
"D c #5C4808",
|
||||
"E c #B9AF0C",
|
||||
"F c #A69D0A",
|
||||
"G c #655008",
|
||||
"H c #584407",
|
||||
"I c #EFE20F",
|
||||
"J c #595406",
|
||||
"K c #5B4708",
|
||||
"L c #716B07",
|
||||
"M c #2A2104",
|
||||
"N c #1B1502",
|
||||
"O c #E9DC0F",
|
||||
"P c #2C2303",
|
||||
"Q c #201803",
|
||||
"R c #6B5608",
|
||||
"S c #1E1802",
|
||||
"T c #201A02",
|
||||
"U c #695508",
|
||||
"V c #362C04",
|
||||
"W c #0C0901",
|
||||
"... +@#$%&*=",
|
||||
" -;>,')!~",
|
||||
" . {]^/(_:<",
|
||||
" . [}|12345",
|
||||
" 67890abc",
|
||||
" . defghijk",
|
||||
" . dlmnopqr",
|
||||
" dllstuvw",
|
||||
" dlllxyzA",
|
||||
" .dlllllBC",
|
||||
" .DllllEFG",
|
||||
" HllllIJG",
|
||||
" KlllllLG",
|
||||
" MllllllG",
|
||||
" NlllllOP",
|
||||
" QRPSTUVW"};
|
||||
"""
|
||||
MenuText = "Machining Distortion"
|
||||
ToolTip = "MachiningDistortion workbench"
|
||||
|
||||
def setWatchers(self):
|
||||
class WatcherStart:
|
||||
def __init__(self):
|
||||
self.commands = ["MachDist_Analysis"]
|
||||
self.title = "Start"
|
||||
def shouldShow(self):
|
||||
return True
|
||||
|
||||
class WatcherFill:
|
||||
def __init__(self):
|
||||
self.commands = ["MachDist_Mesh","MachDist_Alignment","MachDist_Material","MachDist_Isostatic"]
|
||||
self.title = "Modify objects"
|
||||
def shouldShow(self):
|
||||
import FemGui
|
||||
if FemGui.getActiveAnalysis():
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
#class DraftTrayWatcher:
|
||||
# def __init__(self,traywidget):
|
||||
# self.form = traywidget
|
||||
# self.widgets = [self.form]
|
||||
# def shouldShow(self):
|
||||
# return True
|
||||
|
||||
#self.traywidget = QtGui.QWidget()
|
||||
#self.tray = QtGui.QVBoxLayout(self.traywidget)
|
||||
#self.tray.setObjectName("traylayout")
|
||||
#self.toptray = QtGui.QHBoxLayout()
|
||||
#self.bottomtray = QtGui.QHBoxLayout()
|
||||
#self.tray.addLayout(self.toptray)
|
||||
#self.tray.addLayout(self.bottomtray)
|
||||
#self.setupTray()
|
||||
#self.setupStyle()
|
||||
#w = DraftTrayWatcher(self.traywidget)
|
||||
FreeCADGui.Control.addTaskWatcher([WatcherStart(),WatcherFill()])
|
||||
|
||||
|
||||
def Initialize(self):
|
||||
import machdist_rc
|
||||
import MachiningDistortionCommands
|
||||
import MachDistMesh
|
||||
import MachDistAnalysis
|
||||
import MachDistMaterial
|
||||
import MachDistAlignment
|
||||
import MachDistIsostatic
|
||||
CmdList = ["MachiningDistortion_StartGUI","MachiningDistortion_StartPostprocess"]
|
||||
self.appendToolbar("MachiningDistortionTools",CmdList)
|
||||
self.appendMenu("Machining Distortion",CmdList)
|
||||
self.appendToolbar("MachiningDistortionTools2",["MachDist_Analysis","MachDist_Mesh","MachDist_Alignment","MachDist_Material","MachDist_Isostatic"])
|
||||
self.appendMenu("Machining Distortion2",["MachDist_Analysis","MachDist_Mesh","MachDist_Alignment","MachDist_Material","MachDist_Isostatic"])
|
||||
|
||||
self.setWatchers()
|
||||
|
||||
Gui.addPreferencePage(":/ui/userprefs-base.ui","Machining Distortion")
|
||||
|
||||
Log ('Loading MachiningDistortion module... done\n')
|
||||
def Activated(self):
|
||||
self.setWatchers()
|
||||
FreeCADGui.Control.showTaskView()
|
||||
Msg("MachiningDistortionWorkbench::Activated()\n")
|
||||
def Deactivated(self):
|
||||
Msg("MachiningDistortionWorkbench::Deactivated()\n")
|
||||
|
||||
|
||||
Gui.addWorkbench(MachiningDistortionWorkbench)
|
||||
@@ -1,92 +0,0 @@
|
||||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2013 - Juergen Riegel <FreeCAD@juergen-riegel.net> *
|
||||
#* *
|
||||
#* This program is free software; you can redistribute it and/or modify *
|
||||
#* it under the terms of the GNU Lesser General Public License (LGPL) *
|
||||
#* as published by the Free Software Foundation; either version 2 of *
|
||||
#* the License, or (at your option) any later version. *
|
||||
#* for detail see the LICENCE text file. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD, Fem
|
||||
|
||||
if FreeCAD.GuiUp:
|
||||
import FreeCADGui, FemGui
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore, QtGui
|
||||
from pivy import coin
|
||||
import PyQt4.uic as uic
|
||||
|
||||
__title__="Machine-Distortion Alignment managment"
|
||||
__author__ = "Juergen Riegel"
|
||||
__url__ = "http://free-cad.sourceforge.net"
|
||||
|
||||
|
||||
|
||||
class _CommandAlignment:
|
||||
"the MachDist Alignment command definition"
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'MachDist_Align',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("MachDist_Alignment","Machine-Distortion Alignment"),
|
||||
'Accel': "A",
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("MachDist_Alignment","Machine-Distortion Alignment")}
|
||||
|
||||
def Activated(self):
|
||||
FreeCAD.ActiveDocument.openTransaction("Alignment")
|
||||
taskd = _AlignTaskPanel()
|
||||
FreeCADGui.Control.showDialog(taskd)
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
|
||||
def IsActive(self):
|
||||
if FemGui.getActiveAnalysis():
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
class _AlignTaskPanel:
|
||||
'''The editmode TaskPanel for Material objects'''
|
||||
def __init__(self):
|
||||
# the panel has a tree widget that contains categories
|
||||
# for the subcomponents, such as additions, subtractions.
|
||||
# the categories are shown only if they are not empty.
|
||||
form_class, base_class = uic.loadUiType(FreeCAD.getHomePath() + "Mod/Machining_Distortion/Aligment.ui")
|
||||
|
||||
self.obj = None
|
||||
self.formUi = form_class()
|
||||
self.form = QtGui.QWidget()
|
||||
self.formUi.setupUi(self.form)
|
||||
|
||||
#Connect Signals and Slots
|
||||
#QtCore.QObject.connect(form.button_select_files, QtCore.SIGNAL("clicked()"), self.select_files)
|
||||
|
||||
self.update()
|
||||
|
||||
|
||||
def getStandardButtons(self):
|
||||
return int(QtGui.QDialogButtonBox.Ok) | int(QtGui.QDialogButtonBox.Cancel)
|
||||
|
||||
def update(self):
|
||||
'fills the widgets'
|
||||
return
|
||||
|
||||
def accept(self):
|
||||
FreeCADGui.Control.closeDialog()
|
||||
|
||||
def reject(self):
|
||||
FreeCADGui.Control.closeDialog()
|
||||
|
||||
|
||||
FreeCADGui.addCommand('MachDist_Alignment',_CommandAlignment())
|
||||
@@ -1,60 +0,0 @@
|
||||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2013 - Juergen Riegel <FreeCAD@juergen-riegel.net> *
|
||||
#* *
|
||||
#* This program is free software; you can redistribute it and/or modify *
|
||||
#* it under the terms of the GNU Lesser General Public License (LGPL) *
|
||||
#* as published by the Free Software Foundation; either version 2 of *
|
||||
#* the License, or (at your option) any later version. *
|
||||
#* for detail see the LICENCE text file. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD, Fem
|
||||
|
||||
if FreeCAD.GuiUp:
|
||||
import FreeCADGui
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore, QtGui
|
||||
from pivy import coin
|
||||
|
||||
__title__="Machine-Distortion Analysis managment"
|
||||
__author__ = "Juergen Riegel"
|
||||
__url__ = "http://free-cad.sourceforge.net"
|
||||
|
||||
|
||||
|
||||
class _CommandAnalysis:
|
||||
"the MachDist Analysis command definition"
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'MachDist_NewAnalysis',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("MachDist_Analysis","Machine-Distortion Analysis"),
|
||||
'Accel': "A",
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("MachDist_Analysis","Add or edit a Machine-Distortion Analysis")}
|
||||
|
||||
def Activated(self):
|
||||
FreeCAD.ActiveDocument.openTransaction("Create Analysis")
|
||||
FreeCADGui.addModule("FemGui")
|
||||
FreeCADGui.doCommand("App.activeDocument().addObject('Fem::FemAnalysis','MachineDistortion')")
|
||||
FreeCADGui.doCommand("FemGui.setActiveAnalysis(App.activeDocument().ActiveObject)")
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
FreeCADGui.Selection.clearSelection()
|
||||
|
||||
def IsActive(self):
|
||||
if FreeCADGui.ActiveDocument:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
FreeCADGui.addCommand('MachDist_Analysis',_CommandAnalysis())
|
||||
@@ -1,60 +0,0 @@
|
||||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2013 - Juergen Riegel <FreeCAD@juergen-riegel.net> *
|
||||
#* *
|
||||
#* This program is free software; you can redistribute it and/or modify *
|
||||
#* it under the terms of the GNU Lesser General Public License (LGPL) *
|
||||
#* as published by the Free Software Foundation; either version 2 of *
|
||||
#* the License, or (at your option) any later version. *
|
||||
#* for detail see the LICENCE text file. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD, Fem
|
||||
|
||||
if FreeCAD.GuiUp:
|
||||
import FreeCADGui
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore, QtGui
|
||||
from pivy import coin
|
||||
|
||||
__title__="Machine-Distortion Isostatic managment"
|
||||
__author__ = "Juergen Riegel"
|
||||
__url__ = "http://free-cad.sourceforge.net"
|
||||
|
||||
|
||||
|
||||
class _CommandIsostatic:
|
||||
"the MachDist Isostatic command definition"
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'MachDist_Isostatic',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("MachDist_Isostatic","Machine-Distortion Isostatic"),
|
||||
'Accel': "A",
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("MachDist_Isostatic","Add or edit a Machine-Distortion Isostatic")}
|
||||
|
||||
def Activated(self):
|
||||
FreeCAD.ActiveDocument.openTransaction("Create Isostatic")
|
||||
FreeCADGui.doCommand("import MachDist")
|
||||
FreeCADGui.doCommand("axe = MachDist.makeIsostatic()")
|
||||
FreeCADGui.doCommand("MachDist.makeStructuralSystem(" + MachDistCommands.getStringList(st) + ",[axe])")
|
||||
FreeCADGui.doCommand("MachDist.makeIsostatic()")
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
|
||||
def IsActive(self):
|
||||
if FemGui.getActiveAnalysis():
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
FreeCADGui.addCommand('MachDist_Isostatic',_CommandIsostatic())
|
||||
@@ -1,198 +0,0 @@
|
||||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2013 - Juergen Riegel <FreeCAD@juergen-riegel.net> *
|
||||
#* *
|
||||
#* This program is free software; you can redistribute it and/or modify *
|
||||
#* it under the terms of the GNU Lesser General Public License (LGPL) *
|
||||
#* as published by the Free Software Foundation; either version 2 of *
|
||||
#* the License, or (at your option) any later version. *
|
||||
#* for detail see the LICENCE text file. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD, Fem
|
||||
|
||||
if FreeCAD.GuiUp:
|
||||
import FreeCADGui,FemGui
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore, QtGui
|
||||
from pivy import coin
|
||||
import PyQt4.uic as uic
|
||||
|
||||
__title__="Machine-Distortion FemSetGeometryObject managment"
|
||||
__author__ = "Juergen Riegel"
|
||||
__url__ = "http://free-cad.sourceforge.net"
|
||||
|
||||
def makeMaterial(name):
|
||||
'''makeMaterial(name): makes an Material
|
||||
name there fore is a material name or an file name for a FCMat file'''
|
||||
obj = FreeCAD.ActiveDocument.addObject("App::MaterialObjectPython",name)
|
||||
_Material(obj)
|
||||
_ViewProviderMaterial(obj.ViewObject)
|
||||
#FreeCAD.ActiveDocument.recompute()
|
||||
return obj
|
||||
|
||||
class _CommandMaterial:
|
||||
"the MachDist Material command definition"
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'MachDist_Material',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("MachDist_Material","Material"),
|
||||
'Accel': "A, X",
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("MachDist_Material","Creates or edit the material definition.")}
|
||||
|
||||
def Activated(self):
|
||||
FreeCAD.ActiveDocument.openTransaction("Create Material")
|
||||
FreeCADGui.addModule("MachDistMaterial")
|
||||
FreeCADGui.doCommand("mat = MachDistMaterial.makeMaterial('Material')")
|
||||
FreeCADGui.doCommand("App.activeDocument()."+FemGui.getActiveAnalysis().Name+".Member = App.activeDocument()."+FemGui.getActiveAnalysis().Name+".Member + [mat]")
|
||||
FreeCADGui.doCommand("Gui.activeDocument().setEdit(mat.Name,0)")
|
||||
#FreeCADGui.doCommand("MachDist.makeMaterial()")
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
def IsActive(self):
|
||||
if FemGui.getActiveAnalysis():
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
|
||||
class _Material:
|
||||
"The Material object"
|
||||
def __init__(self,obj):
|
||||
self.Type = "MachDistMaterial"
|
||||
obj.Proxy = self
|
||||
#obj.addProperty("App::PropertyString","MaterialName","Base",
|
||||
# "The name of the distorion material")
|
||||
|
||||
|
||||
def execute(self,obj):
|
||||
return
|
||||
|
||||
def onChanged(self,obj,prop):
|
||||
if prop in ["MaterialName"]:
|
||||
return
|
||||
|
||||
def __getstate__(self):
|
||||
return self.Type
|
||||
|
||||
def __setstate__(self,state):
|
||||
if state:
|
||||
self.Type = state
|
||||
|
||||
class _ViewProviderMaterial:
|
||||
"A View Provider for the Material object"
|
||||
|
||||
def __init__(self,vobj):
|
||||
#vobj.addProperty("App::PropertyLength","BubbleSize","Base", str(translate("MachDist","The size of the axis bubbles")))
|
||||
vobj.Proxy = self
|
||||
|
||||
def getIcon(self):
|
||||
import machdist_rc
|
||||
return ":/icons/MachDist_Material.svg"
|
||||
|
||||
def claimChildren(self):
|
||||
return []
|
||||
|
||||
def attach(self, vobj):
|
||||
self.ViewObject = vobj
|
||||
self.Object = vobj.Object
|
||||
self.bubbles = None
|
||||
|
||||
|
||||
def updateData(self, obj, prop):
|
||||
return
|
||||
|
||||
def onChanged(self, vobj, prop):
|
||||
return
|
||||
|
||||
def setEdit(self,vobj,mode):
|
||||
taskd = _MaterialTaskPanel()
|
||||
taskd.obj = vobj.Object
|
||||
taskd.update()
|
||||
FreeCADGui.Control.showDialog(taskd)
|
||||
return True
|
||||
|
||||
def unsetEdit(self,vobj,mode):
|
||||
FreeCADGui.Control.closeDialog()
|
||||
return
|
||||
|
||||
def __getstate__(self):
|
||||
return None
|
||||
|
||||
def __setstate__(self,state):
|
||||
return None
|
||||
|
||||
|
||||
class _MaterialTaskPanel:
|
||||
'''The editmode TaskPanel for Material objects'''
|
||||
def __init__(self):
|
||||
# the panel has a tree widget that contains categories
|
||||
# for the subcomponents, such as additions, subtractions.
|
||||
# the categories are shown only if they are not empty.
|
||||
form_class, base_class = uic.loadUiType(FreeCAD.getHomePath() + "Mod/Machining_Distortion/Material.ui")
|
||||
|
||||
self.obj = None
|
||||
self.formUi = form_class()
|
||||
self.form = QtGui.QWidget()
|
||||
self.formUi.setupUi(self.form)
|
||||
#self.form.setObjectName("TaskPanel")
|
||||
#self.grid = QtGui.QGridLayout(self.form)
|
||||
#self.grid.setObjectName("grid")
|
||||
#self.title = QtGui.QLabel(self.form)
|
||||
#self.grid.addWidget(self.title, 0, 0, 1, 2)
|
||||
|
||||
# tree
|
||||
#self.tree = QtGui.QTreeWidget(self.form)
|
||||
#self.grid.addWidget(self.tree, 1, 0, 1, 2)
|
||||
#self.tree.setColumnCount(3)
|
||||
#self.tree.header().resizeSection(0,50)
|
||||
#self.tree.header().resizeSection(1,80)
|
||||
#self.tree.header().resizeSection(2,60)
|
||||
|
||||
# buttons
|
||||
#self.addButton = QtGui.QPushButton(self.form)
|
||||
#self.addButton.setObjectName("addButton")
|
||||
#self.addButton.setIcon(QtGui.QIcon(":/icons/MachDist_Add.svg"))
|
||||
#self.grid.addWidget(self.addButton, 3, 0, 1, 1)
|
||||
#self.addButton.setEnabled(True)
|
||||
|
||||
#self.delButton = QtGui.QPushButton(self.form)
|
||||
#self.delButton.setObjectName("delButton")
|
||||
#self.delButton.setIcon(QtGui.QIcon(":/icons/MachDist_Remove.svg"))
|
||||
#self.grid.addWidget(self.delButton, 3, 1, 1, 1)
|
||||
#self.delButton.setEnabled(True)
|
||||
|
||||
#QtCore.QObject.connect(self.addButton, QtCore.SIGNAL("clicked()"), self.addElement)
|
||||
#QtCore.QObject.connect(self.delButton, QtCore.SIGNAL("clicked()"), self.removeElement)
|
||||
self.update()
|
||||
|
||||
def isAllowedAlterSelection(self):
|
||||
return False
|
||||
|
||||
def isAllowedAlterView(self):
|
||||
return True
|
||||
|
||||
def getStandardButtons(self):
|
||||
return int(QtGui.QDialogButtonBox.Ok) | int(QtGui.QDialogButtonBox.Cancel)
|
||||
|
||||
def update(self):
|
||||
'fills the widgets'
|
||||
return
|
||||
|
||||
def accept(self):
|
||||
FreeCADGui.ActiveDocument.resetEdit()
|
||||
|
||||
def reject(self):
|
||||
FreeCADGui.ActiveDocument.resetEdit()
|
||||
|
||||
|
||||
FreeCADGui.addCommand('MachDist_Material',_CommandMaterial())
|
||||
@@ -1,59 +0,0 @@
|
||||
#***************************************************************************
|
||||
#* *
|
||||
#* Copyright (c) 2013 - Juergen Riegel <FreeCAD@juergen-riegel.net> *
|
||||
#* *
|
||||
#* This program is free software; you can redistribute it and/or modify *
|
||||
#* it under the terms of the GNU Lesser General Public License (LGPL) *
|
||||
#* as published by the Free Software Foundation; either version 2 of *
|
||||
#* the License, or (at your option) any later version. *
|
||||
#* for detail see the LICENCE text file. *
|
||||
#* *
|
||||
#* This program 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 program; if not, write to the Free Software *
|
||||
#* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
||||
#* USA *
|
||||
#* *
|
||||
#***************************************************************************
|
||||
|
||||
import FreeCAD, Fem
|
||||
|
||||
if FreeCAD.GuiUp:
|
||||
import FreeCADGui
|
||||
from FreeCAD import Vector
|
||||
from PyQt4 import QtCore, QtGui
|
||||
from pivy import coin
|
||||
|
||||
__title__="Machine-Distortion Mesh managment"
|
||||
__author__ = "Juergen Riegel"
|
||||
__url__ = "http://free-cad.sourceforge.net"
|
||||
|
||||
|
||||
|
||||
class _CommandMesh:
|
||||
"the MachDist Mesh command definition"
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'MachDist_AddFemMesh',
|
||||
'MenuText': QtCore.QT_TRANSLATE_NOOP("MachDist_Mesh","Add Mesh"),
|
||||
'Accel': "M",
|
||||
'ToolTip': QtCore.QT_TRANSLATE_NOOP("MachDist_Mesh","Creates or edit the material definition.")}
|
||||
|
||||
def Activated(self):
|
||||
FreeCAD.ActiveDocument.openTransaction("Create Mesh")
|
||||
FreeCADGui.doCommand("import MachDist")
|
||||
FreeCADGui.doCommand("axe = MachDist.makeMesh()")
|
||||
FreeCADGui.doCommand("MachDist.makeStructuralSystem(" + MachDistCommands.getStringList(st) + ",[axe])")
|
||||
FreeCADGui.doCommand("MachDist.makeMesh()")
|
||||
FreeCAD.ActiveDocument.commitTransaction()
|
||||
|
||||
def IsActive(self):
|
||||
if FemGui.getActiveAnalysis():
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
FreeCADGui.addCommand('MachDist_Mesh',_CommandMesh())
|
||||
@@ -1,105 +0,0 @@
|
||||
# Machining Distortion Commands
|
||||
|
||||
|
||||
# import FreeCAD modules
|
||||
import FreeCAD, FreeCADGui, Fem, sys
|
||||
from PyQt4 import QtGui,QtCore
|
||||
from FreeCAD import Base
|
||||
|
||||
# globals
|
||||
import mach_dist_gui
|
||||
import postprocess_gui
|
||||
import time
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# The command classes
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
class MachiningDistortion_StartGUI:
|
||||
|
||||
def Activated(self):
|
||||
# pi=Base.ProgressIndicator()
|
||||
# pi.start("Hello, World!",100)
|
||||
# for i in range(100):
|
||||
# time.sleep(1)
|
||||
# pi.next()
|
||||
# pi.stop()
|
||||
myapp = mach_dist_gui.MyForm(QtGui.qApp.activeWindow())
|
||||
myapp.exec_()
|
||||
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'Std_Tool1', 'MenuText': 'Open Machining Distortion GUI', 'ToolTip': 'Start Up the main GUI'}
|
||||
|
||||
class MachiningDistortion_StartPostprocess:
|
||||
|
||||
def Activated(self):
|
||||
app = postprocess_gui.MyForm(QtGui.qApp.activeWindow())
|
||||
app.exec_()
|
||||
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'Std_Tool2', 'MenuText': 'Open Machining Distortion Postprocess GUI', 'ToolTip': 'Start Up the postprocess GUI'}
|
||||
|
||||
|
||||
class MachiningDistortion_ChooseParameter:
|
||||
"Start Main GUI"
|
||||
def Activated(self):
|
||||
from PyQt4 import QtGui
|
||||
import PyQt4.uic as uic
|
||||
form_class, base_class = uic.loadUiType(FreeCAD.getHomePath() + "Mod/MachiningDistortion/User_Interface_Mach_Dist.ui")
|
||||
# instaciate the UI dialog
|
||||
form = form_class()
|
||||
# create the actuall dialog
|
||||
dlg = QtGui.QDialog()
|
||||
# set the Ui to the dialog
|
||||
form.setupUi(dlg)
|
||||
#run the dialog
|
||||
rtn = dlg.exec_()
|
||||
# get the values of the Form
|
||||
|
||||
#Connect Signals and Slots
|
||||
QtCore.QObject.connect(form.button_select_files, QtCore.SIGNAL("clicked()"), self.select_files)
|
||||
QtCore.QObject.connect(form.button_select_output, QtCore.SIGNAL("clicked()"), self.select_output)
|
||||
QtCore.QObject.connect(form.button_dialog, QtCore.SIGNAL("accepted()"), self.onAbbrechen)
|
||||
QtCore.QObject.connect(form.button_dialog, QtCore.SIGNAL("rejected()"), self.onAbbrechen)
|
||||
QtCore.QObject.connect(form.button_start_calculation, QtCore.SIGNAL("clicked()"), self.start_calculation)
|
||||
|
||||
|
||||
def select_files(self):
|
||||
filenames=QtGui.QFileDialog.getOpenFileNames(None, 'Open file','','Nastran Files (*.bdf)')
|
||||
|
||||
def select_output(self):
|
||||
self.dirname=QtGui.QFileDialog.getExistingDirectory(None, 'Open working directory', '', QtGui.QFileDialog.ShowDirsOnly)
|
||||
self.button_start_calculation.setEnabled(True)
|
||||
|
||||
def onAbbrechen(self):
|
||||
form.close()
|
||||
|
||||
def start_calculation(self):
|
||||
##Get values from the GUI
|
||||
young_modulus = form.spinBox_young_modulus.value()
|
||||
poisson_ratio = form.spinBox_poisson_ratio.value()
|
||||
z_level_from = form.spinBox_z_level_from.value()
|
||||
z_level_to = form.spinBox_z_level_to.value()
|
||||
misalignment_x = form.spinBox_misalignment_x.value()
|
||||
misalignment_y = form.spinBox_misalignment_y.value()
|
||||
misalignment_z = form.spinBox_misalignment_z.value()
|
||||
fly_to_buy = form.check_fly_to_buy.isChecked()
|
||||
|
||||
|
||||
FreeCAD.Console.PrintMessage("Start with:"+ `misalignment_x` + "\n" )
|
||||
|
||||
|
||||
def GetResources(self):
|
||||
return {'Pixmap' : 'Std_Tool3', 'MenuText': 'parameters...', 'ToolTip': 'Choose the parameters'}
|
||||
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------
|
||||
# Adds the commands to the FreeCAD command manager
|
||||
#---------------------------------------------------------------------------
|
||||
|
||||
FreeCADGui.addCommand('MachiningDistortion_StartGUI',MachiningDistortion_StartGUI())
|
||||
FreeCADGui.addCommand('MachiningDistortion_StartPostprocess',MachiningDistortion_StartPostprocess())
|
||||
FreeCADGui.addCommand('MachiningDistortion_ChooseParameter',MachiningDistortion_ChooseParameter())
|
||||
|
||||
@@ -1,518 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Form</class>
|
||||
<widget class="QWidget" name="Form">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>177</width>
|
||||
<height>462</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QDoubleSpinBox" name="spinBox_young_modulus">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>999999.989999999990687</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>70000.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Young Modulus</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QDoubleSpinBox" name="spinBox_poisson_ratio">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>0.300000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Poisson Ratio</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QDoubleSpinBox" name="spinBox_Plate_Thickness">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="layoutDirection">
|
||||
<enum>Qt::LeftToRight</enum>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>500.000000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>40.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Plate Thickness</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QPushButton" name="select_L_file">
|
||||
<property name="text">
|
||||
<string>Select L File</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QDoubleSpinBox" name="lc1">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string>LC1</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QDoubleSpinBox" name="lc2">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="QLabel" name="label_12">
|
||||
<property name="text">
|
||||
<string>LC2</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QDoubleSpinBox" name="lc3">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<widget class="QLabel" name="label_11">
|
||||
<property name="text">
|
||||
<string>LC3</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<widget class="QDoubleSpinBox" name="lc4">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1">
|
||||
<widget class="QLabel" name="label_10">
|
||||
<property name="text">
|
||||
<string>LC4</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<widget class="QDoubleSpinBox" name="lc5">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="1">
|
||||
<widget class="QLabel" name="label_19">
|
||||
<property name="text">
|
||||
<string>LC5</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="0">
|
||||
<widget class="QDoubleSpinBox" name="lc6">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="1">
|
||||
<widget class="QLabel" name="label_20">
|
||||
<property name="text">
|
||||
<string>LC6</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="10" column="0">
|
||||
<widget class="QPushButton" name="select_LT_file">
|
||||
<property name="text">
|
||||
<string>Select LT File</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="11" column="0">
|
||||
<widget class="QDoubleSpinBox" name="ltc1">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="11" column="1">
|
||||
<widget class="QLabel" name="label_16">
|
||||
<property name="text">
|
||||
<string>LTC1</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="12" column="0">
|
||||
<widget class="QDoubleSpinBox" name="ltc2">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="12" column="1">
|
||||
<widget class="QLabel" name="label_13">
|
||||
<property name="text">
|
||||
<string>LTC2</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="13" column="0">
|
||||
<widget class="QDoubleSpinBox" name="ltc3">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="13" column="1">
|
||||
<widget class="QLabel" name="label_14">
|
||||
<property name="text">
|
||||
<string>LTC3</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="14" column="0">
|
||||
<widget class="QDoubleSpinBox" name="ltc4">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="14" column="1">
|
||||
<widget class="QLabel" name="label_15">
|
||||
<property name="text">
|
||||
<string>LTC4</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="15" column="0">
|
||||
<widget class="QDoubleSpinBox" name="ltc5">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="15" column="1">
|
||||
<widget class="QLabel" name="label_17">
|
||||
<property name="text">
|
||||
<string>LTC5</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="16" column="0">
|
||||
<widget class="QDoubleSpinBox" name="ltc6">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>80</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>7</number>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<double>-99.999999000000003</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>99.999999000000003</double>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<double>0.100000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="16" column="1">
|
||||
<widget class="QLabel" name="label_18">
|
||||
<property name="text">
|
||||
<string>LTC6</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -1,72 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file 'Parameter.ui'
|
||||
#
|
||||
# Created: Fri Dec 17 12:28:02 2010
|
||||
# by: PyQt4 UI code generator 4.7.2
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
class Ui_DialogParameter(object):
|
||||
def setupUi(self, DialogParameter):
|
||||
DialogParameter.setObjectName("DialogParameter")
|
||||
DialogParameter.setWindowModality(QtCore.Qt.ApplicationModal)
|
||||
DialogParameter.resize(178, 136)
|
||||
self.verticalLayout = QtGui.QVBoxLayout(DialogParameter)
|
||||
self.verticalLayout.setObjectName("verticalLayout")
|
||||
self.horizontalLayout = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName("horizontalLayout")
|
||||
self.label = QtGui.QLabel(DialogParameter)
|
||||
self.label.setObjectName("label")
|
||||
self.horizontalLayout.addWidget(self.label)
|
||||
self.ValueStart = QtGui.QDoubleSpinBox(DialogParameter)
|
||||
self.ValueStart.setMinimum(-99.0)
|
||||
self.ValueStart.setMaximum(0.0)
|
||||
self.ValueStart.setProperty("value", -5.0)
|
||||
self.ValueStart.setObjectName("ValueStart")
|
||||
self.horizontalLayout.addWidget(self.ValueStart)
|
||||
self.verticalLayout.addLayout(self.horizontalLayout)
|
||||
self.horizontalLayout_2 = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
|
||||
self.label_2 = QtGui.QLabel(DialogParameter)
|
||||
self.label_2.setObjectName("label_2")
|
||||
self.horizontalLayout_2.addWidget(self.label_2)
|
||||
self.ValueEnd = QtGui.QDoubleSpinBox(DialogParameter)
|
||||
self.ValueEnd.setProperty("value", 5.0)
|
||||
self.ValueEnd.setObjectName("ValueEnd")
|
||||
self.horizontalLayout_2.addWidget(self.ValueEnd)
|
||||
self.verticalLayout.addLayout(self.horizontalLayout_2)
|
||||
self.line = QtGui.QFrame(DialogParameter)
|
||||
self.line.setFrameShape(QtGui.QFrame.HLine)
|
||||
self.line.setFrameShadow(QtGui.QFrame.Sunken)
|
||||
self.line.setObjectName("line")
|
||||
self.verticalLayout.addWidget(self.line)
|
||||
self.horizontalLayout_3 = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
|
||||
self.label_3 = QtGui.QLabel(DialogParameter)
|
||||
self.label_3.setObjectName("label_3")
|
||||
self.horizontalLayout_3.addWidget(self.label_3)
|
||||
self.ValueSize = QtGui.QDoubleSpinBox(DialogParameter)
|
||||
self.ValueSize.setProperty("value", 1.0)
|
||||
self.ValueSize.setObjectName("ValueSize")
|
||||
self.horizontalLayout_3.addWidget(self.ValueSize)
|
||||
self.verticalLayout.addLayout(self.horizontalLayout_3)
|
||||
self.buttonBox = QtGui.QDialogButtonBox(DialogParameter)
|
||||
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
|
||||
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
|
||||
self.buttonBox.setObjectName("buttonBox")
|
||||
self.verticalLayout.addWidget(self.buttonBox)
|
||||
|
||||
self.retranslateUi(DialogParameter)
|
||||
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), DialogParameter.accept)
|
||||
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), DialogParameter.reject)
|
||||
QtCore.QMetaObject.connectSlotsByName(DialogParameter)
|
||||
|
||||
def retranslateUi(self, DialogParameter):
|
||||
DialogParameter.setWindowTitle(QtGui.QApplication.translate("DialogParameter", "Dialog", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label.setText(QtGui.QApplication.translate("DialogParameter", "Start value:", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_2.setText(QtGui.QApplication.translate("DialogParameter", "End value:", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_3.setText(QtGui.QApplication.translate("DialogParameter", "Step size:", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
@@ -1,134 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>DialogParameter</class>
|
||||
<widget class="QDialog" name="DialogParameter">
|
||||
<property name="windowModality">
|
||||
<enum>Qt::ApplicationModal</enum>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>178</width>
|
||||
<height>136</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Start value:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDoubleSpinBox" name="ValueStart">
|
||||
<property name="minimum">
|
||||
<double>-99.000000000000000</double>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>0.000000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>-5.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>End value:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDoubleSpinBox" name="ValueEnd">
|
||||
<property name="value">
|
||||
<double>5.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Step size:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDoubleSpinBox" name="ValueSize">
|
||||
<property name="value">
|
||||
<double>1.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>DialogParameter</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>DialogParameter</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
||||
@@ -1,406 +0,0 @@
|
||||
<?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.48.4 r9939"
|
||||
sodipodi:docname="Arch_Roof.svg">
|
||||
<defs
|
||||
id="defs2818">
|
||||
<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.24227019,-0.62451792,0.66563096,0.22730625,5.6049058,42.273138)" />
|
||||
</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="-9.4525225"
|
||||
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="0"
|
||||
inkscape:window-y="19"
|
||||
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></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<path
|
||||
style="fill:url(#linearGradient3695);fill-opacity:1;stroke:#3e2806;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="M 29.767856,9.989093 50.450594,9.9835238 50.198132,53.0683 29.729643,53.165756 z"
|
||||
id="path2896"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:8,4;stroke-dashoffset:0"
|
||||
d="M 29.729643,53.165756 C 29.746484,34.137259 13.627876,9.488494 13.627876,9.488494 c 0,0 14.854331,0.5009452 16.13998,0.500599 9.513178,-0.00256 20.430276,43.079207 20.430276,43.079207 z"
|
||||
id="path3863"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccscc" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 14 KiB |
@@ -1,406 +0,0 @@
|
||||
<?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.48.4 r9939"
|
||||
sodipodi:docname="MachDist.svg">
|
||||
<defs
|
||||
id="defs2818">
|
||||
<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.24326871,-0.56997241,0.66837436,0.20745328,-0.94334799,38.386707)" />
|
||||
</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="-9.4525225"
|
||||
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="0"
|
||||
inkscape:window-y="19"
|
||||
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></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<path
|
||||
style="fill:url(#linearGradient3695);fill-opacity:1;stroke:#3e2806;stroke-width:1.91459799;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="M 23.31919,8.9223569 44.087173,8.9172741 43.83367,48.239018 23.28082,48.327962 z"
|
||||
id="path2896"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
|
||||
d="m 50.894953,51.660143 0,0 5.6574,6.258529 -45.99366,-0.274825 -0.513897,-51.1176504 6.154378,8.1048924 0,0"
|
||||
id="path3865"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 14 KiB |
@@ -1,219 +0,0 @@
|
||||
<?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="svg2860"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="MachDist_FemMesh.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
version="1.1">
|
||||
<defs
|
||||
id="defs2862">
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3377"
|
||||
id="radialGradient3692"
|
||||
cx="45.883327"
|
||||
cy="28.869568"
|
||||
fx="45.883327"
|
||||
fy="28.869568"
|
||||
r="19.467436"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3377"
|
||||
id="radialGradient3703"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="135.38333"
|
||||
cy="97.369568"
|
||||
fx="135.38333"
|
||||
fy="97.369568"
|
||||
r="19.467436"
|
||||
gradientTransform="matrix(0.97435,0.2250379,-0.4623105,2.0016728,48.487554,-127.99883)" />
|
||||
<linearGradient
|
||||
id="linearGradient3377">
|
||||
<stop
|
||||
id="stop3379"
|
||||
offset="0"
|
||||
style="stop-color:#faff2b;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3381"
|
||||
offset="1"
|
||||
style="stop-color:#ffaa00;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3377"
|
||||
id="radialGradient3705"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="148.88333"
|
||||
cy="81.869568"
|
||||
fx="148.88333"
|
||||
fy="81.869568"
|
||||
r="19.467436"
|
||||
gradientTransform="matrix(1.3852588,-5.1367833e-2,3.7056289e-2,0.9993132,-60.392403,7.7040438)" />
|
||||
<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="perspective2868" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.5"
|
||||
inkscape:cx="7.0909091"
|
||||
inkscape:cy="29.272727"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="750"
|
||||
inkscape:window-x="1307"
|
||||
inkscape:window-y="89"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata2865">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
id="g3618"
|
||||
transform="translate(-129.7515,-68.681262)">
|
||||
<path
|
||||
style="opacity:0.66523605;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.07586193;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 164.25407,125.89934 L 185.75844,120.53301 L 191.3165,115.1667 L 181.45756,113.73568 L 164.25407,125.89934 z"
|
||||
id="path3546" />
|
||||
<path
|
||||
style="opacity:1;fill:url(#radialGradient3705);fill-opacity:1;fill-rule:evenodd;stroke:#7b5600;stroke-width:2.20000005;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 152.88222,77.612314 L 133.06781,84.791524 L 163.56337,88.940395 L 163.98885,124.71349 L 180.09861,114.12316 L 180.67448,79.738312 L 152.88222,77.612314 z"
|
||||
id="rect3522"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:url(#radialGradient3703);fill-opacity:1;fill-rule:evenodd;stroke:#7b5600;stroke-width:2.20000005;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 133.33785,84.998317 L 164.04669,88.363932 L 164.04669,124.84112 L 132.92286,119.77634 L 133.33785,84.998317 z"
|
||||
id="rect3520"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:url(#radialGradient3692);fill-opacity:1;fill-rule:evenodd;stroke:#7b5600;stroke-width:2.20000005;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 163.81279,88.408895 L 180.53877,80.000095"
|
||||
id="path3536" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 10.545455,17.272727 L 9.6363636,52"
|
||||
id="path2390" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 18.545455,18 C 18.545455,18.060606 18.545455,18.121212 18.545455,18 z"
|
||||
id="path2392" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 16,53.454545 C 16.060606,53.454545 16.121212,53.454545 16,53.454545 z"
|
||||
id="path2394" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 19.090909,53.818182 L 20,18.909091"
|
||||
id="path2398"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 28.545455,19.272727 L 27.454545,55.454545"
|
||||
id="path2400" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 10.727273,17.090909 C 10.969697,17.090909 10.969697,17.090909 10.727273,17.090909 z"
|
||||
id="path2402" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 28.545455,8.7272727 C 28.545455,8.7878788 28.545455,8.8484848 28.545455,8.7272727 z"
|
||||
id="path2404" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 27.636364,9.0909091 C 27.575758,9.0909091 27.515152,9.0909091 27.636364,9.0909091 z"
|
||||
id="path2406" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 29.090909,9.6363637 C 28.839485,9.9151131 11.048018,15.903965 10.727273,16.545455"
|
||||
id="path2408"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 37,10.181818 C 36.748576,10.460567 20.048018,17.722146 20.636364,18.181818"
|
||||
id="path2410"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 45.28032,10.909091 C 45.028896,11.18784 28.328338,18.449419 28.916684,18.909091"
|
||||
id="path2412"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 52.007593,18.727273 C 51.756169,19.006022 35.055611,26.267601 35.643957,26.727273"
|
||||
id="path2414"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 52.007593,26.727273 C 51.756169,27.006022 35.055611,34.267601 35.643957,34.727273"
|
||||
id="path2416"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 51.28032,34.727273 C 51.028896,35.006022 34.328338,42.267601 34.916684,42.727273"
|
||||
id="path2418"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 50.734866,41.636364 C 50.483442,41.915113 33.782884,49.176692 34.37123,49.636364"
|
||||
id="path2420"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 3.8181818,23.636364 C 4.0606061,23.636364 4.0606061,23.636364 3.8181818,23.636364 z"
|
||||
id="path2422" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 3.6363636,23.636364 L 34.545455,26.909091"
|
||||
id="path2424" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 34,34.909091 L 3.8181818,31.454545"
|
||||
id="path2426" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 34.181818,43.454545 L 2.9090909,40.181818"
|
||||
id="path2432" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 34,49.818182 L 3.4545455,46.545455"
|
||||
id="path2434" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 10 KiB |
@@ -1,250 +0,0 @@
|
||||
<?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="svg2860"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="MachDist_FemMesh.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
version="1.1">
|
||||
<defs
|
||||
id="defs2862">
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3377"
|
||||
id="radialGradient3692"
|
||||
cx="45.883327"
|
||||
cy="28.869568"
|
||||
fx="45.883327"
|
||||
fy="28.869568"
|
||||
r="19.467436"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3377"
|
||||
id="radialGradient3703"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="135.38333"
|
||||
cy="97.369568"
|
||||
fx="135.38333"
|
||||
fy="97.369568"
|
||||
r="19.467436"
|
||||
gradientTransform="matrix(0.97435,0.2250379,-0.4623105,2.0016728,48.487554,-127.99883)" />
|
||||
<linearGradient
|
||||
id="linearGradient3377">
|
||||
<stop
|
||||
id="stop3379"
|
||||
offset="0"
|
||||
style="stop-color:#faff2b;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop3381"
|
||||
offset="1"
|
||||
style="stop-color:#ffaa00;stop-opacity:1;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3377"
|
||||
id="radialGradient3705"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="148.88333"
|
||||
cy="81.869568"
|
||||
fx="148.88333"
|
||||
fy="81.869568"
|
||||
r="19.467436"
|
||||
gradientTransform="matrix(1.3852588,-5.1367833e-2,3.7056289e-2,0.9993132,-60.392403,7.7040438)" />
|
||||
<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="perspective2868" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="5.5"
|
||||
inkscape:cx="1.1818182"
|
||||
inkscape:cy="29.272727"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="750"
|
||||
inkscape:window-x="1167"
|
||||
inkscape:window-y="114"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata2865">
|
||||
<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:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
id="g3618"
|
||||
transform="translate(-129.7515,-68.681262)">
|
||||
<path
|
||||
style="opacity:0.66523605;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.07586193;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 164.25407,125.89934 L 185.75844,120.53301 L 191.3165,115.1667 L 181.45756,113.73568 L 164.25407,125.89934 z"
|
||||
id="path3546" />
|
||||
<path
|
||||
style="opacity:1;fill:url(#radialGradient3705);fill-opacity:1;fill-rule:evenodd;stroke:#7b5600;stroke-width:2.20000005;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 152.88222,77.612314 L 133.06781,84.791524 L 163.56337,88.940395 L 163.98885,124.71349 L 180.09861,114.12316 L 180.67448,79.738312 L 152.88222,77.612314 z"
|
||||
id="rect3522"
|
||||
sodipodi:nodetypes="ccccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:url(#radialGradient3703);fill-opacity:1;fill-rule:evenodd;stroke:#7b5600;stroke-width:2.20000005;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 133.33785,84.998317 L 164.04669,88.363932 L 164.04669,124.84112 L 132.92286,119.77634 L 133.33785,84.998317 z"
|
||||
id="rect3520"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="opacity:1;fill:url(#radialGradient3692);fill-opacity:1;fill-rule:evenodd;stroke:#7b5600;stroke-width:2.20000005;stroke-linecap:butt;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||
d="M 163.81279,88.408895 L 180.53877,80.000095"
|
||||
id="path3536" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 10.545455,17.272727 L 9.6363636,52"
|
||||
id="path2390" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 18.545455,18 C 18.545455,18.060606 18.545455,18.121212 18.545455,18 z"
|
||||
id="path2392" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 16,53.454545 C 16.060606,53.454545 16.121212,53.454545 16,53.454545 z"
|
||||
id="path2394" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 19.090909,53.818182 L 20,18.909091"
|
||||
id="path2398"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 28.545455,19.272727 L 27.454545,55.454545"
|
||||
id="path2400" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 10.727273,17.090909 C 10.969697,17.090909 10.969697,17.090909 10.727273,17.090909 z"
|
||||
id="path2402" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 28.545455,8.7272727 C 28.545455,8.7878788 28.545455,8.8484848 28.545455,8.7272727 z"
|
||||
id="path2404" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 27.636364,9.0909091 C 27.575758,9.0909091 27.515152,9.0909091 27.636364,9.0909091 z"
|
||||
id="path2406" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 29.090909,9.6363637 C 28.839485,9.9151131 11.048018,15.903965 10.727273,16.545455"
|
||||
id="path2408"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 37,10.181818 C 36.748576,10.460567 20.048018,17.722146 20.636364,18.181818"
|
||||
id="path2410"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 45.28032,10.909091 C 45.028896,11.18784 28.328338,18.449419 28.916684,18.909091"
|
||||
id="path2412"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 52.007593,18.727273 C 51.756169,19.006022 35.055611,26.267601 35.643957,26.727273"
|
||||
id="path2414"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 52.007593,26.727273 C 51.756169,27.006022 35.055611,34.267601 35.643957,34.727273"
|
||||
id="path2416"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 51.28032,34.727273 C 51.028896,35.006022 34.328338,42.267601 34.916684,42.727273"
|
||||
id="path2418"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 50.734866,41.636364 C 50.483442,41.915113 33.782884,49.176692 34.37123,49.636364"
|
||||
id="path2420"
|
||||
sodipodi:nodetypes="cc" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 3.8181818,23.636364 C 4.0606061,23.636364 4.0606061,23.636364 3.8181818,23.636364 z"
|
||||
id="path2422" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 3.6363636,23.636364 L 34.545455,26.909091"
|
||||
id="path2424" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 34,34.909091 L 3.8181818,31.454545"
|
||||
id="path2426" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 34.181818,43.454545 L 2.9090909,40.181818"
|
||||
id="path2432" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 34,49.818182 L 3.4545455,46.545455"
|
||||
id="path2434" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="fill:#ff0900;fill-opacity:1;fill-rule:nonzero;stroke:#ff0900;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path3033"
|
||||
sodipodi:cx="32.885815"
|
||||
sodipodi:cy="39.529411"
|
||||
sodipodi:rx="4.0143385"
|
||||
sodipodi:ry="2.435986"
|
||||
d="m 36.900153,39.529411 a 4.0143385,2.435986 0 1 1 -8.028677,0 4.0143385,2.435986 0 1 1 8.028677,0 z"
|
||||
transform="matrix(0.71015233,0.23558117,-0.25090762,0.69465003,37.92793,10.339069)" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#00ff00;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path3033-1"
|
||||
sodipodi:cx="32.885815"
|
||||
sodipodi:cy="39.529411"
|
||||
sodipodi:rx="4.0143385"
|
||||
sodipodi:ry="2.435986"
|
||||
d="m 36.900153,39.529411 a 4.0143385,2.435986 0 1 1 -8.028677,0 4.0143385,2.435986 0 1 1 8.028677,0 z"
|
||||
transform="matrix(0.71015233,0.23558117,-0.25090762,0.69465003,20.564293,20.066342)" />
|
||||
<path
|
||||
sodipodi:type="arc"
|
||||
style="fill:#00ff00;fill-opacity:1;fill-rule:nonzero;stroke:#006bfe;stroke-width:5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path3033-1-7"
|
||||
sodipodi:cx="32.885815"
|
||||
sodipodi:cy="39.529411"
|
||||
sodipodi:rx="4.0143385"
|
||||
sodipodi:ry="2.435986"
|
||||
d="m 36.900153,39.529411 a 4.0143385,2.435986 0 1 1 -8.028677,0 4.0143385,2.435986 0 1 1 8.028677,0 z"
|
||||
transform="matrix(0.71015233,0.23558117,-0.25090762,0.69465003,-8.1629809,16.793615)" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 7.4 KiB |
@@ -1,447 +0,0 @@
|
||||
<?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.48.4 r9939"
|
||||
sodipodi:docname="MachDist_NewAnalysis.svg">
|
||||
<defs
|
||||
id="defs2818">
|
||||
<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.19230652,-0.6275745,0.5283571,0.22841875,1.152607,44.32671)" />
|
||||
<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="radialGradient4227"
|
||||
xlink:href="#linearGradient12512"
|
||||
inkscape:collect="always" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="8.453125"
|
||||
inkscape:cx="32"
|
||||
inkscape:cy="32"
|
||||
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="0"
|
||||
inkscape:window-y="19"
|
||||
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></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<path
|
||||
style="fill:url(#linearGradient3695);fill-opacity:1;stroke:#3e2806;stroke-width:1.78622925;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
|
||||
d="m 20.332403,11.884658 16.417313,-0.0056 -0.200397,43.295647 -16.247248,0.09794 z"
|
||||
id="path2896"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:none;stroke:#000000;stroke-width:1.78622925;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:7.1449172, 3.5724586;stroke-dashoffset:0"
|
||||
d="M 20.302071,55.272641 C 20.315439,36.151013 7.5209907,11.381609 7.5209907,11.381609 c 0,0 11.7909043,0.503396 12.8114123,0.503049 7.551265,-0.0026 16.216916,43.29005 16.216916,43.29005 z"
|
||||
id="path3863"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccscc" />
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 49.933457,10.066543 -7.571165,10.76525 5.441774,-0.118299 0,16.561922 5.560074,0 -0.118299,-16.443623 4.968577,-0.118299 z"
|
||||
id="path4248"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccc" />
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 15 KiB |
@@ -1,16 +0,0 @@
|
||||
<RCC>
|
||||
<qresource>
|
||||
<file>ui/userprefs-base.ui</file>
|
||||
<file>icons/MachDist.svg</file>
|
||||
<file>icons/MachDist_AddMaterial.svg</file>
|
||||
<file>icons/MachDist_AddPart.svg</file>
|
||||
<file>icons/MachDist_Align.svg</file>
|
||||
<file>icons/MachDist_Material.svg</file>
|
||||
<file>icons/MachDist_NewAnalysis.svg</file>
|
||||
<file>icons/MachDist_Preferences.svg</file>
|
||||
<file>icons/MachDist_Upload.svg</file>
|
||||
<file>icons/MachDist_FemMesh.svg</file>
|
||||
<file>icons/MachDist_AddFemMesh.svg</file>
|
||||
<file>icons/MachDist_Isostatic.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
@@ -1,431 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>Gui::Dialog::DlgSettingsDraft</class>
|
||||
<widget class="QWidget" name="Gui::Dialog::DlgSettingsDraft">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>434</width>
|
||||
<height>274</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>General settings</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<property name="margin">
|
||||
<number>9</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>General Machining Distortion Settings</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_10">
|
||||
<property name="text">
|
||||
<string>Linux Home Path</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Gui::PrefLineEdit" name="gui::preflineedit_2">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>300</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>This is the default group name for construction geometry</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>/home/rmjzettl/</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="prefEntry" stdset="0">
|
||||
<cstring>Linux Home Path</cstring>
|
||||
</property>
|
||||
<property name="prefPath" stdset="0">
|
||||
<cstring>Mod/Machining_Distortion</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_5">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_12">
|
||||
<property name="text">
|
||||
<string>Solver Link</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_5">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Gui::PrefLineEdit" name="gui::preflineedit_5">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>300</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>This is the default group name for construction geometry</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>/usr/local/bin/ccx_2_2</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="prefEntry" stdset="0">
|
||||
<cstring>Solver Link</cstring>
|
||||
</property>
|
||||
<property name="prefPath" stdset="0">
|
||||
<cstring>Mod/Machining_Distortion</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_11">
|
||||
<property name="text">
|
||||
<string>Servername</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Gui::PrefLineEdit" name="gui::preflineedit_4">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>300</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>This is the default group name for construction geometry</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>dynabox</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="prefEntry" stdset="0">
|
||||
<cstring>Servername</cstring>
|
||||
</property>
|
||||
<property name="prefPath" stdset="0">
|
||||
<cstring>Mod/Machining_Distortion</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Linux Username</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Gui::PrefLineEdit" name="gui::preflineedit">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>300</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>This is the default font name for all Draft texts and dimensions.
|
||||
It can be a font name such as "Arial", a default style such as "sans", "serif"
|
||||
or "mono", or a family such as "Arial,Helvetica,sans" or a name with a style
|
||||
such as "Arial:Bold"</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>rmjzettl</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="prefEntry" stdset="0">
|
||||
<cstring>Linux User Name</cstring>
|
||||
</property>
|
||||
<property name="prefPath" stdset="0">
|
||||
<cstring>Mod/Machining_Distortion</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string>Linux Password</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_4">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Gui::PrefLineEdit" name="gui::preflineedit_3">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>300</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>This is the default font name for all Draft texts and dimensions.
|
||||
It can be a font name such as "Arial", a default style such as "sans", "serif"
|
||||
or "mono", or a family such as "Arial,Helvetica,sans" or a name with a style
|
||||
such as "Arial:Bold"</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Flo926652</string>
|
||||
</property>
|
||||
<property name="echoMode">
|
||||
<enum>QLineEdit::Password</enum>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="prefEntry" stdset="0">
|
||||
<cstring>Linux Password</cstring>
|
||||
</property>
|
||||
<property name="prefPath" stdset="0">
|
||||
<cstring>Mod/Machining_Distortion</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_6">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>Material Dir</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_7">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Gui::PrefLineEdit" name="gui::preflineedit_6">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>300</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>This is the default font name for all Draft texts and dimensions.
|
||||
It can be a font name such as "Arial", a default style such as "sans", "serif"
|
||||
or "mono", or a family such as "Arial,Helvetica,sans" or a name with a style
|
||||
such as "Arial:Bold"</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>/home/Material</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
|
||||
</property>
|
||||
<property name="prefEntry" stdset="0">
|
||||
<cstring>MaterialDir</cstring>
|
||||
</property>
|
||||
<property name="prefPath" stdset="0">
|
||||
<cstring>Mod/Machining_Distortion</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Line" name="line">
|
||||
<property name="lineWidth">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_13">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>Number of CPUs to be used for the calculation</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer_6">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="Gui::PrefSpinBox" name="gui::prefspinbox_3">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>60</width>
|
||||
<height>16777215</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>The number of decimals in internal coordinates operations (for ex. 3 = 0.001)</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>64</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="prefEntry" stdset="0">
|
||||
<cstring>NumberCPUs</cstring>
|
||||
</property>
|
||||
<property name="prefPath" stdset="0">
|
||||
<cstring>Mod/Machining_Distortion</cstring>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>17</width>
|
||||
<height>41</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<layoutdefault spacing="6" margin="11"/>
|
||||
<pixmapfunction>qPixmapFromMimeSource</pixmapfunction>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Gui::PrefLineEdit</class>
|
||||
<extends>QLineEdit</extends>
|
||||
<header>Gui/PrefWidgets.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>Gui::PrefSpinBox</class>
|
||||
<extends>QSpinBox</extends>
|
||||
<header>Gui/PrefWidgets.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -1,496 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file 'User_Interface_Mach_Dist.ui'
|
||||
#
|
||||
# Created: Fri Apr 15 11:22:01 2011
|
||||
# by: PyQt4 UI code generator 4.8.3
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
try:
|
||||
_fromUtf8 = QtCore.QString.fromUtf8
|
||||
except AttributeError:
|
||||
_fromUtf8 = lambda s: s
|
||||
|
||||
class Ui_dialog(object):
|
||||
def setupUi(self, dialog):
|
||||
dialog.setObjectName(_fromUtf8("dialog"))
|
||||
dialog.resize(658, 430)
|
||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(dialog.sizePolicy().hasHeightForWidth())
|
||||
dialog.setSizePolicy(sizePolicy)
|
||||
dialog.setMinimumSize(QtCore.QSize(658, 430))
|
||||
dialog.setMaximumSize(QtCore.QSize(658, 430))
|
||||
self.gridLayout_8 = QtGui.QGridLayout(dialog)
|
||||
self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8"))
|
||||
self.groupBox_3 = QtGui.QGroupBox(dialog)
|
||||
self.groupBox_3.setMinimumSize(QtCore.QSize(282, 161))
|
||||
self.groupBox_3.setMaximumSize(QtCore.QSize(282, 161))
|
||||
self.groupBox_3.setObjectName(_fromUtf8("groupBox_3"))
|
||||
self.gridLayout_2 = QtGui.QGridLayout(self.groupBox_3)
|
||||
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
|
||||
self.gridLayout = QtGui.QGridLayout()
|
||||
self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
|
||||
self.label_24 = QtGui.QLabel(self.groupBox_3)
|
||||
self.label_24.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_24.setObjectName(_fromUtf8("label_24"))
|
||||
self.gridLayout.addWidget(self.label_24, 0, 0, 1, 1)
|
||||
self.label_25 = QtGui.QLabel(self.groupBox_3)
|
||||
self.label_25.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_25.setObjectName(_fromUtf8("label_25"))
|
||||
self.gridLayout.addWidget(self.label_25, 0, 1, 1, 1)
|
||||
self.label_26 = QtGui.QLabel(self.groupBox_3)
|
||||
self.label_26.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_26.setObjectName(_fromUtf8("label_26"))
|
||||
self.gridLayout.addWidget(self.label_26, 0, 2, 1, 1)
|
||||
spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||
self.gridLayout.addItem(spacerItem, 0, 3, 1, 1)
|
||||
self.spinBox_misalignment_x_from = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_misalignment_x_from.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_misalignment_x_from.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_misalignment_x_from.setMinimum(-99)
|
||||
self.spinBox_misalignment_x_from.setObjectName(_fromUtf8("spinBox_misalignment_x_from"))
|
||||
self.gridLayout.addWidget(self.spinBox_misalignment_x_from, 1, 0, 1, 1)
|
||||
self.spinBox_misalignment_x_to = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_misalignment_x_to.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_misalignment_x_to.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_misalignment_x_to.setMinimum(-99)
|
||||
self.spinBox_misalignment_x_to.setObjectName(_fromUtf8("spinBox_misalignment_x_to"))
|
||||
self.gridLayout.addWidget(self.spinBox_misalignment_x_to, 1, 1, 1, 1)
|
||||
self.label = QtGui.QLabel(self.groupBox_3)
|
||||
self.label.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label.setObjectName(_fromUtf8("label"))
|
||||
self.gridLayout.addWidget(self.label, 1, 3, 1, 1)
|
||||
self.spinBox_misalignment_y_from = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_misalignment_y_from.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_misalignment_y_from.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_misalignment_y_from.setMinimum(-99)
|
||||
self.spinBox_misalignment_y_from.setObjectName(_fromUtf8("spinBox_misalignment_y_from"))
|
||||
self.gridLayout.addWidget(self.spinBox_misalignment_y_from, 2, 0, 1, 1)
|
||||
self.spinBox_misalignment_y_to = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_misalignment_y_to.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_misalignment_y_to.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_misalignment_y_to.setMinimum(-99)
|
||||
self.spinBox_misalignment_y_to.setObjectName(_fromUtf8("spinBox_misalignment_y_to"))
|
||||
self.gridLayout.addWidget(self.spinBox_misalignment_y_to, 2, 1, 1, 1)
|
||||
self.label_2 = QtGui.QLabel(self.groupBox_3)
|
||||
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_2.setObjectName(_fromUtf8("label_2"))
|
||||
self.gridLayout.addWidget(self.label_2, 2, 3, 1, 1)
|
||||
self.spinBox_misalignment_z_from = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_misalignment_z_from.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_misalignment_z_from.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_misalignment_z_from.setMinimum(-99)
|
||||
self.spinBox_misalignment_z_from.setObjectName(_fromUtf8("spinBox_misalignment_z_from"))
|
||||
self.gridLayout.addWidget(self.spinBox_misalignment_z_from, 3, 0, 1, 1)
|
||||
self.spinBox_misalignment_z_to = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_misalignment_z_to.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_misalignment_z_to.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_misalignment_z_to.setMinimum(-99)
|
||||
self.spinBox_misalignment_z_to.setObjectName(_fromUtf8("spinBox_misalignment_z_to"))
|
||||
self.gridLayout.addWidget(self.spinBox_misalignment_z_to, 3, 1, 1, 1)
|
||||
self.label_3 = QtGui.QLabel(self.groupBox_3)
|
||||
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_3.setObjectName(_fromUtf8("label_3"))
|
||||
self.gridLayout.addWidget(self.label_3, 3, 3, 1, 1)
|
||||
self.spinBox_z_level_from = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_z_level_from.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_z_level_from.setLayoutDirection(QtCore.Qt.LeftToRight)
|
||||
self.spinBox_z_level_from.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_z_level_from.setMinimum(-99)
|
||||
self.spinBox_z_level_from.setObjectName(_fromUtf8("spinBox_z_level_from"))
|
||||
self.gridLayout.addWidget(self.spinBox_z_level_from, 4, 0, 1, 1)
|
||||
self.spinBox_z_level_to = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_z_level_to.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_z_level_to.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_z_level_to.setMinimum(-99)
|
||||
self.spinBox_z_level_to.setObjectName(_fromUtf8("spinBox_z_level_to"))
|
||||
self.gridLayout.addWidget(self.spinBox_z_level_to, 4, 1, 1, 1)
|
||||
self.label_27 = QtGui.QLabel(self.groupBox_3)
|
||||
self.label_27.setAlignment(QtCore.Qt.AlignCenter)
|
||||
self.label_27.setObjectName(_fromUtf8("label_27"))
|
||||
self.gridLayout.addWidget(self.label_27, 4, 3, 1, 1)
|
||||
self.spinBox_misalignment_x_intervall = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_misalignment_x_intervall.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_misalignment_x_intervall.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_misalignment_x_intervall.setMinimum(-99)
|
||||
self.spinBox_misalignment_x_intervall.setProperty(_fromUtf8("value"), 1)
|
||||
self.spinBox_misalignment_x_intervall.setObjectName(_fromUtf8("spinBox_misalignment_x_intervall"))
|
||||
self.gridLayout.addWidget(self.spinBox_misalignment_x_intervall, 1, 2, 1, 1)
|
||||
self.spinBox_misalignment_y_intervall = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_misalignment_y_intervall.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_misalignment_y_intervall.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_misalignment_y_intervall.setMinimum(-99)
|
||||
self.spinBox_misalignment_y_intervall.setProperty(_fromUtf8("value"), 1)
|
||||
self.spinBox_misalignment_y_intervall.setObjectName(_fromUtf8("spinBox_misalignment_y_intervall"))
|
||||
self.gridLayout.addWidget(self.spinBox_misalignment_y_intervall, 2, 2, 1, 1)
|
||||
self.spinBox_misalignment_z_intervall = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_misalignment_z_intervall.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_misalignment_z_intervall.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_misalignment_z_intervall.setMinimum(-99)
|
||||
self.spinBox_misalignment_z_intervall.setProperty(_fromUtf8("value"), 1)
|
||||
self.spinBox_misalignment_z_intervall.setObjectName(_fromUtf8("spinBox_misalignment_z_intervall"))
|
||||
self.gridLayout.addWidget(self.spinBox_misalignment_z_intervall, 3, 2, 1, 1)
|
||||
self.spinBox_z_level_intervall = QtGui.QSpinBox(self.groupBox_3)
|
||||
self.spinBox_z_level_intervall.setMinimumSize(QtCore.QSize(60, 0))
|
||||
self.spinBox_z_level_intervall.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_z_level_intervall.setMinimum(-99)
|
||||
self.spinBox_z_level_intervall.setProperty(_fromUtf8("value"), 1)
|
||||
self.spinBox_z_level_intervall.setObjectName(_fromUtf8("spinBox_z_level_intervall"))
|
||||
self.gridLayout.addWidget(self.spinBox_z_level_intervall, 4, 2, 1, 1)
|
||||
self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)
|
||||
self.gridLayout_8.addWidget(self.groupBox_3, 0, 0, 1, 1)
|
||||
self.groupBox = QtGui.QGroupBox(dialog)
|
||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
|
||||
self.groupBox.setSizePolicy(sizePolicy)
|
||||
self.groupBox.setMinimumSize(QtCore.QSize(352, 259))
|
||||
self.groupBox.setMaximumSize(QtCore.QSize(352, 259))
|
||||
self.groupBox.setObjectName(_fromUtf8("groupBox"))
|
||||
self.gridLayout_7 = QtGui.QGridLayout(self.groupBox)
|
||||
self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7"))
|
||||
self.gridLayout_6 = QtGui.QGridLayout()
|
||||
self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6"))
|
||||
self.gridLayout_5 = QtGui.QGridLayout()
|
||||
self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
|
||||
spacerItem1 = QtGui.QSpacerItem(13, 17, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||
self.gridLayout_5.addItem(spacerItem1, 0, 0, 1, 1)
|
||||
self.spinBox_young_modulus = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.spinBox_young_modulus.sizePolicy().hasHeightForWidth())
|
||||
self.spinBox_young_modulus.setSizePolicy(sizePolicy)
|
||||
self.spinBox_young_modulus.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_young_modulus.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_young_modulus.setMaximum(999999.99)
|
||||
self.spinBox_young_modulus.setProperty(_fromUtf8("value"), 70000.0)
|
||||
self.spinBox_young_modulus.setObjectName(_fromUtf8("spinBox_young_modulus"))
|
||||
self.gridLayout_5.addWidget(self.spinBox_young_modulus, 0, 1, 1, 1)
|
||||
self.label_6 = QtGui.QLabel(self.groupBox)
|
||||
self.label_6.setObjectName(_fromUtf8("label_6"))
|
||||
self.gridLayout_5.addWidget(self.label_6, 0, 2, 1, 1)
|
||||
spacerItem2 = QtGui.QSpacerItem(13, 13, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||
self.gridLayout_5.addItem(spacerItem2, 1, 0, 1, 1)
|
||||
self.spinBox_poisson_ratio = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.spinBox_poisson_ratio.sizePolicy().hasHeightForWidth())
|
||||
self.spinBox_poisson_ratio.setSizePolicy(sizePolicy)
|
||||
self.spinBox_poisson_ratio.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_poisson_ratio.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_poisson_ratio.setSingleStep(0.1)
|
||||
self.spinBox_poisson_ratio.setProperty(_fromUtf8("value"), 0.3)
|
||||
self.spinBox_poisson_ratio.setObjectName(_fromUtf8("spinBox_poisson_ratio"))
|
||||
self.gridLayout_5.addWidget(self.spinBox_poisson_ratio, 1, 1, 1, 1)
|
||||
self.label_7 = QtGui.QLabel(self.groupBox)
|
||||
self.label_7.setObjectName(_fromUtf8("label_7"))
|
||||
self.gridLayout_5.addWidget(self.label_7, 1, 2, 1, 1)
|
||||
spacerItem3 = QtGui.QSpacerItem(13, 17, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||
self.gridLayout_5.addItem(spacerItem3, 2, 0, 1, 1)
|
||||
self.spinBox_Plate_Thickness = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.spinBox_Plate_Thickness.sizePolicy().hasHeightForWidth())
|
||||
self.spinBox_Plate_Thickness.setSizePolicy(sizePolicy)
|
||||
self.spinBox_Plate_Thickness.setMinimumSize(QtCore.QSize(60, 20))
|
||||
self.spinBox_Plate_Thickness.setLayoutDirection(QtCore.Qt.LeftToRight)
|
||||
self.spinBox_Plate_Thickness.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.spinBox_Plate_Thickness.setMaximum(500.0)
|
||||
self.spinBox_Plate_Thickness.setProperty(_fromUtf8("value"), 40.0)
|
||||
self.spinBox_Plate_Thickness.setObjectName(_fromUtf8("spinBox_Plate_Thickness"))
|
||||
self.gridLayout_5.addWidget(self.spinBox_Plate_Thickness, 2, 1, 1, 1)
|
||||
self.label_8 = QtGui.QLabel(self.groupBox)
|
||||
self.label_8.setObjectName(_fromUtf8("label_8"))
|
||||
self.gridLayout_5.addWidget(self.label_8, 2, 2, 1, 1)
|
||||
self.gridLayout_6.addLayout(self.gridLayout_5, 0, 0, 1, 1)
|
||||
self.gridLayout_4 = QtGui.QGridLayout()
|
||||
self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
|
||||
self.gridLayout_3 = QtGui.QGridLayout()
|
||||
self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
|
||||
self.select_L_file = QtGui.QPushButton(self.groupBox)
|
||||
self.select_L_file.setObjectName(_fromUtf8("select_L_file"))
|
||||
self.gridLayout_3.addWidget(self.select_L_file, 0, 0, 1, 1)
|
||||
spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||
self.gridLayout_3.addItem(spacerItem4, 0, 1, 1, 2)
|
||||
self.select_LT_file = QtGui.QPushButton(self.groupBox)
|
||||
self.select_LT_file.setObjectName(_fromUtf8("select_LT_file"))
|
||||
self.gridLayout_3.addWidget(self.select_LT_file, 0, 3, 1, 1)
|
||||
spacerItem5 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||
self.gridLayout_3.addItem(spacerItem5, 0, 4, 1, 2)
|
||||
self.lc1 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.lc1.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.lc1.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.lc1.setDecimals(7)
|
||||
self.lc1.setMinimum(-99.999999)
|
||||
self.lc1.setMaximum(99.999999)
|
||||
self.lc1.setSingleStep(0.1)
|
||||
self.lc1.setObjectName(_fromUtf8("lc1"))
|
||||
self.gridLayout_3.addWidget(self.lc1, 1, 0, 1, 2)
|
||||
self.label_9 = QtGui.QLabel(self.groupBox)
|
||||
self.label_9.setObjectName(_fromUtf8("label_9"))
|
||||
self.gridLayout_3.addWidget(self.label_9, 1, 2, 1, 1)
|
||||
self.ltc1 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.ltc1.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.ltc1.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.ltc1.setDecimals(7)
|
||||
self.ltc1.setMinimum(-99.999999)
|
||||
self.ltc1.setMaximum(99.999999)
|
||||
self.ltc1.setSingleStep(0.1)
|
||||
self.ltc1.setObjectName(_fromUtf8("ltc1"))
|
||||
self.gridLayout_3.addWidget(self.ltc1, 1, 3, 1, 2)
|
||||
self.label_16 = QtGui.QLabel(self.groupBox)
|
||||
self.label_16.setObjectName(_fromUtf8("label_16"))
|
||||
self.gridLayout_3.addWidget(self.label_16, 1, 5, 1, 1)
|
||||
self.lc2 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.lc2.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.lc2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.lc2.setDecimals(7)
|
||||
self.lc2.setMinimum(-99.999999)
|
||||
self.lc2.setMaximum(99.999999)
|
||||
self.lc2.setSingleStep(0.1)
|
||||
self.lc2.setObjectName(_fromUtf8("lc2"))
|
||||
self.gridLayout_3.addWidget(self.lc2, 2, 0, 1, 2)
|
||||
self.label_12 = QtGui.QLabel(self.groupBox)
|
||||
self.label_12.setObjectName(_fromUtf8("label_12"))
|
||||
self.gridLayout_3.addWidget(self.label_12, 2, 2, 1, 1)
|
||||
self.ltc2 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.ltc2.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.ltc2.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.ltc2.setDecimals(7)
|
||||
self.ltc2.setMinimum(-99.999999)
|
||||
self.ltc2.setMaximum(99.999999)
|
||||
self.ltc2.setSingleStep(0.1)
|
||||
self.ltc2.setObjectName(_fromUtf8("ltc2"))
|
||||
self.gridLayout_3.addWidget(self.ltc2, 2, 3, 1, 2)
|
||||
self.label_13 = QtGui.QLabel(self.groupBox)
|
||||
self.label_13.setObjectName(_fromUtf8("label_13"))
|
||||
self.gridLayout_3.addWidget(self.label_13, 2, 5, 1, 1)
|
||||
self.lc3 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.lc3.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.lc3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.lc3.setDecimals(7)
|
||||
self.lc3.setMinimum(-99.999999)
|
||||
self.lc3.setMaximum(99.999999)
|
||||
self.lc3.setSingleStep(0.1)
|
||||
self.lc3.setObjectName(_fromUtf8("lc3"))
|
||||
self.gridLayout_3.addWidget(self.lc3, 3, 0, 1, 2)
|
||||
self.label_11 = QtGui.QLabel(self.groupBox)
|
||||
self.label_11.setObjectName(_fromUtf8("label_11"))
|
||||
self.gridLayout_3.addWidget(self.label_11, 3, 2, 1, 1)
|
||||
self.ltc3 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.ltc3.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.ltc3.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.ltc3.setDecimals(7)
|
||||
self.ltc3.setMinimum(-99.999999)
|
||||
self.ltc3.setMaximum(99.999999)
|
||||
self.ltc3.setSingleStep(0.1)
|
||||
self.ltc3.setObjectName(_fromUtf8("ltc3"))
|
||||
self.gridLayout_3.addWidget(self.ltc3, 3, 3, 1, 2)
|
||||
self.label_14 = QtGui.QLabel(self.groupBox)
|
||||
self.label_14.setObjectName(_fromUtf8("label_14"))
|
||||
self.gridLayout_3.addWidget(self.label_14, 3, 5, 1, 1)
|
||||
self.lc4 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.lc4.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.lc4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.lc4.setDecimals(7)
|
||||
self.lc4.setMinimum(-99.999999)
|
||||
self.lc4.setMaximum(99.999999)
|
||||
self.lc4.setSingleStep(0.1)
|
||||
self.lc4.setObjectName(_fromUtf8("lc4"))
|
||||
self.gridLayout_3.addWidget(self.lc4, 4, 0, 1, 2)
|
||||
self.label_10 = QtGui.QLabel(self.groupBox)
|
||||
self.label_10.setObjectName(_fromUtf8("label_10"))
|
||||
self.gridLayout_3.addWidget(self.label_10, 4, 2, 1, 1)
|
||||
self.ltc4 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.ltc4.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.ltc4.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.ltc4.setDecimals(7)
|
||||
self.ltc4.setMinimum(-99.999999)
|
||||
self.ltc4.setMaximum(99.999999)
|
||||
self.ltc4.setSingleStep(0.1)
|
||||
self.ltc4.setObjectName(_fromUtf8("ltc4"))
|
||||
self.gridLayout_3.addWidget(self.ltc4, 4, 3, 1, 2)
|
||||
self.lc5 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.lc5.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.lc5.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.lc5.setDecimals(7)
|
||||
self.lc5.setMinimum(-99.999999)
|
||||
self.lc5.setMaximum(99.999999)
|
||||
self.lc5.setSingleStep(0.1)
|
||||
self.lc5.setObjectName(_fromUtf8("lc5"))
|
||||
self.gridLayout_3.addWidget(self.lc5, 5, 0, 1, 2)
|
||||
self.label_19 = QtGui.QLabel(self.groupBox)
|
||||
self.label_19.setObjectName(_fromUtf8("label_19"))
|
||||
self.gridLayout_3.addWidget(self.label_19, 5, 2, 1, 1)
|
||||
self.ltc5 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.ltc5.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.ltc5.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.ltc5.setDecimals(7)
|
||||
self.ltc5.setMinimum(-99.999999)
|
||||
self.ltc5.setMaximum(99.999999)
|
||||
self.ltc5.setSingleStep(0.1)
|
||||
self.ltc5.setObjectName(_fromUtf8("ltc5"))
|
||||
self.gridLayout_3.addWidget(self.ltc5, 5, 3, 1, 2)
|
||||
self.label_17 = QtGui.QLabel(self.groupBox)
|
||||
self.label_17.setObjectName(_fromUtf8("label_17"))
|
||||
self.gridLayout_3.addWidget(self.label_17, 5, 5, 1, 1)
|
||||
self.lc6 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.lc6.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.lc6.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.lc6.setDecimals(7)
|
||||
self.lc6.setMinimum(-99.999999)
|
||||
self.lc6.setMaximum(99.999999)
|
||||
self.lc6.setSingleStep(0.1)
|
||||
self.lc6.setObjectName(_fromUtf8("lc6"))
|
||||
self.gridLayout_3.addWidget(self.lc6, 6, 0, 1, 2)
|
||||
self.label_20 = QtGui.QLabel(self.groupBox)
|
||||
self.label_20.setObjectName(_fromUtf8("label_20"))
|
||||
self.gridLayout_3.addWidget(self.label_20, 6, 2, 1, 1)
|
||||
self.ltc6 = QtGui.QDoubleSpinBox(self.groupBox)
|
||||
self.ltc6.setMinimumSize(QtCore.QSize(80, 0))
|
||||
self.ltc6.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.ltc6.setDecimals(7)
|
||||
self.ltc6.setMinimum(-99.999999)
|
||||
self.ltc6.setMaximum(99.999999)
|
||||
self.ltc6.setSingleStep(0.1)
|
||||
self.ltc6.setObjectName(_fromUtf8("ltc6"))
|
||||
self.gridLayout_3.addWidget(self.ltc6, 6, 3, 1, 2)
|
||||
self.label_18 = QtGui.QLabel(self.groupBox)
|
||||
self.label_18.setObjectName(_fromUtf8("label_18"))
|
||||
self.gridLayout_3.addWidget(self.label_18, 6, 5, 1, 1)
|
||||
self.label_15 = QtGui.QLabel(self.groupBox)
|
||||
self.label_15.setObjectName(_fromUtf8("label_15"))
|
||||
self.gridLayout_3.addWidget(self.label_15, 4, 5, 1, 1)
|
||||
self.gridLayout_4.addLayout(self.gridLayout_3, 0, 0, 1, 1)
|
||||
self.label_21 = QtGui.QLabel(self.groupBox)
|
||||
self.label_21.setMinimumSize(QtCore.QSize(0, 152))
|
||||
self.label_21.setWordWrap(True)
|
||||
self.label_21.setObjectName(_fromUtf8("label_21"))
|
||||
self.gridLayout_4.addWidget(self.label_21, 0, 1, 1, 1)
|
||||
self.gridLayout_6.addLayout(self.gridLayout_4, 1, 0, 1, 1)
|
||||
self.gridLayout_7.addLayout(self.gridLayout_6, 0, 0, 1, 1)
|
||||
self.gridLayout_8.addWidget(self.groupBox, 0, 1, 2, 1)
|
||||
self.verticalLayout = QtGui.QVBoxLayout()
|
||||
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
|
||||
spacerItem6 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
||||
self.verticalLayout.addItem(spacerItem6)
|
||||
self.button_select_output = QtGui.QPushButton(dialog)
|
||||
self.button_select_output.setObjectName(_fromUtf8("button_select_output"))
|
||||
self.verticalLayout.addWidget(self.button_select_output)
|
||||
spacerItem7 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
||||
self.verticalLayout.addItem(spacerItem7)
|
||||
self.line_2 = QtGui.QFrame(dialog)
|
||||
self.line_2.setFrameShape(QtGui.QFrame.HLine)
|
||||
self.line_2.setFrameShadow(QtGui.QFrame.Sunken)
|
||||
self.line_2.setObjectName(_fromUtf8("line_2"))
|
||||
self.verticalLayout.addWidget(self.line_2)
|
||||
spacerItem8 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
||||
self.verticalLayout.addItem(spacerItem8)
|
||||
self.button_select_file = QtGui.QPushButton(dialog)
|
||||
self.button_select_file.setObjectName(_fromUtf8("button_select_file"))
|
||||
self.verticalLayout.addWidget(self.button_select_file)
|
||||
spacerItem9 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
||||
self.verticalLayout.addItem(spacerItem9)
|
||||
self.gridLayout_8.addLayout(self.verticalLayout, 1, 0, 1, 1)
|
||||
self.JobTable = QtGui.QTableWidget(dialog)
|
||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.JobTable.sizePolicy().hasHeightForWidth())
|
||||
self.JobTable.setSizePolicy(sizePolicy)
|
||||
self.JobTable.setMinimumSize(QtCore.QSize(640, 120))
|
||||
self.JobTable.setMaximumSize(QtCore.QSize(640, 16777215))
|
||||
self.JobTable.setRowCount(0)
|
||||
self.JobTable.setColumnCount(29)
|
||||
self.JobTable.setObjectName(_fromUtf8("JobTable"))
|
||||
self.JobTable.setColumnCount(29)
|
||||
self.JobTable.setRowCount(0)
|
||||
self.gridLayout_8.addWidget(self.JobTable, 2, 0, 1, 2)
|
||||
self.horizontalLayout = QtGui.QHBoxLayout()
|
||||
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
|
||||
self.button_add_to_table = QtGui.QPushButton(dialog)
|
||||
self.button_add_to_table.setEnabled(False)
|
||||
self.button_add_to_table.setObjectName(_fromUtf8("button_add_to_table"))
|
||||
self.horizontalLayout.addWidget(self.button_add_to_table)
|
||||
spacerItem10 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||
self.horizontalLayout.addItem(spacerItem10)
|
||||
self.button_start_calculation = QtGui.QPushButton(dialog)
|
||||
self.button_start_calculation.setEnabled(False)
|
||||
self.button_start_calculation.setObjectName(_fromUtf8("button_start_calculation"))
|
||||
self.horizontalLayout.addWidget(self.button_start_calculation)
|
||||
spacerItem11 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
|
||||
self.horizontalLayout.addItem(spacerItem11)
|
||||
self.button_dialog = QtGui.QDialogButtonBox(dialog)
|
||||
self.button_dialog.setOrientation(QtCore.Qt.Horizontal)
|
||||
self.button_dialog.setStandardButtons(QtGui.QDialogButtonBox.Close|QtGui.QDialogButtonBox.Ok)
|
||||
self.button_dialog.setObjectName(_fromUtf8("button_dialog"))
|
||||
self.horizontalLayout.addWidget(self.button_dialog)
|
||||
self.gridLayout_8.addLayout(self.horizontalLayout, 3, 0, 1, 2)
|
||||
|
||||
self.retranslateUi(dialog)
|
||||
QtCore.QMetaObject.connectSlotsByName(dialog)
|
||||
dialog.setTabOrder(self.button_select_file, self.spinBox_misalignment_x_from)
|
||||
dialog.setTabOrder(self.spinBox_misalignment_x_from, self.spinBox_misalignment_y_from)
|
||||
dialog.setTabOrder(self.spinBox_misalignment_y_from, self.spinBox_misalignment_z_from)
|
||||
dialog.setTabOrder(self.spinBox_misalignment_z_from, self.spinBox_young_modulus)
|
||||
dialog.setTabOrder(self.spinBox_young_modulus, self.spinBox_poisson_ratio)
|
||||
dialog.setTabOrder(self.spinBox_poisson_ratio, self.spinBox_Plate_Thickness)
|
||||
dialog.setTabOrder(self.spinBox_Plate_Thickness, self.lc1)
|
||||
dialog.setTabOrder(self.lc1, self.lc2)
|
||||
dialog.setTabOrder(self.lc2, self.lc3)
|
||||
dialog.setTabOrder(self.lc3, self.lc4)
|
||||
dialog.setTabOrder(self.lc4, self.lc5)
|
||||
dialog.setTabOrder(self.lc5, self.lc6)
|
||||
dialog.setTabOrder(self.lc6, self.ltc1)
|
||||
dialog.setTabOrder(self.ltc1, self.ltc2)
|
||||
dialog.setTabOrder(self.ltc2, self.ltc3)
|
||||
dialog.setTabOrder(self.ltc3, self.ltc4)
|
||||
dialog.setTabOrder(self.ltc4, self.ltc5)
|
||||
dialog.setTabOrder(self.ltc5, self.ltc6)
|
||||
dialog.setTabOrder(self.ltc6, self.button_add_to_table)
|
||||
dialog.setTabOrder(self.button_add_to_table, self.button_start_calculation)
|
||||
dialog.setTabOrder(self.button_start_calculation, self.JobTable)
|
||||
|
||||
def retranslateUi(self, dialog):
|
||||
dialog.setWindowTitle(QtGui.QApplication.translate("dialog", "Machining Distortion Prediction", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.groupBox_3.setTitle(QtGui.QApplication.translate("dialog", "Set User Defined Misalignment", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_24.setText(QtGui.QApplication.translate("dialog", "From", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_25.setText(QtGui.QApplication.translate("dialog", "To", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_26.setText(QtGui.QApplication.translate("dialog", "Intervall", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label.setText(QtGui.QApplication.translate("dialog", "Angle X-Axis", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_2.setText(QtGui.QApplication.translate("dialog", "Angle Y-Axis", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_3.setText(QtGui.QApplication.translate("dialog", "Angle Z-Axis", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_27.setText(QtGui.QApplication.translate("dialog", "Z-Level", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.groupBox.setTitle(QtGui.QApplication.translate("dialog", "Material Properties", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_6.setText(QtGui.QApplication.translate("dialog", "Young Modulus", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_7.setText(QtGui.QApplication.translate("dialog", "Poisson Ratio", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_8.setText(QtGui.QApplication.translate("dialog", "Plate Thickness", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.select_L_file.setText(QtGui.QApplication.translate("dialog", "Select L File", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.select_LT_file.setText(QtGui.QApplication.translate("dialog", "Select LT File", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_9.setText(QtGui.QApplication.translate("dialog", "LC1", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_16.setText(QtGui.QApplication.translate("dialog", "LTC1", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_12.setText(QtGui.QApplication.translate("dialog", "LC2", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_13.setText(QtGui.QApplication.translate("dialog", "LTC2", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_11.setText(QtGui.QApplication.translate("dialog", "LC3", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_14.setText(QtGui.QApplication.translate("dialog", "LTC3", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_10.setText(QtGui.QApplication.translate("dialog", "LC4", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_19.setText(QtGui.QApplication.translate("dialog", "LC5", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_17.setText(QtGui.QApplication.translate("dialog", "LTC5", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_20.setText(QtGui.QApplication.translate("dialog", "LC6", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_18.setText(QtGui.QApplication.translate("dialog", "LTC6", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_15.setText(QtGui.QApplication.translate("dialog", "LTC4", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.label_21.setText(QtGui.QApplication.translate("dialog", "Interpolation Coefficients", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.button_select_output.setText(QtGui.QApplication.translate("dialog", "Select Overall Output Folder", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.button_select_file.setText(QtGui.QApplication.translate("dialog", "Select Nastran Geometry File", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.button_add_to_table.setText(QtGui.QApplication.translate("dialog", "Add Job", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.button_start_calculation.setText(QtGui.QApplication.translate("dialog", "Start Calculation", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
@@ -1,69 +0,0 @@
|
||||
def get_sigini_values(sigini_input):
|
||||
input = open(sigini_input,"r")
|
||||
lines = input.readlines()
|
||||
lc = lines[1].split(",")
|
||||
ltc = lines[2].split(",")
|
||||
input.close()
|
||||
return lc,ltc
|
||||
|
||||
|
||||
|
||||
def calculix_postprocess(frd_input) :
|
||||
input = open(frd_input,"r")
|
||||
nodes_x = []
|
||||
nodes_y = []
|
||||
nodes_z = []
|
||||
disp_x = []
|
||||
disp_y = []
|
||||
disp_z = []
|
||||
displaced_nodes_x = []
|
||||
displaced_nodes_y = []
|
||||
displaced_nodes_z = []
|
||||
|
||||
disp_found = False
|
||||
nodes_found = True
|
||||
while True:
|
||||
line=input.readline()
|
||||
if not line: break
|
||||
#first lets extract the node and coordinate information from the results file
|
||||
if nodes_found and (line[1:3] == "-1"):
|
||||
nodes_x.append(float(line[13:25]))
|
||||
nodes_y.append(float(line[25:37]))
|
||||
nodes_z.append(float(line[37:49]))
|
||||
#Check if we found displacement section
|
||||
if line[5:9] == "DISP":
|
||||
disp_found = True
|
||||
#we found a displacement line in the frd file
|
||||
if disp_found and (line[1:3] == "-1"):
|
||||
disp_x.append(float(line[13:25]))
|
||||
disp_y.append(float(line[25:37]))
|
||||
disp_z.append(float(line[37:49]))
|
||||
#Check for the end of a section
|
||||
if line[1:3] == "-3":
|
||||
#the section with the displacements and the nodes ended
|
||||
disp_found = False
|
||||
nodes_found = False
|
||||
|
||||
input.close()
|
||||
|
||||
#Now we are able to generate the new bounding box based on the data in nodes and displacement
|
||||
for i in range(0,len(nodes_x)):
|
||||
displaced_nodes_x.append(nodes_x[i] + disp_x[i])
|
||||
displaced_nodes_y.append(nodes_y[i] + disp_y[i])
|
||||
displaced_nodes_z.append(nodes_z[i] + disp_z[i])
|
||||
|
||||
#Now we can generate the required output
|
||||
#Bounding Box Volume calculation
|
||||
bbox_orig = (max(nodes_x)-min(nodes_x))*(max(nodes_y)-min(nodes_y))*(max(nodes_z)-min(nodes_z))
|
||||
bbox_distorted = (max(displaced_nodes_x)-min(displaced_nodes_x))*(max(displaced_nodes_y)-min(displaced_nodes_y))*(max(displaced_nodes_z)-min(displaced_nodes_z))
|
||||
relationship = bbox_orig/bbox_distorted*100
|
||||
max_disp_x = max(disp_x)
|
||||
min_disp_x = min(disp_x)
|
||||
max_disp_y = max(disp_y)
|
||||
min_disp_y = min(disp_y)
|
||||
max_disp_z = max(disp_z)
|
||||
min_disp_z = min(disp_z)
|
||||
return bbox_orig,bbox_distorted,relationship,max_disp_x,min_disp_x,max_disp_y,min_disp_y,max_disp_z,min_disp_z
|
||||
|
||||
|
||||
|
||||
@@ -1,470 +0,0 @@
|
||||
import os,sys,string,math,shutil,glob,subprocess,tempfile
|
||||
from time import sleep
|
||||
from os.path import join
|
||||
|
||||
##GUI related stuff
|
||||
from PyQt4 import QtCore, QtGui
|
||||
from User_Interface_Mach_Dist import Ui_dialog
|
||||
##------------------------------------------------
|
||||
|
||||
#from read_generalINFOS import read_generalINFOS
|
||||
#from determine_ElementType import determine_ElementType
|
||||
#from mesh_bdf2inp import mesh_bdf2inp
|
||||
from ApplyingBC_IC import ApplyingBC_IC
|
||||
from calculix_postprocess import calculix_postprocess
|
||||
|
||||
import FreeCAD,Fem,Part
|
||||
homepath = os.path.expanduser("~")
|
||||
|
||||
class MyForm(QtGui.QDialog,Ui_dialog):
|
||||
def __init__(self, parent=None):
|
||||
QtGui.QDialog.__init__(self, parent)
|
||||
self.setupUi(self)
|
||||
os.chdir(homepath)
|
||||
#Define some global variables
|
||||
self.filename = QtCore.QString("")
|
||||
self.dirname = QtCore.QString("")
|
||||
self.params = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Machining_Distortion")
|
||||
#Connect Signals and Slots
|
||||
QtCore.QObject.connect(self.button_select_file, QtCore.SIGNAL("clicked()"), self.select_file)
|
||||
QtCore.QObject.connect(self.button_select_output, QtCore.SIGNAL("clicked()"), self.select_output)
|
||||
QtCore.QObject.connect(self.button_dialog, QtCore.SIGNAL("accepted()"), self.onAbbrechen)
|
||||
QtCore.QObject.connect(self.button_dialog, QtCore.SIGNAL("rejected()"), self.onAbbrechen)
|
||||
QtCore.QObject.connect(self.button_start_calculation, QtCore.SIGNAL("clicked()"), self.start_calculation)
|
||||
QtCore.QObject.connect(self.button_add_to_table, QtCore.SIGNAL("clicked()"), self.add_to_table)
|
||||
QtCore.QObject.connect(self.select_L_file, QtCore.SIGNAL("clicked()"), self.add_L_data)
|
||||
QtCore.QObject.connect(self.select_LT_file, QtCore.SIGNAL("clicked()"), self.add_LT_data)
|
||||
|
||||
|
||||
#Define the table headers as we are not able to use the QT Designer for that
|
||||
self.JobTable.clear()
|
||||
self.JobTable.setHorizontalHeaderLabels(
|
||||
["Input File","Output Folder","Z-Offset From","Z-Offset To","Z-Intervall","X-Rot From","X-Rot To","X-Rot Intervall",
|
||||
"Y-Rot From","Y-Rot To","Y-Rot Intervall","Z-Rot From","Z-Rot To","Z-Rot Intervall","Young Modulus","Poisson Ratio",
|
||||
"LC1","LC2","LC3","LC4","LC5","LC6","LTC1","LTC2","LTC3","LTC4","LTC5","LTC6","Plate Thickness"])
|
||||
|
||||
def add_to_table(self):
|
||||
self.JobTable.insertRow(0)
|
||||
item = QtGui.QTableWidgetItem(self.filename)
|
||||
self.JobTable.setItem(0,0,item)
|
||||
item = QtGui.QTableWidgetItem(self.dirname)
|
||||
self.JobTable.setItem(0,1,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_z_level_from.value())
|
||||
self.JobTable.setItem(0,2,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_z_level_to.value())
|
||||
self.JobTable.setItem(0,3,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_z_level_intervall.value())
|
||||
self.JobTable.setItem(0,4,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_misalignment_x_from.value())
|
||||
self.JobTable.setItem(0,5,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_misalignment_x_to.value())
|
||||
self.JobTable.setItem(0,6,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_misalignment_x_intervall.value())
|
||||
self.JobTable.setItem(0,7,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_misalignment_y_from.value())
|
||||
self.JobTable.setItem(0,8,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_misalignment_y_to.value())
|
||||
self.JobTable.setItem(0,9,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_misalignment_y_intervall.value())
|
||||
self.JobTable.setItem(0,10,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_misalignment_z_from.value())
|
||||
self.JobTable.setItem(0,11,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_misalignment_z_to.value())
|
||||
self.JobTable.setItem(0,12,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_misalignment_z_intervall.value())
|
||||
self.JobTable.setItem(0,13,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_young_modulus.value())
|
||||
self.JobTable.setItem(0,14,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_poisson_ratio.value())
|
||||
self.JobTable.setItem(0,15,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.lc1.value())
|
||||
self.JobTable.setItem(0,16,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.lc2.value())
|
||||
self.JobTable.setItem(0,17,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.lc3.value())
|
||||
self.JobTable.setItem(0,18,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.lc4.value())
|
||||
self.JobTable.setItem(0,19,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.lc5.value())
|
||||
self.JobTable.setItem(0,20,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.lc6.value())
|
||||
self.JobTable.setItem(0,21,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.ltc1.value())
|
||||
self.JobTable.setItem(0,22,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.ltc2.value())
|
||||
self.JobTable.setItem(0,23,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.ltc3.value())
|
||||
self.JobTable.setItem(0,24,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.ltc4.value())
|
||||
self.JobTable.setItem(0,25,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.ltc5.value())
|
||||
self.JobTable.setItem(0,26,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.ltc6.value())
|
||||
self.JobTable.setItem(0,27,item)
|
||||
item = QtGui.QTableWidgetItem()
|
||||
item.setData(QtCore.Qt.DisplayRole,self.spinBox_Plate_Thickness.value())
|
||||
self.JobTable.setItem(0,28,item)
|
||||
# This is how to get the data back test2 = self.JobTable.item(0,1).data(QtCore.Qt.DisplayRole).toInt()
|
||||
self.button_add_to_table.setEnabled(False)
|
||||
self.filename.clear()
|
||||
self.button_start_calculation.setEnabled(True)
|
||||
|
||||
|
||||
|
||||
|
||||
def add_L_data(self):
|
||||
l_filename = QtGui.QFileDialog.getOpenFileName(None, 'Open file','','R-Script File for L Coefficients (*.txt)')
|
||||
values = self.parse_R_output(l_filename)
|
||||
self.lc1.setValue(values[0]),self.lc2.setValue(values[1]),self.lc3.setValue(values[2]),
|
||||
self.lc4.setValue(values[3]),self.lc5.setValue(values[4]),self.lc6.setValue(values[5])
|
||||
|
||||
|
||||
def add_LT_data(self):
|
||||
lt_filename = QtGui.QFileDialog.getOpenFileName(None, 'Open file','','R-Script File for LT Coefficients (*.txt)')
|
||||
values = self.parse_R_output(lt_filename)
|
||||
self.ltc1.setValue(values[0]),self.ltc2.setValue(values[1]),self.ltc3.setValue(values[2]),
|
||||
self.ltc4.setValue(values[3]),self.ltc5.setValue(values[4]),self.ltc6.setValue(values[5])
|
||||
|
||||
|
||||
def parse_R_output(self,filename):
|
||||
file = open(str(filename))
|
||||
lines = file.readlines()
|
||||
found = False
|
||||
coeff = []
|
||||
for line in lines:
|
||||
if line[0:9] == "c0 to c5:":
|
||||
found = True
|
||||
coeff.append(float(line[15:]))
|
||||
continue
|
||||
if found and line[0:4] == "MSE:":
|
||||
found = False
|
||||
if found:
|
||||
coeff.append(float(line[15:]))
|
||||
|
||||
file.close()
|
||||
return coeff[0],coeff[1],coeff[2],coeff[3],coeff[4],coeff[5]
|
||||
|
||||
|
||||
def select_file(self):
|
||||
self.filename=QtGui.QFileDialog.getOpenFileName(None, 'Open file','','Nastran Files (*.bdf)')
|
||||
self.button_add_to_table.setEnabled(not self.dirname.isEmpty() and not self.filename.isEmpty())
|
||||
|
||||
def select_output(self):
|
||||
self.dirname=QtGui.QFileDialog.getExistingDirectory(None, 'Open working directory', '', QtGui.QFileDialog.ShowDirsOnly)
|
||||
self.button_add_to_table.setEnabled(not self.dirname.isEmpty() and not self.filename.isEmpty())
|
||||
|
||||
def onAbbrechen(self):
|
||||
self.close()
|
||||
|
||||
|
||||
def start_calculation(self):
|
||||
self.button_add_to_table.setEnabled(False)
|
||||
self.button_select_file.setEnabled(False)
|
||||
self.button_select_output.setEnabled(False)
|
||||
self.button_start_calculation.setEnabled(False)
|
||||
os.chdir(homepath)
|
||||
##Get values from the GUI
|
||||
if ( os.path.exists(str(self.dirname)) ):
|
||||
os.chdir(homepath)
|
||||
shutil.rmtree(str(self.dirname))
|
||||
|
||||
os.mkdir(str(self.dirname))
|
||||
batch = open(str(self.dirname + "/" + "lcmt_CALCULIX_Calculation_batch.bat"),'wb')
|
||||
batch.write("#!/bin/bash\n")
|
||||
batch.write("export CCX_NPROC=4\n")
|
||||
|
||||
#Tell calculixs solver spooles how many cpus to use
|
||||
#batch.write("export CCX_NPROC=" + str(self.params.GetInt("NumberCPUs")) + "\n")
|
||||
#If we have a tcsh
|
||||
#batch.write("setenv CCX_NPROC 4\n")
|
||||
|
||||
#Now do the calculation stuff for each row in the table
|
||||
for job in range (0,self.JobTable.rowCount()):
|
||||
#Extract the data from the table
|
||||
current_file_name = self.JobTable.item(job,0).text()
|
||||
z_offset_from = self.JobTable.item(job,2).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
z_offset_to = self.JobTable.item(job,3).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
z_offset_intervall = self.JobTable.item(job,4).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
x_rot_from = self.JobTable.item(job,5).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
x_rot_to = self.JobTable.item(job,6).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
x_rot_intervall = self.JobTable.item(job,7).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
y_rot_from = self.JobTable.item(job,8).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
y_rot_to = self.JobTable.item(job,9).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
y_rot_intervall = self.JobTable.item(job,10).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
z_rot_from = self.JobTable.item(job,11).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
z_rot_to = self.JobTable.item(job,12).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
z_rot_intervall = self.JobTable.item(job,13).data(QtCore.Qt.DisplayRole).toInt()[0]
|
||||
young_modulus = self.JobTable.item(job,14).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
poisson_ratio = self.JobTable.item(job,15).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
lc1 = self.JobTable.item(job,16).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
lc2 = self.JobTable.item(job,17).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
lc3 = self.JobTable.item(job,18).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
lc4 = self.JobTable.item(job,19).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
lc5 = self.JobTable.item(job,20).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
lc6 = self.JobTable.item(job,21).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
ltc1 = self.JobTable.item(job,22).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
ltc2 = self.JobTable.item(job,23).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
ltc3 = self.JobTable.item(job,24).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
ltc4 = self.JobTable.item(job,25).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
ltc5 = self.JobTable.item(job,26).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
ltc6 = self.JobTable.item(job,27).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
plate_thickness = self.JobTable.item(job,28).data(QtCore.Qt.DisplayRole).toDouble()[0]
|
||||
filename_without_suffix = self.JobTable.item(job,0).text().split("/").takeLast().split(".")[0]
|
||||
print current_file_name
|
||||
meshobject = Fem.read(str(current_file_name))
|
||||
#Perform PCA
|
||||
Fem.SMESH_PCA(meshobject)
|
||||
#Do min routine
|
||||
Fem.minBoundingBox(meshobject)
|
||||
#Now get the Node Numbers for the Boundary Conditions
|
||||
node_numbers = []
|
||||
node_numbers = Fem.getBoundary_Conditions(meshobject)
|
||||
|
||||
#Now we have set up the initial geometry for the calculations. Lets generate an ABAQUS input file now for each z-level with exactly the same
|
||||
#boundary conditions
|
||||
|
||||
|
||||
#1. Lets translate the geometry to the initial desired z-level
|
||||
|
||||
#2. Generate a Folder for the current calculation z-level and output the ABAQUS Geometry and the boundary_conditions
|
||||
#Lets first generate a subfolder with the current filename
|
||||
os.mkdir(str(self.dirname + "/" + filename_without_suffix))
|
||||
i = z_offset_from
|
||||
while i <= z_offset_to:
|
||||
j = x_rot_from
|
||||
while j <= x_rot_to:
|
||||
k = y_rot_from
|
||||
while k <= y_rot_to:
|
||||
l = z_rot_from
|
||||
while l <= z_rot_to:
|
||||
rotation_around_x = FreeCAD.Base.Placement(FreeCAD.Base.Vector(0,0,0),FreeCAD.Base.Vector(1,0,0),j)
|
||||
rotation_around_y = FreeCAD.Base.Placement(FreeCAD.Base.Vector(0,0,0),FreeCAD.Base.Vector(0,1,0),k)
|
||||
rotation_around_z = FreeCAD.Base.Placement(FreeCAD.Base.Vector(0,0,0),FreeCAD.Base.Vector(0,0,1),l)
|
||||
translate = FreeCAD.Base.Placement(FreeCAD.Base.Vector(0,0,i),FreeCAD.Base.Vector(0,0,0),0.0)
|
||||
translation = rotation_around_x.multiply(rotation_around_y).multiply(rotation_around_z).multiply(translate)
|
||||
#Now lets check if the part is still in the billet due to the rotation. If not, we directly skip to the next rotation value
|
||||
if(Fem.checkBB(meshobject,translation,plate_thickness)):
|
||||
print "Too heavy rotations"
|
||||
print str(plate_thickness)
|
||||
l= l + z_rot_intervall
|
||||
continue
|
||||
print "it seems that nothing changed"
|
||||
print str(plate_thickness)
|
||||
#Use the placedment as optional argument for the write() method
|
||||
#translated_mesh.setTransform(translation)
|
||||
Case_Dir = str(self.dirname) + "/" + filename_without_suffix + "/" + filename_without_suffix +\
|
||||
"_"+"x_rot"+ str(int(j))+ \
|
||||
"_"+"y_rot"+ str(int(k))+ \
|
||||
"_"+"z_rot"+ str(int(l))+ \
|
||||
"_"+"z_l"+ str(int(i))
|
||||
if ( os.path.exists(str(Case_Dir)) ):
|
||||
os.chdir(str(self.dirname))
|
||||
shutil.rmtree(str(Case_Dir))
|
||||
|
||||
os.mkdir(str(Case_Dir))
|
||||
|
||||
os.chdir(homepath)
|
||||
#Lets generate a sigini Input Deck for the calculix user subroutine
|
||||
sigini_input = open (str(Case_Dir + "/" + "sigini_input.txt"),'wb')
|
||||
|
||||
#Write plate thickness to the sigini_file
|
||||
sigini_input.write(str(plate_thickness) + "\n")
|
||||
#Now write the Interpolation coefficients, first the L and then the LC ones
|
||||
sigini_input.write(\
|
||||
str(lc1) + "," + \
|
||||
str(lc2) + "," + \
|
||||
str(lc3) + "," + \
|
||||
str(lc4) + "," + \
|
||||
str(lc5) + "," + \
|
||||
str(lc6) + "\n")
|
||||
sigini_input.write(\
|
||||
str(ltc1) + "," + \
|
||||
str(ltc2) + "," + \
|
||||
str(ltc3) + "," + \
|
||||
str(ltc4) + "," + \
|
||||
str(ltc5) + "," + \
|
||||
str(ltc6) + "\n")
|
||||
sigini_input.close()
|
||||
#Check if the
|
||||
meshobject.writeABAQUS(str(Case_Dir + "/" + "geometry_fe_input.inp"), translation)
|
||||
ApplyingBC_IC(Case_Dir, young_modulus,poisson_ratio,node_numbers[0],node_numbers[1],node_numbers[2])
|
||||
#Now lets generate a LSF Job-File to be used by the Airbus Clusters
|
||||
#lsf_input = open (str(Case_Dir + "/" + "job.lsf"),"wb")
|
||||
#lsf_input.write("#!/bin/bash\n")
|
||||
#lsf_input.write("export CCX_NPROC=" + str(self.params.GetInt("NumberCPUs")) + "\n")
|
||||
#lsf_input.write("#BSUB -n "+ str(self.params.GetInt("NumberCPUs")) + "\n")
|
||||
#lsf_input.write("#BSUB -W 10:00\n")
|
||||
#lsf_input.write("#BSUB -o %J.out\n")
|
||||
#lsf_input.write("#BSUB -e %J.err\n")
|
||||
#lsf_input.write("#BSUB -J calculix\n")
|
||||
#lsf_input.write("#BSUB -q loc_dev_par\n")
|
||||
#lsf_input.write(str("datadir=\"" + homepath + "/" + self.dirname[str(self.dirname).rfind("/")+1:] + "/" + filename_without_suffix + "/" + filename_without_suffix +
|
||||
#"_"+"x_rot"+ str(int(j))+
|
||||
#"_"+"y_rot"+ str(int(k))+
|
||||
#"_"+"z_rot"+ str(int(l))+
|
||||
#"_"+"z_l"+ str(int(i)) + "\"\n"))
|
||||
#lsf_input.write("cd $datadir\n")
|
||||
#lsf_input.write("ccx -i geometry_fe_input\n")
|
||||
#lsf_input.close()
|
||||
batch.write("cd \"" + str(Case_Dir) + "\"\n")
|
||||
batch.write("ccx -i geometry_fe_input\n")
|
||||
l= l + z_rot_intervall
|
||||
k = k + y_rot_intervall
|
||||
j = j + x_rot_intervall
|
||||
i = i+ z_offset_intervall
|
||||
batch.write("cd \"" + homepath + "\"\n")
|
||||
#batch.write("find \"" + str(self.dirname[str(self.dirname).rfind("/")+1:] + "/") + "\" -name \"sigini_output.txt\" -exec rm -f {} \;\n")
|
||||
#batch.write("find \"" + str(self.dirname[str(self.dirname).rfind("/")+1:] + "/") + "\" -name \"*.out\" -exec rm -f {} \;\n")
|
||||
#batch.write("find \"" + str(self.dirname[str(self.dirname).rfind("/")+1:] + "/") + "\" -name \"*.err\" -exec rm -f {} \;\n")
|
||||
#batch.write("find \"" + str(self.dirname[str(self.dirname).rfind("/")+1:] + "/") + "\" -name \"*.dat\" -exec rm -f {} \;\n")
|
||||
#batch.write("find \"" + str(self.dirname[str(self.dirname).rfind("/")+1:] + "/") + "\" -name \"*.sta\" -exec rm -f {} \;\n")
|
||||
#batch.write("tar cf \"" + str(self.dirname[str(self.dirname).rfind("/")+1:] + ".tar\" \"" + str(self.dirname[str(self.dirname).rfind("/")+1:] + "/") + "\"\n"))
|
||||
#batch.write("rm -rf \"" + str(self.dirname[str(self.dirname).rfind("/")+1:] + "/") + "\"\n")
|
||||
batch.close()
|
||||
|
||||
os.chdir(homepath)
|
||||
fnull = open(os.devnull, 'w')
|
||||
# #Generate the full tar name:
|
||||
# tarname = homepath + "/" + str(self.dirname)[str(self.dirname).rfind("/")+1:] + ".tar"
|
||||
# #Check if the tar file already exists. If yes, then we have to remove it
|
||||
# if os.path.exists(tarname):
|
||||
# try:
|
||||
# os.remove(tarname)
|
||||
# except Exception,e:
|
||||
# print e
|
||||
#
|
||||
# #tar the whole directory structure now and save the zip file in the temp folder for further processing
|
||||
# commandline = "tar cf \"" + tarname + "\" \"" + str(self.dirname) + "\" \n"
|
||||
# print commandline
|
||||
# result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
# #somehow we have to check for a false return code!
|
||||
# if not result:
|
||||
# shutil.rmtree(str(self.dirname))
|
||||
#
|
||||
# #Now send the zip file to the server for calculation
|
||||
# commandline = "scp -r \"" + tarname + "\" " + self.params.GetString("Servername") + ":" + homepath
|
||||
# print commandline
|
||||
# result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
#
|
||||
# #Now untar, change into the directory and start the batch file
|
||||
# commandline = "ssh " + self.params.GetString("Servername") + " tar -xf \"" + tarname + "\""
|
||||
# print commandline
|
||||
# result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
#
|
||||
# commandline = "ssh " + self.params.GetString("Servername") + " chmod +x -R \"" + homepath + "/" + str(self.dirname)[str(self.dirname).rfind("/")+1:] + "\""
|
||||
# print commandline
|
||||
# result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
#
|
||||
# #Now we copy the batch file one level ahead as otherwise we cannot delete the calculation folder
|
||||
# commandline = "ssh " + self.params.GetString("Servername") + " mv \"" + homepath + "/" + str(self.dirname)[str(self.dirname).rfind("/")+1:] + "/lcmt_CALCULIX_Calculation_batch.bat\" " + homepath
|
||||
# print commandline
|
||||
# result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
#
|
||||
#Set proper rights on the batch file
|
||||
commandline = "chmod +x \"" + str(self.dirname) + "/lcmt_CALCULIX_Calculation_batch.bat\""
|
||||
print commandline
|
||||
result = subprocess.call(commandline, shell = True, stdout = fnull, stderr = fnull)
|
||||
#Start the Batch-File
|
||||
commandline = "\"" + str(self.dirname) + "/lcmt_CALCULIX_Calculation_batch.bat\""
|
||||
print commandline
|
||||
result = subprocess.call(commandline, shell = True, stdout = fnull, stderr = fnull)
|
||||
#
|
||||
|
||||
|
||||
#Now send the zip file to the server for calculation
|
||||
# commandline = FreeCAD.getHomePath() + "bin/pscp -r -l "+ self.params.GetString("Linux User Name") + " -pw " + self.params.GetString("Linux Password") + " " + \
|
||||
# "\"" + zipname + "\" " + self.params.GetString("Servername") + ":" + self.params.GetString("Linux Home Path")
|
||||
# result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
# #Now unzip, change into the directory and start the batch file
|
||||
# commandline = FreeCAD.getHomePath() + "bin/plink -batch -l "+ self.params.GetString("Linux User Name") + " -pw " + self.params.GetString("Linux Password") + " " + \
|
||||
# self.params.GetString("Servername") + " unzip -o \"" + self.params.GetString("Linux Home Path") + "/" + str(self.dirname)[str(self.dirname).rfind("/")+1:] + ".zip\""
|
||||
# result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
# commandline = FreeCAD.getHomePath() + "bin/plink -batch -l "+ self.params.GetString("Linux User Name") + " -pw " + self.params.GetString("Linux Password") + " " + \
|
||||
# self.params.GetString("Servername") + " chmod +x -R \"" + self.params.GetString("Linux Home Path") + "/" + str(self.dirname)[str(self.dirname).rfind("/")+1:] + "\""
|
||||
# result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
# commandline = FreeCAD.getHomePath() + "bin/plink -batch -l "+ self.params.GetString("Linux User Name") + " -pw " + self.params.GetString("Linux Password") + " " + \
|
||||
# self.params.GetString("Servername") + " chmod +x -R \"" + self.params.GetString("Linux Home Path") + "/" + str(self.dirname)[str(self.dirname).rfind("/")+1:] + "\""
|
||||
# result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
# #Now we copy the batch file one level ahead as otherwise we cannot delete the calculation folder
|
||||
# commandline = FreeCAD.getHomePath() + "bin/plink -batch -l "+ self.params.GetString("Linux User Name") + " -pw " + self.params.GetString("Linux Password") + " " + \
|
||||
# self.params.GetString("Servername") + " mv \"" + self.params.GetString("Linux Home Path") + "/" + str(self.dirname)[str(self.dirname).rfind("/")+1:] + "/lcmt_CALCULIX_Calculation_batch.bat\" " + self.params.GetString("Linux Home Path")
|
||||
# result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
# #Start the Batch-File
|
||||
# commandline = FreeCAD.getHomePath() + "bin/plink -batch -l "+ self.params.GetString("Linux User Name") + " -pw " + self.params.GetString("Linux Password") + " " + \
|
||||
# self.params.GetString("Servername") + " " + self.params.GetString("Linux Home Path") + "lcmt_CALCULIX_Calculation_batch.bat"
|
||||
# result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
#commandline = "plink -batch -l UN -pw PW dynabox \'/home/rmjzettl/" + str(self.dirname[str(self.dirname).rfind("/")+1:] + "/") + "lcmt_CALCULIX_Calculation_batch.bat\'"
|
||||
#result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
#commandline = "pscp -r -l UN -pw PW dynabox:\"/home/rmjzettl/"+ str(self.dirname)[str(self.dirname).rfind("/")+1:] + ".tar\" " + str(self.dirname)[0:3]
|
||||
#result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
#commandline = "plink -batch -l UN -pw PW dynabox rm -f \"/home/rmjzettl/"+ str(self.dirname)[str(self.dirname).rfind("/")+1:] + ".tar\""
|
||||
#result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
#commandline = "plink -batch -l UN -pw PW dynabox rm -f \"/home/rmjzettl/"+ str(self.dirname)[str(self.dirname).rfind("/")+1:] + ".zip\""
|
||||
#result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
#commandline = "7z x \"" + str(self.dirname)[0:3] + str(self.dirname)[str(self.dirname).rfind("/")+1:] + ".tar\" -o\"" + str(self.dirname[0:str(self.dirname).rfind("/")]) + "\""
|
||||
#result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
#commandline = "del /Q \"" + str(self.dirname)[0:3] + str(self.dirname)[str(self.dirname).rfind("/")+1:] + ".tar\""
|
||||
#result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
#commandline = "del /Q \"" + str(self.dirname)[0:3] + str(self.dirname)[str(self.dirname).rfind("/")+1:] + ".zip\""
|
||||
#result = subprocess.call(commandline, shell = False, stdout = fnull, stderr = fnull)
|
||||
|
||||
fnull.close()
|
||||
#Reset the GUI
|
||||
os.chdir(homepath)
|
||||
#Reset the table to be fully empty
|
||||
i = self.JobTable.rowCount()
|
||||
while i > 0:
|
||||
print i
|
||||
self.JobTable.removeRow(i-1)
|
||||
i = i-1
|
||||
|
||||
print "after"
|
||||
self.JobTable.setHorizontalHeaderLabels(
|
||||
["Input File","Output Folder","Z-Offset From","Z-Offset To","Z-Intervall","X-Rot From","X-Rot To","X-Rot Intervall",
|
||||
"Y-Rot From","Y-Rot To","Y-Rot Intervall","Z-Rot From","Z-Rot To","Z-Rot Intervall","Young Modulus","Poisson Ratio",
|
||||
"LC1","LC2","LC3","LC4","LC5","LC6","LTC1","LTC2","LTC3","LTC4","LTC5","LTC6","Plate Thickness"])
|
||||
self.button_select_file.setEnabled(True)
|
||||
self.button_select_output.setEnabled(True)
|
||||
|
||||
|
||||
##Main function to be used for GUI setup and entering into the main loop
|
||||
if __name__ == "__main__":
|
||||
app = QtGui.QApplication(sys.argv)
|
||||
myapp = MyForm()
|
||||
myapp.show()
|
||||
sys.exit(app.exec_())
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,94 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# Form implementation generated from reading ui file 'postprocess.ui'
|
||||
#
|
||||
# Created: Mon Aug 20 15:18:09 2012
|
||||
# by: PyQt4 UI code generator 4.8.3
|
||||
#
|
||||
# WARNING! All changes made in this file will be lost!
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
try:
|
||||
_fromUtf8 = QtCore.QString.fromUtf8
|
||||
except AttributeError:
|
||||
_fromUtf8 = lambda s: s
|
||||
|
||||
class Ui_dialog(object):
|
||||
def setupUi(self, dialog):
|
||||
dialog.setObjectName(_fromUtf8("dialog"))
|
||||
dialog.resize(425, 240)
|
||||
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(dialog.sizePolicy().hasHeightForWidth())
|
||||
dialog.setSizePolicy(sizePolicy)
|
||||
dialog.setMinimumSize(QtCore.QSize(0, 0))
|
||||
self.gridLayout_2 = QtGui.QGridLayout(dialog)
|
||||
self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
|
||||
self.buttonBox = QtGui.QDialogButtonBox(dialog)
|
||||
self.buttonBox.setOrientation(QtCore.Qt.Vertical)
|
||||
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
|
||||
self.buttonBox.setObjectName(_fromUtf8("buttonBox"))
|
||||
self.gridLayout_2.addWidget(self.buttonBox, 0, 3, 1, 1)
|
||||
self.button_select_results_folder = QtGui.QPushButton(dialog)
|
||||
self.button_select_results_folder.setObjectName(_fromUtf8("button_select_results_folder"))
|
||||
self.gridLayout_2.addWidget(self.button_select_results_folder, 3, 0, 1, 1)
|
||||
self.button_start_postprocessing = QtGui.QPushButton(dialog)
|
||||
self.button_start_postprocessing.setEnabled(False)
|
||||
self.button_start_postprocessing.setMinimumSize(QtCore.QSize(0, 23))
|
||||
self.button_start_postprocessing.setObjectName(_fromUtf8("button_start_postprocessing"))
|
||||
self.gridLayout_2.addWidget(self.button_start_postprocessing, 3, 1, 1, 1)
|
||||
self.groupBox_2 = QtGui.QGroupBox(dialog)
|
||||
self.groupBox_2.setObjectName(_fromUtf8("groupBox_2"))
|
||||
self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox_2)
|
||||
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
|
||||
self.check_abs_disp_x = QtGui.QRadioButton(self.groupBox_2)
|
||||
self.check_abs_disp_x.setObjectName(_fromUtf8("check_abs_disp_x"))
|
||||
self.verticalLayout_2.addWidget(self.check_abs_disp_x)
|
||||
spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
||||
self.verticalLayout_2.addItem(spacerItem)
|
||||
self.check_abs_disp_y = QtGui.QRadioButton(self.groupBox_2)
|
||||
self.check_abs_disp_y.setObjectName(_fromUtf8("check_abs_disp_y"))
|
||||
self.verticalLayout_2.addWidget(self.check_abs_disp_y)
|
||||
spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
||||
self.verticalLayout_2.addItem(spacerItem1)
|
||||
self.check_abs_disp_z = QtGui.QRadioButton(self.groupBox_2)
|
||||
self.check_abs_disp_z.setObjectName(_fromUtf8("check_abs_disp_z"))
|
||||
self.verticalLayout_2.addWidget(self.check_abs_disp_z)
|
||||
self.gridLayout_2.addWidget(self.groupBox_2, 0, 0, 1, 1)
|
||||
self.groupBox_3 = QtGui.QGroupBox(dialog)
|
||||
self.groupBox_3.setObjectName(_fromUtf8("groupBox_3"))
|
||||
self.verticalLayout_3 = QtGui.QVBoxLayout(self.groupBox_3)
|
||||
self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
|
||||
self.check_rot_x = QtGui.QRadioButton(self.groupBox_3)
|
||||
self.check_rot_x.setObjectName(_fromUtf8("check_rot_x"))
|
||||
self.verticalLayout_3.addWidget(self.check_rot_x)
|
||||
spacerItem2 = QtGui.QSpacerItem(20, 33, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
||||
self.verticalLayout_3.addItem(spacerItem2)
|
||||
self.check_rot_y = QtGui.QRadioButton(self.groupBox_3)
|
||||
self.check_rot_y.setObjectName(_fromUtf8("check_rot_y"))
|
||||
self.verticalLayout_3.addWidget(self.check_rot_y)
|
||||
spacerItem3 = QtGui.QSpacerItem(20, 34, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
|
||||
self.verticalLayout_3.addItem(spacerItem3)
|
||||
self.check_rot_z = QtGui.QRadioButton(self.groupBox_3)
|
||||
self.check_rot_z.setObjectName(_fromUtf8("check_rot_z"))
|
||||
self.verticalLayout_3.addWidget(self.check_rot_z)
|
||||
self.gridLayout_2.addWidget(self.groupBox_3, 0, 1, 1, 1)
|
||||
|
||||
self.retranslateUi(dialog)
|
||||
QtCore.QMetaObject.connectSlotsByName(dialog)
|
||||
|
||||
def retranslateUi(self, dialog):
|
||||
dialog.setWindowTitle(QtGui.QApplication.translate("dialog", "Machining Distortion Prediction", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.button_select_results_folder.setText(QtGui.QApplication.translate("dialog", "Select Results Folder", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.button_start_postprocessing.setText(QtGui.QApplication.translate("dialog", "Start Postprocessing", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.groupBox_2.setTitle(QtGui.QApplication.translate("dialog", "Select Z-Axis", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.check_abs_disp_x.setText(QtGui.QApplication.translate("dialog", "Absolute Displacement X", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.check_abs_disp_y.setText(QtGui.QApplication.translate("dialog", "Absolute Displacement Y", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.check_abs_disp_z.setText(QtGui.QApplication.translate("dialog", "Absolute Displacement Z", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.groupBox_3.setTitle(QtGui.QApplication.translate("dialog", "Select Y-Axis", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.check_rot_x.setText(QtGui.QApplication.translate("dialog", "Rotation around X-Axis", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.check_rot_y.setText(QtGui.QApplication.translate("dialog", "Rotation around Y-Axis", None, QtGui.QApplication.UnicodeUTF8))
|
||||
self.check_rot_z.setText(QtGui.QApplication.translate("dialog", "Rotation around Z-Axis", None, QtGui.QApplication.UnicodeUTF8))
|
||||
|
||||
@@ -1,178 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>dialog</class>
|
||||
<widget class="QDialog" name="dialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>425</width>
|
||||
<height>167</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Machining Distortion Prediction</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="0" column="3">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QPushButton" name="button_select_results_folder">
|
||||
<property name="text">
|
||||
<string>Select Results Folder</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QPushButton" name="button_start_postprocessing">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>23</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Start Postprocessing</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Select Z-Axis</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="check_abs_disp_x">
|
||||
<property name="text">
|
||||
<string>Absolute Displacement X</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="check_abs_disp_y">
|
||||
<property name="text">
|
||||
<string>Absolute Displacement Y</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="check_abs_disp_z">
|
||||
<property name="text">
|
||||
<string>Absolute Displacement Z</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QGroupBox" name="groupBox_3">
|
||||
<property name="title">
|
||||
<string>Select Y-Axis</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QRadioButton" name="check_rot_x">
|
||||
<property name="text">
|
||||
<string>Rotation around X-Axis</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_7">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>33</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="check_rot_y">
|
||||
<property name="text">
|
||||
<string>Rotation around Y-Axis</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_6">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>34</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QRadioButton" name="check_rot_z">
|
||||
<property name="text">
|
||||
<string>Rotation around Z-Axis</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -1,187 +0,0 @@
|
||||
import os,sys,string,math,shutil,glob,subprocess
|
||||
from time import sleep
|
||||
from os.path import join
|
||||
|
||||
##GUI related stuff
|
||||
from PyQt4 import QtCore, QtGui
|
||||
from postprocess import Ui_dialog
|
||||
##------------------------------------------------
|
||||
|
||||
|
||||
from calculix_postprocess import calculix_postprocess
|
||||
from calculix_postprocess import get_sigini_values
|
||||
|
||||
import FreeCAD,Fem,Part
|
||||
|
||||
|
||||
class MyForm(QtGui.QDialog,Ui_dialog):
|
||||
def __init__(self, parent=None):
|
||||
QtGui.QDialog.__init__(self, parent)
|
||||
self.setupUi(self)
|
||||
#Define some global variables
|
||||
self.dirname = QtCore.QString("")
|
||||
#Connect Signals and Slots
|
||||
QtCore.QObject.connect(self.button_select_results_folder, QtCore.SIGNAL("clicked()"), self.select_output)
|
||||
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), self.onAbbrechen)
|
||||
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), self.onAbbrechen)
|
||||
QtCore.QObject.connect(self.button_start_postprocessing, QtCore.SIGNAL("clicked()"), self.start_PostProcessing)
|
||||
|
||||
|
||||
def select_output(self):
|
||||
self.dirname=QtGui.QFileDialog.getExistingDirectory(None, 'Open working directory', '', QtGui.QFileDialog.ShowDirsOnly)
|
||||
self.button_start_postprocessing.setEnabled(True)
|
||||
|
||||
def onAbbrechen(self):
|
||||
self.close()
|
||||
|
||||
def start_PostProcessing(self):
|
||||
outputfile = open(str(self.dirname + "/postprocessing_input.txt"),"wb")
|
||||
sort_tuple = (1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1,1.1)
|
||||
output_list = []
|
||||
lc_coeff = []
|
||||
ltc_coeff = []
|
||||
sigini = True
|
||||
for root, dirs, files in os.walk(str(self.dirname)):
|
||||
if 'final_fe_input.frd' in files:
|
||||
bbox_orig,\
|
||||
bbox_distorted,\
|
||||
relationship,\
|
||||
max_disp_x,\
|
||||
min_disp_x,\
|
||||
max_disp_y,\
|
||||
min_disp_y,\
|
||||
max_disp_z,\
|
||||
min_disp_z = calculix_postprocess(os.path.join(root,'final_fe_input.frd'))
|
||||
if sigini:
|
||||
sigini = False
|
||||
lc_coeff,ltc_coeff = get_sigini_values(os.path.join(root,'sigini_input.txt'))
|
||||
|
||||
#Get the current Offset-Level and rotation values from the folder-name
|
||||
current_z_level = int(root[(root.rfind("_z_l")+4):])
|
||||
x_rot = int(root[(root.rfind("x_rot")+5):(root.rfind("_y_rot"))])
|
||||
y_rot = int(root[(root.rfind("y_rot")+5):(root.rfind("_z_rot"))])
|
||||
z_rot = int(root[(root.rfind("z_rot")+5):(root.rfind("_z_l"))])
|
||||
#Get also the coefficients
|
||||
#now generate an output tuple and add it to the output-list
|
||||
output_list.append((current_z_level,x_rot,y_rot,z_rot,relationship,max_disp_x,min_disp_x,max_disp_y,min_disp_y,max_disp_z,min_disp_z))
|
||||
|
||||
sorted_list = sorted(output_list, key=lambda sort_tuple: sort_tuple[0])
|
||||
for item in sorted_list:
|
||||
if abs(item[5]) > abs(item[6]):
|
||||
abs_disp_x = abs(item[5])
|
||||
else:
|
||||
abs_disp_x = abs(item[6])
|
||||
if abs(item[7]) > abs(item[8]):
|
||||
abs_disp_y = abs(item[7])
|
||||
else:
|
||||
abs_disp_y = abs(item[8])
|
||||
if abs(item[9]) > abs(item[10]):
|
||||
abs_disp_z = abs(item[9])
|
||||
else:
|
||||
abs_disp_z = abs(item[10])
|
||||
|
||||
outputfile.write(
|
||||
str(item[0]) + " " +
|
||||
str(item[1]) + " " +
|
||||
str(item[2]) + " " +
|
||||
str(item[3]) + " " +
|
||||
str(item[4]) + " " +
|
||||
str(item[5]) + " " +
|
||||
str(item[6]) + " " +
|
||||
str(item[7]) + " " +
|
||||
str(item[8]) + " " +
|
||||
str(item[9]) + " " +
|
||||
str(item[10]) + " " +
|
||||
str(abs_disp_x) + " " +
|
||||
str(abs_disp_y) + " " +
|
||||
str(abs_disp_z) + "\n")
|
||||
|
||||
outputfile.close()
|
||||
#Now create a batch file for GnuPlot and start the generation of the postprocess image generation
|
||||
self.start_gnu_plot(sorted_list,lc_coeff,ltc_coeff)
|
||||
|
||||
|
||||
def start_gnu_plot(self,list,lc_coeff,ltc_coeff):
|
||||
filename = "graph"
|
||||
title = "Absolut Displacement in "
|
||||
x_axis_label =""
|
||||
y_axis_label=""
|
||||
z_axis_label=""
|
||||
#define all the different variations that could occur and assign proper variable names
|
||||
if self.check_abs_disp_x.isChecked():
|
||||
filename = filename + "_max_disp_x"
|
||||
title = title + "X vs. "
|
||||
z_axis_label = "Abs Displacement in X-Direction"
|
||||
abs_disp_column = 12
|
||||
if self.check_abs_disp_y.isChecked():
|
||||
filename = filename + "_max_disp_y"
|
||||
title = title + "Y vs. "
|
||||
z_axis_label = "Abs Displacement in Y-Direction"
|
||||
abs_disp_column = 13
|
||||
if self.check_abs_disp_z.isChecked():
|
||||
filename = filename + "_max_disp_z"
|
||||
title = title + "Z vs. "
|
||||
z_axis_label = "Abs Displacement in Z-Direction"
|
||||
abs_disp_column = 14
|
||||
|
||||
#The Z-Level Offset is fix and therefore the corresponding variables are predefined:
|
||||
filename = filename + "_offset_z"
|
||||
title = title + "Z-Level Offset "
|
||||
x_axis_label = "Z-Offset"
|
||||
offset_column = 1
|
||||
|
||||
if self.check_rot_x.isChecked():
|
||||
filename = filename + "_rotation_x"
|
||||
title = title + "and Rotation around X-Axis"
|
||||
y_axis_label = "Rotation around X-Axis"
|
||||
rot_column = 2
|
||||
if self.check_rot_y.isChecked():
|
||||
filename = filename + "_rotation_y"
|
||||
title = title + "and Rotation around Y-Axis"
|
||||
y_axis_label = "Rotation around Y-Axis"
|
||||
rot_column = 3
|
||||
if self.check_rot_z.isChecked():
|
||||
filename = filename + "_rotation_z"
|
||||
title = title + "and Rotation around Z-Axis"
|
||||
y_axis_label = "Rotation around Z-Axis"
|
||||
rot_column = 4
|
||||
|
||||
|
||||
|
||||
gnu_plot_input_file = open(str(self.dirname + "/gnu_plot_input.txt"),"wb")
|
||||
gnu_plot_input_file.write(
|
||||
"set term png\n" +
|
||||
"set output \"" + filename + ".png\"\n"+
|
||||
"set surface\n" +
|
||||
"set grid\n"+
|
||||
"set hidden3d\n"+
|
||||
"set dgrid3d " + str(len(list)-1) + "," + str(len(list)-1) + ",100\n" +
|
||||
"set view 80,05,1.3,1.0\n"+
|
||||
"set title \"" + title + "\" offset 0,-2\n"+
|
||||
"show title\n"+
|
||||
"set label \"Fly to Buy Ratio = " + str(
|
||||
"set label \"L Coefficients used for the calculation:" + lc_coeff[0] + "," + lc_coeff[1] + "," + lc_coeff[2] + "," + lc_coeff[3] + "," + lc_coeff[4] + "," + lc_coeff[5][:-1] + "\" at screen 0.1, screen 0.95 left font \"Arial,8\"\n"+
|
||||
"set label \"LT Coefficients used for the calculation:" + ltc_coeff[0] + "," + ltc_coeff[1] + "," + ltc_coeff[2] + "," + ltc_coeff[3] + "," + ltc_coeff[4] + "," + ltc_coeff[5][:-1] + "\" at screen 0.1, screen 0.93 left font \"Arial,8\"\n"+
|
||||
"set label \"" + x_axis_label + "\\nin [mm]\" at screen 0.5, screen 0.1 center rotate by 0\n"+
|
||||
"set label \"" + y_axis_label +"\\nin [" + str(chr(248)) +"]\" at screen 0.91, screen 0.2 center rotate by 50\n"+
|
||||
"set label \"" + z_axis_label + "\\nin [mm]\" at screen 0.03, screen 0.5 center rotate by 90\n"+
|
||||
"set xtics in nomirror offset character 0,-0.5\n"+
|
||||
"splot \"postprocessing_input.txt\" u " + str(offset_column) + ":" + str(rot_column) + ":" + str(abs_disp_column) + " with pm3d title \"\"\n" +
|
||||
"exit" ))
|
||||
|
||||
gnu_plot_input_file.close()
|
||||
os.chdir(str(self.dirname))
|
||||
fnull = open(os.devnull, 'w')
|
||||
commandline = FreeCAD.getHomePath() + "gnuplot gnu_plot_input.txt"
|
||||
result = subprocess.call(commandline, shell = True, stdout = fnull, stderr = fnull)
|
||||
fnull.close()
|
||||
self.button_start_postprocessing.setEnabled(False)
|
||||
#Reset all radio buttons
|
||||
self.check_rot_x.setChecked(False)
|
||||
self.check_rot_y.setChecked(False)
|
||||
self.check_rot_z.setChecked(False)
|
||||
self.check_abs_disp_x.setChecked(False)
|
||||
self.check_abs_disp_y.setChecked(False)
|
||||
self.check_abs_disp_z.setChecked(False)
|
||||
|
||||
|
||||
@@ -8,12 +8,14 @@ SET(Material_SRCS
|
||||
SOURCE_GROUP("" FILES ${Material_SRCS})
|
||||
|
||||
# collect all the material cards:
|
||||
FILE( GLOB MaterialLib_Files ./StandardMaterial/*.FCMat ./StandardMaterial/*.txt )
|
||||
#FILE( GLOB MaterialLib_Files ./StandardMaterial/*.FCMat ./StandardMaterial/*.txt )
|
||||
|
||||
#SET (MaterialLib_Files
|
||||
# StandardMaterial/Steel.FCMat
|
||||
# StandardMaterial/Readme.txt
|
||||
# )
|
||||
SET (MaterialLib_Files
|
||||
Steel.FCMat
|
||||
ABS.FCMat
|
||||
PLA.FCMat
|
||||
Readme.txt
|
||||
)
|
||||
|
||||
SET(all_files ${Material_SRCS})
|
||||
|
||||
@@ -22,9 +24,10 @@ ADD_CUSTOM_TARGET(Material ALL
|
||||
)
|
||||
|
||||
fc_copy_sources(Material "${CMAKE_BINARY_DIR}/Mod/Material" ${all_files})
|
||||
|
||||
fc_target_copy_resource(Material
|
||||
${CMAKE_SOURCE_DIR}/src/Mod/Material
|
||||
${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/Material
|
||||
${CMAKE_SOURCE_DIR}/src/Mod/Material/StandardMaterial
|
||||
${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_DATADIR}/Mod/Material/StandardMaterial
|
||||
${MaterialLib_Files})
|
||||
|
||||
INSTALL(
|
||||
|
||||
@@ -54,6 +54,7 @@ Version:
|
||||
"""
|
||||
|
||||
def importFCMat(fileName):
|
||||
"Read a FCMat file into a dictionary"
|
||||
import ConfigParser
|
||||
Config = ConfigParser.ConfigParser()
|
||||
Config.read(fileName)
|
||||
@@ -65,7 +66,27 @@ def importFCMat(fileName):
|
||||
|
||||
return dict1
|
||||
|
||||
def exportFCMat(fileName,matDict):
|
||||
"Write a material dictionary to a FCMat file"
|
||||
import ConfigParser,string
|
||||
Config = ConfigParser.ConfigParser()
|
||||
|
||||
# create groups
|
||||
for x in matDict.keys():
|
||||
grp,key = string.split(x,sep='_')
|
||||
if not Config.has_section(grp):
|
||||
Config.add_section(grp)
|
||||
|
||||
# fill groups
|
||||
for x in matDict.keys():
|
||||
grp,key = string.split(x,sep='_')
|
||||
Config.set(grp,key,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)
|
||||
|
||||
|
||||
|
||||
|
||||
29
src/Mod/Material/StandardMaterial/ABS.FCMat
Normal file
@@ -0,0 +1,29 @@
|
||||
; Standard AcrylnitrilButadienStyrol (ABS) Material
|
||||
; (c) 2013 Juergen Riegel (CC-BY 3.0)
|
||||
; information about the content of such cards you can find here:
|
||||
; http://www.freecadweb.org/wiki/index.php?title=Material
|
||||
|
||||
[General]
|
||||
; General name, need to be the same as the file name
|
||||
Name=ABS
|
||||
; Father of steel is metal
|
||||
Father=Thermoplast
|
||||
; more elaborate description of this material card:
|
||||
Description: This is a blend ABS material card. The values are at the low end of the spectrum. If you need a more precise material definition use the more specialised ABS-blend cards.
|
||||
; Specific wight in kg/mm^3
|
||||
SpecificWeight=3.5e-06
|
||||
; No special Vendor
|
||||
Vendor:
|
||||
; For blend materials the wikipedia page is a good source of information:
|
||||
ProductURL=http://en.wikipedia.org/wiki/Acrylonitrile_butadiene_styrene
|
||||
; for blends a rough estimation Euro/Kg
|
||||
SpecificPrice= 3
|
||||
|
||||
[Mechanical]
|
||||
; youngs modulus (or E-Module or Modulus of Elasticty) in kPa (source: http://en.wikipedia.org/wiki/Young%27s_modulus)
|
||||
YoungsModulus=2.32e+06
|
||||
; http://en.wikipedia.org/wiki/Ultimate_tensile_strength in kPa
|
||||
UltimateTensileStrength= 38000
|
||||
|
||||
[FEM]
|
||||
PoissonRatio = 0.35
|
||||
30
src/Mod/Material/StandardMaterial/PLA.FCMat
Normal file
@@ -0,0 +1,30 @@
|
||||
; Standard Polylactic acid (PLA) Material
|
||||
; (c) 2013 Juergen Riegel (CC-BY 3.0)
|
||||
; information about the content of such cards you can find here:
|
||||
; http://www.freecadweb.org/wiki/index.php?title=Material
|
||||
|
||||
[General]
|
||||
; General name, need to be the same as the file name
|
||||
Name=PLA
|
||||
; Father of steel is metal
|
||||
Father=Metal
|
||||
; more elaborate description of this material card:
|
||||
Description: This is a blend Steel material card. The values are at the low end of the spectrum. If you need a more precise material definition use the more specialised steel cards.
|
||||
; Specific wight in kg/mm^3
|
||||
SpecificWeight=1.27e-06
|
||||
; No special Vendor
|
||||
Vendor:
|
||||
; For blend materials the wikipedia page is a good source of information:
|
||||
ProductURL=http://en.wikipedia.org/wiki/Polylactic_acid
|
||||
; for blends a rough estimation
|
||||
SpecificPrice= 4
|
||||
|
||||
[Mechanical]
|
||||
; youngs modulus (or E-Module) in kPa (source: http://en.wikipedia.org/wiki/Young%27s_modulus)
|
||||
YoungsModulus=3.64e+06
|
||||
; http://en.wikipedia.org/wiki/Ultimate_tensile_strength in kPa
|
||||
UltimateTensileStrength= 49600
|
||||
|
||||
|
||||
[FEM]
|
||||
PoissonRatio = 0.36
|
||||
@@ -8,6 +8,7 @@ http://creativecommons.org/
|
||||
|
||||
Please help!
|
||||
Enlargen the base of Materials for FreeCAD will greatly benefit the usability of FreeCAD. So please
|
||||
help us to add new Materials, review existing ones or add additional vlaues.
|
||||
help us to add new Materials, review existing ones or add additional vlaues. A good source for material
|
||||
defininitons are text-books or the www.matweb.com database.
|
||||
|
||||
2013 Juergen Riegel
|
||||
@@ -20,8 +20,8 @@ ProductURL=http://en.wikipedia.org/wiki/Steel
|
||||
SpecificPrice= 1,5 Euro/Kg
|
||||
|
||||
[Mechanical]
|
||||
; youngs modulus (or E-Module) in mPa (source: http://en.wikipedia.org/wiki/Young%27s_modulus)
|
||||
YoungsModulus=200.0e12
|
||||
; youngs modulus (or E-Module) in kPa (source: http://en.wikipedia.org/wiki/Young%27s_modulus)
|
||||
YoungsModulus=2e+08
|
||||
; http://en.wikipedia.org/wiki/Ultimate_tensile_strength
|
||||
UltimateTensileStrength=
|
||||
; http://en.wikipedia.org/wiki/Compressive_strength
|
||||
@@ -30,3 +30,6 @@ CompressiveStrength=
|
||||
Elasticity=
|
||||
; http://en.wikipedia.org/wiki/Fracture_toughness
|
||||
FractureToughness:
|
||||
|
||||
[FEM]
|
||||
PoissonRatio = 0.3
|
||||
@@ -31,9 +31,16 @@
|
||||
#include <App/Document.h>
|
||||
#include <App/DocumentObjectPy.h>
|
||||
#include <App/Property.h>
|
||||
#include <Base/PlacementPy.h>
|
||||
|
||||
#include <CXX/Objects.hxx>
|
||||
#include <Base/VectorPy.h>
|
||||
|
||||
#include "Core/MeshKernel.h"
|
||||
#include "Core/MeshIO.h"
|
||||
#include "Core/Evaluation.h"
|
||||
#include "Core/Iterator.h"
|
||||
|
||||
#include "MeshPy.h"
|
||||
#include "Mesh.h"
|
||||
#include "FeatureMeshImport.h"
|
||||
@@ -373,6 +380,58 @@ createBox(PyObject *self, PyObject *args)
|
||||
} PY_CATCH;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
calculateEigenTransform(PyObject *self, PyObject *args)
|
||||
{
|
||||
PyObject *input;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O",&input))
|
||||
return NULL;
|
||||
|
||||
if(! PySequence_Check(input) ){
|
||||
PyErr_SetString(PyExc_Exception, "Input have to be a sequence of Base.Vector()");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PY_TRY {
|
||||
|
||||
MeshCore::MeshKernel aMesh;
|
||||
MeshCore::MeshPointArray vertices;
|
||||
vertices.clear();
|
||||
MeshCore::MeshFacetArray faces;
|
||||
faces.clear();
|
||||
MeshCore::MeshPoint current_node;
|
||||
|
||||
Py::Sequence list(input);
|
||||
for (Py::Sequence::iterator it = list.begin(); it != list.end(); ++it) {
|
||||
PyObject* value = (*it).ptr();
|
||||
if (PyObject_TypeCheck(value, &(Base::VectorPy::Type))) {
|
||||
Base::VectorPy *pcObject = static_cast<Base::VectorPy*>(value);
|
||||
Base::Vector3d* val = pcObject->getVectorPtr();
|
||||
|
||||
|
||||
current_node.Set(float(val->x),float(val->y),float(val->z));
|
||||
vertices.push_back(current_node);
|
||||
}
|
||||
}
|
||||
|
||||
MeshCore::MeshFacet aFacet;
|
||||
aFacet._aulPoints[0] = 0;aFacet._aulPoints[1] = 1;aFacet._aulPoints[2] = 2;
|
||||
faces.push_back(aFacet);
|
||||
//Fill the Kernel with the temp smesh structure and delete the current containers
|
||||
aMesh.Adopt(vertices,faces);
|
||||
MeshCore::MeshEigensystem pca(aMesh);
|
||||
pca.Evaluate();
|
||||
Base::Matrix4D Trafo = pca.Transform();
|
||||
|
||||
return new Base::PlacementPy(new Base::Placement(Trafo) );
|
||||
|
||||
} PY_CATCH;
|
||||
|
||||
Py_Return;
|
||||
}
|
||||
|
||||
|
||||
PyDoc_STRVAR(open_doc,
|
||||
"open(string) -- Create a new document and a Mesh::Import feature to load the file into the document.");
|
||||
|
||||
@@ -382,6 +441,14 @@ PyDoc_STRVAR(inst_doc,
|
||||
PyDoc_STRVAR(export_doc,
|
||||
"export(list,string) -- Export a list of objects into a single file.");
|
||||
|
||||
PyDoc_STRVAR(calculateEigenTransform_doc,
|
||||
"calculateEigenTransform(seq(Base.Vector)) -- Calculates the eigen Transformation from a list of points.\n"
|
||||
"calculate the point's local coordinate system with the center\n"
|
||||
"of gravity as origin. The local coordinate system is computed\n"
|
||||
"this way that u has minimum and w has maximum expansion.\n"
|
||||
"The local coordinate system is right-handed.\n"
|
||||
);
|
||||
|
||||
/* List of functions defined in the module */
|
||||
|
||||
struct PyMethodDef Mesh_Import_methods[] = {
|
||||
@@ -397,5 +464,6 @@ struct PyMethodDef Mesh_Import_methods[] = {
|
||||
{"createCylinder",createCylinder, Py_NEWARGS, "Create a tessellated cylinder"},
|
||||
{"createCone",createCone, Py_NEWARGS, "Create a tessellated cone"},
|
||||
{"createTorus",createTorus, Py_NEWARGS, "Create a tessellated torus"},
|
||||
{"calculateEigenTransform",calculateEigenTransform, METH_VARARGS, calculateEigenTransform_doc},
|
||||
{NULL, NULL} /* sentinel */
|
||||
};
|
||||
|
||||