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 <stdlib.h>
00043 #include <string.h>
00044 #include <math.h>
00045 #include "memvirtu.h"
00046 #include "lowparam.h"
00047 #include "lowmacro.h"
00048 #include "lowsolid.h"
00049 #include "eulerops.h"
00050 #include "vectorop.h"
00051 #include "mancommd.h"
00052 #include "shpshape.h"
00053 #include "disdispl.h"
00054 #include "genfunc_.h"
00055 #include "mensagem.h"
00056
00057 #define LinePTYPE LineTYPE *
00058
00059 typedef struct
00060 {
00061 SPTYPE line;
00062 real *ampl;
00063 real *rot;
00064 } LineTYPE;
00065
00066 LinePTYPE MSD_highSetLine(char *name2, int n);
00067 void MSD_highNameMakeSWEEP(char *name1, int pn, XY *listvtx, LinePTYPE line);
00068 void MSD_execMakeSWEEP(void);
00069 Id MSD_highMakeSWEEP(int pn, XY *listvtx, LinePTYPE line);
00070 SPTYPE MSD_lowMakeSWEEP(Id sn, int pn, XY *listvtx, LinePTYPE line);
00071 int MSD_lowMakeSweepNew(FPTYPE fac, LinePTYPE line);
00072 int MSD_lowMakeNewPoint(vector nc, vector oc, vector li, vector U, vector UpV, real den, real ampl, real rot);
00073 void MSD_lowFaceCG(FPTYPE fac, vector cg);
00074 real MSD_lowLoopCG(LPTYPE l, vector cg, vector norm);
00075
00076 void MSD_execNameMakeSweep(void)
00077 {
00078 LinePTYPE line;
00079 XY *listvtx;
00080 char name1[15], name2[15];
00081 int pn, ln;
00082
00083 while (4 != sscanf(restbuf, "%s %s %d %d", name1, name2, &pn, &ln))
00084 {
00085 printf("Objeto Linha N_divSecao N_divLinha\n");
00086 if (!lineins("? "))
00087 {
00088 return;
00089 }
00090 }
00091 if ((pn > 2) && (ln > 1) && setvtpi(&listvtx, pn) && ((line = MSD_highSetLine(name2, ln)) != NULL))
00092 {
00093 MSD_highNameMakeSWEEP(name1, pn, listvtx, line);
00094 }
00095 }
00096
00097 LinePTYPE MSD_highSetLine(char *name, int n)
00098 {
00099 LinePTYPE line;
00100 Id sn;
00101 char prompt[31];
00102 real x, y, z;
00103 int i, flag = 1;
00104
00105 sn = MSD_getMaxSolidId();
00106 if ((line = (LinePTYPE)malloc(sizeof(LineTYPE))) == NULL)
00107 {
00108 return(NULL);
00109 }
00110 if ((line->ampl = (real *)malloc(n * sizeof(real))) == NULL)
00111 {
00112 free((void *)line);
00113 printf("\nErro na alocacao de amp[]\n");
00114 return(NULL);
00115 }
00116 if ((line->rot = (real *)malloc(n * sizeof(real))) == NULL)
00117 {
00118 free((void *)line->ampl);
00119 free((void *)line);
00120 printf("\nErro na alocacao de rot[]\n");
00121 return(NULL);
00122 }
00123 for (i = 0; i < n; i++)
00124 {
00125 sprintf(prompt, "X%d Y%d Z%d ? ", i, i, i);
00126 do
00127 {
00128 if (!lineins(prompt))
00129 {
00130 return(NULL);
00131 }
00132 } while (3 != sscanf(restbuf, "%f %f %f", &x, &y, &z));
00133 if (i == 0)
00134 {
00135 if ((line->line = MSD_lowMVSF(sn, 1, 1, 1, x, y, z)) == SNIL)
00136 {
00137 flag = 0;
00138 }
00139 }
00140 else
00141 if (MSD_highMEV(sn, 1, i, i + 1, x, y, z) == ERROR)
00142 {
00143 flag = 0;
00144 }
00145 }
00146 for (i = 0; i < n; i++)
00147 {
00148 sprintf(prompt, "A%d ? ", i);
00149 do
00150 {
00151 if (!lineins(prompt))
00152 {
00153 return(NULL);
00154 }
00155 } while (1 != sscanf(restbuf, "%f", line->ampl + i));
00156 }
00157 for (i = n - 1; i > 0; i--)
00158 {
00159 line->ampl[i] /= line->ampl[i - 1];
00160 }
00161 for (i = 0; i < n; i++)
00162 {
00163 sprintf(prompt, "R%d ? ", i);
00164 do
00165 {
00166 if (!lineins(prompt))
00167 {
00168 return(NULL);
00169 }
00170 } while (1 != sscanf(restbuf, "%f", line->rot + i));
00171 line->rot[i] *= PI / 180.0;
00172 }
00173 for (i = n - 1; i > 0; i--)
00174 {
00175 line->rot[i] -= line->rot[i - 1];
00176 }
00177 if (flag == 1)
00178 {
00179 MSD_lowSetNormal(line->line, TRUE);
00180 }
00181 if (flag == 0)
00182 {
00183 MSD_lowHardRemove(line->line);
00184 }
00185 strcpy(SolName(line->line), name);
00186 return(flag == 0 ? NULL : line);
00187 }
00188
00189 void MSD_highNameMakeSWEEP(char *name, int pn, XY *listvtx, LinePTYPE line)
00190 {
00191 SPTYPE optr;
00192 Id sn;
00193
00194 if (MSD_getSolidIdFromName(name) != -1)
00195 {
00196 fprintf(stderr, MEN_SolidoJaExiste, NAM_MakeSweep, name);
00197 return;
00198 }
00199 if ((sn = MSD_highMakeSWEEP(pn, listvtx, line)) != -1)
00200 {
00201 optr = MSD_getSolid(sn);
00202 strcpy(SolName(optr), name);
00203 }
00204 }
00205
00206 Id MSD_highMakeSWEEP(int pn, XY *listvtx, LinePTYPE line)
00207 {
00208 SPTYPE optr;
00209 Id sn;
00210
00211 sn = MSD_getMaxSolidId();
00212 if ((optr = MSD_lowMakeSWEEP(sn, pn, listvtx, line)) != SNIL)
00213 {
00214 MSD_lowDisplayMonitor('o', optr, GNIL);
00215 return(sn);
00216 }
00217 fprintf(stderr, MEN_ParametrosIncorretos, NAM_MakeSweep);
00218 return(-1);
00219 }
00220
00221 SPTYPE MSD_lowMakeSWEEP(Id sn, int pn, XY *listvtx, LinePTYPE line)
00222 {
00223 SPTYPE s;
00224 FPTYPE f;
00225 HPTYPE he;
00226 Id face;
00227 int flag = 1, GOld;
00228 real a;
00229 vector li, lf, vec;
00230
00231 GOld = Gdoinversion;
00232 Gdoinversion = FALSE;
00233 if ((s = MSD_lowMakePolygon(sn, listvtx, pn, 1)) == SNIL)
00234 {
00235 flag = 0;
00236 }
00237 he = LooLEdg(FacFLoops(SheSFaces(SolSShells(line->line))));
00238 veccopy(li, VerVCoord(HalVtx(he)));
00239 veccopy(lf, VerVCoord(HalVtx(HalNxt(he))));
00240 vecminus(vec, lf, li);
00241 f = MSD_getFace(s, 1);
00242 if (FaceEqNOK(f))
00243 {
00244 MSD_lowFaceEq(FacFLOut(f), FacFeq(f));
00245 }
00246 if ((a = dot(FacFeq(f), vec)) == 0.0)
00247 {
00248 flag = 0;
00249 }
00250 face = a > 0.0 ? 1 : 2;
00251 if (MSD_lowMakeSweepNew(MSD_getFace(s, face), line) == ERROR)
00252 {
00253 flag = 0;
00254 }
00255 if (flag == 1)
00256 {
00257 MSD_lowSetNormal(s, TRUE);
00258 MSD_lowSetEdgeAngle(s);
00259 MSD_lowSetInfo(s);
00260 }
00261 if (flag == 0)
00262 {
00263 MSD_lowHardRemove(s);
00264 }
00265 if (flag == 1)
00266 {
00267 MSD_lowAddEulerOp(s, HARDREM, 0, 0, 0, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0.0);
00268 }
00269 Gdoinversion = GOld;
00270 return(flag == 0 ? SNIL : s);
00271 }
00272
00273 int MSD_lowMakeSweepNew(FPTYPE fac, LinePTYPE line)
00274 {
00275 LPTYPE l;
00276 HPTYPE first;
00277 HPTYPE scan;
00278 HPTYPE he;
00279 HPTYPE h;
00280 VPTYPE v;
00281 Id maxvert, maxface;
00282 int i = 0;
00283 real den;
00284 vector dl, ls, li, lf, nc, CG, U, V, UpV;
00285
00286 maxvert = MSD_getMaxVertexId(SheSSolids(FacFShell(fac)));
00287 maxface = MSD_getMaxFaceId(SheSSolids(FacFShell(fac)));
00288 MSD_lowFaceCG(fac, CG);
00289 he = LooLEdg(FacFLoops(SheSFaces(SolSShells(line->line))));
00290 veccopy(ls, VerVCoord(HalVtx(he)));
00291 vecminus(dl, CG, ls);
00292 h = he;
00293 do
00294 {
00295 vecplus(VerVCoord(HalVtx(h)), VerVCoord(HalVtx(h)), dl);
00296 h = HalNxt(h);
00297 } while (h != he);
00298 veccopy(li, VerVCoord(HalVtx(he)));
00299 veccopy(lf, VerVCoord(HalVtx(HalNxt(he))));
00300 normalize(vecminus(V, lf, li));
00301 do
00302 {
00303 veccopy(U, V);
00304 he = HalNxt(he), i++;
00305 veccopy(li, VerVCoord(HalVtx(he)));
00306 if (mate(he) != HalPrv(he))
00307 {
00308 veccopy(lf, VerVCoord(HalVtx(HalNxt(he))));
00309 normalize(vecminus(V, lf, li));
00310 }
00311 vecplus(UpV, U, V);
00312 if ((den = 1 + dot(U, V)) == 0.0)
00313 {
00314 return(ERROR);
00315 }
00316 for (AllLoopsFace(fac, l))
00317 {
00318 first = LooLEdg(l);
00319 scan = HalNxt(first);
00320 v = HalVtx(scan);
00321 if (MSD_lowMakeNewPoint(nc, VerVCoord(v), li, U, UpV, den, line->ampl[i], line->rot[i]) == ERROR)
00322 {
00323 return(ERROR);
00324 }
00325 MSD_lowMEV(scan, scan, ++maxvert, nc[0], nc[1], nc[2]);
00326 while (scan != first)
00327 {
00328 v = HalVtx(HalNxt(scan));
00329 if (MSD_lowMakeNewPoint(nc, VerVCoord(v), li, U, UpV, den, line->ampl[i], line->rot[i]) == ERROR)
00330 {
00331 return(ERROR);
00332 }
00333 MSD_lowMEV(HalNxt(scan), HalNxt(scan), ++maxvert, nc[0], nc[1], nc[2]);
00334 MSD_lowMEF(HalPrv(scan), HalNxt(HalNxt(scan)), ++maxface);
00335 scan = HalNxt(mate(HalNxt(scan)));
00336 }
00337 MSD_lowMEF(HalPrv(scan), HalNxt(HalNxt(scan)), ++maxface);
00338 }
00339 } while (mate(he) != HalPrv(he));
00340 return(SUCCESS);
00341 }
00342
00343 int MSD_lowMakeNewPoint(vector nc, vector pc, vector li, vector U, vector UpV, real den, real ampl, real rot)
00344 {
00345 real alpha;
00346 vector aux1, aux2, dl, lmf, n;
00347
00348 vecminus(lmf, li, pc);
00349 if ((alpha = dot(UpV, lmf) / den) < 0.0)
00350 {
00351 return(ERROR);
00352 }
00353 veccopy(n, UpV);
00354 normalize(n);
00355 vecesc(dl, U, alpha);
00356 vecplus(aux1, pc, dl);
00357 vecminus(aux1, aux1, li);
00358 vecesc(aux1, aux1, ampl);
00359 if (rot)
00360 {
00361 veccopy(aux2, aux1);
00362 vecesc(aux2, aux2, cos(rot));
00363 cross(aux1, aux1, n);
00364 printf("sfia");
00365 vecesc(aux1, aux1, sin(rot));
00366 vecplus(aux1, aux1, aux2);
00367 }
00368 vecplus(nc, li, aux1);
00369 return(SUCCESS);
00370 }
00371
00372
00373 void MSD_lowFaceCG(FPTYPE fac, vector cg)
00374 {
00375 LPTYPE l;
00376 real area = 0;
00377 vector gg;
00378
00379 veczer(cg);
00380 if (FaceEqNOK(fac))
00381 {
00382 MSD_lowFaceEq(FacFLOut(fac), FacFeq(fac));
00383 }
00384 l = FacFLoops(fac);
00385 while (l != LNIL)
00386 {
00387 area += MSD_lowLoopCG(l, gg, FacFeq(fac));
00388 vecplus(cg, cg, gg);
00389 l = LooNextL(l);
00390 }
00391 vecesc(cg, cg, 1 / area);
00392 veczer(cg);
00393 }
00394
00395
00396
00397 real MSD_lowLoopCG(LPTYPE l, vector cg, vector norm)
00398 {
00399 HPTYPE he;
00400 VPTYPE v1;
00401 VPTYPE v2;
00402 VPTYPE v3;
00403 real area = 0, ar;
00404 vector aa, bb, cc, gg;
00405
00406 veczer(cg);
00407 he = LooLEdg(l);
00408 v1 = HalVtx(he);
00409 he = HalNxt(HalNxt(he));
00410 do
00411 {
00412 v2 = HalVtx(HalPrv(he));
00413 v3 = HalVtx(he);
00414 vecminus(aa, VerVCoord(v2), VerVCoord(v1));
00415 vecminus(bb, VerVCoord(v3), VerVCoord(v1));
00416 cross(cc, aa, bb);
00417 ar = 0.5 * dot(norm, cc);
00418 area += ar;
00419 veccopy(gg, VerVCoord(v1));
00420 vecplus(gg, gg, VerVCoord(v2));
00421 vecplus(gg, gg, VerVCoord(v3));
00422 vecesc(gg, gg, ar / 3);
00423 vecplus(cg, cg, gg);
00424 } while ((he = HalNxt(he)) != LooLEdg(l));
00425 return(area);
00426 }