@@ -71,11 +71,6 @@ GeomEntity* Curve::clone(Internal::Context& c)
7171 new GeomProperty (),
7272 m_occ_edges);
7373
74- newCrv->paramLocFirst = paramLocFirst;
75- newCrv->paramLocLast = paramLocLast;
76- newCrv->paramImgFirst = paramImgFirst;
77- newCrv->paramImgLast = paramImgLast;
78-
7974 return newCrv;
8075}
8176/* ----------------------------------------------------------------------------*/
@@ -155,22 +150,7 @@ getPoint(const double& p, Utils::Math::Point& Pt, const bool in01) const
155150 }
156151 else
157152 {
158- // vérification que computeParams a bien été utilisé
159- checkParams ();
160-
161- // on cherche la section paramètrée correspondante
162- if (p<0.0 || p>1.0 )
163- throw TkUtil::Exception (TkUtil::UTF8String (" Erreur interne, le paramètre doit être dans l'interval [0,1] pour les courbes composées" , TkUtil::Charset::UTF_8));
164-
165- uint ind = 0 ;
166- for (; ind<paramImgLast.size () && p>paramImgLast[ind]; ind++)
167- ;
168- if (ind>=paramImgLast.size ())
169- throw TkUtil::Exception (" Erreur interne, l'indice est en dehors des bornes" );
170-
171- double ratio = (p-paramImgFirst[ind])/(paramImgLast[ind]-paramImgFirst[ind]);
172- double paramLoc = paramLocFirst[ind]+ratio*(paramLocLast[ind]-paramLocFirst[ind]);
173- OCCHelper::getPoint (m_occ_edges[ind], paramLoc, Pt, false );
153+ OCCHelper::getPoint (m_occ_edges, p, Pt, in01);
174154 }
175155}
176156/* ----------------------------------------------------------------------------*/
@@ -191,64 +171,20 @@ void Curve::getIntersection(gp_Pln& plan_cut, Utils::Math::Point& Pt) const
191171/* ----------------------------------------------------------------------------*/
192172void Curve::getParameter (const Utils::Math::Point& Pt, double & p) const
193173{
194- // std::cout<<setprecision(14)<<"Curve::getParameter pour pt "<<Pt<<std::endl;
195174 if (m_occ_edges.size () == 1 )
196- {
197175 OCCHelper::getParameter (m_occ_edges[0 ], Pt, p);
198- }
199176 else
200- {
201- // vérification que computeParams a bien été utilisé
202- checkParams ();
203-
204- // en général on cherche les points aux extrémités... mais ils ne sont pas toujours renseignés
205- // c'est le cas d'une arête projetée sur une surface composite
206- // if (vertices.size() != 2 && vertices.size() != 1)
207- // throw TkUtil::Exception("Erreur interne, Courbe composite avec autre chose que 1 ou 2 sommets");
208- if (m_vertices.size () >= 1 && m_vertices[0 ]->getPoint () == Pt){
209- p=0.0 ;
210- return ;
211- }
212- else if (m_vertices.size () == 2 && m_vertices[1 ]->getPoint () == Pt){
213- p=1.0 ;
214- return ;
215- }
216-
217- for (uint ind=0 ; ind<m_occ_edges.size (); ind++){
218-
219- try {
220- double paramLoc = 0.0 ;
221- OCCHelper::getParameter (m_occ_edges[ind], Pt, paramLoc);
222- // std::cout<<" paramLoc "<<paramLoc<<std::endl;
223-
224- double ratio = (paramLoc-paramLocFirst[ind])/(paramLocLast[ind]-paramLocFirst[ind]);
225- p = paramImgFirst[ind]+ratio*(paramImgLast[ind]-paramImgFirst[ind]);
226- // std::cout<<" p "<<p<<std::endl;
227- return ;
228- }
229- catch (TkUtil::Exception &e){
230-
231- }
232- }
233-
234- throw TkUtil::Exception (TkUtil::UTF8String (" Erreur interne, le point n'a pas permis de trouver un paramètre sur l'une des courbes" , TkUtil::Charset::UTF_8));
235- }
236- // std::cout<<" => p = "<<p<<std::endl;
177+ OCCHelper::getParameter (m_occ_edges, Pt, p);
237178}
238179/* ----------------------------------------------------------------------------*/
239180void Curve::getParameters (double & first, double & last) const
240181{
241- if (m_occ_edges.size () == 1 ) {
182+ if (m_occ_edges.size () == 1 )
242183 OCCHelper::getParameters (m_occ_edges[0 ], first, last);
243- } else {
244- // vérification que computeParams a bien été utilisé
245- checkParams ();
246- first = 0.0 ;
247- last = 1.0 ;
248- }
184+ else
185+ OCCHelper::getParameters (m_occ_edges, first, last);
249186}
250187/* ----------------------------------------------------------------------------*/
251- // #define _DEBUG_GETPARAMETRICSPOINTS
252188void Curve::getParametricsPoints (const Utils::Math::Point& Pt0,
253189 const Utils::Math::Point& Pt1,
254190 const uint nbPt,
@@ -280,17 +216,12 @@ void Curve::getParametricsPoints(const Utils::Math::Point& Pt0,
280216 getParameter (Pt1, paramPt1);
281217
282218#ifdef _DEBUG_GETPARAMETRICSPOINTS
283- std::cout<<" paramPt0 = " <<paramPt0<<std::endl;
284- std::cout<<" paramPt1 = " <<paramPt1<<std::endl;
219+ std::cout<<" paramPt0 = " <<paramPt0<<" pour " <<Pt0<< std::endl;
220+ std::cout<<" paramPt1 = " <<paramPt1<<" pour " <<Pt1<< std::endl;
285221#endif
286222
287223 if (m_vertices.size () == 1 ){
288- if (m_occ_edges.size () != 1 ) {
289- TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8);
290- messErr << " [Erreur interne] La courbe " <<getName ()<<" est une courbe composée ce qui ne permet pas de trouver les points en fonction d'une paramétrisation" ;
291- throw TkUtil::Exception (messErr);
292- }
293- getParameters (first, last);
224+ getParameters (first, last);
294225
295226
296227#ifdef _DEBUG_GETPARAMETRICSPOINTS
@@ -930,143 +861,6 @@ Utils::SerializedRepresentation* Curve::getDescription (bool alsoComputed) const
930861 return description.release ( );
931862}
932863/* ----------------------------------------------------------------------------*/
933- void Curve::computeParams (Utils::Math::Point ptStart)
934- {
935- // #define _DEBUG_PARAMS
936-
937- paramImgFirst.clear ();
938- paramImgLast.clear ();
939- paramLocFirst.clear ();
940- paramLocLast.clear ();
941-
942- // NB, on ne fait rien si la courbe n'est pas composite
943-
944- // on renseigne les paramLocFirst et autres
945-
946- // pour cela on commence par calculer les longueurs des différentes parties
947- std::vector<double > areasLoc;
948- double areaTot = 0.0 ;
949- if (m_occ_edges.size () == 1 )
950- return ;
951-
952- for (uint i=0 ; i<m_occ_edges.size (); i++){
953- double area = OCCHelper::getLength (m_occ_edges[i]);
954- areasLoc.push_back (area);
955- areaTot+=area;
956- }
957-
958- // calcul des paramImgFirst et paramImgLast
959- double areaI = 0.0 ;
960- double paramI = 0.0 ;
961- for (uint i=0 ; i<areasLoc.size (); i++){
962- paramImgFirst.push_back (paramI);
963- areaI += areasLoc[i];
964- paramI = areaI/areaTot;
965- paramImgLast.push_back (paramI);
966- }
967-
968- // epsilon relatif à la longueur totale
969- double epsilon = areaTot*Utils::Math::MgxNumeric::mgxGeomDoubleEpsilon*10 ;
970-
971- #ifdef _DEBUG_PARAMS
972- std::cout<<" Curve::computeParams ptStart :" <<ptStart<<std::endl;
973- std::cout<<" epsilon loc = " <<epsilon<<std::endl;
974- std::cout<<" areasLoc:" ;
975- for (uint i=0 ; i<areasLoc.size (); i++)
976- std::cout<<" " <<areasLoc[i];
977- std::cout<<std::endl;
978- std::cout<<" paramImgFirst:" ;
979- for (uint i=0 ; i<paramImgFirst.size (); i++)
980- std::cout<<" " <<paramImgFirst[i];
981- std::cout<<std::endl;
982- std::cout<<" paramImgLast:" ;
983- for (uint i=0 ; i<paramImgLast.size (); i++)
984- std::cout<<" " <<paramImgLast[i];
985- std::cout<<std::endl;
986- std::cout<<" couples de points: " <<std::endl;
987- Utils::Math::Point ptBegin, ptEnd;
988- for (uint i=0 ; i<m_occ_edges.size (); i++){
989- m_occ_edges[i]->getPoint (0.0 , ptBegin, true );
990- m_occ_edges[i]->getPoint (1.0 , ptEnd, true );
991- std::cout<<ptBegin<<" " <<ptEnd<<std::endl;
992- }
993- #endif
994-
995- // remplissage des paramLocFirst et paramLocLast et tenant compte du sens
996- Utils::Math::Point ptPrec;
997- TopoDS_Edge edge_0 = m_occ_edges[0 ];
998- OCCHelper::getPoint (edge_0, 0.0 , ptPrec, true );
999- #ifdef _DEBUG_PARAMS
1000- std::cout<<" longueur ptStart-ptPrec " <<ptPrec.length (ptStart)<<std::endl;
1001- #endif
1002- if (not (ptPrec.isEpsilonEqual (ptStart, epsilon))){
1003- OCCHelper::getPoint (edge_0, 1.0 , ptPrec, true );
1004- #ifdef _DEBUG_PARAMS
1005- std::cout<<" longueur ptStart-ptPrec " <<ptPrec.length (ptStart)<<std::endl;
1006- #endif
1007- if (not (ptPrec.isEpsilonEqual (ptStart, epsilon))){
1008- throw TkUtil::Exception (TkUtil::UTF8String (" Erreur interne, Courbe composite où on ne retrouve pas le premier sommet" , TkUtil::Charset::UTF_8));
1009- }
1010- }
1011- for (uint i=0 ; i<m_occ_edges.size (); i++){
1012- double inverse = false ;
1013- Utils::Math::Point pt1, pt2;
1014- TopoDS_Edge edge_i = m_occ_edges[i];
1015- OCCHelper::getPoint (edge_i, 0.0 , pt1, true );
1016- OCCHelper::getPoint (edge_i, 1.0 , pt2, true );
1017- #ifdef _DEBUG_PARAMS
1018- std::cout<<" i=" <<i<<" ptPrec: " <<ptPrec<<std::endl;
1019- std::cout<<" longueur pt1-ptPrec " <<ptPrec.length (pt1)<<" pt2-ptPrec " <<ptPrec.length (pt2)<<std::endl;
1020- #endif
1021- if (not (pt1.isEpsilonEqual (ptPrec, epsilon))){
1022- inverse = true ;
1023- if (not (pt2.isEpsilonEqual (ptPrec, epsilon))){
1024- throw TkUtil::Exception (TkUtil::UTF8String (" Erreur interne, Courbe composite où on ne retrouve pas le sommet précédent" , TkUtil::Charset::UTF_8));
1025- }
1026- }
1027-
1028- double first, last;
1029- if (inverse){
1030- OCCHelper::getParameters (edge_i, last, first);
1031- ptPrec = pt1;
1032- }
1033- else {
1034- ptPrec = pt2;
1035- OCCHelper::getParameters (edge_i, first, last);
1036- }
1037- paramLocFirst.push_back (first);
1038- paramLocLast.push_back (last);
1039- }
1040- #ifdef _DEBUG_PARAMS
1041- std::cout<<" paramLocFirst:" ;
1042- for (uint i=0 ; i<paramLocFirst.size (); i++)
1043- std::cout<<" " <<paramLocFirst[i];
1044- std::cout<<std::endl;
1045- std::cout<<" paramLocLast:" ;
1046- for (uint i=0 ; i<paramLocLast.size (); i++)
1047- std::cout<<" " <<paramLocLast[i];
1048- std::cout<<std::endl;
1049- #endif
1050- }
1051- /* ----------------------------------------------------------------------------*/
1052- void Curve::checkParams () const
1053- {
1054- if (m_occ_edges.size () == 1 )
1055- return ;
1056-
1057- if (m_occ_edges.size () != paramLocFirst.size ()){
1058- TkUtil::UTF8String messErr (TkUtil::Charset::UTF_8);
1059- messErr << " Erreur interne, paramLocFirst non itialisé correctement pour " <<getName ();
1060- throw TkUtil::Exception (messErr);
1061- }
1062- if (m_occ_edges.size () != paramLocLast.size ())
1063- throw TkUtil::Exception (TkUtil::UTF8String (" Erreur interne, paramLocLast non itialisé correctement" , TkUtil::Charset::UTF_8));
1064- if (m_occ_edges.size () != paramImgFirst.size ())
1065- throw TkUtil::Exception (TkUtil::UTF8String (" Erreur interne, paramImgFirst non itialisé correctement" , TkUtil::Charset::UTF_8));
1066- if (m_occ_edges.size () != paramImgLast.size ())
1067- throw TkUtil::Exception (TkUtil::UTF8String (" Erreur interne, paramImgLast non itialisé correctement" , TkUtil::Charset::UTF_8));
1068- }
1069- /* ----------------------------------------------------------------------------*/
1070864} // end namespace Geom
1071865/* ----------------------------------------------------------------------------*/
1072866} // end namespace Mgx3D
0 commit comments