summaryrefslogtreecommitdiffstats
path: root/src/electronics/components/resistordip.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/electronics/components/resistordip.cpp')
-rw-r--r--src/electronics/components/resistordip.cpp132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/electronics/components/resistordip.cpp b/src/electronics/components/resistordip.cpp
new file mode 100644
index 0000000..d2c5bdb
--- /dev/null
+++ b/src/electronics/components/resistordip.cpp
@@ -0,0 +1,132 @@
+/***************************************************************************
+ * 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 "libraryitem.h"
+#include "node.h"
+#include "resistance.h"
+#include "resistordip.h"
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <qpainter.h>
+
+Item* ResistorDIP::construct( ItemDocument *itemDocument, bool newItem, const char *id )
+{
+ return new ResistorDIP( (ICNDocument*)itemDocument, newItem, id );
+}
+
+LibraryItem* ResistorDIP::libraryItem()
+{
+ return new LibraryItem(
+ "ec/resistordip",
+ i18n("Resistor DIP"),
+ i18n("Discrete"),
+ "resistordip.png",
+ LibraryItem::lit_component,
+ ResistorDIP::construct
+ );
+}
+
+ResistorDIP::ResistorDIP( ICNDocument *icnDocument, bool newItem, const char *id )
+ : Component( icnDocument, newItem, id ? id : "multiplexer" )
+{
+ m_name = i18n("Resistor DIP");
+ m_desc = i18n("Set of resistors with identical values in a Dual Inline Package.");
+
+ m_resistorCount = 0;
+ for ( int i=0; i<maxCount; ++i )
+ m_resistance[i] = 0l;
+
+ createProperty( "resistance", Variant::Type::Double );
+ property("resistance")->setCaption( i18n("Resistance") );
+ property("resistance")->setUnit( QChar(0x3a9) );
+ property("resistance")->setValue(1e4);
+ property("resistance")->setMinValue(1e-6);
+
+ createProperty( "count", Variant::Type::Int );
+ property("count")->setCaption( i18n("Count") );
+ property("count")->setMinValue(2);
+ property("count")->setMaxValue(maxCount);
+ property("count")->setValue(8);
+}
+
+ResistorDIP::~ResistorDIP()
+{
+}
+
+
+void ResistorDIP::dataChanged()
+{
+ initPins();
+ const double resistance = dataDouble("resistance");
+ for ( int i=0; i<m_resistorCount; ++i )
+ m_resistance[i]->setResistance(resistance);
+
+ const QString display = QString::number( resistance / getMultiplier(resistance), 'g', 3 ) + getNumberMag(resistance) + QChar(0x3a9);
+ addDisplayText( "res", QRect( offsetX(), offsetY()-16, 32, 12 ), display );
+}
+
+
+void ResistorDIP::initPins()
+{
+ const int count = dataInt("count");
+ const double resistance = dataDouble("resistance");
+
+ if ( count == m_resistorCount )
+ return;
+
+ if ( count < m_resistorCount )
+ {
+ for ( int i=count; i<m_resistorCount; ++i )
+ {
+ removeElement( m_resistance[i], false );
+ m_resistance[i] = 0l;
+ removeNode( "n"+QString::number(i) );
+ removeNode( "p"+QString::number(i) );
+ }
+ }
+ else
+ {
+ for ( int i=m_resistorCount; i<count; ++i )
+ {
+ const QString nid = "n"+QString::number(i);
+ const QString pid = "p"+QString::number(i);
+ m_resistance[i] = createResistance( createPin( -24, 0, 0, nid ), createPin( 24, 0, 180, pid ), resistance );
+ }
+ }
+ m_resistorCount = count;
+
+ setSize( -16, -count*8, 32, count*16, true );
+ updateDIPNodePositions();
+}
+
+
+void ResistorDIP::updateDIPNodePositions()
+{
+ for ( int i=0; i<m_resistorCount; ++i )
+ {
+ m_nodeMap["n"+QString::number(i)].y = offsetY() + 8 + 16*i;
+ m_nodeMap["p"+QString::number(i)].y = offsetY() + 8 + 16*i;
+ }
+ updateAttachedPositioning();
+}
+
+
+void ResistorDIP::drawShape( QPainter &p )
+{
+ int _x = int(x()+offsetX());
+ int _y = int(y()+offsetY());
+
+ initPainter(p);
+ for ( int i=0; i<m_resistorCount; ++i )
+ p.drawRect( _x, _y+16*i+2, 32, 12 );
+ deinitPainter(p);
+}
+