File indexing completed on 2024-12-01 11:20:27
0001 /*************************************************************************** 0002 * Copyright (C) 2003-2005 by David Saxton * 0003 * david@bluehaze.org * 0004 * * 0005 * This program is free software; you can redistribute it and/or modify * 0006 * it under the terms of the GNU General Public License as published by * 0007 * the Free Software Foundation; either version 2 of the License, or * 0008 * (at your option) any later version. * 0009 ***************************************************************************/ 0010 0011 #ifndef CIRCUITDOCUMENT_H 0012 #define CIRCUITDOCUMENT_H 0013 0014 #include "circuiticndocument.h" 0015 #include "pin.h" 0016 0017 class Circuit; 0018 class Component; 0019 class Connector; 0020 class ECNode; 0021 class Element; 0022 class CircuitICNDocument; 0023 class KTechlab; 0024 class Pin; 0025 class QTimer; 0026 class Switch; 0027 class Wire; 0028 0029 class KActionMenu; 0030 0031 typedef QList<Circuit *> CircuitList; 0032 typedef QList<Component *> ComponentList; 0033 typedef QList<QPointer<Connector>> ConnectorList; 0034 typedef QList<ECNode *> ECNodeList; 0035 typedef QList<Element *> ElementList; 0036 typedef QList<QPointer<Pin>> PinList; 0037 typedef QList<Switch *> SwitchList; 0038 typedef QList<QPointer<Wire>> WireList; 0039 0040 class Circuitoid 0041 { 0042 public: 0043 bool contains(Pin *node) 0044 { 0045 return pinList.contains(node); 0046 } 0047 bool contains(Element *ele) 0048 { 0049 return elementList.contains(ele); 0050 } 0051 0052 void addPin(Pin *node) 0053 { 0054 if (node && !contains(node)) 0055 pinList += node; 0056 } 0057 void addElement(Element *ele) 0058 { 0059 if (ele && !contains(ele)) 0060 elementList += ele; 0061 } 0062 0063 PinList pinList; 0064 ElementList elementList; 0065 }; 0066 0067 /** 0068 CircuitDocument handles allocation of the components displayed in the ICNDocument 0069 to various Circuits, where the simulation can be performed, and displays the 0070 information from those simulations back on the ICNDocument 0071 @short Circuit view 0072 @author David Saxton 0073 */ 0074 class CircuitDocument : public CircuitICNDocument 0075 { 0076 Q_OBJECT 0077 public: 0078 CircuitDocument(const QString &caption); 0079 ~CircuitDocument() override; 0080 0081 View *createView(ViewContainer *viewContainer, uint viewAreaId) override; 0082 0083 void calculateConnectorCurrents(); 0084 /** 0085 * Count the number of ExternalConnection components in the CNItemList 0086 */ 0087 int countExtCon(const ItemList &cnItemList) const; 0088 0089 void update() override; 0090 0091 public slots: 0092 /** 0093 * Creates a subcircuit from the currently selected components 0094 */ 0095 void createSubcircuit(); 0096 void displayEquations(); 0097 void setOrientation0(); 0098 void setOrientation90(); 0099 void setOrientation180(); 0100 void setOrientation270(); 0101 void rotateCounterClockwise(); 0102 void rotateClockwise(); 0103 void flipHorizontally(); 0104 void flipVertically(); 0105 /** 0106 * Enables / disables / selects various actions depending on what is 0107 * selected or not. 0108 */ 0109 void slotInitItemActions() override; 0110 void requestAssignCircuits(); 0111 void componentAdded(Item *item); 0112 void componentRemoved(Item *item); 0113 void connectorAddedSlot(Connector *connector); 0114 void slotUpdateConfiguration() override; 0115 0116 protected: 0117 void itemAdded(Item *item) override; 0118 void fillContextMenu(const QPoint &pos) override; 0119 bool isValidItem(Item *item) override; 0120 bool isValidItem(const QString &itemId) override; 0121 0122 KActionMenu *m_pOrientationAction; 0123 0124 private slots: 0125 void assignCircuits(); 0126 0127 private: 0128 /** 0129 * If the given circuitoid can be a LogicCircuit, then it will be added to 0130 * m_logicCircuits, and return true. Else returns false. 0131 */ 0132 bool tryAsLogicCircuit(Circuitoid *circuitoid); 0133 /** 0134 * Creates a circuit from the circuitoid 0135 */ 0136 Circuit *createCircuit(Circuitoid *circuitoid); 0137 0138 /** 0139 * @param pin Current node (will be added, then tested for further 0140 * connections). 0141 * @param pinList List of nodes in current partition. 0142 * @param unassignedPins The pool of all nodes in the CircuitDocument 0143 * waiting for assignment. 0144 * @param onlyGroundDependent if true, then the partition will not use 0145 * circuit-dependent pins to include new pins while growing the 0146 * partition. 0147 */ 0148 void getPartition(Pin *pin, PinList *pinList, PinList *unassignedPins, bool onlyGroundDependent = false); 0149 /** 0150 * Takes the nodeList (generated by getPartition), splits it at ground nodes, 0151 * and creates circuits from each split. 0152 */ 0153 void splitIntoCircuits(PinList *pinList); 0154 /** 0155 * Construct a circuit from the given node, stopping at the groundnodes 0156 */ 0157 void recursivePinAdd(Pin *pin, Circuitoid *circuitoid, PinList *unassignedPins); 0158 0159 void deleteCircuits(); 0160 0161 QTimer *m_updateCircuitsTmr; 0162 CircuitList m_circuitList; 0163 ComponentList m_toSimulateList; 0164 ComponentList m_componentList; // List is built up during call to assignCircuits 0165 0166 // hmm, we have one of these in circuit too.... 0167 PinList m_pinList; 0168 WireList m_wireList; 0169 SwitchList m_switchList; 0170 }; 0171 0172 #endif