ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/geometrie/src/sld_surface.cpp
Revision: 24
Committed: Wed Jul 4 21:16:27 2007 UTC (17 years, 10 months ago) by bournival
Original Path: magic/lib/geometrie/geometrie/src/sld_surface.cpp
File size: 10208 byte(s)
Log Message:
Modification sur la façon d'obtenir les tolérances. [y'a pas de modif dans sld_courbes, en fait pour les courbes, la modif est dans sld_Import]

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuillière et Vincent FRANCOIS
5     // Département de Génie Mécanique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du département
8     // de génie mécanique de l'Université du Québec à
9     // Trois Rivières
10     // Les librairies ne peuvent être utilisées sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // sld_surface.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 à 11H22
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26    
27     #ifdef BREP_SLD
28    
29     #include "mg_surface.h"
30     #include "sld_surface.h"
31     #include <system.hpp>
32     #include <atl\atlmod.h>
33     #include "smartvars.h"
34     //#include <clx.h>
35     #include "sld_fonction.h"
36     #include "stplane.h"
37     #include "stcylindrical.h"
38     #include "stconical.h"
39     #include "stspherical.h"
40     #include "sttoroidal.h"
41     #include "stbsplines.h"
42    
43    
44     //TComModule& _Module=*static_cast<TComModule*>(NULL);
45    
46     SLD_SURFACE::SLD_SURFACE(unsigned long num,string idface,SLD_FONCTION& fonc):MG_SURFACE(num),fonction(fonc)
47     {
48     initialisation(idface);
49     }
50    
51    
52    
53     SLD_SURFACE::SLD_SURFACE(string idface,SLD_FONCTION& fonc):MG_SURFACE(),fonction(fonc)
54     {
55     initialisation(idface);
56     }
57    
58     void SLD_SURFACE::initialisation(string idface)
59     {
60     idoriginal=idface;
61     fonction.GetParID((char*)idface.c_str(),swFace);
62     swFace->IGetSurface(&swSurface);
63     CComVariant vparam;
64     swSurface->Parameterization( &vparam);
65     SafeDoubleArray saparam(vparam);
66     u_min=saparam[0];
67     u_max=saparam[1];
68     v_min=saparam[2];
69     v_max=saparam[3];
70     periodique_u=0;
71     periodique_v=0;
72     int val1,val2;
73     OPERATEUR::doubleto2int(saparam[4],val1,val2);
74     if ((val1==13701) && (val2==13701)) periodique_u=1;
75     OPERATEUR::doubleto2int(saparam[5],val1,val2);
76     if ((val1==13701) && (val2==13701)) periodique_v=1;
77     stsurface=NULL;
78     VARIANT_BOOL retval;
79     swSurface->IsPlane(&retval);
80     if (retval==1)
81     {
82     CComVariant vRetval;
83     vRetval=swSurface->get_PlaneParams();
84     SafeDoubleArray sda(vRetval);
85     double origine[3];
86     double dir[3];
87     origine[0]=sda[3];
88     origine[1]=sda[4];
89     origine[2]=sda[5];
90     dir[0]=sda[0];
91     dir[1]=sda[1];
92     dir[2]=sda[2];
93     stsurface=new ST_PLANE(origine,dir);
94     return;
95     }
96     swSurface->IsCylinder(&retval);
97     if (retval==1)
98     {
99     CComVariant vRetval;
100     vRetval=swSurface->get_CylinderParams();
101     SafeDoubleArray sda(vRetval);
102     double origine[3];
103     double dir[3];
104     origine[0]=sda[0];
105     origine[1]=sda[1];
106     origine[2]=sda[2];
107     dir[0]=sda[3];
108     dir[1]=sda[4];
109     dir[2]=sda[5];
110     double rayon=sda[6];
111     stsurface=new ST_CYLINDRICAL(origine,dir,NULL,rayon);
112     return;
113     }
114     swSurface->IsCone(&retval);
115     if (retval==1)
116     {
117     CComVariant vRetval;
118     vRetval=swSurface->get_ConeParams();
119     SafeDoubleArray sda(vRetval);
120     double origine[3];
121     double dir[3];
122     origine[0]=sda[0];
123     origine[1]=sda[1];
124     origine[2]=sda[2];
125     dir[0]=-sda[3];
126     dir[1]=-sda[4];
127     dir[2]=-sda[5];
128     double rayon=sda[6];
129     double angle=sda[7];
130     stsurface=new ST_CONICAL(origine,dir,NULL,rayon,angle);
131     return;
132     }
133     swSurface->IsSphere(&retval);
134     if (retval==1)
135     {
136     CComVariant vRetval;
137     vRetval=swSurface->get_SphereParams() ;
138     SafeDoubleArray sda(vRetval);
139     double origine[3];
140     origine[0]=sda[0];
141     origine[1]=sda[1];
142     origine[2]=sda[2];
143     double rayon=sda[3];
144     stsurface=new ST_SPHERICAL(origine,NULL,NULL,rayon);
145     return;
146     }
147     swSurface->IsTorus(&retval) ;
148     if (retval==1)
149     {
150     CComVariant vRetval;
151     vRetval=swSurface->get_TorusParams();
152     SafeDoubleArray sda(vRetval);
153     double origine[3];
154     double dir[3];
155     origine[0]=sda[0];
156     origine[1]=sda[1];
157     origine[2]=sda[2];
158     dir[0]=sda[3];
159     dir[1]=sda[4];
160     dir[2]=sda[5];
161     double grayon=sda[6];
162     double prayon=sda[7];
163     stsurface=new ST_TOROIDAL(origine,dir,grayon,prayon);
164     return;
165     }
166     VARIANT vRetval;
167     VARIANT_BOOL sense;
168     VARIANT vp0;
169     vp0=swFace->GetUVBounds();
170 bournival 24 double tolerance = fonction.GetValeurTolerance() ;
171     swSurface->GetBSurfParams2(false,false,vp0,tolerance,&sense,&vRetval);
172 5 SafeDoubleArray sda(vRetval);
173     int uordre,vordre;
174     int numcpt,numlpt;
175     int dim,dummy;
176     OPERATEUR::doubleto2int(sda[0],uordre,vordre);
177     OPERATEUR::doubleto2int(sda[1],numcpt,numlpt);
178     OPERATEUR::doubleto2int(sda[3],dim,dummy);
179     vector<double> knots_u;
180     vector<double> knots_v;
181     vector<double> poids;
182     vector<double> ptsctr;
183     for (int i=0;i<uordre+numcpt;i++)
184     knots_u.insert(knots_u.end(),sda[4+i]);
185     for (int i=0;i<vordre+numlpt;i++)
186     knots_v.insert(knots_v.end(),sda[4+uordre+numcpt+i]);
187     for (int i=0;i<numcpt;i++)
188     for (int j=0;j<numlpt;j++)
189     {
190     int num=j*numcpt+i;
191     ptsctr.insert(ptsctr.end(),sda[4+uordre+numcpt+vordre+numlpt+dim*num]);
192     ptsctr.insert(ptsctr.end(),sda[4+uordre+numcpt+vordre+numlpt+dim*num+1]);
193     ptsctr.insert(ptsctr.end(),sda[4+uordre+numcpt+vordre+numlpt+dim*num+2]);
194     if (dim==4) poids.insert(poids.end(),sda[4+uordre+numcpt+vordre+numlpt+dim*num+3]);
195     else poids.insert(poids.end(),1.);
196     }
197     int sens;
198     sens=1;
199     stsurface=new ST_B_SPLINE_SURF(uordre-1,vordre-1,knots_u,knots_v,ptsctr,poids,sens);
200    
201    
202     };
203    
204    
205     SLD_SURFACE::~SLD_SURFACE()
206     {
207     if (stsurface!=NULL) delete stsurface;
208     }
209    
210     void SLD_SURFACE::evaluer(double *uv,double *xyz)
211     {
212     if (stsurface!=NULL)
213     {
214     stsurface->evaluer(uv,xyz);
215     return;
216     }
217     //entrée
218     double UParam=uv[0];
219     double VParam=uv[1];
220     long NumUDeriv=0;
221     long NumVDeriv=0;
222     //sortie
223     CComVariant vretval;
224    
225     swSurface->Evaluate ( UParam, VParam, NumUDeriv, NumVDeriv, &vretval);
226     SafeDoubleArray saretval(vretval);
227     //notre résultat
228     xyz[0]=saretval[0];
229     xyz[1]=saretval[1];
230     xyz[2]=saretval[2];
231     }
232    
233     void SLD_SURFACE::deriver(double *uv,double *xyzdu, double *xyzdv)
234     {
235     if (stsurface!=NULL)
236     {
237     stsurface->deriver(uv,xyzdu,xyzdv);
238     return;
239     }
240     //entrée
241     double UParam=uv[0];
242     double VParam=uv[1];
243     long NumUDeriv=1;
244     long NumVDeriv=1;
245     //sortie
246     CComVariant vretval;
247    
248     swSurface->Evaluate ( UParam, VParam, NumUDeriv, NumVDeriv, &vretval);
249     SafeDoubleArray saretval(vretval);
250     xyzdu[0]=saretval[3];
251     xyzdu[1]=saretval[4];
252     xyzdu[2]=saretval[5];
253     xyzdv[0]=saretval[6];
254     xyzdv[1]=saretval[7];
255     xyzdv[2]=saretval[8];
256     }
257    
258     void SLD_SURFACE::deriver_seconde(double *uv,double* xyzduu,double* xyzduv,double* xyzdvv,double *xyz, double *xyzdu, double *xyzdv)
259     {
260     if (stsurface!=NULL)
261     {
262     stsurface->deriver_seconde(uv,xyzduu,xyzduv,xyzdvv,xyz,xyzdu,xyzdv);
263     return;
264     }
265     //entrée
266     double UParam=uv[0];
267     double VParam=uv[1];
268     long NumUDeriv=2;
269     long NumVDeriv=2;
270     //sortie
271     CComVariant vretval;
272    
273     swSurface->Evaluate ( UParam, VParam, NumUDeriv, NumVDeriv, &vretval);
274     SafeDoubleArray saretval(vretval);
275     // virtual void deriver_seconde(double *uv,double* xyzduu,double* xyzduv,double* xyzdvv,
276     //double *xyz = NULL , double *xyzdu = NULL , double *xyzdv =NULL);
277     if(xyz!=NULL) //or xyz~=NULL
278     {
279     xyz[0]=saretval[0];
280     xyz[1]=saretval[1];
281     xyz[2]=saretval[2];
282     }
283     if(xyzdu!= NULL)
284     {
285     xyzdu[0]=saretval[3];
286     xyzdu[1]=saretval[4];
287     xyzdu[2]=saretval[5];
288     }
289     if(xyzdv!=NULL)
290     {
291     xyzdv[0]=saretval[9];
292     xyzdv[1]=saretval[10];
293     xyzdv[2]=saretval[11];
294     }
295     //affectation normale
296     xyzduu[0]=saretval[6];
297     xyzduu[1]=saretval[7];
298     xyzduu[2]=saretval[8];
299     xyzduv[0]=saretval[12];
300     xyzduv[1]=saretval[13];
301     xyzduv[2]=saretval[14];
302     xyzdvv[0]=saretval[18];
303     xyzdvv[1]=saretval[19];
304     xyzdvv[2]=saretval[20];
305     }
306    
307     void SLD_SURFACE::inverser(double* uv,double *xyz,double precision)
308     {//Paramètre précision
309     if (stsurface!=NULL)
310     {
311     stsurface->inverser(uv,xyz,precision);
312     return;
313     }
314     CComVariant vUV;
315     swSurface->ReverseEvaluate(xyz[0], xyz[1], xyz[2], &vUV);
316     SafeDoubleArray saUV(vUV);
317     uv[0] = saUV[0];
318     uv[1] = saUV[1];
319     }
320    
321     int SLD_SURFACE::est_periodique_u(void)
322     {
323     return periodique_u;
324     }
325    
326     int SLD_SURFACE::est_periodique_v(void)
327     {
328     return periodique_v;
329     }
330    
331     double SLD_SURFACE::get_periode_u(void)
332     {
333     if (!periodique_u) return 0.;
334     return u_max-u_min;
335     }
336    
337     double SLD_SURFACE::get_periode_v(void)
338     {
339     if (!periodique_v) return 0.;
340     return v_max-v_min;
341     }
342    
343    
344     double SLD_SURFACE::get_umin()
345     {
346     if (stsurface!=NULL)
347     return stsurface->get_umin();;
348     return u_min;
349     }
350    
351     double SLD_SURFACE::get_umax()
352     {
353     if (stsurface!=NULL)
354     return stsurface->get_umax();;
355     return u_max;
356     }
357    
358     double SLD_SURFACE::get_vmin()
359     {
360     if (stsurface!=NULL)
361     return stsurface->get_vmin();;
362     return v_min;
363     }
364    
365     double SLD_SURFACE::get_vmax()
366     {
367     if (stsurface!=NULL)
368     return stsurface->get_vmax();;
369     return u_max;
370     }
371    
372    
373    
374     void SLD_SURFACE::enregistrer(ostream& o)
375     {
376     o << "%" << get_id() << "=SURFACE_SLD("<< idoriginal.c_str() << ");" << endl;
377     }
378    
379    
380    
381     int SLD_SURFACE::get_type_geometrique(TPL_LISTE_ENTITE<double> &param)
382     {
383     if (stsurface!=NULL)
384     return stsurface->get_type_geometrique(param);;
385     return 0;
386     }
387    
388    
389    
390 francois 19 void SLD_SURFACE::get_param_NURBS(int& indx_premier_ptctr,TPL_LISTE_ENTITE<double> &param)
391 5 {
392 francois 19 stsurface->get_param_NURBS(indx_premier_ptctr,param);
393 5 }
394    
395    
396     #endif
397    
398    
399    
400