diff options
Diffstat (limited to 'src/circuitdocument.h')
-rw-r--r-- | src/circuitdocument.h | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/circuitdocument.h b/src/circuitdocument.h new file mode 100644 index 0000000..581438b --- /dev/null +++ b/src/circuitdocument.h @@ -0,0 +1,157 @@ +/*************************************************************************** + * Copyright (C) 2003-2005 by David Saxton * + * [email protected] * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + ***************************************************************************/ + +#ifndef CIRCUITDOCUMENT_H +#define CIRCUITDOCUMENT_H + +#include "icndocument.h" + +class Circuit; +class Component; +class Connector; +class ECNode; +class Element; +class ICNDocument; +class KTechlab; +class Pin; +class QTimer; +class Switch; +class Wire; + +class KActionMenu; + +typedef QValueList<Circuit*> CircuitList; +typedef QValueList<Component*> ComponentList; +typedef QValueList<QGuardedPtr<Connector> > ConnectorList; +typedef QValueList<ECNode*> ECNodeList; +typedef QValueList<Element*> ElementList; +typedef QValueList<QGuardedPtr<Pin> > PinList; +typedef QValueList<Switch*> SwitchList; +typedef QValueList<QGuardedPtr<Wire> > WireList; + +class Circuitoid +{ +public: + bool contains( Pin *node ) { return pinList.contains(node); } + bool contains( Wire *con ) { return wireList.contains(con); } + bool contains( Element *ele ) { return elementList.contains(ele); } + + void addPin( Pin *node ) { if (node && !contains(node)) pinList += node; } + void addWire( Wire *con ) { if (con && !contains(con)) wireList += con; } + void addElement( Element *ele ) { if (ele && !contains(ele)) elementList += ele; } + + WireList wireList; + PinList pinList; + ElementList elementList; +}; + +/** +CircuitDocument handles allocation of the components displayed in the ICNDocument +to various Circuits, where the simulation can be performed, and displays the +information from those simulations back on the ICNDocument +@short Circuit view +@author David Saxton +*/ +class CircuitDocument : public ICNDocument +{ + Q_OBJECT + public: + CircuitDocument( const QString &caption, KTechlab *ktechlab, const char *name = 0L ); + ~CircuitDocument(); + + virtual View *createView( ViewContainer *viewContainer, uint viewAreaId, const char *name = 0l ); + + void calculateConnectorCurrents(); + /** + * Count the number of ExternalConnection components in the CNItemList + */ + int countExtCon( const ItemList &cnItemList ) const; + + virtual void update(); + + public slots: + /** + * Creates a subcircuit from the currently selected components + */ + void createSubcircuit(); + void displayEquations(); + void setOrientation0(); + void setOrientation90(); + void setOrientation180(); + void setOrientation270(); + void rotateCounterClockwise(); + void rotateClockwise(); + void itemFlip(); + /** + * Enables / disables / selects various actions depending on what is + * selected or not. + * @param plugContextMenu If true, then will insert actions into contextmenu + */ + virtual void slotInitItemActions( Item *item = 0L ); + void requestAssignCircuits(); + void componentAdded( Item * item ); + void componentRemoved( Item * item ); + void connectorAdded( Connector * connector ); + virtual void slotUpdateConfiguration(); + + protected: + virtual void itemAdded( Item * item ); + virtual void fillContextMenu( const QPoint &pos ); + virtual bool isValidItem( Item *item ); + virtual bool isValidItem( const QString &itemId ); + + KActionMenu * m_pOrientationAction; + + private slots: + void assignCircuits(); + + private: + /** + * If the given circuitoid can be a LogicCircuit, then it will be added to + * m_logicCircuits, and return true. Else returns false. + */ + bool tryAsLogicCircuit( Circuitoid *circuitoid ); + /** + * Creates a circuit from the circuitoid + */ + Circuit *createCircuit( Circuitoid *circuitoid ); + /** + * @param node Current node (will be added, then tested for further + * connections). + * @param nodeList List of nodes in current partition. + * @param unassignedNodes The pool of all nodes in the CircuitDocument + * waiting for assignment. + * @param onlyGroundDependent if true, then the partition will not use + * circuit-dependent pins to include new pins while growing the + * partition. + */ + void getPartition( Pin * pin, PinList * pinList, PinList * unassignedPins, bool onlyGroundDependent = false ); + /** + * Takes the nodeList (generated by getPartition), splits it at ground nodes, + * and creates circuits from each split. + */ + void splitIntoCircuits( PinList * pinList ); + /** + * Construct a circuit from the given node, stopping at the groundnodes + */ + void recursivePinAdd( Pin * pin, Circuitoid *circuitoid, PinList * unassignedPins ); + void deleteCircuits(); + + QTimer *m_updateCircuitsTmr; + CircuitList m_circuitList; + ComponentList m_toSimulateList; + ComponentList m_componentList; // List is built up during call to assignCircuits + PinList m_pinList; + WireList m_wireList; + SwitchList m_switchList; +}; + +#endif + |