#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) |
| 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.
| 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 | ( | ) |
| 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
| 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:

1.5.1