Merge Fem developer branch

This commit is contained in:
jriegel
2013-09-08 19:58:13 +02:00
91 changed files with 2774 additions and 18803 deletions

View File

@@ -163,7 +163,6 @@ protected:
return Base::Vector3f((float)tmp.x,(float)tmp.y,(float)tmp.z);
}
//Base::Matrix4D _Mtrx;
};
} //namespace App

View File

@@ -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();

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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");

View File

@@ -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())

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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.

View File

@@ -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;

View File

@@ -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)

View File

@@ -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();

File diff suppressed because it is too large Load Diff

View File

@@ -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)

View File

@@ -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>;
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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());
}
}

View File

@@ -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

View File

@@ -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>

View File

@@ -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());

View File

@@ -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);
//}

View File

@@ -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

View File

@@ -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)

View File

@@ -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();
}

View File

@@ -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")

View File

@@ -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());

View File

@@ -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>

View 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

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View 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

View File

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -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);

View File

@@ -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()");

View File

@@ -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"

View File

@@ -59,6 +59,9 @@ public:
~TaskTetParameter();
ViewProviderFemMeshShapeNetgen * MeshViewProvider;
void setInfo(void);
bool touched;
private Q_SLOTS:
void SwitchMethod(int Value);

View File

@@ -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/>

View File

@@ -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>;
}

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View 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>

View 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;
}

View File

@@ -33,7 +33,7 @@ namespace FemGui
class ViewProviderSetNodes : public Gui::ViewProviderGeometryObject
{
PROPERTY_HEADER(RobotGui::ViewProviderSetNodes);
PROPERTY_HEADER(FemGui::ViewProviderSetNodes);
public:
virtual bool doubleClicked(void);

View File

@@ -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;
}

View 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())

View 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>

View 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())

View 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>

View File

@@ -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>

View File

@@ -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

View File

@@ -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
)

View File

@@ -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>

View File

@@ -1,5 +0,0 @@
# MachiningDistortion
# Get the Parameter Group of this module
ParGrp = App.ParamGet("System parameter:Modules").GetGroup("MachiningDistortion")

View File

@@ -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)

View File

@@ -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())

View File

@@ -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())

View File

@@ -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())

View File

@@ -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())

View File

@@ -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())

View File

@@ -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())

View File

@@ -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>

View File

@@ -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))

View File

@@ -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>

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.4 KiB

View File

@@ -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

View File

@@ -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>

View File

@@ -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 &quot;Arial&quot;, a default style such as &quot;sans&quot;, &quot;serif&quot;
or &quot;mono&quot;, or a family such as &quot;Arial,Helvetica,sans&quot; or a name with a style
such as &quot;Arial:Bold&quot;</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 &quot;Arial&quot;, a default style such as &quot;sans&quot;, &quot;serif&quot;
or &quot;mono&quot;, or a family such as &quot;Arial,Helvetica,sans&quot; or a name with a style
such as &quot;Arial:Bold&quot;</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 &quot;Arial&quot;, a default style such as &quot;sans&quot;, &quot;serif&quot;
or &quot;mono&quot;, or a family such as &quot;Arial,Helvetica,sans&quot; or a name with a style
such as &quot;Arial:Bold&quot;</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>

View File

@@ -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))

File diff suppressed because it is too large Load Diff

View File

@@ -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

View File

@@ -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_())

File diff suppressed because it is too large Load Diff

View File

@@ -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))

View File

@@ -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>

View File

@@ -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)

View File

@@ -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(

View File

@@ -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)

View 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

View 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

View File

@@ -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

View File

@@ -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

View File

@@ -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 */
};