/* * 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 #include "QCSPrimEditor.h" #include "QCSXCAD_Global.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" QCSPrimEditor::QCSPrimEditor(ContinuousStructure *CS, CSPrimitives* prim, QWidget* parent) : QDialog(parent) { clCS=CS; CSPrim=prim; MainLayout = new QVBoxLayout(); switch (CSPrim->GetType()) { case CSPrimitives::BOX: CSPrimEdit = new QCSPrimBoxLayout(CSPrim->ToBox()); setWindowTitle(tr("Box Editor")); break; case CSPrimitives::MULTIBOX: CSPrimEdit = new QCSPrimMultiBoxLayout(CSPrim->ToMultiBox()); setWindowTitle(tr("Multi-Box Editor")); break; case CSPrimitives::SPHERE: CSPrimEdit = new QCSPrimSphereLayout(CSPrim->ToSphere()); setWindowTitle(tr("Sphere Editor")); break; case CSPrimitives::CYLINDER: CSPrimEdit = new QCSPrimCylinderLayout(CSPrim->ToCylinder()); setWindowTitle(tr("Cylinder Editor")); break; case CSPrimitives::CYLINDRICALSHELL: CSPrimEdit = new QCSPrimCylindricalShellLayout(CSPrim->ToCylindricalShell()); setWindowTitle(tr("CylindricalShell Editor")); break; case CSPrimitives::POLYGON: CSPrimEdit = new QCSPrimPolygonLayout(CSPrim->ToPolygon()); setWindowTitle(tr("Polygon Editor")); break; case CSPrimitives::USERDEFINED: CSPrimEdit = new QCSPrimUserDefinedLayout(CSPrim->ToUserDefined()); setWindowTitle(tr("User Defined Primitive Editor")); break; default: setWindowTitle(tr("default Editor")); CSPrimEdit = new QCSPrimitiveLayout(CSPrim); break; }; MainLayout->addWidget(BuildGeneral()); QGroupBox* gb = new QGroupBox(tr("Geometrical Properties")); gb->setLayout(CSPrimEdit); MainLayout->addWidget(gb); MainLayout->addStretch(); MainLayout->addLayout(BuildButtons()); setLayout(MainLayout); setAttribute(Qt::WA_DeleteOnClose, true); setWindowModality(Qt::ApplicationModal); } QCSPrimEditor::~QCSPrimEditor() { } void QCSPrimEditor::Reset() { PrioSpinBox->setValue(CSPrim->GetPriority()); UpdatePropertyCB(); CSPrimEdit->GetValues(); } void QCSPrimEditor::Save() { CSPrim->SetPriority(PrioSpinBox->value()); CSProperties* prop = clCS->GetProperty((unsigned int)PropertiesComboBox->currentIndex()); if (prop==NULL) { std::cerr << __func__ << ": Error, property invalid!" << std::endl; reject(); return; } if (prop!=CSPrim->GetProperty()) prop->AddPrimitive(CSPrim); CSPrimEdit->SetValues(); accept(); } void QCSPrimEditor::Cancel() { reject(); } QGroupBox* QCSPrimEditor::BuildGeneral() { QGroupBox* box= new QGroupBox("General"); QGridLayout* grid = new QGridLayout(); grid->addWidget(new QLabel(QString(tr("ID: %1")).arg(CSPrim->GetID())),0,0); grid->addWidget(new QLabel(tr("Priority: ")),0,1); PrioSpinBox = new QSpinBox(); PrioSpinBox->setRange(-1,1000); PrioSpinBox->setValue(CSPrim->GetPriority()); PrioSpinBox->setEnabled(QCSX_Settings.GetEdit()); grid->addWidget(PrioSpinBox,0,2); PropertiesComboBox = new QComboBox(); PropertiesComboBox->setEnabled(QCSX_Settings.GetEdit()); UpdatePropertyCB(); grid->addWidget(new QLabel(QString(tr("Choose Property: "))),1,0); grid->addWidget(PropertiesComboBox,1,1,1,2); box->setLayout(grid); return box; } QLayout* QCSPrimEditor::BuildButtons() { QHBoxLayout* lay = new QHBoxLayout(); QPushButton* ok = new QPushButton(tr("Ok")); QObject::connect(ok,SIGNAL(clicked()),this,SLOT(Save())); lay->addWidget(ok); if (QCSX_Settings.GetEdit()) { QPushButton* reset = new QPushButton(tr("Reset")); QObject::connect(reset,SIGNAL(clicked()),this,SLOT(Reset())); lay->addWidget(reset); QPushButton* cancel = new QPushButton(tr("Cancel")); QObject::connect(cancel,SIGNAL(clicked()),this,SLOT(Cancel())); lay->addWidget(cancel); } lay->addStretch(); return lay; } void QCSPrimEditor::UpdatePropertyCB() { PropertiesComboBox->clear(); for (size_t i=0;iGetQtyProperties();++i) { QString str; CSProperties* prop=clCS->GetProperty(i); if (prop==NULL) break; str=QString(prop->GetName().c_str()); switch (prop->GetType()) { case CSProperties::UNKNOWN: str+=tr(" (Unknown)"); break; case CSProperties::MATERIAL: str+=tr(" (Material)"); break; case CSProperties::METAL: str+=tr(" (Metal)"); break; case CSProperties::EXCITATION: str+=tr(" (Excitation)"); break; case CSProperties::PROBEBOX: str+=tr(" (Charge-Box)"); break; case CSProperties::RESBOX: str+=tr(" (Res-Box)"); break; case CSProperties::DUMPBOX: str+=tr(" (Dump-Box)"); break; }; PropertiesComboBox->addItem(str); } CSProperties* prop=CSPrim->GetProperty(); if (prop==NULL) PropertiesComboBox->setCurrentIndex(0); else PropertiesComboBox->setCurrentIndex(prop->GetID()); } QCSPrimitiveLayout::QCSPrimitiveLayout(CSPrimitives *prim, QWidget *parent) : QGridLayout(parent) { clPrim = prim; } QCSPrimitiveLayout::~QCSPrimitiveLayout() { } void QCSPrimitiveLayout::SetValues() { } void QCSPrimitiveLayout::GetValues() { } QCSPrimBoxLayout::QCSPrimBoxLayout(CSPrimBox* prim, QWidget *parent) : QCSPrimitiveLayout(prim, parent) { clBox=prim; addWidget(new QLabel(tr("1. Point")),0,0,1,6); addWidget(new QLabel("X:"),1,0); Lines[0]=new QLineEdit(); addWidget(Lines[0],1,1); addWidget(new QLabel("Y:"),1,2); Lines[2]=new QLineEdit(); addWidget(Lines[2],1,3); addWidget(new QLabel("Z:"),1,4); Lines[4]=new QLineEdit(); addWidget(Lines[4],1,5); addWidget(new QLabel(tr("2. Point")),2,0,1,6); addWidget(new QLabel("X:"),3,0); Lines[1]=new QLineEdit();addWidget(Lines[1],3,1); addWidget(new QLabel("Y:"),3,2); Lines[3]=new QLineEdit();addWidget(Lines[3],3,3); addWidget(new QLabel("Z:"),3,4); Lines[5]=new QLineEdit();addWidget(Lines[5],3,5); for (int i=0;i<6;++i) Lines[i]->setEnabled(QCSX_Settings.GetEdit()); GetValues(); } QCSPrimBoxLayout::~QCSPrimBoxLayout() { } void QCSPrimBoxLayout::SetValues() { bool bOk; double dVal; QString line; for (size_t i=0; i< 6; ++i) { line=Lines[i]->text(); dVal=line.toDouble(&bOk); if (bOk) clBox->SetCoord(i,dVal); else clBox->SetCoord(i,line.toStdString()); } } void QCSPrimBoxLayout::GetValues() { ParameterScalar* ps; for (size_t i=0; i< 6; ++i) { ps=clBox->GetCoordPS(i); if (ps->GetMode()) Lines[i]->setText(ps->GetString().c_str()); else Lines[i]->setText(QString("%1").arg(ps->GetValue())); } } QCSPrimSphereLayout::QCSPrimSphereLayout(CSPrimSphere* prim, QWidget *parent) : QCSPrimitiveLayout(prim, parent) { clSphere=prim; addWidget(new QLabel(tr("Center Point")),0,0,1,6); addWidget(new QLabel("X:"),1,0); Lines[0]=new QLineEdit();addWidget(Lines[0],1,1); addWidget(new QLabel("Y:"),1,2); Lines[1]=new QLineEdit();addWidget(Lines[1],1,3); addWidget(new QLabel("Z:"),1,4); Lines[2]=new QLineEdit();addWidget(Lines[2],1,5); addWidget(new QLabel(tr("Radius")),2,0,1,2); Lines[3]=new QLineEdit();addWidget(Lines[3],2,3,1,4); for (int i=0;i<4;++i) Lines[i]->setEnabled(QCSX_Settings.GetEdit()); GetValues(); } QCSPrimSphereLayout::~QCSPrimSphereLayout() { } void QCSPrimSphereLayout::SetValues() { bool bOk; double dVal; QString line; for (size_t i=0; i< 3; ++i) { line=Lines[i]->text(); dVal=line.toDouble(&bOk); if (bOk) clSphere->SetCoord(i,dVal); else clSphere->SetCoord(i,line.toLatin1().data()); } ParameterScalar* ps=clSphere->GetRadiusPS(); line=Lines[3]->text(); dVal=line.toDouble(&bOk); if (bOk) ps->SetValue(dVal); else ps->SetValue(line.toLatin1().data()); } void QCSPrimSphereLayout::GetValues() { ParameterScalar* ps; for (size_t i=0; i< 3; ++i) { ps=clSphere->GetCoordPS(i); if (ps->GetMode()) Lines[i]->setText(ps->GetString().c_str()); else Lines[i]->setText(QString("%1").arg(ps->GetValue())); } ps=clSphere->GetRadiusPS(); if (ps->GetMode()) Lines[3]->setText(ps->GetString().c_str()); else Lines[3]->setText(QString("%1").arg(ps->GetValue())); } //****Cylinder QCSPrimCylinderLayout::QCSPrimCylinderLayout(CSPrimCylinder* prim, QWidget *parent) : QCSPrimitiveLayout(prim, parent) { clCylinder=prim; addWidget(new QLabel(tr("Start Point")),0,0,1,6); addWidget(new QLabel("X:"),1,0); Lines[0]=new QLineEdit();addWidget(Lines[0],1,1); addWidget(new QLabel("Y:"),1,2); Lines[2]=new QLineEdit();addWidget(Lines[2],1,3); addWidget(new QLabel("Z:"),1,4); Lines[4]=new QLineEdit();addWidget(Lines[4],1,5); addWidget(new QLabel(tr("End Point")),2,0,1,6); addWidget(new QLabel("X:"),3,0); Lines[1]=new QLineEdit();addWidget(Lines[1],3,1); addWidget(new QLabel("Y:"),3,2); Lines[3]=new QLineEdit();addWidget(Lines[3],3,3); addWidget(new QLabel("Z:"),3,4); Lines[5]=new QLineEdit();addWidget(Lines[5],3,5); addWidget(new QLabel(tr("Radius")),4,0,1,2); Lines[6]=new QLineEdit();addWidget(Lines[6],4,3,1,4); for (int i=0;i<7;++i) Lines[i]->setEnabled(QCSX_Settings.GetEdit()); GetValues(); } QCSPrimCylinderLayout::~QCSPrimCylinderLayout() { } void QCSPrimCylinderLayout::SetValues() { bool bOk; double dVal; QString line; for (size_t i=0; i< 6; ++i) { line=Lines[i]->text(); dVal=line.toDouble(&bOk); if (bOk) clCylinder->SetCoord(i,dVal); else clCylinder->SetCoord(i,line.toLatin1().data()); } ParameterScalar* ps=clCylinder->GetRadiusPS(); line=Lines[6]->text(); dVal=line.toDouble(&bOk); if (bOk) ps->SetValue(dVal); else ps->SetValue(line.toLatin1().data()); } void QCSPrimCylinderLayout::GetValues() { ParameterScalar* ps; for (size_t i=0; i< 6; ++i) { ps=clCylinder->GetCoordPS(i); if (ps->GetMode()) Lines[i]->setText(ps->GetString().c_str()); else Lines[i]->setText(QString("%1").arg(ps->GetValue())); } ps=clCylinder->GetRadiusPS(); if (ps->GetMode()) Lines[6]->setText(ps->GetString().c_str()); else Lines[6]->setText(QString("%1").arg(ps->GetValue())); } //****CylindricalShell QCSPrimCylindricalShellLayout::QCSPrimCylindricalShellLayout(CSPrimCylindricalShell* prim, QWidget *parent) : QCSPrimCylinderLayout(prim, parent) { clCylindricalShell=prim; addWidget(new QLabel(tr("ShellWidth")),5,0,1,2); m_ShellWidth=new QLineEdit();addWidget(m_ShellWidth,5,3,1,4); for (int i=0;i<8;++i) m_ShellWidth->setEnabled(QCSX_Settings.GetEdit()); GetValues(); } QCSPrimCylindricalShellLayout::~QCSPrimCylindricalShellLayout() { } void QCSPrimCylindricalShellLayout::SetValues() { QCSPrimCylinderLayout::SetValues(); bool bOk; double dVal; QString line; ParameterScalar* ps = clCylindricalShell->GetShellWidthPS(); line = m_ShellWidth->text(); dVal = line.toDouble(&bOk); if (bOk) ps->SetValue(dVal); else ps->SetValue(line.toLatin1().constData()); } void QCSPrimCylindricalShellLayout::GetValues() { QCSPrimCylinderLayout::GetValues(); ParameterScalar* ps = clCylindricalShell->GetShellWidthPS(); if (ps->GetMode()) m_ShellWidth->setText(ps->GetString().c_str()); else m_ShellWidth->setText(QString("%1").arg(ps->GetValue())); } /*****************MultiBox*****/ QCSPrimMultiBoxLayout::QCSPrimMultiBoxLayout(CSPrimMultiBox* prim, QWidget *parent) : QCSPrimitiveLayout(prim, parent) { clMultiBox=prim; QPushButton *addButton = new QPushButton("Add Box"); QObject::connect(addButton,SIGNAL(clicked()),this,SLOT(NewBox())); addWidget(addButton,0,0); addButton->setEnabled(QCSX_Settings.GetEdit()); QPushButton *editButton = new QPushButton("Edit Box"); QObject::connect(editButton,SIGNAL(clicked()),this,SLOT(EditBox())); addWidget(editButton,0,1); editButton->setEnabled(QCSX_Settings.GetEdit()); QPushButton *deleteButton = new QPushButton("Delete Box"); QObject::connect(deleteButton,SIGNAL(clicked()),this,SLOT(DeleteBox())); addWidget(deleteButton,0,2); deleteButton->setEnabled(QCSX_Settings.GetEdit()); qBoxList = new QListWidget(); addWidget(qBoxList,1,0,1,3); for (unsigned int i=0;iGetQtyBoxes();++i) { qBoxList->addItem(tr("Box #%1").arg(i)); } qBoxList->setEnabled(QCSX_Settings.GetEdit()); GetValues(); } QCSPrimMultiBoxLayout::~QCSPrimMultiBoxLayout() { } void QCSPrimMultiBoxLayout::SetValues() { } void QCSPrimMultiBoxLayout::GetValues() { } void QCSPrimMultiBoxLayout::NewBox(QListWidgetItem* item) { UNUSED(item); // unsigned int nr=qBoxList->count() // clMultiBox->ClearOverlap(); // qBoxList->addItem(tr("Box #%1").arg(nr)); // if (item==NULL) clMultiBox->AddBox(); // else clMultiBox->AddBox(qBoxList->row(item)); } void QCSPrimMultiBoxLayout::DeleteBox(QListWidgetItem* item) { UNUSED(item); } void QCSPrimMultiBoxLayout::EditBox(QListWidgetItem* item) { UNUSED(item); } //***********************************************************************************// QCSPrimPolygonLayout::QCSPrimPolygonLayout(CSPrimPolygon* prim, QWidget *parent) : QCSPrimitiveLayout(prim, parent) { clPoly=prim; addWidget(new QLabel(tr("Polygon Plane")),0,0); NormVec = new QComboBox(); NormVec->addItem(tr("yz-plane")); NormVec->addItem(tr("zx-plane")); NormVec->addItem(tr("xy-plane")); QObject::connect(NormVec,SIGNAL(currentIndexChanged(int)),this,SLOT(NormVecChanged())); addWidget(NormVec,0,1); NormVec->setEnabled(QCSX_Settings.GetEdit()); addWidget(new QLabel(tr("Polygon Elevation")),1,0); Elevation = new QLineEdit();; addWidget(Elevation,1,1); Elevation->setEnabled(QCSX_Settings.GetEdit()); QGroupBox* gb = new QGroupBox(tr("Polygon Vertices")); QFormLayout* gbl = new QFormLayout(); gb->setLayout(gbl); addWidget(gb,2,0,1,2); CoordLineX = new QLineEdit(); gbl->addRow(tr("X_1"),CoordLineX); CoordLineX->setEnabled(QCSX_Settings.GetEdit()); CoordLineY = new QLineEdit(); gbl->addRow(tr("X_2"),CoordLineY); CoordLineY->setEnabled(QCSX_Settings.GetEdit()); GetValues(); } QCSPrimPolygonLayout::~QCSPrimPolygonLayout() { } void QCSPrimPolygonLayout::SetValues() { int ind = NormVec->currentIndex(); clPoly->SetNormDir(ind); ParameterScalar* ps; bool bOk; double dVal; QString line; ps=clPoly->GetElevationPS(); line=Elevation->text(); dVal=line.toDouble(&bOk); if (bOk) ps->SetValue(dVal); else ps->SetValue(line.toStdString()); clPoly->ClearCoords(); QStringList strListX = CoordLineX->text().split(",",QString::SkipEmptyParts); QStringList strListY = CoordLineY->text().split(",",QString::SkipEmptyParts); for (int i=0; (iAddCoord(dVal); else clPoly->AddCoord(line.toStdString()); dVal=x2.toDouble(&bOk); if (bOk) clPoly->AddCoord(dVal); else clPoly->AddCoord(line.toStdString()); } } void QCSPrimPolygonLayout::GetValues() { NormVec->setCurrentIndex(clPoly->GetNormDir()); ParameterScalar* ps; ps=clPoly->GetElevationPS(); if (ps->GetMode()) Elevation->setText(ps->GetString().c_str()); else Elevation->setText(QString("%1").arg(ps->GetValue())); QStringList strListX; QStringList strListY; for (size_t i=0; iGetQtyCoords(); ++i) { ps=clPoly->GetCoordPS(2*i); if (ps) { if (ps->GetMode()) strListX.append(ps->GetString().c_str()); else strListX.append(QString("%1").arg(ps->GetValue())); } ps=clPoly->GetCoordPS(2*i+1); if (ps) { if (ps->GetMode()) strListY.append(ps->GetString().c_str()); else strListY.append(QString("%1").arg(ps->GetValue())); } } CoordLineX->setText(strListX.join(", ")); CoordLineY->setText(strListY.join(", ")); } void QCSPrimPolygonLayout::NormVecChanged() { // QStringList headers; // switch (NormVec->currentIndex()) // { // case 0: // headers << "x" << "y"; // break; // case 1: // headers << "y" << "z"; // break; // case 2: // headers << "z" << "x"; // break; // default: // headers << "x" << "y"; // break; // } // CoordTable->setHorizontalHeaderLabels(headers); } //***********************************************************************************// QCSPrimUserDefinedLayout::QCSPrimUserDefinedLayout(CSPrimUserDefined* prim, QWidget *parent) : QCSPrimitiveLayout(prim, parent) { clUserDef=prim; int row=0; addWidget(new QLabel(tr("Choose Coordinate System")),row++,0); CoordSystem = new QComboBox(); CoordSystem->addItem("Cartesian Coord. System (x,y,z)"); CoordSystem->addItem("Cartesian & Cylindrical Coord. System (x,y,z,r,a)"); CoordSystem->addItem("Cartesian & Spherical Coord. System (x,y,z,r,a,t)"); addWidget(CoordSystem,row++,0); CoordSystem->setEnabled(QCSX_Settings.GetEdit()); QGroupBox* SysShiftGrp = new QGroupBox(tr("Shift Coordinate System")); addWidget(SysShiftGrp,row++,0); QGridLayout* lay = new QGridLayout; SysShiftGrp->setLayout(lay); lay->addWidget(new QLabel(tr("X-Shift:")),0,0); CoordShift[0]=new QLineEdit(); lay->addWidget(CoordShift[0],0,1); lay->addWidget(new QLabel(tr("Y-Shift:")),1,0); CoordShift[1]=new QLineEdit(); lay->addWidget(CoordShift[1],1,1); lay->addWidget(new QLabel(tr("Z-Shift:")),2,0); CoordShift[2]=new QLineEdit(); lay->addWidget(CoordShift[2],2,1); for (int i=0;i<3;++i) CoordShift[i]->setEnabled(QCSX_Settings.GetEdit()); addWidget(new QLabel(tr("Define Bool-Function for this Primitive in chosen Coord. System:")),row++,0); FunctionLine = new QLineEdit(); addWidget(FunctionLine,row++,0); FunctionLine->setEnabled(QCSX_Settings.GetEdit()); GetValues(); } QCSPrimUserDefinedLayout::~QCSPrimUserDefinedLayout() { } void QCSPrimUserDefinedLayout::SetValues() { clUserDef->SetCoordSystem((CSPrimUserDefined::UserDefinedCoordSystem)CoordSystem->currentIndex()); clUserDef->SetFunction(FunctionLine->text().toStdString().c_str()); bool bOk; double dVal; QString line; ParameterScalar* ps; for (size_t i=0; i< 3; ++i) { ps=clUserDef->GetCoordShiftPS(i); line=CoordShift[i]->text(); dVal=line.toDouble(&bOk); if (bOk) ps->SetValue(dVal); else ps->SetValue(line.toLatin1().data()); } } void QCSPrimUserDefinedLayout::GetValues() { CoordSystem->setCurrentIndex(clUserDef->GetCoordSystem()); FunctionLine->setText(clUserDef->GetFunction()); ParameterScalar* ps; for (size_t i=0; i< 3; ++i) { ps=clUserDef->GetCoordShiftPS(i); if (ps==NULL) return; if (ps->GetMode()) CoordShift[i]->setText(ps->GetString().c_str()); else CoordShift[i]->setText(QString("%1").arg(ps->GetValue())); } }