Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members   Related Pages   Examples  

PExample.cpp

@file PExample.cpp
Author:
Mathieu Delalandre
Date:
06/2004
#include <GOMLib\GOMLib.hpp>
#include <GOMLib\PExample.hpp>

//      Getting started


void init1()
{
        OGraphic *o1,*o2;

        o1 = new OPoint(1,1);
        o1->print();
        
        o2 = new OLine(1,1,8,8);
        o2->print();
        
        o1->~OGraphic();
        o2->~OGraphic();
}       //de


void copy()
{
        OGraphic *o1 = new OPoint(1,2);
        o1->print();
        OGraphic *o2 = o1->clone();
        o1->~OGraphic(); //
        o2->print();
        o2->~OGraphic();
}       //de


void init2()
{
        OPoint *o1 = new OPoint(5,1);
        cout << o1->getX() << endl;
        
        OLine *o2 = new OLine(1,1,8,8);
        cout << o2->getLength() << endl;
        
        o1->~OPoint();
        o2->~OLine();
}       //de


void init3()
{
        OPoint o1(5,1);
        cout << o1.getX() << endl;
        
        OLine o2(1,1,8,8);
        cout << o2.getLength() << endl;
}       //de


void rw()
{
        OGraphic* p;
        
        OPoint ptb(50,50),ptc(100,50),pte(100,100);
        p = new OArc(ptb,ptc,pte,false);
        
        gomWrite(p,"es.gom");
        xmlWrite(p,"es.xml");
        svgWrite(p,"es.svg");
        
        p->~OGraphic();
        p = gomRead("es.gom");
        p->print();
}       //de


void dynamic()
{
        OGraphic* p;
        
        OPoint ptb(50,50),ptc(100,50),pte(100,100);
        p = new OArc(ptb,ptc,pte,false);
        
        gomWrite(p,"es.gom");   
        p->~OGraphic();
        
        p = gomRead("es.gom");
        if(p->getName()=="OArc")
                {
                OArc *a = castOArc(p);
                cout << a->getRadius() << endl;
                a->~OArc();
                }
        else
                p->~OGraphic();
}       //de


//      OHL


void ohlArc()
{
        OGraphic* p;
        OHL *my = new OHL();
        OPoint ptb(50,50),ptc(100,50),pte(100,100);
        
        //draw radius
        p = new OLine(ptb,ptc);
        my->newObject(p);

        p = new OLine(ptc,pte);
        my->newObject(p);

        //draw center
        p = new OPoint(ptc.getX(),ptc.getY());
        my->newObject(p);
        
        //draw arc
        p = new OArc(ptb,ptc,pte,false);
        my->newObject(p);

        my->print();

        gomWrite(my,"es.gom");
        xmlWrite(my,"es.xml");
        svgWrite(my,"es.svg");
        
        my->~OHL(); //here we delete all OHL's object, OPoint, OLine, and OArc
}       //de


void ohlCopy()
{
        OGraphic *p;
        OHL *h1 = new OHL();

        p = new OPoint(1,2);
        h1->newObject(p);
        p = new OPoint(3,4);
        h1->newObject(p);

        OGraphic *h2 = h1->clone(); //here we copy all OHL's objects
        h1->~OHL();
        h2->print();
        h2->~OGraphic();
}       //de


void ohlWrite()
{
        {
        OHL *h1 = new OHL();
        OHL *h2 = new OHL();
        OGraphic* p;

        p = new OPoint(1,2);
        h1->newObject(p);
        h2->newObject(p);
        p = new OPoint(3,4);
        h1->newObject(p);
        h2->newObject(p);

        h1->~OHL(); //free memory ok
        //h2->~OHL(); //error
        }

        {
        OHL *h1 = new OHL();
        OHL *h2 = new OHL();
        OGraphic* p;

        p = new OPoint(1,2);
        h1->newObject(p);
        h2->newObject(p->clone());
        p = new OPoint(3,4);
        h1->newObject(p);
        h2->newObject(p->clone());

        h1->~OHL(); //free memory ok
        h2->~OHL(); //free memory ok
        }

}       //de


void ohlPush()
{
        {
        OHL *h = new OHL();
        OGraphic* p;

        p = new OPoint(1,2);
        h->newObject(p);
        p = new OPoint(3,4);
        h->objectWrite(p,0); //bad case, you don't delete the 1;2 point

        h->~OHL();
        }
        {
        OHL *h = new OHL();
        OGraphic* p;

        p = new OPoint(1,2);
        h->newObject(p);
        p = new OPoint(3,4);
        h->objectRead(0)->~OGraphic();
        h->objectWrite(p,0); //good case, you delete the 1;2 point

        h->~OHL();
        }
        {
        OHL *h = new OHL();
        OGraphic* p;

        p = new OPoint(1,2);
        h->newObject(p);
        p = new OPoint(3,4);
        h->objectPush(p,0); //good case, you delete the 1;2 point

        h->~OHL();
        }
}       //de


//      OGraph
        

void graphArc()
{
        OGraph *o = new OGraph();
        OPoint ptb(50,50),ptc(100,50),pte(100,100);
        
        //draw center
        o->newNode(new OPoint(ptc.getX(),ptc.getY()));
        //draw radius
        o->newNode(new OLine(ptb,ptc));
        o->newNode(new OLine(ptc,pte));
        //draw arc
        o->newNode(new OArc(ptb,ptc,pte,false));
        
        //edge
        o->newEdge(0,1);
        o->newEdge(0,2);
        o->newEdge(1,3);
        o->newEdge(1,3);

        o->print();

        gomWrite(o,"es.gom");
        xmlWrite(o,"es.xml");
        svgWrite(o,"es.svg");

        o->~OGraph();
}       //de

void graphCopy()
{
        //graph create
        OGraph *o = new OGraph();
        o->newNode(new OPoint(1,1));
        o->newNode(new OPoint(5,5));
        o->newEdge(0,1);
        
        //graph copy
        OGraphic *oc = o->clone();
        o->~OGraph();
        oc->print();
        oc->~OGraphic();
}       //de


void graphWrite()
{
        {
        OGraph *o1 = new OGraph();
        OGraph *o2 = new OGraph();
        OGraphic* p;

        p = new OPoint(1,1);
        o1->newNode(p);
        o2->newNode(p);
        p = new OPoint(5,5);
        o1->newNode(p);
        o2->newNode(p);
        o1->newEdge(0,1);
        o2->newEdge(0,1);

        o1->~OGraph(); //free memory ok
        //o2->~OGraph(); //error
        }

        {
        OGraph *o1 = new OGraph();
        OGraph *o2 = new OGraph();
        OGraphic* p;

        p = new OPoint(1,1);
        o1->newNode(p);
        o2->newNode(p->clone());
        p = new OPoint(5,5);
        o1->newNode(p);
        o2->newNode(p->clone());
        o1->newEdge(0,1);
        o2->newEdge(0,1);

        o1->~OGraph(); //free memory ok
        o2->~OGraph(); //free memory ok
        }
}       //de


void graphPush()
{
        {
        OGraph *o = new OGraph();

        o->newNode(new OPoint(1,1));
        o->newNode(new OPoint(5,5));
        o->newEdge(0,1);

        o->objectWrite(new OPoint(6,6),0); //bad case, you don't delete the 1;1 point

        o->~OGraph();
        }
        {
        OGraph *o = new OGraph();

        o->newNode(new OPoint(1,1));
        o->newNode(new OPoint(5,5));
        o->newEdge(0,1);

        o->objectRead(0)->~OGraphic();
        o->objectWrite(new OPoint(6,6),0); //good case, you delete the 1;1 point
        
        o->~OGraph();
        }
        {
        OGraph *o = new OGraph();

        o->newNode(new OPoint(1,1));
        o->newNode(new OPoint(5,5));
        o->newEdge(0,1);

        o->objectPush(new OPoint(6,6),0); //good case, you delete the 1;1 point
        
        o->~OGraph();
        }
}       //de


//      Attribute


void ohlAttribute()
{
        OLine *l1,*l2;
        OHL *h1 = new OHL();

        l1 = new OLine(1,1,6,6);
        h1->newObject(l1);
        l2 = new OLine(6,6,6,20);
        h1->newObject(l2);
        
        AGraphic* a = new AAngle(l1->getAngle(*l2));
        h1->newAttribute(a);
        
        h1->print();
        h1->~OHL();
}       //de


void graphAttribute()
{
        OLine *l1,*l2;
        OGraph *o1 = new OGraph();

        l1 = new OLine(1,1,6,6);
        o1->newNode(l1);
        l2 = new OLine(6,6,6,20);
        o1->newNode(l2);
        
        AGraphic* a = new AAngle(l1->getAngle(*l2));
        o1->newEdge(0,1,a);
        
        o1->print();
        o1->~OGraph();
}       //de


//      The link square problem


void modelling()
{
        OPoint p1(10,10),p2(20,10),p3(20,20),p4(10,20);
        OPoint p5(30,30),p6(40,30),p7(40,40),p8(30,40);
        
        //modelling based on point follow-up
                {
                OHL* o = new OHL();
                
                o->newObject(p3.clone());
                o->newObject(p2.clone());
                o->newObject(p1.clone());
                o->newObject(p4.clone());
                o->newObject(p3.clone());
                o->newObject(p5.clone());
                o->newObject(p6.clone());
                o->newObject(p7.clone());
                o->newObject(p8.clone());
                o->newObject(p5.clone());
                
                gomWrite(o,"m1.gom");
                xmlWrite(o,"m1.xml");
                svgWrite(o,"m1.svg");
                
                o->~OHL();
                }
        //modelling based on line follow-up
                {
                OHL* o = new OHL();
                
                o->newObject(new OLine(p3,p2));
                o->newObject(new OLine(p2,p1));
                o->newObject(new OLine(p1,p4));
                o->newObject(new OLine(p4,p3));
                o->newObject(new OLine(p3,p5));
                o->newObject(new OLine(p5,p6));
                o->newObject(new OLine(p6,p7));
                o->newObject(new OLine(p7,p8));
                o->newObject(new OLine(p8,p5));
                
                gomWrite(o,"m2.gom");
                xmlWrite(o,"m2.xml");
                svgWrite(o,"m2.svg");
                
                o->~OHL();
                }
        //modelling based on OHL line structuring
                {
                OHL* o = new OHL();
                
                OHL* o1 = new OHL();
                o1->newObject(new OLine(p3,p2));
                o1->newObject(new OLine(p2,p1));
                o1->newObject(new OLine(p1,p4));
                o1->newObject(new OLine(p4,p3));
                o->newObject(o1);
                
                o->newObject(new OJunction(p3));
                o->newObject(new OLine(p3,p5));
                o->newObject(new OJunction(p5));
                
                OHL* o2 = new OHL();
                o2->newObject(new OLine(p5,p6));
                o2->newObject(new OLine(p6,p7));
                o2->newObject(new OLine(p7,p8));
                o2->newObject(new OLine(p8,p5));
                o->newObject(o2);
                
                gomWrite(o,"m3.gom");
                xmlWrite(o,"m3.xml");
                svgWrite(o,"m3.svg");
                
                o->~OHL();
                }
        //modelling based on OHL line structuring with attributes
                {
                OHL* o = new OHL();
                
                OHL* o1 = new OHL();
                o1->newObject(new OLine(p3,p2));
                o1->newObject(new OLine(p2,p1));
                o1->newObject(new OLine(p1,p4));
                o1->newObject(new OLine(p4,p3));
                o->newObject(o1);
                
                o->newObject(new OJunction(p3));
                o->newObject(new OLine(p3,p5));
                o->newObject(new OJunction(p5));
                
                OHL* o2 = new OHL();
                o2->newObject(new OLine(p5,p6));
                o2->newObject(new OLine(p6,p7));
                o2->newObject(new OLine(p7,p8));
                o2->newObject(new OLine(p8,p5));
                o->newObject(o2);
                
                o->newAttribute(new ALabel("close"));
                o->newAttribute(new ALabel("connect"));
                o->newAttribute(new ALabel("connect"));
                o->newAttribute(new ALabel("close"));

                gomWrite(o,"m3.gom");
                xmlWrite(o,"m3.xml");
                svgWrite(o,"m3.svg");
                o->~OHL();
                }
        //modelling based on OGraph line structuring
                {
                OGraph* o = new OGraph(false); //the graph is undirected
                
                o->newNode(new OLine(p3,p2));
                o->newNode(new OLine(p2,p1));
                o->newNode(new OLine(p1,p4));
                o->newNode(new OLine(p4,p3));
                
                o->newNode(new OLine(p3,p5));
                
                o->newNode(new OLine(p5,p6));
                o->newNode(new OLine(p6,p7));
                o->newNode(new OLine(p7,p8));
                o->newNode(new OLine(p8,p5));
                
                o->newEdge(0,1);
                o->newEdge(1,2);
                o->newEdge(2,3);
                o->newEdge(0,4);
                o->newEdge(3,4);

                o->newEdge(4,5);
                o->newEdge(4,8);
                o->newEdge(5,6);
                o->newEdge(6,7);
                o->newEdge(7,8);
                
                gomWrite(o,"m4.gom");
                xmlWrite(o,"m4.xml");
                svgWrite(o,"m4.svg");
                
                o->~OGraph();
                }
        //modelling based on OGraph line structuring with attributes
                {
                OGraph* o = new OGraph(false); //the graph is undirected
                OLine *l1,*l2,*l3,*l4,*l5,*l6,*l7,*l8,*l9;
                
                o->newNode(l1 = new OLine(p3,p2));
                o->newNode(l2 = new OLine(p2,p1));
                o->newNode(l3 = new OLine(p1,p4));
                o->newNode(l4 = new OLine(p4,p3));
                
                o->newNode(l5 = new OLine(p3,p5));
                
                o->newNode(l6 = new OLine(p5,p6));
                o->newNode(l7 = new OLine(p6,p7));
                o->newNode(l8 = new OLine(p7,p8));
                o->newNode(l9 = new OLine(p8,p5));
                
                o->newEdge(0,1,new AAngle(l1->getAngle(*l2)));
                o->newEdge(1,2,new AAngle(l2->getAngle(*l3)));
                o->newEdge(2,3,new AAngle(l3->getAngle(*l4)));
                o->newEdge(0,4,new AAngle(l5->getAngle(*l1)));
                o->newEdge(3,4,new AAngle(l4->getAngle(*l5)));

                o->newEdge(4,5,new AAngle(l5->getAngle(*l6)));
                o->newEdge(4,8,new AAngle(l5->getAngle(*l9)));
                o->newEdge(5,6,new AAngle(l6->getAngle(*l7)));
                o->newEdge(6,7,new AAngle(l7->getAngle(*l8)));
                o->newEdge(7,8,new AAngle(l8->getAngle(*l9)));
                
                gomWrite(o,"m4.gom");
                xmlWrite(o,"m4.xml");
                svgWrite(o,"m4.svg");
                
                o->~OGraph();
                }
        //modelling based on OGraph/OHL line structuring with attribute
                {
                OGraph* o = new OGraph(false); //the graph is undirected
                
                OHL* o1 = new OHL();
                o1->newObject(new OLine(p3,p2));
                o1->newObject(new OLine(p2,p1));
                o1->newObject(new OLine(p1,p4));
                o1->newObject(new OLine(p4,p3));
                o->newNode(o1);
                
                o->newNode(new OLine(p3,p5));
                
                OHL* o2 = new OHL();
                o2->newObject(new OLine(p5,p6));
                o2->newObject(new OLine(p6,p7));
                o2->newObject(new OLine(p7,p8));
                o2->newObject(new OLine(p8,p5));
                o->newNode(o2);
                
                o->newEdge(0,1,new ALink(ALink.begin,ALink.begin));
                o->newEdge(0,1,new ALink(ALink.end,ALink.begin));

                o->newEdge(1,2,new ALink(ALink.end,ALink.begin));
                o->newEdge(1,2,new ALink(ALink.end,ALink.end));
                
                gomWrite(o,"m4.gom");
                xmlWrite(o,"m4.xml");
                svgWrite(o,"m4.svg");
                o->~OGraph();
                }
        //modelling based on OGraph/OHL line/junction structuring
                {
                OGraph* o = new OGraph(false); //the graph is undirected
                
                OHL* o1 = new OHL();
                o1->newObject(new OLine(p3,p2));
                o1->newObject(new OLine(p2,p1));
                o1->newObject(new OLine(p1,p4));
                o1->newObject(new OLine(p4,p3));
                o->newNode(o1);
                
                o->newNode(new OJunction(p3));
                o->newNode(new OLine(p3,p5));
                o->newNode(new OJunction(p5));
                
                OHL* o2 = new OHL();
                o2->newObject(new OLine(p5,p6));
                o2->newObject(new OLine(p6,p7));
                o2->newObject(new OLine(p7,p8));
                o2->newObject(new OLine(p8,p5));
                o->newNode(o2);
                
                o->newEdge(0,1,new ALink(ALink.begin,ALink.center));
                o->newEdge(0,1,new ALink(ALink.end,ALink.center));

                o->newEdge(1,2,new ALink(ALink.center,ALink.begin));
                o->newEdge(2,3,new ALink(ALink.end,ALink.center));

                o->newEdge(3,4,new ALink(ALink.center,ALink.begin));
                o->newEdge(3,4,new ALink(ALink.center,ALink.end));
                
                gomWrite(o,"m4.gom");
                xmlWrite(o,"m4.xml");
                svgWrite(o,"m4.svg");
                o->~OGraph();
                }
        //to be continues, there are may possible modelling ...
}       //de


//      Request


void ohlRequest1()
{
        OHL *my1,*my2;
        
        my1 = new OHL();

        my1->newObject(new OPoint(1,1));
        my1->newObject(new OPoint(2,2));
        my1->newObject(new OPoint(3,3));

        my2 = new OHL();
        
        my2->newObject(new OPoint(4,4));
        my2->newObject(new OPoint(5,5));
        my2->newObject(new OPoint(6,6));
        my2->newObject(new OHL());

        my1->newObject(my2);

        deque<OGraphic*> ha = my1->readOGraphicArray((string)"OPoint"); //here we search only the OPoint object
        for(int i=0;i<ha.size();i++)
                ha[i]->print();

        ha.clear(); 
        ha = my1->readOGraphicArray((string)"OHL"); //here we search only the OHL object
        for(int j=0;j<ha.size();j++)
                cout << ha[j]->getName() << endl ;

        ha.clear();
        my1->~OHL();
}       //de


void ohlRequest2()
{
        OHL *my1,*my2;
        
        my1 = new OHL();

        my1->newObject(new OPoint(1,1));
        my1->newObject(new ODPoint(2,2));
        my1->newObject(new OPoint(3,3));
        
        my2 = new OHL();        
        my2->newObject(new ODPoint(4,4));
        my2->newObject(new OPoint(5,5));
        my2->newObject(new OPoint(6,6));
        
        my1->newObject(my2);
        my1->print(); cout << endl;

        //here we search only the OPoint object
        deque<OGraphic*> ha1 = my1->readOGraphicArray((string)"OPoint"); 
        
        deque<OGraphic*> ha2;
        for(int i=0;i<ha1.size();i++)
                //here we create an OVPoint array
                ha2.push_back(new OVPoint(i*0.1,i*0.1));

        //here we replace only on the OPoint object by the OVPoint object
        my1->writeOGraphicArray((string)"OPoint",ha2); 
        my1->print(); cout << endl;

        ha1.clear();
        ha2.clear();
        my1->~OHL();
}       //de


void graphRequest1()
{
        node n1,n2; edge e;
        
        OGraph *o1 = new OGraph();
        n1 = o1->newNode(new OPoint(1,1));
        n2 = o1->newNode(new OLine(2,2,3,3));
        e = o1->newEdge(n1,n2,new ALabel("near"));
        o1->print();
        
        OGraph *o2 = new OGraph();
        n1 = o2->newNode(new OPoint(4,4));
        n2 = o2->newNode(new OLine(5,5,6,6));
        e = o2->newEdge(n1,n2,new ALabel("near"));
        o2->print();

        o1->newNode(o2);
        o1->print(); cout << endl;
        
        deque<OGraphic*> a = o1->readOGraphicArray((string)"OPoint");
        printOGraphicArray(a);

        o1->~OGraph();
        a.clear();
}       //de


void graphRequest2()
{
        node n1,n2; edge e;
        
        OGraph *o1 = new OGraph();
        n1 = o1->newNode(new OPoint(1,1));
        n2 = o1->newNode(new OLine(2,2,3,3));
        e = o1->newEdge(n1,n2,new ALabel("near"));
        
        OGraph *o2 = new OGraph();
        n1 = o2->newNode(new OPoint(4,4));
        n2 = o2->newNode(new OLine(5,5,6,6));
        e = o2->newEdge(n1,n2,new ALabel("near"));
        o1->newNode(o2);
        
        o1->print(); cout << endl;

        deque<OGraphic*> a1 = o1->readOGraphicArray((string)"OPoint");
        printOGraphicArray(a1);

        
        deque<OGraphic*> a2;
        for(int i=0;i<a1.size();i++)
                a2.push_back(new OVPoint(i*0.1,i*0.1));
        o1->writeOGraphicArray((string)"OPoint",a2); 
        
        o1->print(); cout << endl;

        o1->~OGraph();
        a1.clear();
        a2.clear();
}       //de



void ohlDynamic()
{
        // write an an object
        OHL *my = new OHL(); OGraphic* p;
        OPoint ptb(50,50),ptc(100,50),pte(100,100);
        p = new OLine(ptb,ptc);
        my->newObject(p);
        p = new OLine(ptc,pte);
        my->newObject(p);
        p = new OPoint(ptc.getX(),ptc.getY());
        my->newObject(p);
        p = new OArc(ptb,ptc,pte,false);
        my->newObject(p);

        deque<OGraphic*> ha = my->readOGraphicArray((string)"OLine"); //here we search only the OLine object
        deque<OLine*> la = castOLineArray(ha); //here we cast the OGraphic array into OLine array
        for(int i=0;i<la.size();i++)
                cout << la[i]->getLength() << endl;

        ha.clear();
        la.clear();
        my->~OHL();
}       //de

//      File test

void fileTest()
{
        OHL *o = new OHL();
        
        OHL *o1 = new OHL();
        o1->newObject(new OGraphicImpl());
        o1->newObject(new OPoint());
        o1->newObject(new ODPoint());
        o1->newObject(new OLPoint());
        o1->newObject(new OVPoint());
        o1->newObject(new OLine());
        o1->newObject(new OArc());
        o1->newObject(new OCurve());
        o1->newObject(new OGraph());
        o1->newObject(new OIPoint());
        o1->newObject(new OExtremity());
        o1->newObject(new OJunction()); 
        o1->newAttribute(new AGraphicImpl());
        o1->newAttribute(new AAngle());
        o1->newAttribute(new ADistance());
        o1->newAttribute(new ALabel());
        o1->newAttribute(new ALink());
        o->newObject(o1);

        OGraph *o2 = new OGraph();
        o2->newNode(new OGraphicImpl());
        o2->newNode(new OPoint());
        o2->newNode(new ODPoint());
        o2->newNode(new OLPoint());
        o2->newNode(new OVPoint());
        o2->newNode(new OLine());
        o2->newNode(new OArc());
        o2->newNode(new OCurve());
        o2->newNode(new OGraph());
        o2->newNode(new OIPoint());
        o2->newNode(new OExtremity());
        o2->newNode(new OJunction());
        o2->newEdge(0,1,new AGraphicImpl());
        o2->newEdge(0,1,new AAngle());
        o2->newEdge(0,1,new ADistance());
        o2->newEdge(0,1,new ALabel());
        o2->newEdge(0,1,new ALink());
        o->newObject(o2);

        o->print();
        gomWrite(o,"res.gom");
        xmlWrite(o,"res.xml");
        o->~OHL();

        OGraphic* r =   gomRead("res.gom");
        cout << endl; cout << endl; r->print();
        r->~OGraphic();
}


Generated on Fri Jul 30 19:21:01 2004 for GOMLib by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001