Qucs-S S-parameter Viewer & RF Synthesis Tools
Loading...
Searching...
No Matches
qucs-s-spar-viewer.h
Go to the documentation of this file.
1
7
8#ifndef QUCSSPARVIEWER_H
9#define QUCSSPARVIEWER_H
10
14
15#include "UI/CustomWidgets/codeeditor.h"
18
25
27
28#include "Misc/general.h"
29
30#include "aboutdialog.h"
31
32
33#include <QCheckBox>
34#include <QColorDialog>
35#include <QDoubleSpinBox>
36#include <QGridLayout>
37#include <QLabel>
38#include <QMainWindow>
39#include <QScrollArea>
40#include <QTableWidget>
41#include <QtGlobal>
42#include <complex>
43#include <utility> // std::as_const()
44
45
46
47class QComboBox;
48class QTableWidget;
49class QLineEdit;
50class QIntValidator;
51class QDoubleValidator;
52class QLabel;
53class QPushButton;
54
56
60 int x, y;
61 QFont font;
62 QString LangDir;
63 QString Language;
64 QString theme;
65 QString customThemePath;
66};
67
68extern struct tQucsSettings QucsSettings;
69
73 QLabel* nameLabel;
74 QDoubleSpinBox* freqSpinBox;
75 QComboBox* scaleComboBox;
76 QToolButton* deleteButton;
77};
78
81enum class DisplayMode {
83 Phase,
84 Smith,
85 Polar,
87 Stability,
88 VSWR,
90};
91
95 QLabel* nameLabel;
96 QSpinBox* width;
97 QPushButton* colorButton;
98 QComboBox* LineStyleComboBox;
99 QToolButton* deleteButton;
100 QString display_mode;
101};
102
103
107 QLabel* LimitLabel;
108 QDoubleSpinBox* Start_Freq;
109 QDoubleSpinBox* Stop_Freq;
110 QDoubleSpinBox* Start_Value;
111 QDoubleSpinBox* Stop_Value;
112 QComboBox* Start_Freq_Scale;
113 QComboBox* Stop_Freq_Scale;
114 QComboBox* axis;
115 QToolButton* Button_Delete_Limit;
116 QFrame* Separator;
117 QPushButton* Couple_Value;
118};
119
122struct TraceInfo {
123 QString dataset;
124 QString parameter;
126
129 QString uniqueId() const {
132 QString displayMode_str = QString::number(static_cast<int>(displayMode)); // Assign to variable to avoid warning
133 return QString("%1.%2_%3")
134 .arg(dataset, parameter, displayMode_str);
135 } else {
136 return QString("%1.%2").arg(dataset, parameter);
137 }
138 }
139
142 QString displayName() const {
143 QString modeName = QString("");
144
146 modeName = "dB";
147 } else {
149 modeName = "Phase";
150 } else {
151 return QString("%1.%2").arg(dataset, parameter);
152 }
153 }
154 return QString("%1.%2_%3").arg(dataset, parameter, modeName);
155 }
156};
157
158
168class Qucs_S_SPAR_Viewer : public QMainWindow {
169 Q_OBJECT
170 public:
173
176
179 void addPathToWatcher(const QString& path);
180
184 void addFile(const QFileInfo& fileInfo);
185
186
187 private slots:
188 // Menu actions
191 void slotHelpIntro();
192
196 void slotHelpAbout() {
197 AboutDialog dlg(this);
198 dlg.exec();
199 }
200
202 void slotHelpAboutQt() { QMessageBox::aboutQt(this, tr("About Qt")); }
203
205 void slotQuit() { qApp->quit(); }
206
208 void slotSave();
209
212 void slotSaveAs();
213
215 void slotLoadSession();
216
218 void slotSetLightTheme();
219
221 void slotSetDarkTheme();
222
224 void slotLoadCustomTheme();
225
241 void raiseWidgetsOnTabSelection(int index);
242
243 // File management
253 void addFile();
254
264 void addFiles(QStringList);
265
272 void removeFile();
273
279 void removeFile(QString ID);
280
285 void removeAllFiles();
286
295 void removeTracesByDataset(const QString& dataset_to_remove);
296
300 QMap<QString, QList<double>> readQucsatorDataset(const QString& filePath);
301
305 QMap<QString, QList<double>> readNGspiceData(const QString& filePath);
306
310 QString extractSParamIndices(const QString& sparam);
311
323 void applyDefaultVisualizations(const QStringList& fileNames);
324
337 void addOptionalTraces(QMap<QString, QList<double>>& file_data);
338
339 void removeTraceByProps(DisplayMode mode, const QString& traceID,
340 TraceProperties& props);
341
345 void CreateFileWidgets(QString filename, int position = 0);
346
347 // File watching
353 void setupFileWatcher();
354
365 void fileChanged(const QString& path);
366
376 void directoryChanged(const QString& path);
377
378 // Trace management
381 void addTrace();
382
388 void addTrace(const TraceInfo& traceInfo, QColor trace_color, int trace_width,
389 QString trace_style = "Solid");
390
392 void removeTrace();
393
395 void removeAllTraces();
396
399 void removeAll();
400
410 void removeAndCollapseRow(QGridLayout* targetLayout, int row_to_remove);
411
414 int getNumberOfTraces() { return traceMap.keys().size(); }
415
418 void cleanToolsDatasets(const QString& excludeDataset = QString());
419
425 void updateTracesCombo();
426
428 void updateDisplayType();
429
430 // Trace appearance
431 void changeTraceColor();
432 void changeTraceLineStyle();
433 void changeTraceWidth();
434
439 void changeMarkerLimits();
440
445 void changeMarkerLimits(QString);
446
447 // Marker management
451 void addMarker(double freq = -1, QString Freq_Marker_Scale = QString("MHz"));
452
456 void removeMarker();
457
460 void removeMarker(const QString&);
461
466 void removeAllMarkers();
467
470 int getNumberOfMarkers() { return markerMap.keys().size(); }
471
473 void updateMarkerTable();
474
477 void updateMarkerNames();
478
483 void updateMarkerData(QTableWidget& layout, DisplayMode mode, QStringList header);
484
490 bool getMarkerByPosition(int position, QString& outMarkerName, MarkerProperties& outProperties);
491
492 // Limit management
501 void addLimit(double f_limit1 = -1, QString f_limit1_unit = "",
502 double f_limit2 = -1, QString f_limit2_unit = "",
503 double y_limit1 = -1, double y_limit2 = -1,
504 bool coupled = true);
505
514 void onLimitDeleteClicked(bool);
515
534 void removeLimit(QString);
535
543 void removeAllLimits();
544
555 void updateLimits();
556
566 void updateLimitNames();
567
570 void onLimitsOffsetChanged(double newOffset);
571
574 int getNumberOfLimits() { return limitsMap.keys().size(); }
575
585 bool getLimitByPosition(int, QString&, LimitProperties&);
586
595 void coupleSpinBoxes();
596
605 void updateGridLayout(QGridLayout*);
606
609 void updateAllPlots(const QString& datasetName);
610
622 void updateTracesInWidget(QWidget* widget, const QString& datasetName);
623
627 void calculate_Sparameter_trace(QString, QString);
628
629 protected:
632 void dragEnterEvent(QDragEnterEvent* event) override;
633
636 void dropEvent(QDropEvent* event) override;
637
638 private:
639
640 // UI Components - File Management
641 QDockWidget* dockFiles;
642 QTableWidget* spar_files_Widget;
643 QPushButton *Button_Add_File;
644 QPushButton *Delete_All_Files;
645 QList<QPushButton*> Button_DeleteFile;
646 QVBoxLayout* vLayout_Files;
647 QWidget* FileList_Widget;
648 QGridLayout* FilesGrid;
649 QList<QLabel*> List_FileNames;
650 QList<QToolButton*> List_RemoveButton;
651
652 // UI Components - Trace Management
653 QDockWidget* dockTracesList;
654 QWidget* TracesList_Widget;
655 QGridLayout* TracesGrid;
656
658 QMap<DisplayMode, QMap<QString, TraceProperties>> traceMap;
659
660 QTabWidget* traceTabs;
661 QWidget *magnitudePhaseTab;
662 QWidget *smithTab;
663 QWidget *polarTab;
664 QWidget *portImpedanceTab;
665 QWidget *stabilityTab;
666 QWidget *VSWRTab;
667 QWidget *GroupDelayTab;
668
669 QGridLayout *magnitudePhaseLayout;
670 QGridLayout *smithLayout;
671 QGridLayout *polarLayout;
672 QGridLayout *portImpedanceLayout;
673 QGridLayout *stabilityLayout;
674 QGridLayout *VSWRLayout;
675 QGridLayout *GroupDelayLayout;
676
677
678 // Trace selection widgets
679 QPushButton* Lock_axis_settings_Button;
680 bool lock_axis;
681 QStringList frequency_units;
682 QComboBox *QCombobox_datasets;
683 QComboBox *QCombobox_display_mode;
684 MatrixComboBox* QCombobox_traces;
685 QPushButton* Button_add_trace;
686 QPushButton* Button_Remove_all;
687 QTableWidget* Traces_Widget;
688
689 // Set-up Scrollable trace areas
692 void setupScrollableLayout();
693
698 void setupScrollAreaForLayout(QGridLayout*& layout, QWidget* parentTab,
699 const QString& objectName);
700
701
702 // Scroll areas
703 QScrollArea *magnitudePhaseScrollArea;
704 QScrollArea *smithScrollArea;
705 QScrollArea *polarScrollArea;
706 QScrollArea *nuScrollArea;
707 QScrollArea *GroupDelayScrollArea;
708
709 // Datasets
711 QMap<QString, QMap<QString, QList<double>>> datasets;
712
713 /* DATASET STRUCTURE
714 KEY | DATA
715 Filename1.s2p | {"freq", "S11_dB", ..., "S22_ang"}
716 ... | ...
717 Filenamek.s3p | {"freq", "S11_dB", ..., "S33_ang"}
718 */
719
720 // File watching
721 QFileSystemWatcher* fileWatcher;
722 QMap<QString, QString> watchedFilePaths;
723
724
725 // Plot widgets
726 // Magnitude plot
727 RectangularPlotWidget* Magnitude_PhaseChart;
728 QDockWidget* dockChart;
729 double f_min, f_max;
730 QList<QColor> default_colors;
731 QList<QGraphicsItem*> textLabels;
732
733 // Smith Chart
734 SmithChartWidget* smithChart;
735 QDockWidget* dockSmithChart;
736 QList<SmithChartWidget::Trace> SmithChartTraces;
737
738 // Polar plot
739 PolarPlotWidget* polarChart;
740 QDockWidget* dockPolarChart;
741 QList<PolarPlotWidget::Trace> PolarChartTraces;
742
743 // Port impedance plot (Rectangular plot)
744 RectangularPlotWidget* impedanceChart;
745 QDockWidget* dockImpedanceChart;
746 QList<RectangularPlotWidget::Trace> impedanceChartTraces;
747
748 // Stability plot (Rectangular plot)
749 RectangularPlotWidget* stabilityChart;
750 QDockWidget* dockStabilityChart;
751 QList<RectangularPlotWidget::Trace> stabilityChartTraces;
752
753 // VSWR plot (Rectangular plot)
754 RectangularPlotWidget* VSWRChart;
755 QDockWidget* dockVSWRChart;
756 QList<RectangularPlotWidget::Trace> VSWRChartTraces;
757
758 // Group delay plot (Rectangular plot)
759 RectangularPlotWidget* GroupDelayChart;
760 QDockWidget* dockGroupDelayChart;
761 QList<RectangularPlotWidget::Trace> GroupDelayTraces;
762
763 // Markers
764 QDockWidget* dockMarkers;
765 QWidget* Marker_Widget;
766 QGridLayout* MarkersGrid;
767 QPushButton *Button_add_marker;
768 QPushButton *Button_Remove_All_Markers;
769
770 QTableWidget *tableMarkers_Magnitude_Phase;
771 QTableWidget *tableMarkers_Smith;
772 QTableWidget *tableMarkers_Polar;
773 QTableWidget *tableMarkers_PortImpedance;
774 QTableWidget *tableMarkers_Stability;
775 QTableWidget *tableMarkers_VSWR;
776 QTableWidget *tableMarkers_GroupDelay;
777
779 QMap<QString, MarkerProperties> markerMap;
780
785 double getMarkerFreq(QString);
786
787 // Limit widgets
788 QDockWidget* dockLimits;
789 QWidget* Limits_Widget;
790 QGridLayout* LimitsGrid;
791 QPushButton *Button_add_Limit;
792 QPushButton *Button_Remove_All_Limits;
793 CustomDoubleSpinBox* Limits_Offset;
794
796 QMap<QString, LimitProperties> limitsMap;
797
798 // Tools
799 QDockWidget* dockTools;
800 GraphWidget* SchematicWidget;
801 QTabWidget* toolsTabWidget;
802 SimulationSetup* SimulationSetupWidget;
803
806 SchematicContent Circuit;
807
808 // Export widgets
809 QLabel* LabelExportSchematic;
810 QPushButton* ButtonExportSchematic;
811 QComboBox* ComboExportSchematic;
812 QComboBox* ComboExportOutputMethod;
813
816 void updateSchematicContent();
817
826 void callTools(bool visible);
827
830 void onToolsTabChanged(int index);
831
832 // Design tools
833 QTabWidget* toolsTabs;
834
839 QStringList Tools_Datasets;
840 FilterDesignTool* FilterTool;
841 MatchingNetworkDesignTool* MatchingTool;
842 PowerCombiningTool* PowerCombTool;
843 AttenuatorDesignTool* AttenuatorTool;
844
845 // S-parameter simulation class
846 SParameterCalculator SPAR_engine;
847
848 // Substrate
849 MS_Substrate MS_Subs;
850
852 NetlistScratchPad* Netlist_Tool;
853
854 // Save
855 QString savepath;
856
859 bool save();
860
865 void loadSession(QString path);
866
873 void saveRectangularPlotSettings(QXmlStreamWriter& xml,
874 RectangularPlotWidget* widget,
875 const QString& elementName);
876
883 void loadRectangularPlotSettings(QXmlStreamReader& xml,
884 RectangularPlotWidget* widget,
885 const QString& elementName);
886
893 void saveSmithPlotSettings(QXmlStreamWriter& xml, SmithChartWidget* widget,
894 const QString& elementName);
895
902 void loadSmithPlotSettings(QXmlStreamReader& xml, SmithChartWidget* widget,
903 const QString& elementName);
904
911 void savePolarPlotSettings(QXmlStreamWriter& xml, PolarPlotWidget* widget,
912 const QString& elementName);
913
920 void loadPolarPlotSettings(QXmlStreamReader& xml, PolarPlotWidget* widget,
921 const QString& elementName);
922
923 // Notes
924 QDockWidget* dockNotes;
925 CodeEditor* Notes_Widget;
926
927 // Recent files
928 std::vector<QString> recentFiles;
929 QMenu* recentFilesMenu;
930
932 void updateRecentFilesMenu();
933
936 void loadRecentFiles();
937
940 void addRecentFile(const QString&);
941
943 void clearRecentFiles(){ recentFiles.clear(); }
944
947 void saveRecentFiles();
948
949 // Setup UI
950 void CreateMenuBar();
951 void CreateDisplayWidgets();
952 void CreateRightPanel();
953 void setFileManagementDock();
954 void setTraceManagementDock();
955 void setMarkerManagementDock();
956 void setLimitManagementDock();
957 void setToolsDock();
958
959 // Utility methods
967 void getMinMaxValues(QString, QString, qreal&, qreal&, qreal&, qreal&);
968
971 void adjust_x_axis_to_file(QString);
972 void adjust_y_axis_to_trace(QString, QString);
973 void adjust_x_axis_div();
974
975 // File monitoring
976 void setupSimulationWatcher();
977 QStringList getWatchDirectories() const;
978
984 bool isSparamFile(const QString& path);
985
986 QStringList filePaths; // Full path of the files in the progrom. It's used for
987 // file monitoring.
988
989
992 QMenu *CreateCalculatorsMenu();
993
996 void applyTheme(const QString& themeName);
997
998 private slots:
1001 void updateSimulation(SchematicContent SI);
1002
1004 void updateSimulation();
1005
1007 void updateSubstrate();
1008
1010 void exportSchematic();
1011
1012
1013 // Dialog calculators
1014private slots:
1015 // ***** RF calculators *****
1017 void slotGammaCalculator();
1018
1020 void slotImpedanceCalculator();
1021
1023 void slotSwrS11Calculator();
1024
1026 void slotOctaveBWCalculator();
1027
1029 void slotRFPowerUnitCalculator();
1030
1032 void slotFrequencyToWavelengthCalculator();
1033
1035 void slotFreeSpaceLossCalculator();
1036
1038 void slotImageFrequencyCalculator();
1039
1041 void slotSecondaryImageFrequencyCalculator();
1042
1043 // ***** General electronics calculators *****
1045 void slotVoltageDividerCalculator();
1046
1048 void slotParallelResistorsCalculator();
1049
1051 void slotSeriesCapacitorsCalculator();
1052
1054 void slotParallelInductorsCalculator();
1055};
1056
1057#endif
GUI for the RF attenuator design tool (definition)
Custom QDoubleSpinBox. It includes a context menu (right-click) for setting the minimum,...
GUI and control logic for RF filter design and synthesis (definition)
GUI for the matching network synthesis tool (definition)
Widget for power combining network design and synthesis (definition)
S-parameter network analysis calculator.
Definition aboutdialog.h:9
GUI tool for RF attenuator design tool.
Definition AttenuatorDesignTool.h:51
[codeeditordefinition]
Definition codeeditor.h:67
A QDoubleSpinBox subclass that provides a context menu for configuring range and step.
Definition CustomDoubleSpinBox.h:28
Interactive filter design tool with real-time synthesis and visualization.
Definition FilterDesignTool.h:59
Dialog for calculating impedance, VSWR, and S11 from reflection coefficient (Γ)
Definition gamma_calculator.h:32
Definition graphwidget.h:28
Main widget for matching network design.
Definition MatchingNetworkDesignTool.h:34
ComboBox with custom matrix-style popup for parameter selection.
Definition matrixcombopopup.h:57
Widget for editing netlists.
Definition netlistscratchpad.h:20
Widget for displaying complex data in polar plot format with markers and traces.
Definition polarplotwidget.h:29
Widget for power combining network design and synthesis.
Definition PowerCombiningTool.h:87
Main application class for S-parameter viewer (and its RF circuit synthesis tools)
Definition qucs-s-spar-viewer.h:168
~Qucs_S_SPAR_Viewer()
Destructor.
Definition qucs-s-spar-viewer.cpp:78
void dropEvent(QDropEvent *event) override
Handle drop event for file drop.
Definition qucs-s-spar-viewer.cpp:1280
void addFile(const QFileInfo &fileInfo)
Add a file from QFileInfo (used by main program)
Definition dataset_management.cpp:77
void dragEnterEvent(QDragEnterEvent *event) override
Handle drag enter event for file drop.
Definition qucs-s-spar-viewer.cpp:1274
Qucs_S_SPAR_Viewer()
Constructor for the main viewer window.
Definition qucs-s-spar-viewer.cpp:30
void addPathToWatcher(const QString &path)
Add a directory path to the file watcher.
Definition qucs-s-spar-viewer.cpp:1945
Widget for displaying rectangular (Cartesian) plots with dual y-axes It provides a rectangular plot v...
Definition rectangularplotwidget.h:30
Calculates S-parameters using nodal analysis.
Definition SParameterCalculator.h:129
Container for schematic circuit data.
Definition SchematicContent.h:27
UI component to set the simulation settings The widget consists of two tabs: 1) Frequency Sweep – sta...
Definition simulationsetup.h:37
Smith chart visualization and interaction widget. Provides impedance/admittance Smith chart drawing,...
Definition smithchartwidget.h:32
Utility functions needed across the whole project.
Custom popup displaying S-parameters in matrix layout with other parameters below (definition)
Widget for editing netlists (definition)
Construct polar plot widget with default configuration (definition)
DisplayMode
Enumeration of available trace display modes.
Definition qucs-s-spar-viewer.h:81
@ Magnitude_dB
Display magnitude in dB.
@ VSWR
Display VSWR.
@ PortImpedance
Display port impedance.
@ Phase
Display phase.
@ Stability
Display stability metrics.
@ GroupDelay
Display group delay.
@ Polar
Display S data on polar plot.
@ Smith
Display S data on Smith chart.
Widget for displaying rectangular (Cartesian) plots with dual y-axes (definition)
UI component to set the simulation settings (definition)
Smith chart visualization and interaction widget (definition)
Structure to hold all widgets related to a limit line.
Definition qucs-s-spar-viewer.h:106
QPushButton * Couple_Value
Button to couple start/stop values.
Definition qucs-s-spar-viewer.h:117
QComboBox * Start_Freq_Scale
QComboBox for the scaling of the start frequency.
Definition qucs-s-spar-viewer.h:112
QFrame * Separator
Visual separator frame.
Definition qucs-s-spar-viewer.h:116
QLabel * LimitLabel
Label displaying the limit name.
Definition qucs-s-spar-viewer.h:107
QComboBox * axis
Combo box for the y-axis selection.
Definition qucs-s-spar-viewer.h:114
QComboBox * Stop_Freq_Scale
QComboBox for the scaling of the stop frequency.
Definition qucs-s-spar-viewer.h:113
QDoubleSpinBox * Start_Freq
Spin box for start frequency.
Definition qucs-s-spar-viewer.h:108
QDoubleSpinBox * Stop_Freq
Spin box for stop frequency.
Definition qucs-s-spar-viewer.h:109
QDoubleSpinBox * Start_Value
Spin box for start value of the limit line.
Definition qucs-s-spar-viewer.h:110
QToolButton * Button_Delete_Limit
Button to delete the limit line.
Definition qucs-s-spar-viewer.h:115
QDoubleSpinBox * Stop_Value
Spin box for stop value of the limit line.
Definition qucs-s-spar-viewer.h:111
Microstrip substrate parameters.
Definition structures.h:145
Structure to hold all widgets related to a marker.
Definition qucs-s-spar-viewer.h:72
QComboBox * scaleComboBox
Combo box for frequency scale selection.
Definition qucs-s-spar-viewer.h:75
QLabel * nameLabel
Label displaying the marker name.
Definition qucs-s-spar-viewer.h:73
QToolButton * deleteButton
Button to delete the marker.
Definition qucs-s-spar-viewer.h:76
QDoubleSpinBox * freqSpinBox
Spin box for frequency input.
Definition qucs-s-spar-viewer.h:74
Structure to hold trace identification and configuration information.
Definition qucs-s-spar-viewer.h:122
DisplayMode displayMode
Display mode for the trace.
Definition qucs-s-spar-viewer.h:125
QString uniqueId() const
Generate a unique identifier for the trace.
Definition qucs-s-spar-viewer.h:129
QString parameter
Parameter name (e.g., "S11", "S21")
Definition qucs-s-spar-viewer.h:124
QString displayName() const
Get a human-readable name for the trace.
Definition qucs-s-spar-viewer.h:142
QString dataset
Dataset name the trace belongs to.
Definition qucs-s-spar-viewer.h:123
Structure to hold all widgets related to a trace.
Definition qucs-s-spar-viewer.h:94
QString display_mode
Current display mode string.
Definition qucs-s-spar-viewer.h:100
QToolButton * deleteButton
Button to delete the trace.
Definition qucs-s-spar-viewer.h:99
QComboBox * LineStyleComboBox
Combo box for line style selection.
Definition qucs-s-spar-viewer.h:98
QSpinBox * width
Spin box for line width.
Definition qucs-s-spar-viewer.h:96
QPushButton * colorButton
Button for color selection.
Definition qucs-s-spar-viewer.h:97
QLabel * nameLabel
Label displaying the trace name.
Definition qucs-s-spar-viewer.h:95
Structure to hold Qucs application settings.
Definition qucs-s-spar-viewer.h:59
QString Language
Current language setting.
Definition qucs-s-spar-viewer.h:63
QString LangDir
Language directory path.
Definition qucs-s-spar-viewer.h:62
int y
Position of main window (x, y coordinates)
Definition qucs-s-spar-viewer.h:60
QFont font
Application font.
Definition qucs-s-spar-viewer.h:61
QString theme
Theme {'Light', 'Dark'}.
Definition qucs-s-spar-viewer.h:64