File indexing completed on 2024-05-05 05:46:04

0001 /***************************************************************************
0002  *   Copyright (C) 2003-2004 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 #include "eccurrentsignal.h"
0012 #include "currentsignal.h"
0013 #include "ecnode.h"
0014 #include "libraryitem.h"
0015 #include "pin.h"
0016 #include "simulator.h"
0017 
0018 #include <KLocalizedString>
0019 #include <QPainter>
0020 
0021 Item *ECCurrentSignal::construct(ItemDocument *itemDocument, bool newItem, const char *id)
0022 {
0023     return new ECCurrentSignal(static_cast<ICNDocument *>(itemDocument), newItem, id);
0024 }
0025 
0026 LibraryItem *ECCurrentSignal::libraryItem()
0027 {
0028     return new LibraryItem(QStringList(QString("ec/ac_current")), i18n("Current Signal"), i18n("Sources"), "currentsignal.png", LibraryItem::lit_component, ECCurrentSignal::construct);
0029 }
0030 
0031 ECCurrentSignal::ECCurrentSignal(ICNDocument *icnDocument, bool newItem, const char *id)
0032     : Component(icnDocument, newItem, id ? id : "current_signal")
0033 {
0034     m_name = i18n("Current Signal");
0035     setSize(-8, -8, 16, 16);
0036 
0037     init1PinLeft();
0038     init1PinRight();
0039 
0040     m_pNNode[0]->pin()->setGroundType(Pin::gt_low);
0041     m_currentSignal = createCurrentSignal(m_pNNode[0], m_pPNode[0], 0.);
0042     m_currentSignal->setStep(ElementSignal::st_sinusoidal, 50.);
0043 
0044     createProperty("1-frequency", Variant::Type::Double);
0045     property("1-frequency")->setCaption(i18n("Frequency"));
0046     property("1-frequency")->setUnit("Hz");
0047     property("1-frequency")->setMinValue(1e-9);
0048     property("1-frequency")->setMaxValue(1e3);
0049     property("1-frequency")->setValue(50.0);
0050 
0051     createProperty("1-current", Variant::Type::Double);
0052     property("1-current")->setCaption(i18n("Current Range"));
0053     property("1-current")->setUnit("A");
0054     property("1-current")->setMinValue(-1e12);
0055     property("1-current")->setMaxValue(1e12);
0056     property("1-current")->setValue(0.02);
0057 
0058     addDisplayText("~", QRect(-8, -8, 16, 16), "~");
0059     addDisplayText("current", QRect(-16, -24, 32, 16), "");
0060 }
0061 
0062 ECCurrentSignal::~ECCurrentSignal()
0063 {
0064 }
0065 
0066 void ECCurrentSignal::dataChanged()
0067 {
0068     const double current = dataDouble("1-current");
0069     const double frequency = dataDouble("1-frequency");
0070 
0071     QString display = QString::number(current / getMultiplier(current), 'g', 3) + getNumberMag(current) + "A";
0072     setDisplayText("current", display);
0073 
0074     m_currentSignal->setStep(ElementSignal::st_sinusoidal, frequency);
0075     m_currentSignal->setCurrent(current);
0076 }
0077 
0078 void ECCurrentSignal::drawShape(QPainter &p)
0079 {
0080     initPainter(p);
0081     p.drawEllipse(int(x()) - 8, int(y()) - 8, width(), height());
0082     deinitPainter(p);
0083 }