drawMergeEntity.c File Reference

#include "drawMergeEntity.h"
#include "GetProperty.h"
#include "Xcall1.h"
#include "MALLOC.h"
#include "sciprint.h"
#include "axesScale.h"
#include "PloEch.h"
#include "periScreen.h"
#include "drawMarks.h"
#include "Plo3d.h"
#include "Champ.h"
#include "handleDrawing/drawSegsEntity.h"

Include dependency graph for drawMergeEntity.c:

Go to the source code of this file.

Functions

int drawMergeEntity (sciPointObj *pObj)
double C2F() dsort ()
void DrawMerge3d (sciPointObj *psubwin, sciPointObj *pmerge, int *DPI)
void retrieveFacetVertices (sciPointObj *pobj, int facetIndex, double verticesX[], double verticesY[], double verticesZ[], double **zOriginal)


Function Documentation

void DrawMerge3d ( sciPointObj psubwin,
sciPointObj pmerge,
int DPI 
)

Definition at line 36 of file drawMergeEntity.c.

References sciSubWindow::axes, C2F, close(), sciSurface::color, computeArrowColor(), computeGridMinGap(), computeRealArrowSize(), dr(), DrawMarks3D(), DrawNewMarks(), dsort(), sciSurface::flag, sciSubWindow::FRect, FREE, sciMerge::from_entity, getLongestVector(), i, iflag, sciSegs::iflag, ik, index, sciMerge::index_in_entity, inint, InvAxis(), j, j2, l, L, sciSubWindow::logflags, MALLOC, Max, MaybeSetWinhdc(), N, sciMerge::N, n1, sciPolyline::n1, n2, sciSegs::Nbr1, sciSegs::Nbr2, sciSurface::nc, NULL, p, PD0, PI0, sciPolyline::plot, plot(), pMERGE_FEATURE, pPOLYLINE_FEATURE, pRECTANGLE_FEATURE, pSEGS_FEATURE, sciSegs::pstyle, pSUBWIN_FEATURE, pSURFACE_FEATURE, sciSegs::ptype, sciPolyline::pvx, sciPolyline::pvy, sciPolyline::pvz, ReleaseWinHdc(), retrieveFacetVertices(), AXES::reverse, ReverseDataFor3D(), SCI_PLOT3D, SCI_POLYLINE, SCI_RECTANGLE, SCI_SEGS, SCI_SUBWIN, SCI_SURFACE, sciGetBackground(), sciGetEntityType(), sciGetForeground(), sciGetGoodIndex(), sciGetIsFilled(), sciGetIsLine(), sciGetIsMark(), sciGetLineStyle(), sciGetLineWidth(), sciGetMarkForeground(), sciGetMarkSize(), sciGetMarkStyle(), sciGetPointerFromHandle(), sciGetRealVisibility(), scilab_shade(), sciprint(), str, trans3d(), TRUE, TRZ, sciSegs::typeofchamp, v, sciSegs::vfx, sciSegs::vfy, sciSegs::vfz, sciSegs::vx, sciSegs::vy, sciSegs::vz, X, x, y, Z, and z.

Referenced by drawMergeEntity().

00037 {
00038   int N,i,j,index,p,max_p,n1,npoly;
00039   double * dist;
00040   double X[5],Y[5],Z[5];
00041   double * Zoriginal = NULL; /* used to conserve Z wether or not z axis is reversed ! (see plo3dn.c) */
00042   double * x = NULL ;
00043   double * y = NULL ;
00044   double * z = NULL ;
00045   sciPointObj *pobj; 
00046   int *locindex;
00047   int *polyx,*polyy,fill[20];/* here we suppose there is no more than 20 edge in a facet */
00048   int k1,iflag;
00049   int pstyle = 0;
00050   int whiteid,verbose=0,narg;
00051   static double zmin,zmax,xmoy,ymoy,zmoy,zl;
00052   int context[6];
00053 
00054 
00055   sciSubWindow * ppsubwin = pSUBWIN_FEATURE (psubwin);
00056   sciMerge     * ppMerge  = pMERGE_FEATURE (pmerge) ;
00057   int u;
00058   /* change to static arrays : indeed, no need to recopy each time the entire data of a given object */
00059   double   xtmp[2] ; 
00060   double   ytmp[2] ;
00061   double   ztmp[4] ;
00062 
00063   double * verticesX = NULL ; /* normally max size is 4 for facets (2 for lines and segs) but may be one day we will manage greater complex patchs (that is why the 10) */
00064   double * verticesY = NULL ;  /* no it can have any size, but display of facets with more than 4 edges might not be accurate */
00065   double * verticesZ = NULL ;
00066 
00067 #ifdef _MSC_VER 
00068   int hdcflag;
00069 #endif
00070 
00071   if(sciGetEntityType (psubwin) != SCI_SUBWIN) return;
00072   N = ppMerge->N ; /* total number of elements */
00073 
00074   dist     = MALLOC( N * sizeof(double) ) ;
00075   locindex = MALLOC( N * sizeof(int   ) ) ;
00076 
00077   if ( dist == NULL || locindex == NULL )
00078   {
00079     FREE( dist ) ;
00080     FREE( locindex ) ;
00081     sciprint("DrawMerge3d : MALLOC No more Place\n");
00082     return;
00083   }
00084 
00085   /* ========================================================================
00086   * compute drawing order (painter algorithm) *
00087   may be moved into Merge3d
00088   * ========================================================================*/
00089   max_p=0; /* the maximum number of edge in a facet */
00090   for ( i =0 ; i < N ; i++) { /* loop on element*/
00091     pobj=(sciPointObj *) sciGetPointerFromHandle (ppMerge->from_entity[i]);
00092     index = ppMerge->index_in_entity[i];
00093 
00094     /*compute element coordinates */
00095     switch (sciGetEntityType (pobj)) {  
00096     case SCI_SURFACE:
00097       if (pSURFACE_FEATURE (pobj)->typeof3d == SCI_PLOT3D) { /* x,y,Z */
00098         int l,k,n1_,n2;
00099 
00100         n1_= pSURFACE_FEATURE (pobj)->dimzx;
00101         n2= pSURFACE_FEATURE (pobj)->dimzy;
00102         l=(int)(index/(n1_-1));
00103         k=index-l*(n1_-1);
00104 
00105         xtmp[0] = pSURFACE_FEATURE (pobj)->pvecx[k];
00106         xtmp[1] = pSURFACE_FEATURE (pobj)->pvecx[k+1];
00107 
00108         /* I didn't use ReverseDataFor3D because dim n1 is not the same for x, y and z  */
00109         if(ppsubwin->axes.reverse[0] == TRUE){
00110           /* agir sur x */
00111           if(ppsubwin->logflags[0]=='l'){
00112             for(u=0;u<2;u++){
00113               xtmp[u] = log10(xtmp[u]);
00114               xtmp[u] = InvAxis(ppsubwin->FRect[0],ppsubwin->FRect[2],xtmp[u]);
00115               xtmp[u] = exp10(xtmp[u]);
00116             }
00117           }
00118           else {
00119             xtmp[0] = InvAxis(ppsubwin->FRect[0],ppsubwin->FRect[2],xtmp[0]);
00120             xtmp[1] = InvAxis(ppsubwin->FRect[0],ppsubwin->FRect[2],xtmp[1]);
00121           }
00122         }
00123 
00124         ytmp[0] = pSURFACE_FEATURE (pobj)->pvecy[l];
00125         ytmp[1] = pSURFACE_FEATURE (pobj)->pvecy[l+1];
00126 
00127         if(ppsubwin->axes.reverse[1] == TRUE){ 
00128           /* agir sur y */
00129           if(ppsubwin->logflags[1]=='l'){
00130             for(u=0;u<2;u++){
00131               ytmp[u] = log10(ytmp[u]);
00132               ytmp[u] = InvAxis(ppsubwin->FRect[1],ppsubwin->FRect[3],ytmp[u]);
00133               ytmp[u] = exp10(ytmp[u]);
00134             }
00135           }
00136           else{
00137             ytmp[0] = InvAxis(ppsubwin->FRect[1],ppsubwin->FRect[3],ytmp[0]);
00138             ytmp[1] = InvAxis(ppsubwin->FRect[1],ppsubwin->FRect[3],ytmp[1]);
00139           }
00140         }
00141 
00142         ztmp[0] = pSURFACE_FEATURE (pobj)->pvecz[k+l*n1_];
00143         ztmp[1] = pSURFACE_FEATURE (pobj)->pvecz[k+l*n1_+n1_];
00144         ztmp[2] = pSURFACE_FEATURE (pobj)->pvecz[k+l*n1_+n1_+1];
00145         ztmp[3] = pSURFACE_FEATURE (pobj)->pvecz[k+l*n1_+1];
00146 
00147 
00148         if(ppsubwin->axes.reverse[2] == TRUE){ 
00149           /* agir sur z */
00150           if(ppsubwin->logflags[2]=='l'){
00151             for(u=0;u<4;u++){
00152               ztmp[u] = log10(ztmp[u]);
00153               ztmp[u] = InvAxis(ppsubwin->FRect[4],ppsubwin->FRect[5],ztmp[u]);
00154               ztmp[u] = exp10(ztmp[u]);
00155             }
00156           }
00157           else{
00158             for(u=0;u<4;u++)
00159               ztmp[u] = InvAxis(ppsubwin->FRect[4],ppsubwin->FRect[5],ztmp[u]);
00160           }
00161         }
00162 
00163         n2= pSURFACE_FEATURE (pobj)->dimzy;
00164         X[0]=X[1]=xtmp[0];
00165         X[2]=X[3]=xtmp[1];
00166 
00167         Z[0]=ztmp[0];
00168         Z[1]=ztmp[1];
00169         Z[2]=ztmp[2];
00170         Z[3]=ztmp[3];
00171 
00172         Y[0]=Y[3]=ytmp[0];
00173         Y[1]=Y[2]=ytmp[1];
00174 
00175         Zoriginal = &(pSURFACE_FEATURE (pobj)->pvecz[k+l*n1_]);
00176 
00177         p=4;
00178         x=X;y=Y;z=Z;
00179 
00180       }
00181       else
00182       {
00183         /* facets */
00184         p = pSURFACE_FEATURE (pobj)->dimzx; /* number of edges in the facets */
00185 
00186         verticesX = MALLOC( p * sizeof(double) ) ;
00187         verticesY = MALLOC( p * sizeof(double) ) ;
00188         verticesZ = MALLOC( p * sizeof(double) ) ;
00189 
00190         if ( verticesX == NULL || verticesY == NULL || verticesZ == NULL )
00191         {
00192           FREE(verticesX) ;
00193           FREE(verticesY) ;
00194           FREE(verticesZ) ;
00195           sciprint( "sciDrawObj: Unable to allocate temporary vector, memory full.\n" ) ;
00196           return ;
00197         }
00198 
00199         retrieveFacetVertices( pobj, index, verticesX, verticesY, verticesZ, &Zoriginal ) ;
00200 
00201         x = verticesX ;
00202         y = verticesY ;
00203         z = verticesZ ;
00204 
00205       }
00206       break;
00207     case  SCI_POLYLINE:
00208       {
00209         sciPolyline * ppPolyLine = pPOLYLINE_FEATURE (pobj) ;
00210         n1 = ppPolyLine->n1 ;
00211         p  = 0 ;
00212         if ( sciGetIsMark(pobj) ) { p = 1 ; } /* F.Leray 20.01.05 A REVOIR ICI*/
00213         if ( sciGetIsLine(pobj) ) { p = 2 ; }
00214 
00215         if ( ppPolyLine->plot != 2 && sciGetIsMark(pobj) == 1 )
00216         {
00217           xtmp[0] = ppPolyLine->pvx[index];
00218           xtmp[1] = xtmp[0] ;
00219 
00220           ytmp[0] = ppPolyLine->pvy[index];
00221           ytmp[1] = ytmp[0] ; /* used by trans3d + drawing : case 0,1 and 4 */
00222 
00223           if( ppPolyLine->pvz != NULL )
00224           {
00225             ztmp[0] = ppPolyLine->pvz[index];
00226             ztmp[1] = ztmp[0];
00227           }
00228         }
00229         else
00230         {
00231           xtmp[0] = ppPolyLine->pvx[index];
00232           xtmp[1] = ppPolyLine->pvx[index+1];
00233 
00234           ytmp[0] = ppPolyLine->pvy[index];
00235           ytmp[1] = ppPolyLine->pvy[index+1]; /* used by trans3d + drawing : case 0,1 and 4 */
00236           if( ppPolyLine->pvz != NULL )
00237           {
00238             ztmp[0] = ppPolyLine->pvz[index];
00239             ztmp[1] = ppPolyLine->pvz[(index+1)%n1];
00240           }
00241         }
00242 
00243         if( ppPolyLine->pvz != NULL )
00244         {
00245           ReverseDataFor3D(psubwin,xtmp,ytmp,ztmp,2);
00246         }
00247         else
00248         {
00249           ReverseDataFor3D(psubwin,xtmp,ytmp,(double *) NULL,2);
00250         }
00251 
00252         switch ( ppPolyLine->plot )
00253         {
00254         case 0: case 1: case 4: /*linear interpolation */
00255           x=&(xtmp[0]);
00256           y=&(ytmp[0]);
00257           if ( ppPolyLine->pvz != (double *) NULL) 
00258             z=&(ztmp[0]);
00259           else
00260             z=(double *)NULL;
00261           break;
00262         case 2: /* staircase */ /* just for completion  */
00263           X[0]=xtmp[0];
00264           X[1]=xtmp[1];
00265           Y[0]=ytmp[0];
00266           Y[1]=ytmp[0];
00267           if (ppPolyLine->pvz != (double *) NULL) {
00268             Z[0]=ztmp[0];
00269             Z[1]=ztmp[0];
00270             z=Z;
00271           }
00272           else 
00273             z=(double *)NULL;
00274           x=X;y=Y;
00275           break;
00276         case 3 : /* vertical bar */ /* just for completion  */
00277           X[0]=xtmp[0];
00278           X[1]=xtmp[0];
00279           Y[0]=0.0;
00280           if(ppsubwin->logflags[1]=='l') /* when logscale on Y, special treatment because we can not have Y == 0 */
00281             Y[0] = ppsubwin->FRect[1];
00282           Y[1]=ytmp[0];
00283           if ( ppPolyLine->pvz != (double *) NULL) {
00284             Z[0]=ztmp[0];
00285             Z[1]=ztmp[0];
00286             z=Z;
00287           }
00288           else 
00289             z=(double *)NULL;
00290           x=X;y=Y;
00291           break;
00292         case 5: /* patch */
00293           x=xtmp;
00294           y=ytmp;
00295           if ( ppPolyLine->pvz != (double *) NULL)
00296             z=ztmp;
00297           else
00298             z= (double *) NULL;
00299           break;
00300         }
00301       }
00302       break;
00303     case  SCI_SEGS:
00304       {
00305         sciSegs * ppSegs = pSEGS_FEATURE(pobj) ;
00306         p = 2;
00307       /***************/
00308         if ( ppSegs->ptype == 0 )
00309         {
00310           xtmp[0] = ppSegs->vx[2*index];
00311           xtmp[1] = ppSegs->vx[2*index+1];
00312 
00313           ytmp[0] = ppSegs->vy[2*index];
00314           ytmp[1] = ppSegs->vy[2*index+1];
00315 
00316           if( ppSegs->vz != NULL )
00317           {
00318             ztmp[0] = ppSegs->vz[2*index];
00319             ztmp[1] = ppSegs->vz[2*index+1];
00320           }
00321 
00322         }
00323         else
00324         {
00325           /* vx is size n1, vy n2 and vfx and vfy n1 x n2 */
00326           int column = index / ppSegs->Nbr1 ;
00327           int row    = index - column * ppSegs->Nbr1 ; 
00328           double maxGap = 0.707 * computeGridMinGap( ppSegs->vx, ppSegs->vy, ppSegs->Nbr1, ppSegs->Nbr2 ) ;
00329 
00330           xtmp[0] = ppSegs->vx[row] ;
00331           ytmp[0] = ppSegs->vy[column] ;
00332 
00333           if (ppSegs->typeofchamp == 0 )
00334           {
00335             double maxNorm = getLongestVector( ppSegs->vfx, ppSegs->vfy, ppSegs->Nbr1, ppSegs->Nbr2, 1.0, 1.0 ) ;
00336             xtmp[1] = ppSegs->vx[row]    + maxGap * ppSegs->vfx[index] / maxNorm ;
00337             ytmp[1] = ppSegs->vy[column] + maxGap * ppSegs->vfy[index] / maxNorm ;
00338           }
00339           else
00340           {
00341             /* colored */
00342             double norm = sqrt( ppSegs->vfx[index] * ppSegs->vfx[index] + ppSegs->vfy[index] * ppSegs->vfy[index] ) ;
00343             xtmp[1] = ppSegs->vx[row]    + maxGap * ppSegs->vfx[index] / norm ;
00344             ytmp[1] = ppSegs->vy[column] + maxGap * ppSegs->vfy[index] / norm ; ;
00345           }
00346 
00347 
00348           if( ppSegs->vz != NULL )
00349           {
00350             ztmp[0] = ppSegs->vz[row] ;
00351             ztmp[1] = ppSegs->vz[row] + ppSegs->vfz[index] ;
00352           }
00353 
00354         }
00355 
00356         if( ppSegs->vz != NULL )
00357         {
00358           ReverseDataFor3D(psubwin,xtmp,ytmp,ztmp,2);
00359         }
00360         else
00361         {
00362           ReverseDataFor3D(psubwin,xtmp,ytmp, NULL,2);
00363         }
00364         /**************/
00365 
00366         X[0]=xtmp[0];
00367         X[1]=xtmp[1];
00368         Y[0]=ytmp[0];
00369         Y[1]=ytmp[1];
00370         if ( ppSegs->vz != (double *) NULL) {
00371           Z[0]=ztmp[0];
00372           Z[1]=ztmp[1];
00373           z=Z;
00374         }
00375         else
00376         {
00377           z=(double *)NULL;
00378         }
00379         x=X;y=Y;
00380       }
00381       break;
00382     case  SCI_RECTANGLE: 
00383       {
00384         double rectx[4],recty[4],rectz[4];
00385         p = 5;
00386 
00387         rectx[0]= rectx[3] =pRECTANGLE_FEATURE (pobj)->x;
00388         rectx[1]= rectx[2] =pRECTANGLE_FEATURE (pobj)->x+pRECTANGLE_FEATURE (pobj)->width;   
00389         recty[0]= recty[1] =pRECTANGLE_FEATURE (pobj)->y;   
00390         recty[2]= recty[3] =pRECTANGLE_FEATURE (pobj)->y-pRECTANGLE_FEATURE (pobj)->height;
00391         rectz[0]= rectz[1]=rectz[2]= rectz[3]=pRECTANGLE_FEATURE (pobj)->z;
00392 
00393         ReverseDataFor3D(psubwin, rectx, recty, rectz, 4);
00394 
00395         X[0]=X[1]=X[4]=rectx[0];
00396         Y[0]=Y[3]=Y[4]=recty[0];
00397         X[2]=X[3]=rectx[1];
00398         Y[1]=Y[2]=recty[2];
00399         Z[0]=Z[1]=Z[2]=Z[3]=Z[4]=rectz[0];
00400         x=X;y=Y;z=Z; 
00401       }
00402       break;
00403     default:
00404       p = 0;
00405     }
00406     /* each element is represented by its barycenter */
00407     xmoy=0.0;ymoy=0.0;zmoy=0.0;
00408     if (z != (double *)NULL) {
00409       for ( j= 0 ; j < p ; j++) {
00410         xmoy += x[j];  ymoy += y[j];  zmoy += z[j];
00411       }
00412     }
00413     else {
00414       for ( j= 0 ; j < p ; j++) {
00415         xmoy += x[j];  ymoy += y[j];
00416       }
00417     }
00418     /* Compute the distance from the observer */
00419     dist[i]=  TRZ(xmoy/p,ymoy/p,zmoy/p);
00420     max_p=Max(max_p,p);
00421 
00422   } /* END of FOR here F.Leray 01.12.04 */
00423 
00424   /* sort the distance in decreasing order */
00425   C2F(dsort)(dist,&N,locindex); 
00426 
00427   FREE(verticesX) ;
00428   FREE(verticesY) ;
00429   FREE(verticesZ) ;
00430 
00431   /* ========================================================================
00432   * draw each element in the order given by locindex
00433   * ========================================================================*/
00434   C2F(dr)("xget","lastpattern",&verbose,&whiteid,&narg,PI0,PI0,PI0,PD0,PD0,PD0,PD0,0L,0L);
00435 
00436   zmin = pSUBWIN_FEATURE (psubwin)->SRect[4];
00437   zmax = pSUBWIN_FEATURE (psubwin)->SRect[5];
00438 
00439   polyx = MALLOC( (max_p+1) * sizeof(int) ) ;
00440   polyy = MALLOC( (max_p+1) * sizeof(int) ) ;
00441 
00442   if ( polyx == NULL || polyy == NULL )
00443   {
00444     FREE( polyx ) ;
00445     FREE( polyy ) ;
00446     FREE( dist ) ;
00447     FREE( locindex ) ;
00448     sciprint("DrawMerge3d : MALLOC No more Place\n");
00449 
00450     return;
00451   }
00452 
00453   npoly=1; 
00454   for ( i = N ; i>0 ; i--) { /* loop on elements */
00455     int j2,nok;
00456     j2=locindex[i-1]-1;
00457     index= ppMerge->index_in_entity[j2];
00458     pobj=(sciPointObj *) sciGetPointerFromHandle (ppMerge->from_entity[j2]);
00459     if ( sciGetRealVisibility(pobj) ) {
00460       /* build the element coordinates */
00461       switch (sciGetEntityType (pobj)) {  
00462       case SCI_SURFACE:
00463         if (pSURFACE_FEATURE (pobj)->typeof3d == SCI_PLOT3D) { /* x,y,Z */
00464           int l,k,n1_,n2;
00465 
00466           n1_= pSURFACE_FEATURE (pobj)->dimzx;
00467           n2= pSURFACE_FEATURE (pobj)->dimzy;
00468           l=(int)(index/(n1_-1));
00469           k=index-l*(n1_-1);
00470 
00471           xtmp[0] = pSURFACE_FEATURE (pobj)->pvecx[k];
00472           xtmp[1] = pSURFACE_FEATURE (pobj)->pvecx[k+1];
00473 
00474           /* I didn't use ReverseDataFor3D because dim n1 is not the same for x, y and z  */
00475           if(ppsubwin->axes.reverse[0] == TRUE){
00476             /* agir sur x */
00477             if(ppsubwin->logflags[0]=='l'){
00478               for(u=0;u<2;u++){
00479                 xtmp[u] = log10(xtmp[u]);
00480                 xtmp[u] = InvAxis(ppsubwin->FRect[0],ppsubwin->FRect[2],xtmp[u]);
00481                 xtmp[u] = exp10(xtmp[u]);
00482               }
00483             }
00484             else {
00485               xtmp[0] = InvAxis(ppsubwin->FRect[0],ppsubwin->FRect[2],xtmp[0]);
00486               xtmp[1] = InvAxis(ppsubwin->FRect[0],ppsubwin->FRect[2],xtmp[1]);
00487             }
00488           }
00489 
00490           ytmp[0] = pSURFACE_FEATURE (pobj)->pvecy[l];
00491           ytmp[1] = pSURFACE_FEATURE (pobj)->pvecy[l+1];
00492 
00493           if(ppsubwin->axes.reverse[1] == TRUE){ 
00494             /* agir sur y */
00495             if(ppsubwin->logflags[1]=='l'){
00496               for(u=0;u<2;u++){
00497                 ytmp[u] = log10(ytmp[u]);
00498                 ytmp[u] = InvAxis(ppsubwin->FRect[1],ppsubwin->FRect[3],ytmp[u]);
00499                 ytmp[u] = exp10(ytmp[u]);
00500               }
00501             }
00502             else{
00503               ytmp[0] = InvAxis(ppsubwin->FRect[1],ppsubwin->FRect[3],ytmp[0]);
00504               ytmp[1] = InvAxis(ppsubwin->FRect[1],ppsubwin->FRect[3],ytmp[1]);
00505             }
00506           }
00507 
00508           ztmp[0] = pSURFACE_FEATURE (pobj)->pvecz[k+l*n1_];
00509           ztmp[1] = pSURFACE_FEATURE (pobj)->pvecz[k+l*n1_+n1_];
00510           ztmp[2] = pSURFACE_FEATURE (pobj)->pvecz[k+l*n1_+n1_+1];
00511           ztmp[3] = pSURFACE_FEATURE (pobj)->pvecz[k+l*n1_+1];
00512 
00513 
00514           if(ppsubwin->axes.reverse[2] == TRUE){ 
00515             /* agir sur z */
00516             if(ppsubwin->logflags[2]=='l'){
00517               for(u=0;u<4;u++){
00518                 ztmp[u] = log10(ztmp[u]);
00519                 ztmp[u] = InvAxis(ppsubwin->FRect[4],ppsubwin->FRect[5],ztmp[u]);
00520                 ztmp[u] = exp10(ztmp[u]);
00521               }
00522             }
00523             else{
00524               for(u=0;u<4;u++)
00525                 ztmp[u] = InvAxis(ppsubwin->FRect[4],ppsubwin->FRect[5],ztmp[u]);
00526             }
00527           }
00528 
00529           n2= pSURFACE_FEATURE (pobj)->dimzy;
00530           X[0]=X[1]=xtmp[0];
00531           X[2]=X[3]=xtmp[1];
00532           Z[0]=ztmp[0];
00533           Z[1]=ztmp[1];
00534           Z[2]=ztmp[2];
00535           Z[3]=ztmp[3];
00536 
00537           Y[0]=Y[3]=ytmp[0];
00538           Y[1]=Y[2]=ytmp[1];
00539 
00540           Zoriginal = &(pSURFACE_FEATURE (pobj)->pvecz[k+l*n1_]);
00541 
00542           p=4;
00543           x=X;y=Y;z=Z;
00544 
00545         }
00546         else
00547         {
00548           /* facets */
00549           p = pSURFACE_FEATURE (pobj)->dimzx; /* number of edges in the facets */
00550 
00551           verticesX = MALLOC( p * sizeof(double) ) ;
00552           verticesY = MALLOC( p * sizeof(double) ) ;
00553           verticesZ = MALLOC( p * sizeof(double) ) ;
00554 
00555           if ( verticesX == NULL || verticesY == NULL || verticesZ == NULL )
00556           {
00557             FREE(verticesX) ;
00558             FREE(verticesY) ;
00559             FREE(verticesZ) ;
00560             sciprint( "sciDrawObj: Unable to allocate temporary vector, memory full.\n" ) ;
00561             return ;
00562           }
00563 
00564           retrieveFacetVertices( pobj, index, verticesX, verticesY, verticesZ, &Zoriginal ) ;
00565 
00566           x = verticesX ;
00567           y = verticesY ;
00568           z = verticesZ ;
00569         }
00570         break;
00571       case  SCI_POLYLINE:
00572         {
00573           sciPolyline * ppPolyLine = pPOLYLINE_FEATURE( pobj ) ;
00574           n1 = ppPolyLine->n1 ;
00575           p=0;
00576           if ( sciGetIsMark( pobj ) ) { p=1 ; } /* F.Leray 20.01.05 A REVOIR ICI*/
00577           if ( sciGetIsLine( pobj ) ) { p=2 ; }
00578 
00579           /* check if we want to draw segments or marks */
00580           if ( ppPolyLine->plot != 2 && sciGetIsMark(pobj) == 1 )
00581           {
00582             xtmp[0] = ppPolyLine->pvx[index];
00583             xtmp[1] = xtmp[0] ;
00584 
00585             ytmp[0] = ppPolyLine->pvy[index];
00586             ytmp[1] = ytmp[0] ; /* used by trans3d + drawing : case 0,1 and 4 */
00587             if(ppPolyLine->pvz != NULL)
00588             {
00589               ztmp[0] = ppPolyLine->pvz[index];
00590               ztmp[1] = ztmp[0] ;
00591             }
00592           }
00593           else
00594           {
00595             xtmp[0] = ppPolyLine->pvx[index];
00596             xtmp[1] = ppPolyLine->pvx[index+1];
00597 
00598             ytmp[0] = ppPolyLine->pvy[index];
00599             ytmp[1] = ppPolyLine->pvy[index+1]; /* used by trans3d + drawing : case 0,1 and 4 */
00600 
00601             if(ppPolyLine->pvz != NULL)
00602             {
00603               ztmp[0] = ppPolyLine->pvz[index];
00604               ztmp[1] = ppPolyLine->pvz[(index+1)%n1];
00605             }
00606           }
00607 
00608           if(ppPolyLine->pvz != NULL)
00609             ReverseDataFor3D(psubwin,xtmp,ytmp,ztmp,2);
00610           else
00611             ReverseDataFor3D(psubwin,xtmp,ytmp,(double *) NULL,2);
00612 
00613           switch (ppPolyLine->plot) {
00614       case 0: case 1: case 4: /*linear interpolation */
00615         x=&(xtmp[0]);
00616         y=&(ytmp[0]);
00617         if (ppPolyLine->pvz != (double *) NULL) 
00618           z=&(ztmp[0]);
00619         else
00620           z=(double *)NULL;
00621         break;
00622       case 2: /* staircase */ /* just for completion  */
00623         X[0]=xtmp[0];
00624         X[1]=xtmp[1];
00625         Y[0]=ytmp[0];
00626         Y[1]=ytmp[0];
00627         if (ppPolyLine->pvz != (double *) NULL) {
00628           Z[0]=ztmp[0];
00629           Z[1]=ztmp[0];
00630           z=Z;
00631         }
00632         else 
00633           z=(double *)NULL;
00634         x=X;y=Y;
00635         break;
00636       case 3 : /* vertical bar */ /* just for completion  */
00637         X[0]=xtmp[0];
00638         X[1]=xtmp[0];
00639         Y[0]=0.0;
00640         if(ppsubwin->logflags[1]=='l') /* when logscale on Y, special treatment because we can not have Y == 0 */
00641           Y[0] = ppsubwin->FRect[1];
00642         Y[1]=ytmp[0];
00643         if (ppPolyLine->pvz != (double *) NULL) {
00644           Z[0]=ztmp[0];
00645           Z[1]=ztmp[0];
00646           z=Z;
00647         }
00648         else 
00649           z=(double *)NULL;
00650         x=X;y=Y;
00651         break;
00652       case 5: /* patch*/
00653         x=xtmp;
00654         y=ytmp;
00655         if (ppPolyLine->pvz != (double *) NULL)
00656           z=ztmp;
00657         else
00658           z= (double *) NULL;
00659         break;
00660           }
00661         }
00662         break;
00663       case  SCI_SEGS:
00664         {
00665           sciSegs * ppSegs = pSEGS_FEATURE(pobj) ;
00666           p = 2;
00667           /***************/
00668 
00669           if (ppSegs->ptype == 0) /* ptype == 0 F.Leray : This is NOT A champ */
00670           {  
00671             if (ppSegs->iflag == 1) {
00672               pstyle=sciGetGoodIndex(pobj, ppSegs->pstyle[index]);
00673             }
00674             else{
00675               pstyle=sciGetGoodIndex(pobj, ppSegs->pstyle[0]);
00676             }
00677           }
00678           else
00679           {
00680             pstyle = 0 ;
00681           }
00682 
00683           iflag = ppSegs->iflag;
00684 
00685           /***************/
00686           if ( ppSegs->ptype == 0 )
00687           {
00688             xtmp[0] = ppSegs->vx[2*index];
00689             xtmp[1] = ppSegs->vx[2*index+1];
00690 
00691             ytmp[0] = ppSegs->vy[2*index];
00692             ytmp[1] = ppSegs->vy[2*index+1];
00693 
00694             if( ppSegs->vz != NULL )
00695             {
00696               ztmp[0] = ppSegs->vz[2*index];
00697               ztmp[1] = ppSegs->vz[2*index+1];
00698             }
00699 
00700           }
00701           else
00702           {
00703             /* vx is size n1, vy n2 and vfx and vfy n1 x n2 */
00704             int column = index / ppSegs->Nbr1 ;
00705             int row    = index - column * ppSegs->Nbr1 ;
00706             double maxGap = 0.707 * computeGridMinGap( ppSegs->vx, ppSegs->vy, ppSegs->Nbr1, ppSegs->Nbr2 ) ;
00707 
00708             xtmp[0] = ppSegs->vx[row] ;
00709             ytmp[0] = ppSegs->vy[column] ;
00710 
00711             if (ppSegs->typeofchamp == 0 )
00712             {
00713               double maxNorm = getLongestVector( ppSegs->vfx, ppSegs->vfy, ppSegs->Nbr1, ppSegs->Nbr2, 1.0, 1.0 ) ;
00714               xtmp[1] = ppSegs->vx[row]    + maxGap * ppSegs->vfx[index] / maxNorm ;
00715               ytmp[1] = ppSegs->vy[column] + maxGap * ppSegs->vfy[index] / maxNorm ;
00716             }
00717             else
00718             {
00719               /* colored */
00720               double norm = sqrt( ppSegs->vfx[index] * ppSegs->vfx[index] + ppSegs->vfy[index] * ppSegs->vfy[index] ) ;
00721               xtmp[1] = ppSegs->vx[row]    + maxGap * ppSegs->vfx[index] / norm ;
00722               ytmp[1] = ppSegs->vy[column] + maxGap * ppSegs->vfy[index] / norm ; ;
00723             }
00724 
00725 
00726             if( ppSegs->vz != NULL )
00727             {
00728               ztmp[0] = ppSegs->vz[row] ;
00729               ztmp[1] = ppSegs->vz[row] + ppSegs->vfz[index] ;
00730             }
00731           }
00732 
00733 
00734           if(ppSegs->vz != NULL)
00735             ReverseDataFor3D(psubwin,xtmp,ytmp,ztmp,2);
00736           else
00737             ReverseDataFor3D(psubwin,xtmp,ytmp,(double *) NULL,2);
00738 
00739           /**************/
00740 
00741           X[0]=xtmp[0];
00742           X[1]=xtmp[1];
00743           Y[0]=ytmp[0];
00744           Y[1]=ytmp[1];
00745           if (ppSegs->vz != (double *) NULL) {
00746             Z[0]=ztmp[0];
00747             Z[1]=ztmp[1];
00748             z=Z;
00749           }
00750           else
00751             z=(double *)NULL;
00752           x=X;y=Y;
00753         }
00754         break;
00755       case  SCI_RECTANGLE: 
00756         {
00757           double rectx[4],recty[4],rectz[4];
00758           p = 5;
00759 
00760           pstyle=0; /* arevoir */
00761           iflag=0; /* arevoir */
00762 
00763           rectx[0]= rectx[3] =pRECTANGLE_FEATURE (pobj)->x;
00764           rectx[1]= rectx[2] =pRECTANGLE_FEATURE (pobj)->x+pRECTANGLE_FEATURE (pobj)->width;   
00765           recty[0]= recty[1] =pRECTANGLE_FEATURE (pobj)->y;   
00766           recty[2]= recty[3] =pRECTANGLE_FEATURE (pobj)->y-pRECTANGLE_FEATURE (pobj)->height;
00767           rectz[0]= rectz[1]=rectz[2]= rectz[3]=pRECTANGLE_FEATURE (pobj)->z;
00768 
00769           ReverseDataFor3D(psubwin, rectx, recty, rectz, 4);
00770 
00771           X[0]=X[1]=X[4]=rectx[0];
00772           Y[0]=Y[3]=Y[4]=recty[0];
00773           X[2]=X[3]=rectx[1];
00774           Y[1]=Y[2]=recty[2];
00775           Z[0]=Z[1]=Z[2]=Z[3]=Z[4]=rectz[0];
00776           x=X;y=Y;z=Z; 
00777         }
00778         break;
00779       default:
00780         p = 0;
00781       }
00782 
00783       nok = 0;
00784 
00785       if (p > 0) {
00786         /* project 3D on 2D coordinates */
00787         if (z != (double *)NULL) {
00788           for ( j2 =0 ; j2 < p ; j2++) { 
00789             if (trans3d(psubwin ,1, &(polyx[j2]),&(polyy[j2]),&(x[j2]),&(y[j2]),&(z[j2]))==0) {
00790               nok=1;break; 
00791             }
00792           }
00793         }
00794         else {
00795           double zz=0.0;
00796           for ( j2 =0 ; j2 < p ; j2++) { 
00797             if (trans3d(psubwin ,1, &(polyx[j2]),&(polyy[j2]),&(x[j2]),&(y[j2]),&zz)==0) {
00798               nok=1;break; 
00799             }
00800           }
00801         }
00802 
00803         if(nok == 1) continue;
00804 
00805         /* draw element */
00806         context[0] = sciGetForeground (pobj);   
00807         context[1] = sciGetLineWidth (pobj);
00808         context[2] = sciGetLineStyle (pobj); 
00809         context[3] = 0;
00810         context[4] = sciGetMarkStyle(pobj);
00811         context[5] = sciGetLineWidth (pobj);
00812 #ifdef _MSC_VER
00813         hdcflag=MaybeSetWinhdc();
00814 #endif
00815         C2F (dr) ("xset", "thickness",  context+1, PI0, PI0, PI0, PI0, PI0, PD0, PD0, PD0, PD0, 5L, 9L);
00816         C2F (dr) ("xset", "line style", context+2, PI0, PI0, PI0, PI0, PI0, PD0, PD0, PD0, PD0, 0L, 0L); 
00817         C2F (dr) ("xset", "mark", context+4, context+5, PI0, PI0, PI0, PI0, PD0, PD0, PD0, PD0, 4L, 4L);
00818 
00819         if (sciGetEntityType (pobj)==SCI_SURFACE) {
00820           int fg1  = pSURFACE_FEATURE (pobj)->hiddencolor;
00821           int flag = pSURFACE_FEATURE (pobj)->flag[0];
00822           int facteur = 1;
00823 
00824           polyx[p] = polyx[0] ;
00825           polyy[p] = polyy[0] ;
00826           p++ ; /*close the facet*/
00827           /* beware we got twice the first point now */
00828 
00829           /* facteur is used below */
00830           if(ppsubwin->axes.reverse[0] == TRUE) facteur = -facteur;
00831           if(ppsubwin->axes.reverse[1] == TRUE) facteur = -facteur;
00832           if(ppsubwin->axes.reverse[2] == TRUE) facteur = -facteur;
00833 
00834           if ((((polyx[1]-polyx[0])*(polyy[2]-polyy[0])-(polyy[1]-polyy[0])*(polyx[2]-polyx[0]))*facteur <  0) &&
00835             (fg1 >= 0)) { /* hidden face */
00836 
00837               if ( pSURFACE_FEATURE (pobj)->flagcolor != 0)
00838                 fill[0] = (flag < 0 ) ? -fg1 : fg1 ;
00839               else
00840                 fill[0] = (flag != 0 ) ? fg1 : flag ;
00841               if(sciGetIsLine(pobj)){
00842                 C2F (dr) ("xset", "dashes",     context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 6L);
00843                 C2F (dr) ("xset", "foreground", context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 10L);
00844                 C2F(dr)("xliness","str",polyx,polyy,fill,&npoly,&p,PI0,PD0,PD0,PD0,PD0,0L,0L);
00845               }
00846               if(sciGetIsMark(pobj))
00847                 DrawMarks3D(pobj,5*npoly,polyx,polyy,DPI);
00848           }
00849           else {
00850             switch ( pSURFACE_FEATURE (pobj)->flagcolor) {
00851             case 0:
00852               fill[0]= flag ;
00853               if(sciGetIsLine(pobj)){
00854                 C2F (dr) ("xset", "dashes",     context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 6L);
00855                 C2F (dr) ("xset", "foreground", context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 10L);
00856                 C2F(dr)("xliness","str",polyx,polyy,fill,&npoly,&p, PI0,PD0,PD0,PD0,PD0,0L,0L);
00857               }
00858               if(sciGetIsMark(pobj))
00859                 DrawMarks3D(pobj,5*npoly,polyx,polyy,DPI);
00860               break;
00861             case 1:
00862               zl = 0.0 ;
00863               for ( k1= 0 ; k1 < p - 1 ; k1++) { zl += z[k1] ; }
00864               zl /= p - 1.0 ;
00865               /* for ( k1= 0 ; k1 < p ; k1++) zl+= Zoriginal[k1]; */ /* F.Leray 01.12.04 : DO NOT REPLACE z by ztmp here : zmin & zmax are computed to work with z ! */
00866               fill[0] = inint( (whiteid-1)* ( zl - zmin ) / ( zmax- zmin ) ) + 1 ;
00867 
00868               if ( flag  < 0 ) { fill[0] = -fill[0] ; }
00869               if ( sciGetIsLine(pobj) )
00870               {
00871                 C2F (dr) ("xset", "dashes",     context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 6L);
00872                 C2F (dr) ("xset", "foreground", context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 10L);
00873                 C2F(dr)("xliness","str",polyx,polyy,fill,&npoly,&p ,PI0,PD0,PD0,PD0,PD0,0L,0L);
00874               }
00875               if(sciGetIsMark(pobj))
00876                 DrawMarks3D(pobj,5*npoly,polyx,polyy,DPI);
00877               break;
00878             case 2:
00879               fill[0]= (int) pSURFACE_FEATURE (pobj)->color[index];
00880               if ( flag < 0 ) fill[0]=-fill[0];
00881               if(sciGetIsLine(pobj)){
00882                 C2F (dr) ("xset", "dashes",     context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 6L);
00883                 C2F (dr) ("xset", "foreground", context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 10L);
00884                 C2F(dr)("xliness","str",polyx,polyy,fill,&npoly,&p ,PI0,PD0,PD0,PD0,PD0,0L,0L);
00885               }
00886               if(sciGetIsMark(pobj))
00887                 DrawMarks3D(pobj,5*npoly,polyx,polyy,DPI);
00888               break;
00889             case 3:
00890               p--;
00891               if ( (p) != 3 && (p) !=4 ) {
00892                 sciprint("Interpolated shading is only allowed for polygons with 3 or 4 vertices\n");
00893                 return;
00894               }
00895               else  {
00896                 /* shade needs (int*) color */
00897                 integer *cvect = NULL,ik;
00898                 sciSurface * ppsurface = pSURFACE_FEATURE (pobj);
00899 
00900                 if((cvect=MALLOC(ppsurface->nc*sizeof(integer)))==NULL){
00901                   sciprint("Allocation failed in merge for color matrix\n");
00902                   return;
00903                 }    
00904 
00905                 for(ik=0;ik<ppsurface->nc;ik++) 
00906                   cvect[ik] = (int) ppsurface->color[ik];
00907 
00908                 C2F (dr) ("xset", "dashes",     context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 6L);
00909                 C2F (dr) ("xset", "foreground", context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 10L);
00910 
00911                 scilab_shade(polyx,polyy,&(cvect[p*index]),p,ppsurface->flag[0]);
00912                 FREE(cvect); cvect = NULL;
00913                 if (sciGetIsMark (pobj))
00914                   DrawMarks3D (pobj, p,polyx,polyy,DPI);
00915               }
00916               break;
00917             case 4: /* new case for "flat" mode matlab compatibility */
00918               fill[0]= (int) pSURFACE_FEATURE (pobj)->color[index];
00919               if ( flag < 0 ) fill[0]=-fill[0];
00920               if(sciGetIsLine(pobj)){
00921                 C2F (dr) ("xset", "dashes",     context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 6L);
00922                 C2F (dr) ("xset", "foreground", context,   context,   context+3, context+3, context+3, PI0, PD0, PD0, PD0, PD0, 5L, 10L);
00923                 C2F(dr)("xliness","str",polyx,polyy,fill,&npoly,&p ,PI0,PD0,PD0,PD0,PD0,0L,0L);
00924               }
00925               if(sciGetIsMark(pobj))
00926                 DrawMarks3D(pobj,5*npoly,polyx,polyy,DPI);
00927               break;
00928             }
00929           }
00930         } /* end SCI_SURFACE*/
00931         else if(sciGetEntityType (pobj)==SCI_SEGS)
00932         {
00933           /* PSEGS here ! */
00934           sciSegs * ppSegs = pSEGS_FEATURE(pobj) ;
00935           if ( sciGetIsMark(pobj) )
00936           {
00937             integer v;
00938             double dv=0;
00939             int x_[4], markidsizenew[2];
00940 
00941             x_[0] = sciGetMarkForeground(pobj);
00942 
00943             markidsizenew[0] = sciGetMarkStyle(pobj);
00944             markidsizenew[1] = sciGetMarkSize (pobj);
00945 
00946             C2F (dr) ("xset", "dashes", x_, x_, x_+4, x_+4, x_+4, &v, &dv,
00947               &dv, &dv, &dv, 5L, 4096);
00948             C2F (dr) ("xset", "foreground", x_, x_, x_+4, x_+4, x_+4, &v,
00949               &dv, &dv, &dv, &dv, 5L, 4096);
00950 
00951             C2F (dr) ("xset", "mark", &markidsizenew[0], &markidsizenew[1], PI0, PI0, PI0, PI0, PD0, PD0,
00952               PD0, PD0, 0L, 0L);
00953             DrawNewMarks(pobj,p,polyx,polyy,DPI);
00954           }
00955 
00956           if(sciGetIsLine(pobj)){
00957             C2F (dr) ("xset", "dashes",     context,   context,   context+3, context+3, context+3, PI0, PD0, 
00958               PD0, PD0, PD0, 5L, 6L);
00959             C2F (dr) ("xset", "foreground", context,   context,   context+3, context+3, context+3, PI0, PD0, 
00960               PD0, PD0, PD0, 5L, 10L);
00961             C2F (dr) ("xset", "thickness",  context+1, PI0, PI0, PI0, PI0, PI0, PD0, PD0, PD0, PD0, 5L, 9L);
00962             C2F (dr) ("xset", "line style", context+2, PI0, PI0, PI0, PI0, PI0, PD0, PD0, PD0, PD0, 0L, 0L);
00963             if ( ppSegs->ptype == 0 )
00964             {
00965               C2F(dr)("xsegs","v",polyx,polyy,&p,&pstyle,&iflag,PI0,PD0,PD0,PD0,PD0,0L,0L);
00966             }
00967             else
00968             {
00969               // Champ
00970               int arrowSize = computeRealArrowSize( pobj, p, polyx, polyy ) ;
00971               if( ppSegs->typeofchamp == 0 )
00972               {
00973                 int sflag = 0 ;
00974                 C2F(dr)("xarrow","v",polyx,polyy,&p,&arrowSize,&pstyle,&sflag,PD0,PD0,PD0,PD0,0L,0L);
00975               }
00976               else
00977               {
00978                 int sflag = 1 ; /* colored */
00979                 int arrowColor = computeArrowColor( ppSegs->vfx, ppSegs->vfy, ppSegs->Nbr1, ppSegs->Nbr2, index ) ;
00980                 C2F(dr)("xarrow","v",polyx,polyy,&p,&arrowSize,&arrowColor,&sflag,PD0,PD0,PD0,PD0,0L,0L);
00981               }
00982             } 
00983           }
00984         }
00985         else if(sciGetEntityType (pobj)==SCI_RECTANGLE) { /* RECTANGLE case here ! */
00986           if( sciGetIsFilled(pobj) )
00987           {
00988             integer v;
00989             double dv=0;
00990             int x_[4],close=1;
00991             char str[2] = "xv";
00992             x_[0] = sciGetBackground(pobj);
00993 
00994             C2F (dr) ("xset", "dashes", x_, x_, x_+4, x_+4, x_+4, &v, &dv,
00995               &dv, &dv, &dv, 5L, 4096);
00996             C2F (dr) ("xset", "foreground", x_, x_, x_+4, x_+4, x_+4, &v,
00997               &dv, &dv, &dv, &dv, 5L, 4096);
00998 
00999             C2F (dr) ("xarea", str, &p, polyx, polyy, &close, PI0, PI0, PD0, PD0, PD0, PD0, 5L,strlen(str));
01000           }
01001 
01002           if (sciGetIsMark(pobj) == TRUE){
01003             integer v;
01004             double dv=0;
01005             int x_[4], markidsizenew[2];
01006 
01007             x_[0] = sciGetMarkForeground(pobj);
01008 
01009             markidsizenew[0] = sciGetMarkStyle(pobj);
01010             markidsizenew[1] = sciGetMarkSize (pobj);
01011 
01012             C2F (dr) ("xset", "dashes", x_, x_, x_+4, x_+4, x_+4, &v, &dv,
01013               &dv, &dv, &dv, 5L, 4096);
01014             C2F (dr) ("xset", "foreground", x_, x_, x_+4, x_+4, x_+4, &v,
01015               &dv, &dv, &dv, &dv, 5L, 4096);
01016 
01017             C2F (dr) ("xset", "mark", &markidsizenew[0], &markidsizenew[1], PI0, PI0, PI0, PI0, PD0, PD0,
01018               PD0, PD0, 0L, 0L);
01019             DrawNewMarks(pobj,p,polyx,polyy,DPI);
01020           }
01021 
01022           if(sciGetIsLine(pobj)){
01023             C2F (dr) ("xset", "dashes",     context,   context,   context+3, context+3, context+3, PI0, PD0, 
01024               PD0, PD0, PD0, 5L, 6L);
01025             C2F (dr) ("xset", "foreground", context,   context,   context+3, context+3, context+3, PI0, PD0, 
01026               PD0, PD0, PD0, 5L, 10L);
01027             C2F (dr) ("xset", "thickness",  context+1, PI0, PI0, PI0, PI0, PI0, PD0, PD0, PD0, PD0, 5L, 9L);
01028             C2F (dr) ("xset", "line style", context+2, PI0, PI0, PI0, PI0, PI0, PD0, PD0, PD0, PD0, 0L, 0L); 
01029             C2F(dr)("xsegs","v",polyx,polyy,&p,&pstyle,&iflag,PI0,PD0,PD0,PD0,PD0,0L,0L);
01030           }
01031         }
01032         else { /* POLYLINE case starts here ! */
01033           /* special case 5 */
01034           if(sciGetIsFilled(pobj) == TRUE && pPOLYLINE_FEATURE (pobj)->plot != 5) /* No filling if mode plot == 5 is selected */
01035           {
01036             integer v;
01037             double dv=0;
01038             int x_[4],close=1;
01039             char str[2] = "xv";
01040             x_[0] = sciGetBackground(pobj);
01041 
01042             C2F (dr) ("xset", "dashes", x_, x_, x_+4, x_+4, x_+4, &v, &dv,
01043               &dv, &dv, &dv, 5L, 4096);
01044             C2F (dr) ("xset", "foreground", x_, x_, x_+4, x_+4, x_+4, &v,
01045               &dv, &dv, &dv, &dv, 5L, 4096);
01046 
01047             C2F (dr) ("xarea", str, &p, polyx, polyy, &close, PI0, PI0, PD0, PD0, PD0, PD0, 5L,strlen(str));
01048           }
01049 
01050           if (sciGetIsMark(pobj) == TRUE){
01051             integer v;
01052             double dv=0;
01053             int x_[4], markidsizenew[2];
01054 
01055             x_[0] = sciGetMarkForeground(pobj);
01056 
01057             markidsizenew[0] = sciGetMarkStyle(pobj);
01058             markidsizenew[1] = sciGetMarkSize (pobj);
01059 
01060             C2F (dr) ("xset", "dashes", x_, x_, x_+4, x_+4, x_+4, &v, &dv,
01061               &dv, &dv, &dv, 5L, 4096);
01062             C2F (dr) ("xset", "foreground", x_, x_, x_+4, x_+4, x_+4, &v,
01063               &dv, &dv, &dv, &dv, 5L, 4096);
01064 
01065             C2F (dr) ("xset", "mark", &markidsizenew[0], &markidsizenew[1], PI0, PI0, PI0, PI0, PD0, PD0,
01066               PD0, PD0, 0L, 0L);
01067             DrawNewMarks(pobj,p,polyx,polyy,DPI);
01068           }
01069 
01070           if(sciGetIsLine(pobj)){
01071             int un = 1, deux = 2;
01072             context[3] = 0;
01073 
01074             C2F (dr) ("xset", "dashes",     context,   context,   context+3, context+3, context+3, PI0, PD0, 
01075               PD0, PD0, PD0, 5L, 6L);
01076             C2F (dr) ("xset", "foreground", context,   context,   context+3, context+3, context+3, PI0, PD0, 
01077               PD0, PD0, PD0, 5L, 10L);
01078             C2F (dr) ("xset", "thickness",  context+1, PI0, PI0, PI0, PI0, PI0, PD0, PD0, PD0, PD0, 5L, 9L);
01079             C2F (dr) ("xset", "line style", context+2, PI0, PI0, PI0, PI0, PI0, PD0, PD0, PD0, PD0, 0L, 0L);
01080             C2F (dr) ("xlines", "xv", &deux, polyx, polyy, &un, PI0, PI0, PD0, PD0, PD0, PD0,6L,2L);
01081           }
01082         }
01083       }
01084     }
01085 
01086 #ifdef _MSC_VER
01087     if ( hdcflag == 1) ReleaseWinHdc ();
01088 #endif    
01089 
01090   }
01091   FREE(dist);FREE(locindex);FREE(polyx);FREE(polyy);
01092   FREE(verticesX) ;
01093   FREE(verticesY) ;
01094   FREE(verticesZ) ;
01095 }

Here is the call graph for this function:

Here is the caller graph for this function:

int drawMergeEntity ( sciPointObj pObj  ) 

Routine which draw a merge object.

Parameters:
pObj the pointer on the merge object

Definition at line 22 of file drawMergeEntity.c.

References DrawMerge3d(), GetDPIFromDriver(), pSUBWIN_FEATURE, and sciGetParentSubwin().

Referenced by sciDrawObj().

00023 {
00024   sciPointObj * parentSubWin = sciGetParentSubwin(pObj) ;
00025   int DPI[2] ;
00026   
00027   GetDPIFromDriver(DPI) ;
00028 
00029   if ( !pSUBWIN_FEATURE(parentSubWin)->facetmerge ) { return 0 ; } 
00030 
00031   DrawMerge3d( parentSubWin, pObj, DPI ) ;  /* TEST on sciGetVisibility inside */
00032   return 0 ;
00033 }

Here is the call graph for this function:

Here is the caller graph for this function:

double C2F() dsort (  ) 

Definition at line 292 of file x_test_loop.c.

00292 {};

void retrieveFacetVertices ( sciPointObj pobj,
int  facetIndex,
double  verticesX[],
double  verticesY[],
double  verticesZ[],
double **  zOriginal 
)

get the coordinates of the vertices of a facet in a FAC3D object

Parameters:
in/out] pobj surface object of type Fac3d
facetIndex index of the facet in the object
[out] verticesX list of X coordinates of the vertices
[out] verticesY list of Y coordinates of the vertices
[out] verticesZ list of Z coordinates of the vertices
[out] zOriginal pointer on the Z coordinate of the first vertex in the fac3d object

Definition at line 1098 of file drawMergeEntity.c.

References i, pSURFACE_FEATURE, and ReverseDataFor3D().

Referenced by DrawMerge3d().

01104 {
01105   int nbFacets = pSURFACE_FEATURE (pobj)->dimzx ;
01106   int i ;
01107 
01108   for ( i = 0 ; i < nbFacets ; i++ )
01109   {
01110     verticesX[i] = pSURFACE_FEATURE(pobj)->pvecx[facetIndex * nbFacets + i] ;
01111     verticesY[i] = pSURFACE_FEATURE(pobj)->pvecy[facetIndex * nbFacets + i] ;
01112     verticesZ[i] = pSURFACE_FEATURE(pobj)->pvecz[facetIndex * nbFacets + i] ;
01113   }
01114 
01115   ReverseDataFor3D( pobj, verticesX, verticesY, verticesZ, nbFacets ) ;
01116 
01117   *zOriginal = &(pSURFACE_FEATURE(pobj)->pvecz[facetIndex * nbFacets]) ;
01118 }

Here is the call graph for this function:

Here is the caller graph for this function:


Generated on Sun Mar 4 15:47:34 2007 for Scilab [trunk] by  doxygen 1.5.1