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 #include <string.h>
00043 #include "mensagem.h"
00044 #include "memvirtu.h"
00045 #include "lowmacro.h"
00046 #include "lowparam.h"
00047 #include "lowsolid.h"
00048 #include "eulerops.h"
00049 #include "vectorop.h"
00050 #include "mancommd.h"
00051 #include "rndround.h"
00052 #include "curvgeom.h"
00053 #include "disdispl.h"
00054 #include "shpshape.h"
00055 #include "genfunc_.h"
00056
00057 EPTYPE sedge(SPTYPE s, Id en)
00058 {
00059 DPTYPE d;
00060 EPTYPE e;
00061
00062 for (AllShellsSolid(s, d))
00063 {
00064 for (AllEdgesShell(d, e))
00065 {
00066 if (EdgEdgeNo(e) == en)
00067 {
00068 return(e);
00069 }
00070 }
00071 }
00072 return(ENIL);
00073 }
00074
00075 void MSD_execRound(void)
00076 {
00077 char sn[20];
00078 int ne, flag_vertex;
00079
00080 while (3 != sscanf(restbuf, "%s %d %d ", sn, &ne, &flag_vertex))
00081 {
00082 printf("Solidname Numero_Arestas Flag_Vertices\n");
00083 if (!lineins("? "))
00084 {
00085 return;
00086 }
00087 }
00088 if (MSD_highRound(sn, ne, flag_vertex) == ERROR)
00089 {
00090 fprintf(stderr, MEN_OperacaoNaoRealizada, NAM_Round);
00091 }
00092 }
00093
00094 int MSD_highRound(char *sn, int ne, int flag_vertex)
00095 {
00096 SPTYPE s;
00097 EPTYPE e;
00098 int i, ip, edgeno, fg_edge;
00099 RND *listrnd;
00100 float r, r1, r2, d1, d2;
00101
00102 if ((s = MSD_lowFindSolidByName(sn)) == SNIL)
00103 {
00104 fprintf(stderr, MEN_NaoEncontrouSolidNome, NAM_Round, sn);
00105 return(FALSE);
00106 }
00107 if (ne > 100)
00108 {
00109 return(FALSE);
00110 }
00111 listrnd = (RND *)workbuf;
00112
00113 char str[100];
00114 for (i = 0; i < ne; i++)
00115 {
00116 ip = 0;
00117 while (ip == 0)
00118 {
00119 do
00120 {
00121 sprintf(str, "Aresta%2d 01234 r d1/d2 r1/r2: ", i + 1);
00122 if (!lineins(str))
00123 {
00124 return(FALSE);
00125 }
00126 } while (2 != sscanf(restbuf, "%d %d", &edgeno, &fg_edge));
00127 (listrnd + i)->edgeno = edgeno;
00128 (listrnd + i)->fg_edge = fg_edge;
00129 switch (fg_edge)
00130 {
00131 case 0:
00132 ip = 1;
00133 break;
00134
00135 case 1:
00136 ip = 1;
00137 break;
00138
00139 case 2:
00140 skipnext(&restbuf);
00141 skipnext(&restbuf);
00142 if (1 == sscanf(restbuf, "%f", &r))
00143 {
00144 (listrnd + i)->r = r;
00145 ip = 1;
00146 }
00147 break;
00148
00149 case 3:
00150 skipnext(&restbuf);
00151 skipnext(&restbuf);
00152 if (2 == sscanf(restbuf, "%f %f", &d1, &d2))
00153 {
00154 (listrnd + i)->d1 = d1;
00155 (listrnd + i)->d2 = d2;
00156 ip = 1;
00157 }
00158 break;
00159
00160 case 4:
00161 skipnext(&restbuf);
00162 skipnext(&restbuf);
00163 if (2 == sscanf(restbuf, "%f %f", &r1, &r2))
00164 {
00165 (listrnd + i)->r1 = r1;
00166 (listrnd + i)->r2 = r2;
00167 ip = 1;
00168 }
00169 break;
00170 }
00171 }
00172 }
00173
00174 for (i = 0; i < ne; i++)
00175 {
00176 if ((e = sedge(s, (listrnd + i)->edgeno)) == ENIL)
00177 {
00178 fprintf(stderr, MEN_NaoEncontrouEdgeNo, NAM_Round,
00179 (listrnd + i)->edgeno, SolSolidNo(s));
00180 return(FALSE);
00181 }
00182 switch ((listrnd + i)->fg_edge)
00183 {
00184 case 0:
00185 VerFgRound(HalVtx(EdgHe1(e))) = flag_vertex;
00186 VerFgRound(HalVtx(EdgHe2(e))) = flag_vertex;
00187 EdgFgRound(e) = 0;
00188 HalR(EdgHe1(e)) = 0;
00189 HalR(EdgHe2(e)) = 0;
00190 break;
00191
00192 case 1:
00193 VerFgRound(HalVtx(EdgHe1(e))) = flag_vertex;
00194 VerFgRound(HalVtx(EdgHe2(e))) = flag_vertex;
00195 EdgFgRound(e) = 1;
00196 break;
00197
00198 case 2:
00199 VerFgRound(HalVtx(EdgHe1(e))) = flag_vertex;
00200 VerFgRound(HalVtx(EdgHe2(e))) = flag_vertex;
00201 EdgFgRound(e) = 2;
00202 HalR(EdgHe1(e)) = (listrnd + i)->r;
00203 HalR(EdgHe2(e)) = (listrnd + i)->r;
00204 break;
00205
00206 case 3:
00207 VerFgRound(HalVtx(EdgHe1(e))) = flag_vertex;
00208 VerFgRound(HalVtx(EdgHe2(e))) = flag_vertex;
00209 EdgFgRound(e) = 3;
00210 HalR(EdgHe1(e)) = (listrnd + i)->d1;
00211 HalR(EdgHe2(e)) = (listrnd + i)->d2;
00212 break;
00213
00214 case 4:
00215 VerFgRound(HalVtx(EdgHe1(e))) = flag_vertex;
00216 VerFgRound(HalVtx(EdgHe2(e))) = flag_vertex;
00217 EdgFgRound(e) = 4;
00218 HalR(EdgHe1(e)) = (listrnd + i)->r1;
00219 HalR(EdgHe2(e)) = (listrnd + i)->r2;
00220 break;
00221 }
00222 }
00223
00224 if (MSD_lowRound(s) == ERROR)
00225 {
00226 return(ERROR);
00227 }
00228 return(SUCCESS);
00229 }
00230
00231 int MSD_lowRound(SPTYPE s)
00232 {
00233 if (GeneratingVertices_edges(s) == ERROR)
00234 {
00235 return(ERROR);
00236 }
00237 EdgeGeneration_faces(s);
00238 GenerationCurved_edges(s);
00239 leval_edge(s, 10);
00240 MSD_lowSetNormal(s, TRUE);
00241 MSD_lowSetEdgeAngle(s);
00242 MSD_lowSetInfo(s);
00243 return(SUCCESS);
00244 }
00245
00246 Id getmaxct(SPTYPE s)
00247 {
00248 CURVE *c;
00249 Id tagno;
00250
00251 if (SolCurv(s) == (CURVE *)NIL)
00252 {
00253 return(0);
00254 }
00255 tagno = SolCurv(s)->tagno;
00256 for (AllCurvesSolid(s, c))
00257 {
00258 if (c->tagno > tagno)
00259 {
00260 tagno = c->tagno;
00261 }
00262 }
00263 return(tagno);
00264 }
00265
00266 int leval_edge(SPTYPE s, int nsegm)
00267 {
00268 EPTYPE e;
00269 DPTYPE d;
00270
00271 for (AllShellsSolid(s, d))
00272 {
00273 for (AllEdgesShell(d, e))
00274 {
00275 if (HalCurv(EdgHe1(e)) != (CURVE *)NIL)
00276 {
00277 MSD_lowEvaluateCurvePolyline(EdgHe1(e), nsegm);
00278 }
00279 }
00280 }
00281 return(1);
00282 }
00283
00284 #ifdef __Extended_Version
00285 void MSD_execEvalEdge(void)
00286 {
00287 int nsegm;
00288 char sn[20];
00289 SPTYPE s;
00290
00291 while (2 != sscanf(restbuf, "%s %d ", sn, &nsegm))
00292 {
00293 printf("Solidname Nsegm\n");
00294 if (!lineins("? "))
00295 {
00296 return;
00297 }
00298 }
00299 if ((s = MSD_lowFindSolidByName(sn)) == SNIL)
00300 {
00301 fprintf(stderr, "MSD_execEvalEdge: solid %s not found\n", sn);
00302 return;
00303 }
00304 leval_edge(s, nsegm);
00305 }
00306
00307 #endif
00308
00309 int lrnd_alledges(SPTYPE s, real r)
00310 {
00311 DPTYPE d;
00312 EPTYPE e;
00313 VPTYPE v;
00314
00315 for (AllShellsSolid(s, d))
00316 {
00317 for (AllEdgesShell(d, e))
00318 {
00319 EdgFgRound(e) = 2;
00320 HalR(EdgHe1(e)) = r;
00321 HalR(EdgHe2(e)) = r;
00322 }
00323 }
00324
00325 for (AllShellsSolid(s, d))
00326 {
00327 for (AllVerticesShell(d, v))
00328 {
00329 VerFgRound(v) = 1;
00330 }
00331 }
00332
00333 if (MSD_lowRound(s) == ERROR)
00334 {
00335 return(ERROR);
00336 }
00337 return(SUCCESS);
00338 }
00339
00340 void MSD_execRndAllEdges(void)
00341 {
00342 char sn[20];
00343 SPTYPE s;
00344 float r;
00345
00346 while (2 != sscanf(restbuf, "%s %f ", sn, &r))
00347 {
00348 printf("Solidname Raio\n");
00349 if (!lineins("? "))
00350 {
00351 return;
00352 }
00353 }
00354 if ((s = MSD_lowFindSolidByName(sn)) == SNIL)
00355 {
00356 fprintf(stderr, MEN_NaoEncontrouSolidNome, NAM_RoundAll, sn);
00357 return;
00358 }
00359 if (lrnd_alledges(s, r) == ERROR)
00360 {
00361 printf(MEN_OperacaoNaoRealizada, NAM_RoundAll);
00362 }
00363 }