Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Logischer Schaltungsgenerator (https://www.delphipraxis.net/74386-logischer-schaltungsgenerator.html)

mr-unbekannt 2. Aug 2006 12:47


Logischer Schaltungsgenerator
 
hallo...

also, ich arbeite an einem projekt, das wahrheitstabellen generiert und auswertet ( siehe BoolGen)

nun, alles schön und gut, jetzt würde ich gerne ein tool dazu machen, das mir die KNF und DNF in eine grafische version übersetzt--> das heißt in eine logische schaltung.
da dies mithilfe grafiken passieren muss, und ich keine ahnung von grafikprogrammierung habe, wollte ich mal fragen, wie man sowas machen könnte.

ich kenne ein programm(applett), das in JAVA geschrieben wurde und das diese aufgabe hervorragend löst. ( KVD )
falls jemand die java datein braucht, ich schick sie weiter.

wie könnte man denn das machen?


hier der code der drawPLA.jad:
Code:
import java.awt.Color;
import java.awt.Graphics;

class DrawPLA extends PLA
{

    DrawPLA(int i, int j, String as[], String as1[])
    {
        super(i, j, as, as1);
    }

    DrawPLA(int i, int j, String as[], String as1[], boolean flag)
    {
        super(i, j, as, as1);
        klein = flag;
    }

    public void drawpla(Graphics g, int i, int j)
    {
        x0 = i;
        y0 = j;
        drawInputs(g);
        drawInputLabels(g);
        drawOutputLabels(g);
    }

    public void drawSolderDot(Graphics g, int i, int j)
    {
        g.fillRect(i - 1, j - 1, 3, 3);
    }

    public void drawInputLabels(Graphics g)
    {
        boolean flag = false;
        byte byte0 = 15;
        for(int j = 0; j < super.ni; j++)
        {
            int i = x0 + (j + 1) * 40 + 5;
            g.setColor(Color.black);
            g.drawString(super.innames[super.ni - j - 1], i, y0 + byte0);
        }

    }

    public void drawOneInput(Graphics g, int i, int j)
    {
        if(!klein)
        {
            g.setColor(Color.black);
            drawSolderDot(g, i + 10, j + 1);
            g.drawLine(i + 10, j, i + 10, j + 40);
            g.drawLine(i + 10, j + 10, i + 25, j + 10);
            drawSolderDot(g, i + 10, j + 10);
            g.drawLine(i + 25, j + 10, i + 25, j + 20);
            g.setColor(Color.blue);
            g.drawLine(i + 16, j + 20, i + 34, j + 20);
            g.drawLine(i + 16, j + 20, i + 25, j + 32);
            g.drawLine(i + 34, j + 20, i + 25, j + 32);
            g.fillRect(i + 23, j + 34, 5, 3);
            g.fillRect(i + 24, j + 33, 3, 5);
            g.drawLine(i + 25, j + 33, i + 25, j + 39);
            g.setColor(Color.black);
            return;
        } else
        {
            g.setColor(Color.black);
            drawSolderDot(g, i + 10, j + 1);
            g.drawLine(i + 10, j, i + 10, j + 40);
            g.drawLine(i + 10, j + 10, i + 20, j + 10);
            drawSolderDot(g, i + 10, j + 10);
            g.drawLine(i + 20, j + 10, i + 20, j + 20);
            g.setColor(Color.blue);
            g.drawLine(i + 13, j + 20, i + 28, j + 20);
            g.drawLine(i + 13, j + 20, i + 20, j + 32);
            g.drawLine(i + 28, j + 20, i + 20, j + 32);
            g.fillOval(i + 18, j + 30, 5, 5);
            g.drawLine(i + 20, j + 33, i + 20, j + 39);
            g.setColor(Color.black);
            return;
        }
    }

    public void drawconns(Graphics g)
    {
        int i1 = (x0 + (super.ni + 1) * 40 + 20) - 2;
        g.setColor(Color.black);
        int l1;
        if(!klein)
            l1 = y0 + 60 + super.np * 30;
        else
            l1 = y0 + 60 + super.np * 10;
        for(int i2 = 0; i2 < super.ni; i2++)
        {
            int j = x0 + 10 + (super.ni - i2) * 40;
            g.drawLine(j, y0 + 60, j, l1);
            if(!klein)
                j += 15;
            else
                j += 10;
            g.drawLine(j, y0 + 60, j, l1);
        }

        int i = 0;
        for(Cube cube = super.root.next; cube != super.root; cube = cube.next)
        {
            for(int j2 = 0; j2 < super.ni; j2++)
                if(cube.getInput(j2) == 0)
                {
                    int k = x0 + 25 + (super.ni - j2) * 40;
                    int j1;
                    if(!klein)
                        j1 = y0 + 60 + i * 30 + 7 + j2 * 3;
                    else
                        j1 = y0 + 65 + i * 10;
                    if(klein)
                    {
                        g.setColor(Color.red);
                        drawSolderDot(g, k - 5, j1);
                    } else
                    {
                        drawSolderDot(g, k, j1);
                    }
                    if(klein)
                    {
                        g.setColor(Color.black);
                        g.drawLine(k - 3, j1, i1, j1);
                    } else
                    {
                        g.drawLine(k, j1, i1, j1);
                    }
                } else
                if(cube.getInput(j2) == 1)
                {
                    int l = x0 + 10 + (super.ni - j2) * 40;
                    int k1;
                    if(!klein)
                        k1 = y0 + 60 + i * 30 + 7 + j2 * 3;
                    else
                        k1 = y0 + 65 + i * 10;
                    drawSolderDot(g, l, k1);
                    g.drawLine(l, k1, i1, k1);
                }

            i++;
        }

    }

    public void drawInputs(Graphics g)
    {
        int j = y0 + 20;
        for(int k = 0; k < super.ni; k++)
        {
            int i = x0 + (super.ni - k) * 40;
            drawOneInput(g, i, j);
        }

    }

    public void drawOutputLabels(Graphics g)
    {
        g.setColor(Color.black);
        for(int k = 0; k < super.no; k++)
        {
            int j = y0 + 15;
            int i = xpos_OutputGate[k] + 5;
            g.drawString(super.outnames[k], i, j);
        }

    }

    protected int x0;
    protected int y0;
    protected int xpos_OutputGate[];
    protected int xsize_OutputGate[];
    protected int conns_OutputGate[];
    public boolean klein;
}
bitte um hilfe

danke

Nikolas 2. Aug 2006 13:09

Re: Logischer Schaltungsgenerator
 
Du brauchst also nur die Befehle um die Zeichnung zu machen?

Wenn du auf einem Canvas malen willst, brauchst du einen pen. Per canvas.pen.color:=clblack; setzt du die Farbe. Per Moveto(x,y) setzt du in an den Anfang einer linie und per Lineto(x,y) malst du eine Linie zum Zielpunkt.
fillrect gibts in Delpi unter gleichem Namen und wird mit einem Pinsel (brush) gemalt, dessen farbe du per brush.color:=clmarron; setzen kannst und damit das rect auch ausgefüllt ist, noch brush.style auf bssolid setzen.
Und Drawstring nennt sich textout.

mr-unbekannt 2. Aug 2006 13:25

Re: Logischer Schaltungsgenerator
 
hmm..

eingentlich bräuchte ich das wissen, wie man eine schaltung aus KNF und DNF zeichnet


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz