/* * Copyright (C) 2008,2009,2010 Thorsten Liebig (Thorsten.Liebig@gmx.de) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include #include #include #include #include "QCSXCAD.h" #include "QVTKStructure.h" #include "QCSPrimEditor.h" #include "QCSPropEditor.h" #include "QCSTreeWidget.h" #include "QCSGridEditor.h" #include "QParameterGui.h" #include "vtkConfigure.h" #include "tinyxml.h" #include #include "CSPropUnknown.h" #include "CSPropMaterial.h" #include "CSPropDispersiveMaterial.h" #include "CSPropLorentzMaterial.h" #include "CSPropDiscMaterial.h" #include "CSPropLumpedElement.h" #include "CSPropMetal.h" #include "CSPropConductingSheet.h" #include "CSPropExcitation.h" #include "CSPropProbeBox.h" #include "CSPropDumpBox.h" #include "CSPropResBox.h" #include "CSPrimPoint.h" #include "CSPrimBox.h" #include "CSPrimMultiBox.h" #include "CSPrimSphere.h" #include "CSPrimSphericalShell.h" #include "CSPrimCylinder.h" #include "CSPrimCylindricalShell.h" #include "CSPrimPolygon.h" #include "CSPrimLinPoly.h" #include "CSPrimRotPoly.h" #include "CSPrimCurve.h" #include "CSPrimWire.h" #include "CSPrimUserDefined.h" #include #include #include #include #include #include // exporter #include "export_x3d.h" #include "export_pov.h" QCSXCAD::QCSXCAD(QWidget *parent) : QMainWindow(parent) { QStringList argList=qApp->arguments(); for (int i=1;iSetGeometry(this); setCentralWidget(StructureVTK->GetVTKWidget()); CSTree = new QCSTreeWidget(this); QObject::connect(CSTree,SIGNAL(Edit()),this,SLOT(Edit())); QObject::connect(CSTree,SIGNAL(Copy()),this,SLOT(Copy())); QObject::connect(CSTree,SIGNAL(ShowHide()),this,SLOT(ShowHide())); QObject::connect(CSTree,SIGNAL(Delete()),this,SLOT(Delete())); QObject::connect(CSTree,SIGNAL(NewBox()),this,SLOT(NewBox())); QObject::connect(CSTree,SIGNAL(NewMultiBox()),this,SLOT(NewMultiBox())); QObject::connect(CSTree,SIGNAL(NewSphere()),this,SLOT(NewSphere())); QObject::connect(CSTree,SIGNAL(NewCylinder()),this,SLOT(NewCylinder())); QObject::connect(CSTree,SIGNAL(NewUserDefined()),this,SLOT(NewUserDefined())); QObject::connect(CSTree,SIGNAL(NewMaterial()),this,SLOT(NewMaterial())); QObject::connect(CSTree,SIGNAL(NewMetal()),this,SLOT(NewMetal())); QObject::connect(CSTree,SIGNAL(NewExcitation()),this,SLOT(NewExcitation())); QObject::connect(CSTree,SIGNAL(NewChargeBox()),this,SLOT(NewChargeBox())); QObject::connect(CSTree,SIGNAL(NewResBox()),this,SLOT(NewResBox())); QObject::connect(CSTree,SIGNAL(NewDumpBox()),this,SLOT(NewDumpBox())); QDockWidget *dock = new QDockWidget(tr("Properties and Structures"),this); dock->setAllowedAreas(Qt::LeftDockWidgetArea); dock->setWidget(CSTree); dock->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); dock->setObjectName("Properties_and_Structures_Dock"); addDockWidget(Qt::LeftDockWidgetArea,dock); GridEditor = new QCSGridEditor(&clGrid); QObject::connect(GridEditor,SIGNAL(OpacityChange(int)),StructureVTK,SLOT(SetGridOpacity(int))); QObject::connect(GridEditor,SIGNAL(signalDetectEdges(int)),this,SLOT(DetectEdges(int))); QObject::connect(GridEditor,SIGNAL(GridChanged()),StructureVTK,SLOT(RenderGrid())); QObject::connect(GridEditor,SIGNAL(GridPlaneXChanged(int)),StructureVTK,SLOT(RenderGridX(int))); QObject::connect(GridEditor,SIGNAL(GridPlaneYChanged(int)),StructureVTK,SLOT(RenderGridY(int))); QObject::connect(GridEditor,SIGNAL(GridPlaneZChanged(int)),StructureVTK,SLOT(RenderGridZ(int))); dock = new QDockWidget(tr("Rectilinear Grid"),this); dock->setAllowedAreas(Qt::LeftDockWidgetArea); dock->setWidget(GridEditor); dock->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); dock->setObjectName("Rectilinear_Grid_Dock"); addDockWidget(Qt::LeftDockWidgetArea,dock); QParaSet= new QParameterSet(); QObject::connect(QParaSet,SIGNAL(ParameterChanged()),this,SLOT(CheckGeometry())); QObject::connect(QParaSet,SIGNAL(ParameterChanged()),this,SLOT(setModified())); clParaSet=QParaSet; dock = new QDockWidget(tr("Rectilinear Grid - Plane Position"),this); dock->setAllowedAreas(Qt::LeftDockWidgetArea); dock->setWidget(GridEditor->BuildPlanePosWidget()); dock->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); dock->setObjectName("Grid_Plane_Pos"); addDockWidget(Qt::LeftDockWidgetArea,dock); dock = new QDockWidget(tr("Parameter"),this); dock->setAllowedAreas(Qt::LeftDockWidgetArea); dock->setWidget(QParaSet); dock->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable); dock->setObjectName("Parameter_Dock"); addDockWidget(Qt::LeftDockWidgetArea,dock); BuildToolBar(); bModified=true; GridEditor->SetOpacity(30); Render(); } QCSXCAD::~QCSXCAD() { } QString QCSXCAD::GetInfoString() { QString text = QString("%1").arg(_QCSXCAD_LIB_NAME_); text += QString("
Author: %1
EMail: %2").arg(_QCSXCAD_AUTHOR_).arg(_QCSXCAD_AUTHOR_MAIL_); text += QString("
Version: %1\t Build: %2 %3").arg(_QCSXCAD_VERSION_).arg(__DATE__).arg(__TIME__); text += QString("
License: %1").arg(_QCSXCAD_LICENSE_); return text; } QIcon QCSXCAD::GetLibIcon() { return QIcon(":/images/QCSXCAD_Icon.png"); } void QCSXCAD::aboutQCSXCAD(QWidget* parent) { QDialog infoWidget(parent); infoWidget.setWindowTitle("Info"); QLabel *infoLbl = new QLabel(); infoLbl->setText(GetInfoString()); infoLbl->setAlignment(Qt::AlignLeft); QGroupBox* DependGroup = new QGroupBox(tr("Used Libraries"),&infoWidget); QLabel *qtinfo = new QLabel(); QPushButton* qtButton = new QPushButton(QIcon(":/images/qt-logo.png"),QString()); qtButton->setToolTip(tr("About Qt")); qtButton->setIconSize(QSize(50,50)); QObject::connect(qtButton,SIGNAL(clicked()),qApp,SLOT(aboutQt())); qtinfo->setText(QString("GUI-Toolkit: Qt by Trolltech (OSS)
Version: %1
http://www.trolltech.com/
License: GNU General Public License (GPL)").arg(QT_VERSION,0,16)); qtinfo->setAlignment(Qt::AlignLeft); QLabel *vtkinfo = new QLabel(); QPushButton* vtkButton = new QPushButton(QIcon(":/images/vtk-logo.png"),QString()); vtkButton->setIconSize(QSize(50,50)); //vtkButton->setToolTip(tr("About Vtk")); //QObject::connect(vtkButton,SIGNAL(clicked()),qApp,SLOT(aboutQt())); vtkinfo->setText(QString("3D-Toolkit: Visualization Toolkit (VTK)
Version: %1
http://www.vtk.org/
License: BSD-License").arg(VTK_VERSION)); vtkinfo->setAlignment(Qt::AlignLeft); QLabel *CSXCADinfo = new QLabel(); CSXCADinfo->setText(ContinuousStructure::GetInfoLine().c_str()); CSXCADinfo->setAlignment(Qt::AlignLeft); QGridLayout *Glay = new QGridLayout(); Glay->addWidget(qtButton,1,1); Glay->addWidget(qtinfo,1,2); Glay->addWidget(vtkButton,2,1); Glay->addWidget(vtkinfo,2,2); Glay->addWidget(CSXCADinfo,3,2); Glay->setColumnStretch(1,0); Glay->setColumnStretch(2,1); DependGroup->setLayout(Glay); QGridLayout *infoLayout = new QGridLayout(); QPushButton* iconButt = new QPushButton(QCSXCAD::GetLibIcon(),""); iconButt->setFlat(true); iconButt->setIconSize(QSize(128,128)); infoLayout->addWidget(iconButt,1,1); infoLayout->addWidget(infoLbl,1,2,1,3); infoLayout->addWidget(DependGroup,2,1,1,3); QPushButton* OKBut = new QPushButton(tr("Ok")); QObject::connect(OKBut,SIGNAL(clicked()),&infoWidget,SLOT(accept())); infoLayout->addWidget(OKBut,3,2); infoLayout->setColumnStretch(1,1); infoLayout->setColumnStretch(3,1); infoWidget.setLayout(infoLayout); // infoWidget->show(); // infoWidget->adjustSize(); infoWidget.exec(); } //void QCSXCAD::SetFile(QString filename) //{ // QFilename=filename; // // QString file; // if (QFilename.startsWith("./")) file=relPath+QFilename.mid(2); // else file=QFilename; // // //File_Lbl->setText(QString("Geometry File: %1").arg(file)); // // emit FileModified(true); // setModified(); // ReadFile(file); //} // //QString QCSXCAD::GetFilename() //{ // return QFilename; //} // //QString QCSXCAD::GetGeometry() //{ // if (QFilename.startsWith("./")) return relPath+QFilename.mid(2); // else return QFilename; //} bool QCSXCAD::CheckGeometry() { QString msg = QString::fromStdString(Update()); if (msg.isEmpty()) { return true; } QMessageBox::warning(this,tr("Geometry Edit Warning"),tr("Geometry Edit Warning: Update Error occurred!!\n")+msg,QMessageBox::Ok,QMessageBox::NoButton); return false; } TiXmlNode* QCSXCAD::FindRootNode(TiXmlNode* node) { if (node==NULL) return NULL; TiXmlElement* child = node->FirstChildElement("ContinuousStructure"); if (child) return node; child=node->FirstChildElement(); TiXmlNode* found=NULL; while (child!=NULL) { if (child->FirstChildElement("ContinuousStructure")) return child; found = FindRootNode(child); if (found) return found; child = node->NextSiblingElement(); } return NULL; } bool QCSXCAD::ReadNode(TiXmlNode* root) { if (root==NULL) return false; clear(); QString msg(ReadFromXML(root)); if (msg.isEmpty()==false) QMessageBox::warning(this,tr("Geometry read error"),tr("An geometry read error occurred!!\n\n")+msg,QMessageBox::Ok,QMessageBox::NoButton); CSTree->UpdateTree(); CSTree->expandAll(); setModified(); CheckGeometry(); GridEditor->Update(); BestView(); StructureVTK->ResetView(); return true; } bool QCSXCAD::ReadFile(QString filename) { if (QFile::exists(filename)==false) return false; TiXmlDocument doc(filename.toStdString().c_str()); if (!doc.LoadFile()) { QMessageBox::warning(this,tr("File- Error!!! File: "),tr("File-Loading failed!!!"),QMessageBox::Ok,QMessageBox::NoButton); } TiXmlNode* root = 0; TiXmlElement* openEMS = doc.FirstChildElement("openEMS"); if (openEMS) { root = ReadOpenEMS(openEMS); } else { //try to find a root node somewhere else... root = FindRootNode(&doc); } if (root==NULL) { QMessageBox::warning(this,tr("Geometry read error"),tr("Can't find root CSX node!!"),QMessageBox::Ok,QMessageBox::NoButton); return false; } // QString msg(ReadFromXML(filename.toLatin1().constData())); QString msg(ReadFromXML(root)); if (msg.isEmpty()==false) QMessageBox::warning(this,tr("Geometry read error"),tr("An geometry read error occurred!!\n\n")+msg,QMessageBox::Ok,QMessageBox::NoButton); CSTree->UpdateTree(); CSTree->expandAll(); setModified(); CheckGeometry(); GridEditor->Update(); BestView(); StructureVTK->ResetView(); return true; } TiXmlNode* QCSXCAD::ReadOpenEMS(TiXmlNode* openEMS) { // read FDTD options m_BC.clear(); TiXmlElement* element = openEMS->FirstChildElement("FDTD"); if (element) { TiXmlElement* BC = element->FirstChildElement("BoundaryCond"); if (BC) { TiXmlAttribute *attr = BC->FirstAttribute(); while (attr) { m_BC[attr->Name()] = attr->Value(); attr = attr->Next(); } } } return openEMS; } int QCSXCAD::GetCurrentProperty() { return GetIndex(CSTree->GetCurrentProperty()); } ParameterSet* QCSXCAD::GetParaSet() { return QParaSet; } bool QCSXCAD::Write2XML(TiXmlNode* rootNode, bool parameterised) { return ContinuousStructure::Write2XML(rootNode,parameterised); } bool QCSXCAD::Write2XML(const char* file, bool parameterised) { return ContinuousStructure::Write2XML(file,parameterised); } bool QCSXCAD::Write2XML(QString file, bool parameterised) { return ContinuousStructure::Write2XML(file.toStdString().c_str(),parameterised); } bool QCSXCAD::isGeometryValid() { if (ContinuousStructure::isGeometryValid()==false) return false; return true; } void QCSXCAD::ImportGeometry() { QString filter; QString filename=QFileDialog::getOpenFileName(0,tr("Choose geometry file"),NULL,tr("XML-File (*.xml)"),&filter); if (filename.isEmpty()) return; ReadFile(filename); } void QCSXCAD::Edit() { CSPrimitives* prim = CSTree->GetCurrentPrimitive(); if (prim!=NULL) { CSProperties* oldProp=prim->GetProperty(); QCSPrimEditor* newEdit = new QCSPrimEditor(this,prim); if (newEdit->exec()==QDialog::Accepted) { CSProperties* newProp=prim->GetProperty(); if (newProp!=oldProp) CSTree->SwitchProperty(prim,newProp); setModified(); //CSTree->UpdateTree(); } return; } CSProperties* prop = CSTree->GetCurrentProperty(); if (prop!=NULL) { int index=GetIndex(prop); QCSPropEditor* newEdit = new QCSPropEditor(this,prop,m_SimMode); if (newEdit->exec()==QDialog::Accepted) { CSTree->RefreshItem(index); setModified(); } } } void QCSXCAD::Copy() { CSPrimitives* prim = CSTree->GetCurrentPrimitive(); if (prim!=NULL) { CSPrimitives* newPrim=prim->GetCopy(); if (newPrim==NULL) return; QCSPrimEditor* newEdit = new QCSPrimEditor(this,newPrim); if (newEdit->exec()==QDialog::Accepted) { setModified(); CSTree->AddPrimItem(newPrim); } else delete newPrim; } } void QCSXCAD::SetVisibility2All(bool value) { for (size_t n=0; nSetVisibility(value); CSTree->RefreshItem(GetIndex(prop)); if (value) StructureVTK->SetPropOpacity(prop->GetUniqueID(),prop->GetFillColor().a); else StructureVTK->SetPropOpacity(prop->GetUniqueID(),0); } } void QCSXCAD::HideAll() { SetVisibility2All(false); } void QCSXCAD::ShowAll() { SetVisibility2All(true); } void QCSXCAD::SetParallelProjection(bool val) { StructureVTK->SetParallelProjection(val); } void QCSXCAD::ShowHide() { CSProperties* prop = CSTree->GetCurrentProperty(); if (prop!=NULL) { prop->SetVisibility(!prop->GetVisibility()); CSTree->RefreshItem(GetIndex(prop)); if (prop->GetVisibility()) StructureVTK->SetPropOpacity(prop->GetUniqueID(),prop->GetFillColor().a); else StructureVTK->SetPropOpacity(prop->GetUniqueID(),0); } } void QCSXCAD::Delete() { CSPrimitives* prim = CSTree->GetCurrentPrimitive(); if (prim!=NULL) { if (QMessageBox::question(this,tr("Delete Primitive"),tr("Delete current Primitive (ID: %1)?").arg(prim->GetID()),QMessageBox::Yes,QMessageBox::No)==QMessageBox::Yes) { CSTree->DeletePrimItem(prim); DeletePrimitive(prim); setModified(); } return; } CSProperties* prop = CSTree->GetCurrentProperty(); if (prop!=NULL) { size_t qtyPrim=prop->GetQtyPrimitives(); if (qtyPrim>0) { if (QMessageBox::question(this,tr("Delete Property"),tr("\"%1\" contains Primitive(s)!!\n Delete anyway?").arg(prop->GetName().c_str()),QMessageBox::Yes,QMessageBox::No)!=QMessageBox::Yes) return; } else if (QMessageBox::question(this,tr("Delete Property"),tr("Delete current Property?"),QMessageBox::Yes,QMessageBox::No)!=QMessageBox::Yes) return; CSTree->DeletePropItem(prop); DeleteProperty(prop); setModified(); } } void QCSXCAD::NewBox() { NewPrimitive(new CSPrimBox(clParaSet,CSTree->GetCurrentProperty())); } void QCSXCAD::NewMultiBox() { NewPrimitive(new CSPrimMultiBox(clParaSet,CSTree->GetCurrentProperty())); } void QCSXCAD::NewSphere() { NewPrimitive(new CSPrimSphere(clParaSet,CSTree->GetCurrentProperty())); } void QCSXCAD::NewCylinder() { NewPrimitive(new CSPrimCylinder(clParaSet,CSTree->GetCurrentProperty())); } void QCSXCAD::NewPolygon() { NewPrimitive(new CSPrimPolygon(clParaSet,CSTree->GetCurrentProperty())); } void QCSXCAD::NewUserDefined() { NewPrimitive(new CSPrimUserDefined(clParaSet,CSTree->GetCurrentProperty())); } void QCSXCAD::NewPrimitive(CSPrimitives* newPrim) { if (GetQtyProperties()==0) { QMessageBox::question(this,tr("New Primitive"),tr("No Property available. You have to add one first!"),QMessageBox::Ok); delete newPrim; return; } QCSPrimEditor* newEdit = new QCSPrimEditor(this,newPrim); if (newEdit->exec()==QDialog::Accepted) { setModified(); CSTree->AddPrimItem(newPrim); } else delete newPrim; } void QCSXCAD::NewMaterial() { NewProperty(new CSPropMaterial(clParaSet)); } void QCSXCAD::NewMetal() { NewProperty(new CSPropMetal(clParaSet)); } void QCSXCAD::NewExcitation() { NewProperty(new CSPropExcitation(clParaSet,GetQtyPropertyType(CSProperties::EXCITATION))); } void QCSXCAD::NewChargeBox() { NewProperty(new CSPropProbeBox(clParaSet)); } void QCSXCAD::NewResBox() { NewProperty(new CSPropResBox(clParaSet)); } void QCSXCAD::NewDumpBox() { NewProperty(new CSPropDumpBox(clParaSet)); } void QCSXCAD::setModified() { bModified=true; emit modified(true); Render(); } void QCSXCAD::DetectEdges(int nu) { InsertEdges2Grid(nu); } void QCSXCAD::BestView() { StructureVTK->ResetView(); } void QCSXCAD::setViewDir(int dir) { switch (dir) { default: case 0: setYZ(); return; case 1: setZX(); return; case 2: setXY(); return; } } void QCSXCAD::setXY() { m_ViewDir = 2; StructureVTK->setXY(); } void QCSXCAD::setYZ() { m_ViewDir = 0; StructureVTK->setYZ(); } void QCSXCAD::setZX() { m_ViewDir = 1; StructureVTK->setZX(); } void QCSXCAD::SetSimMode(int mode) { m_SimMode=mode; } void QCSXCAD::NewProperty(CSProperties* newProp) { QCSPropEditor* newEdit = new QCSPropEditor(this,newProp,m_SimMode); if (newEdit->exec()==QDialog::Accepted) { AddProperty(newProp); CSTree->AddPropItem(newProp); } else delete newProp; } void QCSXCAD::New() { if (bModified) { if (QMessageBox::question(this,tr("New Geometry"),tr("Create empty Geometry??"),QMessageBox::Yes,QMessageBox::No)==QMessageBox::No) return; else clear(); } } //void QCSXCAD::Load() //{ // if (bModified) // switch (QMessageBox::question(this,tr("Load Geometry"),tr("Save current Geometry??"),QMessageBox::Yes,QMessageBox::No,QMessageBox::Cancel)) // { // case QMessageBox::Yes: // Save(); // break; // case QMessageBox::Cancel: // return; // break; // }; // browseGeometryFile(); //} //void QCSXCAD::Save() //{ // if (QFilename.isEmpty()) {SaveAs(); return;} // // CheckGeometry(); // // if (QFilename.startsWith("./")) Write2XML((relPath+QFilename.mid(2)).toLatin1().data()); // else Write2XML(QFilename.toLatin1().data()); // bModified=false; //} void QCSXCAD::ExportGeometry() { QString qFilename=QFileDialog::getSaveFileName(0,"Choose Geometrie File",NULL,"SimGeometryXML (*.xml)"); if (qFilename==NULL) return; if (!qFilename.endsWith(".xml")) qFilename+=".xml"; if (Write2XML(qFilename.toLatin1().data())==false) QMessageBox::warning(this,tr("Geometry Export"),tr("Unknown error occurred! Geometry Export failed"),1,0); } void QCSXCAD::ExportGeometry_Povray() { QString filename = QFileDialog::getSaveFileName( this, tr("Save Povray file"), QString(), tr("Povray files (*.pov)") ); if (filename.isEmpty()) return; export_pov pov( this ); pov.save( filename ); // start povray? int ans = QMessageBox::question( 0, "Start Povray", "Should the file directly be rendered?", "Yes", "No", "", 0, 1 ); if (ans == 1) return; // start povray QStringList args; args << filename; args << "-W640"; args << "-H480"; args << "+A"; //only valid for povray >3.7.0 args << "+WT4"; QProcess::startDetached( "povray", args, QFileInfo(filename).absolutePath() ); return; // // Instead of letting renderer to render the scene, we use // // an exportor to save it to a file. // vtkPOVExporter *povexp = vtkPOVExporter::New(); // povexp->SetRenderWindow( ((QVTKWidget*)(StructureVTK->GetVTKWidget()))->GetRenderWindow() ); // povexp->SetFileName("/tmp/TestPOVExporter.pov"); // cout << "Writing file TestPOVExporter.pov..." << endl; // // povexp->Write(); // cout << "Done writing file TestPOVExporter.pov..." << endl; // // povexp->Delete(); } void QCSXCAD::ExportGeometry_X3D(QString filename) { if (filename.isEmpty()) filename = QFileDialog::getSaveFileName( this, tr("Save X3D-file"), QString(), tr("X3D files (*.x3d)") ); if (filename.isEmpty()) return; export_X3D x3d( this ); x3d.save( filename ); } void QCSXCAD::ExportGeometry(QString dirname, int type) { if (dirname.isEmpty()) dirname = QFileDialog::getExistingDirectory(this, tr("Choose directory to save data")); if (dirname.isEmpty()) return; int QtyProp = GetQtyProperties(); for (int i=0;iGetUniqueID(); if (prop->GetVisibility()==true) { QString filename(dirname); filename.append("/"); filename.append(QString::fromUtf8(prop->GetName().c_str())); switch (type) { case 0: StructureVTK->ExportProperty2PolyDataVTK(uID,filename,clGrid.GetDeltaUnit()); break; case 1: StructureVTK->ExportProperty2STL(uID,filename,clGrid.GetDeltaUnit()); break; case 2: StructureVTK->ExportProperty2PLY(uID,filename,clGrid.GetDeltaUnit()); break; default: QMessageBox::warning(this, "Export Dialog","Unknown export type, skipping..."); return; break; } } } } void QCSXCAD::ExportGeometry_PolyDataVTK(QString dirname) { ExportGeometry(dirname, 0); } void QCSXCAD::ExportGeometry_STL(QString dirname) { ExportGeometry(dirname, 1); } void QCSXCAD::ExportGeometry_PLY(QString dirname) { ExportGeometry(dirname, 2); } void QCSXCAD::ExportView2Image() { if (ViewLevel==VIEW_3D) StructureVTK->ExportView2Image(); else QMessageBox::warning(this,tr("PNG export"),tr("Not Yet Implemented for 2D view, use 3D instead."),QMessageBox::Ok,QMessageBox::NoButton); } void QCSXCAD::EnableDiscModelRendering(bool val) { m_RenderDiscModels = val; } void QCSXCAD::GUIUpdate() { CSTree->UpdateTree(); GridEditor->Update(); for (int n=0;n<3;++n) viewPlane[n]->setText(GridEditor->GetNormName(n)); } void QCSXCAD::clear() { ContinuousStructure::clear(); GUIUpdate(); setModified(); bModified=false; } void QCSXCAD::BuildToolBar() { QToolBar *mainTB = addToolBar(tr("General")); mainTB->setObjectName("General_ToolBar"); QSize TBIconSize(16,16); mainTB->setIconSize(TBIconSize); if (QCSX_Settings.GetEdit()) mainTB->addAction(QIcon(":/images/filenew.png"),tr("New"),this,SLOT(New())); if (QCSX_Settings.GetEdit()) mainTB->addAction(QIcon(":/images/down.png"),tr("Import"),this,SLOT(ImportGeometry())); mainTB->addAction(QIcon(":/images/up.png"),tr("Export"),this,SLOT(ExportGeometry())); QToolBar *ItemTB = addToolBar(tr("Item View")); ItemTB->setIconSize(TBIconSize); ItemTB->setObjectName("Item_View_ToolBar"); ItemTB->addAction(tr("CollapseAll"),CSTree,SLOT(collapseAll())); ItemTB->addAction(tr("ExpandAll"),CSTree,SLOT(expandAll())); ItemTB->addAction(QIcon(":/images/bulb.png"),tr("ShowAll"),this,SLOT(ShowAll())); ItemTB->addAction(QIcon(":/images/bulb_off.png"),tr("HideAll"),this,SLOT(HideAll())); QToolBar *newObjct = NULL; QAction* newAct = NULL; if (QCSX_Settings.GetEdit()) { newObjct = addToolBar(tr("add new Primitive")); newObjct->setObjectName("New_Primitive_ToolBar"); newAct = newObjct->addAction(tr("Box"),this,SLOT(NewBox())); newAct->setToolTip(tr("add new Box")); newAct = newObjct->addAction(tr("MultiBox"),this,SLOT(NewMultiBox())); newAct->setToolTip(tr("add new Multi-Box")); newAct = newObjct->addAction(tr("Sphere"),this,SLOT(NewSphere())); newAct->setToolTip(tr("add new Sphere")); newAct = newObjct->addAction(tr("Cylinder"),this,SLOT(NewCylinder())); newAct->setToolTip(tr("add new Cylinder")); newAct = newObjct->addAction(tr("Polygon"),this,SLOT(NewPolygon())); newAct->setToolTip(tr("add new Polygon")); newAct = newObjct->addAction(tr("User Defined"),this,SLOT(NewUserDefined())); newAct->setToolTip(tr("add new User Definied Primitive")); newObjct = addToolBar(tr("add new Property")); newObjct->setObjectName("New_Property_ToolBar"); newAct = newObjct->addAction(tr("Material"),this,SLOT(NewMaterial())); newAct->setToolTip(tr("add new Material-Property")); newAct = newObjct->addAction(tr("Metal"),this,SLOT(NewMetal())); newAct->setToolTip(tr("add new Metal-Property")); newAct = newObjct->addAction(tr("Excitation"),this,SLOT(NewExcitation())); newAct->setToolTip(tr("add new Excitation-Property")); newAct = newObjct->addAction(tr("ProbeBox"),this,SLOT(NewChargeBox())); newAct->setToolTip(tr("add new Probe-Box-Property")); newAct = newObjct->addAction(tr("ResBox"),this,SLOT(NewResBox())); newAct->setToolTip(tr("add new Res-Box-Property")); newAct = newObjct->addAction(tr("DumpBox"),this,SLOT(NewDumpBox())); newAct->setToolTip(tr("add new Dump-Box-Property")); } newObjct = addToolBar(tr("Zoom")); newObjct->setIconSize(TBIconSize); newObjct->setObjectName("Zoom_ToolBar"); newAct = newObjct->addAction(QIcon(":/images/viewmagfit.png"),tr("Zoom fit"),this,SLOT(BestView())); newAct->setToolTip("Zoom to best fit all objects"); viewPlane[0] = newObjct->addAction(GridEditor->GetNormName(0),this,SLOT(setYZ())); viewPlane[0]->setToolTip(tr("Switch to y-z-plane view (x-normal)")); viewPlane[1] = newObjct->addAction(GridEditor->GetNormName(1),this,SLOT(setZX())); viewPlane[1]->setToolTip(tr("Switch to z-x-plane view (y-normal)")); viewPlane[2] = newObjct->addAction(GridEditor->GetNormName(2),this,SLOT(setXY())); viewPlane[2]->setToolTip(tr("Switch to x-y-plane view (z-normal)")); addToolBarBreak(); QActionGroup* ActViewGrp = new QActionGroup(this); newAct = newObjct->addAction(tr("2D"),this,SLOT(View2D())); newAct->setToolTip(tr("Switch to 2D view mode")); ActViewGrp->addAction(newAct); newAct->setCheckable(true); newAct = newObjct->addAction(tr("3D"),this,SLOT(View3D())); newAct->setToolTip(tr("Switch to 3D view mode")); ActViewGrp->addAction(newAct); newAct->setCheckable(true); m_PPview = newObjct->addAction(tr("PP")); m_PPview->setToolTip(tr("Toggle parallel projection view mode")); QObject::connect(m_PPview,SIGNAL(toggled(bool)),this,SLOT(SetParallelProjection(bool))); m_PPview->setCheckable(true); if (QCSX_Settings.GetEdit()) addToolBar(GridEditor->BuildToolbar()); } void QCSXCAD::Render() { StructureVTK->RenderGrid(); StructureVTK->RenderGeometry(); if (m_RenderDiscModels) StructureVTK->RenderDiscMaterialModel(); } void QCSXCAD::View2D() { ViewLevel=VIEW_2D; StructureVTK->SaveCamData(); setViewDir(m_ViewDir); StructureVTK->SetParallelProjection(true, false); StructureVTK->Set2DInteractionStyle(true); m_PPview->setDisabled(true); } void QCSXCAD::View3D() { ViewLevel=VIEW_3D; m_PPview->setDisabled(false); StructureVTK->SetParallelProjection(m_PPview->isChecked(), false); StructureVTK->Set2DInteractionStyle(false, false); StructureVTK->RestoreCamData(true); } void QCSXCAD::keyPressEvent(QKeyEvent * event) { if (event->key()==Qt::Key_Delete) Delete(); if (event->key()==Qt::Key_Escape) CSTree->setCurrentItem(NULL); QMainWindow::keyPressEvent(event); }