File: Schematic.h

package info (click to toggle)
vipec 3.0.3-2
  • links: PTS
  • area: main
  • in suites: woody
  • size: 1,648 kB
  • ctags: 1,899
  • sloc: cpp: 13,609; makefile: 93; perl: 36; ansic: 20; sh: 6
file content (122 lines) | stat: -rw-r--r-- 3,391 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/* -*- C++ -*-

  This file is part of ViPEC
  Copyright (C) 1991-2001 Johan Rossouw (jrossouw@alcatel.altech.co.za)

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU Library General Public License as
  published by
  the Free Software Foundation; either version 2 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 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., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

#ifndef SUBCIRCUIT_H
#define SUBCIRCUIT_H

#include <Types.h>
#include <Matrix.h>
#include <DataPoint.h>
#include <Component.h>
#include <CircuitNode.h>

#include <qlist.h>

class QDomElement;
class QTextStream;
class QPainter;

class Schematic
{
public:
  Schematic();
  virtual ~Schematic();
  Schematic& operator=( const Schematic& );

  void setName(const QString& name);
  const QString& getName() const;

  enum SchematicSize { smallSize, mediumSize, largeSize };
  void setSize( SchematicSize size );
  SchematicSize getSize() const;
  uint width() const;
  uint height() const;
  
  void addComponent( Component* component );
  void removeComponent( Component* component );
  Component* findComponentAt( const QPoint& point );
  void findComponentsInsideRect( QList<Component>&, QRect& );

  void addNode( CircuitNode* node );
  void removeNode( CircuitNode* node );
  CircuitNode* findNodeAt( const QPoint& point );
  void findNodesInsideRect( QList<CircuitNode>&, QRect& );

  void addLine( CircuitLine* line );
  void removeLine( CircuitLine* line );
  CircuitLine* findLineAt( const QPoint& point,
			   bool orthoganalOnly);
  void findLinesInsideRect( QList<CircuitLine>&, QRect& );

  void draw( QPainter* );
  
  //Streaming
  void writeToStream( QTextStream& );
  bool readFromDOM( QDomElement& element );
  bool readLineFromDOM( QDomElement& element );
  
  void removeEmptyNodes();
  void renumberPortNodes();
  void numberAllNodes();
  uint getNumberOfNodes() const;
  uint getNumberOfPorts() const;

  void reset();
  bool isSolved() const;
  void initSweep();
  void sweep(Vector&);

  QList<DataPoint>& getSData();
  QList<DataPoint>& getYData();
  QList<DataPoint>& getZData();
  TComplex getPortImpedance( uint port );
  
private:
  Schematic( const Schematic& );

  int distanceFromLine( const QPoint& point,
			const CircuitLine& line,
			bool orthoganalOnly );

  void findAllConnectedNodes(CircuitNode* node, QList<CircuitNode>& nodeList);

private:
  QString name_;
  SchematicSize size_;
  uint width_;
  uint height_;
  QList<Component> componentList_;
  QList<CircuitNode> nodeList_;
  QList<CircuitLine> lineList_;
  uint portCount_;
  uint maxNodeNr_;

  bool hasChanged_;          //Circuit has changed from last sweep
  bool isSolved_;            //Circuit has valid solved response
  Matrix* yn_;               //Nodal admittance matrix used for solve
  Matrix  zo_;               //Port termination impedance matrix
  QList<DataPoint> zdata_;   //Data after solve
  QList<DataPoint> ydata_;
  QList<DataPoint> sdata_;
};

#endif