Skip to content

Commit 91e72d1

Browse files
authored
Fix Issue 212 (#153)
* Fix Issue 212 Use OCC features instead of computing parameters for composite curves * Fix SegFault in release Mode
1 parent e610d0c commit 91e72d1

File tree

9 files changed

+178
-265
lines changed

9 files changed

+178
-265
lines changed

src/Core/Geom/CommandJoinCurves.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,6 @@ internalSpecificExecute()
141141
getContext().newGraphicalRepresentation (*newCurve);
142142
m_newEntities.push_back(newCurve);
143143

144-
// mise en place des paramètres pour cette courbe composée
145-
newCurve->computeParams(extremites[0]->getPoint());
146-
147144
// reprise des groupes de la première courbe
148145
std::vector<Group::GroupEntity*> grp;
149146
m_entities[0]->getGroups(grp);

src/Core/Geom/Curve.cpp

Lines changed: 8 additions & 214 deletions
Original file line numberDiff line numberDiff line change
@@ -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
/*----------------------------------------------------------------------------*/
192172
void 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
/*----------------------------------------------------------------------------*/
239180
void 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
252188
void 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

src/Core/Geom/EntityFactory.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1356,8 +1356,6 @@ Curve* EntityFactory::newOCCCompositeCurve(std::vector<TopoDS_Edge>& v_ds_edge,
13561356
reps);
13571357
CHECK_NULL_PTR_ERROR (curve)
13581358
m_context.newGraphicalRepresentation (*curve);
1359-
if (reps.size() > 1)
1360-
curve->computeParams(extremaFirst);
13611359
return curve;
13621360
}
13631361
/*----------------------------------------------------------------------------*/

src/Core/Geom/GeomScaleImplementation.cpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -158,15 +158,6 @@ void GeomScaleImplementation::perform(std::vector<GeomEntity*>& res)
158158
for(;it!=ite;it++)
159159
scaleSingle(*it);
160160

161-
// traitement spécifique pour les courbes composites
162-
for(std::list<GeomEntity*>::iterator it = m_ref_entities[1].begin();
163-
it!=m_ref_entities[1].end();it++){
164-
Curve* crv = dynamic_cast<Curve*>(*it);
165-
auto vertices = crv->getVertices();
166-
if (crv && vertices.size())
167-
crv->computeParams(vertices[0]->getPoint());
168-
}
169-
170161
// on force l'ajout des dépendances de dimension inférieure
171162
buildInitialSet(init_entities);
172163
//maintenant on met a jour les entites de references

src/Core/Geom/MementoManager.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,6 @@ setFromMemento(GeomEntity* e, const MementoEntity& mem)
102102
for (auto sh : m_mem.getOCCShapes())
103103
c->m_occ_edges.push_back(TopoDS::Edge(sh));
104104
setCommonFields(c);
105-
106-
// pour le cas des courbes composites, on force la mise à jour des paramètres
107-
if (!c->m_vertices.empty())
108-
c->computeParams(c->m_vertices[0]->getPoint());
109105
}
110106

111107
void visit(Surface* s) override {

0 commit comments

Comments
 (0)