00001
00002
00003
00004
00005
00006
00007
00008 #include "drawMergeEntity.h"
00009 #include "GetProperty.h"
00010 #include "Xcall1.h"
00011 #include "MALLOC.h"
00012 #include "sciprint.h"
00013 #include "axesScale.h"
00014 #include "PloEch.h"
00015 #include "periScreen.h"
00016 #include "drawMarks.h"
00017 #include "Plo3d.h"
00018 #include "Champ.h"
00019 #include "handleDrawing/drawSegsEntity.h"
00020
00021
00022 int drawMergeEntity( sciPointObj * pObj )
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 ) ;
00032 return 0 ;
00033 }
00034
00035 extern double C2F(dsort)() ;
00036 void DrawMerge3d( sciPointObj * psubwin, sciPointObj * pmerge, int * DPI )
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;
00042 double * x = NULL ;
00043 double * y = NULL ;
00044 double * z = NULL ;
00045 sciPointObj *pobj;
00046 int *locindex;
00047 int *polyx,*polyy,fill[20];
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
00059 double xtmp[2] ;
00060 double ytmp[2] ;
00061 double ztmp[4] ;
00062
00063 double * verticesX = NULL ;
00064 double * verticesY = NULL ;
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 ;
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
00087
00088
00089 max_p=0;
00090 for ( i =0 ; i < N ; i++) {
00091 pobj=(sciPointObj *) sciGetPointerFromHandle (ppMerge->from_entity[i]);
00092 index = ppMerge->index_in_entity[i];
00093
00094
00095 switch (sciGetEntityType (pobj)) {
00096 case SCI_SURFACE:
00097 if (pSURFACE_FEATURE (pobj)->typeof3d == SCI_PLOT3D) {
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
00109 if(ppsubwin->axes.reverse[0] == TRUE){
00110
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
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
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
00184 p = pSURFACE_FEATURE (pobj)->dimzx;
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 ; }
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] ;
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];
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:
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:
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 :
00277 X[0]=xtmp[0];
00278 X[1]=xtmp[0];
00279 Y[0]=0.0;
00280 if(ppsubwin->logflags[1]=='l')
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:
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
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
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
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
00419 dist[i]= TRZ(xmoy/p,ymoy/p,zmoy/p);
00420 max_p=Max(max_p,p);
00421
00422 }
00423
00424
00425 C2F(dsort)(dist,&N,locindex);
00426
00427 FREE(verticesX) ;
00428 FREE(verticesY) ;
00429 FREE(verticesZ) ;
00430
00431
00432
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--) {
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
00461 switch (sciGetEntityType (pobj)) {
00462 case SCI_SURFACE:
00463 if (pSURFACE_FEATURE (pobj)->typeof3d == SCI_PLOT3D) {
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
00475 if(ppsubwin->axes.reverse[0] == TRUE){
00476
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
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
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
00549 p = pSURFACE_FEATURE (pobj)->dimzx;
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 ; }
00577 if ( sciGetIsLine( pobj ) ) { p=2 ; }
00578
00579
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] ;
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];
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:
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:
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 :
00637 X[0]=xtmp[0];
00638 X[1]=xtmp[0];
00639 Y[0]=0.0;
00640 if(ppsubwin->logflags[1]=='l')
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:
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)
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
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
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;
00761 iflag=0;
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
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
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++ ;
00827
00828
00829
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)) {
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
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
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:
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 }
00931 else if(sciGetEntityType (pobj)==SCI_SEGS)
00932 {
00933
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
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 ;
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) {
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 {
01033
01034 if(sciGetIsFilled(pobj) == TRUE && pPOLYLINE_FEATURE (pobj)->plot != 5)
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 }
01096
01097
01098 void retrieveFacetVertices( sciPointObj * pobj ,
01099 int facetIndex ,
01100 double verticesX[],
01101 double verticesY[],
01102 double verticesZ[],
01103 double ** zOriginal )
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 }
01119