void ECLogicOutput::drawShape( QPainter &p ) { unsigned long long newTime = m_pSimulator->time(); unsigned long long runTime = newTime - m_lastDrawTime; m_lastDrawTime = newTime; if (m_bLastState) { // Logic in is currently high m_highTime += newTime - m_lastSwitchTime; } double state; if ( runTime == 0 ) state = m_lastDrawState; else state = m_lastDrawState = double(m_highTime)/double(runTime); initPainter(p); p.setBrush( QColor( 255, uint(255-state*(255-166)), uint((1-state)*255) ) ); p.drawEllipse( int(x()-8), int(y()-8), width(), height() ); deinitPainter(p); m_lastSwitchTime = newTime; m_highTime = 0; }
void ECBJT::drawShape( QPainter &p ) { const int _x = int(x()); const int _y = int(y()); initPainter(p); p.drawLine( _x-8, _y-8, _x-8, _y+8 ); p.drawLine( _x+8, _y-8, _x-8, _y ); p.drawLine( _x+8, _y+8, _x-8, _y ); QPolygon pa(3); if ( m_bIsNPN ) { pa[0] = QPoint( _x+6, _y+7 ); pa[1] = QPoint( _x+2, _y+8 ); pa[2] = QPoint( _x+5, _y+3 ); } else { pa[0] = QPoint( _x-7, _y+1 ); pa[1] = QPoint( _x-4, _y+5 ); pa[2] = QPoint( _x-2, _y ); } p.setBrush( p.pen().color() ); p.drawPolygon(pa); deinitPainter(p); }
void VariableCapacitor::drawShape(QPainter &p) { initPainter(p); // Get centre point of component. int _y = (int)y(); int _x = (int)x(); p.drawRect(_x - 8, _y - 8, 5, 16); p.drawRect(_x + 3, _y - 8, 5, 16); // p.drawLine( _x-8, _y, _x-16, _y ); // p.drawLine( _x+8, _y, _x+16, _y ); // Diagonally pointing arrow QPointArray pa(3); pa[0] = QPoint(-4, 0); pa[1] = QPoint(-2, 4); pa[2] = QPoint(0, 0); pa.translate(_x + 16, _y - 8); p.setBrush(p.pen().color()); p.drawPolygon(pa); p.drawLine(_x - 16, _y + 8, _x + 16, _y - 8); deinitPainter(p); }
void ECCCCS::drawShape(QPainter &p) { initPainter(p); drawOutline(p); drawTopArrow(p); drawBottomArrow(p); deinitPainter(p); }
void ECPotentiometer::drawShape( QPainter &p ) { initPainter(p); int _x = int(x()); int _y = int(y()); p.drawRect( _x-14, _y-16, 12, 32 ); Q3PointArray pa(3); pa[0] = QPoint( 0, 0 ); pa[1] = QPoint( 4, -3 ); pa[2] = QPoint( 4, 3 ); int space = m_pSlider->style().pixelMetric( QStyle::PM_SliderSpaceAvailable, m_pSlider ); int base_y = _y + int( space * m_sliderProp ); pa.translate( _x + 16, base_y ); // QColor c = m_p1->isSelected() ? m_selectedCol : black; // FIXME ^ > // p.setPen(c); // p.setBrush(c); p.drawPolygon(pa); p.drawLine( _x + 20, base_y, _x + 24, base_y ); p.drawLine( _x + 24, base_y, _x + 24, _y ); deinitPainter(p); }
void Text::drawShape( QPainter & p ) { initPainter(p); p.setFont( p_parent->font() ); p.drawText( drawRect(), m_flags, m_text ); deinitPainter(p); }
void BiDirLED::drawShape(QPainter &p) { initPainter(p); for (unsigned i = 0; i < 2; i++) { uint _b; if (lastUpdatePeriod == 0.) _b = last_brightness[i]; else { _b = uint(avg_brightness[i] / lastUpdatePeriod); last_brightness[i] = _b; } avg_brightness[i] = 0.; p.setBrush(QColor(uint(255 - (255 - _b)*(1 - r[i])), uint(255 - (255 - _b)*(1 - g[i])), uint(255 - (255 - _b)*(1 - b[i])))); QPointArray pa(3); if (i == 0) { pa[0] = QPoint(8, -8); pa[1] = QPoint(-8, -16); pa[2] = QPoint(-8, 0); } else { pa[0] = QPoint(-8, 8); pa[1] = QPoint(8, 0); pa[2] = QPoint(8, 16); } pa.translate(int(x()), int(y())); p.drawPolygon(pa); p.drawPolyline(pa); } lastUpdatePeriod = 0.; // Draw the arrows indicating it's a LED int _x = (int)x() - 2; int _y = (int)y() - 21; p.drawLine(_x + 9, _y + 3, _x + 12, _y); // Tail of left arrow p.drawLine(_x + 12, _y, _x + 10, _y); // Left edge of left arrow tip p.drawLine(_x + 12, _y, _x + 12, _y + 2); // Right edge of left arrow tip p.drawLine(_x + 12, _y + 6, _x + 15, _y + 3); // Tail of right arrow p.drawLine(_x + 15, _y + 3, _x + 13, _y + 3); // Left edge of right arrow tip p.drawLine(_x + 15, _y + 3, _x + 15, _y + 5); // Right edge of right arrow tip p.drawLine(_x + 10, _y, _x + 15, _y + 5); // Diagonal line that forms base of both arrow tips _x = int(x()); _y = int(y()); p.drawLine(_x + 8, _y - 16, _x + 8, _y); p.drawLine(_x - 8, _y, _x - 8, _y + 16); deinitPainter(p); }
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); }
void VoltageRegulator::drawShape( QPainter &p ) { initPainter(p); // Get centre point of component. //int _y = (int)y(); //int _x = (int)x(); deinitPainter(p); }
void ECLogicInput::drawShape( QPainter &p ) { initPainter(p); if (b_state) p.setBrush( QColor( 255, 166, 0 ) ); else p.setBrush( Qt::white ); p.drawEllipse( (int)x()-4, (int)y()-6, 12, 12 ); deinitPainter(p); }
void PinNode::drawShape( QPainter & p ) { initPainter( p ); double v = pin() ? pin()->voltage() : 0.0; QColor voltageColor = Component::voltageColor( v ); QPen pen = p.pen(); if ( isSelected() ) pen = m_selectedColor; else if ( m_bShowVoltageColor ) pen = voltageColor; if (m_pinPoint) { bool drawDivPoint; QPoint divPoint = findConnectorDivergePoint(&drawDivPoint); m_pinPoint->setVisible(drawDivPoint); m_pinPoint->move( divPoint.x()-1, divPoint.y()-1 ); m_pinPoint->setBrush( pen.color() ); m_pinPoint->setPen( pen.color() ); } // Now to draw on our current/voltage bar indicators int length = calcLength( v ); if ( (numPins() == 1) && m_bShowVoltageBars && length != 0 ) { // we can assume that v != 0 as length != 0 double i = pin()->current(); double iProp = calcIProp(i); int thickness = calcThickness(iProp); p.setPen( QPen( voltageColor, thickness ) ); // The node line (drawn at the end of this function) will overdraw // some of the voltage bar, so we need to adapt the length if ( (v > 0) && (((225 < m_dir) && (m_dir < 315)) || ((45 < m_dir) && (m_dir < 135))) ) length--; else if ( (v < 0) && (((135 < m_dir) && (m_dir < 225)) || ((315 < m_dir) || (m_dir < 45))) ) length++; if ( (m_dir > 270) || (m_dir <= 90) ) p.drawLine( 3, 0, 3, length ); else p.drawLine( 3, 0, 3, -length ); } pen.setWidth( (numPins() > 1) ? 2 : 1 ); p.setPen( pen ); p.drawLine( 0, 0, m_length, 0 ); deinitPainter( p ); }
void ECJKFlipFlop::drawShape( QPainter & p ) { Component::drawShape( p ); if ( m_edgeTrigger == Falling ) { initPainter( p ); p.drawEllipse( int(x()-32), int(y()-3), 6, 6 ); deinitPainter( p ); } }
void Buffer::drawShape( QPainter &p ) { initPainter(p); int _x = (int)x()-8; int _y = (int)y()-8; Q3PointArray pa(3); pa[0] = QPoint( _x, _y ); pa[1] = QPoint( _x+width(), _y+(height()/2) ); pa[2] = QPoint( _x, _y+height() ); p.drawPolygon(pa); p.drawPolyline(pa); deinitPainter(p); }
void ECNand::drawShape(QPainter &p) { if (m_logicSymbolShape == Rectangular) { MultiInputGate::drawShape(p); return; } initPainter(p); int _x = (int)x() + offsetX(); int _y = (int)y() + offsetY(); p.drawChord(_x - width() + 6, _y, 2 * width() - 12, height(), -16 * 90, 16 * 180); p.drawEllipse(_x + width() - 6, _y + (height() / 2) - 3, 6, 6); deinitPainter(p); }
void ECGround::drawShape( QPainter &p ) { initPainter(p); int _x = (int)x()-8; int _y = (int)y()-8; QPen pen; pen.setWidth(2); pen.setColor( p.pen().color() ); p.setPen(pen); p.drawLine( _x+15, _y, _x+15, _y+16 ); p.drawLine( _x+10, _y+3, _x+10, _y+13 ); p.drawLine( _x+5, _y+6, _x+5, _y+10 ); deinitPainter(p); }
void ECCell::drawShape(QPainter &p) { initPainter(p); int _x = (int)x() - 8; int _y = (int)y() - 24; p.drawLine(_x, _y + 20, _x, _y + 28); p.drawLine(_x + 5, _y + 16, _x + 5, _y + 32); p.drawLine(_x + 10, _y + 20, _x + 10, _y + 28); p.drawLine(_x + 15, _y + 16, _x + 15, _y + 32); deinitPainter(p); // p.drawPolyline( areaPoints() ); }
void LEDBarGraphDisplay::drawShape(QPainter &p) { Component::drawShape(p); initPainter(p); // Init _x and _y to top left hand corner of component. int _x = (int)(x() + offsetX()); int _y = (int)(y() + offsetY()); // Draw LED elements, passing in a position for each. for (unsigned i = 0; i < m_numRows; i++) m_LEDParts[i]->draw(p, _x + 4, _y + (i*16) + 10, 24, 12); deinitPainter(p); }
void Capacitor::drawShape(QPainter &p) { initPainter(p); int _y = (int)y() - 8; int _x = (int)x() - 8; QPen pen; pen.setWidth(1); pen.setColor(p.pen().color()); p.setPen(pen); p.drawRect(_x, _y, 5, 16); p.drawRect(_x + 11, _y, 5, 16); deinitPainter(p); }
void ECAnd::drawShape(QPainter &p) { if (m_logicSymbolShape == Rectangular) { MultiInputGate::drawShape(p); return; } initPainter(p); int _x = (int)x() + offsetX(); int _y = (int)y() + offsetY(); p.drawChord(_x - width(), _y, 2 * width(), height(), -16 * 90, 16 * 180); deinitPainter(p); }
void MultiInputGate::drawShape(QPainter & p) { initPainter(p); int _x = int(x() + offsetX()); int _y = int(y() + offsetY()); if (m_bInvertedOutput) { p.drawRect(_x, _y, 32 - 6, height()); p.drawEllipse(_x + 32 - 6, int(y()) - 3, 6, 6); } else { p.drawRect(_x, _y, 32, height()); } deinitPainter(p); }
void BusSplitter::drawShape( QPainter &p ) { initPainter(p); // QPen pen(p.pen()); // pen.setWidth(); // p.setPen(pen); int _x = int(x()); int _y = int(y()); QRect r = m_sizeRect; r.translate( _x, _y ); p.drawRect(r); deinitPainter(p); }
void LED::drawShape( QPainter &p ) { int _x = int(x()); int _y = int(y()); initPainter(p); //BEGIN draw "Diode" part uint _b; if(lastUpdatePeriod != 0.) { last_brightness = (uint)(avg_brightness/lastUpdatePeriod); } _b = last_brightness; avg_brightness = 0.; lastUpdatePeriod = 0.; p.setBrush(QColor(uint(255 - (255 - _b) * (1 - r)), uint(255 - (255 - _b) * (1 - g)), uint(255 - (255 - _b) * (1 - b)))); Q3PointArray pa(3); pa[0] = QPoint( 8, 0 ); pa[1] = QPoint( -8, -8 ); pa[2] = QPoint( -8, 8 ); pa.translate( _x, _y ); p.drawPolygon(pa); p.drawPolyline(pa); p.drawLine( _x+8, _y-8, _x+8, _y+8 ); //END draw "Diode" part //BEGIN draw "Arrows" part p.drawLine( _x+7, _y-10, _x+10, _y-13 ); // Tail of left arrow p.drawLine( _x+10, _y-13, _x+8, _y-13 ); // Left edge of left arrow tip p.drawLine( _x+10, _y-13, _x+10, _y-11 ); // Right edge of left arrow tip p.drawLine( _x+10, _y-7, _x+13, _y-10 ); // Tail of right arrow p.drawLine( _x+13, _y-10, _x+11, _y-10 ); // Left edge of right arrow tip p.drawLine( _x+13, _y-10, _x+13, _y-8 ); // Right edge of right arrow tip p.drawLine( _x+8, _y-13, _x+13, _y-8 ); // Diagonal line that forms base of both arrow tips //END draw "Arrows" part1 deinitPainter(p); }
void MatrixDisplay::drawShape(QPainter &p) { if (isSelected()) p.setPen(m_selectedCol); p.drawRect(boundingRect()); initPainter(p); const int _x = int(x() + offsetX()); const int _y = int(y() + offsetY()); // To avoid flicker, require at least a 10 ms sample before changing // the brightness double minUpdatePeriod = 0.0099; for (int i = 0; i < int(m_numCols); i++) { for (int j = 0; j < int(m_numRows); j++) { if (m_lastUpdatePeriod > minUpdatePeriod) m_LEDs[i][j].m_lastBrightness = unsigned(m_LEDs[i][j].m_avgBrightness / m_lastUpdatePeriod); double _b = m_LEDs[i][j].m_lastBrightness; // FIXME: we find ourselves with RGB out of range errors after resizing. QColor brush = QColor(uint(255 - (255 - _b) * (1 - m_r)), uint(255 - (255 - _b) * (1 - m_g)), uint(255 - (255 - _b) * (1 - m_b))); p.setBrush(brush); p.setPen(Qt::NoPen); p.drawEllipse(_x + 10 + i * 16, _y + 10 + j * 16, 12, 12); } } if (m_lastUpdatePeriod > minUpdatePeriod) { m_lastUpdatePeriod = 0.0; for (unsigned i = 0; i < m_numCols; i++) { for (unsigned j = 0; j < m_numRows; j++) m_LEDs[i][j].m_avgBrightness = 0.0; } } deinitPainter(p); }
void FloatingProbe::drawShape(QPainter &p) { initPainter(p); int _x = int(x()) - 16; int _y = int(y()) - 8; p.drawRect(_x, _y, 32, 16); QPointArray bezier(4); bezier[0] = QPoint(_x + 4, _y + 10); bezier[1] = QPoint(_x + 12, _y - 6); bezier[2] = QPoint(_x + 20, _y + 24); bezier[3] = QPoint(_x + 28, _y + 4); p.setPen(QPen(m_color, 2)); p.drawCubicBezier(bezier); deinitPainter(p); }
void ECJFET::drawShape( QPainter &p ) { const int _x = int(x()); const int _y = int(y()); initPainter( p ); // back lines p.drawLine( _x-8, _y, _x+2, _y ); p.drawLine( _x+2, _y-8, _x+2, _y+8 ); // top corner p.drawLine( _x+2, _y-5, _x+8, _y-5 ); p.drawLine( _x+8, _y-5, _x+8, _y-8 ); // bottom corner p.drawLine( _x+2, _y+5, _x+8, _y+5 ); p.drawLine( _x+8, _y+5, _x+8, _y+8 ); Q3PointArray pa(3); if ( m_JFET_type == JFET::nJFET ) { // right pointing arrow pa[0] = QPoint( 1, 0 ); pa[1] = QPoint( -4, -3 ); pa[2] = QPoint( -4, +3 ); } else { // left pointing arrow pa[0] = QPoint( -8, 0 ); pa[1] = QPoint( -3, -3 ); pa[2] = QPoint( -3, +3 ); } pa.translate( _x, _y ); p.setBrush( p.pen().color() ); p.drawPolygon( pa ); deinitPainter( p ); }
void ECXor::drawShape(QPainter &p) { if (m_logicSymbolShape == Rectangular) { MultiInputGate::drawShape(p); return; } initPainter(p); int _x = (int)x() + offsetX(); int _y = (int)y() + offsetY(); p.save(); p.setPen(Qt::NoPen); p.drawChord(_x - width() + 16, _y, 2 * width() - 16, height(), -16 * 81, 16 * 162); p.restore(); p.drawArc(_x - width() + 16, _y, 2 * width() - 16, height(), -16 * 90, 16 * 180); p.drawArc(_x - 8, _y, 16, height(), -16 * 90, 16 * 180); p.drawArc(_x, _y, 16, height(), -16 * 90, 16 * 180); deinitPainter(p); }
void ECSignalLamp::drawShape( QPainter &p ) { initPainter(p); int _x = int(x()); int _y = int(y()); // Calculate the brightness as a linear function of power, bounded below by // 25 milliWatts and above by 500 milliWatts. int brightness = (avgPower < LIGHTUP) ? 255 : ((avgPower > WATTAGE) ? 0 : (int)(255 * (1 - ((avgPower - LIGHTUP) / (WATTAGE - LIGHTUP))))); advanceSinceUpdate = 0; p.setBrush( QColor( 255, 255, brightness ) ); p.drawEllipse( _x-8, _y-8, 16, 16 ); int pos = 8 - int(8 * M_SQRT1_2); p.drawLine( _x-8+pos, _y-8+pos, _x+8-pos, _y+8-pos ); p.drawLine( _x+8-pos, _y-8+pos, _x-8+pos, _y+8-pos ); deinitPainter(p); }
void LogicProbe::drawShape(QPainter &p) { initPainter(p); int _x = int(x()) - 16; int _y = int(y()) - 8; p.drawRect(_x, _y, 32, 16); p.setPen(QPen(m_color, 2)); p.drawLine(_x + 4, _y + 11, _x + 6, _y + 11); p.drawLine(_x + 6, _y + 11, _x + 6, _y + 4); p.drawLine(_x + 6, _y + 4, _x + 10, _y + 4); p.drawLine(_x + 10, _y + 4, _x + 10, _y + 11); p.drawLine(_x + 10, _y + 11, _x + 16, _y + 11); p.drawLine(_x + 16, _y + 11, _x + 16, _y + 4); p.drawLine(_x + 16, _y + 4, _x + 23, _y + 4); p.drawLine(_x + 23, _y + 4, _x + 23, _y + 11); p.drawLine(_x + 23, _y + 11, _x + 28, _y + 11); // p.drawLine( _x+23, _y+11, _x+26, _y+11 ); // p.drawLine( _x+26, _y+11, _x+26, _y+4 ); // p.drawLine( _x+26, _y+4, _x+28, _y+4 ); deinitPainter(p); }
void VariableResistor::drawShape( QPainter &p ) { initPainter(p); // Get centre point of component. int _y = (int)y(); int _x = (int)x(); p.drawRect( _x-16, _y-6, width(), 12 ); p.drawLine( _x-12, _y+12, _x+13, _y-13 ); Q3PointArray pa(3); // Diagonally pointing arrow pa[0] = QPoint( 0, 0 ); pa[1] = QPoint( -4, 0 ); pa[2] = QPoint( 0, 4 ); pa.translate( _x+13, _y-13 ); p.setBrush( p.pen().color() ); p.drawPolygon( pa ); deinitPainter(p); }
void Meter::drawShape( QPainter &p ) { initPainter(p); p.drawEllipse( (int)x()-16, (int)y()-16, width(), width() ); p.setPen(QPen(Qt::black,2)); p.setBrush(Qt::black); // The proportion between 0.1mV and 10KV, on a logarithmic scale m_prevProp = calcProp( m_old_value ); double sin_prop = 10*std::sin(m_prevProp*1.571); // 1.571 = pi/2 double cos_prop = 10*std::cos(m_prevProp*1.571); // 1.571 = pi/2 int cx = int(x()-16+(width()/2)); int cy = int(y()-16+(height()/2)); p.drawLine( int(cx-sin_prop), int(cy-cos_prop), int(cx+sin_prop), int(cy+cos_prop) ); QPointArray pa(3); pa[0] = QPoint( int(cx-sin_prop), int(cy-cos_prop) ); // Arrow head pa[1] = QPoint( int(cx-sin_prop + 8*std::sin(1.571*(-0.3+m_prevProp))), int(cy-cos_prop + 8*std::cos(1.571*(-0.3+m_prevProp))) ); pa[2] = QPoint( int(cx-sin_prop + 8*std::sin(1.571*(0.3+m_prevProp))), int(cy-cos_prop + 8*std::cos(1.571*(0.3+m_prevProp))) ); p.drawPolygon(pa); deinitPainter(p); }