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 "mancommd.h"
00052
00053 #ifdef __Extended_Version
00054 void MSD_execMEKR(void)
00055 {
00056 int sn, fn, v1, v2, op;
00057
00058 while (5 != sscanf(restbuf, "%d %d %d %d %d", &sn, &op, &fn, &v1, &v2))
00059 {
00060 printf("mekr: Sid F V1 V2\n");
00061 if (!lineins("? "))
00062 {
00063 return;
00064 }
00065 }
00066 MSD_highMEKR(sn, fn, v1, v2);
00067 }
00068
00069 #endif
00070
00071 int MSD_highMEKR(Id sn, Id fn, Id v1, Id v2)
00072 {
00073 SPTYPE s;
00074 FPTYPE f;
00075 LPTYPE l1;
00076 LPTYPE l2;
00077 HPTYPE he1;
00078 HPTYPE he2;
00079
00080 if ((s = MSD_getSolid(sn)) == SNIL)
00081 {
00082 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_MEKR, sn);
00083 return(ERROR);
00084 }
00085 if ((f = MSD_getFace(s, fn)) == FNIL)
00086 {
00087 fprintf(stderr, MEN_NaoEncontrouFace, NAM_MEKR, fn, sn);
00088 return(ERROR);
00089 }
00090 if ((l1 = MSD_getLoop(f, v1, &he1)) == LNIL)
00091 {
00092 fprintf(stderr, MEN_NaoEncontrouVertice, NAM_MEKR, v1, sn);
00093 return(ERROR);
00094 }
00095 if ((l2 = MSD_getLoop(f, v2, &he2)) == LNIL)
00096 {
00097 fprintf(stderr, MEN_NaoEncontrouVertice, NAM_MEKR, v2, sn);
00098 return(ERROR);
00099 }
00100 if (l1 == l2)
00101 {
00102 fprintf(stderr, MEN_VerticesEmLoopsDistintos, NAM_MEKR, v1, v2, sn);
00103 return(ERROR);
00104 }
00105 MSD_lowMEKR(he1, he2);
00106 return(SUCCESS);
00107 }
00108
00109 #ifdef __Extended_Version
00110 void MSD_execMEKR2(void)
00111 {
00112 int sn, v1, v2, v3, v4, f1, f2, f3, op;
00113
00114 while (9 != sscanf(restbuf, "%d %d %d %d %d %d %d %d %d", &sn, &op, &v1, &v2,
00115 &v3, &v4, &f1, &f2, &f3))
00116 {
00117 printf("smekr: Sid V1 V2 V3 V4 F1 F2 F3\n");
00118 if (!lineins("? "))
00119 {
00120 return;
00121 }
00122 }
00123 MSD_highMEKR2(sn, v1, v2, v3, v4, f1, f2, f3);
00124 }
00125
00126 #endif
00127
00128 int MSD_highMEKR2(Id sn, Id v1, Id v2, Id v3, Id v4, Id f1, Id f2, Id f3)
00129 {
00130 SPTYPE s;
00131 FPTYPE ff1;
00132 FPTYPE ff2;
00133 FPTYPE ff3;
00134 HPTYPE he1;
00135 HPTYPE he2;
00136
00137 if ((s = MSD_getSolid(sn)) == SNIL)
00138 {
00139 fprintf(stderr, MEN_NaoEncontrouSolido, NAM_MEKR2, sn);
00140 return(ERROR);
00141 }
00142 if ((ff1 = MSD_getFace(s, f1)) == FNIL)
00143 {
00144 fprintf(stderr, MEN_NaoEncontrouFace, NAM_MEKR2, f1, sn);
00145 return(ERROR);
00146 }
00147 if ((ff2 = MSD_getFace(s, f2)) == FNIL)
00148 {
00149 fprintf(stderr, MEN_NaoEncontrouFace, NAM_MEKR2, f2, sn);
00150 return(ERROR);
00151 }
00152 if ((ff3 = MSD_getFace(s, f3)) == FNIL)
00153 {
00154 fprintf(stderr, MEN_NaoEncontrouFace, NAM_MEKR2, f3, sn);
00155 return(ERROR);
00156 }
00157 if (MSD_getHalfedge(ff1, ff2, v1, v3, &he1) == LNIL)
00158 {
00159 fprintf(stderr, MEN_NaoEncontrouArestaV, NAM_MEKR2, v1, v2, sn);
00160 return(ERROR);
00161 }
00162 if (MSD_getHalfedge(ff1, ff3, v2, v4, &he2) == LNIL)
00163 {
00164 fprintf(stderr, MEN_NaoEncontrouArestaV, NAM_MEKR2, v1, v3, sn);
00165 return(ERROR);
00166 }
00167 MSD_lowMEKR(he1, he2);
00168 return(SUCCESS);
00169 }
00170
00171 void MSD_lowMEKR(HPTYPE he1, HPTYPE he2)
00172 {
00173 SPTYPE s;
00174 DPTYPE d;
00175 FPTYPE f;
00176 LPTYPE l1;
00177 LPTYPE l2;
00178 EPTYPE newedge;
00179 HPTYPE nhe1;
00180 HPTYPE nhe2;
00181 HPTYPE he;
00182 VPTYPE v1;
00183 VPTYPE v2;
00184 Id va, vb, f1;
00185 Id vc, vd, f2, f3;
00186
00187 assert1((l1 = HalWLoop(he1)) != (l2 = HalWLoop(he2)));
00188 assert1((f = LooLFace(l1)) == LooLFace(l2));
00189
00190 d = FacFShell(f);
00191 s = SheSSolids(d);
00192 if (Gdoinversion)
00193 {
00194 f1 = FacFaceNo(f);
00195
00196 he = LooLEdg(FacFLOut(f));
00197 va = VerVertexNo(HalVtx(he));
00198 vb = HalNxt(he) != he ? VerVertexNo(HalVtx(HalNxt(he))) : 0;
00199 MSD_lowAddEulerOp(s, RMOVE, va, vb, f1, f1, TRUE, 0, 0, 0, 0.0, 0.0, 0.0, 0.0);
00200
00201 va = l1 == FacFLOut(f) ? VerVertexNo(HalVtx(he1)) : VerVertexNo(HalVtx(he2));
00202 vb = l1 == FacFLOut(f) ? VerVertexNo(HalVtx(he2)) : VerVertexNo(HalVtx(he1));
00203 MSD_lowAddEulerOp(s, KEMR, f1, vb, va, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0.0);
00204 }
00205
00206 if (Gdodirect)
00207 {
00208 va = VerVertexNo(HalVtx(he1));
00209 vb = VerVertexNo(HalVtx(he2));
00210 vc = VerVertexNo(HalVtx(HalNxt(he1)));
00211 vd = VerVertexNo(HalVtx(HalNxt(he2)));
00212 f1 = FacFaceNo(LooLFace(HalWLoop(he1)));
00213 f2 = HalEdg(he1) == ENIL ? f1 : FacFaceNo(LooLFace(HalWLoop(mate(he1))));
00214 f3 = HalEdg(he1) == ENIL ? f1 : FacFaceNo(LooLFace(HalWLoop(mate(he2))));
00215 MSD_lowAddEulerOpRedo(s, MEKR, va, vb, vc, vd, f1, f2, f3, 0, 0.0, 0.0, 0.0, 0.0);
00216 }
00217
00218 newedge = (EPTYPE)MSD_lowNewElement(EDGE, (NPTYPE)d);
00219 EdgEdgeNo(newedge) = -1;
00220 he = LooLEdg(l2);
00221 do
00222 {
00223 HalWLoop(he) = l1;
00224 } while ((he = HalNxt(he)) != LooLEdg(l2));
00225
00226 v1 = HalVtx(he1);
00227 v2 = HalVtx(he2);
00228 nhe1 = MSD_lowAddHE(newedge, v1, he1, PLUS);
00229 nhe2 = MSD_lowAddHE(newedge, v2, he2, MINUS);
00230 if (VerVEdge(v1) == HNIL)
00231 {
00232 VerVEdge(v1) = nhe1;
00233 }
00234 if (VerVEdge(v2) == HNIL)
00235 {
00236 VerVEdge(v2) = nhe2;
00237 }
00238
00239 HalNxt(nhe1) = he2;
00240 HalNxt(nhe2) = he1;
00241 HalPrv(he2) = nhe1;
00242 HalPrv(he1) = nhe2;
00243
00244 LooLength(l1) += LooLength(l2) + 2;
00245 if (FacFLOut(f) == l2)
00246 {
00247 FacFLOut(f) = l1;
00248 }
00249 MSD_lowDelElement(LOOP, (NPTYPE)l2, (NPTYPE)LooLFace(l2));
00250
00251 MSD_addEulCoef(s, 0, 0, -1, 1, 0, 0);
00252
00253 if (SetTrace)
00254 {
00255 if (TraceSolid(s))
00256 {
00257 fprintf(stderr, MEN_MSDAbortou, NAM_MEKR2);
00258 exit(1);
00259 }
00260 }
00261 }
00262
00263 int MSD_execStructMEKR(EulerOp *op)
00264 {
00265 Id sid, id1, id2, id3, id4, id5, id6, id7;
00266
00267 sid = op->solidno;
00268 id1 = op->ip1;
00269 id2 = op->ip2;
00270 id3 = op->ip3;
00271 id4 = op->ip4;
00272 id5 = op->ip5;
00273 id6 = op->ip6;
00274 id7 = op->ip7;
00275 return(MSD_highMEKR2(sid, id1, id2, id3, id4, id5, id6, id7));
00276 }
00277
00278 void MSD_printStructMEKR(FILE *f, EulerOp *op)
00279 {
00280 Id sid, id1, id2, id3, id4, id5, id6, id7;
00281 int com;
00282
00283 sid = op->solidno;
00284 id1 = op->ip1;
00285 id2 = op->ip2;
00286 id3 = op->ip3;
00287 id4 = op->ip4;
00288 id5 = op->ip5;
00289 id6 = op->ip6;
00290 id7 = op->ip7;
00291 com = op->CommandCount;
00292 fprintf(f, "mekr %d %d %d %d %d %d %d %d %d\n", sid, com, id1, id2,
00293 id3, id4, id5, id6, id7);
00294 }
00295
00296 int MSD_readStructMEKR(FILE *f, EulerOp *op)
00297 {
00298 int solidno, ip1, ip2, ip3, ip4, ip5, ip6, ip7, com;
00299
00300 if (fscanf(f, "%d %d %d %d %d %d %d %d %d\n", &solidno, &com, &ip1, &ip2,
00301 &ip3, &ip4, &ip5, &ip6, &ip7) != 9)
00302 {
00303 return(ERROR);
00304 }
00305 op->solidno = solidno;
00306 op->CommandCount = com;
00307 op->ip1 = ip1;
00308 op->ip2 = ip2;
00309 op->ip3 = ip3;
00310 op->ip4 = ip4;
00311 op->ip5 = ip5;
00312 op->ip6 = ip6;
00313 op->ip7 = ip7;
00314 op->ip8 = 0;
00315 op->fp1 = 0.0;
00316 op->fp2 = 0.0;
00317 op->fp3 = 0.0;
00318 op->fp4 = 0.0;
00319 return(SUCCESS);
00320 }
00321
00322 int MSD_modifyStructMEKR(EulerOp *op)
00323 {
00324 int solidno;
00325
00326 solidno = MSD_lowCheckTranslatorTable(op->solidno, SOLID);
00327 op->solidno = solidno;
00328 return(SUCCESS);
00329 }