27 #include <qpopupmenu.h>
28 #include <qmessagebox.h>
31 #include <qpushbutton.h>
32 #include <qlineedit.h>
33 #include <qcombobox.h>
34 #include <qvalidator.h>
36 #include <qclipboard.h>
37 #include <qapplication.h>
50 setCaption(
"Qucs Filter " PACKAGE_VERSION);
54 QPopupMenu *fileMenu =
new QPopupMenu();
55 fileMenu->insertItem(tr(
"E&xit"),
this, SLOT(slotQuit()), CTRL+Key_Q);
57 QPopupMenu *helpMenu =
new QPopupMenu();
58 helpMenu->insertItem(tr(
"Help..."),
this, SLOT(slotHelpIntro()), Key_F1);
59 helpMenu->insertSeparator();
61 tr(
"&About QucsFilter..."),
this, SLOT(slotHelpAbout()), 0);
62 helpMenu->insertItem(tr(
"About Qt..."),
this, SLOT(slotHelpAboutQt()), 0);
64 QMenuBar *bar =
new QMenuBar(
this);
65 bar->insertItem(tr(
"&File"), fileMenu);
66 bar->insertSeparator ();
67 bar->insertItem(tr(
"&Help"), helpMenu);
71 gbox =
new QGridLayout(
this, 10,3,5,5);
73 QWidget *Space =
new QWidget(
this);
74 Space->setFixedSize(5, bar->height());
75 gbox->addWidget(Space, 0,0);
77 QLabel *Label1 =
new QLabel(tr(
"Filter type:"),
this);
78 gbox->addWidget(Label1, 1,0);
79 ComboType =
new QComboBox(
this);
80 ComboType->insertItem(
"Bessel");
81 ComboType->insertItem(
"Butterworth");
82 ComboType->insertItem(
"Chebyshev");
83 ComboType->insertItem(
"Cauer");
84 gbox->addWidget(ComboType, 1,1);
85 connect(ComboType, SIGNAL(activated(
int)), SLOT(slotTypeChanged(
int)));
87 QLabel *Label2 =
new QLabel(tr(
"Filter class:"),
this);
88 gbox->addWidget(Label2, 2,0);
89 ComboClass =
new QComboBox(
this);
90 ComboClass->insertItem(tr(
"Low pass"));
91 ComboClass->insertItem(tr(
"High pass"));
92 ComboClass->insertItem(tr(
"Band pass"));
93 ComboClass->insertItem(tr(
"Band stop"));
94 gbox->addWidget(ComboClass, 2,1);
95 connect(ComboClass, SIGNAL(activated(
int)), SLOT(slotClassChanged(
int)));
97 IntVal =
new QIntValidator(1, 200,
this);
98 DoubleVal =
new QDoubleValidator(
this);
100 LabelOrder =
new QLabel(tr(
"Order:"),
this);
101 gbox->addWidget(LabelOrder, 3,0);
102 EditOrder =
new QLineEdit(
"3",
this);
103 EditOrder->setValidator(IntVal);
104 gbox->addWidget(EditOrder, 3,1);
106 LabelStart =
new QLabel(tr(
"Corner frequency:"),
this);
107 gbox->addWidget(LabelStart, 4,0);
108 EditCorner =
new QLineEdit(
"1",
this);
109 EditCorner->setValidator(DoubleVal);
110 gbox->addWidget(EditCorner, 4,1);
111 ComboCorner =
new QComboBox(
this);
112 ComboCorner->insertItem(
"Hz");
113 ComboCorner->insertItem(
"kHz");
114 ComboCorner->insertItem(
"MHz");
115 ComboCorner->insertItem(
"GHz");
116 ComboCorner->setCurrentItem(3);
117 gbox->addWidget(ComboCorner, 4,2);
119 LabelStop =
new QLabel(tr(
"Stop frequency:"),
this);
120 gbox->addWidget(LabelStop, 5,0);
121 EditStop =
new QLineEdit(
"2",
this);
122 EditStop->setValidator(DoubleVal);
123 gbox->addWidget(EditStop, 5,1);
124 ComboStop =
new QComboBox(
this);
125 ComboStop->insertItem(
"Hz");
126 ComboStop->insertItem(
"kHz");
127 ComboStop->insertItem(
"MHz");
128 ComboStop->insertItem(
"GHz");
129 ComboStop->setCurrentItem(3);
130 gbox->addWidget(ComboStop, 5,2);
132 LabelBandStop =
new QLabel(tr(
"Stop band frequency:"),
this);
133 gbox->addWidget(LabelBandStop, 6,0);
134 EditBandStop =
new QLineEdit(
"3",
this);
135 EditBandStop->setValidator(DoubleVal);
136 gbox->addWidget(EditBandStop, 6,1);
137 ComboBandStop =
new QComboBox(
this);
138 ComboBandStop->insertItem(
"Hz");
139 ComboBandStop->insertItem(
"kHz");
140 ComboBandStop->insertItem(
"MHz");
141 ComboBandStop->insertItem(
"GHz");
142 ComboBandStop->setCurrentItem(3);
143 gbox->addWidget(ComboBandStop, 6,2);
145 LabelRipple =
new QLabel(tr(
"Pass band ripple:"),
this);
146 gbox->addWidget(LabelRipple, 7,0);
147 EditRipple =
new QLineEdit(
"1",
this);
148 EditRipple->setValidator(DoubleVal);
149 gbox->addWidget(EditRipple, 7,1);
150 LabelRipple_dB =
new QLabel(
"dB",
this);
151 gbox->addWidget(LabelRipple_dB, 7,2);
153 LabelAtten =
new QLabel(tr(
"Stop band attenuation:"),
this);
154 gbox->addWidget(LabelAtten, 8,0);
155 EditAtten =
new QLineEdit(
"20",
this);
156 EditAtten->setValidator(DoubleVal);
157 gbox->addWidget(EditAtten, 8,1);
158 LabelAtten_dB =
new QLabel(
"dB",
this);
159 gbox->addWidget(LabelAtten_dB, 8,2);
161 QLabel *Label9 =
new QLabel(tr(
"Impedance:"),
this);
162 gbox->addWidget(Label9, 9,0);
163 EditImpedance =
new QLineEdit(
"50",
this);
164 EditImpedance->setValidator(DoubleVal);
165 gbox->addWidget(EditImpedance, 9,1);
166 QLabel *Label10 =
new QLabel(
"Ohm",
this);
167 gbox->addWidget(Label10, 9,2);
170 QPushButton *ButtonGo =
171 new QPushButton(tr(
"Calculate and put into Clipboard"),
this);
172 connect(ButtonGo, SIGNAL(clicked()), SLOT(slotCalculate()));
173 gbox->addMultiCellWidget(ButtonGo, 10,10,0,2);
175 LabelResult =
new QLabel(
this);
178 LabelResult->setAlignment(Qt::AlignHCenter);
179 gbox->addMultiCellWidget(LabelResult, 11,11,0,2);
195 void QucsFilter::slotQuit()
207 void QucsFilter::slotHelpAbout()
209 QMessageBox::about(
this, tr(
"About..."),
210 "QucsFilter Version " PACKAGE_VERSION+
211 tr(
"\nFilter synthesis program\n")+
212 tr(
"Copyright (C) 2005, 2006 by")+
213 "\nVincent Habchi, Toyoyuki Ishikawa,\n"
214 "Michael Margraf, Stefan Jahn\n"
215 "\nThis is free software; see the source for copying conditions."
216 "\nThere is NO warranty; not even for MERCHANTABILITY or "
217 "\nFITNESS FOR A PARTICULAR PURPOSE.\n\n");
221 void QucsFilter::slotHelpAboutQt()
223 QMessageBox::aboutQt(
this, tr(
"About Qt"));
227 void QucsFilter::slotHelpIntro()
234 void QucsFilter::setError(
const QString& Message)
236 LabelResult->setText(tr(
"Result:") +
"<font color=\"#FF0000\"><b> " +
237 tr(
"Error") +
"</b></font>");
238 QMessageBox::critical(
this, tr(
"Error"), Message);
242 QString * QucsFilter::calculateFilter(
struct tFilter * Filter)
248 double amin, amax, fc, fs, bw, r;
256 switch (Filter->
Class) {
272 EditOrder->setText(QString::number(F->
order()));
273 s =
new QString(F->
to_qucs().c_str());
287 void QucsFilter::slotCalculate()
290 double CornerFreq = EditCorner->text().toDouble();
291 double StopFreq = EditStop->text().toDouble();
292 double BandStopFreq = EditBandStop->text().toDouble();
295 CornerFreq *=
pow(10,
double(3*ComboCorner->currentItem()));
296 StopFreq *=
pow(10,
double(3*ComboStop->currentItem()));
297 BandStopFreq *=
pow(10,
double(3*ComboBandStop->currentItem()));
300 Filter.
Type = ComboType->currentItem();
301 Filter.
Class = ComboClass->currentItem();
302 Filter.
Order = EditOrder->text().toInt();
303 Filter.
Ripple = EditRipple->text().toDouble();
305 Filter.
Impedance = EditImpedance->text().toDouble();
310 if(EditStop->isEnabled())
312 setError(tr(
"Stop frequency must be greater than start frequency."));
316 if(EditOrder->isEnabled()) {
317 if (Filter.
Order < 2) {
318 setError(tr(
"Filter order must not be less than two."));
322 setError(tr(
"Bessel filter order must not be greater than 19."));
327 QString * s = calculateFilter(&Filter);
331 QClipboard *cb = QApplication::clipboard();
337 LabelResult->setText(tr(
"Result:") +
"<font color=\"#008000\"><b> " +
338 tr(
"Successful") +
"</b></font>");
339 QTimer::singleShot(500,
this, SLOT(slotShowResult()));
343 void QucsFilter::slotShowResult()
345 if(ResultState > 5) {
346 LabelResult->setText(tr(
"Result: --"));
353 if(ResultState & 1) c = 0xFF;
355 QString s = QString(
"<font color=\"#00%100\"><b> ").arg(c, 2, 16);
356 LabelResult->setText(tr(
"Result:") + s + tr(
"Successful") +
"</b></font>");
359 if(ResultState > 5) c = 3000;
360 QTimer::singleShot(c,
this, SLOT(slotShowResult()));
364 void QucsFilter::slotTypeChanged(
int index)
369 LabelRipple->setEnabled(
false);
370 EditRipple->setEnabled(
false);
371 LabelRipple_dB->setEnabled(
false);
375 LabelRipple->setEnabled(
true);
376 EditRipple->setEnabled(
true);
377 LabelRipple_dB->setEnabled(
true);
381 LabelOrder->setEnabled(
false);
382 EditOrder->setEnabled(
false);
383 LabelAtten->setEnabled(
true);
384 EditAtten->setEnabled(
true);
385 LabelAtten_dB->setEnabled(
true);
386 LabelBandStop->setEnabled(
true);
387 EditBandStop->setEnabled(
true);
388 ComboBandStop->setEnabled(
true);
391 LabelOrder->setEnabled(
true);
392 EditOrder->setEnabled(
true);
393 LabelAtten->setEnabled(
false);
394 EditAtten->setEnabled(
false);
395 LabelAtten_dB->setEnabled(
false);
396 LabelBandStop->setEnabled(
false);
397 EditBandStop->setEnabled(
false);
398 ComboBandStop->setEnabled(
false);
403 void QucsFilter::slotClassChanged(
int index)
408 LabelStop->setEnabled(
false);
409 EditStop->setEnabled(
false);
410 ComboStop->setEnabled(
false);
411 LabelStart->setText(tr(
"Corner frequency:"));
415 LabelStop->setEnabled(
true);
416 EditStop->setEnabled(
true);
417 ComboStop->setEnabled(
true);
418 LabelStart->setText(tr(
"Start frequency:"));
422 LabelBandStop->setText(tr(
"Stop band frequency:"));
423 LabelRipple->setText(tr(
"Pass band ripple:"));
426 LabelBandStop->setText(tr(
"Pass band frequency:"));
427 LabelRipple->setText(tr(
"Pass band attenuation:"));