You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ktechlab/src/electronics/components/dependentsource.cpp

315 lines
7.3 KiB

/***************************************************************************
* 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 <tdelocale.h>
#include <tqpainter.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", TQRect( -16, -32, 32, 16 ), "" );
}
DependentSource::~DependentSource()
{
}
void DependentSource::drawOutline( TQPainter & 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() != TQt::color0) && (p.pen().color() != TQt::color1);
// Bottom lines
if (canSetCol)
p.setPen( m_pNNode[1]->isSelected() ? m_selectedCol : TQt::black );
p.drawLine( _x, _y+40, _x+8, _y+40 ); // Left inny
if (canSetCol)
p.setPen( m_pPNode[1]->isSelected() ? m_selectedCol : TQt::black );
p.drawLine( _x+width(), _y+40, _x+24, _y+40 ); // Right inny
p.restore();
// Bottom diamond
TQPointArray pa4(4);
pa4[0] = TQPoint( _x+6, _y+40 );
pa4[1] = TQPoint( _x+16, _y+32 );
pa4[2] = TQPoint( _x+26, _y+40 );
pa4[3] = TQPoint( _x+16, _y+48 );
p.drawPolygon(pa4);
}
void DependentSource::drawTopArrow( TQPainter & p )
{
const int _x = (int)x()-16;
const int _y = (int)y()-32;
if ( p.pen().color() == m_selectedCol )
p.setPen(TQt::black);
if ( p.brush().color() == m_brushCol )
p.setBrush(TQt::black);
p.drawLine( _x+8, _y+24, _x+24, _y+24 );
TQPointArray pa3(3);
pa3[0] = TQPoint( _x+24, _y+24 );
pa3[1] = TQPoint( _x+19, _y+21 );
pa3[2] = TQPoint( _x+19, _y+27 );
p.drawPolygon(pa3);
}
void DependentSource::drawBottomArrow( TQPainter & p )
{
const int _x = (int)x()-16;
const int _y = (int)y()-32;
if ( p.pen().color() == m_selectedCol )
p.setPen(TQt::black);
if ( p.brush().color() == m_brushCol )
p.setBrush(TQt::black);
p.drawLine( _x+11, _y+40, _x+21, _y+40 );
TQPointArray pa3(3);
pa3[0] = TQPoint( _x+21, _y+40 );
pa3[1] = TQPoint( _x+16, _y+37 );
pa3[2] = TQPoint( _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(
TQString("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");
TQString display = TQString::number( gain / getMultiplier(gain), 'g', 3 ) + getNumberMag(gain) + TQChar(' ');
setDisplayText( "gain", display );
m_cccs->setGain(gain);
}
void ECCCCS::drawShape( TQPainter &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(
TQString("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");
TQString display = TQString::number( gain / getMultiplier(gain), 'g', 3 ) + getNumberMag(gain) + TQChar(' ');
setDisplayText( "gain", display );
m_ccvs->setGain(gain);
}
void ECCCVS::drawShape( TQPainter &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(
TQString("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");
TQString display = TQString::number( gain / getMultiplier(gain), 'g', 3 ) + getNumberMag(gain) + TQChar(' ');
setDisplayText( "gain", display );
m_vccs->setGain(gain);
}
void ECVCCS::drawShape( TQPainter &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(
TQString("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");
TQString display = TQString::number( gain / getMultiplier(gain), 'g', 3 ) + getNumberMag(gain) + TQChar(' ');
setDisplayText( "gain", display );
m_vcvs->setGain(gain);
}
void ECVCVS::drawShape( TQPainter &p )
{
initPainter(p);
drawOutline(p);
deinitPainter(p);
}
//END class ECVCVS