/* -*- 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 #include #include #include #include #include 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&, QRect& ); Component* findTextAt( const QPoint& point ); void addNode( CircuitNode* node ); void removeNode( CircuitNode* node ); CircuitNode* findNodeAt( const QPoint& point ); void findNodesInsideRect( QList&, QRect& ); void addLine( CircuitLine* line ); void removeLine( CircuitLine* line ); CircuitLine* findLineAt( const QPoint& point, bool orthoganalOnly); void findLinesInsideRect( QList&, 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& getSData(); QList& getYData(); QList& getZData(); TComplex getPortImpedance( uint port ); Schematic( const Schematic& ); private: int distanceFromLine( const QPoint& point, const CircuitLine& line, bool orthoganalOnly ); void findAllConnectedNodes(CircuitNode* node, QList& nodeList); private: QString name_; SchematicSize size_; uint width_; uint height_; QList componentList_; QList nodeList_; QList 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 zdata_; //Data after solve QList ydata_; QList sdata_; }; #endif