Re: Can you display a bitmap with/inside of a sizer?

[email protected] (James Lynes)
Newsgroups perl.wxperl.users
Message-ID <CABPyseiRn6ZRvm9QD9SUjcZvdGnzY6jHQLj=aBW8aXBOfby4pw@mail.gmail.com>
Steve:

You are already beyond me on looking for the memory leak based on your PM
post. The wxBook has a section on finding memory leaks, but what you are
doing with Valgrind is probably more advanced. Wish I could help more...

I like your idea for a standard layout - Header/Main/Footer. I need to work
that into my new app boiler plate file.  It's amazing how many lines are
required for the sizers! Getting there. It makes more sense now that I have
it working. Nice to have example code to look at. Need to get github set up
on this laptop so I can add this to my examples repository.

For what it's worth, attached is my latest learning "exercise".

James




On Thu, May 7, 2015 at 3:02 AM, Steve Cookson <[email protected]>
wrote:

>  Hi James,
>
> Well really I find sizers are a bit problematic too.  At the beginning I
> did them just as you are doing.  Then I started drawing the more
> complicated ones out on a piece of paper before starting and now I have a
> standard layout which I reuse so that I have a standard header, a main
> panel and a standard footer with a standard set of buttons in it.  The main
> panel still requires some thinking, but I would have used the nested sizers
> idea that you used.  Wx::GridBagSizer is a bit more complicated, but would
> also have worked, that way you might have been able to do the whole thing
> with one sizer.
>
> Regarding the memory leak, I thought I had it.  I made a number of changes
> to make the code more streamlined and efficient and lo and behold the leak
> disappeared only to pop up else where.
>
> It's driving me a bit crazier than I was anyway, and worse, I don't even
> know if it's causing the video crash!  Any suggestions welcome!
>
> Thanks for asking,
>
> Steve.
>
>
> On 06/05/15 23:39, James Lynes wrote:
>
>   Solved... via trial and error and error and error...
>
>  Made the top level sizer horizontal, containing a left and right
> vertical, containing text controls, bitmap, and buttons.
>
>  Will post once I add a few more bells and whistles.
>
>  Thanks again,
>
>  James
>
>
> On Wed, May 6, 2015 at 4:06 PM, James Lynes <[email protected]> wrote:
>
>>   Steve, thanks! Did the job.
>>
>>  But, of course, one question leads to at least one more.....
>>
>>  I would like the bitmap to be displayed to the right of a column of
>> TextCtrls. Currently the TextCtrls are being displayed under the bitmap now
>> that I'm not using an onPaint event . Do I need to create two sub-panels
>> with sub-sizers, one for the bitmap and one for the TextCtrls? Or should
>> the top sizer be a horzontal rather than vertical? Trying to make some
>> sense of this sizer stuff.
>>
>>  James
>>
>>  PS: Did you find your memory leak?
>>
>> On Mon, May 4, 2015 at 11:32 AM, Steve Cookson <[email protected]>
>> wrote:
>>
>>> Hi James,
>>>
>>> You want Wx::StaticBitmap, like this:
>>>
>>>     my $bmp = Wx::Bitmap->new("path/to/bitmap.png", wxBITMAP_TYPE_PNG) ;
>>>     my $sbm = Wx::StaticBitmap->new($parent, wxID_ANY, $bmp,
>>> wxDefaultPosition, wxDefaultSize, );
>>>     $sizer->Add($sbm, 0, 0, 0);
>>>
>>> Regards
>>>
>>> Steve.
>>>
>>>
>>>
>>> On 02/05/15 16:05, James Lynes wrote:
>>>
>>>> Good day!
>>>>
>>>> I'm working on a little app to design common emitter amplifiers. I
>>>> created a circuit schematic with Eagle and exported it to a PNG file.
>>>>
>>>> I am currently displaying the PNG at a fixed location of the screen
>>>> with:
>>>>
>>>>     Wx::Event::EVT_PAINT($self, sub {
>>>>         my ($self, $event) = @_;
>>>>         My $dc = Wx::PaintDC->new($self);
>>>>         my $bmp = Wx::Bitmap->new("CEAmpImg.png, wxBITMAP_TYPE_PNG);
>>>>         $dc->DrawBitmap($bmp, 150, 50, 1);});
>>>>
>>>> If would be nice if I could blend this in with the sizers that are
>>>> controlling the layout of the input and output TextCtrls.
>>>>
>>>> Thanks for your ideas.
>>>>
>>>> James
>>>>
>>>>
>>>>
>>>
>>
>
>
CEAmp1.pl (application/x-perl, 8.5 KB)
#! /usr/bin/perl

# Name:			CEAmp1.pl
# Author:		James M. Lynes, Jr.
# Created:		May 1, 2015
# Modified By:		James M. Lynes, Jr.
# Last Modified:	May 7, 2015
# Change Log:		5/1/2015 - Program Created
#                       5/2/2015 - Fixed $IcqText box for blank field case
#                                - Move $title into the verticle sizer
#                                - Move Design & Exit buttons to the right
#                       5/6/2015 - Modify Sizer layout
#			5/7/2015 - Change TextCtrls to SpinCtrls - prevents divide by 0 possibility
#                                - Used Eagle to draw a border around the schematic bitmap
#                                - Added comments throughout
# Description:		Common Emitter Amp Designer
#                                  Given Vcc, Vceq, Icq, Beta, & Av
#                                  Calculate Bias, Collector, & Emitter Resistor Values
#

package main;
use strict;
use warnings;
my $app = App->new();
$app->MainLoop;

package App;
use strict;
use warnings;
use base 'Wx::App';
sub OnInit {
    Wx::InitAllImageHandlers();
    my $frame = Frame->new();
    $frame->Show(1);
}

package Frame;
use strict;
use warnings;
use Wx qw(:everything);
use base qw(Wx::Frame);
use CEAmp;
use Data::Dumper;

sub new {
    my ($class, $parent) = @_;

    my $self = $class->SUPER::new($parent, -1, "Common Emitter Amplifier Designer", wxDefaultPosition, wxDefaultSize);

#   Create an instance of a CE Amp object(defined in CEAmp.pm)

    $self->{AMP1} = CEAmp::Data->new();

#   Create the Schematic Bitmap(Created in Eagle and exported to a PNG file)

    my $bmp = Wx::Bitmap->new("CEAmpImg1.png", wxBITMAP_TYPE_PNG);
    my $sbm = Wx::StaticBitmap->new($self, wxID_ANY, $bmp, wxDefaultPosition, wxDefaultSize);

# Create Controls

    my $title = Wx::StaticText->new($self, wxID_ANY, "Common Emitter Amplifier Designer",
                                    wxDefaultPosition, wxDefaultSize, wxALIGN_CENTER);

    my $VccLabel = Wx::StaticText->new($self, wxID_ANY, "   Vcc,v", wxDefaultPosition, wxDefaultSize); 
    my $VccText = Wx::SpinCtrl->new($self, wxID_ANY, "12", wxDefaultPosition, wxDefaultSize, 
                                    wxSP_ARROW_KEYS | wxSP_WRAP | wxALIGN_RIGHT, 1, 24, 12);
 
    my $VceqLabel = Wx::StaticText->new($self, wxID_ANY, "   Vceq,v", wxDefaultPosition, wxDefaultSize); 
    my $VceqText = Wx::SpinCtrl->new($self, wxID_ANY, "5", wxDefaultPosition, wxDefaultSize,
                                    wxSP_ARROW_KEYS | wxSP_WRAP | wxALIGN_RIGHT, 1, 24, 5);

    my $IcqLabel = Wx::StaticText->new($self, wxID_ANY, "   Icq,ma", wxDefaultPosition, wxDefaultSize); 
    my $IcqText = Wx::SpinCtrl->new($self, wxID_ANY, "4", wxDefaultPosition, wxDefaultSize,
                                    wxSP_ARROW_KEYS | wxSP_WRAP | wxALIGN_RIGHT, 1, 40, 4);

    my $BetaLabel = Wx::StaticText->new($self, wxID_ANY, "   Beta", wxDefaultPosition, wxDefaultSize); 
    my $BetaText = Wx::SpinCtrl->new($self, wxID_ANY, "150", wxDefaultPosition, wxDefaultSize,
                                    wxSP_ARROW_KEYS | wxSP_WRAP | wxALIGN_RIGHT, 1, 300, 150);

    my $AvLabel = Wx::StaticText->new($self, wxID_ANY, "   Av", wxDefaultPosition, wxDefaultSize); 
    my $AvText = Wx::SpinCtrl->new($self, wxID_ANY, "5", wxDefaultPosition, wxDefaultSize,
                                    wxSP_ARROW_KEYS | wxSP_WRAP | wxALIGN_RIGHT, 1, 100, 5);

    my $R1Label = Wx::StaticText->new($self, wxID_ANY, "R1", wxDefaultPosition, wxDefaultSize); 
    my $R1Text = Wx::TextCtrl->new($self, wxID_ANY, "0", wxDefaultPosition, wxDefaultSize, wxTE_READONLY);

    my $R2Label = Wx::StaticText->new($self, wxID_ANY, "R2", wxDefaultPosition, wxDefaultSize); 
    my $R2Text = Wx::TextCtrl->new($self, wxID_ANY, "0", wxDefaultPosition, wxDefaultSize, wxTE_READONLY);

    my $RcLabel = Wx::StaticText->new($self, wxID_ANY, "Rc", wxDefaultPosition, wxDefaultSize); 
    my $RcText = Wx::TextCtrl->new($self, wxID_ANY, "0", wxDefaultPosition, wxDefaultSize, wxTE_READONLY);

    my $ReLabel = Wx::StaticText->new($self, wxID_ANY, "Re", wxDefaultPosition, wxDefaultSize); 
    my $ReText = Wx::TextCtrl->new($self, wxID_ANY, "0", wxDefaultPosition, wxDefaultSize, wxTE_READONLY);

# Create Buttons

    my $designButtonID = 1000;
    my $designButton = Wx::Button->new($self, $designButtonID, "Design", wxDefaultPosition, wxDefaultSize);
    my $exitButton = Wx::Button->new($self, wxID_EXIT, "", wxDefaultPosition, wxDefaultSize);

# Create Sizers

    my $verticalSizerFrame = Wx::BoxSizer->new(wxHORIZONTAL);
    $self->SetSizer($verticalSizerFrame);

    my $leftSizer = Wx::BoxSizer->new(wxVERTICAL);
    my $rightSizer = Wx::BoxSizer->new(wxVERTICAL);
    my $verticalSizerControls = Wx::BoxSizer->new(wxVERTICAL);
    my $horizontalSizerOutputs = Wx::BoxSizer->new(wxHORIZONTAL);
    my $horizontalSizerButtons = Wx::BoxSizer->new(wxHORIZONTAL);

# Layout Sizers

    $verticalSizerFrame->Add($leftSizer, 0, 0, 0);
    $verticalSizerFrame->Add($rightSizer, 0, 0, 0);

    $leftSizer->Add($verticalSizerControls, 0, 0, 0);
    $rightSizer->AddSpacer(50);
    $rightSizer->Add($sbm, 0, 0, 0);
    $rightSizer->AddSpacer(20);
    $rightSizer->Add($horizontalSizerOutputs, 0, 0, 0);
    $rightSizer->AddSpacer(40);
    $rightSizer->Add($horizontalSizerButtons, 0, 0, 0);

    $verticalSizerControls->Add($title, 0, 0, 0);
    $verticalSizerControls->AddSpacer(30);
    $verticalSizerControls->Add($VccLabel, 0, 0, 0);
    $verticalSizerControls->Add($VccText, 0, 0, 0);
    $verticalSizerControls->AddSpacer(15);
    $verticalSizerControls->Add($VceqLabel, 0, 0, 0);
    $verticalSizerControls->Add($VceqText, 0, 0, 0);
    $verticalSizerControls->AddSpacer(15);
    $verticalSizerControls->Add($IcqLabel, 0, 0, 0);
    $verticalSizerControls->Add($IcqText, 0, 0, 0);
    $verticalSizerControls->AddSpacer(15);
    $verticalSizerControls->Add($BetaLabel, 0, 0, 0);
    $verticalSizerControls->Add($BetaText, 0, 0, 0);
    $verticalSizerControls->AddSpacer(15);
    $verticalSizerControls->Add($AvLabel, 0, 0, 0);
    $verticalSizerControls->Add($AvText, 0, 0, 0);
    $verticalSizerControls->AddSpacer(15);

    $horizontalSizerOutputs->Add($R1Label, 0, 0, 0);
    $horizontalSizerOutputs->Add($R1Text, 0, 0, 0);
    $horizontalSizerOutputs->AddSpacer(10);
    $horizontalSizerOutputs->Add($R2Label, 0, 0, 0);
    $horizontalSizerOutputs->Add($R2Text, 0, 0, 0);
    $horizontalSizerOutputs->AddSpacer(10);
    $horizontalSizerOutputs->Add($RcLabel, 0, 0, 0);
    $horizontalSizerOutputs->Add($RcText, 0, 0, 0);
    $horizontalSizerOutputs->AddSpacer(10);
    $horizontalSizerOutputs->Add($ReLabel, 0, 0, 0);
    $horizontalSizerOutputs->Add($ReText, 0, 0, 0);

    $horizontalSizerButtons->AddSpacer(300);
    $horizontalSizerButtons->Add($designButton, 0, 0, 0);
    $horizontalSizerButtons->AddSpacer(40);
    $horizontalSizerButtons->Add($exitButton, 0, 0, 0);

# Create Event Handlers

    Wx::Event::EVT_BUTTON($self, $designButton, sub {
                          my ($self, $event) = @_;
                          CEAmp->design($self, $self->{AMP1});		# Run the Design Calculations
                          $R1Text->SetValue($self->{AMP1}->R1);		# Copy results back to Output Controls
                          $R2Text->SetValue($self->{AMP1}->R2);
                          $RcText->SetValue($self->{AMP1}->Rc);
                          $ReText->SetValue($self->{AMP1}->Re);});

    Wx::Event::EVT_BUTTON($self, $exitButton, sub {			# Exit
                          my ($self, $event) = @_;
                          $self->Close;});

    Wx::Event::EVT_TEXT($self, $VccText, sub {				# Copy changed input field to object
                        my ($self, $event) = @_;
                        $self->{AMP1}->Vcc($VccText->GetValue);});

    Wx::Event::EVT_TEXT($self, $VceqText, sub {				# Copy changed input field to object
                        my ($self, $event) = @_;
                        $self->{AMP1}->Vceq($VceqText->GetValue);});

    Wx::Event::EVT_TEXT($self, $IcqText, sub {				# Copy changed input field to object
                        my ($self, $event) = @_;
                         $self->{AMP1}->Icq($IcqText->GetValue / 1000)});

    Wx::Event::EVT_TEXT($self, $BetaText, sub {				# Copy changed input field to object
                        my ($self, $event) = @_;
                        $self->{AMP1}->Beta($BetaText->GetValue);});

    Wx::Event::EVT_TEXT($self, $AvText, sub {				# Copy changed input field to object
                        my ($self, $event) = @_;
                        $self->{AMP1}->Av($AvText->GetValue);});


    $verticalSizerFrame->Fit($self);
    $verticalSizerFrame->Layout();

    return $self;
}
1;
CEAmp.pm (application/x-perl, 1.9 KB)
#! /usr/bin/perl

# Name:			CEAmp.pm
# Author:		James M. Lynes, Jr.
# Created:		May 1, 2015
# Modified By:		James M. Lynes, Jr.
# Last Modified:	May 1, 2015
# Change Log:		5/1/2015 - Program Created
# Description:		Common Emitter Amplifier Designer
#				Support Module for wxPerl transistor amplifier designer - CEAmp1.pl
#

package CEAmp;
use strict;
use warnings;
use Data::Dumper;

my %defaults = (
		Av	=> 5,			# Desired Amplifier Voltage Gain
		Vcc	=> 12,			# Collector Voltage
		Vbe	=> .7,			# Base->Emitter Voltage
		Vceq	=> 5,			# Collector->Emitter Voltage at Quiessence
		VR1	=> 0,			# Voltage across VR1
		VR2	=> 0,			# Voltage across Vr2
		R1	=> 0,			# Bias Resistor R1
		R2	=> 0,			# Bias Resistor R2
		Rc	=> 0,			# Collector Resistor
		Re	=> 0,			# Emitter Resistor
		Rt	=> 0,			# Total of Bias Resistors
		Ib	=> 0,			# Base Current
		Ic	=> 0,			# Collector Current
		Ie	=> 0,			# Emitter Current
		Ir	=> 0,			# Bias Current
		Icq	=> .004,		# Desired Collector Current at Quiessence
		Beta	=> 150,			# Transistor DC Current Gain
		Cin	=> 10E-6,		# Input Coupling Capacitor - currently not implemented
		Cout	=> 10E-6,		# Output Coupling Capacitor - currently not implemented
		Transistor	=> "2N3904",	# Transistor Type
		);

sub design {
    my ($class, $self, $amp) = @_;

    $amp->Rt(($amp->Vcc - $amp->Vceq) / $amp->Icq);
    $amp->Re(($amp->Rt / ($amp->Av + 1)));
    $amp->Rc($amp->Rt - $amp->Re);

    $amp->Ib($amp->Icq / $amp->Beta);
    $amp->Ir($amp->Ib * 10);

    $amp->VR2($amp->Vbe + ($amp->Icq * $amp->Re));
    $amp->R2($amp->VR2 / $amp->Ir);
    $amp->VR1($amp->Vcc - $amp->VR2);
    $amp->R1($amp->VR1 / $amp->Ir);
}

package CEAmp::Data;
use strict;
use warnings;
use Class::Accessor::Fast;
use base qw(Class::Accessor::Fast);

__PACKAGE__->mk_accessors(qw(Av Vcc Vbe VR1 VR2 Vceq R1 R2 Rc Re Rt
                             Ib Ic Ie Ir Icq Beta Cin Cout Transistor));

sub new {shift->SUPER::new(@_, \%defaults);}
1;
CEAmpImg1.png (image/png, 3.6 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.