00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include <stdio.h>
00042 #ifndef __UNIX_
00043 #include <stdlib.h>
00044 #endif
00045 #include "mensagem.h"
00046 #include "memvirtu.h"
00047 #include "lowparam.h"
00048 #include "lowmacro.h"
00049 #include "lowsolid.h"
00050 #include "eulerops.h"
00051 #include "curvgeom.h"
00052 #include "mancommd.h"
00053
00054
00055
00056
00057
00058
00059
00060 #ifdef __Extended_Version
00061 void MSD_execMEV(void)
00062 {
00063 int f, s, vn1, vn2, op;
00064 float xx, yy, zz;
00065
00066 while (8 != sscanf(restbuf, "%d %d %d %d %d %f %f %f", &s, &op, &f, &vn1, &vn2,
00067 &xx, &yy, &zz))
00068 {
00069 printf("mev: Sid F V1 V2 X Y Z \n");
00070 if (!lineins("? "))
00071 {
00072 return;
00073 }
00074 }
00075 MSD_highMEV(s, f, vn1, vn2, xx, yy, zz);
00076 }
00077
00078 #endif
00079
00080 int MSD_highMEV(Id sn, Id fn, Id v1, Id v2, real x, real y, real z)
00081 {
00082 SPTYPE s;
00083 FPTYPE oldface;
00084 HPTYPE h;
00085
00086 if ((s = MSD_getSolid(sn)) == SNIL)
00087 {
00088 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_MEV, sn);
00089 return(ERROR);
00090 }
00091 if ((oldface = MSD_getFace(s, fn)) == FNIL)
00092 {
00093 fprintf(stderr, MEN_NaoEncontrouFace, NAM_MEV, fn, sn);
00094 return(ERROR);
00095 }
00096 if (MSD_getLoop(oldface, v1, &h) == LNIL)
00097 {
00098 fprintf(stderr, MEN_NaoEncontrouVertice, NAM_MEV, v1, sn);
00099 return(ERROR);
00100 }
00101 MSD_lowMEV(h, h, v2, x, y, z);
00102 return(SUCCESS);
00103 }
00104
00105 #ifdef __Extended_Version
00106 void MSD_execSEMV(void)
00107 {
00108 int sn, v1, v2, v3;
00109 float x, y, z;
00110
00111 while (7 != sscanf(restbuf, "%d %d %d %d %f %f %f", &sn, &v1, &v2, &v3,
00112 &x, &y, &z))
00113 {
00114 printf("semv: Sid V1 V2 V3 X Y Z\n");
00115 if (!lineins("? "))
00116 {
00117 return;
00118 }
00119 }
00120 MSD_highSEMV(sn, v1, v2, v3, x, y, z);
00121 }
00122
00123 #endif
00124
00125 int MSD_highSEMV(Id sn, Id v1, Id v2, Id v3, real x, real y, real z)
00126 {
00127 SPTYPE s;
00128 DPTYPE d;
00129 FPTYPE f;
00130 HPTYPE he1;
00131 short flag_found;
00132
00133 if ((s = MSD_getSolid(sn)) == SNIL)
00134 {
00135 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_SEMV, sn);
00136 return(ERROR);
00137 }
00138
00139 flag_found = 1;
00140 for (AllShellsSolid(s, d))
00141 {
00142 for (AllFacesShell(d, f))
00143 {
00144 if (MSD_getEdge(f, v1, v2, &he1))
00145 {
00146 flag_found = 0;
00147 break;
00148 }
00149 }
00150 }
00151 if (flag_found == 1)
00152 {
00153 fprintf(stderr, MEN_NaoEncontrouArestaV, NAM_SEMV, v1, v2, sn);
00154 return(ERROR);
00155 }
00156
00157 MSD_lowMEV(mate(he1), HalNxt(he1), v3, x, y, z);
00158 return(SUCCESS);
00159 }
00160
00161 #ifdef __Extended_Version
00162 void MSD_execSVME(void)
00163 {
00164 int sn, v1, v2, f1, f2, op;
00165 float x, y, z;
00166
00167 while (9 != sscanf(restbuf, "%d %d %d %d %d %d %f %f %f", &sn, &op, &v1, &v2, &f1,
00168 &f2, &x, &y, &z))
00169 {
00170 printf("svme: Sid V1 V2 F1 F2 X Y Z\n");
00171 if (!lineins("? "))
00172 {
00173 return;
00174 }
00175 }
00176 MSD_highSVME(sn, v1, v2, f1, f2, x, y, z);
00177 }
00178
00179 #endif
00180
00181 int MSD_highSVME(Id sn, Id v1, Id v2, Id f1, Id f2, real x, real y, real z)
00182 {
00183 SPTYPE s;
00184 FPTYPE ff1;
00185 FPTYPE ff2;
00186 HPTYPE he1;
00187 HPTYPE he2;
00188
00189 if ((s = MSD_getSolid(sn)) == SNIL)
00190 {
00191 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_SVME, sn);
00192 return(ERROR);
00193 }
00194 if ((ff1 = MSD_getFace(s, f1)) == FNIL)
00195 {
00196 fprintf(stderr, MEN_NaoEncontrouFace, NAM_SVME, f1, sn);
00197 return(ERROR);
00198 }
00199 if ((ff2 = f1 != f2 ? MSD_getFace(s, f2) : ff1) == FNIL)
00200 {
00201 fprintf(stderr, MEN_NaoEncontrouFace, NAM_SVME, f2, sn);
00202 return(ERROR);
00203 }
00204 if (MSD_getLoop(ff1, v1, &he1) == LNIL)
00205 {
00206 fprintf(stderr, MEN_NaoEncontrouVertice, NAM_SVME, v1, sn);
00207 return(ERROR);
00208 }
00209 if (MSD_getLoop(ff2, v1, &he2) == LNIL)
00210 {
00211 fprintf(stderr, MEN_NaoEncontrouVertice, NAM_SVME, v1, sn);
00212 return(ERROR);
00213 }
00214 MSD_lowMEV(he1, he2, v2, x, y, z);
00215 return(SUCCESS);
00216 }
00217
00218 #ifdef __Extended_Version
00219 void MSD_execSVME2(void)
00220 {
00221 int sn, v1, v2, v3, v4, f1, f2;
00222 float x, y, z;
00223
00224 while (10 != sscanf(restbuf, "%d %d %d %d %d %d %d %f %f %f", &sn, &v1,
00225 &v2, &v3, &v4, &f1, &f2, &x, &y, &z))
00226 {
00227 printf("svme2: Sid V1 V2 V3 V4 F1 F2 X Y Z\n");
00228 if (!lineins("? "))
00229 {
00230 return;
00231 }
00232 }
00233 MSD_highSVME2(sn, v1, v2, v3, v4, f1, f2, x, y, z);
00234 }
00235
00236 #endif
00237
00238 int MSD_highSVME2(Id sn, Id v1, Id v2, Id v3, Id v4, Id f1, Id f2, real x,
00239 real y, real z)
00240 {
00241 SPTYPE s;
00242 FPTYPE ff1;
00243 FPTYPE ff2;
00244 HPTYPE he1;
00245 HPTYPE he2;
00246
00247 if ((s = MSD_getSolid(sn)) == SNIL)
00248 {
00249 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_SVME2, sn);
00250 return(ERROR);
00251 }
00252 if ((ff1 = MSD_getFace(s, f1)) == FNIL)
00253 {
00254 fprintf(stderr, MEN_NaoEncontrouFace, NAM_SVME2, f1, sn);
00255 return(ERROR);
00256 }
00257 if ((ff2 = f1 != f2 ? MSD_getFace(s, f2) : ff1) == FNIL)
00258 {
00259 fprintf(stderr, MEN_NaoEncontrouFace, NAM_SVME2, f2, sn);
00260 return(ERROR);
00261 }
00262 if (MSD_getEdge(ff1, v1, v2, &he1) == LNIL)
00263 {
00264 fprintf(stderr, MEN_NaoEncontrouArestaV, NAM_SVME2, v1, v2, sn);
00265 return(ERROR);
00266 }
00267 if (MSD_getEdge(ff2, v1, v3, &he2) == LNIL)
00268 {
00269 fprintf(stderr, MEN_NaoEncontrouArestaV, NAM_SVME2, v1, v3, sn);
00270 return(ERROR);
00271 }
00272 MSD_lowMEV(he1, he2, v4, x, y, z);
00273 return(SUCCESS);
00274 }
00275
00276 #ifdef __Extended_Version
00277 void MSD_execSVME3(void)
00278 {
00279 int sn, v1, v2, v3, v4, f1, f2, f3, f4, op;
00280 float x, y, z;
00281
00282 while (13 != sscanf(restbuf, "%d %d %d %d %d %d %d %d %d %d %f %f %f", &sn, &op,
00283 &v1, &v2, &v3, &v4, &f1, &f2, &f3, &f4, &x, &y, &z))
00284 {
00285 printf("svme3: Sid V1 V2 V3 V4 F1 F2 F3 F4 X Y Z\n");
00286 if (!lineins("? "))
00287 {
00288 return;
00289 }
00290 }
00291 MSD_highSVME3(sn, v1, v2, v3, v4, f1, f2, f3, f4, x, y, z);
00292 }
00293
00294 #endif
00295
00296 int MSD_highSVME3(Id sn, Id v1, Id v2, Id v3, Id v4, Id f1, Id f2, Id f3, Id f4,
00297 real x, real y, real z)
00298 {
00299 SPTYPE s;
00300 FPTYPE ff1;
00301 FPTYPE ff2;
00302 FPTYPE ff3;
00303 FPTYPE ff4;
00304 HPTYPE he1;
00305 HPTYPE he2;
00306
00307 if ((s = MSD_getSolid(sn)) == SNIL)
00308 {
00309 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_SVME3, sn);
00310 return(ERROR);
00311 }
00312 if ((ff1 = MSD_getFace(s, f1)) == FNIL)
00313 {
00314 fprintf(stderr, MEN_NaoEncontrouFace, NAM_SVME3, f1, sn);
00315 return(ERROR);
00316 }
00317 if ((ff2 = MSD_getFace(s, f2)) == FNIL)
00318 {
00319 fprintf(stderr, MEN_NaoEncontrouFace, NAM_SVME3, f2, sn);
00320 return(ERROR);
00321 }
00322 if ((ff3 = MSD_getFace(s, f3)) == FNIL)
00323 {
00324 fprintf(stderr, MEN_NaoEncontrouFace, NAM_SVME3, f3, sn);
00325 return(ERROR);
00326 }
00327 if ((ff4 = MSD_getFace(s, f4)) == FNIL)
00328 {
00329 fprintf(stderr, MEN_NaoEncontrouFace, NAM_SVME3, f4, sn);
00330 return(ERROR);
00331 }
00332 if (MSD_getHalfedge(ff1, ff3, v1, v2, &he1) == LNIL)
00333 {
00334 fprintf(stderr, MEN_NaoEncontrouArestaF, NAM_SVME3, v1, v2, f1, f3, sn);
00335 return(ERROR);
00336 }
00337 if (MSD_getHalfedge(ff2, ff4, v1, v3, &he2) == LNIL)
00338 {
00339 fprintf(stderr, MEN_NaoEncontrouArestaF, NAM_SVME3, v1, v3, f2, f4, sn);
00340 return(ERROR);
00341 }
00342 MSD_lowMEV(he1, he2, v4, x, y, z);
00343 return(SUCCESS);
00344 }
00345
00346 void MSD_lowMEV(HPTYPE he1, HPTYPE he2, Id vn, real x, real y, real z)
00347 {
00348 SPTYPE s;
00349 DPTYPE d;
00350 EPTYPE newedge;
00351 HPTYPE he;
00352 VPTYPE newvertex;
00353
00354 Id v1, v2, v3, f1, f2, f3, f4;
00355
00356 #ifdef __curved_env
00357 HTYPE *nhe1, *nhe2;
00358 int copy_tag;
00359 #endif
00360
00361 assert1(HalVtx(he1) == HalVtx(he2));
00362 #ifdef __curved_env
00363 copy_tag = he2 == mate(he1)->nxt ? 0 : 1;
00364 #endif
00365
00366 d = FacFShell(LooLFace(HalWLoop(he1)));
00367 s = SheSSolids(d);
00368 newedge = (EPTYPE)MSD_lowNewElement(EDGE, (NPTYPE)d);
00369 newvertex = (VPTYPE)MSD_lowNewElement(VERTEX, (NPTYPE)d);
00370
00371 if (Gdoinversion)
00372 {
00373 v1 = VerVertexNo(HalVtx(he1));
00374 f1 = FacFaceNo(LooLFace(HalWLoop(he2)));
00375 f2 = FacFaceNo(LooLFace(HalWLoop(he1)));
00376 MSD_lowAddEulerOp(s, KEV, vn, v1, f1, f2, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0.0);
00377 }
00378 if (Gdodirect)
00379 {
00380
00381 v1 = VerVertexNo(HalVtx(he1));
00382 v2 = VerVertexNo(HalVtx(HalNxt(he1)));
00383 v3 = VerVertexNo(HalVtx(HalNxt(he2)));
00384 f1 = FacFaceNo(LooLFace(HalWLoop(he1)));
00385 f2 = FacFaceNo(LooLFace(HalWLoop(he2)));
00386 f3 = HalEdg(he1) == ENIL ? f1 : FacFaceNo(LooLFace(HalWLoop(mate(he1))));
00387 f4 = HalEdg(he2) == ENIL ? f2 : FacFaceNo(LooLFace(HalWLoop(mate(he2))));
00388 MSD_lowAddEulerOpRedo(s, MEV, v1, v2, v3, vn, f1, f2, f3, f4, x, y, z, 0.0);
00389 }
00390
00391 EdgEdgeNo(newedge) = -1;
00392 VerVertexNo(newvertex) = vn;
00393 VerVCoord(newvertex)[0] = x;
00394 VerVCoord(newvertex)[1] = y;
00395 VerVCoord(newvertex)[2] = z;
00396 VerVCoord(newvertex)[3] = 1.0;
00397
00398 for (he = he1; he != he2; he = HalNxt(mate(he)))
00399 {
00400 HalVtx(he) = newvertex;
00401 }
00402
00403 #ifdef __curved_env
00404 nhe2 = addhe(newedge, he2->vtx, he1, MINUS);
00405 nhe1 = addhe(newedge, newvertex, he2, PLUS);
00406 #else
00407 MSD_lowAddHE(newedge, HalVtx(he2), he1, MINUS);
00408 MSD_lowAddHE(newedge, newvertex, he2, PLUS);
00409 #endif
00410 VerVEdge(newvertex) = HalPrv(he2);
00411 VerVEdge(HalVtx(he2)) = he2;
00412
00413 MSD_addEulCoef(s, 0, 0, 0, 1, 1, 0);
00414
00415 #ifdef __curved_env
00416 if ((copy_tag == 0) && (he1->curv != (CUCURV *)NIL))
00417 {
00418 lputctag(nhe1, he1->curv);
00419 lputctag(nhe2, he1->curv);
00420 }
00421 #endif
00422
00423 if (SetTrace)
00424 {
00425 if (TraceSolid(s))
00426 {
00427 fprintf(stderr, MEN_MSDAbortou, NAM_MEV);
00428 exit(1);
00429 }
00430 }
00431 }
00432
00433 int MSD_execStructMEV(EulerOp *op)
00434 {
00435 Id sid, id1, id2, id3, id4, id5, id6, id7, id8;
00436 real fd1, fd2, fd3;
00437
00438 sid = op->solidno;
00439 id1 = op->ip1;
00440 id2 = op->ip2;
00441 id3 = op->ip3;
00442 id4 = op->ip4;
00443 id5 = op->ip5;
00444 id6 = op->ip6;
00445 id7 = op->ip7;
00446 id8 = op->ip8;
00447 fd1 = op->fp1;
00448 fd2 = op->fp2;
00449 fd3 = op->fp3;
00450 return(MSD_highSVME3(sid, id1, id2, id3, id4, id5, id6, id7, id8, fd1,
00451 fd2, fd3));
00452 }
00453
00454 void MSD_printStructMEV(FILE *f, EulerOp *op)
00455 {
00456 Id sid, id1, id2, id3, id4, id5, id6, id7, id8;
00457 real fd1, fd2, fd3;
00458 int com;
00459
00460 sid = op->solidno;
00461 id1 = op->ip1;
00462 id2 = op->ip2;
00463 id3 = op->ip3;
00464 id4 = op->ip4;
00465 id5 = op->ip5;
00466 id6 = op->ip6;
00467 id7 = op->ip7;
00468 id8 = op->ip8;
00469 fd1 = op->fp1;
00470 fd2 = op->fp2;
00471 fd3 = op->fp3;
00472 com = op->CommandCount;
00473 fprintf(f, "svme %d %d %d %d %d %d %d %d %d %d %f %f %f\n", sid,
00474 com, id1, id2, id3, id4, id5, id6, id7, id8, fd1, fd2, fd3);
00475 }
00476
00477 int MSD_readStructMEV(FILE *f, EulerOp *op)
00478 {
00479 int solidno, ip1, ip2, ip3, ip4, ip5, ip6, ip7, ip8, com;
00480 float fp1, fp2, fp3;
00481
00482 if (fscanf(f, "%d %d %d %d %d %d %d %d %d %d %f %f %f\n", &solidno, &com, &ip1,
00483 &ip2, &ip3, &ip4, &ip5, &ip6, &ip7, &ip8, &fp1, &fp2, &fp3) != 13)
00484 {
00485 return(ERROR);
00486 }
00487 op->solidno = solidno;
00488 op->CommandCount = com;
00489 op->ip1 = ip1;
00490 op->ip2 = ip2;
00491 op->ip3 = ip3;
00492 op->ip4 = ip4;
00493 op->ip5 = ip5;
00494 op->ip6 = ip6;
00495 op->ip7 = ip7;
00496 op->ip8 = ip8;
00497 op->fp1 = fp1;
00498 op->fp2 = fp2;
00499 op->fp3 = fp3;
00500 op->fp4 = 1.0;
00501 return(SUCCESS);
00502 }
00503
00504 int MSD_modifyStructMEV(EulerOp *op)
00505 {
00506 int solidno;
00507
00508 solidno = MSD_lowCheckTranslatorTable(op->solidno, SOLID);
00509 op->solidno = solidno;
00510 return(SUCCESS);
00511 }