[C / librairie xlib] Partitionner une fenetre en 4

Partitionner une fenetre en 4 [C / librairie xlib] - C - Programmation

Marsh Posté le 13-05-2004 à 23:02:09    

Salut a tous, je dois réaliser un modeleur 3D en C.
Mon prof m'a obligé à utliser le C pour le faire et je dois donc utliser xlib.
 
En fait, c'est l'interface mon problème :  
 
j'arrive pas gérer independamment les unes des autres 4 régions différentes sur mon interface. Vous pouvez m'aidez please?  
 
Voila mon code :  
void expose()
{
 
   
 new=0;
 if ((fp = fopen("test.txt","r" )) == NULL) {
  printf("Probleme\n" );
 }
 else {
  np=0;
  nl=0;
  while ((fpc = fgetc(fp)) != EOF ) {
         if (fpc == 10 ) {
          /* Fin de ligne */          
          new=0; separator=0;
          }
         else {
          if (new==0) {
       if (fpc != 80 && fpc != 76) {
            fprintf (stderr, "Ni P ni L\n" );
            }
           else {                           /*differentitation d'une ligne point d'une ligne arete*/
             fprintf (stderr, " \n" );
            if(fpc == 80) {                                      
         ltype='P'; np=np+1;
         if (np>npm) {
          fprintf (stderr, "Trop de points \n" );         /*Trop de points rentrés*/
          exit(0);
          }
         npa=np;
                     }
            else {
             ltype='L';nl=nl+1;
         if (np>nlm) {
          fprintf (stderr, "Trop de lignes \n" );        /*Trop de lignes rentrees*/
          exit(0);
          }
             nla=nl;              
         }
            new=1;separator=0;
            }
           }
          else {  
           if (ltype=='P') {
        if (fpc==';') {separator=separator+1;
         }                    
        else {
         if (fpc<'0'|| fpc>'9') {
          fprintf(stderr, "Error point %d\n",np);      
          }
          else {                                   /*Analyse des points*/
          fpn=fpc-48;          
          switch (separator) {
           case 0: px[np]=px[np]*10+fpn;break;
           case 1: py[np]=py[np]*10+fpn;break;
           case 2: pz[np]=pz[np]*10+fpn;break;}          
          }
         }            
            }
           
               else {  
            if (fpc==';') {separator=separator+1;
          }
            else {
             if (fpc<'0' || fpc>'9' && fpc==76){
              fprintf(stderr, "Error ligne \n" );
          }
         else {                                       /*Analyse des aretes*/  
          fpn=fpc-48;          
          switch (separator){
           case 0: A[nl]= A[nl]*10+fpn;break;
                                 case 1: B[nl]= B[nl]*10+fpn;break;}
                               }
               }  
        }
      }
  }
 }
}
 
 
 np=1;
 while (np<=npa) {
  printf("Point %d x=%d y=%d z=%d\n", np, px[np], py[np], pz[np]);np=np+1;}
 np=1;
 while(np<=npa){
 
  //coordonnees en cm dans le repere de l'ecran//
 
   x2d[np]=px[np]*d/pz[np];
   y2d[np]=py[np]*d/pz[np];
 
         //coordonnes en pixel dans le repere de l'ecran//
 
       
   xe[np]=x2d*DisplayWidth(display,screen)/DisplayWidthMM(display,screen);
   ye[np]=y2d*DisplayHeight(display,screen)/DisplayHeightMM(display,screen);
   Xe[np]=xe[np];
   Ye[np]=ye[np];
   
 
  printf("Nouvelles coordonnees: Xe=%d Ye=%d\n",Xe[np],Ye[np]);
  np=np+1;}
 nl=1;  
 for (nl=1;nl<=nla;nl++){  
 printf("Ligne %d A=%d B=%d\n",nl,A[nl],B[nl]);
  if (A[nl]>npa || B[nl]>npa) {  
     printf("les points %d et %d n'existent pas\n",A[nl],B[nl]);
     }
  else {    
   np1= A[nl]; np2= B[nl];
   int line_width=0;
   
   XSetLineAttributes(display, gc, line_width, line_style, cap_style, join_style);    
   XDrawLine(display, mother, gc, px[np1],py[np1], px[np2],py[np2]);
   XDrawLine(display, mother, gc, px[np1]+ DisplayWidth(display,screen)/2,pz[np1], px[np2]+ DisplayWidth(display,screen)/2,pz[np2]); /*fenetre 2, vue de dessus*/
   XDrawLine(display, mother, gc, py[np1],pz[np1]+DisplayHeight(display,screen)/2, py[np2],pz[np2]+DisplayHeight(display,screen)/2);/*fenetre vue de cote*/
   XDrawLine(display, mother, gc, x2d[np1],y2d[np1],x2d[np2],y2d[np2]);}}
   
 
   
   
  /***Creation de qà3ã@e regions de la fenetre******************/  
 int line_width=3;  
  XSetLineAttributes(display, gc, line_width, line_style, cap_style, join_style);
 XDrawLine(display, mother,gc,DisplayWidth(display,screen)/2 ,0, DisplayWidth(display,screen)/2,DisplayHeight(display, screen));
   
 XDrawLine(display, mother,gc,0,DisplayHeight(display,screen)/2, DisplayWidth(display,screen),DisplayHeight(display, screen)/2);
   
   
/*****************creation titres des fenetres*************************/
   line_width=0;
 XSetLineAttributes(display, gc, line_width, line_style, cap_style, join_style);  
 /*XDrawRectangle(display, mother, gc,DisplayWidth(display,screen)/8,0,DisplayHeight(display, screen)/4,15);
 XDrawRectangle(display, mother, gc,5*DisplayWidth(display,screen)/8,0,DisplayHeight(display, screen)/4,15);
 XDrawRectangle(display, mother, gc,DisplayWidth(display,screen)/8,DisplayHeight(display, screen)/2,   DisplayHeight(display, screen)/4,15);
 XDrawRectangle(display, mother, gc,5*DisplayWidth(display,screen)/8,DisplayHeight(display, screen)/2,DisplayHeight(display, screen)/4,15);*/
 XDrawString(display, mother, gc, DisplayWidth(display,screen)/8,14,"vue de face",11);
 XDrawString(display, mother, gc, 5*DisplayWidth(display,screen)/8,14,"vue de dessus",13);
 XDrawString(display, mother, gc, DisplayWidth(display,screen)/8,DisplayHeight(display, screen)/2+14,"vue de cote",11);
 XDrawString(display, mother, gc, 5*DisplayWidth(display,screen)/8,DisplayHeight(display, screen)/2+14,"vue perspective",15);
   
 
 fclose(fp);
 
   }

Reply

Marsh Posté le 13-05-2004 à 23:02:09   

Reply

Marsh Posté le 14-05-2004 à 09:15:41    

Modifie ton message et utilise les balises code C pour rendre ton code plus lisible déjà ;)

Reply

Marsh Posté le 14-05-2004 à 22:33:01    

Ya et puis, la methode la plus simple pour decouper une zone de travail en X11: creer des window, ce n'est pas le meme comportement qu'en Win32. Une Window sous X11 est l'objet de base des tout les objet graphiques.
 
Donc tu decoupe ta fenetre en 4 en utilisant ces Window et ensuite tu les geres une par une.
 
N'empeche faire un modeleur 3D, en C en utilisant que des primitives X11 ... ta pas finit mon gars, parce que la xlib elle fournit vraiment pas grand chose et c'est peu de le dire. Le temps que tu fasse tes widget et tout tu risque de jamais commencer le vrai boulot (vues en 3D etc)
 
S'il faut rester en C utilise les libraires Glib >= 2.2, GTK+ >=2.2 (+ GtkGl2.0 si tu peut le faire passer). Ou les equivalent en Gtk+ 1 mais la ca date.
 
Pare que vu le temps necessaire pour faire une application tout con en X11 (parcours de graphes pour ne pas le nommer n'ayant besoin que d'affichage) je sais par experience que tu va passer plus de temps a debogguer l'interface X11 qu'a reellement bosser sur ton modeleur.
Deplus la libraire Gtk, il lui a fallut un temps certain pour commencer a arriver a maturité hein.

Reply

Marsh Posté le 15-05-2004 à 13:45:13    

oué je commence a m'en rendre compte mais j'ai pas le choix  :cry: je suis obligé d'utiliser xlib  :cry:  
Enfin j'ai trouvé la solution merci de votre aide.
P.S. délsolé pour le code mal indenté  :sweat:  je connaissais pas les balises C...  :)  
 
En tout cas merci de vos réponses  :hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed