summaryrefslogtreecommitdiffstats
path: root/src/electronics/components/dependentsource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/electronics/components/dependentsource.cpp')
-rw-r--r--src/electronics/components/dependentsource.cpp314
1 files changed, 314 insertions, 0 deletions
diff --git a/src/electronics/components/dependentsource.cpp b/src/electronics/components/dependentsource.cpp
new file mode 100644
index 0000000..764cc53
--- /dev/null
+++ b/src/electronics/components/dependentsource.cpp
@@ -0,0 +1,314 @@
+/***************************************************************************
+ * Copyright (C) 2005 by David Saxton *
+ * david@bluehaze.org *
+ * *
+ * 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. *
+ ***************************************************************************/
+
+#include "dependentsource.h"
+#include "ecnode.h"
+#include "libraryitem.h"
+#include "pin.h"
+
+#include "cccs.h"
+#include "ccvs.h"
+#include "vccs.h"
+#include "vcvs.h"
+
+#include <klocale.h>
+#include <qpainter.h>
+
+//BEGIN class DependentSource
+DependentSource::DependentSource( ICNDocument *icnDocument, bool newItem, const char *id )
+ : Component( icnDocument, newItem, id )
+{
+ setSize( -16, -16, 32, 32 );
+
+ init2PinLeft();
+ init2PinRight();
+
+ createProperty( "gain", Variant::Type::Double );
+ property("gain")->setCaption( i18n("Gain") );
+ property("gain")->setValue(1.0);
+
+ addDisplayText( "gain", QRect( -16, -32, 32, 16 ), "" );
+}
+
+
+DependentSource::~DependentSource()
+{
+}
+
+
+void DependentSource::drawOutline( QPainter & p )
+{
+ const int _x = (int)x()-16;
+ const int _y = (int)y()-32;
+
+ // Top rectangle
+ p.drawRect( _x, _y+19, width(), 11 );
+
+ p.save();
+ bool canSetCol = (p.pen().color() != Qt::color0) && (p.pen().color() != Qt::color1);
+
+ // Bottom lines
+ if (canSetCol)
+ p.setPen( m_pNNode[1]->isSelected() ? m_selectedCol : Qt::black );
+ p.drawLine( _x, _y+40, _x+8, _y+40 ); // Left inny
+
+ if (canSetCol)
+ p.setPen( m_pPNode[1]->isSelected() ? m_selectedCol : Qt::black );
+ p.drawLine( _x+width(), _y+40, _x+24, _y+40 ); // Right inny
+
+ p.restore();
+
+ // Bottom diamond
+ QPointArray pa4(4);
+ pa4[0] = QPoint( _x+6, _y+40 );
+ pa4[1] = QPoint( _x+16, _y+32 );
+ pa4[2] = QPoint( _x+26, _y+40 );
+ pa4[3] = QPoint( _x+16, _y+48 );
+ p.drawPolygon(pa4);
+}
+
+
+void DependentSource::drawTopArrow( QPainter & p )
+{
+ const int _x = (int)x()-16;
+ const int _y = (int)y()-32;
+
+ if ( p.pen().color() == m_selectedCol )
+ p.setPen(Qt::black);
+
+ if ( p.brush().color() == m_brushCol )
+ p.setBrush(Qt::black);
+
+ p.drawLine( _x+8, _y+24, _x+24, _y+24 );
+
+ QPointArray pa3(3);
+ pa3[0] = QPoint( _x+24, _y+24 );
+ pa3[1] = QPoint( _x+19, _y+21 );
+ pa3[2] = QPoint( _x+19, _y+27 );
+ p.drawPolygon(pa3);
+}
+
+
+void DependentSource::drawBottomArrow( QPainter & p )
+{
+ const int _x = (int)x()-16;
+ const int _y = (int)y()-32;
+
+ if ( p.pen().color() == m_selectedCol )
+ p.setPen(Qt::black);
+
+ if ( p.brush().color() == m_brushCol )
+ p.setBrush(Qt::black);
+
+ p.drawLine( _x+11, _y+40, _x+21, _y+40 );
+
+ QPointArray pa3(3);
+ pa3[0] = QPoint( _x+21, _y+40 );
+ pa3[1] = QPoint( _x+16, _y+37 );
+ pa3[2] = QPoint( _x+16, _y+43 );
+ p.drawPolygon(pa3);
+}
+//END class DependentSource
+
+
+//BEGIN class ECCCCS
+Item* ECCCCS::construct( ItemDocument *itemDocument, bool newItem, const char *id )
+{
+ return new ECCCCS( (ICNDocument*)itemDocument, newItem, id );
+}
+
+LibraryItem* ECCCCS::libraryItem()
+{
+ return new LibraryItem(
+ QString("ec/cccs"),
+ i18n("CCCS"),
+ i18n("Sources"),
+ "cccs.png",
+ LibraryItem::lit_component,
+ ECCCCS::construct );
+}
+
+ECCCCS::ECCCCS( ICNDocument *icnDocument, bool newItem, const char *id )
+ : DependentSource( icnDocument, newItem, id ? id : "cccs" )
+{
+ m_name = i18n("Current Controlled Currrent Source");
+ m_cccs = createCCCS( m_pNNode[0], m_pPNode[0], m_pNNode[1], m_pPNode[1], 1. );
+ m_pNNode[1]->pin()->setGroundType( Pin::gt_medium );
+}
+
+ECCCCS::~ECCCCS()
+{
+}
+
+void ECCCCS::dataChanged()
+{
+ double gain = dataDouble("gain");
+
+ QString display = QString::number( gain / getMultiplier(gain), 'g', 3 ) + getNumberMag(gain) + QChar(' ');
+ setDisplayText( "gain", display );
+
+ m_cccs->setGain(gain);
+}
+
+void ECCCCS::drawShape( QPainter &p )
+{
+ initPainter(p);
+ drawOutline(p);
+ drawTopArrow(p);
+ drawBottomArrow(p);
+ deinitPainter(p);
+}
+//END class ECCCCS
+
+
+//BEGIN class ECCCVS
+Item* ECCCVS::construct( ItemDocument *itemDocument, bool newItem, const char *id )
+{
+ return new ECCCVS( (ICNDocument*)itemDocument, newItem, id );
+}
+
+LibraryItem* ECCCVS::libraryItem()
+{
+ return new LibraryItem(
+ QString("ec/ccvs"),
+ i18n("CCVS"),
+ i18n("Sources"),
+ "ccvs.png",
+ LibraryItem::lit_component,
+ ECCCVS::construct );
+}
+
+ECCCVS::ECCCVS( ICNDocument *icnDocument, bool newItem, const char *id )
+ : DependentSource( icnDocument, newItem, id ? id : "ccvs" )
+{
+ m_name = i18n("Current Controlled Voltage Source");
+ m_ccvs = createCCVS( m_pNNode[0], m_pPNode[0], m_pNNode[1], m_pPNode[1], 1. );
+ m_pNNode[1]->pin()->setGroundType( Pin::gt_medium );
+}
+
+ECCCVS::~ECCCVS()
+{
+}
+
+void ECCCVS::dataChanged()
+{
+ double gain = dataDouble("gain");
+
+ QString display = QString::number( gain / getMultiplier(gain), 'g', 3 ) + getNumberMag(gain) + QChar(' ');
+ setDisplayText( "gain", display );
+
+ m_ccvs->setGain(gain);
+}
+
+void ECCCVS::drawShape( QPainter &p )
+{
+ initPainter(p);
+ drawOutline(p);
+ drawTopArrow(p);
+ deinitPainter(p);
+}
+//END class ECCCVS
+
+
+//BEGIN class ECVCCS
+Item* ECVCCS::construct( ItemDocument *itemDocument, bool newItem, const char *id )
+{
+ return new ECVCCS( (ICNDocument*)itemDocument, newItem, id );
+}
+
+LibraryItem* ECVCCS::libraryItem()
+{
+ return new LibraryItem(
+ QString("ec/vccs"),
+ i18n("VCCS"),
+ i18n("Sources"),
+ "vccs.png",
+ LibraryItem::lit_component,
+ ECVCCS::construct );
+}
+
+ECVCCS::ECVCCS( ICNDocument *icnDocument, bool newItem, const char *id )
+ : DependentSource( icnDocument, newItem, id ? id : "vccs" )
+{
+ m_name = i18n("Voltage Controlled Current Source");
+ m_vccs = createVCCS( m_pNNode[0], m_pPNode[0], m_pNNode[1], m_pPNode[1], 1. );
+ m_pNNode[1]->pin()->setGroundType( Pin::gt_medium );
+}
+
+ECVCCS::~ECVCCS()
+{
+}
+
+void ECVCCS::dataChanged()
+{
+ double gain = dataDouble("gain");
+
+ QString display = QString::number( gain / getMultiplier(gain), 'g', 3 ) + getNumberMag(gain) + QChar(' ');
+ setDisplayText( "gain", display );
+
+ m_vccs->setGain(gain);
+}
+
+void ECVCCS::drawShape( QPainter &p )
+{
+ initPainter(p);
+ drawOutline(p);
+ drawBottomArrow(p);
+ deinitPainter(p);
+}
+//END class ECVCCS
+
+
+//BEGIN class ECVCVS
+Item* ECVCVS::construct( ItemDocument *itemDocument, bool newItem, const char *id )
+{
+ return new ECVCVS( (ICNDocument*)itemDocument, newItem, id );
+}
+
+LibraryItem* ECVCVS::libraryItem()
+{
+ return new LibraryItem(
+ QString("ec/vcvs"),
+ i18n("VCVS"),
+ i18n("Sources"),
+ "vcvs.png",
+ LibraryItem::lit_component,
+ ECVCVS::construct );
+}
+
+ECVCVS::ECVCVS( ICNDocument *icnDocument, bool newItem, const char *id )
+ : DependentSource( icnDocument, newItem, id ? id : "vcvs" )
+{
+ m_name = i18n("Voltage Controlled Voltage Source");
+ m_vcvs = createVCVS( m_pNNode[0], m_pPNode[0], m_pNNode[1], m_pPNode[1], 1. );
+ m_pNNode[1]->pin()->setGroundType( Pin::gt_medium );
+}
+
+ECVCVS::~ECVCVS()
+{
+}
+
+void ECVCVS::dataChanged()
+{
+ double gain = dataDouble("gain");
+
+ QString display = QString::number( gain / getMultiplier(gain), 'g', 3 ) + getNumberMag(gain) + QChar(' ');
+ setDisplayText( "gain", display );
+
+ m_vcvs->setGain(gain);
+}
+
+void ECVCVS::drawShape( QPainter &p )
+{
+ initPainter(p);
+ drawOutline(p);
+ deinitPainter(p);
+}
+//END class ECVCVS