return;
}
// Temporary: computation of myVal
- // myVal = Abs(geom_lin1->Lin().Angle( geom_lin2->Lin())); // Pb avec les angles JPR
+ // myVal = Abs(geom_lin1->Lin().Angle( geom_lin2->Lin())); // Pb with angles JPR
if (copyOfMyExtShape != 0) myExtShape = copyOfMyExtShape;
#endif
- // Traitement du cas ou les 2 droites sont paralleles
+ // Processing in case of 2 parallel straight lines
if (lin1_2d->Lin2d().Direction()
.IsParallel(lin2_2d->Lin2d().Direction(),Precision::Angular())) {
ComputeTwoEdgesNullAngle(aPresentation,
isInfinite1,isInfinite2);
}
- // Traitement du cas ou les 2 droites ne sont pas paralleles
+ // Processing in case of 2 non-parallel straight lines
else {
ComputeTwoEdgesNotNullAngle(aPresentation,
geom_lin1,
Standard_Real par = ElCLib::Parameter(circle,curpos);
curpos = ElCLib::Value(par,circle);
- // un petit offset comme LengthDimension
+ // small offset like in LengthDimension
gp_Vec transl(myCenter, curpos);
transl*= 0.3;
curpos.Translate(transl);
}
else {
- // on projette le point dans le plan
+ // point is projected on the plane
gp_Pnt2d pointOnPln(ProjLib::Project(myPlane->Pln(),myPosition));
myPosition = BRepAdaptor_Surface(BRepBuilderAPI_MakeFace(myPlane->Pln()).Face()).Value(pointOnPln.X(),pointOnPln.Y());
curpos = myPosition;
curpos.SetXYZ(curpos.XYZ()+delta);
dist = curpos.Distance(myCenter);
}
- // Pour savoir si on doit prendre la distance -dist ou non
- // il faut savoir si on est dans le secteur oppose a l'angle
- // ou non : on est dans le secteur oppose si les coordonnees
- // de curpos dans le repere (d1,d2) sont negatives
+ // To learn if it is necessary to take distance -dist or not
+ // it is necessary to know if we are in the sector opposite to the angle
+ // if not : we are in the opposite sector if the coordinates
+ // of curpos in point (d1,d2) are negative
gp_Ax2 ax(myCenter,myFDir.Crossed(mySDir),myFDir);
gp_Circ circle(ax,dist);
#ifdef DEB
Standard_Real ufin = uc2;
if (uco > ufin) {
if (Abs(myVal)<PI) {
- // test si uco est dans le secteur oppose
+ // test if uco is in the opposite sector
if (uco > udeb+PI && uco < ufin+PI){
dist = -dist;
}
gp_Lin gpl2 = l2->Lin();
//------------------------------------------------------------
- // Calcul de myCenter
- // -> Point situe sur la ligne mediane des 2 droites,
- // calcule comme etant le milieu des 2 points les plus
- // proches de chaque droite.
+ // Computation of myCenter
+ // -> Point located on the median of 2 straight lines,
+ // is calculated as located between 2 closest points
+ // of each straight line.
//-----------------------------------------------------------
- // theLength : rayon du futur cercle
+ // theLength : radius of the future circle
Standard_Real theLength = gpl1.Distance(gpl2.Location());
- // traitement du cas particulier ou les 2 droites sont confondues
+ // processing of the particular case when 2 straight lines are coincident
Standard_Boolean SameLines(Standard_False);
if ( theLength <= Precision::Confusion()) {
SameLines = Standard_True;
if ( V1.CrossMagnitude(V2) < 0 ) theaxis.Reverse();
}
- gp_Pnt curpos; // position du curseur
+ gp_Pnt curpos; // cursor position
TColStd_Array1OfReal tabdist(1,4);
- gp_Pnt P1, P2; // points d'intersection du cercle avec les 2 droites
+ gp_Pnt P1, P2; // points at intersection of the circle with 2 straight lines
if (myAutomaticPosition) {
if (!isInfinite1) {
myCenter.Translate(gp_Vec(d1)*theLength);
- // calcul des points d'attache de la cote
- // -> ils sont != des points d'intersection si les
- // intersection sont en dehors des limites des edges
+ // calculate attachments of the face
+ // -> they are points of intersection if
+ // intersection is outside of the edges
Standard_Real pparam = ElCLib::Parameter(gpl1,myFAttach);
Standard_Real pparam1 = ElCLib::Parameter(gpl1,ptat11);
Standard_Real pparam2 = ElCLib::Parameter(gpl1,ptat12);
Handle(Geom_Circle) circle = new Geom_Circle(AX,theLength);
Handle(Geom2d_Curve) geoCurve = GeomAPI::To2d(circle,myPlane->Pln());
Handle(Geom2d_Circle) c2d = *((Handle(Geom2d_Circle)*)& geoCurve);
- // calcul du point d'intersection du cercle avec l1
- Standard_Real pparam; // parametre du point d'intersection sur l1
+ // calculate the intersection of circle with l1
+ Standard_Real pparam; // parameter of the point of intersection on l1
IntAna2d_AnaIntersection inter(l1_2d->Lin2d(),c2d->Circ2d());
gp_Pnt2d pint1(inter.Point(1).Value());
gp_Pnt2d pint2(inter.Point(2).Value());
gp_Lin Media(myCenter, gpl1.Direction());
Standard_Real pcurpos = ElCLib::Parameter(Media, curpos);
myCenter = ElCLib::Value(pcurpos, Media);
- // on translate le centre de facon a avoir un rayon constant!
+ // the centre is translated to avoid a constant radius!
myCenter.Translate(-theLength*gp_Vec(gpl1.Direction()));
gp_Ax2 AX(myCenter,theaxis,gpl1.Direction());
Handle(Geom_Circle) circle = new Geom_Circle(AX,theLength);
- // remise a jour de curpos
+ // re-update curpos
pcurpos = ElCLib::Parameter(circle->Circ(), curpos);
curpos = ElCLib::Value(pcurpos, circle->Circ());
Handle(Geom2d_Curve) geoCurve = GeomAPI::To2d(circle,myPlane->Pln());
Handle(Geom2d_Circle) c2d = *((Handle(Geom2d_Circle)*)& geoCurve);
- // calcul du point d'intersection du cercle avec l1
+ // calculate the point of intersection of circle with l1
IntAna2d_AnaIntersection inter(l1_2d->Lin2d(),c2d->Circ2d());
gp_Pnt2d pint1(inter.Point(1).Value());
gp_Pnt2d pint2(inter.Point(2).Value());
else myFAttach = Int2;
P1 = myFAttach;
- // calcul du point d'intersection du cercle avec l2
- // -> c'est la projection car le cercle a son centre
- // au milieu de l1 et l2
+ // calculate the point of intersection of circle with l2
+ // -> this is the projection because the centre of circle
+ // is in the middle of l1 and l2
Standard_Real pparam = ElCLib::Parameter(gpl2,myFAttach);
mySAttach = ElCLib::Value(pparam, gpl2);
//=======================================================================
//function : Compute2DSelection
-//purpose : calcule les zones de selection sur une cote d'angle entre 2
-// edges
-// Traitement particulier pour les angles nuls!
+//purpose : compute zones of selection on a side of angle between 2 edges
+// Special processing of zero angles!
//=======================================================================
void AIS_AngleDimension::Compute2DSelection(const Handle(SelectMgr_Selection)& aSelection)
}
//----------------------------------------------------------
- // Cas classique ( angle != 0 )
+ // Classic case ( angle != 0 )
else {
if (myFDir.IsParallel(mySDir,Precision::Angular())) {
if (uco > ufin) {
if (Abs(myVal)<PI) {
- // test si uco est dans le secteur oppose
+ // test if uco is in the opposing sector
if (uco > udeb+PI && uco < ufin+PI){
udeb = udeb + PI;
ufin = ufin + PI;
p1 = ElCLib::Value(udeb,cer);
p2 = ElCLib::Value(ufin,cer);
- //Creation des 2 owners pour chaque partie de la fleche
+ //Create 2 owners for each part of the arrow
Handle(AIS_DimensionOwner) own1 = new AIS_DimensionOwner(this,7);
Handle(AIS_DimensionOwner) own2 = new AIS_DimensionOwner(this,7);
if (myExtShape != 0) {
if (uco > ufin) {
if (Abs(myVal)<PI) {
- // test si uco est dans le secteur oppose
+ // test if uco is in the opposing sector
if (uco > udeb+PI && uco < ufin+PI){
udeb = udeb + PI;
ufin = ufin + PI;
}
}
- //Creation des 2 owners pour chaque partie de la fleche
+ //Create 2 owners for each part of the arrow
Handle(AIS_DimensionOwner) own1 = new AIS_DimensionOwner(this,7);
Handle(AIS_DimensionOwner) own2 = new AIS_DimensionOwner(this,7);
if (myExtShape != 0) {
aSelection->Add(scurv);
}
else {
- // on trace un bout de segment pour permettre la selection
+ // find end of segment to allow selection
gp_Vec VTrans(myFDir.Crossed(Norm));
Handle(Select3D_SensitiveSegment) seg1;
seg1 = new Select3D_SensitiveSegment(own1,
myCenter = gcirc1->Location();
- // on choisit le rayon egal a 1/5 ieme du rayon du plus petit des
- // 2 cercles. On impose une borne sup au rayon( 0.02 au hasard)
+ // choose the radius equal to 1/5 of the smallest radius of
+ // 2 circles. Limit is imposed ( 0.02 by chance)
Standard_Real rad1 = gcirc1->Radius();
Standard_Real rad2 = gcirc2->Radius();
myRad = (rad1 > rad2 ) ? rad2 : rad1;
if (myRad > 15.) myRad =15.;
- //Calcul d'un point du cercle de rayon myRad
+ //Calculate a point of circle of radius myRad
gp_Dir vec(ptat11.XYZ() - myCenter.XYZ() );
gp_Vec vectrans(vec);
myPnt = myCenter.Translated(vectrans.Multiplied(myRad));
{
Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7);
- //Creation de 2 sensitives cercles
- // le plus grand
+ //Creation of 2 sensitive circles
+ // the greater
gp_Ax2 ax(myCenter, myDir);
Handle(Geom_Circle) Circ = new Geom_Circle(ax, myRad) ;
Handle(Select3D_SensitiveCircle)
sensit = new Select3D_SensitiveCircle (own,
Circ);
aSelection->Add(sensit);
- // le plus petit
+ // the smaller
Circ->SetRadius(myRad/2);
sensit = new Select3D_SensitiveCircle (own,
Circ);
aSelection->Add(sensit);
- //Creation de 2 segments sensitifs pour la croix
+ //Creation of 2 segments sensitive for the cross
Handle(Select3D_SensitiveSegment) seg;
gp_Pnt otherPnt = myPnt.Mirrored(myCenter);
seg = new Select3D_SensitiveSegment(own,
void AIS_ConnectedInteractive::
Connect(const Handle(AIS_InteractiveObject)& anotherIObj)
{
- // Pour Avoir le temps de faire le Disconnect en dessous,
- // on garde l'ancien un peu. SMO.
+ // To have the time to Disconnect below,
+ // the old is kept for a while.
if(myReference==anotherIObj) return;
myOldReference = myReference;
//Disconnect();
if(myLocation!=aLocation)
myLocation = aLocation;
if(myReference!=anotherIobj) {
- myOldReference = myReference; // necessaire pour pouvoir faire le disconnect en dessous..
+ myOldReference = myReference; // necessary to disconnect below..
// Disconnect();
myReference = anotherIobj;}
Aspect_TypeOfDeflection prevdef = defdrawer->TypeOfDeflection();
defdrawer->SetTypeOfDeflection(Aspect_TOD_RELATIVE);
- // traitement HLRAngle et HLRDeviationCoefficient()
+ // process HLRAngle and HLRDeviationCoefficient()
Standard_Real prevangl = myDrawer->HLRAngle();
Standard_Real newangl = defdrawer->HLRAngle();
if (Abs(newangl- prevangl) > Precision::Angular()) {
{
UpdateShape();
aSelection->Clear();
- // On regarde s'il n'y a pas des choses a faire sur la reference,
- // du type mise a jour...
+ // It is checked if there is nothing to do with the reference
+ // of type update...
if(!myReference->HasSelection(aMode))
myReference->UpdateSelection(aMode);
if(RefSel->UpdateStatus()==SelectMgr_TOU_Full)
myReference->UpdateSelection(aMode);
- //suivant le type de decomposition, on deduit les primitives connectees.
- // il faut suivre l'ordre de creation de StdSelect_BRepSelectionTool...
+ // depending on the type of decomposition, connected primitives are subtracted
+ // it is necessary to follow the order of creation of StdSelect_BRepSelectionTool...
TopAbs_ShapeEnum TheType = AIS_Shape::SelectionType(aMode);
Handle(StdSelect_BRepOwner) OWNR;
case TopAbs_SHAPE:
default:
{
- // Dans ce cas on n'a qu'un seul proprietaire pour l'ensemble des
- // primitives sensibles...
+ // In case if there is only one owner of the set of
+ // sensible primitives...
OWNR = new StdSelect_BRepOwner(myOwnSh,this);
Standard_Boolean FirstIncr(Standard_True);
for(RefSel->Init();RefSel->More();RefSel->Next()){
{
if(myReference.IsNull()) return;
- // attention grosse ligne...
+ // attention great line...
if(myReference->Type()!=AIS_KOI_Shape) return;
Standard_Integer Sig = myReference->Signature();
Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() );
}
- // recherche points attache
+ // find attach points
if (!isInfinite1) {
if (Position.Distance(ptat11) > Position.Distance(ptat12)) FirstAttach = ptat12;
else FirstAttach = ptat11;
// computation of Val
Val = FirstAttach.Distance(SecondAttach);
- //Display des morceaux de raccordement vers la curve si elle
- // n'est pas dans le WP
+ //Display the pieces of attached to the curve if it is not
+ // in the WP
if (!isOnPlanEdge) { // add presentation of projection of the edge in WP
AIS::ComputeProjEdgePresentation(aPresentation,aDrawer,theedge,aCurve,ptonedge1,ptonedge2);
}
if(IO.IsNull())
return Standard_False;
- // le type de l'ais n'est pas dans la map...
+ // type of AIS is not in the map...
if(!myStoredTypes.IsBound(IO->Type()))
return myIsExclusionFlagOn ;
- // le type de l'ais est dans la map et il n'y a pas de signature precisee
+ // type of AIS is not in the map and there is no signature indicated
if(myStoredTypes(IO->Type()).IsEmpty())
return !myIsExclusionFlagOn ;
- // il y a une ou des signatures precisees...
+ // one or several signatures are indicated...
if(IsSignatureIn(IO->Type(),IO->Signature()))
return !myIsExclusionFlagOn;
{
aPresentation->Clear();
- // Calcul du point de positionnement du symbole et du
- // point d'attache du segment de raccord sur la shape
+ // Calculate position of the symbol and
+ // point of attach of the segment on the shape
gp_Pnt curpos;
if (myFShape.ShapeType() == TopAbs_VERTEX)
ComputeVertex(TopoDS::Vertex(myFShape), curpos);
const gp_Dir& nor = myPlane->Axis().Direction();
- // calcul de la presentation
- //definition de la taille du symbole
+ // calculate presentation
+ // definition of the symbol size
#ifdef BUC60915
if( !myArrowSizeIsDefined )
#endif
myArrowSize = 5.;
- //creation du presentable
+ //creation of the presentation
DsgPrs_FixPresentation::Add(aPresentation,
myDrawer,
myPntAttach,
{
Handle(SelectMgr_EntityOwner) own = new SelectMgr_EntityOwner(this,7);
- // creation d'un segment sensible pour le segment de raccordement
- // de la shape fixe au symbole 'Fix'
+ // creation of segment sensible for the linked segment
+ // of the shape fixed to symbol 'Fix'
Handle(Select3D_SensitiveSegment) seg;
seg = new Select3D_SensitiveSegment(own,
myPntAttach,
myPosition);
aSelection->Add(seg);
- // Creation de la zone sensible du symbole 'Fix'
+ // Creation of the sensible zone of symbol 'Fix'
gp_Dir norm = myPlane->Axis().Direction();
gp_Vec dirac(myPntAttach,myPosition);
const gp_Pnt& lastp2) const
{
//---------------------------------------------------------
- // calcul du point d'attache
+ // calculate the point of attach
//---------------------------------------------------------
gp_Pnt curpos;
const gp_Pnt& lastp) const
{
//---------------------------------------------------------
- // calcul du point d'attache
+ // calculate the point of attach
//---------------------------------------------------------
gp_Pnt curpos;
//---------------------------------------------------------
// calcul du point de positionnement du symbole 'fix'
//---------------------------------------------------------
- //--> Dans le cas d'une droite
+ //--> In case of a straight line
if (curEdge->IsKind(STANDARD_TYPE(Geom_Line))){
gp_Lin glin = Handle(Geom_Line)::DownCast(curEdge)->Lin();
Standard_Real pfirst(ElCLib::Parameter(glin,ptbeg));
ComputeLinePosition(glin, curpos, pfirst, plast);
}
- //--> Dans le cas d'un cercle
+ //--> In case of a circle
else if (curEdge->IsKind(STANDARD_TYPE(Geom_Circle))) {
gp_Circ gcirc = Handle(Geom_Circle)::DownCast(curEdge)->Circ();
Standard_Real pfirst, plast;
Standard_Real& plast)
{
if (myAutomaticPosition) {
- // le point d'attache est choisi comme milieu du segment
+ // point of attach is chosen as middle of the segment
myPntAttach = ElCLib::Value((pfirst+ plast)/2, glin);
gp_Dir norm = myPlane ->Axis().Direction();
pos = myPosition;
Standard_Real linparam = ElCLib::Parameter(glin, pos);
- //cas ou la projection de position se situe entre les 2 vertex
+ // case if the projection of position is located between 2 vertices
// de l'edge
if ( (linparam >= pfirst) && (linparam <= plast) )
myPntAttach = ElCLib::Value(linparam,glin);
- // cas ou la projection de Position est en dehors des limites
- // de l'edge : alors on choisit comme point d'attache le point
- // le plus proche de la projection
+ // case if the projection of Position is outside of the limits
+ // of the edge : the point closest to the projection is chosen
+ // as the attach point
else {
Standard_Real pOnLin;
if (linparam > plast)
Standard_Real& pfirst,
Standard_Real& plast)
{
- // reajustement des parametres sur le cercle
+ // readjust parametres on the circle
if (plast > 2*PI ) {
Standard_Real nbtours = Floor(plast / (2*PI));
plast -= nbtours*2*PI;
}
if (myAutomaticPosition) {
- // le point d'attache est le "milieu" du segment (par rapport
- // aux parametres des vertex de debut et de fin de l'edge
+ // the point attach is the "middle" of the segment (relatively
+ // to the parametres of start and end vertices of the edge
Standard_Real circparam = (pfirst + plast)/2.;
} // if (myAutomaticPosition)
else {
- // cas ou la projection de myPosition est en dehors des 2
- // vertex de l'edge. Dans ce cas on reajuste le parametre
- // dans la portion valable du cercle
+ // case if the projection of myPosition is outside of 2
+ // vertices of the edge. In this case the parameter is readjusted
+ // in the valid part of the circle
pos = myPosition;
Standard_Real circparam = ElCLib::Parameter(gcirc, pos);
// "identic" presentation
// note : if we are in the case of lines, we create a segment between
// myFAttach and mySAttach. In the case of Circles, we create
-// an arc of circle between the sames points.We Add a segment
+// an arc of circle between the sames points. We Add a segment
// to link Position to its projection on the curve described
// before.
//=======================================================================
seg = new Select3D_SensitiveSegment(own, myFAttach, mySAttach);
aSelection->Add(seg);
- //attach = projection de Position() sur la curve;
+ //attach = projection of Position() on the curve;
gp_Vec v1 (myFAttach, mySAttach);
gp_Vec v2 (myFAttach, myPosition);
if ( v1.IsParallel(v2, Precision::Angular()) )
// Treatement of the case of circles
else if ( curv1->IsInstance(STANDARD_TYPE(Geom_Circle)) && curv2->IsInstance(STANDARD_TYPE(Geom_Circle)) ) {
//gp_Pnt curpos;
- isCircle = Standard_True; // usefull for ComputeSelection
+ isCircle = Standard_True; // useful for ComputeSelection
const Handle(Geom_Circle)& thecirc = (Handle(Geom_Circle)&) curv1;
ComputeTwoCirclesPresentation(aPrs, thecirc, firstp1, lastp1, firstp2, lastp2);
}
else
return;
- // Calcul de la presentation des edges projettees
+ // Calculate presentation of projected edges
if ( (myExtShape != 0) && !extCurv.IsNull()) {
if (myExtShape == 1 )
ComputeProjEdgePresentation(aPrs, TopoDS::Edge(myFShape), curv1, firstp1, lastp1);
vals,
myFAttach,
curpos);
- // Calcul de la projection du vertex
+ // Calculate the projection of vertex
if ( myExtShape == 1)
ComputeProjVertexPresentation(aPrs,FVertex,myFAttach);
else if ( myExtShape == 2)
//function : ComputeDirection
//purpose : Compute a direction according to the different geometric
// elements connected to the vertex <VERT>, in way to not have
-// overlap between the symbol and them.
+// overlap between the symbol and them.
//=======================================================================
Standard_Boolean AIS_IdenticRelation::ComputeDirection(const TopoDS_Wire& aWire,
const TopoDS_Vertex& VERT,
if (myFShape.ShapeType() == TopAbs_VERTEX) {
V = TopoDS::Vertex(myFShape);
E = TopoDS::Edge(mySShape);
- numedge = 2;// edge = 2 iem shape
+ numedge = 2;// edge = 2nd shape
}
else {
V = TopoDS::Vertex(mySShape);
E = TopoDS::Edge(myFShape);
- numedge = 1; // edge = 1 ere shape
+ numedge = 1; // edge = 1st shape
}
gp_Pnt ptonedge1,ptonedge2;
Handle(Geom_Curve) aCurve;
aPrs->SetInfiniteState(isInfinite);
AIS::ComputeGeometry(V, myFAttach, myPlane, isOnPlanVertex);
- // on considere que seule la courbe peut etre projetee
+ // only the curve can be projected
if (!isOnPlanEdge && !isOnPlanVertex) return;
if (!isOnPlanEdge) {
myFAttach,
curpos);
if (myExtShape != 0) {
- if (!extCurv.IsNull()) { // c'est l'edge qui n'est pas dans le WP
+ if (!extCurv.IsNull()) { // the edge is not in the WP
ComputeProjEdgePresentation(aPrs,E,(Handle(Geom_Line)&) aCurve,ptonedge1,ptonedge2);
}
}
if(myObjects.IsBound(anIObj)) return Standard_False;
if(WhichContext!=-1 && !myLocalContexts.IsBound(WhichContext)) return Standard_False;
- // Protection : si on essaye de conserver un objet temporaire
- // qui n'est pas dans le contexte local actif... rob 11-06-97
+ // Protection : if one tries to preserve a temporary object
+ // which is not in the local active context... rob 11-06-97
Standard_Integer IsItInLocal = myCurLocalIndex;
Standard_Boolean Found(Standard_False);
Handle(AIS_GlobalStatus) STATUS = myObjects(anIObj);
// ENDCLE
#ifndef OCC4373
- // l'objet interactif n'avait pas de mode propre : OldMode = Mode Session
- // avait deja un mode propre : OldMode = ancien mode Propre
+ // the interactive object has no mode : OldMode = Mode Session
+ // already has a mode : OldMode = old mode Propre
Standard_Integer OldMode = anIObj->HasDisplayMode() ? anIObj->DisplayMode(): myDisplayMode;
if(!anIObj->HasInteractiveContext())
anIObj->SetContext(this);
- // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+ // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
if(anIObj->Type()!=AIS_KOI_Object && anIObj->Type()!=AIS_KOI_Shape) return;
if(anIObj->Signature()!=0) return;
(*((Handle(AIS_Shape)*)&anIObj))->SetOwnDeviationCoefficient(aCoefficient);
if(!anIObj->HasInteractiveContext())
anIObj->SetContext(this);
- // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+ // To be modified after the related methods of AIS_Shape are passed to InteractiveObject
if(anIObj->Type()!=AIS_KOI_Object && anIObj->Type()!=AIS_KOI_Shape) return;
if(anIObj->Signature()!=0) return;
(*((Handle(AIS_Shape)*)&anIObj))->SetOwnHLRDeviationCoefficient(aCoefficient);
if(!anIObj->HasInteractiveContext())
anIObj->SetContext(this);
- // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+// To be modified after the related methods of AIS_Shape are passed to InteractiveObject
if(anIObj->Type()!=AIS_KOI_Shape) return;
if(anIObj->Signature()!=0) return;
(*((Handle(AIS_Shape)*)&anIObj))->SetOwnDeviationAngle(anAngle);
if(!anIObj->HasInteractiveContext())
anIObj->SetContext(this);
- // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+// To be modified after the related methods of AIS_Shape are passed to InteractiveObject
if(anIObj->Type()!=AIS_KOI_Shape) return;
if(anIObj->Signature()!=0) return;
(*((Handle(AIS_Shape)*)&anIObj))->SetAngleAndDeviation(anAngle);
if(!anIObj->HasInteractiveContext())
anIObj->SetContext(this);
- // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+// To be modified after the related methods of AIS_Shape are passed to InteractiveObject
if(anIObj->Type()!=AIS_KOI_Shape) return;
if(anIObj->Signature()!=0) return;
(*((Handle(AIS_Shape)*)&anIObj))->SetHLRAngleAndDeviation(anAngle);
if(!anIObj->HasInteractiveContext())
anIObj->SetContext(this);
- // A Modifier apres descente des methodes concernees de AIS_Shape dans InteractiveObject
+// To be modified after the related methods of AIS_Shape are passed to InteractiveObject
if( anIObj->Type()!=AIS_KOI_Shape) return;
if(anIObj->Signature()!=0) return;
(*((Handle(AIS_Shape)*)&anIObj))->SetOwnHLRDeviationAngle(anAngle);
Standard_Integer& TheIndex) const
{
if(anIObj.IsNull()) return Standard_False;
- // s'il existe au point neutre on retourne l'index 0
+ // if it exists at neutral point 0 index is returned
if(myObjects.IsBound(anIObj)) {
TheIndex = 0;
return Standard_False;
HLA->SetWidth(1);
HLA->SetTypeOfLine(Aspect_TOL_DASH);
- // tolerance a 4 pixels...
+ // tolerance to 4 pixels...
#ifdef BUC60688
SetSensitivity();
#else
if ( !myLocalContexts( myCurLocalIndex )->Filter()->IsOk( selector->OnePicked() ) )
return AIS_SOD_AllBad;
- // si c'est le meme qu'au coup precedent -> fin
+
// Does nothing if previously detected object is equal to the current one
if ( selector->OnePicked()->Selectable() == myLastPicked )
return AIS_SOD_OnlyOneDetected;
- //si le precedent est un objet courant, on ne le desilighte pas, sinon si
-
+
// Previously detected object is unhilighted if it is not selected or hilighted
// with selection color if it is selected. Such highlighting with selection color
// is needed only if myToHilightSelected flag is true. In this case previously detected
myLastinMain = myLastPicked;
else
myLastinColl = myLastPicked;
- // si l'objet detecte n'est pas courant, on le hilighte...
#ifdef IMP191001
// Highlight detected object if it is not selected or myToHilightSelected flag is true
if ( !myLastPicked.IsNull() &&
const Handle(V3d_View)& aView,
const Standard_Boolean updateviewer)
{
- // on prend tous les objets detectes par le selecteur, on vide les precedents objets courants,
- // on met les nouveaux...
+ // all objects detected by the selector are taken, previous current objects are emptied,
+ // new objects are put...
if(HasOpenedContext())
return myLocalContexts(myCurLocalIndex)->Select(XPMin,YPMin,XPMax,YPMax,aView,updateviewer);
const Handle(V3d_View)& aView,
const Standard_Boolean updateviewer)
{
- // on prend tous les objets detectes par le selecteur, on vide les precedents objets courants,
- // on met les nouveaux...
+ // all objects detected by the selector are taken, previous current objects are emptied,
+ // new objects are put...
if(HasOpenedContext())
return myLocalContexts(myCurLocalIndex)->Select(aPolyline,aView,updateviewer);
if(myWasLastMain)
return myLocalContexts(myCurLocalIndex)->Select(updateviewer);
else
- // on a picke dans le collecteur, il faut faire un traitement special...
+ // picking was done in the collector, special processing is required...
{
myLocalContexts(myCurLocalIndex)->SetSelected(myLastPicked,updateviewer);
return AIS_SOP_OneSelected;
void AIS_InteractiveContext::SetCurrentObject(const Handle(AIS_InteractiveObject)& anIObj,
const Standard_Boolean updateviewer)
{
- // traitement d'un cas singulier...
+ // single case processing...
if(NbCurrents()==1 && anIObj->State()==1){
Quantity_NameOfColor HiCol;
Standard_Boolean HasHiCol;
sel->Next();
}
- // ajout pour ne pas faire d'updateviewer intempestif...
+ // added to avoid untimely viewer update...
AIS_Selection::ClearAndSelect(anIObj);
anIObj->State(1);
Quantity_NameOfColor HiCol;
#include <Graphic3d_MapIteratorOfMapOfStructure.hxx>
#include <AIS_Selection.hxx>
+
+static TColStd_ListIteratorOfListOfInteger ItL;
//=======================================================================
//function : OpenLocalContext
//purpose :
const Standard_Boolean /*BothViewers*/)
{
- // on dehilighte les eventuelles entitees detectees juste avant l'ouverture
- // du contexte...
+ // the entities eventually detected just before the context was opened are unhighlighted...
if(!IsCurrent(myLastPicked)){
if(!myLastPicked.IsNull()){
Standard_Integer HiMod = myLastPicked->HasHilightMode()?myLastPicked->HilightMode():0;
myLocalContexts(myCurLocalIndex)->UnhilightLastDetected(mylastmoveview);
}
- // on met a 0 les entites liees a la selection dynamique au point neutre.
+ // entities connected to dynamic selection at neutral point are set to 0.
myLastinMain.Nullify();
myLastinColl.Nullify();
UseDisplayedObjects,
AllowShapeDecomposition,
AcceptEraseOfTemporary);
- NewLocal->MainSelector()->Set ((myLocalContexts.Extent() > 0)
- ? myLocalContexts (untilnow)->MainSelector()->Projector()
- : myMainSel->Projector());
-
+
+ // rob 16/04/97 Problems of asynchronous orders
+ if(myLocalContexts.Extent()>0){
+ const Select3D_Projector& Prj = myLocalContexts(untilnow)->MainSelector()->Projector();
+ NewLocal->MainSelector()->Set(Prj);
+ }
+ else{
+ const Select3D_Projector& Prj = myMainSel->Projector();
+ NewLocal->MainSelector()->Set(Prj);
+ }
+
NewLocal->MainSelector()->UpdateConversion();
-
+
myLocalContexts.Bind(myCurLocalIndex,NewLocal);
+
#ifdef DEB
cout<<"\tOpen Local Context No "<<myCurLocalIndex<<endl;
if(UseDisplayedObjects){
cout<<"\t\tNo Objects Were Loaded "<<endl;
#endif
return myCurLocalIndex;
+
}
//=======================================================================
return;
}
- // On va fermer le seul contexte local ouvert...
+ // the only open local context is closed...
if(myLocalContexts.Extent()==1 && GoodIndex == myCurLocalIndex){
Standard_Boolean updateproj = !(myLocalContexts(myCurLocalIndex)->HasSameProjector(myMainSel->Projector()));
cout<<"No More Opened Local Context "<<endl;
}
- // Sinon on aura encore un contexte local d'ouvert apres la fermeture du courant
+ // Otherwise the local context will be still open after the current is closed
else{
Handle(StdSelect_ViewerSelector3d) VS = myLocalContexts(GoodIndex)->MainSelector();
myLocalContexts(GoodIndex)->Terminate();
myLocalContexts.UnBind(GoodIndex);
- // on ferme le courant...
+ // the current is closed...
if(GoodIndex==myCurLocalIndex){
myCurLocalIndex = HighestIndex();
const Handle(AIS_LocalContext)& LocCtx = myLocalContexts(myCurLocalIndex);
{
if(!HasOpenedContext()){
if(!myObjects.IsBound(anIObj)) return;
- TColStd_ListIteratorOfListOfInteger ItL;
for(ItL.Initialize(myObjects(anIObj)->SelectionModes());
ItL.More();
ItL.Next()){
ActivatedModes(const Handle(AIS_InteractiveObject)& anIObj,
TColStd_ListOfInteger& theList) const
{
- TColStd_ListIteratorOfListOfInteger ItL;
if(!HasOpenedContext()){
if(myObjects.IsBound(anIObj)){
+ //ItL is a static variable...
for(ItL.Initialize(myObjects(anIObj)->SelectionModes());
ItL.More();
ItL.Next())
if(myObjects.IsBound(anIObj)){
const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
STAT->SubIntensityOn();
- TColStd_ListIteratorOfListOfInteger ItL;
for (ItL.Initialize(STAT->DisplayedModes());ItL.More();ItL.Next())
myMainPM->Color(anIObj,mySubIntensity,ItL.Value());
}
if(myObjects.IsBound(anIObj)){
const Handle(AIS_GlobalStatus)& STAT = myObjects(anIObj);
STAT->SubIntensityOff();
- TColStd_ListIteratorOfListOfInteger ItL;
for (ItL.Initialize(STAT->DisplayedModes());ItL.More();ItL.Next())
myMainPM->Unhighlight(anIObj,ItL.Value());
if(STAT->IsHilighted())
//=======================================================================
void AIS_InteractiveContext::SubIntensityOff(const Standard_Boolean updateviewer)
{
+
if(!HasOpenedContext()) return;
-
+
AIS_DataMapIteratorOfDataMapOfIOStatus It (myObjects);
- TColStd_ListIteratorOfListOfInteger ItL;
+
for(;It.More();It.Next()){
const Handle(AIS_GlobalStatus)& STAT = It.Value();
if(STAT->IsSubIntensityOn())
for(ItL.Initialize(STAT->DisplayedModes());ItL.More();ItL.Next())
myMainPM->Unhighlight(It.Key());
}
-
+
if(updateviewer) myMainVwr->Update();
}
Standard_Address Add = G->Owner();
if(Add==NULL){
G->Erase();
- G->Clear();// ca veut dire qu'elle n'est pas reference comme une presentation d'un InterfactiveObject...
+ G->Clear();// it means that it is not referenced as a presentation of InterfactiveObject...
NbCleared++;
}
Handle(AIS_InteractiveObject) IO = (AIS_InteractiveObject*)Add;
{
Standard_Boolean upd_main(Standard_False),upd_col(Standard_False);
TColStd_ListIteratorOfListOfInteger itl;
-
+
for (AIS_DataMapIteratorOfDataMapOfIOStatus it(myObjects);it.More();it.Next()){
const Handle(AIS_InteractiveObject)& iobj = it.Key();
const Handle(AIS_GlobalStatus)& STAT = it.Value();
case AIS_DS_Displayed:{
upd_main = Standard_True;
- // partie display...
+ // part display...
for(itl.Initialize(STAT->DisplayedModes());itl.More();itl.Next())
myMainPM->Display(iobj,itl.Value());
if(STAT->IsHilighted()){
else
Hilight(iobj,Standard_False);
}
- //partie selection
+ //part selection
for(itl.Initialize(STAT->SelectionModes());itl.More();itl.Next()){
if(itl.Value()!=-1)
mgrSelector->Activate(iobj,itl.Value(),myMainSel);
//=======================================================================
//function : Constructor
-//purpose : TwoFacesLength dimension (avec position et texte)
+//purpose : TwoFacesLength dimension (with position and text)
//=======================================================================
AIS_LengthDimension::AIS_LengthDimension(const TopoDS_Face& aFirstFace,
//=======================================================================
//function : AIS_LengthDimension
-//purpose : Distance Face - Edge pour chamfrein 3D
-// Ajout Jean-Claude Vauthier le 17/06/98
+//purpose : Distance Face - Edge for chamfer 3D
//=======================================================================
AIS_LengthDimension::AIS_LengthDimension (const TopoDS_Face& Face,const TopoDS_Edge& Edge,const Standard_Real Val,const TCollection_ExtendedString& Text)
switch (myFShape.ShapeType()) {
case TopAbs_FACE:
{
- // cas longueur sur une face
+ // case length on a face
ComputeOneFaceLength(aPresentation);
}
break;
case TopAbs_EDGE:
{
- // cas longueur d'un edge
+ // case length of an edge
ComputeOneEdgeLength(aPresentation);
}
break;
case TopAbs_FACE:
{
if (mySShape.ShapeType () == TopAbs_FACE) {
- // cas longueur entre deux faces
+ // case length between two faces
ComputeTwoFacesLength(aPresentation);
}
else if (mySShape.ShapeType () == TopAbs_EDGE) {
mySymbolPrs );
}
else if (mySShape.ShapeType() == TopAbs_EDGE) {
- // cas longueur entre deux edges
+ // case length between two edges
#ifdef BUC60915
if( !myArrowSizeIsDefined )
#endif
myDrawer->LengthAspect()->Arrow1Aspect()->SetLength( myArrowSize );
myDrawer->LengthAspect()->Arrow2Aspect()->SetLength( myArrowSize );
- // Recherche du texte de la cote
+ // Find text of the face
DsgPrs_LengthPresentation::Add( aPresentation,
myDrawer,
else {
curpos.SetXYZ((l1.Location().XYZ()+l2.Location().XYZ())/2.);
}
- // offset pour eviter confusion Edge et Dimension
+ // offset to avoid confusion Edge and Dimension
gp_Vec offset(DirAttach);
offset = offset*ArrowSize*(-10.);
curpos.Translate(offset);
Position = curpos;
}
- else { // on projette le point dans le plan
+ else { // the point is projected in the plane
// it is patch!
Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() );
}
- // recherche points attache
+ // find attachment points
if (!isInfinite1) {
if (Position.Distance(ptat11) > Position.Distance(ptat12)) FirstAttach = ptat12;
else FirstAttach = ptat11;
if (FirstShape.ShapeType() == TopAbs_VERTEX) {
thevertex = TopoDS::Vertex(FirstShape);
theedge = TopoDS::Edge(SecondShape);
- numedge = 2;// edge = 2 iem shape
+ numedge = 2;// edge = 2nd shape
}
else {
thevertex = TopoDS::Vertex(SecondShape);
theedge = TopoDS::Edge(FirstShape);
- numedge = 1; // edge = 1 ere shape
+ numedge = 1; // edge = 1st shape
}
gp_Pnt ptonedge1,ptonedge2;
aPresentation->SetInfiniteState(isInfinite);
AIS::ComputeGeometry(thevertex, FirstAttach, Plane, isOnPlanVertex);
- // on considere que seule la courbe peut etre projetee
+ // take into consideration that only the curve can be projected
if (!isOnPlanEdge && !isOnPlanVertex)
return;
if (AutomaticPos) {
gp_Pnt p = ElCLib::Value(ElCLib::Parameter(l,FirstAttach),l);
gp_Pnt curpos((FirstAttach.XYZ()+p.XYZ())/2.);
- // offset pour eviter confusion Edge et Dimension
+ // offset to avoid confusion Edge and Dimension
gp_Vec offset(DirAttach);
offset = offset*ArrowSize*(-10.);
curpos.Translate(offset);
Position = curpos;
}
- else { // on projette le point dans le plan
+ else { // the point is projected in the plane
// it is patch!
Position = AIS::ProjectPointOnPlane( Position, Plane->Pln() );
if (AutomaticPos) {
if (!samePoint) {
gp_Pnt curpos((FirstAttach.XYZ()+SecondAttach.XYZ())/2.);
- // offset pour eviter confusion Edge et Dimension
+ // offset to avoid confusion Edge and Dimension
gp_Vec offset(DirAttach);
offset = offset*ArrowSize*(-10.);
curpos.Translate(offset);
arr = la->Arrow2Aspect();
arr->SetLength(ArrowSize);
- // Type des fleches
+ // Type of arrows
if ( ExtShape == 1) SymbolPrs = DsgPrs_AS_FIRSTPT_LASTAR;
else if (ExtShape == 2) SymbolPrs = DsgPrs_AS_FIRSTAR_LASTPT;
Position,
SymbolPrs);
- // Calcul de la projection du vertex
+ // Calculate the projection of the vertex
if ( ExtShape == 1)
AIS::ComputeProjVertexPresentation(aPresentation, aDrawer, FirstVertex, FirstAttach);
else if ( ExtShape == 2)
void AIS_LengthDimension::ComputeEdgeVertexSelection(const Handle(SelectMgr_Selection)& aSelection)
{
// ********** NB ->
- // dans le cas d'une contrainte par rapport au bord d'une face
- // seule la shape de ce contour est valide
+ // in the case of a constraint relatively to the border of a face
+ // only the shape of this contour is valid
- // Creation de 2 owner pour permettre l'edition de contraintes
+ // Create 2 owner for edition of constraints
Handle(AIS_DimensionOwner) own1 = new AIS_DimensionOwner(this,7);
Handle(AIS_DimensionOwner) own2 = new AIS_DimensionOwner(this,7);
if (!Proj1.IsEqual(Proj2,confusion)) L3 = gce_MakeLin(Proj1,Proj2);
else {
- // cas ou la dimension est nulle
- // on choisit le own1 par defaut
+ // cas of zero dimension
+ // own1 is chosen by default
L3 = gce_MakeLin(Proj1,myDirAttach);
Standard_Real size(Min(myVal/100.+1.e-6,myArrowSize+1.e-6));
Handle(Select3D_SensitiveBox) box = new Select3D_SensitiveBox(own1,myPosition.X(),myPosition.Y(),myPosition.Z(),
Att->SetDecomposition(Standard_True);
else
Att->SetDecomposition(Standard_False);
- // statut temporaire ou non
+ // status temporary or not
if(myCTX->DisplayStatus(anInteractive) == AIS_DS_None ||
myCTX->DisplayStatus(anInteractive) == AIS_DS_Temporary)
Att->SetTemporary(Standard_True);
TColStd_ListIteratorOfListOfInteger It;
Standard_Boolean jobdone(Standard_False);
- // on regarde quel etaient ses attributs temporaires et on
- // remet tout a 0
+ // it is checked which were the temporary attributes
+ // and they are set to 0
- // desactiver les modes stantard
+ // desactivate standard modes
if(Att->Decomposed()){
for(It.Initialize(myListOfStandardMode);It.More();It.Next()){
mySM->Deactivate(aSelectable,It.Value(),myMainVS);
}
}
- // si objet ou presentations temporaires...
+ // if object or temporary presentations...
if(Att->IsTemporary())
{
if(Att->IsSubIntensityOn())
myMainPM->Unhighlight(aSelectable,Att->HilightMode());
- // enlever quand bug sur clear corrige...
+ // remove if bug on clear correct...
myMainPM->Erase(aSelectable,Att->DisplayMode());
myMainPM->Clear(aSelectable,Att->DisplayMode());
if(myMainPM->IsDisplayed(aSelectable,Att->HilightMode()))
// myMainPM->Clear(aSelectable,Att->HilightMode());
jobdone = Standard_True;
}
- // si sous intensite
+ // if below intensity
else
{
if(Att->IsSubIntensityOn())
myCTX->SubIntensityOff(aSelectable);
}
- // desactiver les modes propres stockes
+ // desactivate stored proper modes
for(It.Initialize(Att->SelectionModes());It.More();It.Next()){
mySM->Deactivate(aSelectable,It.Value(),myMainVS);
}
-// pop : si je laisses cela plantes dans les elements de construction
-// alors a toi de jouer ROB
// RemoveSelected(aSelectable);
if(IsSelected(aSelectable))
void AIS_LocalContext::ActivateStandardMode(const TopAbs_ShapeEnum aType)
{
- //on verifie qu'il n'esiste pas deja dans la liste
+ //check if it is not in the list
TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
for(;It.More();It.Next())
if(It.Value()==aType) return;
Standard_Integer IMode = AIS_Shape::SelectionMode(aType);
- // on cree de facon cachee un filtre repondant ok au type
- //sauf :
- // si le type est shape...
- // si des filtres agissent deja sur le type <aType>
+ // create a hidden filter answering ok to the type except for :
+ // if the type is shape...
+ // if the filters already impact at the type <aType>
if(aType != TopAbs_SHAPE){
if(myStdFilters[IMode].IsNull())
myStdFilters[IMode] = new StdSelect_ShapeTypeFilter(aType);
myFilters->Add(myStdFilters[IMode]);
}
- // on active le mode pour tous les objets de type Shape
- // acceptant la decomposition en mode standard.
+ // the mode is activated for all objects of type Shape
+ // accepting the decomposition in standard mode.
myListOfStandardMode.Append(IMode);
AIS_DataMapIteratorOfDataMapOfSelStat ItM(myActiveObjects);
void AIS_LocalContext::AddFilter(const Handle(SelectMgr_Filter)& aFilter)
{
- // on regarde si le filtre agit sur un type de sous shape
- // active pour lequel on aurait deja mis un filtre de type...
+ // it is checked if the filter impacts at the type of active sub-shape
+ // for which a filter of type has been already implemented...
TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
{
if(myFilters->IsIn(aFilter)) myFilters->Remove(aFilter);
- // on regarde si le filtre concernait un type standard active.
- // si oui , on regarde s'il en existe de semblables encore
- // parmi les filtres restant..
- // s'il n'en reste pas , on remet le filtre standard
- // permettant de continuer a selectionner les modes
- // actifs...
+ // it is checked if the filter for type standard is active.
+ // if yes, it is checked there are still similarities among the
+ // remaining filters...
+ // otherwise, the standard filter is restored to
+ // continu selecting active modes...
TColStd_ListIteratorOfListOfInteger It(myListOfStandardMode);
TopAbs_ShapeEnum SE;
for(;It.More();It.Next()){
-Standard_Boolean AIS_LocalContext::HasSameProjector(const Handle(Select3D_Projector)& thePrj) const
+Standard_Boolean AIS_LocalContext::HasSameProjector(const Select3D_Projector& aPrj) const
{
- const Handle(Select3D_Projector)& aCurPrj = myMainVS->Projector();
- if (aCurPrj->Perspective() != thePrj->Perspective())
- return Standard_False;
- if (aCurPrj->Perspective() && aCurPrj->Focus() != thePrj->Focus())
- return Standard_False;
- const gp_GTrsf& aCurTrsf = aCurPrj->Transformation();
- const gp_GTrsf& aPrjTrsf = thePrj->Transformation();
-
- for (Standard_Integer i = 1; i <= 3; ++i)
- {
- for (Standard_Integer j = 1; j <= 3 ; ++j)
- {
- if (aCurTrsf.Value (i, j) != aPrjTrsf.Value (i, j))
- return Standard_False;
+ const Select3D_Projector& CurPrj = myMainVS->Projector();
+ if(CurPrj.Perspective()!=aPrj.Perspective()) return Standard_False;
+ if(CurPrj.Perspective())
+ if(CurPrj.Focus()!=aPrj.Focus()) return Standard_False;
+ gp_GTrsf CurTrsf(CurPrj.Transformation());
+ gp_GTrsf PrjTrsf(aPrj.Transformation());
+
+ for(Standard_Integer i=1;i<=3;i++){
+ for(Standard_Integer j=1;j<=3;j++){
+ if(CurTrsf.Value(i,j)!=PrjTrsf.Value(i,j))
+ return Standard_False;
}
}
-
+
return Standard_True;
}
myMapOfOwner.Clear();
mylastindex=0;
- // nettoyons le selecteur...
+ // clear the selector...
myMainVS->Clear();
myCTX->SelectionManager()->Remove(myMainVS);
{
if(!myActiveObjects.IsBound(anObject)) return;
- // pour voir si d'aventure l'objet est quelque part ailleurs...
+ // chieck if by hazard the object is somewhere else...
Standard_Integer Indx;
Standard_Boolean IsSomeWhereElse =
myCTX->IsInLocal(anObject,Indx) && Indx != myCTX->IndexOfCurrentLocal();
const Handle(AIS_LocalStatus)& CurAtt = It.Value();
//TColStd_ListIteratorOfListOfInteger ItL;
- // si objet temporaire on efface ses presentations geree par myMainPM
+ // if object is temporary the presentations managed by myMainPM are removed
AIS_DisplayStatus TheDS = myCTX->DisplayStatus(SO);
if(TheDS != AIS_DS_Displayed){
const Standard_Integer Ypix,
const Handle(V3d_View)& aview)
{
- // d'abord voir ce que le ViewerSelector donne
+ // check that ViewerSelector gives
if(aview->Viewer()== myCTX->CurrentViewer()) {
#ifdef IMP160701
//Nullify class members storing information about detected AIS objects.
EO = myMainVS->Picked(i_detect);
if(!EO.IsNull()){
if(myFilters->IsOk(EO)) {
- myDetectedSeq.Append(i_detect); // normalement ils sont deja ranges dans le bon ordre...
+ myDetectedSeq.Append(i_detect); // normallly they are already arranged in correct order...
#ifdef IMP160701
Handle(AIS_InteractiveObject) anObj = Handle(AIS_InteractiveObject)::DownCast(EO->Selectable());
if(!Handle(AIS_Shape)::DownCast(anObj).IsNull())
}
}
- //resultat des courses..
+ //result of courses..
if(had_nothing || myDetectedSeq.IsEmpty()){
if(mylastindex !=0 && mylastindex <= myMapOfOwner.Extent()){
return (had_nothing ? AIS_SOD_Nothing : AIS_SOD_AllBad);
}
- // quelque chose...
- // on passe tous les proprietaires detectes par le selecteur
- // aux filtres et on garde les bons..
+ // all owners detected by the selector are passed to the
+ // filters and correct ones are preserved...
myCurDetected = 1;
EO = myMainVS->Picked(myDetectedSeq(myCurDetected));
for(myMainVS->Init();myMainVS->More();myMainVS->Next()){
const Handle(SelectMgr_EntityOwner)& OWNR = myMainVS->Picked();
if(myFilters->IsOk(OWNR)){
- // rangeons ce proprietaire au chaud, il pourrait servir...
+ // it can be helpfil to classify this owner immediately...
#ifdef BUC60569
Standard_Integer state = OWNR->State();
if( state < 1 ){
return AIS_SOP_Error;
}
//==================================================
-// Function: les objets deja selectionnes sont deselectionnes
-// Purpose : les autres sont selectionnes.
+// Function: the already selected objects are unselected
+// Purpose : others are selected.
//==================================================
AIS_StatusOfPick AIS_LocalContext::ShiftSelect(const Standard_Integer XPMin,
const Standard_Integer YPMin,
#ifdef BUC60774
return LastExt == 0 ? AIS_SOP_NothingSelected:AIS_SOP_Removed;
#else
- return AIS_SOP_NothingSelected; // aucun effet si on a clique dans le vide
+ return AIS_SOP_NothingSelected; // no effet if click on empty space
#endif
AIS_Selection::SetCurrentSelection(mySelName.ToCString());
for(myMainVS->Init();myMainVS->More();myMainVS->Next()){
const Handle(SelectMgr_EntityOwner)& OWNR = myMainVS->Picked();
if(myFilters->IsOk(OWNR)){
- // rangeons ce proprietaire au chaud, il pourrait servir...
+ // it can be helpfil to classify this owner immediately...
#ifdef BUC60953
Standard_Integer state = OWNR->State();
if( state < 1 ){
Handle (PrsMgr_PresentationManager3d) PM = myMainPM;
SelectMgr_DataMapOfObjectOwners aMap;
- // pour eviter les Pbs quand on est dans une boucle de recherche des objets selectionnes....
+ // to avoid problems when there is a loop searching for selected objects...
#if !defined OCC189 && !defined USE_MAP
const TColStd_Array1OfTransient& Obj = Sel->Objects()->Array1();
for(Standard_Integer i =Obj.Lower();i<=Sel->NbStored();i++)
//=======================================================================
//function : UpdateSelection
-//purpose : devrait disparaitre ...
+//purpose : should disappear...
//=======================================================================
void AIS_LocalContext::UpdateSelected(const Standard_Boolean updateviewer)
{
if(!IsValidForSelection(anIObj)) return;
UnhilightPicked(Standard_False);
- //1er cas , on trouve un proprietaire qui a deja <anIObj> comme proprietaire
- // et qui ne soit pas decompose...
+ //1st case, owner already <anIObj> as owner
+ // and not separated is found...
Handle(AIS_Selection) sel = AIS_Selection::Selection(mySelName.ToCString());
//Standard_Boolean found(Standard_False);
Handle(Standard_Transient) Tr;
Handle(SelectMgr_EntityOwner) EO = FindSelectedOwnerFromIO(anIObj);
if(EO.IsNull()){
- //regardons s'il a dans sa selection numero 0 un proprietaire qu'on pourrait triturer...
+ //check if in selection number 0 there is an owner that can be triturated...
if(anIObj->HasSelection(0)){
const Handle(SelectMgr_Selection)& SIOBJ = anIObj->Selection(0);
SIOBJ->Init();
{
if(!IsValidForSelection(anIObj)) return;
UnhilightPicked(Standard_False);
- // d'abord regardons s'il est selectionne...
+ // first check if it is selected...
Handle(SelectMgr_EntityOwner) EO;
EO = FindSelectedOwnerFromIO(anIObj);
//=======================================================================
//function : AddOrRemoveSelected
-//purpose : A revoir...
+//purpose : To check...
//=======================================================================
void AIS_LocalContext::AddOrRemoveSelected(const TopoDS_Shape& Sh,
const Standard_Boolean updateviewer)
// OK...
if(okStatus){
//=======================================================================================================
- // 2 cas : a- l'objet est dans la map des pickes:
- // 1. c'est le meme index que le dernier detecte: ->On ne fait rien
- // 2. sinon :
- // - si lastindex = 0 (aucun objet detecte au dernier move)
- // on hilighte la prs de l'objet et on met lastindex = index(objet)
- // - sinon :
- // on "desighlighte" la prs de l'objet correspondant a lastindex
- // voire on l'efface si l'objet n'est pas visualise mais juste actif
- // puis on hilighte la Prs de l'objet detecte ici et on met lastindex = index(objet)
- // b- l'objet n'est pas dans la map des objets pickes
- // - si lastindex != 0 (objet detecte au dernier move) on desighlighte ...
- // si l'objet a ete decompose, on cree une prs pour la shape detectee et on ajoute
- // le couple (Proprietaire,Prs) dans la map.
- // sinon on met dans la map le couple(proprietaire, NullPrs) et on hilighte l'objet interactif
- // lui meme.
+ // 2 cases : a- object is in the map of picks:
+ // 1. this is the same index as the last detected: -> Do nothing
+ // 2. otherwise :
+ // - if lastindex = 0 (no object was detected at the last step)
+ // the object presentation is highlighted and lastindex = index(objet)
+ // - othrwise :
+ // the presentation of the object corresponding to lastindex is "unhighlighted"
+ // it is removed if the object is not visualized but only active
+ // then the presentation of the detected object is highlighted and lastindex = index(objet)
+ // b- the object is not in the map of picked objects
+ // - if lastindex != 0 (object detected at the last step) it is unhighlighted ...
+ // if the object was decomposed, presentation is created for the detected shape and the couple
+ // (Proprietaire,Prs)is added in the map.
+ // otherwise the couple(proprietaire, NullPrs) is placed in the map and the interactive object
+ // itself is highlighted.
//
//=======================================================================================================
{
const Handle(SelectMgr_EntityOwner)& OWN = myMapOfOwner.FindKey(PickedIndex);
Handle(SelectMgr_SelectableObject) aSel = OWN->Selectable();
- if (myActiveObjects.IsBound (aSel)) { // debug de jmi
+ if (myActiveObjects.IsBound (aSel)) { // debug of jmi
const Handle(AIS_LocalStatus)& Stat = myActiveObjects(aSel);
return Stat->Decomposed();
}
Standard_Integer AIS_LocalContext::HilightNextDetected(const Handle(V3d_View)& V)
{
- // on va jusqu'au prochain proprietaire
+ // go to the next owner
if(myDetectedSeq.IsEmpty()) return Standard_False;
Standard_Integer L = myDetectedSeq.Length();
//=======================================================================
//function : FindSelectedOwnerFromIO
-//purpose : on regarde si l''un des proprietaires selectionnes represente
-// effectivement IObj
+//purpose : it is checked if one of the selected owners really presents IObj
//=======================================================================
Handle(SelectMgr_EntityOwner) AIS_LocalContext::FindSelectedOwnerFromIO
(const Handle(AIS_InteractiveObject)& anIObj) const
//=======================================================================
//function : FindSelectedOwnerFromShape
-//purpose : on regarde si l''un des proprietaires selectionnes represente effectivement IObj
+//purpose : it is checked if one of the selected owners really presents IObj
//=======================================================================
Handle(SelectMgr_EntityOwner) AIS_LocalContext::FindSelectedOwnerFromShape(const TopoDS_Shape& sh) const
{
else if (aMode == 1){
if (!myIsXYZPlane){
ComputeFrame();
- // a mettre ailleurs sans doute...
Handle(Prs3d_PlaneAspect) theaspect = myDrawer->PlaneAspect();
Handle(Graphic3d_Group) TheGroup = Prs3d_Root::CurrentGroup(aPresentation);
gp_Pnt p1;
void AIS_Plane::SetSize(const Standard_Real aXLength,
const Standard_Real aYLength)
{
- //si le plan a deja une couleur ou une taille propre,
- //il y a deja un PlaneAspect et un DatumAspect specifique
+ //if the plane already has a proper color or size,
+ //there is already a specific PlaneAspect and DatumAspect
Handle(Prs3d_PlaneAspect) PA;
Handle(Prs3d_DatumAspect) DA;
//=======================================================================
//function : UnsetSize
-//purpose : S'il ya une couleur, on recupere la taille du drawer du context...
+//purpose : If there is a color, the size is restaured from the drawer of the context...
//=======================================================================
void AIS_Plane::UnsetSize()
{
void AIS_Plane::SetColor(const Quantity_Color &aCol)
#endif
{
- // si le plan a deja sa propre taille, il y a un deja planeaspect cree
+ // if the plane already has its proper size, there is an already created planeaspect
// Standard_Boolean yenadeja = hasOwnColor || myHasOwnSize;
Handle(Prs3d_PlaneAspect) PA;
Handle(Prs3d_DatumAspect) DA;
DA->SecondAxisAspect()->SetColor(col);
DA->SetDrawFirstAndSecondAxis(Standard_True);
DA->SetDrawThirdAxis(Standard_False);
- myDrawer->SetDatumAspect(DA); // odl - on en cree un specifique puisqu'on le modifie
+ myDrawer->SetDatumAspect(DA); // odl - specific is created because it is modified
myShapes[0] = Position();
myShapes[1] = XAxis();
myShapes[2] = YAxis();
#define MaxSizeOfResult 100000
#endif
-// beurk mais moins qu''avant.... rob
static void AIS_Sel_CurrentSelection (Handle(AIS_Selection)& InputSel)
{
static Handle(AIS_Selection) theCurrentSelection;
//=======================================================================
Standard_Boolean AIS_Selection::SetCurrentSelection (const Standard_CString aName)
{
- AIS_Selection::CreateSelection(aName); // juste pour voir... ?????????????
+ AIS_Selection::CreateSelection(aName);
Handle(AIS_Selection) anAISSelection = AIS_Selection::Selection(aName) ;
if(arr(i)==anObject)
Found=i;
}
- // Il n''est pas dedans, on le rajoute....
+ // If it is not inside, it is added...
#ifdef BUC60953
if ( !selected || Found == -1 ) {
#endif
if((S->myNb)+1>arr.Length()){
Handle(TColStd_HArray1OfTransient) NiouTab = new TColStd_HArray1OfTransient(1,arr.Length()+MaxSizeOfResult);
- // oui bon, mais...
for(i=arr.Lower();i<=S->myNb;i++){
const Handle(Standard_Transient)& T = S->myresult->Value(i);
NiouTab->SetValue(i,T);
S->myresult->SetValue(S->myNb,anObject);
return AIS_SS_Added;
}
- // il etait dedans on l''enleve...
+ // it was inside and it is removed...
for(i=Found;i<=S->myNb;i++)
arr(i)=arr(i+1);
S->myNb--;
Standard_Integer i;
if((S->myNb)+1>arr.Length()){
Handle(TColStd_HArray1OfTransient) NiouTab = new TColStd_HArray1OfTransient(1,arr.Length()+MaxSizeOfResult);
- // oui bon, mais...
for(i=arr.Lower();i<=S->myNb;i++){
const Handle(Standard_Transient)& T = S->myresult->Value(i);
NiouTab->SetValue(i,T);
// Created: Fri Dec 20 17:18:37 1996
// Author: Robert COUBLANC
// <rob@robox.paris1.matra-dtv.fr>
-// Modified: Christiane ARMAND: 5/05/97: dans le compute on prend en
-// compte le cas des objets infinis
-// ROB : introduction des primitives connectees
-// Pour le calcul des faces sensibles...
-// oct-03-97 ROB : en fonction du type de shapes, on change les coeffs de polygonisation...
-// (correction du Pb des cercles pas assez discretises...)
#define BUC60577 //GG_191099 Draw correct bounding box and Menage ...
}
- if (IsInfinite()) aPrs->SetInfiniteState(Standard_True); //pas de prise en compte lors du FITALL
+ if (IsInfinite()) aPrs->SetInfiniteState(Standard_True); //not taken in account duting FITALL
switch (aMode) {
case 0:{
try { OCC_CATCH_SIGNALS StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer); }
cout << "AIS_Shape::Compute() failed"<< endl;
#endif
cout << "a Shape should be incorrect : No Compute can be maked on it "<< endl;
-// on calcule une presentation de la boite englobante
+// presentation of the bounding box is calculated
// Compute(aPresentationManager,aPrs,2);
}
break;
BRepTools::Clean(myshape);
}
- //shading seulement a partir de face...
+ //shading only on face...
if ((Standard_Integer) myshape.ShapeType()>4)
StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer);
else {
}
case 2:
{
- // boite englobante
+ // bounding box
if (IsInfinite()) StdPrs_WFDeflectionShape::Add(aPrs,myshape,myDrawer);
else DisplayBox(aPrs,BoundingBox(),myDrawer);
}
Aspect_TypeOfDeflection prevdef = defdrawer->TypeOfDeflection();
defdrawer->SetTypeOfDeflection(Aspect_TOD_RELATIVE);
-// coefficients pour le calcul
+// coefficients for calculation
Standard_Real prevangle, newangle ,prevcoeff,newcoeff ;
if (OwnHLRDeviationAngle(newangle,prevangle) || OwnHLRDeviationCoefficient(newcoeff, prevcoeff))
#else
TopExp_Explorer anExplor (myshape, TopAbs_VERTEX);
#endif
- if (!anExplor.More()) // Shape vide -> Assemblage vide.
+ if (!anExplor.More()) // empty Shape -> empty Assembly.
return;
}
}
#endif
-// POP on protege contre un plantage dans les couches basses
+// POP protection against crash in low layers
Standard_Real aDeflection = myDrawer->MaximalChordialDeviation();
if (myDrawer->TypeOfDeflection() == Aspect_TOD_RELATIVE)
{
- // On calcule la fleche en fonction des min max globaux de la piece:
+ // Vector is calculated depending on global min max of the part:
Bnd_Box aBndBox; //= BoundingBox(); ?
BRepBndLib::Add (shape, aBndBox);
if (!aBndBox.IsVoid())
myOwnColor = aCol;
if(!myDrawer->HasShadingAspect()){
Handle(Prs3d_ShadingAspect) asp = new Prs3d_ShadingAspect();
-// recuperons le materiau reference...
+// retrieve the reference materials...
if(myDrawer->HasLink()){
const Handle(Prs3d_Drawer)& refdr = myDrawer->Link();
Graphic3d_MaterialAspect theRefMat =
myDrawer->SetUnFreeBoundaryAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW));
myDrawer->SetSeenLineAspect(new Prs3d_LineAspect(aCol,Aspect_TOL_SOLID,WW));
- // modif du shading rapide...
+ // fast shading modification...
if(!GetContext().IsNull()){
if( GetContext()->MainPrsMgr()->HasPresentation(this,1)){
Handle(Prs3d_Presentation) P = GetContext()->MainPrsMgr()->CastPresentation(this,1)->Presentation();
#else
a4bis->SetInteriorColor(Quantity_Color(aCol)); // Already done above in SetColor(...)
-//***test rob : pour avoir la vraie couleur demandee en shading ***
-// mais du coup, le shading est "plat" ...****
-// Graphic3d_MaterialAspect FMAT = a4bis->FrontMaterial();
-// FMAT.SetColor(Quantity_Color(aCol));
-// a4bis->SetFrontMaterial(FMAT);
-//******
-
P->SetPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
G->SetGroupPrimitivesAspect(myDrawer->ShadingAspect()->Aspect());
#endif
void AIS_Shape::UnsetColor()
{
- // Evitons les stupidites...
if(!HasColor() ){ myToRecomputeModes.Clear();
return;}
#endif
}
myOwnWidth = W;
- LoadRecomputable(0); // signifier qu'il faut recalculer uniquement le wireframe....
- LoadRecomputable(2); // et la boite englobante...
+ LoadRecomputable(0); // means that it is necessary to recompute only the wireframe....
+ LoadRecomputable(2); // and the bounding box...
}
G->SetGroupPrimitivesAspect(a4bis);
}
}
- myRecomputeEveryPrs =Standard_False; // aucun mode a recalculer :uniquement update viewer
+ myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
myToRecomputeModes.Clear();
}
//=======================================================================
G->SetGroupPrimitivesAspect(a4bis);
}
}
- myRecomputeEveryPrs =Standard_False; // aucun mode a recalculer :uniquement update viewer
+ myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
myToRecomputeModes.Clear();
}
G->SetGroupPrimitivesAspect(a4bis);
}
}
- myRecomputeEveryPrs =Standard_False; // aucun mode a recalculer :uniquement update viewer
+ myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
myToRecomputeModes.Clear();
}
G->SetGroupPrimitivesAspect(a4bis);
}
}
- myRecomputeEveryPrs =Standard_False; // aucun mode a recalculer :uniquement update viewer
+ myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
myToRecomputeModes.Clear();
}
#endif
}
}
- myRecomputeEveryPrs =Standard_False; // aucun mode a recalculer :uniquement update viewer
+ myRecomputeEveryPrs =Standard_False; // no mode to recalculate :only viewer update
myToRecomputeModes.Clear();
}
#else
TopExp_Explorer anExplor (myshape, TopAbs_VERTEX);
#endif
- if (!anExplor.More()) { // Shape vide -> Assemblage vide.
+ if (!anExplor.More()) { // empty Shape -> empty Assembly.
myBB.SetVoid();
return myBB;
}
}
gp_Vec theVector;
- gp_Pnt pint3d; // le point de tangence
- gp_Dir theDir; // la direction de la tangente
+ gp_Pnt pint3d; // tangency point
+ gp_Dir theDir; // tangency direction
Standard_Real par_inter = 0.0; // parameter of tangency point
if (found)
pint3d = BRep_Tool::Pnt(VCom);
}
- //Sinon, on le cherche comme si on savait que les 2 curves
- // sont tangentes ( ce qui dooit etre le cas, tant pis pour les autres)
+ // Otherwise it is found as if it was known that 2 curves
+ // are tangents (which must be the cases)
switch (typArg)
{
- case 12: // line circle
- {
+ case 12: // circle line
+ {
const Handle(Geom_Line)& line = (Handle(Geom_Line)&) copy1;
const Handle(Geom_Circle)& circle = (Handle(Geom_Circle)&) copy2;
if ( !found )
{
- // il suffit de projeter le centre du cercle sur la droite
+ // it is enough to project the circus center on the straight line
par_inter = ElCLib::Parameter(line->Lin(), circle->Location());
pint3d = ElCLib::Value(par_inter, line->Lin());
}
if (!found)
{
- // il suffit de projeter le centre du cercle sur la droite
+ // it is enough to project the circus center on the straight line
par_inter = ElCLib::Parameter(line->Lin(), circle->Location());
pint3d = ElCLib::Value(par_inter, line->Lin());
}
BRepTools::Update(myshape);
Handle(Graphic3d_StructureManager) aStrucMana = GetContext()->MainPrsMgr()->StructureManager();
- {
- Handle(Prs3d_ShadingAspect) aPrs3d_ShadingAspect = new Prs3d_ShadingAspect;
- myAspect = aPrs3d_ShadingAspect->Aspect();
- }
+
+ myAspect = (new Prs3d_ShadingAspect())->Aspect();
if (!DoMapTexture)
{
myAspect->SetTextureMapOff();
dVmax = (Vmax - Vmin);
Handle(Graphic3d_Group) mygroup = Prs3d_Root::CurrentGroup(aPrs);
- Standard_Integer nnn = myT->NbTriangles(); // nnn : nombre de triangles
- Standard_Integer nt, n1, n2, n3 = 0; // nt : triangle courant
- // ni : sommet i du triangle courant
+ Standard_Integer nnn = myT->NbTriangles(); // nnn : number of triangles
+ Standard_Integer nt, n1, n2, n3 = 0; // nt : current triangle
+ // ni : top i of the current triangle
for (nt = 1; nt <= nnn; nt++)
{
#ifdef DEBUG
cout << "On traite actuellement le triangle : "<< nt <<"\n";
#endif
- if (SST.Orientation(myFace) == TopAbs_REVERSED) // si la face est "reversed"
- triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
+ if (SST.Orientation(myFace) == TopAbs_REVERSED) // if the face is "reversed"
+ triangles(nt).Get(n1,n3,n2); // the triangle is n1,n3,n2
else
- triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
+ triangles(nt).Get(n1,n2,n3); // the triangle is n1,n2,n3
if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) )
- { // Associates a vertexNT to each node
+ { // Associates vertexNT to each node
Graphic3d_Array1OfVertexNT Points(1,3);
Aspect_Array1OfEdge aretes(1,3);
//=======================================================================
//function : UnsetSize
-//purpose : si l'objet a 1 couleur, on reprend la taille
-// du drawer par defaut. sinon on nullifie le DatumAspect
+//purpose : if the object has 1 color, the default size of the
+// drawer is reproduced, otherwise DatumAspect becomes null
//=======================================================================
void AIS_Trihedron::UnsetSize()
{
aPresentation->Clear();
- //CTS16254 : pas de prise en compte des axes lors du FITALL (fpo 18/07)
aPresentation->SetInfiniteState (Standard_True);
switch(aMode){
case 0:
void AIS_Trihedron::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
const Standard_Integer aMode)
{
- // recuperation des points extremites du triedre.
+ // retrieve the tops of the trihedron.
Standard_Integer Prior;
Handle(SelectMgr_EntityOwner) eown;
TColgp_Array1OfPnt PP(1,4),PO(1,4);
ExtremityPoints(PP);
switch (aMode) {
case 0:
- { // triedre complet 1 seul proprietaire : this... priorite 5 (meme que faces)
+ { // complete triedron only 1 owner : this... priority 5 (same as faces)
Prior = 5;
eown = new SelectMgr_EntityOwner(this,Prior);
for (Standard_Integer i=1; i<=3;i++)
break;
}
case 1:
- { //origine :
+ { //origin :
Prior = 8;
eown= new SelectMgr_EntityOwner(myShapes[0],Prior);
break;
}
case 2:
- { //axes ... priorite 7
+ { //axes ... priority 7
Prior = 7;
for (Standard_Integer i=1; i<=3;i++){
eown= new SelectMgr_EntityOwner(myShapes[i],Prior);
}
case 3:
- { // plans principaux priorite 6
+ { // main planes priority 6
// PO(1) = PP(1);
// PO(4) = PP(1);
Prior =5;
myState = myPClassifier->State();
const TopoDS_Shape& fres = myPClassifier->Face();
if (fres.IsNull()) {
- // NYI : en cas d'elimination des faces EXTERNAL et INTERNAL par le
- // classifier BRepClass3d_SolidClassifier, traiter quand meme ces faces
- // pour generer l'etat ON/Solid quand le point est IN/face INTERNAL ou EXTERNAL
+ // NYI : in case of removal of EXTERNAL and INTERNAL faces by the
+ // classifier BRepClass3d_SolidClassifier, process these faces
+ // to generate state ON/Solid when the point is IN/face INTERNAL or EXTERNAL
return myState;
}
//=======================================================================
//function : MakeNeighboursList
-//purpose : recherche des edges connexes a Earg par Varg
+//purpose : find edges connected to Earg by Varg
//=======================================================================
const TopTools_ListOfShape & BOP_WireEdgeSet::MakeNeighboursList(const TopoDS_Shape& Earg,
const TopoDS_Shape& Varg)
if (newn >= 2 ) {
const TopoDS_Face& F = myFace;
- // plusieurs aretes de couture connexes a E par V et telles que :
- // orientation de V dans E # orientation de V dans ces aretes.
- // on ne garde,parmi les aretes de couture connexes,
- // que l'arete A qui verifie tg(E) ^ tg(A) > 0
+ // several sewing edges connected to E by V such as :
+ // orientation of V in E # orientation of V in its edges.
+ // one leaves among the connected sewing edges,
+ // only edge A that checks tg(E) ^ tg(A) > 0
TopAbs_Orientation Eori;
gp_Vec2d d1E; gp_Pnt2d pE;
( (cross < 0) && oVE == TopAbs_FORWARD );
if ( t2 ) { //-- t1
- // c'est la bonne IsClosed,on ne garde qu'elle parmi les IsClosed
+ // this is proper IsClosed, only it is preserved among IsClosed
lclo.Next();
}
else {
- // on vire l'arete IsClosed
+ // edge IsClosed is suspended
myCurrentShapeNeighbours.Remove(lclo);
}
}// end of while (lclo.More())
Standard_Boolean resu = Standard_False;
TopAbs_Orientation o1,o2;
- // SSCONNEX = False ==> on selectionne E2 de facon a creer ulterieurement
- // (defaut) autant de faces que de composantes connexes en UV.
- // SSCONNEX = True ==> on prend toute arete E2 qui partage V avec E1
- // et telle que orientation(V/E1) # orientation(V/E2)
- // ==> face de part et d'autre des coutures
+ // SSCONNEX = False ==> E2 is selected to create as many
+ // (default) faces as there are components connected in UV.
+ // SSCONNEX = True ==> the entire edge E2 sharing V with E1 is taken
+ // so that orientation(V/E1) # orientation(V/E2)
+ // ==> face of part and other sewings
if ((c1 && c2)) {
Standard_Boolean u1 = c1 ? IsUClosed(E1) : Standard_False;
Standard_Boolean v1 = c1 ? IsVClosed(E1) : Standard_False;
resu = VertexConnectsEdges(V,E1,E2,o1,o2);
}
else {
- // cto 012 O2 arete de couture de face cylindrique
- // chainage des composantes splitees ON et OUT de meme orientation
+ // cto 012 O2 sewing edge of cylindric face
+ // chain of components split ON and OUT of the same orientation
TopAbs_Orientation oe1 = E1.Orientation();
TopAbs_Orientation oe2 = E2.Orientation();
Standard_Boolean iseq = E1.IsEqual(E2);
-- Edge/Face and evolutif radius
class SurfRstConstRad;
- ---Purpose: Copie de CSConstRad mais avec une pcurve sur surface
- -- comme support.
+ ---Purpose: Copy of CSConstRad with pcurve on surface
+ -- as support.
class RstRstEvolRad;
---Purpose: Function to approximate by AppSurface for
-- Edge/Edge and evolutif radius
--
class RstRstConstRad;
- ---Purpose: Copie de CSConstRad mais avec une pcurve sur surface
- -- comme support.
+ ---Purpose: Copy of CSConstRad with a pcurve on surface
+ -- as support.
class SurfPointConstRadInv;
- ---Purpose: Fonction de recadrage entre un point et une surface.
+ ---Purpose: Function of reframing between a point and a surface.
class SurfCurvConstRadInv;
- ---Purpose: Fonction de recadrage entre une restriction surface de
- -- la surface et une courbe.
+ ---Purpose: Function of reframing between a restriction surface of the
+ -- surface and a curve.
class SurfPointEvolRadInv;
- ---Purpose: Fonction de recadrage entre un point et une surface.
+ ---Purpose: Fonction of reframing between a point and a surface.
class CurvPointRadInv;
- ---Purpose: Fonction de recadrage entre un point et une courbe.
- -- valable dans les cas rsyon constant et rayon evolutif
+ ---Purpose: Function of reframing between a point and a curve.
+ -- valid in cases of constant and progressive radius
class SurfCurvEvolRadInv;
- ---Purpose: Fonction de recadrage entre une restriction surface de
- -- la surface et une courbe.
+ ---Purpose: Function of reframing between a surface restriction
+ -- of the surface and a curve.
class SurfRstLineBuilder;
- ---Purpose: Construction d'une BRepBlend_Line entre une surface et
- -- une pcurve sur surface a partir d'une solution de
- -- depart approchee. Les entrees sorties de ce builder
- -- sont de meme nature que celle d'un walking
- -- traditionnel, mais les exigences sur la Line ne sont
- -- pas les memes. Si l'on garanti toujours la
- -- determination du range de validite, on ne respecte
- -- plus les criteres de bonne repartition des sections en
- -- vue d'un lissage. En resume la Line resultat est f(t)
- -- oriented.
+ ---Purpose: Construction of a BRepBlend_Line between a surface and
+ -- a pcurve on surface from an approached
+ -- starting solution. The output entries of this builder
+ -- are of the same nature as of the traditional walking
+ -- but the requirements on the Line are not the same
+ -- If the determination of validity range is always
+ -- guaranteed, the criteria of correct repartition of sections
+ -- before smoothing are not respected. The resulting Line
+ -- is f(t) oriented.
class RstRstLineBuilder;
- ---Purpose: Construction d'une BRepBlend_Line entre deux pcurves a
- -- partir d'une solution de depart approchee. Les
- -- entrees sorties de ce builder sont de meme nature que
- -- celle d'un walking traditionnel, mais les exigences
- -- sur la Line ne sont pas les memes. Si l'on garanti
- -- toujours la determination du range de validite, on ne
- -- respecte plus les criteres de bonne repartition des
- -- sections en vue d'un lissage. En resume la Line
- -- resultat est f(t) oriented.
+ ---Purpose: Construction of a BRepBlend_Line between two pcurves
+ -- from an approached starting solution. The output
+ -- entries of this builder are of the same nature
+ -- as of a traditional walking, but the requirements
+ -- to the Line are not the same. If the determination of validity range is always
+ -- guaranteed, the criteria of correct repartition of sections
+ -- before smoothing are not respected. The resulting Line
+ -- is f(t) oriented.
end BRepBlend;
if (myTolerance(ii)>Tol2d) { myTolerance(ii) = Tol2d;}
}
- // Tableaux
+ // Tables
Func.GetShape( NbPoles, NbKnots, Degree, NbPoles2d);
- // Calcul du BaryCentre (cas rationnel).
+ // Calculation of BaryCentre (rationnal case).
if (Func.IsRational()) {
Standard_Real Xmax =-1.e100, Xmin = 1.e100,
Ymax =-1.e100, Ymin = 1.e100,
//================================================================================
// Function: D0
-// Purpose : Calcul de la section pour v = Param, si le calcul echoue on rend
-// Standard_False.
+// Purpose : Calculation of section for v = Param, if calculation fails
+// Standard_False is raised.
//================================================================================
Standard_Boolean BRepBlend_AppFuncRoot::D0(const Standard_Real Param,
const Standard_Real First,
//================================================================================
// Function: D1
-// Purpose : Calcul de la derive partiel de la section par rapport a v
-// pour v = Param, si le calcul echoue on rend Standard_False.
+// Purpose : Calculation of the partial derivative of the section corresponding to v
+// for v = Param, if the calculation fails Standard_False is raised.
//================================================================================
Standard_Boolean BRepBlend_AppFuncRoot::D1(const Standard_Real Param,
const Standard_Real First,
//===========================================================================
// Function: D2
-// Purpose : Calcul de la derive et seconde partiel de la
-// section par rapport a v.
-// Pour v = Param, si le calcul echoue on rend Standard_False.
+// Purpose : Calculation of the derivative and second partial of the
+// section corresponding to v.
+// For v = Param, if the calculation fails Standard_False is raised.
//===========================================================================
Standard_Boolean BRepBlend_AppFuncRoot::D2(const Standard_Real Param,
const Standard_Real First,
//
// Function : SearchPoint
//
-// Purpose : Recherche du point solution au parametre Param (sur 2 Surfaces)
+// Purpose : Find point solution with parameter Param (on 2 Surfaces)
//
-// Algorithme :
-// 1) On recheche une solution approximative a partir des Points dejas calcules
-// 2) On Converge par une methode de type Newton
+// Algorithm :
+// 1) Approximative solution is found from already calculated Points
+// 2) Convergence is done by a method of type Newton
//
-// Causes possibles d'echecs :
-// - Singularite sur les surfaces.
-// - Manquent d'information dans la "line"issue du cheminement.
+// Possible causes of fails :
+// - Singularity on surfaces.
+// - no information oin the "line" resulting from processing.
//
//================================================================================
{
Standard_Boolean Trouve;
Standard_Integer dim = Func.NbVariables();
- // (1) Recherche d'un point d'init
+ // (1) Find a point of init
Standard_Integer I1=1, I2=myLine->NbPoints(), Index;
Standard_Real t1, t2;
- // (1.a) On verifie que c'est a l'interieur
+ // (1.a) It is checked if it is inside
if (Param < myLine->Point(I1).Parameter()) {return Standard_False;}
if (Param > myLine->Point(I2).Parameter()) {return Standard_False;}
- // (1.b) On recheche l'intervalle
+ // (1.b) Find the interval
Trouve = SearchLocation(Param, I1, I2, Index);
- // (1.c) Si le point est dejas calcule on le recupere
+ // (1.c) If the point is already calculated it is returned
if (Trouve) {
Pnt = myLine->Point(Index);
Vec(XInit,Pnt);
}
else {
- // (1.d) Intialisation par interpolation lineaire
+ // (1.d) Intialisation by linear interpolation
Pnt = myLine->Point(Index);
Vec(X1,Pnt);
t1 = Pnt.Parameter();
}
}
- // (2) Calcul effectif de la solution ------------------------
+ // (2) Calculation of the solution ------------------------
Func.Set(Param);
Func.GetBounds(X1, X2);
math_FunctionSetRoot rsnld(Func, myTolerance, 30);
}
rsnld.Root(Sol);
- // (3) Stockage du point
+ // (3) Storage of the point
Point(Func,Param,Sol,Pnt);
- // (4) Insertion du point si le cacul semble long.
+ // (4) Insertion of the point if the calculation seems long.
if ((!Trouve)&&(rsnld.NbIterations()>3)) {
#ifdef DEB
- cout << "Evaluation en t = " << Param << "donne" << endl;
+ cout << "Evaluation in t = " << Param << "given" << endl;
rsnld.Dump(cout);
#endif
myLine->InsertBefore(Index+1, Pnt);
//
// Function : SearchLocation
//
-// Purpose : Recherche dichotomiqique du rang de l'intervalle parametrique contenant
-// Param dans la liste de points calcule (myline)
-// si le point de parametre Param est deja stocker dans la liste on rend
-// True et ParamIndex correspond au rang du Point.
-// La complexite de cet algorithme est de log(n)/log(2)
+// Purpose : Binary search of the line of the parametric interval containing
+// Param in the list of calculated points (myline)
+// if the point of parameter Param is already stored in the list
+// True is raised and ParamIndex corresponds to line of Point.
+// Complexity of this algorithm is log(n)/log(2)
//================================================================================
Standard_Boolean BRepBlend_AppFuncRoot::SearchLocation(const Standard_Real Param,
const Standard_Integer FirstIndex,
if (Abs(valsol(1)) <= Tol &&
Abs(valsol(2)) <= Tol ) {
- // Calcul des tangentes
+ // Calculation of tangents
prmrst1 = Sol(1);
pt2drst1 = rst1->Value(prmrst1);
prmrst2 = Sol(2);
Sina = nplan.Dot(n1.Crossed(n2));
if (choix%2 != 0) {
- Sina = -Sina; //nplan est change en -nplan
+ Sina = -Sina; //nplan is changed into -nplan
}
Angle = ACos(Cosa);
rstref1->Value(Sol(1)).Coord(u, v);
surfref1->D1(u, v,PtTmp1,d1u,d1v);
- // Normale a la surface de reference 1
+ // Normal to the reference surface 1
NRst1 = d1u.Crossed(d1v);
rstref2->Value(Sol(2)).Coord(u, v);
surfref2->D1(u, v, PtTmp2, d1u, d1v);
- // Normale a la surface de reference 2
+ // Normal to the reference surface 2
NRst2 = d1u.Crossed(d1v);
Standard_Boolean IsCenter;
TgRst2.Reverse();
}
- // On retourne les vecteurs
+ // The vectors are returned
if (NRst1InPlane.Dot(TgRst1) > -1.e-10) {
if (NRst2InPlane.Dot(TgRst2) < 1.e-10) {
return Blend_DecrochBoth;
//=======================================================================
//function : CenterCircleRst1Rst2
-//purpose : Calculer le centre du cercle passant par les deux points des restrictions
+//purpose : Calculate the center of the circle passing by two points of restrictions
//=======================================================================
Standard_Boolean BRepBlend_RstRstConstRad::CenterCircleRst1Rst2(const gp_Pnt& PtRst1,
const gp_Pnt& PtRst2,
{
gp_Vec rst1rst2(PtRst1, PtRst2);
- gp_Vec vdmedNor; //,NRst1; vdmedNor vecteur directeur de la Mediatrice
+ gp_Vec vdmedNor; //,NRst1; vdmedNor directong vector of the perpendicular bisector
Standard_Real norm2;
- Standard_Real Dist;// distance entre le milieu de PtRst1,PtRst2 et Center
+ Standard_Real Dist;// distance between the middle of PtRst1,PtRst2 and Center
- // Calcul du centre du cercle
+ // Calculate the center of the circle
VdMed = rst1rst2.Crossed(np);
norm2 = rst1rst2.SquareMagnitude();
Dist = ray * ray - 0.25 * norm2;
Pdeb = 0; //ElCLib::Parameter(C, pts);
Pfin = ElCLib::Parameter(C, ptrst2);
- // Test des angles negatif et quasi null : Cas Singulier
+ // Test of angles negative and almost null : Special Case
if (Pfin > 1.5 * PI) {
np.Reverse();
C.SetPosition(gp_Ax2(Center, np, ns));
void BRepBlend_RstRstConstRad::GetMinimalWeight(TColStd_Array1OfReal& Weights) const
{
BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weights );
- // On suppose que cela ne depend pas du Rayon!
+ // It is supposed that it does not depend on the Radius!
}
//=======================================================================
//=======================================================================
//function : GetTolerance
-//purpose : Determine les Tolerance a utiliser dans les approximations.
+//purpose : Determine Tolerances to be used in approximations.
//=======================================================================
void BRepBlend_RstRstConstRad::GetTolerance(const Standard_Real BoundTol,
Poles2d(Poles2d.Lower()).SetCoord(pt2d1.X(),pt2d1.Y());
Poles2d(Poles2d.Upper()).SetCoord(pt2d2.X(),pt2d2.Y());
- // Cas Linear
+ // Linear case
if (mySShape == BlendFunc_Linear) {
Poles(low) = ptrst1;
Poles(upp) = ptrst2;
return;
}
- // Calcul du centre du cercle
+ // Calculate the center of the circle
Standard_Boolean IsCenter;
IsCenter = CenterCircleRst1Rst2(ptrst1, ptrst2, nplan, Center, NotUsed);
- // normales a la section aux points
+ // normals to the section with points
ns = gp_Vec(Center, ptrst1).Normalized();
ns2 = gp_Vec(Center, ptrst2).Normalized();
n2.Normalize();
if (!istgt) {
- // secmember contient les derivees des parametres sur les courbes
- // par rapport a t
+ // secmember contains derivatives of parameters on curves
+ // compared to t
tgrst1 = secmember(1) * d11;
tgrst2 = secmember(2) * d21;
if (Dist > 1.E-07) {
gp_Vec d1P1P2CrosNp, dmed;
d1P1P2CrosNp = d1rst1rst2.Crossed(nplan) + rst1rst2.Crossed(dnplan);
- // derivee de la mediatrice
+ // derivative of the perpendicular bisector
dmed = d1P1P2CrosNp - med.Dot(d1P1P2CrosNp) * med;
dmed /= normmed;
Dist = sqrt(Dist);
dmed.Reverse();
}
- // on met dans dmed la derivee du coefficient Dist
+ // the derivative of coefficient Dist is located in dmed
dmed.SetLinearForm(Dist, dmed, d1Dist, med);
d1rst1rst2 *= 0.5;
- // derivee de la Normale a la courbe en P1
+ // derivative of the Normal to the curve in P1
d1n1 = - (dmed + d1rst1rst2) / ray;
- // derivee de la Normale a la courbe en P2
+ // derivative of the Normal to the curve in P2
d1n2 = (d1rst1rst2 - dmed) / ray;
}
else {
d1rst1rst2 *= 0.5;
- // Normale a la courbe en P1
+ // Normal to the curve in P1
d1n1 = - d1rst1rst2 / ray;
- // Normale a la courbe en P2
+ // Normal to the curve in P2
d1n2 = d1rst1rst2 / ray;
}
}
- // Les poles 2d
+ // Tops 2d
Poles2d(Poles2d.Lower()).SetCoord(pt2drst1.X(), pt2drst1.Y());
Poles2d(Poles2d.Upper()).SetCoord(pt2drst2.X(), pt2drst2.Y());
DPoles2d(Poles2d.Upper()).SetCoord(a, b);
}
- // Cas Linear
+ // Linear case
if (mySShape == BlendFunc_Linear) {
Poles(low) = ptrst1;
Poles(upp) = ptrst2;
return (!istgt);
}
- // Cas du cercle
- // tangente au centre du cercle
+ // Case of the circle
+ // tangent to the center of the circle
if (!istgt) {
tgct.SetLinearForm(-ray, d1n1, tgrst1);
}
{
Standard_Integer ind1=1, ind2=1;
Standard_Real Epspar = Precision::PConfusion()*0.99;
- // en suposant que le positionement fonctionne a PConfusion()/2
+ // supposed that the positioning works with PConfusion()/2
Standard_Real v1, v2;
-// Initialisations : les IND1 et IND2 pointent sur le 1er element
-// de chacune des 2 tables a traiter.INDS pointe sur le dernier
-// element cree de TABSOR
+// Initialisations : IND1 and IND2 point the 1st element
+// of each of 2 tables to be processed. INDS points at the last
+// created element of TABSOR
-//--- On remplit TABSOR en parcourant TABLE1 et TABLE2 simultanement ---
-//------------------ en eliminant les occurrences multiples ------------
+//--- TABSOR is filled by parsing TABLE1 and TABLE2 simultaneously ---
+//------------------ and removing multiple occurrencies ------------
while ((ind1<=I1.Upper()) && (ind2<=I2.Upper())) {
v1 = I1(ind1);
v2 = I2(ind2);
if (Abs(v1-v2)<= Epspar) {
-// Ici les elements de I1 et I2 conviennent .
+// elements of I1 and I2 fit here
Seq.Append((v1+v2)/2);
ind1++;
ind2++;
}
else if (v1 < v2) {
- // Ici l' element de I1 convient.
+ // element of I1 fits here.
Seq.Append(v1);
ind1++;
}
else {
-// Ici l' element de TABLE2 convient.
+// element of TABLE2 fits here.
Seq.Append(v2);
ind2++;
}
}
if (ind1>I1.Upper()) {
-//----- Ici I1 est epuise, on complete avec la fin de TABLE2 -------
+//----- Here I1 is exhausted, completed using the end of TABLE2 -------
for (; ind2<=I2.Upper(); ind2++) {
Seq.Append(I2(ind2));
}
if (ind2>I2.Upper()) {
-//----- Ici I2 est epuise, on complete avec la fin de I1 -------
+//----- Here I2 is exhausted, completed using the end of I1 -------
for (; ind1<=I1.Upper(); ind1++) {
Seq.Append(I1(ind1));
if (Abs(valsol(1)) <= Tol &&
Abs(valsol(2)) <= Tol ) {
- // Calcul des tangentes
+ // Calculation of tangents
prmrst1 = Sol(1);
pt2drst1 = rst1->Value(prmrst1);
prmrst2 = Sol(2);
rstref1->Value(Sol(1)).Coord(u, v);
surfref1->D1(u, v,PtTmp1,d1u,d1v);
- // Normale a la surface de reference 1
+ // Normal to the reference surface 1
NRst1 = d1u.Crossed(d1v);
rstref2->Value(Sol(2)).Coord(u, v);
surfref2->D1(u, v, PtTmp2, d1u, d1v);
- // Normale a la surface de reference 2
+ // Normal to the reference surface 2
NRst2 = d1u.Crossed(d1v);
Standard_Boolean IsCenter;
TgRst2.Reverse();
}
- // On retourne les vecteurs
+ // Vectors are returned
if (NRst1InPlane.Dot(TgRst1) > -1.e-10) {
if (NRst2InPlane.Dot(TgRst2) < 1.e-10) {
return Blend_DecrochBoth;
//=======================================================================
//function : CenterCircleRst1Rst2
-//purpose : Calculer le centre du cercle passant par les deux points des restrictions
+//purpose : Calculate the center of circle passing by two points of restrictions
//=======================================================================
Standard_Boolean BRepBlend_RstRstEvolRad::CenterCircleRst1Rst2(const gp_Pnt& PtRst1,
const gp_Pnt& PtRst2,
{
gp_Vec rst1rst2(PtRst1, PtRst2);
- gp_Vec vdmedNor; //,NRst1; vdmedNor vecteur directeur de la Mediatrice
+ gp_Vec vdmedNor; //,NRst1; vdmedNor vector director of the perpendicular bisector
Standard_Real norm2;
- Standard_Real Dist;// distance entre le milieu de PtRst1,PtRst2 et Center
+ Standard_Real Dist;// distance between the middle of PtRst1,PtRst2 and Center
- // Calcul du centre du cercle
+ // Calculate the center of the circle
VdMed = rst1rst2.Crossed(np);
norm2 = rst1rst2.SquareMagnitude();
Dist = ray * ray - 0.25 * norm2;
Pdeb = 0; //ElCLib::Parameter(C, pts);
Pfin = ElCLib::Parameter(C, ptrst2);
- // Test des angles negatif et quasi null : Cas Singulier
+ // Test negative and quasi null angles: Special case
if (Pfin > 1.5 * PI) {
np.Reverse();
C.SetPosition(gp_Ax2(Center, np, ns));
void BRepBlend_RstRstEvolRad::GetMinimalWeight(TColStd_Array1OfReal& Weights) const
{
BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weights );
- // On suppose que cela ne depend pas du Rayon!
+ // It is supposed that it does not depend on the Radius!
}
//=======================================================================
//=======================================================================
//function : GetTolerance
-//purpose : Determine les Tolerance a utiliser dans les approximations.
+//purpose : Determine the Tolerance to be used in approximations.
//=======================================================================
void BRepBlend_RstRstEvolRad::GetTolerance(const Standard_Real BoundTol,
Poles2d(Poles2d.Lower()).SetCoord(pt2d1.X(),pt2d1.Y());
Poles2d(Poles2d.Upper()).SetCoord(pt2d2.X(),pt2d2.Y());
- // Cas Linear
+ // Linear Case
if (mySShape == BlendFunc_Linear) {
Poles(low) = ptrst1;
Poles(upp) = ptrst2;
return;
}
- // Calcul du centre du cercle
+ // Calculate the center of the circle
Standard_Boolean IsCenter;
IsCenter = CenterCircleRst1Rst2(ptrst1, ptrst2, nplan, Center, NotUsed);
- // normales a la section aux points
+ // normals to the section with points
n1 = gp_Vec(Center, ptrst1).Normalized();
n2 = gp_Vec(Center, ptrst2).Normalized();
gp_Vec n1(Center, ptrst1), n2(Center, ptrst2);
if (!istgt) {
- // secmember contient les derivees des parametres sur les courbes
- // par rapport a t
+ // secmember contains derivatives of parameters on curves
+ // corresponding to t
tgrst1 = secmember(1) * d11;
tgrst2 = secmember(2) * d21;
if (Dist > 1.E-07) {
gp_Vec d1P1P2CrosNp, dmed;
d1P1P2CrosNp = d1rst1rst2.Crossed(nplan) + rst1rst2.Crossed(dnplan);
- // derivee de la mediatrice
+ // derivative of the bisector
dmed = d1P1P2CrosNp - med.Dot(d1P1P2CrosNp) * med;
dmed /= normmed;
Dist = sqrt(Dist);
dmed.Reverse();
}
- // on met dans dmed la derivee du coefficient Dist
+ // derivative of the coefficient Dist is located in dmed
dmed.SetLinearForm(Dist, dmed, d1Dist, med);
d1rst1rst2 *= 0.5;
- // derivee de la Normale a la courbe en P1
+ // derivative of the Normal to the curve in P1
d1n1 = - (d1rst1rst2 + dmed + Invdray * n1) / ray;
- // derivee de la Normale a la courbe en P2
+ // derivative of the Normal to the curve in P2
d1n2 = (d1rst1rst2 - dmed - Invdray * n2) / ray;
}
else {
n1.Normalize();
n2.Normalize();
- // Les poles 2d
+ // Tops 2D
Poles2d(Poles2d.Lower()).SetCoord(pt2drst1.X(), pt2drst1.Y());
Poles2d(Poles2d.Upper()).SetCoord(pt2drst2.X(), pt2drst2.Y());
DPoles2d(Poles2d.Upper()).SetCoord(a, b);
}
- // Cas Linear
+ // Linear Case
if (mySShape == BlendFunc_Linear) {
Poles(low) = ptrst1;
Poles(upp) = ptrst2;
return (!istgt);
}
- // Cas du cercle
- // tangente au centre du cercle
+ // Case of the circle
+ // tangent to the center of the circle
if (!istgt) {
tgct.SetLinearForm(-ray, d1n1, -dray, n1, tgrst1);
}
extern Standard_Boolean Blend_GettraceDRAWSECT();
//-----------------------------------------------------
-// Pour debug : visualisation de la section
+// For debug : visualisation of the section
static Standard_Boolean BBPP(const Standard_Real param,
Blend_RstRstFunction& Func,
const math_Vector& sol,
Standard_Real scal = 1./ (param1 - param2);
cout<<endl;
- cout<<"controle des derivees au point : "<<param1<<endl;
+ cout<<"control of derivatives at point : "<<param1<<endl;
for(i = 1; i <= hp; i++){
cout<<endl;
cout<<"point : "<<i<<endl;
- cout<<"dx calcule : "<<TDP1(i).X()<<endl;
- cout<<"dx estime : "<<scal*(TP1(i).X()-TP2(i).X())<<endl;
- cout<<"dy calcule : "<<TDP1(i).Y()<<endl;
- cout<<"dy estime : "<<scal*(TP1(i).Y()-TP2(i).Y())<<endl;
- cout<<"dz calcule : "<<TDP1(i).Z()<<endl;
- cout<<"dz estime : "<<scal*(TP1(i).Z()-TP2(i).Z())<<endl;
- cout<<"dw calcule : "<<TDW1(i)<<endl;
- cout<<"dw estime : "<<scal*(TW1(i)-TW2(i))<<endl;
+ cout<<"dx calculated : "<<TDP1(i).X()<<endl;
+ cout<<"dx estimated : "<<scal*(TP1(i).X()-TP2(i).X())<<endl;
+ cout<<"dy calculated : "<<TDP1(i).Y()<<endl;
+ cout<<"dy estimated : "<<scal*(TP1(i).Y()-TP2(i).Y())<<endl;
+ cout<<"dz calculated : "<<TDP1(i).Z()<<endl;
+ cout<<"dz estimated : "<<scal*(TP1(i).Z()-TP2(i).Z())<<endl;
+ cout<<"dw calculated : "<<TDW1(i)<<endl;
+ cout<<"dw estimated : "<<scal*(TW1(i)-TW2(i))<<endl;
}
for(i = 1; i <= hp2d; i++){
cout<<endl;
cout<<"point 2d : "<<i<<endl;
- cout<<"dx calcule : "<<TDP2d1(i).X()<<endl;
- cout<<"dx estime : "<<scal*(TP2d1(i).X()-TP2d2(i).X())<<endl;
- cout<<"dy calcule : "<<TDP2d1(i).Y()<<endl;
- cout<<"dy estime : "<<scal*(TP2d1(i).Y()-TP2d2(i).Y())<<endl;
+ cout<<"dx calculated : "<<TDP2d1(i).X()<<endl;
+ cout<<"dx estimated : "<<scal*(TP2d1(i).X()-TP2d2(i).X())<<endl;
+ cout<<"dy calculated : "<<TDP2d1(i).Y()<<endl;
+ cout<<"dy estimated : "<<scal*(TP2d1(i).Y()-TP2d2(i).Y())<<endl;
}
}
//=======================================================================
//function : Perform
-//purpose : lance le processus de cheminement
+//purpose : launch the processing
//=======================================================================
void BRepBlend_RstRstLineBuilder::Perform(Blend_RstRstFunction& Func,
Drawsect(param, Func);
}
#endif
- // Mettre a jour la ligne.
+ // Update the line.
line->Append(previousP);
Standard_Real U, V;
U = previousP.ParameterOnC1();
//=======================================================================
//function : PerformFirstSection
-//purpose : Creation de la premiere section
+//purpose : Creation of the first section
//=======================================================================
Standard_Boolean BRepBlend_RstRstLineBuilder::PerformFirstSection
if (!recadrst1 && !recadp1 && !recadrst2 && !recadp2) return Standard_False;
- // on regarde si on a decroche ou sorti du domaine 1
+ // it is checked if the contact was lost or domain 1 was left
if (recadp1 && recadrst1) {
- if (sens * (wrst1 - wp1) > tolgui){ //on sort du domaine d abord
+ if (sens * (wrst1 - wp1) > tolgui){ //at first one leaves the domain
wrst1 = wp1;
trst12 = solinvp1(2);
trst11 = BRepBlend_BlendTool::Parameter(Vtxp1, rst1);
Vtxrst2 = Vtxp1;
recadrst1 = Standard_False;
}
- else { // on a decroche
+ else { // the contact is lost
trst11 = solinvrst1(3);
trst12 = solinvrst1(2);
recadp1 = Standard_False;
trst12 = solinvrst1(2);
}
- // on regarde si on a decrocher ou sortie du domaine 2
+ // it is checked if the contact was lost or domain 2 was left
if (recadp2 && recadrst2) {
- if (sens * (wrst2 - wp2) > tolgui) { //on sort du domaine d abord
+ if (sens * (wrst2 - wp2) > tolgui) { //at first one leaves the domain
wrst2 = wp2;
trst21 = solinvp2(2);
trst22 = BRepBlend_BlendTool::Parameter(Vtxp2, rst2);
trst21 = solinvrst2(2);
}
- // on regarde sur laquelle des courbes on decroche en premier
+ // it is checked on which curve the contact is lost earlier
if (recadrst1 && recadrst2) {
if (Abs(wrst1 - wrst2) < tolgui) {
State = Blend_OnRst12;
sol(2) = trst22;
}
else if (sens * (wrst1 - wrst2) < 0) {
- // on decroche sur Rst1
+ // contact lost on Rst1
State = Blend_OnRst1;
param = wrst1;
sol(1) = trst11;
sol(2) = trst12;
}
else {
- // on decroche sur rst2
+ // contact lost on rst2
State = Blend_OnRst2;
param = wrst2;
sol(1) = trst21;
Func.Set(param);
}
else if (recadrst1) {
- // sol sur rst1
+ // ground on rst1
State = Blend_OnRst1;
param = wrst1;
sol(1) = trst11;
Func.Set(param);
}
else if (recadrst2) {
- // sol sur rst2
+ // ground on rst2
State = Blend_OnRst2;
param = wrst2;
sol(1) = trst21;
sol(2) = trst22;
Func.Set(param);
}
- // on regarde sur laquelle des courbes on sort en premier
+ // it is checked on which curves one leaves first
else if (recadp1 && recadp2) {
if (Abs(wrst1 - wrst2) < tolgui) {
State = Blend_OnRst12;
sol(2) = trst22;
}
else if (sens * (wrst1 - wrst2) < 0) {
- // sol sur Rst1
+ // sol on Rst1
State = Blend_OnRst1;
param = wrst1;
sol(1) = trst11;
sol(2) = trst12;
}
else {
- // sol sur rst2
+ // ground on rst2
State = Blend_OnRst2;
param = wrst2;
sol(1) = trst21;
Func.Set(param);
}
else if (recadp1) {
- // sol sur rst1
+ // ground on rst1
State = Blend_OnRst1;
param = wrst1;
sol(1) = trst11;
Func.Set(param);
}
else if (recadp2) {
- // sol sur rst2
+ // ground on rst2
State = Blend_OnRst2;
param = wrst2;
sol(1) = trst21;
//=======================================================================
//function : InternalPerform
-//purpose : algorithme de cheminement sauf aux extremites
+//purpose : algorithm of processing without extremities
//=======================================================================
void BRepBlend_RstRstLineBuilder::InternalPerform(Blend_RstRstFunction& Func,
{
Standard_Real stepw = pasmax;
Standard_Integer nbp = line->NbPoints();
- if(nbp >= 2){ //On reprend le dernier step s il n est pas trop petit.
+ if(nbp >= 2){ //The last step is redone if it is not too small.
if(sens < 0.){
stepw = (line->Point(2).Parameter() - line->Point(1).Parameter());
}
recadp1 = recadp2 = recadrst1 = recadrst2 = Standard_False;
echecrecad = Standard_False;
if (situonc1 != TopAbs_IN) {
- // pb inverse rst/rst
+ // pb inversion rst/rst
recadp1 = Recadre1(FinvP1, solinvp1, IsVtxp1, Vtxp1);
if (recadp1) {
wp1 = solinvp1(1);
}
if (situonc2 != TopAbs_IN) {
- // pb inverse point/surf
+ // pb inversion point/surf
recadp2 = Recadre2(FinvP2, solinvp2, IsVtxp2, Vtxp2);
if (recadp2) {
wp2 = solinvp2(1);
}
if (decroch == Blend_DecrochRst1 || decroch == Blend_DecrochBoth) {
- // pb inverse rst1/surf1
+ // pb inversion rst1/surf1
recadrst1 = Recadre1(Func, Finv1, solinvrst1, IsVtxrst1, Vtxrst1);
if (recadrst1) {
wrst1 = solinvrst1(1);
if (recadp1 || recadp2 || recadrst1 || recadrst2) echecrecad = Standard_False;
if (!echecrecad) {
- // on regarde si on a decroche ou sorti du domaine 1
+ // it is checked if the contact was lost or domain 1 was left
if (recadp1 && recadrst1) {
- if (sens * (wrst1 - wp1) > tolgui){ //on sort du domaine d abord
+ if (sens * (wrst1 - wp1) > tolgui){ //first one leaves the domain
wrst1 = wp1;
trst12 = solinvp1(2);
trst11 = BRepBlend_BlendTool::Parameter(Vtxp1, rst1);
Vtxrst2 = Vtxp1;
recadrst1 = Standard_False;
}
- else { // on a decroche
+ else { // contact is lost
trst11 = solinvrst1(3);
trst12 = solinvrst1(2);
recadp1 = Standard_False;
trst12 = solinvrst1(2);
}
- // on regarde si on a decrocher ou sortie du domaine 2
+ // it is checked if the contact was lost or domain 2 was left
if (recadp2 && recadrst2) {
- if (sens * (wrst2 - wp2) > tolgui) { //on sort du domaine d abord
+ if (sens * (wrst2 - wp2) > tolgui) { //first one leaves the domain
wrst2 = wp2;
trst21 = solinvp2(2);
trst22 = BRepBlend_BlendTool::Parameter(Vtxp2, rst2);
trst21 = solinvrst2(2);
}
- // on regarde sur laquelle des courbes on decroche en premier
+ // it is checked on which curve the contact is lost earlier
if (recadrst1 && recadrst2) {
if (Abs(wrst1 - wrst2) < tolgui) {
State = Blend_OnRst12;
sol(2) = trst22;
}
else if (sens * (wrst1 - wrst2) < 0) {
- // on decroche sur Rst1
+ // contact is lost on Rst1
State = Blend_OnRst1;
decroch = Blend_DecrochRst1;
param = wrst1;
sol(2) = trst12;
}
else {
- // on decroche sur rst2
+ // contact is lost on rst2
State = Blend_OnRst2;
decroch = Blend_DecrochRst2;
param = wrst2;
Func.Set(param);
}
else if (recadrst1) {
- // sol sur rst1
+ // ground on rst1
State = Blend_OnRst1;
decroch = Blend_DecrochRst1;
param = wrst1;
Func.Set(param);
}
else if (recadrst2) {
- // sol sur rst2
+ // ground on rst2
State = Blend_OnRst2;
decroch = Blend_DecrochRst2;
param = wrst2;
sol(2) = trst22;
Func.Set(param);
}
- // on regarde sur laquelle des courbes on sort en premier
+ // it is checked on which curve the contact is lost earlier
else if (recadp1 && recadp2) {
if (Abs(wrst1 - wrst2) < tolgui) {
State = Blend_OnRst12;
sol(2) = trst22;
}
else if (sens * (wrst1 - wrst2) < 0) {
- // sol sur Rst1
+ // ground on Rst1
State = Blend_OnRst1;
param = wrst1;
sol(1) = trst11;
sol(2) = trst12;
}
else {
- // sol sur rst2
+ // ground on rst2
State = Blend_OnRst2;
param = wrst2;
sol(1) = trst21;
Func.Set(param);
}
else if (recadp1) {
- // sol sur rst1
+ // ground on rst1
State = Blend_OnRst1;
param = wrst1;
sol(1) = trst11;
Func.Set(param);
}
else if (recadp2) {
- // sol sur rst2
+ // ground on rst2
State = Blend_OnRst2;
param = wrst2;
sol(1) = trst21;
State = TestArret(Func, Standard_True, State);
}
else{
- // echec recadrage. On sort avec PointsConfondus
- cout<<"echec recadrage"<<endl;
+ // reframing failed. Leave with PointsConfondus
+ cout<<"reframing failed"<<endl;
State = Blend_SamePoints;
}
}
Drawsect(param, Func);
}
#endif
- // Mettre a jour la ligne.
+ // Update the line.
if (sens > 0.) {
line->Append(previousP);
}
previousP.ParameterOnC1(),
previousP.Parameter(), tolesp);
MakeExtremity(Extrst2, Standard_False, rst2, sol(2), IsVtxrst2, Vtxrst2);
- // Indiquer que fin sur Bound.
+ // Show that end is on Bound.
}
else {
param = param + sens * stepw;
previousP.Parameter(), tolesp);
Arrive = Standard_True;
if (line->NbPoints()>=2) {
- // Indiquer qu on s arrete en cours de cheminement
- cout<<"On n avance plus dans le cheminement"<<endl;
+ // Show that there is a stop during processing
+ cout<<"No more advancement in the processing"<<endl;
}
}
else {
- param = parprec + sens * stepw; // on ne risque pas de depasser Bound.
+ param = parprec + sens * stepw; // there is no risk to exceed Bound.
}
}
break;
Drawsect(param,Func);
}
#endif
- // Mettre a jour la ligne.
+ // Update the line.
if (sens > 0.) {
line->Append(previousP);
}
previousP.ParameterOnC1(),
previousP.Parameter(), tolesp);
MakeExtremity(Extrst2, Standard_False, rst2, sol(2), IsVtxrst2, Vtxrst2);
- // Indiquer que fin sur Bound.
+ // Indicate that end is on Bound.
}
else {
param = param + sens * stepw;
case Blend_SamePoints :
{
- // On arrete
- cout << " Points confondus dans le cheminement" << endl;
+ // Stop
+ cout << " Mixed points in the processing" << endl;
Extrst1.SetValue(previousP.PointOnC1(),
previousP.ParameterOnC1(),
previousP.Parameter(), tolesp);
//=======================================================================
//function : Recadre1
-//purpose : On a decroche en 1
+//purpose : Contact lost on 1
//=======================================================================
Standard_Boolean BRepBlend_RstRstLineBuilder::Recadre1(Blend_RstRstFunction& Func,
Solinv(2) = sol(2);
Solinv(3) = sol(1);
- // On recherche le point de non decrochement
+ // The point where contact is not lost is found
math_FunctionSetRoot rsnld(Finv, toler, 30);
rsnld.Perform(Finv, Solinv, infb, supb);
if (!rsnld.IsDone()) {
rsnld.Root(Solinv);
- // On doit verifier la valeur de la fonction est bien
- // sur la seconde restriction
+ // It is necessary to check if the function value meets the
+ // second restriction
if (Finv.IsSolution(Solinv, tolesp)) {
Standard_Real w = Solinv(2);
if(w < rst2->FirstParameter() - toler(2)||
return Standard_False;
}
- // on regarde si on n est pas sur un Vertex
+ // it is checked if it is on a Vertex
domain1->Initialize(rst1);
domain1->InitVertexIterator();
IsVtx = !domain1->MoreVertex();
if (!domain1->MoreVertex()) {
IsVtx = Standard_False;
}
- // On recalcule la section par resolution directe, sinon, on se recupere
- // des incoherences entre le parametre et sol dues au baillement.
+ // The section is recalculated by direct solution, otherwise return
+ // incoherences between the parameter and the ground caused by yawn.
math_Vector infbound(1, 2), supbound(1, 2);
math_Vector parinit(1, 2), tolerance(1, 2);
//=======================================================================
//function : Recadre2
-//purpose : On a decroche sur Rst2
+//purpose : Contact lost on Rst2
//=======================================================================
Standard_Boolean BRepBlend_RstRstLineBuilder::Recadre2(Blend_RstRstFunction& Func,
rsnld.Root(Solinv);
- // On doit verifier la valeur de la fonction
+ // It is necessary to check the value of the function
if (Finv.IsSolution(Solinv, tolesp)) {
Standard_Real w = Solinv(2);
if(w < rst1->FirstParameter() - toler(2)||
if (!domain2->MoreVertex()) {
IsVtx = Standard_False;
}
- // On recalcule la section par resolution directe, sinon, on se recupere
- // des incoherences entre le parametre et sol dues au baillement.
-
+ // The section is recalculated by direct solution, otherwise return
+ // incoherences between the parameter and the ground caused by yawn.
+
math_Vector infbound(1, 2), supbound(1, 2);
math_Vector parinit(1,2), tolerance(1,2);
Func.GetTolerance(tolerance, tolesp);
//=======================================================================
//function : Recadre
-//purpose : On est en fin de la courbe rst1
+//purpose : This is the end of curve rst1
//=======================================================================
Standard_Boolean BRepBlend_RstRstLineBuilder::Recadre1(Blend_CurvPointFuncInv& FinvP,
Standard_Boolean& IsVtx,
Handle(Adaptor3d_HVertex)& Vtx)
{
- // On se place sur le dernier ou le premier point, suivant le
- // sens de cheminement.
+ // One is located on the last or the first point, following the
+ // direction of processing.
gp_Pnt2d p2drst1;
Standard_Real firstrst1 = rst1->FirstParameter();
Standard_Real lastrst1 = rst1->LastParameter();
//=======================================================================
//function : Recadre2
-//purpose : On est en fin de la courbe rst2
+//purpose : This is the end of curve rst2
//=======================================================================
Standard_Boolean BRepBlend_RstRstLineBuilder::Recadre2(Blend_CurvPointFuncInv& FinvP,
Standard_Boolean& IsVtx,
Handle(Adaptor3d_HVertex)& Vtx)
{
- // On se place sur le dernier ou le premier point, suivant le
- // sens de cheminement.
+ // One is located on the last or the first point, following the
+ // direction of processing.
gp_Pnt2d p2drst2;
Standard_Real firstrst2 = rst2->FirstParameter();
Standard_Real lastrst2 = rst2->LastParameter();
//=======================================================================
//function : MakeExtremity
-//purpose : fabrique l extremite d une courbe
+//purpose : produce the extremity of a curve
//=======================================================================
void BRepBlend_RstRstLineBuilder::MakeExtremity(BRepBlend_Extremity& Extrem,
Blend_Status BRepBlend_RstRstLineBuilder::CheckDeflectionOnRst1(const Blend_Point& CurPoint)
{
- //Controles 3d du Blend_CSWalking.
+ //Controls 3d of Blend_CSWalking.
- // regle par tests dans U4 correspond a 11.478 d
+ // rule by tests in U4 corresponds to 11.478
const Standard_Real CosRef3D = 0.98;
Standard_Real Cosi, Cosi2;
Standard_Boolean curpointistangent = CurPoint.IsTangencyPoint();
if (!prevpointistangent) prevNorme = prevTg.SquareMagnitude();
if (Norme <= tolesp * tolesp) {
- // il faudra peut etre forcer meme point
+ // it can be necessary to force the same point
return Blend_SamePoints;
}
if(!prevpointistangent){
return Blend_SamePoints;
}
Cosi = sens * Corde * prevTg;
- if (Cosi < 0.) { // angle 3d>pi/2. --> retour arriere
+ if (Cosi < 0.) { // angle 3d>pi/2. --> return back
return Blend_Backward;
}
}
if(!curpointistangent){
- // Voir s il faut faire le controle sur le signe de prevtg*Tgsurf
+ // Check if it is necessary to control the sign of prevtg*Tgsurf
Cosi = sens * Corde * Tgsurf;
Cosi2 = Cosi * Cosi / Tgsurf.SquareMagnitude() / Norme;
if (Cosi2 < CosRef3D || Cosi < 0.) {
}
if (!curpointistangent && !prevpointistangent) {
- // Estimation de la fleche courante
+ // Estimation of the current arrow
Standard_Real FlecheCourante =
(prevTg.Normalized().XYZ() - Tgsurf.Normalized().XYZ()).SquareModulus() * Norme / 64.;
return Blend_StepTooSmall;
}
if (FlecheCourante > fleche * fleche) {
- // pas trop grand : commentaire interessant
+ // not too great
return Blend_StepTooLarge;
}
}
Blend_Status BRepBlend_RstRstLineBuilder::CheckDeflectionOnRst2(const Blend_Point& CurPoint)
{
- //Controles 3d du Blend_CSWalking.
+ //3D Controls of Blend_CSWalking.
- // regle par tests dans U4 correspond a 11.478 d
+ // rule by tests in U4 corresponding to 11.478 d
const Standard_Real CosRef3D = 0.98;
Standard_Real Cosi, Cosi2;
Standard_Boolean curpointistangent = CurPoint.IsTangencyPoint();
if (!prevpointistangent) prevNorme = prevTg.SquareMagnitude();
if (Norme <= tolesp * tolesp){
- // il faudra peut etre forcer meme point
+ // it can be necessary to force the same point
return Blend_SamePoints;
}
if (!prevpointistangent) {
return Blend_SamePoints;
}
Cosi = sens * Corde * prevTg;
- if (Cosi < 0.) { // angle 3d>pi/2. --> retour arriere
+ if (Cosi < 0.) { // angle 3d>pi/2. --> return back
return Blend_Backward;
}
}
if (!curpointistangent) {
- // Voir s il faut faire le controle sur le signe de prevtg*Tgsurf
+ // Check if it is necessary to control the sign of prevtg*Tgsurf
Cosi = sens * Corde * Tgsurf;
Cosi2 = Cosi * Cosi / Tgsurf.SquareMagnitude() / Norme;
if (Cosi2 < CosRef3D || Cosi < 0.) {
}
if(!curpointistangent && !prevpointistangent){
- // Estimation de la fleche courante
+ // Estimation of the current arrow
Standard_Real FlecheCourante =
(prevTg.Normalized().XYZ() - Tgsurf.Normalized().XYZ()).SquareModulus() * Norme/64.;
return Blend_StepTooSmall;
}
if (FlecheCourante > fleche * fleche) {
- // pas trop grand : commentaire interessant
+ // not too great
return Blend_StepTooLarge;
}
}
math_Vector tolerance(1, 2);
Func.GetTolerance(tolerance, tolesp);
- //cote pcurve 1.
+ //face pcurve 1.
Standard_Real v = sol(1);
if(v < rst1->FirstParameter() - tolerance(2)||
v > rst1->LastParameter() + tolerance(2)){
}
else SituOnC1 = TopAbs_ON;
- //cote pcurve 2.
+ //face pcurve 2.
v = sol(2);
if(v < rst2->FirstParameter() - tolerance(2)||
v > rst2->LastParameter() + tolerance(2)){
else SituOnC2 = TopAbs_ON;
- //decrochage
+ //lost contact
gp_Vec tgrst1, norst1, tgrst2, norst2;
Decroch = Func.Decroch(sol,tgrst1, norst1, tgrst2, norst2);
vref.Divide(norm);
vref.SetLinearForm(ray,vref,gp_Vec(ptrst,pts));
- // Derivee par rapport a u1
+ // Derivative by u1
temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
D(3,1) = D(3,1) * 2.;
- // Derivee par rapport a v1
+ // Derivative by v1
temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
temp = vref/ray;
// F(3) = vref.SquareMagnitude() - ray*ray;
- F(3) = (temp.SquareMagnitude() - 1)*ray*ray; // plus stable numeriquement
+ F(3) = (temp.SquareMagnitude() - 1)*ray*ray; // more stable numerically
- // Derivee par rapport a u1
+ // Derivative by u1
temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
- // Derivee par rapport a v1
+ // Derivative by v1
temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
Abs(valsol(2)) <= Tol &&
Abs(valsol(3)) <= 2*Tol*Abs(ray) ) {
- // Calcul des tangentes
+ // Calculation of tangents
pt2ds = gp_Pnt2d(Sol(1),Sol(2));
prmrst = Sol(3);
tg2drst.SetCoord(a,b);
}
- // mise a jour de maxang
+ // update of maxang
if(ray>0.) ns.Reverse();
ns2 = -resul.Normalized();
Cosa = ns.Dot(ns2);
Sina = nplan.Dot(ns.Crossed(ns2));
if (choix%2 != 0) {
- Sina = -Sina; //nplan est change en -nplan
+ Sina = -Sina; //nplan is changed to -nplan
}
Angle = ACos(Cosa);
Standard_Real dot, NT = NRstInPlane.Magnitude();
NT *= TgRst.Magnitude();
if (Abs(NT) < 1.e-7) {
- return Standard_False; // Singularite ou Incoherence.
+ return Standard_False; // Singularity or Incoherence.
}
dot = NRstInPlane.Dot(TgRst);
dot /= NT;
Pdeb = 0; //ElCLib::Parameter(C,pts);
Pfin = ElCLib::Parameter(C,ptrst);
- // Test des angles negatif et quasi null : Cas Singulier
+ // Test negative and almost null angles : Special case
if (Pfin>1.5*PI) {
np.Reverse();
C.SetPosition(gp_Ax2(Center,np,ns));
void BRepBlend_SurfRstConstRad::GetMinimalWeight(TColStd_Array1OfReal& Weights) const
{
BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weights );
- // On suppose que cela ne depend pas du Rayon!
+ // It is supposed that it does not depend on the Radius!
}
//=======================================================================
//=======================================================================
//function : GetTolerance
-//purpose : Determine les Tolerance a utiliser dans les approximations.
+//purpose : Find Tolerance to be used in approximations.
//=======================================================================
void BRepBlend_SurfRstConstRad::GetTolerance(const Standard_Real BoundTol,
nplan = d1gui.Normalized();
P.ParametersOnS(u1,v1);
- w = P.ParameterOnC(); //jlr : point sur courbe pas sur surface
+ w = P.ParameterOnC(); //jlr : point on curve not on surface
gp_Pnt2d pt2d = rst->Value(w);
surf->D1(u1,v1,pts,d1u1,d1v1);
Poles2d(Poles2d.Lower()).SetCoord(u1,v1);
Poles2d(Poles2d.Upper()).SetCoord(pt2d.X(),pt2d.Y());
- // Cas Linear
+ // Linear Case
if (mySShape == BlendFunc_Linear) {
Poles(low) = pts;
Poles(upp) = ptrst;
ndotns = nplan.Dot(ns);
norm = ncrossns.Magnitude();
if (norm < Eps) {
- norm = 1; // Insufisant, mais il ne faut pas planter
+ norm = 1; // Not enough, but it is not necessary to stop
#if DEB
- cout << " SurfRstConstRad : Surface singuliere " << endl;
+ cout << " SurfRstConstRad : Singular Surface " << endl;
#endif
}
- // Derivee de n1 par rapport a w
+ // Derivative of n1 corresponding to w
grosterme = ncrossns.Dot(dnplan.Crossed(ns))/norm/norm;
dnw.SetLinearForm((dnplan.Dot(ns)-grosterme*ndotns)/norm,nplan,
temp.SetLinearForm(ndotns/norm,nplan, -1./norm,ns);
resul.SetLinearForm(ray,temp,gp_Vec(ptrst,pts));
- secmember(3) = dnw.Dot(resul); // jag 950105 il manquait ray
- secmember(3) = -2.*ray*secmember(3); // jag 950105 il manquait ray
+ secmember(3) = dnw.Dot(resul);
+ secmember(3) = -2.*ray*secmember(3);
math_Gauss Resol(gradsol, 1.e-9);
tgs.SetLinearForm(secmember(1),d1u1,secmember(2),d1v1);
tgrst = secmember(3)*d1;
- // Derivee de n1 par rapport a u1
+ // Derivative of n1 corresponding to u1
temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resulu.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
grosterme/norm,ns,
-1./norm,temp);
- // Derivee de n1 par rapport a v1
+ // Derivative of n1 corresponding to v1
temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resulv.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
ns2 = -resul.Normalized();
}
- // Les poles 2d
+ // Tops 2D
Poles2d(Poles2d.Lower()).SetCoord(sol(1),sol(2));
Poles2d(Poles2d.Upper()).SetCoord(pt2drst.X(),pt2drst.Y());
DPoles2d(Poles2d.Upper()).SetCoord(a,b);
}
- // Cas Linear
+ // Linear Case
if (mySShape == BlendFunc_Linear) {
Poles(low) = pts;
Poles(upp) = ptrst;
return (!istgt);
}
- // Cas du cercle
+ // Case of the circle
Center.SetXYZ(pts.XYZ()+ray*ns.XYZ());
if (!istgt) {
tgct = tgs.Added(ray*dnw);
{
Standard_Integer ind1=1, ind2=1;
Standard_Real Epspar = Precision::PConfusion()*0.99;
- // en suposant que le positionement fonctionne a PConfusion()/2
+ // it is supposed that positioning works with PConfusion()/2
Standard_Real v1, v2;
-// Initialisations : les IND1 et IND2 pointent sur le 1er element
-// de chacune des 2 tables a traiter.INDS pointe sur le dernier
-// element cree de TABSOR
+// Initialisation : IND1 and IND2 point at the first element
+// of each of 2 tables to be processed. INDS points at the last
+// element created by TABSOR
-//--- On remplit TABSOR en parcourant TABLE1 et TABLE2 simultanement ---
-//------------------ en eliminant les occurrences multiples ------------
+//--- TABSOR is filled by parsing TABLE1 and TABLE2 simultaneously ---
+//------------------ and eliminating multiple occurrencies ------------
while ((ind1<=I1.Upper()) && (ind2<=I2.Upper())) {
v1 = I1(ind1);
v2 = I2(ind2);
if (Abs(v1-v2)<= Epspar) {
-// Ici les elements de I1 et I2 conviennent .
+// Here the elements of I1 and I2 fit.
Seq.Append((v1+v2)/2);
ind1++;
ind2++;
}
else if (v1 < v2) {
- // Ici l' element de I1 convient.
+ // Here the element of I1 fits.
Seq.Append(v1);
ind1++;
}
else {
-// Ici l' element de TABLE2 convient.
+// Here the element of TABLE2 fits.
Seq.Append(v2);
ind2++;
}
}
if (ind1>I1.Upper()) {
-//----- Ici I1 est epuise, on complete avec la fin de TABLE2 -------
+//----- Here I1 is exhausted, completed with the end of TABLE2 -------
for (; ind2<=I2.Upper(); ind2++) {
Seq.Append(I2(ind2));
}
if (ind2>I2.Upper()) {
-//----- Ici I2 est epuise, on complete avec la fin de I1 -------
+//----- Here I2 is exhausted, completed with the end of I1 -------
for (; ind1<=I1.Upper(); ind1++) {
Seq.Append(I1(ind1));
//=======================================================================
//function : BRepBlend_SurfRstEvolRad
-//purpose : Contructeur
+//purpose : Contructor
//=======================================================================
BRepBlend_SurfRstEvolRad::BRepBlend_SurfRstEvolRad
(const Handle(Adaptor3d_HSurface)& Surf,
vref.Divide(norm);
vref.SetLinearForm(ray,vref,gp_Vec(ptrst,pts));
- // Derivee par rapport a u1
+ // Derivative corresponding to u1
temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
D(3,1) = 2.*(resul.Dot(vref));
- // Derivee par rapport a v1
+ // Derivative corresponding to v1
temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
F(3) = vref.SquareMagnitude() - ray*ray;
- // Derivee par rapport a u1
+ // Derivative corresponding to u1
temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
D(3,1) = 2.*(resul.Dot(vref));
- // Derivee par rapport a v1
+ // Derivative corresponding to v1
temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resul.SetLinearForm(-ray/norm*(grosterme*ndotns-nplan.Dot(temp)),nplan,
//=======================================================================
//function :
-//purpose : Segmente la courbe a sa partie utile.
-// La precision est prise arbitrairement petite !?
+//purpose : Segments the curve in its useful part.
+// Precision is taken arbitrary small !?
//=======================================================================
void BRepBlend_SurfRstEvolRad::Set
(const Standard_Real First,
Abs(valsol(2)) <= Tol &&
Abs(valsol(3)) <= 2*Tol*Abs(ray) ) {
- // Calcul des tangentes
+ // Calculation of tangents
pt2ds = gp_Pnt2d(Sol(1),Sol(2));
prmrst = Sol(3);
else {
istangent = Standard_True;
}
- // mise a jour de maxang
+ // update of maxang
if(ray>0.) ns.Reverse();
ns2 = -resul.Normalized();
Cosa = ns.Dot(ns2);
Sina = nplan.Dot(ns.Crossed(ns2));
if (choix%2 != 0) {
- Sina = -Sina; //nplan est change en -nplan
+ Sina = -Sina; //nplan is changed into -nplan
}
Angle = ACos(Cosa);
Standard_Real dot, NT = NRstInPlane.Magnitude();
NT *= TgRst.Magnitude();
if (Abs(NT) < 1.e-7) {
- return Standard_False; // Singularite ou Incoherence.
+ return Standard_False; // Singularity or Incoherence.
}
dot = NRstInPlane.Dot(TgRst);
dot /= NT;
Pdeb = 0.; //ElCLib::Parameter(C,pts);
Pfin = ElCLib::Parameter(C,ptrst);
- // Test des angles negatif et quasi null : Cas Singulier
+ // Test negative and almost null angles : Single Case
if (Pfin>1.5*PI) {
np.Reverse();
C.SetPosition(gp_Ax2(Center,np,ns));
void BRepBlend_SurfRstEvolRad::GetMinimalWeight(TColStd_Array1OfReal& Weigths) const
{
BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weigths );
- // On suppose que cela ne depend pas du Rayon!
+ // It is supposed that it does not depend on the Radius!
}
//=======================================================================
ndotns = nplan.Dot(ns);
norm = ncrossns.Magnitude();
if (norm < Eps) {
- norm = 1; // Insufisant, mais il ne faut pas planter
+ norm = 1; // Not enough, but it is not necessary to stop
#if DEB
- cout << " SurfRstEvolRad : Surface singuliere " << endl;
+ cout << " SurfRstEvolRad : Surface single " << endl;
#endif
}
- // Derivee de n1 par rapport a w
+ // Derivative of n1 corresponding to w
grosterme = ncrossns.Dot(dnplan.Crossed(ns))/norm/norm;
dnw.SetLinearForm((dnplan.Dot(ns)-grosterme*ndotns)/norm,nplan,
tgs.SetLinearForm(secmember(1),d1u1,secmember(2),d1v1);
tgrst = secmember(3)*d1;
- // Derivee de n1 par rapport a u1
+ // Derivative of n1 corresponding to u1
temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resulu.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
grosterme/norm,ns,
-1./norm,temp);
- // Derivee de n1 par rapport a v1
+ // Derivative of n1 corresponding to v1
temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
grosterme = ncrossns.Dot(nplan.Crossed(temp))/norm/norm;
resulv.SetLinearForm(-(grosterme*ndotns-nplan.Dot(temp))/norm,nplan,
istgt = Standard_True;
}
- // Les poles 2d
+ // Tops 2D
Poles2d(Poles2d.Lower()).SetCoord(sol(1),sol(2));
Poles2d(Poles2d.Upper()).SetCoord(pt2drst.X(),pt2drst.Y());
DPoles2d(Poles2d.Upper()).SetCoord(a,b);
}
- // Cas Linear
+ // Linear Case
if (mySShape == BlendFunc_Linear) {
Poles(low) = pts;
Poles(upp) = ptrst;
return (!istgt);
}
- // Cas du cercle
+ // Case of the circle
Center.SetXYZ(pts.XYZ()+ray*ns.XYZ());
if (!istgt) {
tgct.SetLinearForm(ray,dnw,dray,ns,tgs);
dnplan.Reverse();
}
if (!istgt) {
- if (ray < 0.) { // pour eviter la connerie Abs(dray) qques lignes plus bas
+ if (ray < 0.) { // to avoid Abs(dray) some lines below
rayprim = -dray;
}
else rayprim = dray;
nplan = d1gui.Normalized();
P.ParametersOnS(u1,v1);
- w = P.ParameterOnC(); //jlr : point sur courbe pas sur surface
+ w = P.ParameterOnC(); //jlr : point on curve not on surface
gp_Pnt2d pt2d = rst->Value(w);
surf->D1(u1,v1,pts,d1u1,d1v1);
Poles2d(Poles2d.Lower()).SetCoord(u1,v1);
Poles2d(Poles2d.Upper()).SetCoord(pt2d.X(),pt2d.Y());
- // Cas Linear
+ // Linear case
if (mySShape == BlendFunc_Linear) {
Poles(low) = pts;
Poles(upp) = ptrst;
#endif
static Standard_Integer IndexOfSection = 0;
extern Standard_Boolean Blend_GettraceDRAWSECT();
-// Pour debug : visualisation de la section
+// for debug : visualisation of the section
static Standard_Boolean BBPP(const Standard_Real param,
Blend_SurfRstFunction& Func,
const math_Vector& sol,
Standard_Real scal = 1./(param1-param2);
cout<<endl;
- cout<<"controle des derivees au point : "<<param1<<endl;
+ cout<<"control derivatives at point : "<<param1<<endl;
for(i = 1; i <= hp; i++){
cout<<endl;
cout<<"point : "<<i<<endl;
- cout<<"dx calcule : "<<TDP1(i).X()<<endl;
- cout<<"dx estime : "<<scal*(TP1(i).X()-TP2(i).X())<<endl;
- cout<<"dy calcule : "<<TDP1(i).Y()<<endl;
- cout<<"dy estime : "<<scal*(TP1(i).Y()-TP2(i).Y())<<endl;
- cout<<"dz calcule : "<<TDP1(i).Z()<<endl;
- cout<<"dz estime : "<<scal*(TP1(i).Z()-TP2(i).Z())<<endl;
- cout<<"dw calcule : "<<TDW1(i)<<endl;
- cout<<"dw estime : "<<scal*(TW1(i)-TW2(i))<<endl;
+ cout<<"dx calculated : "<<TDP1(i).X()<<endl;
+ cout<<"dx estimated : "<<scal*(TP1(i).X()-TP2(i).X())<<endl;
+ cout<<"dy calculated : "<<TDP1(i).Y()<<endl;
+ cout<<"dy estimated : "<<scal*(TP1(i).Y()-TP2(i).Y())<<endl;
+ cout<<"dz calculated : "<<TDP1(i).Z()<<endl;
+ cout<<"dz estimated : "<<scal*(TP1(i).Z()-TP2(i).Z())<<endl;
+ cout<<"dw calculated : "<<TDW1(i)<<endl;
+ cout<<"dw estimated : "<<scal*(TW1(i)-TW2(i))<<endl;
}
for(i = 1; i <= hp2d; i++){
cout<<endl;
cout<<"point 2d : "<<i<<endl;
- cout<<"dx calcule : "<<TDP2d1(i).X()<<endl;
- cout<<"dx estime : "<<scal*(TP2d1(i).X()-TP2d2(i).X())<<endl;
- cout<<"dy calcule : "<<TDP2d1(i).Y()<<endl;
- cout<<"dy estime : "<<scal*(TP2d1(i).Y()-TP2d2(i).Y())<<endl;
+ cout<<"dx calculated : "<<TDP2d1(i).X()<<endl;
+ cout<<"dx estimated : "<<scal*(TP2d1(i).X()-TP2d2(i).X())<<endl;
+ cout<<"dy calculated : "<<TDP2d1(i).Y()<<endl;
+ cout<<"dy estimated : "<<scal*(TP2d1(i).Y()-TP2d2(i).Y())<<endl;
}
}
//=======================================================================
//function : ArcToRecadre
-//purpose : Cherche un arc candidat
-// PrevIndex est utilise pour rejeter un arc deja teste
+//purpose : Find a suitable arc
+// PrevIndex is used to reject an already tested arc
//=======================================================================
Standard_Integer BRepBlend_SurfRstLineBuilder::
Drawsect(param,Func);
}
#endif
- // Mettre a jour la ligne.
+ // Update the line.
line->Append(previousP);
Standard_Real U,V;
previousP.ParametersOnS(U,V);
}
if (!recads && !recadp && !recadrst) return Standard_False;
if (recadp && recadrst) {
- if(sens*(wrst-wp) > tolgui){ //on sort du domaine d abord
+ if(sens*(wrst-wp) > tolgui){ //first one leaves the domain
wrst = wp;
U = solinvp(2);
V = solinvp(3);
sol(3) = solinvs(2);
}
else if(sens*(ws-wrst)<0){
- // sol sur surf
+ // ground on surf
State = Blend_OnRst1;
param = ws;
Arc->Value(solinvs(3)).Coord(U,V);
sol(3) = solinvs(2);
}
else{
- // sol sur rst
+ // ground on rst
State = Blend_OnRst2;
param = wrst;
sol(1) = U;
Func.Set(param);
}
else if(recads){
- // sol sur surf
+ // ground on surf
State = Blend_OnRst1;
param = ws;
Arc->Value(solinvs(3)).Coord(U,V);
Func.Set(param);
}
else if(recadrst){
- // sol sur rst
+ // ground on rst
State = Blend_OnRst2;
param = wrst;
sol(1) = U;
{
Standard_Real stepw = pasmax;
Standard_Integer nbp = line->NbPoints();
- if(nbp >= 2){ //On reprend le dernier step s il n est pas trop petit.
+ if(nbp >= 2){ //The last step is reproduced if it is not too small.
if(sens < 0.){
stepw = (line->Point(2).Parameter() - line->Point(1).Parameter());
}
recads = Recadre(FinvC,solinvs,Arc,IsVtxs,Vtxs);
if (recads) {
ws = solinvs(1);
- // Il faut reevaluer le decrochage (BUC60360)
+ // It is necessary to reevaluate the deviation (BUC60360)
gp_Vec t, n;
Func.Set(ws);
Arc->Value(solinvs(3)).Coord(U,V);
if(recadp || recads || recadrst) echecrecad = Standard_False;
if (!echecrecad) {
if (recadp && recadrst) {
- if(sens*(wrst-wp) > tolgui){ //on sort du domaine d abord
+ if(sens*(wrst-wp) > tolgui){ //first one leaves the domain
wrst = wp;
U = solinvp(2);
V = solinvp(3);
sol(3) = solinvs(3);
}
else if(sens*(ws-wrst)<0){
- // sol sur surf
+ // ground on surf
decroch = 0;
State = Blend_OnRst1;
param = ws;
sol(3) = solinvs(2);
}
else{
- // sol sur rst
+ // ground on rst
State = Blend_OnRst2;
param = wrst;
sol(1) = U;
Func.Set(param);
}
else if(recads){
- // sol sur surf
+ // ground on surf
State = Blend_OnRst1;
param = ws;
Arc->Value(solinvs(3)).Coord(U,V);
Func.Set(param);
}
else if(recadrst){
- // sol sur rst
+ // ground on rst
State = Blend_OnRst2;
param = wrst;
sol(1) = U;
State = TestArret(Func,Standard_True,State);
}
else{
- // echec recadrage. On sort avec PointsConfondus
+ // Failed reframing. Leave with PointsConfondus
#if DEB
- cout<<"SurfRstLineBuilder : echec recadrage"<<endl;
+ cout<<"SurfRstLineBuilder : failed reframing"<<endl;
#endif
State = Blend_SamePoints;
}
Drawsect(param,Func);
}
#endif
- // Mettre a jour la ligne.
+ // Update the line.
if (sens>0.) {
line->Append(previousP);
}
sol(1),sol(2),
previousP.Parameter(),tolesp);
MakeExtremity(Extrst,Standard_False,rst,sol(3),IsVtxrst,Vtxrst);
- // Indiquer que fin sur Bound.
+ // Indicate end on Bound.
}
else {
param = param + sens*stepw;
previousP.Parameter(),tolesp);
Arrive = Standard_True;
if (line->NbPoints()>=2) {
- // Indiquer qu on s arrete en cours de cheminement
+ // Indicate that one stops during the processing
#if DEB
- cout<<"SurfRstLineBuilder :On n avance plus dans le cheminement"<<endl;
+ cout<<"SurfRstLineBuilder : No advancement in the processing"<<endl;
#endif
}
}
else {
- param = parprec + sens*stepw; // on ne risque pas de depasser Bound.
+ param = parprec + sens*stepw; // no risk to exceed Bound.
}
}
break;
Drawsect(param,Func);
}
#endif
- // Mettre a jour la ligne.
+ // Update the line.
if (sens>0.) {
line->Append(previousP);
}
Exts.SetValue(previousP.PointOnS(),sol(1),sol(2),
previousP.Parameter(),tolesp);
MakeExtremity(Extrst,Standard_False,rst,sol(3),IsVtxrst,Vtxrst);
- // Indiquer que fin sur Bound.
+ // Indicate end on Bound.
}
else {
param = param + sens*stepw;
case Blend_SamePoints :
{
- // On arrete
+ // Stop
#if DEB
- cout << "SurfRstLineBuilder Points confondus dans le cheminement" << endl;
+ cout << "SurfRstLineBuilder Points mixed in the processing" << endl;
#endif
previousP.ParametersOnS(U,V);
Exts.SetValue(previousP.PointOnS(),U,V,
//=======================================================================
//function : Recadre
-//purpose : Recadre une section Surface / Restriction
+//purpose : Reframe section Surface / Restriction
//=======================================================================
Standard_Boolean BRepBlend_SurfRstLineBuilder::Recadre(Blend_SurfCurvFuncInv& FinvC,
#endif
}
else {
- // On doit verifier la valeur de la fonction
+ // It is necessary to check the value of the function
rsnld.Root(Solinv);
recadre = FinvC.IsSolution(Solinv,tolesp);
}
- // En cas d'echecs, on regarde si un autre arc
- // peut faire l'affaire (cas des sorties a proximite d'un vertex)
+ // In case of fail, it is checked if another arc
+ // can be useful (case of output at the proximity of a vertex)
if (!recadre) {
IndexSol = ArcToRecadre(sol, IndexSol,
lastpt2d, pt2d, pmin);
if (IndexSol == 0) {
- return Standard_False; // Pas d'autre solution
+ return Standard_False; // No other solution
}
domain1->Init();
#endif
}
else {
- // On doit verifier la valeur de la fonction
+ // It is necessary to check the value of the function
rsnld.Root(Solinv);
recadre = FinvC.IsSolution(Solinv,tolesp);
}
if (!domain2->MoreVertex()) {
IsVtx = Standard_False;
}
- // On recalcule la section par resolution directe, sinon, on se recupere
- // des incoherences entre le parametre et sol dues au baillement.
+ // The section is recalculated by direct resolution, otherwise
+ // incoherences between the parameter and the ground caused by yawn are returned.
math_Vector infbound(1,3),supbound(1,3);
math_Vector parinit(1,3),tolerance(1,3);
Blend_Status BRepBlend_SurfRstLineBuilder::CheckDeflectionOnSurf(const Blend_Point& CurPoint)
{
- //Controles 3d du Blend_CSWalking.
+ //Controls 3d of Blend_CSWalking.
- // regle par tests dans U4 correspond a 11.478 d
+ // rule by tests in U4 corresponds to 11.478 d
const Standard_Real CosRef3D = 0.98;
Standard_Real Cosi=0, Cosi2=0;
Standard_Boolean curpointistangent = CurPoint.IsTangencyPoint();
if(!prevpointistangent) prevNorme = prevTg.SquareMagnitude();
if (Norme <= tolesp*tolesp){
- // il faudra peut etre forcer meme point
+ // it can be necessary to force same point
return Blend_SamePoints;
}
if(!prevpointistangent){
return Blend_SamePoints;
}
Cosi = sens*Corde*prevTg;
- if (Cosi <0.) { // angle 3d>pi/2. --> retour arriere
+ if (Cosi <0.) { // angle 3d>pi/2. --> return back
return Blend_Backward;
}
}
if(!curpointistangent){
- // Voir s il faut faire le controle sur le signe de prevtg*Tgsurf
+ // Check if it is necessary to control the sign of prevtg*Tgsurf
Cosi = sens*Corde*Tgsurf;
Cosi2 = Cosi * Cosi / Tgsurf.SquareMagnitude() / Norme;
if (Cosi2 < CosRef3D || Cosi < 0.) {
}
if(!curpointistangent && !prevpointistangent){
- // Estimation de la fleche courante
+ // Estimation of the current arrow
Standard_Real FlecheCourante =
(prevTg.Normalized().XYZ()-Tgsurf.Normalized().XYZ()).SquareModulus()*Norme/64.;
return Blend_StepTooSmall;
}
if (FlecheCourante > fleche*fleche) {
- // pas trop grand : commentaire interessant
+ // not too great :
return Blend_StepTooLarge;
}
}
Blend_Status BRepBlend_SurfRstLineBuilder::CheckDeflectionOnRst(const Blend_Point& CurPoint)
{
- //Controles 3d du Blend_CSWalking.
+ //Controls 3D of Blend_CSWalking.
- // regle par tests dans U4 correspond a 11.478 d
+ // rule by tests in U4 corresponds to 11.478 d
const Standard_Real CosRef3D = 0.98;
Standard_Real Cosi, Cosi2;
Standard_Boolean curpointistangent = CurPoint.IsTangencyPoint();
if(!prevpointistangent) prevNorme = prevTg.SquareMagnitude();
if (Norme <= tolesp*tolesp){
- // il faudra peut etre forcer meme point
+ // it can be necessary to force same point
return Blend_SamePoints;
}
if(!prevpointistangent){
return Blend_SamePoints;
}
Cosi = sens*Corde*prevTg;
- if (Cosi <0.) { // angle 3d>pi/2. --> retour arriere
+ if (Cosi <0.) { // angle 3d>pi/2. --> return back
return Blend_Backward;
}
}
if(!curpointistangent){
- // Voir s il faut faire le controle sur le signe de prevtg*Tgsurf
+ // Check if it is necessary to control the sign of prevtg*Tgsurf
Cosi = sens*Corde*Tgsurf;
Cosi2 = Cosi * Cosi / Tgsurf.SquareMagnitude() / Norme;
if (Cosi2 < CosRef3D || Cosi < 0.) {
}
if(!curpointistangent && !prevpointistangent){
- // Estimation de la fleche courante
+ // Estimation of the current arrow
Standard_Real FlecheCourante =
(prevTg.Normalized().XYZ()-Tgsurf.Normalized().XYZ()).SquareModulus()*Norme/64.;
return Blend_StepTooSmall;
}
if (FlecheCourante > fleche*fleche) {
- // pas trop grand : commentaire interessant
+ // not too great
return Blend_StepTooLarge;
}
}
{
math_Vector tolerance(1,3);
Func.GetTolerance(tolerance,tolesp);
- //cote pcurve.
+ //face pcurve.
Standard_Real w = sol(3);
if(w < rst->FirstParameter() - tolerance(3)||
w > rst->LastParameter() + tolerance(3)){
}
else SituOnC = TopAbs_ON;
- //cote surface
+ //face surface
gp_Pnt2d p2d(sol(1),sol(2));
SituOnS = domain1->Classify(p2d,Min(tolerance(1),tolerance(2)),0);
- //decrochage
+ //lost contact
gp_Vec tgs,nors;
Decroch = Func.Decroch(sol,tgs,nors);
// Author: Jacques GOUSSARD
// Copyright: OPEN CASCADE 1993
-// Modified 09/09/1996 PMN Ajout de Nb(Intervalls), IsRationnal
-// Optimisation, utilisation de GetCircle
-// Modified 20/02/1998 PMN Gestion des surfaces singulieres
+// Modified 09/09/1996 PMN Adde Nb(Intervalls), IsRationnal
+// Optimisation, use of GetCircle
+// Modified 20/02/1998 PMN Singular surfaces management
#include <BlendFunc_ConstRad.ixx>
distmin(RealLast()),
mySShape(BlendFunc_Rational)
{
-// Initialisaton des variables de controle du cache.
+// Initialisaton of cash control variables.
tval = -9.876e100;
xval.Init(-9.876e100);
myXOrder = -1;
//=======================================================================
//function : ComputeValues
-//purpose : Passage OBLIGATOIRE pour tous les calculs
-// Cette methode gere les positionemment sur Surfaces et Courbe
-// Calcul les equation et leurs derives partielle
-// Stock certains resultat intermediaire dans les champs pour etre
-// utiliser dans d'autre methodes.
+//purpose : OBLIGATORY passage for all calculations
+// This method manages positioning on Surfaces and Curves
+// Calculate the equations and their partial derivates
+// Stock certain intermediate results in fields to
+// use in other methods.
//=======================================================================
Standard_Boolean BlendFunc_ConstRad::ComputeValues(const math_Vector& X,
const Standard_Boolean byParam,
const Standard_Real Param)
{
- // declaration statique afin d'eviter la realloc systematique
+ // static declaration to avoid systematic reallocation
static gp_Vec d3u1,d3v1,d3uuv1,d3uvv1,d3u2,d3v2,d3uuv2,d3uvv2;
static gp_Vec d1gui, d2gui, d3gui;
static Standard_Real invnormtg, dinvnormtg;
Standard_Real T = Param, aux;
- // Cas du parametre implicite
+ // Case of implicite parameter
if ( !byParam) { T = param;}
- // Le travail est il dejas fait ?
+ // Is the work already done ?
Standard_Boolean myX_OK = (Order<=myXOrder) ;
for (Standard_Integer ii=1; ((ii<=X.Length()) && myX_OK); ii++) {
myX_OK = ( X(ii) == xval(ii) );
return Standard_True;
}
- // Traitement de t
+ // Processing of t
if (!t_OK) {
tval = T;
if (byParam) { myTOrder = Order;}
else { myTOrder = 0;}
- //----- Positionement sur la courbe ----------------
+ //----- Positioning on the curve ----------------
switch (myTOrder) {
case 0 :
{
}
}
- // Traitement de X
+ // Processing of X
if (!myX_OK) {
xval = X;
myXOrder = Order;
- //-------------- Positionement sur les surfaces -----------------
+ //-------------- Positioning on surfaces -----------------
switch (myXOrder) {
case 0 :
{
default:
return Standard_False;
}
- // Cas des surfaces degeneree
+ // Case of degenerated surfaces
if (nsurf1.Magnitude() < Eps ) {
//gp_Vec normal;
gp_Pnt2d P(X(1), X(2));
}
}
- // -------------------- Positionement a l'ordre 0 ---------------------
+ // -------------------- Positioning of order 0 ---------------------
Standard_Real invnorm1, invnorm2, ndotns1, ndotns2, theD;
gp_Vec ncrossns1,ncrossns2,resul,temp;
if (invnorm1 > Eps) invnorm1 = ((Standard_Real) 1) /invnorm1;
else {
- invnorm1 = 1; // Insufisant, mais il ne faut pas planter
+ invnorm1 = 1; // Unsatisfactory, but it is not necessary to crash
#if DEB
cout << " ConstRad : Surface singuliere " << endl;
#endif
}
if (invnorm2 > Eps) invnorm2 = ((Standard_Real) 1) /invnorm2;
else {
- invnorm2 = 1; // Insufisant, mais il ne faut pas planter
+ invnorm2 = 1; // Unsatisfactory, but it is not necessary to crash
#if DEB
cout << " ConstRad : Surface singuliere " << endl;
#endif
E(3) = resul.Y();
E(4) = resul.Z();
- // -------------------- Positionement a l'ordre 1 ---------------------
+ // -------------------- Positioning of order 1 ---------------------
if (Order >= 1) {
Standard_Real grosterme, cube, carre;
DEDX(1,4) = nplan.Dot(d1v2)/2;
cube =invnorm1*invnorm1*invnorm1;
- // Derivee par rapport a u1
+ // Derived in relation to u1
grosterme = - ncrossns1.Dot(nplan.Crossed(dns1u1))*cube;
dndu1.SetLinearForm( grosterme*ndotns1
+ invnorm1*nplan.Dot(dns1u1), nplan,
DEDX(3,1) = resul.Y();
DEDX(4,1) = resul.Z();
- // Derivee par rapport a v1
+ // Derived in relation to v1
grosterme = - ncrossns1.Dot(nplan.Crossed(dns1v1))*cube;
dndv1.SetLinearForm( grosterme*ndotns1
DEDX(4,2) = resul.Z();
cube = invnorm2*invnorm2*invnorm2;
- // Derivee par rapport a u2
+ // Derived in relation to u2
grosterme = - ncrossns2.Dot(nplan.Crossed(dns1u2))*cube;
dndu2.SetLinearForm( grosterme*ndotns2
+invnorm2*nplan.Dot(dns1u2), nplan,
DEDX(3,3) = resul.Y();
DEDX(4,3) = resul.Z();
- // Derivee par rapport a v2
+ // Derived in relation to v2
grosterme = -ncrossns2.Dot(nplan.Crossed(dns1v2))*cube;
dndv2.SetLinearForm( grosterme*ndotns2
+invnorm2*nplan.Dot(dns1v2), nplan,
if (byParam) {
temp.SetXYZ( (pts1.XYZ()+pts2.XYZ())/2 - ptgui.XYZ());
- // Derivee de n1 par rapport a w
+ // Derived from n1 in relation to w
grosterme = ncrossns1.Dot(dnplan.Crossed(nsurf1))*invnorm1*invnorm1;
dn1w.SetLinearForm((dnplan.Dot(nsurf1)-grosterme*ndotns1)*invnorm1, nplan,
ndotns1*invnorm1,dnplan,
grosterme*invnorm1,nsurf1);
- // Derivee de n2 par rapport a w
+ // Derivee from n2 in relation to w
grosterme = ncrossns2.Dot(dnplan.Crossed(nsurf2))*invnorm2*invnorm2;
dn2w.SetLinearForm((dnplan.Dot(nsurf2)-grosterme*ndotns2)*invnorm2,nplan,
ndotns2*invnorm2,dnplan,
DEDT(3) = ray1*dn1w.Y() - ray2*dn2w.Y();
DEDT(4) = ray1*dn1w.Z() - ray2*dn2w.Z();
}
- // ------ Positionemement a l'ordre 2 -----------------------------
+ // ------ Positioning of order 2 -----------------------------
if (Order == 2) {
// gp_Vec d2ndu1, d2ndu2, d2ndv1, d2ndv2, d2nduv1, d2nduv2;
gp_Vec d2ns1u1, d2ns1u2, d2ns1v1, d2ns1v2, d2ns1uv1, d2ns1uv2;
// ================
carre = invnorm1*invnorm1;
cube = carre*invnorm1;
- // Derivee double par rapport a u1
- // Derivation de la norme
+ // Derived double compared to u1
+ // Derived from the norm
d2ns1u1.SetLinearForm(1, d3u1.Crossed(d1v1),
2, d2u1.Crossed(d2uv1),
1, d1u1.Crossed(d3uuv1));
D2EDX2(3,1,1) = resul.Y();
D2EDX2(4,1,1) = resul.Z();
- // Derivee double par rapport a u1, v1
- // Derivation de la norme
+ // Derived double compared to u1, v1
+ // Derived from the norm
d2ns1uv1 = (d3uuv1.Crossed(d1v1))
+ (d2u1 .Crossed(d2v1))
+ (d1u1 .Crossed(d3uvv1));
DSecn = (nplan.Crossed(dns1v1)).Dot(nplan.Crossed(dns1u1))
+ ncrossns1.Dot(nplan.Crossed(d2ns1uv1));
grosterme = (3*uterm*vterm*carre-DSecn)*cube;
- uterm *= -cube; //et seulement maintenant
+ uterm *= -cube; //and only now
vterm *= -cube;
p1 = nplan.Dot(dns1u1);
D2EDX2(3,2,1) = D2EDX2(3,1,2) = resul.Y();
D2EDX2(4,2,1) = D2EDX2(4,1,2) = resul.Z();
- // Derivee double par rapport a v1
- // Derivation de la norme
+ // Derived double compared to v1
+ // Derived from the norm
d2ns1v1.SetLinearForm(1, d1u1.Crossed(d3v1),
2, d2uv1.Crossed(d2v1),
1, d3uvv1.Crossed(d1v1));
// ================
carre = invnorm2*invnorm2;
cube = carre*invnorm2;
- // Derivee double par rapport a u2
- // Derivation de la norme
+ // Derived double compared to u2
+ // Derived from the norm
d2ns1u2.SetLinearForm(1, d3u2.Crossed(d1v2),
2, d2u2.Crossed(d2uv2),
1, d1u2.Crossed(d3uuv2));
D2EDX2(3,3,3) = resul.Y();
D2EDX2(4,3,3) = resul.Z();
- // Derivee double par rapport a u2, v2
- // Derivation de la norme
+ // Derived double compared to u2, v2
+ // Derived from the norm
d2ns1uv2 = (d3uuv2.Crossed(d1v2))
+ (d2u2 .Crossed(d2v2))
+ (d1u2 .Crossed(d3uvv2));
DSecn = (nplan.Crossed(dns1v2)).Dot(nplan.Crossed(dns1u2))
+ ncrossns2.Dot(nplan.Crossed(d2ns1uv2));
grosterme = (3*uterm*vterm*carre-DSecn)*cube;
- uterm *= -cube; //et seulement maintenant
+ uterm *= -cube; //and only now
vterm *= -cube;
p1 = nplan.Dot(dns1u2);
D2EDX2(3,4,3) = D2EDX2(3,3,4) = resul.Y();
D2EDX2(4,4,3) = D2EDX2(4,3,4) = resul.Z();
- // Derivee double par rapport a v2
- // Derivation de la norme
+ // Derived double compared to v2
+ // Derived from the norm
d2ns1v2.SetLinearForm(1, d1u2.Crossed(d3v2),
2, d2uv2.Crossed(d2v2),
1, d3uvv2.Crossed(d1v2));
if (byParam) {
Standard_Real tterm;
- // ---------- Derivation double en t, X --------------------------
+ // ---------- Derivation double in t, X --------------------------
D2EDXDT(1,1) = dnplan.Dot(d1u1)/2;
D2EDXDT(1,2) = dnplan.Dot(d1v1)/2;
D2EDXDT(1,3) = dnplan.Dot(d1u2)/2;
carre = invnorm1*invnorm1;
cube = carre*invnorm1;
- //--> Derivee par rapport a u1 et t
+ //--> Derived compared to u1 and t
tterm = ncrossns1.Dot(dnplan.Crossed(nsurf1));
smallterm = - tterm*cube;
- // Derivation de la norme
+ // Derived from the norm
uterm = ncrossns1.Dot(nplan. Crossed(dns1u1));
DSecn = (nplan.Crossed(dns1u1)).Dot(dnplan.Crossed(nsurf1))
+ ncrossns1.Dot(dnplan.Crossed(dns1u1));
D2EDXDT(3,1) = resul.Y();
D2EDXDT(4,1) = resul.Z();
- //--> Derivee par rapport a v1 et t
- // Derivation de la norme
+ //--> Derived compared to v1 and t
+ // Derived from the norm
uterm = ncrossns1.Dot(nplan. Crossed(dns1v1));
DSecn = (nplan. Crossed(dns1v1)).Dot(dnplan.Crossed(nsurf1))
+ ncrossns1.Dot(dnplan.Crossed(dns1v1));
carre = invnorm2*invnorm2;
cube = carre*invnorm2;
- //--> Derivee par rapport a u2 et t
+ //--> Derived compared to u2 and t
tterm = ncrossns2.Dot(dnplan.Crossed(nsurf2));
smallterm = -tterm*cube;
- // Derivation de la norme
+ // Derived from the norm
uterm = ncrossns2.Dot(nplan. Crossed(dns1u2));
DSecn = (nplan. Crossed(dns1u2)).Dot(dnplan.Crossed(nsurf2))
+ ncrossns2.Dot(dnplan.Crossed(dns1u2));
D2EDXDT(3,3) = resul.Y();
D2EDXDT(4,3) = resul.Z();
- //--> Derivee par rapport a v2 et t
- // Derivation de la norme
+ //--> Derived compared to v2 and t
+ // Derived from the norm
uterm = ncrossns2.Dot(nplan. Crossed(dns1v2));
DSecn = (nplan.Crossed(dns1v2)).Dot(dnplan.Crossed(nsurf2))
+ ncrossns2.Dot(dnplan.Crossed(dns1v2));
D2EDXDT(4,4) = resul.Z();
- // ---------- Derivation double en t -----------------------------
- // Derivee de n1 par rapport a w
+ // ---------- Derivation double in t -----------------------------
+ // Derived from n1 compared to w
carre = invnorm1*invnorm1;
cube = carre*invnorm1;
- // Derivation de la norme
+ // Derived from the norm
DPrim = ncrossns1.Dot(dnplan.Crossed(nsurf1));
smallterm = - 2*DPrim*cube;
DSecn = (dnplan.Crossed(nsurf1)).SquareMagnitude()
ndotns1*invnorm1, d2nplan);
d2n1w += temp;
- // Derivee de n2 par rapport a w
+ // Derived from n2 compared to w
carre = invnorm2*invnorm2;
cube = carre*invnorm2;
- // Derivation de la norme
+ // Derived from the norm
DPrim = ncrossns2.Dot(dnplan.Crossed(nsurf2));
smallterm = - 2*DPrim*cube;
DSecn = (dnplan.Crossed(nsurf2)).SquareMagnitude()
//=======================================================================
//function : Set
-//purpose : Segmente la courbe a sa partie utile.
-// La prcision est prise arbitrairement petite !?
+//purpose : Segmentation of the useful part of the curve
+// Precision is taken at random and small !?
//=======================================================================
void BlendFunc_ConstRad::Set(const Standard_Real First, const Standard_Real Last)
if (Abs(E(1)) <= Tol &&
E(2)*E(2) + E(3)*E(3) + E(4)*E(4) <= Tol*Tol) {
- // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+ // ns1, ns2 and np are copied locally to avoid crushing the fields !
gp_Vec ns1,ns2,np;
ns1 = nsurf1;
ns2 = nsurf2;
norm = nplan.Crossed(ns1).Magnitude();
if (norm < Eps) {
- norm = 1; // Insufisant, mais il ne faut pas planter
+ norm = 1; // Unsatisfactory, but it is not necessary to stop
}
ns1.SetLinearForm(nplan.Dot(ns1)/norm,nplan, -1./norm, ns1);
norm = nplan.Crossed(ns2).Magnitude();
if (norm < Eps) {
- norm = 1; // Insufisant, mais il ne faut pas planter
+ norm = 1; // Unsatisfactory, but it is not necessary to stop
}
ns2.SetLinearForm(nplan.Dot(ns2)/norm,nplan, -1./norm, ns2);
tg22d.SetCoord(solution(3),solution(4));
}
- // mise a jour de maxang
+ // update of maxang
if (ray1 > 0.) {
ns1.Reverse();
Cosa = ns1.Dot(ns2);
Sina = np.Dot(ns1.Crossed(ns2));
if (choix%2 != 0) {
- Sina = -Sina; //nplan est change en -nplan
+ Sina = -Sina; //nplan is changed in -nplan
}
if(Cosa > 1.) {Cosa = 1.; Sina = 0.;}
Angle = ACos(Cosa);
- // Recadrage sur ]-pi/2, 3pi/2]
+ // Reframing on ]-pi/2, 3pi/2]
if (Sina <0.) {
if (Cosa > 0.) Angle = -Angle;
else Angle = 2.*PI - Angle;
Standard_Real norm1;
norm1 = nplan.Crossed(ns1).Magnitude();
if (norm1 < Eps) {
- norm1 = 1; // Insufisant, mais il ne faut pas planter
+ norm1 = 1; // Unsatisfactory, but it is not necessary to stop
}
ns1.SetLinearForm(nplan.Dot(ns1)/norm1,nplan, -1./norm1,ns1);
Center.SetXYZ(pts1.XYZ()+ray1*ns1.XYZ());
-// on oriente ns1 du centre vers pts1,
+// ns1 is oriented from the center to pts1,
if (ray1 > 0.) {
ns1.Reverse();
C.SetPosition(gp_Ax2(Center,np,ns1));
Pdeb = 0.;
Pfin = ElCLib::Parameter(C,pts2);
- // Test des angles negatif et quasi null : Cas Singulier
+ // Test negative and almost null angles : Singular Case
if (Pfin>1.5*PI) {
np.Reverse();
C.SetPosition(gp_Ax2(Center,np,ns1));
void BlendFunc_ConstRad::GetMinimalWeight(TColStd_Array1OfReal& Weigths) const
{
BlendFunc::GetMinimalWeights(mySShape, myTConv, minang, maxang, Weigths );
- // On suppose que cela ne depend pas du Rayon!
+ // It is supposed that it does not depend on the Radius!
}
//=======================================================================
//=======================================================================
//function : GetTolerance
-//purpose : Determine les Tolerances a utiliser dans les approximations.
+//purpose : Determine Tolerances used for approximations.
//=======================================================================
void BlendFunc_ConstRad::GetTolerance(const Standard_Real BoundTol,
const Standard_Real SurfTol,
Ok = ComputeValues(X, 0, Standard_True, prm);
distmin = Min (distmin, pts1.Distance(pts2));
- // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+ // ns1, ns2, np are copied locally to avoid crushing the fields !
ns1 = nsurf1;
ns2 = nsurf2;
np = nplan;
norm1 = nplan.Crossed(ns1).Magnitude();
norm2 = nplan.Crossed(ns2).Magnitude();
if (norm1 < Eps) {
- norm1 = 1; // Insufisant, mais il ne faut pas planter
+ norm1 = 1; // Unsatisfactory, but it is not necessary to stop
//#if DEB
// cout << " ConstRad : Surface singuliere " << endl;
//#endif
}
if (norm2 < Eps) {
- norm2 = 1; // Insufisant, mais il ne faut pas planter
+ norm2 = 1; // Unsatisfactory, but it is not necessary to stop
//#if DEB
// cout << " ConstRad : Surface singuliere " << endl;
//#endif
Center.SetXYZ(pts1.XYZ()+ray1*ns1.XYZ());
-// on oriente ns1 (resp. ns2) du centre vers pts1 (resp. pts2),
-// et on rend direct le triedre ns1,ns2,nplan.
+// ns1 (resp. ns2) is oriented from center to pts1 (resp. pts2),
+// and the triedron ns1,ns2,nplan is made direct.
if (ray1 > 0.) {
ns1.Reverse();
P.ParametersOnS1(sol(1),sol(2));
P.ParametersOnS2(sol(3),sol(4));
- // Calculs des equations
+ // Calculation of equations
ComputeValues(sol, 1, Standard_True, prm);
distmin = Min (distmin, pts1.Distance(pts2));
- // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+ // ns1, ns2, np are copied locally to avoid crushing the fields !
ns1 = nsurf1;
ns2 = nsurf2;
np = nplan;
if ( ! pts1.IsEqual(pts2, 1.e-4)) {
- // Calcul des derives Traitement Normal
+ // Calculation of derivates Processing Normal
math_Gauss Resol(DEDX, 1.e-9);
if (Resol.IsDone()) {
}
- // Les poles 2d
+ // Tops 2d
Poles2d(Poles2d.Lower()).SetCoord(sol(1),sol(2));
Poles2d(Poles2d.Upper()).SetCoord(sol(3),sol(4));
if (!istgt) {
DPoles2d(Poles2d.Upper()).SetCoord(secmember(3),secmember(4));
}
- // on traite le cas linear...
+ // the linear case is processed...
if (mySShape == BlendFunc_Linear) {
Poles(low) = pts1;
Poles(upp) = pts2;
return (!istgt);
}
- // Cas du cercle
+ // Case of the circle
norm1 = nplan.Crossed(ns1).Magnitude();
norm2 = nplan.Crossed(ns2).Magnitude();
if (norm1 < Eps) {
- norm1 = 1; // Insufisant, mais il ne faut pas planter
+ norm1 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " ConstRad : Surface singuliere " << endl;
#endif
}
if (norm2 < Eps) {
- norm2 = 1; // Insufisant, mais il ne faut pas planter
+ norm2 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " ConstRad : Surface singuliere " << endl;
#endif
tgc.SetLinearForm(ray1,dnorm1w,tg1); // = tg1.Added(ray1*dn1w);
}
- // On oriente ns1 du centre vers pts1, et ns2 du centre vers pts2
- // et on rend le triedre ns1,ns2,nplan direct
+ // ns1 is oriented from the center to pts1, and ns2 from the center to pts2
+ // and the trihedron ns1,ns2,nplan is made direct
if (ray1 > 0.) {
ns1.Reverse();
# endif
*/
- // Calculs des equations
+ // Calculation of equations
ComputeValues(X, 2, Standard_True, prm);
distmin = Min (distmin, pts1.Distance(pts2));
#endif
*/
- // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+ // ns1, ns2, np are copied locally to avois crushing the fields !
ns1 = nsurf1;
ns2 = nsurf2;
np = nplan;
dnp = dnplan;
d2np = d2nplan;
- // Calcul des derives
+ // Calculation of derivatives
if ( ! pts1.IsEqual(pts2, 1.e-4)) {
- math_Gauss Resol(DEDX, 1.e-9); // !Tol a affiner !!!!!
- // Calcul des derives Traitement Normal
+ math_Gauss Resol(DEDX, 1.e-9); // Precise tolerance !!!!!
+ // Calculation of derivatives Processing Normal
if (Resol.IsDone()) {
Resol.Solve(-DEDT, sol);
D2EDX2.Multiply(sol, D2DXdSdt);
d2norm2w.SetLinearForm(secmember(3),dndu2, secmember(4),dndv2, temp);
}
- // Les poles 2d
+ // Tops 2d
Poles2d(Poles2d.Lower()).SetCoord(X(1),X(2));
Poles2d(Poles2d.Upper()).SetCoord(X(3),X(4));
if (!istgt) {
D2Poles2d(Poles2d.Upper()).SetCoord(secmember(3), secmember(4));
}
- // on traite le cas linear...
+ // linear case is processed...
if (mySShape == BlendFunc_Linear) {
Poles(low) = pts1;
Poles(upp) = pts2;
return (!istgt);
}
- // Cas du cercle
+ // Case of circle
norm1 = nplan.Crossed(ns1).Magnitude();
norm2 = nplan.Crossed(ns2).Magnitude();
if (norm1 < Eps) {
- norm1 = 1; // Insufisant, mais il ne faut pas planter
+ norm1 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " ConstRad : Surface singuliere " << endl;
#endif
}
if (norm2 < Eps) {
- norm2 = 1; // Insufisant, mais il ne faut pas planter
+ norm2 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " ConstRad : Surface singuliere " << endl;
#endif
dtgc.SetLinearForm(ray1, d2norm1w, dtg1);
}
- // On oriente ns1 du centre vers pts1, et ns2 du centre vers pts2
- // et on rend le triedre ns1,ns2,nplan direct
+ // ns1 is oriented from the center to pts1 and ns2 from the center to pts2
+ // trihedron ns1,ns2,nplan is made direct
if (ray1 > 0.) {
ns1.Reverse();
axrot.SetDirection(dirax);
}
else {
- axrot.SetDirection(np); // Pour ne pas planter
+ axrot.SetDirection(np); // To avoid stop
}
if (dnp.Magnitude() >= gp::Resolution()) {
oriax.SetXYZ(ptgui.XYZ()+
//#endif
}
if (norm2 < Eps) {
- norm2 = 1; // Insufisant, mais il ne faut pas planter
+ norm2 = 1; // Unsatisfactory, but it is not necessary to stop
//#if DEB
// cout << " ConstRadInv : Surface singuliere " << endl;
//#endif
norm1 = ncrossns1.Magnitude();
norm2 = ncrossns2.Magnitude();
if (norm1 < Eps) {
- norm1 = 1; // Insufisant, mais il ne faut pas planter
+ norm1 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " ConstRadInv : Surface singuliere " << endl;
#endif
}
if (norm2 < Eps) {
- norm2 = 1; // Insufisant, mais il ne faut pas planter
+ norm2 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " ConstRadInv : Surface singuliere " << endl;
#endif
ndotns1 = nplan.Dot(ns1);
ndotns2 = nplan.Dot(ns2);
- // Derivee par rapport a u1
+ // Derived compared to u1
temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
grosterme = ncrossns1.Dot(nplan.Crossed(temp))/norm1/norm1;
d1u1);
- // Derivee par rapport a v1
+ // Derived compared to v1
temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
grosterme = ncrossns1.Dot(nplan.Crossed(temp))/norm1/norm1;
}
- // derivee par rapport a w (parametre sur ligne guide)
- // On considere ici que le rayon est constant
+ // derived compared to w (parameter on guideline)
+ // It is assumed that the radius is constant
grosterme = ncrossns1.Dot(dnplan.Crossed(ns1))/norm1/norm1;
resul1.SetLinearForm(-ray1/norm1*(grosterme*ndotns1-dnplan.Dot(ns1)),nplan,
- // Derivee par rapport a u2
+ // Derived compared to u2
temp = d2u2.Crossed(d1v2).Added(d1u2.Crossed(d2uv2));
grosterme = ncrossns2.Dot(nplan.Crossed(temp))/norm2/norm2;
resul1.SetLinearForm(ray2/norm2*(grosterme*ndotns2-nplan.Dot(temp)),nplan,
ray2/norm2,temp);
resul1.Subtract(d1u2);
- // Derivee par rapport a v2
+ // Derived compared to v2
temp = d2uv2.Crossed(d1v2).Added(d1u2.Crossed(d2v2));
grosterme = ncrossns2.Dot(nplan.Crossed(temp))/norm2/norm2;
resul2.SetLinearForm(ray2/norm2*(grosterme*ndotns2-nplan.Dot(temp)),nplan,
norm1 = ncrossns1.Magnitude();
norm2 = ncrossns2.Magnitude();
if (norm1 < Eps) {
- norm1 = 1; // Insufisant, mais il ne faut pas planter
+ norm1 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " ConstRadInv : Surface singuliere " << endl;
#endif
}
if (norm2 < Eps) {
- norm2 = 1; // Insufisant, mais il ne faut pas planter
+ norm2 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " ConstRadInv : Surface singuliere " << endl;
#endif
F(3) = resul1.Y();
F(4) = resul1.Z();
- // Derivee par rapport a u1
+ // Derived compared to u1
temp = d2u1.Crossed(d1v1).Added(d1u1.Crossed(d2uv1));
grosterme = ncrossns1.Dot(nplan.Crossed(temp))/norm1/norm1;
d1u1);
- // Derivee par rapport a v1
+ // Derived compared to v1
temp = d2uv1.Crossed(d1v1).Added(d1u1.Crossed(d2v1));
grosterme = ncrossns1.Dot(nplan.Crossed(temp))/norm1/norm1;
D(4,4) = resul2.Z();
}
- // derivee par rapport a w (parametre sur ligne guide)
- // On considere ici que le rayon est constant
+ // derived compared to w (parameter on guideline)
+ // It is assumed that the raduis is constant
grosterme = ncrossns1.Dot(dnplan.Crossed(ns1))/norm1/norm1;
resul1.SetLinearForm(-ray1/norm1*(grosterme*ndotns1-dnplan.Dot(ns1)),nplan,
- // Derivee par rapport a u2
+ // Derived compared to u2
temp = d2u2.Crossed(d1v2).Added(d1u2.Crossed(d2uv2));
grosterme = ncrossns2.Dot(nplan.Crossed(temp))/norm2/norm2;
resul1.SetLinearForm(ray2/norm2*(grosterme*ndotns2-nplan.Dot(temp)),nplan,
ray2/norm2,temp);
resul1.Subtract(d1u2);
- // Derivee par rapport a v2
+ // Derived compared to v2
temp = d2uv2.Crossed(d1v2).Added(d1u2.Crossed(d2v2));
grosterme = ncrossns2.Dot(nplan.Crossed(temp))/norm2/norm2;
resul2.SetLinearForm(ray2/norm2*(grosterme*ndotns2-nplan.Dot(temp)),nplan,
class Corde from BlendFunc
- ---Purpose: Cette fonction calcule le point pts sur la courbe intersection
- -- entre la normale a une courbe (guide) en un parametre choisi
- -- et une surface (surf), tel que pts soit a une distance
- -- donnee de guide.
- -- X(1),X(2) sont les parametres U,V de pts sur surf.
+ ---Purpose: This function calculates point (pts) on the curve of
+ -- intersection between the normal to a curve (guide)
+ -- in a chosen parameter and a surface (surf), so
+ -- that pts was at a given distance from the guide.
+ -- X(1),X(2) are the parameters U,V of pts on surf.
uses Vector from math,
DerFguide(me: in out; Sol : Vector from math; DerF : out Vec2d from gp);
- ---Purpose: Derivee de la fonction par rapport au parametre
- -- de la ligne guide
+ ---Purpose: Derived of the function compared to the parameter
+ -- of the guideline
IsSolution(me : in out;
secmember(2) = 2.*d1gui.Dot(temp);
// gradsol*der = secmember
-// avec der(1) = dU/dW, der(2) = dU/dW, W est le parametre de guide
+// with der(1) = dU/dW, der(2) = dU/dW, W is the guide parameter
math_Gauss Resol(gradsol);
if (Resol.IsDone()) {
// Author: Jacques GOUSSARD
// Copyright: OPEN CASCADE 1993
-// Modified 10/09/1996 PMN Ajout de (Nb)Intervalles, IsRationnal
-// + Optimisation.
-// Modified 26/04/1997 PMN Traitement des Singularites
-// Modified 23/06/1997 PMN Pb de division par 0
-// Modified 20/02/1998 PMN Gestion des surfaces singulieres
#include <BlendFunc_EvolRad.ixx>
{
Standard_Integer ind1=1, ind2=1;
Standard_Real Epspar = Precision::PConfusion()*0.99;
- // en suposant que le positionement fonctionne a PConfusion()/2
+// supposed that positioning works with PConfusion()/2
Standard_Real v1, v2;
-// Initialisations : les IND1 et IND2 pointent sur le 1er element
-// de chacune des 2 tables a traiter.INDS pointe sur le dernier
-// element cree de TABSOR
+// Initialisation : IND1 and IND2 point at the 1st element
+// of each of 2 tables to be processed. INDS points at the last
+// element of TABSOR
-//--- On remplit TABSOR en parcourant TABLE1 et TABLE2 simultanement ---
-//------------------ en eliminant les occurrences multiples ------------
+//--- TABSOR is filled by parsing TABLE1 and TABLE2 simultaneously ---
+//------------------ by removing multiple occurrencies ------------
while ((ind1<=I1.Upper()) && (ind2<=I2.Upper())) {
v1 = I1(ind1);
v2 = I2(ind2);
if (Abs(v1-v2)<= Epspar) {
-// Ici les elements de I1 et I2 conviennent .
+// Here elements of I1 and I2 are suitable.
Seq.Append((v1+v2)/2);
ind1++;
ind2++;
}
else if (v1 < v2) {
- // Ici l' element de I1 convient.
+ // Here the element of I1 is suitable.
Seq.Append(v1);
ind1++;
}
else {
-// Ici l' element de TABLE2 convient.
+// Here the element of TABLE2 is suitable.
Seq.Append(v2);
ind2++;
}
}
if (ind1>I1.Upper()) {
-//----- Ici I1 est epuise, on complete avec la fin de TABLE2 -------
+//----- Here I1 is empty, to be completed with the end of TABLE2 -------
for (; ind2<=I2.Upper(); ind2++) {
Seq.Append(I2(ind2));
}
if (ind2>I2.Upper()) {
-//----- Ici I2 est epuise, on complete avec la fin de I1 -------
+//----- Here I2 is empty, to be completed with the end of I1 -------
for (; ind1<=I1.Upper(); ind1++) {
Seq.Append(I1(ind1));
fevol = Law;
tevol = Law;
-// Initialisaton des variables de controle du cache.
+// Initialisaton of cash control variables.
tval = -9.876e100;
xval.Init(-9.876e100);
myXOrder = -1;
//=======================================================================
//function : ComputeValues
-//purpose : Passage OBLIGATOIRE pour tous les calculs
-// Cette methode gere les positionemment sur Surfaces et Courbe
-// Calcul les equation et leurs derives partielle
-// Stock certains resultat intermediaire dans les champs pour etre
-// utiliser dans d'autre methodes.
+//purpose : OBLIGATORY passage for all computations
+// This method manages the positioning on Surfaces and Curves
+// Partial calculation of equations and their derivatives
+// Storage of some intermediary results in fields to be
+// used in other methods.
//=======================================================================
Standard_Boolean BlendFunc_EvolRad::ComputeValues(const math_Vector& X,
const Standard_Boolean byParam,
const Standard_Real Param)
{
- // declaration statique afin d'eviter la realloc systematique
+ // static declaration to avoid systematic realloc
static gp_Vec d3u1,d3v1,d3uuv1,d3uvv1,d3u2,d3v2,d3uuv2,d3uvv2;
static gp_Vec d1gui, d2gui, d3gui;
static Standard_Real invnormtg, dinvnormtg;
Standard_Real T = Param, aux;
- // Cas du parametre implicite
+ // Case of implicit parameter
if ( !byParam) { T = param;}
- // Le travail est il dejas fait ?
+ // The work is done already?
Standard_Boolean lX_OK = (Order<=myXOrder);
Standard_Integer ii;
for (ii=1; ((ii<=X.Length()) && lX_OK); ii++) {
return Standard_True;
}
- // Traitement de t
+ // Processing of t
if (!t_OK) {
tval = T;
if (byParam) { myTOrder = Order;}
else { myTOrder = 0;}
- //----- Positionement sur la courbe et la loi----------------
+ //----- Positioning on the curve and the law----------------
switch (myTOrder) {
case 0 :
{
}
}
- // Traitement de X
+ // Processing of X
if (!lX_OK) {
xval = X;
myXOrder = Order;
- //-------------- Positionement sur les surfaces -----------------
+ //-------------- Positioning on surfaces -----------------
switch (myXOrder) {
case 0 :
{
default:
return Standard_False;
}
- // Cas des surfaces degeneree
+ // Case of degenerated surfaces
if (nsurf1.Magnitude() < Eps ) {
// gp_Vec normal;
gp_Pnt2d P(X(1), X(2));
}
}
- // -------------------- Positionement a l'ordre 0 ---------------------
+ // -------------------- Positioning of order 0 ---------------------
Standard_Real invnorm1, invnorm2, ndotns1, ndotns2, theD;
Standard_Real ray1 = sg1*ray;
Standard_Real ray2 = sg2*ray;
if (invnorm1 > Eps) invnorm1 = ((Standard_Real) 1) /invnorm1;
else {
- invnorm1 = 1; // Insufisant, mais il ne faut pas planter
+ invnorm1 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " EvolRad : Surface singuliere " << endl;
#endif
}
if (invnorm2 > Eps) invnorm2 = ((Standard_Real) 1) /invnorm2;
else {
- invnorm2 = 1; // Insufisant, mais il ne faut pas planter
+ invnorm2 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " EvolRad : Surface singuliere " << endl;
#endif
E(3) = resul.Y();
E(4) = resul.Z();
- // -------------------- Positionement a l'ordre 1 ---------------------
+ // -------------------- Positioning of order 1 ---------------------
if (Order >= 1) {
Standard_Real grosterme, cube, carre;
DEDX(1,4) = nplan.Dot(d1v2)/2;
cube =invnorm1*invnorm1*invnorm1;
- // Derivee par rapport a u1
+ // Derived compared to u1
grosterme = - ncrossns1.Dot(nplan.Crossed(dns1u1))*cube;
dndu1.SetLinearForm( grosterme*ndotns1
+ invnorm1*nplan.Dot(dns1u1), nplan,
DEDX(3,1) = resul.Y();
DEDX(4,1) = resul.Z();
- // Derivee par rapport a v1
+ // Derived compared to v1
grosterme = - ncrossns1.Dot(nplan.Crossed(dns1v1))*cube;
dndv1.SetLinearForm( grosterme*ndotns1
+invnorm1*nplan.Dot(dns1v1), nplan,
DEDX(3,3) = resul.Y();
DEDX(4,3) = resul.Z();
- // Derivee par rapport a v2
+ // Derived compared to v2
grosterme = -ncrossns2.Dot(nplan.Crossed(dns1v2))*cube;
dndv2.SetLinearForm( grosterme*ndotns2
+invnorm2*nplan.Dot(dns1v2), nplan,
if (byParam) {
temp.SetXYZ( (pts1.XYZ()+pts2.XYZ())/2 - ptgui.XYZ());
- // Derivee de n1 par rapport a w
+ // Derived from n1 compared to w
grosterme = ncrossns1.Dot(dnplan.Crossed(nsurf1))*invnorm1*invnorm1;
dn1w.SetLinearForm((dnplan.Dot(nsurf1)-grosterme*ndotns1)*invnorm1, nplan,
ndotns1*invnorm1,dnplan,
grosterme*invnorm1,nsurf1);
- // Derivee de n2 par rapport a w
+ // Derived from n2 compared to w
grosterme = ncrossns2.Dot(dnplan.Crossed(nsurf2))*invnorm2*invnorm2;
dn2w.SetLinearForm((dnplan.Dot(nsurf2)-grosterme*ndotns2)*invnorm2,nplan,
ndotns2*invnorm2,dnplan,
DEDT(3) = resul.Y();
DEDT(4) = resul.Z();
}
- // ------ Positionemement a l'ordre 2 -----------------------------
+ // ------ Positioning of order 2 -----------------------------
if (Order == 2) {
// gp_Vec d2ndu1, d2ndu2, d2ndv1, d2ndv2, d2nduv1, d2nduv2;
gp_Vec d2ns1u1, d2ns1u2, d2ns1v1, d2ns1v2, d2ns1uv1, d2ns1uv2;
// ================
carre = invnorm1*invnorm1;
cube = carre*invnorm1;
- // Derivee double par rapport a u1
- // Derivation de la norme
+ // Derived double compared to u1
+ // Derived from the norm
d2ns1u1.SetLinearForm(1, d3u1.Crossed(d1v1),
2, d2u1.Crossed(d2uv1),
1, d1u1.Crossed(d3uuv1));
D2EDX2(3,1,1) = resul.Y();
D2EDX2(4,1,1) = resul.Z();
- // Derivee double par rapport a u1, v1
- // Derivation de la norme
+ // Derived double compared to u1, v1
+ // Derived from the norm
d2ns1uv1 = (d3uuv1.Crossed(d1v1))
+ (d2u1 .Crossed(d2v1))
+ (d1u1 .Crossed(d3uvv1));
DSecn = (nplan.Crossed(dns1v1)).Dot(nplan.Crossed(dns1u1))
+ ncrossns1.Dot(nplan.Crossed(d2ns1uv1));
grosterme = (3*uterm*vterm*carre-DSecn)*cube;
- uterm *= -cube; //et seulement maintenant
+ uterm *= -cube; //and only now
vterm *= -cube;
p1 = nplan.Dot(dns1u1);
D2EDX2(3,2,1) = D2EDX2(3,1,2) = resul.Y();
D2EDX2(4,2,1) = D2EDX2(4,1,2) = resul.Z();
- // Derivee double par rapport a v1
- // Derivation de la norme
+ // Derived double compared to v1
+ // Derived from the norm
d2ns1v1.SetLinearForm(1, d1u1.Crossed(d3v1),
2, d2uv1.Crossed(d2v1),
1, d3uvv1.Crossed(d1v1));
// ================
carre = invnorm2*invnorm2;
cube = carre*invnorm2;
- // Derivee double par rapport a u2
- // Derivation de la norme
+ // Derived double compared to u2
+ // Derived from the norm
d2ns1u2.SetLinearForm(1, d3u2.Crossed(d1v2),
2, d2u2.Crossed(d2uv2),
1, d1u2.Crossed(d3uuv2));
D2EDX2(3,3,3) = resul.Y();
D2EDX2(4,3,3) = resul.Z();
- // Derivee double par rapport a u2, v2
- // Derivation de la norme
+ // Derived double compared to u2, v2
+ // Derived from the norm
d2ns1uv2 = (d3uuv2.Crossed(d1v2))
+ (d2u2 .Crossed(d2v2))
+ (d1u2 .Crossed(d3uvv2));
DSecn = (nplan.Crossed(dns1v2)).Dot(nplan.Crossed(dns1u2))
+ ncrossns2.Dot(nplan.Crossed(d2ns1uv2));
grosterme = (3*uterm*vterm*carre-DSecn)*cube;
- uterm *= -cube; //et seulement maintenant
+ uterm *= -cube; //and only now
vterm *= -cube;
p1 = nplan.Dot(dns1u2);
D2EDX2(3,4,3) = D2EDX2(3,3,4) = resul.Y();
D2EDX2(4,4,3) = D2EDX2(4,3,4) = resul.Z();
- // Derivee double par rapport a v2
- // Derivation de la norme
+ // Derived double compared to v2
+ // Derived from the norm
d2ns1v2.SetLinearForm(1, d1u2.Crossed(d3v2),
2, d2uv2.Crossed(d2v2),
1, d3uvv2.Crossed(d1v2));
if (byParam) {
Standard_Real tterm;
- // ---------- Derivation double en t, X --------------------------
+ // ---------- Double Derivation on t, X --------------------------
D2EDXDT(1,1) = dnplan.Dot(d1u1)/2;
D2EDXDT(1,2) = dnplan.Dot(d1v1)/2;
D2EDXDT(1,3) = dnplan.Dot(d1u2)/2;
carre = invnorm1*invnorm1;
cube = carre*invnorm1;
- //--> Derivee par rapport a u1 et t
+ //--> Derived compared to u1 and t
tterm = ncrossns1.Dot(dnplan.Crossed(nsurf1));
smallterm = - tterm*cube;
- // Derivation de la norme
+ // Derived from the norm
uterm = ncrossns1.Dot(nplan. Crossed(dns1u1));
DSecn = (nplan.Crossed(dns1u1)).Dot(dnplan.Crossed(nsurf1))
+ ncrossns1.Dot(dnplan.Crossed(dns1u1));
D2EDXDT(3,1) = resul.Y();
D2EDXDT(4,1) = resul.Z();
- //--> Derivee par rapport a v1 et t
- // Derivation de la norme
+ //--> Derived compared to v1 and t
+ // Derived from the norm
uterm = ncrossns1.Dot(nplan. Crossed(dns1v1));
DSecn = (nplan. Crossed(dns1v1)).Dot(dnplan.Crossed(nsurf1))
+ ncrossns1.Dot(dnplan.Crossed(dns1v1));
carre = invnorm2*invnorm2;
cube = carre*invnorm2;
- //--> Derivee par rapport a u2 et t
+ //--> Derived compared to u2 and t
tterm = ncrossns2.Dot(dnplan.Crossed(nsurf2));
smallterm = -tterm*cube;
- // Derivation de la norme
+ // Derived from the norm
uterm = ncrossns2.Dot(nplan. Crossed(dns1u2));
DSecn = (nplan. Crossed(dns1u2)).Dot(dnplan.Crossed(nsurf2))
+ ncrossns2.Dot(dnplan.Crossed(dns1u2));
D2EDXDT(3,3) = resul.Y();
D2EDXDT(4,3) = resul.Z();
- //--> Derivee par rapport a v2 et t
- // Derivation de la norme
+ //--> Derived compared to v2 and t
+ // Derived from the norm
uterm = ncrossns2.Dot(nplan. Crossed(dns1v2));
DSecn = (nplan.Crossed(dns1v2)).Dot(dnplan.Crossed(nsurf2))
+ ncrossns2.Dot(dnplan.Crossed(dns1v2));
D2EDXDT(4,4) = resul.Z();
- // ---------- Derivation double en t -----------------------------
- // Derivee de n1 par rapport a w
+ // ---------- Double derivation on t -----------------------------
+ // Derived from n1 compared to w
carre = invnorm1*invnorm1;
cube = carre*invnorm1;
- // Derivation de la norme
+ // Derived from the norm
DPrim = ncrossns1.Dot(dnplan.Crossed(nsurf1));
smallterm = - 2*DPrim*cube;
DSecn = (dnplan.Crossed(nsurf1)).SquareMagnitude()
ndotns1*invnorm1, d2nplan);
d2n1w += temp;
- // Derivee de n2 par rapport a w
+ // Derived from n2 compared to w
carre = invnorm2*invnorm2;
cube = carre*invnorm2;
- // Derivation de la norme
+ // Derived from the norm
DPrim = ncrossns2.Dot(dnplan.Crossed(nsurf2));
smallterm = - 2*DPrim*cube;
DSecn = (dnplan.Crossed(nsurf2)).SquareMagnitude()
//=======================================================================
//function : Set
-//purpose : Segmente la courbe a sa partie utile.
-// La precision est prise arbitrairement petite !?
+//purpose : Segments curve in its useful part.
+// Small precision is taken at random
//=======================================================================
void BlendFunc_EvolRad::Set(const Standard_Real First,
if (Abs(E(1)) <= Tol &&
E(2)*E(2) + E(3)*E(3) + E(4)*E(4) <= Tol*Tol) {
- // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+ // ns1, ns2, np are copied locally to avoid crushing the fields !
gp_Vec ns1, ns2, np;
ns1 = nsurf1;
ns2 = nsurf2;
norm = nplan.Crossed(ns1).Magnitude();
if (norm < Eps) {
- norm = 1; // Insufisant, mais il ne faut pas planter
+ norm = 1; // Unsatisfactory, but it is not necessary to stop
}
ns1.SetLinearForm(nplan.Dot(ns1)/norm,nplan, -1./norm, ns1);
norm = nplan.Crossed(ns2).Magnitude();
if (norm < Eps) {
- norm = 1; // Insufisant, mais il ne faut pas planter
+ norm = 1; // Unsatisfactory, but it is not necessary to stop
}
ns2.SetLinearForm(nplan.Dot(ns2)/norm,nplan, -1./norm, ns2);
else {
istangent = Standard_True;
}
- // mise a jour de maxang
+ // update of maxang
if (sg1 > 0.) { // sg1*ray
ns1.Reverse();
Cosa = ns1.Dot(ns2);
Sina = nplan.Dot(ns1.Crossed(ns2));
if (choix%2 != 0) {
- Sina = -Sina; //nplan est change en -nplan
+ Sina = -Sina; //nplan is changed into -nplan
}
if(Cosa > 1.) {Cosa = 1.; Sina = 0.;}
Angle = ACos(Cosa);
- // Recadrage sur ]-pi/2, 3pi/2]
+ // Reframing on ]-pi/2, 3pi/2]
if (Sina <0.) {
if (Cosa > 0.) Angle = -Angle;
else Angle = 2.*PI - Angle;
Standard_Real norm1;
norm1 = nplan.Crossed(ns1).Magnitude();
if (norm1 < Eps) {
- norm1 = 1; // Insufisant, mais il ne faut pas planter
+ norm1 = 1; // Unsatisfactory, but it is not necessary to stop
}
ns1.SetLinearForm(nplan.Dot(ns1)/norm1,nplan, -1./norm1,ns1);
Center.SetXYZ(pts1.XYZ()+sg1*ray*ns1.XYZ());
-// on oriente ns1 du centre vers pts1
+// ns1 is oriented from the center to pts1
if (sg1 > 0.) {
ns1.Reverse();
}
C.SetPosition(gp_Ax2(Center,np,ns1));
Pdeb = 0.;
Pfin = ElCLib::Parameter(C,pts2);
- // Test des angles negatif et quasi null : Cas Singulier
+ // Test of negative and almost null angles : Single Case
if (Pfin>1.5*PI) {
np.Reverse();
C.SetPosition(gp_Ax2(Center,np,ns1));
//=======================================================================
//function : GetTolerance
-//purpose : Determine les Tolerance a utiliser dans les approximations.
+//purpose : Determine the Tolerance to be used in approximations.
//=======================================================================
void BlendFunc_EvolRad::GetTolerance(const Standard_Real BoundTol,
const Standard_Real SurfTol,
math_Vector& Tol1d) const
{
Standard_Integer low = Tol3d.Lower() , up=Tol3d.Upper();
- Standard_Real rayon = lengthmin/maxang; // on deduit un rayon
+ Standard_Real rayon = lengthmin/maxang; // a radius is subtracted
Standard_Real Tol;
Tol= GeomFill::GetTolerance(myTConv, maxang, rayon,
AngleTol, SurfTol);
P.ParametersOnS1(X(1), X(2));
P.ParametersOnS2(X(3), X(4));
- // Calcul et stokage de la distmin
+ // Calculation and storage of distmin
Ok = ComputeValues(X, 0, Standard_True, prm);
distmin = Min (distmin, pts1.Distance(pts2));
- // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+ // ns1, ns2, np are copied locally to avoid crashing the fields !
ns1 = nsurf1;
ns2 = nsurf2;
np = nplan;
norm1 = nplan.Crossed(ns1).Magnitude();
norm2 = nplan.Crossed(ns2).Magnitude();
if (norm1 < Eps) {
- norm1 = 1; // Insufisant, mais il ne faut pas planter
+ norm1 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " EvolRad : Surface singuliere " << endl;
#endif
}
if (norm2 < Eps) {
- norm2 = 1; // Insufisant, mais il ne faut pas planter
+ norm2 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " EvolRad : Surface singuliere " << endl;
#endif
Center.SetXYZ(pts1.XYZ()+sg1*ray*ns1.XYZ());
-// on oriente ns1 (resp. ns2) du centre vers pts1 (resp. pts2),
-// et on rend direct le triedre ns1,ns2,nplan.
+// ns1 (resp. ns2) is oriented from center to pts1 (resp. pts2),
+// and the trihedron ns1,ns2,nplan is made direct.
if (sg1 > 0.) {
ns1.Reverse();
P.ParametersOnS1(sol(1),sol(2));
P.ParametersOnS2(sol(3),sol(4));
- // Calculs des equations
+ // Calculation of equations
ComputeValues(sol, 1, Standard_True, prm);
distmin = Min (distmin, pts1.Distance(pts2));
- // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+ // ns1, ns2, np are copied locally to avoid crashing fields !
ns1 = nsurf1;
ns2 = nsurf2;
np = nplan;
rayprim = dray;
if ( ! pts1.IsEqual(pts2, 1.e-4)) {
- // Calcul des derives Traitement Normal
+ // Calculation of derived Normal processing
math_Gauss Resol(DEDX, 1.e-9);
if (Resol.IsDone()) {
}
- // Les poles 2d
+ // Tops 2D
Poles2d(Poles2d.Lower()).SetCoord(sol(1),sol(2));
Poles2d(Poles2d.Upper()).SetCoord(sol(3),sol(4));
if (!istgt) {
DPoles2d(Poles2d.Upper()).SetCoord(secmember(3),secmember(4));
}
- // on traite le cas linear...
+ // the linear case is processed...
if (mySShape == BlendFunc_Linear) {
Poles(low) = pts1;
Poles(upp) = pts2;
return (!istgt);
}
- // Cas du cercle
+ // Case of the circle
norm1 = nplan.Crossed(ns1).Magnitude();
norm2 = nplan.Crossed(ns2).Magnitude();
if (norm1 < Eps) {
- norm1 = 1; // Insufisant, mais il ne faut pas planter
+ norm1 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " EvolRad : Surface singuliere " << endl;
#endif
}
if (norm2 < Eps) {
- norm2 = 1; // Insufisant, mais il ne faut pas planter
+ norm2 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " EvolRad : Surface singuliere " << endl;
#endif
tg1);
}
- // On oriente ns1 du centre vers pts1, et ns2 du centre vers pts2
- // et on rend le triedre ns1,ns2,nplan direct
+ // ns1 is oriented from center to pts1, and ns2 from center to pts2
+ // and the trihedron ns1,ns2,nplan is made direct
if (sg1 > 0.) {
ns1.Reverse();
dnp.Reverse();
}
- if (ray < 0.) { // pour eviter la connerie Abs(dray) qques lignes plus bas
+ if (ray < 0.) { // to avoid Abs(dray) some lines below
rayprim = -rayprim;
}
#endif
*/
- // on recopie localement ns1, ns2, np afin de ne pas ecraser les champs !
+ // ns1, ns2, np are copied locally to avoid crashing the fields
ns1 = nsurf1;
ns2 = nsurf2;
np = nplan;
raysecn = d2ray;
if ( ! pts1.IsEqual(pts2, 1.e-4)) {
- math_Gauss Resol(DEDX, 1.e-9); // !Tol a affiner !!!!!
- // Calcul des derives Traitement Normal
+ math_Gauss Resol(DEDX, 1.e-9); // Tolerance to precise
+ // Calculation of derived Normal Processing
if (Resol.IsDone()) {
Resol.Solve(-DEDT, sol);
D2EDX2.Multiply(sol, D2DXdSdt);
d2norm2w.SetLinearForm(secmember(3),dndu2, secmember(4),dndv2, temp);
}
- // Les poles 2d
+ // Tops 2d
Poles2d(Poles2d.Lower()).SetCoord(X(1),X(2));
Poles2d(Poles2d.Upper()).SetCoord(X(3),X(4));
if (!istgt) {
D2Poles2d(Poles2d.Upper()).SetCoord(secmember(3), secmember(4));
}
- // on traite le cas linear...
+ // the linear is processed...
if (mySShape == BlendFunc_Linear) {
Poles(low) = pts1;
Poles(upp) = pts2;
return (!istgt);
}
- // Cas du cercle
+ // Case of the circle
norm1 = nplan.Crossed(ns1).Magnitude();
norm2 = nplan.Crossed(ns2).Magnitude();
if (norm1 < Eps) {
- norm1 = 1; // Insufisant, mais il ne faut pas planter
+ norm1 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " EvolRad : Surface singuliere " << endl;
#endif
}
if (norm2 < Eps) {
- norm2 = 1; // Insufisant, mais il ne faut pas planter
+ norm2 = 1; // Unsatisfactory, but it is not necessary to stop
#if DEB
cout << " EvolRad : Surface singuliere " << endl;
#endif
dtgc += dtg1;
}
- // On oriente ns1 du centre vers pts1, et ns2 du centre vers pts2
- // et on rend le triedre ns1,ns2,nplan direct
+ // ns1 is oriented from the center to pts1, and ns2 from the center to pts2
+ // and the trihedron ns1,ns2,nplan is made direct
if (sg1 > 0.) {
ns1.Reverse();
d2np.Reverse();
}
- if (ray < 0.) { // pour eviter la connerie Abs(dray) qques lignes plus bas
+ if (ray < 0.) { // to avoid Abs(dray) several lines below
rayprim = -rayprim;
raysecn = -raysecn;
}
if (status == ChFi2d_ConnexionError) return commonVertex;
TopoDS_Edge basisEdge1, basisEdge2, E1, E2;
- // E1 and E2 are the adjacentes edges to Fillet
+ // E1 and E2 are the adjacent edges to Fillet
if (adjEdge1.IsSame(Fillet)) E1 = adjEdge2;
else E1 = adjEdge1;
newEdge1.Location(E1.Location());
} // if (firstVertex ...
else if (lastVertex.IsSame(connectionE1Fillet)) {
-// syntaxe invalide sur NT
+// syntax wrong on NT
// const Handle(Geom_Curve)& curve =
// BRep_Tool::Curve(E1, loc, first, last);
Handle(Geom_Curve) curve = BRep_Tool::Curve(E1, loc, first, last);
else {
// It means the edge support one fillet on each end.
if (firstVertex.IsSame(connectionE2Fillet)) {
-// syntaxe invalide sur NT
+// syntax wrong on NT
// const Handle(Geom_Curve)& curve =
// BRep_Tool::Curve(E2, loc, first, last);
Handle(Geom_Curve) curve = BRep_Tool::Curve(E2, loc, first, last);
newEdge2.Location(E2.Location());
} // if (firstVertex ...
else if (lastVertex.IsSame(connectionE2Fillet)) {
-// syntaxe invalide sur NT
+// syntax wrong on NT
// const Handle(Geom_Curve)& curve =
// BRep_Tool::Curve(E2, loc, first, last);
Handle(Geom_Curve) curve = BRep_Tool::Curve(E2, loc, first, last);
gp_Pnt Pnew = BRep_Tool::Pnt(NewExtr);
Standard_Boolean PonctualEdge = Standard_False;
Standard_Real Tol = Precision::Confusion();
-// syntaxe invalide sur NT
+// syntax wrong on NT
// const Handle(Geom_Curve)& curve =
// BRep_Tool::Curve(E1, first, last);
Handle(Geom_Curve) curve = BRep_Tool::Curve(E1, first, last);
TopoDS_Vertex V4 = TopExp::LastVertex(E2);
//========================================================================
- // On a trouve un premier arc. +
+ // The first arc is found. +
//========================================================================
TopAbs_Orientation O1,O2;
Standard_Real param1,param2,param3,param4;
//========================================================================
- // Sauvegarde des parties non modifiees sur les aretes touchees. +
+ // Save non-modified parts of edges concerned. +
//========================================================================
if (V1.IsSame(V)) {
}
//========================================================================
- // Recuperation des supports geometriques. +
+ // Restore geometric supports. +
//========================================================================
Handle(Geom2d_Curve) C1,C2;
C2 = BRep_Tool::CurveOnSurface(E2,newFace,ufirst2,ulast2);
//========================================================================
- // Determination du cote pour le conge. +
+ // Determination of the face for fillet. +
//========================================================================
gp_Pnt2d p;
Ve3 = Ve1;
Ve4 = Ve2;
- // traitement des point de tangence ou de rebroussement
+ // processing of tangency or downcast point
if (Ve1.IsParallel(Ve2,Precision::Angular())) {
- // Ve1 et Ve2 sont paralleles : on met cross a 0
+ // Ve1 and Ve2 are parallel : cross at 0
cross = 0.;
if (param1<param2) {
Ve3 = -Ve1;
}
if (! Ve4.IsOpposite(Ve3,Precision::Angular())) {
- // Il y a un vrai point de tangence, on arrete
+ // There is a true tangency point and the calculation is stopped
status = ChFi2d_TangencyError;
return filletEdge;
}
- // Sinon, c'est un point de rebroussement, on continue
+ // Otherwise this is a downcast point, and the calculation is continued
}
GccEnt_Position Qual1,Qual2;
Fillet.Tangency2(nsol,PPU1,PPU2,Ptg2);
dist = Ptg2.Distance(p);
inside = (PPU2<param3 && PPU2>param4) || (PPU2<param4 && PPU2>param3);
- // cas de l'arc de cercle passant sur la couture
+ // case of arc of circle passing on the sewing
if ( ( basisC2->DynamicType() == STANDARD_TYPE(Geom2d_Circle) ) &&
( (2*PI<param3 && 2*PI>param4) || (2*PI<param4 && 2*PI>param3) ) ) {
// cas param3<param4
Fillet.Tangency1(numsol,U1,U2,Ptg1);
Fillet.Tangency2(numsol,Vv1,Vv2,Ptg2);
- // verification de la validite des parametres
+ // check the validity of parameters
inside = (U2<param1 && U2>param2) || (U2<param2 && U2>param1);
if ( (basisC1->DynamicType() == STANDARD_TYPE(Geom2d_Circle))
&& ( (2*PI<param1 && 2*PI>param2) || (2*PI<param2 && 2*PI>param1) ) ) {
- // arc de cercle contenant l'origine du cercle
- // cas param1<param2
+ // arc of circle containing the circle origin
+ // case param1<param2
inside = (param1<U2 && U2<2*PI) || (0<=U2 && U2<param2-2*PI);
- // cas param2<param1
+ // case param2<param1
inside = inside || (param2<U2 && U2<2*PI) || (0<=U2 && U2<param1-2*PI);
}
if (!inside) {
inside = (Vv2<param3 && Vv2>param4) || (Vv2<param4 && Vv2>param3);
if ( (basisC2->DynamicType() == STANDARD_TYPE(Geom2d_Circle))
&& ( (2*PI<param3 && 2*PI>param4) || (2*PI<param4 && 2*PI>param3) ) ) {
- // arc de cercle contenant l'origine du cercle
+ // arc of circle containing the circle origin
// cas param3<param4
inside = (param3<Vv2 && Vv2<2*PI) || (0<=Vv2 && Vv2<param4-2*PI);
// cas param4<param3
}
//=======================================================================
- // Mise a jour des sommets du conge. +
+ // Update tops of the fillet. +
//=======================================================================
gp_Pnt Pntbid;
gp_Pnt2d sommet;
//=======================================================================
//function : ConcaveSide
-//purpose : calcule le cote concave au voisinage de la frontiere
-// de 2 faces.
+//purpose : calculate the concave face at the neighborhood of the border of
+// 2 faces.
//=======================================================================
Standard_Integer ChFi3d::ConcaveSide(const BRepAdaptor_Surface& S1,
}
}
else {
- //les faces sont localement tangentes on bidouille!!
+ //the faces are locally tangent - this is fake!
if(dint1.Dot(dint2) < 0.){
- //ici c'est une regularite oubliee
+ //This is a forgotten regularity
gp_Vec DDU, DDV, DDUV;
S1.D2(p2d1.X(),p2d1.Y(),pt1,DU1,DV1,DDU,DDV,DDUV);
DU1 += ( DU1 * dint1 < 0) ? -DDU : DDU;
}
else {
#ifdef DEB
- cout<<"ConcaveSide : pas de cote concave"<<endl;
+ cout<<"ConcaveSide : no concave face"<<endl;
#endif
- //ce 10 montre que la face en bout est dans le prolongement de l'une des deux faces d'appui
+ //This 10 shows that the face at end is in the extension of one of two base faces
return 10;
}
}
else {
- //ici ca rebrousse, on prend des points dans les faces
- //ni trop pres ni trop loin, comme on peut.
+ //here it turns back, the points are taken in faces
+ //neither too close nor too far as much as possible.
Standard_Real u,v;
#ifdef DEB
// Standard_Real deport = 1000*BRep_Tool::Tolerance(E);
is
- -- Construction et donnees generales.
+ -- Construction and general data.
-------------------------------------
Delete(me:out) is virtual;
AngularTolerance : Real);
- -- Acquisition et interrogation concernant les trajets.
+ -- Acquisition and questioning on trajectories.
-------------------------------------------------------
Remove(me : in out; E : Edge from TopoDS)
is static;
- -- Le calcul et la recuperation des resultats.
+ -- Calculation and the restoration of results.
----------------------------------------------
Compute(me : in out)
- ---Purpose: calculation general
- -- -geometrie sur l ensemble des aretes,
- -- -reconstruction topologique
+ ---Purpose: general calculation of geometry on all edges,
+ -- topologic reconstruction.
is static;
IsDone(me) returns Boolean from Standard is static;
---Purpose: returns True if the computation is success
Shape(me) returns Shape from TopoDS
- ---Purpose: if (Isdone()) rend le resultat.
+ ---Purpose: if (Isdone()) makes the result.
raises NoSuchObject from Standard
---Purpose: if (!Isdone())
is static;
Intf,Intl : in out Boolean from Standard)
returns Boolean from Standard is static;
- ---Purpose: Methode, implementee dans les heritants, calculant
- -- les elements de construction de la surface (conge
- -- ou chanfrein).
+ ---Purpose: Method, implemented in the inheritants, calculates
+ -- the elements of construction of the surface (fillet or
+ -- chamfer).
CallPerformSurf(me : in out;
Stripe : in out Stripe from ChFiDS;
Intf,Intl : in out Boolean from Standard)
returns Boolean
is deferred protected;
- ---Purpose: Methode, implementee dans les heritants, calculant
- -- les elements de construction de la surface (conge
- -- ou chanfrein).
+ ---Purpose: Method, implemented in the inheritants, calculating
+ -- elements of construction of the surface (fillet or
+ -- chamfer).
PerformSurf(me : in out;
Data : out SequenceOfSurfData from ChFiDS;
Forward : Boolean from Standard;
RecP1, RecRst1 : Boolean from Standard;
RecP2, RecRst2 : Boolean from Standard)
- ---Purpose: Calculated a Line of contact edge/edge.
+ ---Purpose: Calculates a Line of contact edge/edge.
returns Boolean from Standard is static protected;
fields
--- La piece d entree
+-- Input part
myShape : Shape from TopoDS;
--- Donnees numeriques (tolerances) REMARQUE : il faut virer les tol2d!!!
-angular : Real from Standard; -- tangence entre aretes
-tolappangle : Real from Standard is protected; -- approx angulaire
+-- Numeric data (tolerances) NOTE : suspend tol2d!!!
+angular : Real from Standard; -- tangency of edges
+tolappangle : Real from Standard is protected; -- angular approximation
tolesp : Real from Standard is protected; -- confusion 3d : def 1.e-4
tol2d : Real from Standard is protected; -- confusion 2d : def 1.e-5
tolapp3d : Real from Standard is protected; -- approx 3d : def 1.e-4
tolapp2d : Real from Standard is protected; -- approx 2d : def 1.e-5
-fleche : Real from Standard is protected; -- fleche du walking : def 1.e-6
+fleche : Real from Standard is protected; -- vector of walking : def 1.e-6
--- Continuite pour la geometrie approximee
+-- Continuity for the approximated geometry
myConti : Shape from GeomAbs is protected;
--- Maps de pointeurs arrieres pour travailler
+-- Maps of back-pointers to work
myEFMap : Map from ChFiDS is protected;
myESoMap : Map from ChFiDS is protected;
myEShMap : Map from ChFiDS is protected;
myVFMap : Map from ChFiDS is protected;
myVEMap : Map from ChFiDS is protected;
--- Les outils de stockage et de reconstruction
+-- Tools of storage and reconstruction
myDS : HDataStructure from TopOpeBRepDS is protected;
myCoup : HBuilder from TopOpeBRepBuild is protected;
--- Les outils de stockage interne
+-- Tools of internal storage
myListStripe : ListOfStripe from ChFiDS is protected;
myVDataMap : StripeMap from ChFiDS is protected;
myRegul : Regularities from ChFiDS is protected;
--- Les stripes dont le calcul a plante
+-- Stripes the calculation which of hangs
badstripes : ListOfStripe from ChFiDS is protected;
--- Les vertex au voisinage desquels la finition a plante
+-- Vertexes in the neighborhood which of the finition hangs
badvertices : ListOfShape from TopTools is protected;
--- donnees calculees pendant le compute pour l historique
+-- Data calculated during the computation for the history
myGenerated : ListOfShape from TopTools;
myEVIMap : DataMapOfShapeListOfInteger from TopTools is protected;
--- flag si tout s est bien passe
+-- flag if all has passed well
done : Boolean from Standard is protected;
--- le resultat
+-- result
myShapeResult : Shape from TopoDS;
--- flag si il y a un resultat partiel(badshape)
+-- flag there is partial result (badshape)
hasresult : Boolean from Standard is protected;
--- resultat partiel eventuel
+-- eventual partial result
badShape : Shape from TopoDS;
#ifdef DEB
#include <OSD_Chronometer.hxx>
-// variables pour les performances
+// variables for performances
OSD_Chronometer cl_total,cl_extent,cl_perfsetofsurf,cl_perffilletonvertex,
TestTopOpe::Shapes(myShape,bids);
#endif
- // remplissage de myVDatatMap
+ // filling of myVDatatMap
ChFiDS_ListIteratorOfListOfStripe itel;
for (itel.Initialize(myListStripe);itel.More(); itel.Next()) {
else if (itel.Value()->Spine()->LastStatus() == ChFiDS_FreeBoundary)
ExtentOneCorner(itel.Value()->Spine()->LastVertex(),itel.Value());
}
- // preanalyse pour evaluer les prolongements.
+ // preanalysis to evaluate the extensions.
ExtentAnalyse();
ChFi3d_InitChron(cl_perfsetofsurf);
#endif
- // Construction de la bande de conge sur chaque stripe.
+ // Construction of the stripe of fillet on each stripe.
for (itel.Initialize(myListStripe);itel.More(); itel.Next()) {
itel.Value()->Spine()->SetErrorStatus(ChFiDS_Ok);
try {
ChFi3d_InitChron(cl_perffilletonvertex);
#endif
- //construire les conges sur chaque vertex +alimenter la Ds
+ //construct fillets on each vertex + feed the Ds
if (done) {
//Standard_Integer nbresult=0;
// for (Standard_Integer j=1;j<=myVDataMap.Extent();j++) {
if (done) {
BRep_Builder B1;
CompleteDS(DStr,myShape);
- //Update des tolerances sur vertex au max des aretes adjacentes ou
- //Update des tolerances sur arete degeneree au max des vertex adjacents.
+ //Update tolerances on vertex to max adjacent edges or
+ //Update tolerances on degenerated edge to max of adjacent vertexes.
TopOpeBRepDS_CurveExplorer cex(DStr);
for(;cex.More();cex.Next()){
TopOpeBRepDS_Curve& c = *((TopOpeBRepDS_Curve*)(void*)&(cex.Curve()));
its = myCoup->Merged(curshape,TopAbs_IN);
if(!its.More()) B1.Add(myShapeResult,curshape);
else {
- //Si l'ancien type est du Shape est un Shell, on mettre un Shell et non un Solid, Il reste neanmoins un pbleme pour compound de Shell ouvert.
+ //If the old type of Shape is Shell, Shell is placed instead of Solid,
+ //However there is a problem for compound of open Shell.
while (its.More()) {
const TopAbs_ShapeEnum letype = curshape.ShapeType();
if (letype == TopAbs_SHELL){
ChFi3d_InitChron(cl_setregul);
#endif
- // On code les regularites apres coup.
+ // Regularities are coded after cutting.
SetRegul();
#endif
- // affichage des temps pour les perfs
+ // display of time for perfs
#ifdef DEB
cout<<endl;
//=======================================================================
//function : PerformSingularCorner
-//purpose : Charge le vertex et les aretes degeneree.
+//purpose : Load vertex and degenerated edges.
//=======================================================================
void ChFi3d_Builder::PerformSingularCorner
#endif
for (It.Initialize(myVDataMap(Index)), i=0; It.More(); It.Next(),i++){
stripe = It.Value();
- // la SurfData en cause et ses CommonPoints,
+ // SurfData concerned and its CommonPoints,
Standard_Integer sens = 0;
Standard_Integer num = ChFi3d_IndexOfSurfData(Vtx,stripe,sens);
Standard_Boolean isfirst = (sens == 1);
Fd = stripe->SetOfSurfData()->Sequence().Value(num);
const ChFiDS_CommonPoint& CV1 = Fd->Vertex(isfirst,1);
const ChFiDS_CommonPoint& CV2 = Fd->Vertex(isfirst,2);
- // Est ce toujours degenere ?
+ // Is it always degenerated ?
if ( CV1.Point().IsEqual( CV2.Point(), 0) ) {
- // si oui on stoke le vertex dans la stripe
- // et on fabrique l'arete en bout
+ // if yes the vertex is stored in the stripe
+ // and the edge at end is created
if (i==0) Ivtx = ChFi3d_IndexPointInDS(CV1, DStr);
Standard_Real tolreached;
Standard_Real Pardeb, Parfin;
for (It.Initialize(myVDataMap(Index)), i=0; It.More(); It.Next(),i++){
stripe = It.Value();
sp = stripe->Spine();
- // la SurfData en cause et ses CommonPoints,
+ // SurfData and its CommonPoints,
Standard_Integer sens = 0;
Standard_Integer num = ChFi3d_IndexOfSurfData(Vtx,stripe,sens);
isfirst = (sens == 1);
Fd = stripe->SetOfSurfData()->Sequence().Value(num);
const ChFiDS_CommonPoint& CV1 = Fd->Vertex(isfirst,1);
const ChFiDS_CommonPoint& CV2 = Fd->Vertex(isfirst,2);
- // Est ce toujours degenere ?
+ // Is it always degenerated ?
if ( CV1.Point().IsEqual( CV2.Point(), 0) )
nondegenere = Standard_False;
else toujoursdegenere = Standard_False;
nba=nba/2;*/
Standard_Integer nba = ChFi3d_NumberOfEdges(Vtx, myVEMap);
- if (nondegenere) { // Traitement normal
+ if (nondegenere) { // Normal processing
switch (i) {
case 1 :
{
}
}
}
- else { // Traitement des cas singulier
+ else { // Single case processing
if (toujoursdegenere) PerformSingularCorner(Index);
- else PerformMoreThreeCorner(Index, i);//Derniere chance...
+ else PerformMoreThreeCorner(Index, i);//Last chance...
}
}
#include <ChFi3d_Builder_0.hxx>
+//#define DRAW
+#ifdef DRAW
+#include <Draw_Appli.hxx>
+#include <Draw.hxx>
+#include <Draw_Marker3D.hxx>
+#include <Draw_Marker2D.hxx>
+#include <DrawTrSurf.hxx>
+#include <DBRep.hxx>
+static Standard_Integer NbSp = 1;
+static Standard_Integer NbelFa = 1;
+#endif
+
#ifdef DEB
#include <OSD_Chronometer.hxx>
extern Standard_Boolean ChFi3d_GetcontextFORCEBLEND();
#include <GeomAdaptor_HCurve.hxx>
#include <BRepAdaptor_HSurface.hxx>
-//=======================================================================
-//function : ChFi3d_InPeriod
-//purpose :
-//=======================================================================
Standard_Real ChFi3d_InPeriod(const Standard_Real U,
const Standard_Real UFirst,
const Standard_Real ULast,
if ( u < UFirst) u = UFirst;
return u;
}
+
//=======================================================================
-//function : Boite
-//purpose : Calcul des min/max uv du conge a intersecter.
+//function : Box
+//purpose : Calculation of min/max uv of the fillet to intersect.
//=======================================================================
+
void ChFi3d_Boite(const gp_Pnt2d& p1,const gp_Pnt2d& p2,
Standard_Real& mu,Standard_Real& Mu,
Standard_Real& mv,Standard_Real& Mv)
mu = Min(p1.X(),p2.X()); Mu = Max(p1.X(),p2.X());
mv = Min(p1.Y(),p2.Y()); Mv = Max(p1.Y(),p2.Y());
}
+
//=======================================================================
-//function : Boite
-//purpose : Calcul des min/max uv du conge a intersecter.
+//function : Box
+//purpose : Calculation of min/max uv of the fillet to intersect.
//=======================================================================
+
void ChFi3d_Boite(const gp_Pnt2d& p1,const gp_Pnt2d& p2,
const gp_Pnt2d& p3,const gp_Pnt2d& p4,
Standard_Real& Du,Standard_Real& Dv,
Du = Mu - mu;
Dv = Mv - mv;
}
+
//=======================================================================
-//function : EnlargeBox et ses amis.
+//function : EnlargeBox and its friends.
//purpose :
//=======================================================================
+
static Handle(Adaptor3d_HSurface) Geometry(TopOpeBRepDS_DataStructure& DStr,
const Standard_Integer ind)
{
return new GeomAdaptor_HSurface(S);
}
}
-//=======================================================================
-//function : ChFi3d_SetPointTolerance
-//purpose :
-//=======================================================================
+
void ChFi3d_SetPointTolerance(TopOpeBRepDS_DataStructure& DStr,
const Bnd_Box& box,
const Standard_Integer IP)
box.Get(a,b,c,d,e,f);
d-=a; e-=b; f-=c;
d*=d; e*=e; f*=f;
- vtol = sqrt(d + e + f) * 1.5;// on prend un petit rab.
+ vtol = sqrt(d + e + f) * 1.5;
DStr.ChangePoint(IP).Tolerance(vtol);
}
-//=======================================================================
-//function : ChFi3d_EnlargeBox
-//purpose :
-//=======================================================================
+
void ChFi3d_EnlargeBox(const Handle(Geom_Curve)& C,
const Standard_Real wd,
const Standard_Real wf,
box1.Add(C->Value(wd));
box2.Add(C->Value(wf));
}
-//=======================================================================
-//function : ChFi3d_EnlargeBox
-//purpose :
-//=======================================================================
+
void ChFi3d_EnlargeBox(const Handle(Adaptor3d_HSurface)& S,
const Handle(Geom2d_Curve)& PC,
const Standard_Real wd,
PC->Value(wf).Coord(u,v);
box2.Add(S->Value(u,v));
}
-//=======================================================================
-//function : ChFi3d_EnlargeBox
-//purpose :
-//=======================================================================
+
void ChFi3d_EnlargeBox(const TopoDS_Edge& E,
const TopTools_ListOfShape& LF,
const Standard_Real w,
}
}
}
-//=======================================================================
-//function : ChFi3d_EnlargeBox
-//purpose :
-//=======================================================================
+
void ChFi3d_EnlargeBox(TopOpeBRepDS_DataStructure& DStr,
const Handle(ChFiDS_Stripe)& st,
const Handle(ChFiDS_SurfData)& sd,
}
}
}
+
//=======================================================================
//function : conexfaces
//purpose :
//=======================================================================
+
void ChFi3d_conexfaces(const TopoDS_Edge& E,
TopoDS_Face& F1,
TopoDS_Face& F2,
}
}
}
+
//=======================================================================
//function : EdgeState
-//purpose : examun des concavites pour les sommets a 3 aretes.
+//purpose : check concavities for the tops with 3 edges.
//=======================================================================
+
ChFiDS_State ChFi3d_EdgeState(TopoDS_Edge* E,
const ChFiDS_Map& EFMap)
{
}
return sst;
}
+
//=======================================================================
//function : evalconti
-//purpose : Methode tres rapide, a la limite de l imposture pour
-// coder les regularites CN. Il faudra affiner le traitement
-// quand le bug reviendra.
+//purpose : Method very fast to code regularities CN. It is necessary to
+// refine the processing.
//=======================================================================
+
GeomAbs_Shape ChFi3d_evalconti(const TopoDS_Edge& /*E*/,
const TopoDS_Face& F1,
const TopoDS_Face& F2)
typ != GeomAbs_Torus) return cont;
return GeomAbs_CN;
}
-//modified by NIZNHY-PKV Wed Dec 15 11:22:35 2010f
+
//=======================================================================
//function : KParticular
//purpose :
//=======================================================================
-Standard_Boolean ChFi3d_KParticular (const Handle(ChFiDS_Spine)& Spine,
- const Standard_Integer IE,
- const BRepAdaptor_Surface& S1,
- const BRepAdaptor_Surface& S2)
+
+Standard_Boolean ChFi3d_KParticular
+(const Handle(ChFiDS_Spine)& Spine,
+ const Standard_Integer IE,
+ const BRepAdaptor_Surface& S1,
+ const BRepAdaptor_Surface& S2)
{
- Standard_Boolean bRet;
- //
- bRet=Standard_True;
- //
+#ifdef DEB
+ if(ChFi3d_GetcontextFORCEBLEND()) return Standard_False;
+#endif
Handle(ChFiDS_FilSpine) fs = Handle(ChFiDS_FilSpine)::DownCast(Spine);
- if(!fs.IsNull() && !fs->IsConstant(IE)) {
- return !bRet;
- }
- //
- Standard_Boolean bIsPlane1, bIsPlane2;
- Standard_Real aPA;
- GeomAbs_CurveType aCT;
- GeomAbs_SurfaceType aST1, aST2;
- //
- aST1=S1.GetType();
- aST2=S2.GetType();
- bIsPlane1=(aST1==GeomAbs_Plane);
- bIsPlane2=(aST2==GeomAbs_Plane);
- if (!(bIsPlane1 || bIsPlane2)) {
- return !bRet;
- }
- //
- const BRepAdaptor_Surface& aS1=(bIsPlane1)? S1 : S2;
- const BRepAdaptor_Surface& aS2=(bIsPlane1)? S2 : S1;
- aST1=aS1.GetType();
- aST2=aS2.GetType();
- //
- if (!(aST2==GeomAbs_Plane || aST2==GeomAbs_Cylinder || aST2==GeomAbs_Cone)) {
- return !bRet;
- }
- //
+ if(!fs.IsNull() && !fs->IsConstant(IE)) return Standard_False;
const BRepAdaptor_Curve& bc = Spine->CurrentElementarySpine(IE);
- aCT = bc.GetType();
- if (!(aCT==GeomAbs_Line || aCT==GeomAbs_Circle)) {
- return !bRet;
- }
- //
- aPA=Precision::Angular();
- //
- if (aST2==GeomAbs_Plane){
- if (aCT==GeomAbs_Line) {
- return bRet;
+ GeomAbs_CurveType ctyp = bc.GetType();
+
+ switch (S1.GetType()) {
+
+ case GeomAbs_Plane :
+
+ switch(S2.GetType()) {
+
+ case GeomAbs_Plane :
+
+ if (ctyp == GeomAbs_Line) return Standard_True;
+ else return Standard_False;
+
+ case GeomAbs_Cylinder :
+
+ if (ctyp == GeomAbs_Line &&
+ (S1.Plane().Axis().Direction().
+ IsNormal(S2.Cylinder().Axis().Direction(),
+ Precision::Angular())))
+ return Standard_True;
+ else if (ctyp == GeomAbs_Circle &&
+ (S1.Plane().Axis().Direction().
+ IsParallel(S2.Cylinder().Axis().Direction(),
+ Precision::Angular())))
+ return Standard_True;
+ else return Standard_False;
+
+ case GeomAbs_Cone :
+
+ if (ctyp != GeomAbs_Circle) return Standard_False;
+ else if (S1.Plane().Axis().Direction().
+ IsParallel(S2.Cone().Axis().Direction(),
+ Precision::Angular()))
+ return Standard_True;
+ else return Standard_False;
+
+ case GeomAbs_Sphere :
+ /*
+ if (!Constant) return Standard_False;
+ else if (S1.Plane().Axis().Direction().
+ IsParallel(S2.Sphere().Position().Axis().Direction(),
+ Precision::Angular()))
+ return Standard_True;
+ else return Standard_False;
+ */
+ return Standard_False;
+ case GeomAbs_Torus :
+ /*
+ if (!Constant) return Standard_False;
+ else if (S1.Plane().Axis().Direction().
+ IsParallel(S2.Torus().Axis().Direction(),
+ Precision::Angular()))
+ return Standard_True;
+ else return Standard_False;;
+ */
+ return Standard_False;;
+ default:
+
+ return Standard_False;
}
- }
- else if (aST2==GeomAbs_Cylinder) {
- const gp_Dir& aD1=aS1.Plane().Axis().Direction();
- const gp_Dir& aD2=aS2.Cylinder().Axis().Direction();
- //
- if (aCT==GeomAbs_Line && aD1.IsNormal(aD2, aPA)) {
- return bRet;
+ case GeomAbs_Cylinder :
+
+ if (S2.GetType() == GeomAbs_Plane) {
+ if (ctyp == GeomAbs_Line &&
+ (S2.Plane().Axis().Direction().
+ IsNormal(S1.Cylinder().Axis().Direction(),
+ Precision::Angular())))
+ return Standard_True;
+ else if (ctyp == GeomAbs_Circle &&
+ (S2.Plane().Axis().Direction().
+ IsParallel(S1.Cylinder().Axis().Direction(),
+ Precision::Angular())))
+ return Standard_True;
+ else return Standard_False;
}
- else if (aCT==GeomAbs_Circle && aD1.IsParallel(aD2, aPA)) {
- return bRet;
+ else return Standard_False;
+
+ case GeomAbs_Cone :
+
+ if (S2.GetType() == GeomAbs_Plane) {
+ if (ctyp != GeomAbs_Circle) return Standard_False;
+ else if (S2.Plane().Axis().Direction().
+ IsParallel(S1.Cone().Axis().Direction(),
+ Precision::Angular()))
+ return Standard_True;
+ else return Standard_False;
+
}
+ else return Standard_False;
+
+ case GeomAbs_Sphere :
+ /*
+ if (S2.GetType() == GeomAbs_Plane) {
+ if (!Constant) return Standard_False;
+ else if (S2.Plane().Axis().Direction().
+ IsParallel(S1.Sphere().Position().Axis().Direction(),
+ Precision::Angular()))
+ return Standard_True;
+ else return Standard_False;
+ }
+ else return Standard_False;
+ */
+ return Standard_False;
+ case GeomAbs_Torus :
+ /*
+ if (S2.GetType() == GeomAbs_Plane) {
+ if (!Constant) return Standard_False;
+ else if (S2.Plane().Axis().Direction().
+ IsParallel(S1.Torus().Axis().Direction(),
+ Precision::Angular()))
+ return Standard_True;
+ else return Standard_False;
+ }
+ else return Standard_False;
+ */
+ return Standard_False;
+ default:
+ return Standard_False;
}
- else if(aST2==GeomAbs_Cone) {
- const gp_Dir& aD1=aS1.Plane().Axis().Direction();
- const gp_Dir& aD2=aS2.Cone().Axis().Direction();
- if (aCT == GeomAbs_Circle && aD1.IsParallel(aD2, aPA)) {
- return bRet;
- }
- }
- return !bRet;
+ return Standard_False;
}
-//modified by NIZNHY-PKV Wed Dec 15 11:22:43 2010t
+
+
//=======================================================================
//function : BoundFac
-//purpose : Resize les bornes d une surface au voisinage de la boite
-// donnee. Utile pour les intersections dont on connait les
-// extremites.
+//purpose : Resize the limits of surface adjacent to the given box
+// Useful for intersections with known extremities.
//=======================================================================
+
void ChFi3d_BoundFac(BRepAdaptor_Surface& S,
const Standard_Real uumin,
const Standard_Real uumax,
}
//=======================================================================
//function : ChFi3d_BoundSrf
-//purpose : Resize les bornes d une surface au voisinage de la boite
-// donnee. Utile pour les intersections dont on connait les
-// extremites.
+//purpose : Resize the limits of surface adjacent to the given box
+// Useful for intersections with known extremities.
//=======================================================================
+
void ChFi3d_BoundSrf(GeomAdaptor_Surface& S,
const Standard_Real uumin,
const Standard_Real uumax,
Standard_Real peru=0, perv=0;
if(surface->IsUPeriodic()) {
peru = surface->UPeriod();
+// if((umax - umin) > (0.5 * peru)) {
+// umin = uumax - peru;
+// umax = peru - (uumax - uumin);
+// }
}
if(surface->IsVPeriodic()) {
perv = surface->VPeriod();
+// if((vmax - vmin) > (0.5 * perv)) {
+// vmin = vvmax - perv;
+// vmax = perv - (vvmax - vvmin);
+// }
}
Standard_Real Stepu = umax - umin;
Standard_Real Stepv = vmax - vmin;
- //On table sur le fait que la boite uv est non nulle dans
- //une des directions au moins.
+ //It is supposed that box uv is not null in at least
+ //one direction.
Standard_Real scalu = S.UResolution(1.);
Standard_Real scalv = S.VResolution(1.);
}
S.Load(surface,uu1,uu2,vv1,vv2);
}
+
//=======================================================================
//function : ChFi3d_InterPlaneEdge
//purpose :
//=======================================================================
+
Standard_Boolean ChFi3d_InterPlaneEdge (Handle(Adaptor3d_HSurface)& Plan,
Handle(Adaptor3d_HCurve)& C,
Standard_Real& W,
isol = iip; W = CW;
}
else {
- if ( Sens && CW < W) {
- W = CW; isol = iip;
- }
- else if (!Sens && CW > W) {
- W = CW; isol = iip;
- }
+ if ( Sens && CW < W) {W = CW; isol = iip;}
+ else if (!Sens && CW > W) {W = CW; isol = iip;}
}
}
}
if(isol == 0) return Standard_False;
return Standard_True;
}
+
//=======================================================================
//function : ExtrSpineCarac
//purpose :
//=======================================================================
+
void ChFi3d_ExtrSpineCarac(const TopOpeBRepDS_DataStructure& DStr,
const Handle(ChFiDS_Stripe)& cd,
const Standard_Integer i,
const Standard_Integer sens,
gp_Pnt& P,
gp_Vec& V,
- Standard_Real& R)
- //voir s il ne faudrait pas rajouter D1,D2 et DR
+ Standard_Real& R) //check if it is necessary to add D1,D2 and DR
{
- // Attention pour les surfaces approximees on assume que
- // le parametrage de la pcurve est le meme que celui de
- // l elspine qui a servi a la construction.
+ // Attention for approximated surfaces it is assumed that e
+ // the parameters of the pcurve are the same as of
+ // elspine used for its construction.
const Handle(Geom_Surface)& fffil =
DStr.Surface(cd->SetOfSurfData()->Value(i)->Surf()).Surface();
gp_Pnt2d pp = cd->SetOfSurfData()->Value(i)->Interference(jf).
V.Normalize();
if(sens == 1) V.Reverse();
}
+
//=======================================================================
//function : ChFi3d_CircularSpine
-//purpose : Calcule une ligne guide ciculaire pour le du coin a partir
-// des points et vecteurs tangents calcules aux extremites des
-// lignes guides des conges deb et fin.
+//purpose : Calculate a cicular guideline for the corner created from
+// tangent points and vectors calculated at the extremities
+// of guidelines of start and end fillets.
//=======================================================================
Handle(Geom_Circle) ChFi3d_CircularSpine(Standard_Real& WFirst,
Standard_Real& WLast,
WLast = dddeb.Angle(ddfin);
return new Geom_Circle(ccc);
}
-
+#ifdef DEB
+ else {
+ cout <<"Construction de la ligne guide du coin impossible"<<endl;
+ }
+#endif
return Handle(Geom_Circle)();
}
+
//=======================================================================
//function : ChFi3d_Spine
-//purpose : Calcule les poles de la ligne guide du coin a partir des
-// points et vecteurs tangents calcules aux extremites des
-// lignes guides des conges deb et fin.
+//purpose : Calculates the poles of the guideline for the corner from
+// tangent points and vectors calculated at the extremities of
+// guidelines of start and end fillets.
//=======================================================================
+
Handle(Geom_BezierCurve) ChFi3d_Spine(const gp_Pnt& pd,
gp_Vec& vd,
const gp_Pnt& pf,
pol(3).SetCoord(pf.X()+vf.X(),pf.Y()+vf.Y(),pf.Z()+vf.Z());
return new Geom_BezierCurve(pol);
}
+
//=======================================================================
//function : IsInFront
-//purpose : regarde si les surfdata i1 et i2 sont en vis a vis
+//purpose : Checks if surfdata i1 and i2 are face to face
//=======================================================================
+
Standard_Boolean ChFi3d_IsInFront(TopOpeBRepDS_DataStructure& DStr,
const Handle(ChFiDS_Stripe)& cd1,
const Handle(ChFiDS_Stripe)& cd2,
OrFace2 = DStr.Shape(fd2->Index(jf2)).Orientation();
visavis = Standard_True;
sameside = ChFi3d::SameSide(Or,OrSave1,OrSave2,OrFace1,OrFace2);
- // On ne detrompe plus a l'aide des parametres de l'autre cote ca posait des problemes.
+ // The parameters of the other side are not used for orientation. This would raise problems
Standard_Integer kf1 = jf1, kf2 = jf2;
Standard_Real pref1 = fd1->Interference(kf1).Parameter(isf1);
Standard_Real pref2 = fd2->Interference(kf2).Parameter(isf2);
OrFace2 = DStr.Shape(fd2->Index(jf2)).Orientation();
visavis = Standard_True;
sameside = ChFi3d::SameSide(Or,OrSave1,OrSave2,OrFace1,OrFace2);
- // On ne detrompe plus a l'aide des parametres de l'autre cote ca posait des problemes.
+ // The parameters of the other side are not used for orientation. This would raise problems
Standard_Integer kf1 = jf1, kf2 = jf2;
Standard_Real pref1 = fd1->Interference(kf1).Parameter(isf1);
Standard_Real pref2 = fd2->Interference(kf2).Parameter(isf2);
u1 = p1; u2 = p2; ss = sameside; j1 = jf1; j2 = jf2; ff = face;
}
}
- //on rajoute ces re-initialisations au cas ou p1,... auraient pris des valeurs fausses
+ //the re-initialization is added in case p1,... take wrong values
else if (ok) {
p1 = u1; p2 = u2; sameside = ss; jf1 = j1; jf2 = j2; face = ff;
}
OrFace2 = DStr.Shape(fd2->Index(jf2)).Orientation();
visavis = Standard_True;
sameside = ChFi3d::SameSide(Or,OrSave1,OrSave2,OrFace1,OrFace2);
- // On ne detrompe plus a l'aide des parametres de l'autre cote.
+ // The parameters of the other side are not used for orientation.
Standard_Integer kf1 = jf1, kf2 = jf2;
Standard_Real pref1 = fd1->Interference(kf1).Parameter(isf1);
Standard_Real pref2 = fd2->Interference(kf2).Parameter(isf2);
u1 = p1; u2 = p2; ss = sameside; j1 = jf1; j2 = jf2; ff = face;
}
}
- //on rajoute ces re-initialisations au cas ou p1,... auraient pris des valeurs fausses
+ //the re-initialization is added in case p1,... take wrong values
else if (ok) {
p1 = u1; p2 = u2; sameside = ss; jf1 = j1; jf2 = j2; face = ff;
}
OrFace2 = DStr.Shape(fd2->Index(jf2)).Orientation();
visavis = Standard_True;
sameside = ChFi3d::SameSide(Or,OrSave1,OrSave2,OrFace1,OrFace2);
- // On ne detrompe plus a l'aide des parametres de l'autre cote.
+ // The parameters of the other side are not used for orientation.
Standard_Integer kf1 = jf1, kf2 = jf2;
Standard_Real pref1 = fd1->Interference(kf1).Parameter(isf1);
Standard_Real pref2 = fd2->Interference(kf2).Parameter(isf2);
u1 = p1; u2 = p2; ss = sameside; j1 = jf1; j2 = jf2; ff = face;
}
}
- //on rajoute ces re-initialisations au cas ou p1,... auraient pris des valeurs fausses
+ //the re-initialization is added in case p1,... take wrong values
else if (ok) {
p1 = u1; p2 = u2; sameside = ss; jf1 = j1; jf2 = j2; face = ff;
}
}
return ok;
+
}
-//=======================================================================
-//function : recadre
-//purpose :
-//=======================================================================
+
static Standard_Real recadre(const Standard_Real p,
const Standard_Real ref,
const Standard_Integer sens,
const Standard_Real pp = p + (sens > 0 ? (first - last) : (last - first));
return ((Abs(pp - ref) < Abs(p - ref))? pp : p);
}
-//=======================================================================
-//function : ChFi3d_IntTraces
-//purpose :
-//=======================================================================
+
Standard_Boolean ChFi3d_IntTraces(const Handle(ChFiDS_SurfData)& fd1,
const Standard_Real pref1,
Standard_Real& p1,
{
Geom2dAdaptor_Curve C1;
Geom2dAdaptor_Curve C2;
- // on aggrandit les pcurves pour etre sur qu'il y a intersection
- // par ailleurs on prend la totalite des courbes periodiques, on
- // triera les points sur celles-ci avec un critere specifique.
+ // pcurves are enlarged to be sure that there is intersection
+ // additionally all periodic curves are taken and points on
+ // them are filtered using a specific criterion.
Standard_Real first,last,delta = 0.;
first = fd1->Interference(jf1).FirstParameter();
if (!Intersection.IsEmpty()) {
nbseg = Intersection.NbSegments();
if ( nbseg > 0 ) {
+#ifdef DEB
+ cout<< "segments of intersection on restrictions"<<endl;
+#endif
}
nbpt = Intersection.NbPoints();
if ( nbpt >= 1 ) {
- // On manque de billes pour trier les points trouves de facon
- // rigoureuse. On adopte donc deux criteres differents un peu
- // arbitraires :
- // - courbes periodiques : le plus proche de la borne.
- // - courbes non periodiques : le plus a gauche sur les 2 courbes
- // modulo sens1 et sens2
+ // The criteria sets to filter the found points in a strict way
+ // are missing. Two different criterions chosen somewhat randomly
+ // are used :
+ // - periodic curves : closest to the border.
+ // - non-periodic curves : the closest to the left of 2 curves
+ // modulo sens1 and sens2
int2d = Intersection.Point(1);
p2d = int2d.Value();
p1 = int2d.ParamOnFirst();
p2 = int2d.ParamOnSecond();
p2d = int2d.Value();
}
- // Modified by skv - Mon Jun 16 15:51:21 2003 OCC615 Begin
+// Modified by skv - Mon Jun 16 15:51:21 2003 OCC615 Begin
else if (Check2dDistance &&
RefP2d.Distance(int2d.Value()) < RefP2d.Distance(p2d)) {
Standard_Real pp2 = int2d.ParamOnSecond();
p2 = pp2;
p2d = int2d.Value();
}
- // Modified by skv - Mon Jun 16 15:51:22 2003 OCC615 End
+// Modified by skv - Mon Jun 16 15:51:22 2003 OCC615 End
}
else if(isper2) {
Standard_Real pp2 = int2d.ParamOnSecond();
p1 = int2d.ParamOnFirst();
p2d = int2d.Value();
}
- // Modified by skv - Mon Jun 16 15:51:21 2003 OCC615 Begin
+// Modified by skv - Mon Jun 16 15:51:21 2003 OCC615 Begin
else if (Check2dDistance &&
RefP2d.Distance(int2d.Value()) < RefP2d.Distance(p2d)) {
Standard_Real pp1 = int2d.ParamOnFirst();
p2 = pp2;
p2d = int2d.Value();
}
- // Modified by skv - Mon Jun 16 15:51:22 2003 OCC615 End
+// Modified by skv - Mon Jun 16 15:51:22 2003 OCC615 End
}
else if(((int2d.ParamOnFirst() - p1)*sens1 < 0.) &&
((int2d.ParamOnSecond() - p2)*sens2 < 0.)) {
}
else { return Standard_False; }
}
+
//=======================================================================
//function : Coefficient
//purpose :
DU = (DD*CC-EE*BB)/Delta;
DV = (AA*EE-BB*DD)/Delta;
}
+
//=======================================================================
//function : ReparamPcurv
//purpose : Dans le cas ou la pcurve est une BSpline on verifie
// ses parametres et on la reparametre eventuellement.
//=======================================================================
+
void ChFi3d_ReparamPcurv(const Standard_Real Uf,
const Standard_Real Ul,
Handle(Geom2d_Curve)& Pcurv)
}
Pcurv = pc;
}
+
//=======================================================================
//function : ProjectPCurv
-//purpose : Calcul la pcurve correspondant a une ligne d intersection
-// 3d. Ne doit etre appele que dans les cas analytiques.
+//purpose : Calculation of the pcurve corresponding to a line of intersection
+// 3d. Should be called only in analytic cases.
//=======================================================================
+
void ChFi3d_ProjectPCurv(const Handle(Adaptor3d_HCurve)& HCg,
const Handle(Adaptor3d_HSurface)& HSg,
Handle(Geom2d_Curve)& Pcurv,
}
}
}
+
//=======================================================================
//function : CheckSameParameter
-//purpose : Controle a posteriori que sameparameter a bien fait son boulot
+//purpose : Controls a posteriori that sameparameter worked well
//=======================================================================
-Standard_Boolean ChFi3d_CheckSameParameter (const Handle(Adaptor3d_HCurve)& C3d,
- Handle(Geom2d_Curve)& Pcurv,
- const Handle(Adaptor3d_HSurface)& S,
- const Standard_Real tol3d,
- Standard_Real& tolreached)
+
+Standard_Boolean ChFi3d_CheckSameParameter
+(const Handle(Adaptor3d_HCurve)& C3d,
+ Handle(Geom2d_Curve)& Pcurv,
+ const Handle(Adaptor3d_HSurface)& S,
+ const Standard_Real tol3d,
+ Standard_Real& tolreached)
{
tolreached = 0.;
Standard_Real f = C3d->FirstParameter();
tolreached = Max(tolreached,Precision::Confusion());
return Standard_True;
}
+
//=======================================================================
//function : SameParameter
-//purpose : Encapsulation de Sameparameter
+//purpose : Encapsulation of Sameparameter
//=======================================================================
+
Standard_Boolean ChFi3d_SameParameter(const Handle(Adaptor3d_HCurve)& C3d,
Handle(Geom2d_Curve)& Pcurv,
const Handle(Adaptor3d_HSurface)& S,
Approx_SameParameter sp(C3d,Pcurv,S,tol3d);
if(sp.IsDone() && !sp.IsSameParameter()) Pcurv = sp.Curve2d();
else if(!sp.IsDone() && !sp.IsSameParameter()) {
+#ifdef DEB
+ cout<<"echec SameParameter"<<endl;
+#endif
return Standard_False;
}
tolreached = sp.TolReached();
+ if(tolreached > 1.1*tol3d) {
+#ifdef DEB
+ cout<<"SameParameter : Tol non atteinte!!!"<<endl;
+ cout<<"tol visee : "<<tol3d<<" tol obtenue : "<<tolreached<<endl;
+#endif
+ }
return Standard_True;
}
+
//=======================================================================
//function : SameParameter
//purpose : Encapsulation de Sameparameter
//=======================================================================
+
Standard_Boolean ChFi3d_SameParameter(const Handle(Geom_Curve)& C3d,
Handle(Geom2d_Curve)& Pcurv,
const Handle(Geom_Surface)& S,
/*szv:static*/ Handle(GeomAdaptor_HCurve) hc(new GeomAdaptor_HCurve(C3d,Pardeb,Parfin));
return ChFi3d_SameParameter(hc,Pcurv,hs,tol3d,tolreached);
}
+
//=======================================================================
//function : ComputePCurv
-//purpose : Calcule une droite eventuellement sous forme de BSpline
-// pour garantir le range et le parametrage identique
-// a une courbe 3d de reference.
+//purpose : Calculates a straight line in form of BSpline
+// to guarantee the same range and parameters as of the
+// reference 3D curve.
//=======================================================================
+
void ChFi3d_ComputePCurv(const Handle(Adaptor3d_HCurve)& C3d,
const gp_Pnt2d& UV1,
const gp_Pnt2d& UV2,
const Standard_Boolean reverse)
{
ChFi3d_ComputePCurv(UV1,UV2,Pcurv,Pardeb,Parfin,reverse);
+
+#ifdef DEB
+ OSD_Chronometer ch;
+ ChFi3d_InitChron(ch);//initial improvement for ChFi3d_SameParameter
+#endif
+
ChFi3d_SameParameter(C3d,Pcurv,S,tol3d,tolreached);
+
+#ifdef DEB
+ ChFi3d_ResultChron(ch ,t_sameparam); // resulting improvement for ChFi3d_SameParameter
+#endif
+
}
+
//=======================================================================
//function : ComputePCurv
-//purpose : Calcule une droite eventuellement sous forme de BSpline
-// pour garantir le range et le parametrage identique
-// a une courbe 3d de reference.
+//purpose : Calculates a straight line in form of BSpline
+// to guarantee the same range and parameters as of the
+// reference 3D curve.
//=======================================================================
+
void ChFi3d_ComputePCurv(const Handle(Geom_Curve)& C3d,
const gp_Pnt2d& UV1,
const gp_Pnt2d& UV2,
/*szv:static*/ Handle(GeomAdaptor_HCurve) hc(new GeomAdaptor_HCurve(C3d,Pardeb,Parfin));
ChFi3d_ComputePCurv(hc,UV1,UV2,Pcurv,hs,Pardeb,Parfin,tol3d,tolreached,reverse);
}
+
//=======================================================================
//function : ComputePCurv
-//purpose : Calcule une droite eventuellement sous forme de BSpline
-// pour garantir le range.
+//purpose : Calculates a straight line in form of BSpline
+// to guarantee the same range.
//=======================================================================
+
void ChFi3d_ComputePCurv(const gp_Pnt2d& UV1,
const gp_Pnt2d& UV2,
Handle(Geom2d_Curve)& Pcurv,
}
Pcurv = new Geom2d_TrimmedCurve(Pcurv,Pardeb,Parfin);
}
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose :
-//=======================================================================
+
Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Adaptor3d_HSurface)& Fac,
Handle(Geom2d_Curve)& curv,
const Standard_Integer sens1,
curv = ChFi3d_BuildPCurve(Fac,pfac1,v1,pfac2,v2,Standard_False);
return ChFi3d_mkbound(Fac,curv,t3d,ta);
}
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose :
-//=======================================================================
+
Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Adaptor3d_HSurface)& Surf,
Handle(Geom2d_Curve)& curv,
const Standard_Integer sens1,
curv = ChFi3d_BuildPCurve(Surf,p1,v1,p2,v2);
return ChFi3d_mkbound(Surf,curv,t3d,ta);
}
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose :
-//=======================================================================
+
Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Geom_Surface)& s,
const gp_Pnt2d& p1,
const gp_Pnt2d& p2,
Handle(GeomAdaptor_HSurface) HS = new GeomAdaptor_HSurface(s);
return ChFi3d_mkbound(HS,p1,p2,t3d,ta,isfreeboundary);
}
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose :
-//=======================================================================
+
Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Adaptor3d_HSurface)& HS,
const gp_Pnt2d& p1,
const gp_Pnt2d& p2,
Handle(Geom2d_Curve) curv = new Geom2d_BezierCurve(pol);
return ChFi3d_mkbound(HS,curv,t3d,ta,isfreeboundary);
}
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose :
-//=======================================================================
+
Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Adaptor3d_HSurface)& HS,
const Handle(Geom2d_Curve)& curv,
const Standard_Real t3d,
}
return new GeomFill_BoundWithSurf(COnS,t3d,ta);
}
-//=======================================================================
-//function : ChFi3d_mkbound
-//purpose :
-//=======================================================================
+
Handle(GeomFill_Boundary) ChFi3d_mkbound(const Handle(Adaptor3d_HSurface)& Fac,
Handle(Geom2d_Curve)& curv,
const gp_Pnt2d& p1,
curv = new Geom2d_BezierCurve(pol);
return ChFi3d_mkbound(Fac,curv,t3d,ta,isfreeboundary);
}
-//=======================================================================
-//function : ChFi3d_BuildPCurve
-//purpose :
-//=======================================================================
+
Handle(Geom2d_Curve) ChFi3d_BuildPCurve(const gp_Pnt2d& p1,
gp_Dir2d& d1,
const gp_Pnt2d& p2,
Lambda2 = Max(0.5*mref*Lambda2,1.e-5);
pol(3)=gp_Pnt2d(p2.XY()+Lambda2*d2.XY());
return new Geom2d_BezierCurve(pol);
+
+/*
+ //essai avec batten
+ Standard_Real h = 0.005*mref;
+ Standard_Real ang1,ang2;
+ ang1=dref.Angle(d1);
+ if (dref.Angle(d2) > 0) ang2=PI-dref.Angle(d2);
+ else ang2=-PI-dref.Angle(d2);
+ Standard_Real angmax = 0.5*PI;
+ if((Abs(ang1)>angmax)||(Abs(ang2)>angmax)) {
+ //On fait une cubique a la mords moi le noeud
+ TColgp_Array1OfPnt2d pol(1,4);
+ pol(1)=p1;
+ pol(4)=p2;
+ Standard_Real Lambda1 = Max(Abs(d2.Dot(d1)),Abs(dref.Dot(d1)));
+ Lambda1 = Max(0.5*mref*Lambda1,1.e-5);
+ pol(2) = gp_Pnt2d(p1.XY()+Lambda1*d1.XY());
+ Standard_Real Lambda2 = Max(Abs(d1.Dot(d2)),Abs(dref.Dot(d2)));
+ Lambda2 = Max(0.5*mref*Lambda2,1.e-5);
+ pol(3)=gp_Pnt2d(p2.XY()+Lambda2*d2.XY());
+ return new Geom2d_BezierCurve(pol);
+ }
+ else{
+ //On lance un Batten
+#ifdef DEB
+ OSD_Chronometer ch;
+ ChFi3d_InitChron(ch);// init performances pour les batten
+#endif
+ FairCurve_Batten Bat(p1,p2,h);
+ Bat.SetFreeSliding (Standard_True);
+ Bat.SetAngle1(ang1);
+ Bat.SetAngle2(ang2);
+ FairCurve_AnalysisCode Iana;
+ Standard_Real tol = 1.e-3;
+ Standard_Integer nbit;
+ Standard_Boolean ok;
+// nbit = 5;
+// ok = Bat.Compute(Iana,nbit,tol);
+ nbit = 25;
+ ok = Bat.Compute(Iana,nbit,tol);
+#ifdef DEB
+ ChFi3d_ResultChron( ch,t_batten); // result performances pour les batten
+#endif
+ if(!ok) Standard_Failure::Raise("Echec Batten");
+ return Bat.Curve();
+ }
+*/
}
-//=======================================================================
-//function : ChFi3d_BuildPCurve
-//purpose :
-//=======================================================================
+
Handle(Geom2d_Curve) ChFi3d_BuildPCurve(const Handle(Adaptor3d_HSurface)& Surf,
const gp_Pnt2d& p1,
const gp_Vec2d& v1,
}
return pc;
}
-//=======================================================================
-//function : ChFi3d_BuildPCurve
-//purpose :
-//=======================================================================
+
Handle(Geom2d_Curve) ChFi3d_BuildPCurve(const Handle(Adaptor3d_HSurface)& Surf,
const gp_Pnt2d& p1,
const gp_Vec& v1,
}
return ChFi3d_BuildPCurve(Surf,p1,vv1,p2,vv2,0);
}
+
//=======================================================================
//function : ComputeArete
//purpose :
-// pour les remplissages en s.d. un conge avec ces pcurves est construit ainsi
-// firstpoint sur S1 -------------edge:courbe3d/pcurves--->lastpoint sur S1
+// to fill with s.d. a fillet with pcurves constructed as follows
+// firstpoint on S1 -------------edge:curve3d/pcurves--->lastpoint on S1
// | |
// | |
// | |
-// edge:courbe 3d/pcurves conge edge
-// | attention il faut tester l orientation du conge avant|
-// | de determiner les transitions pcurves/conge |
+// edge:curve 3d/pcurves fillet edge
+// | attention it is necessary to test orientation of the fillet before|
+// | determining the transitions pcurves/fillet |
// | |
// \/ \/
// firstpoint sur S2 -------------edge:courbe3d/pcurves--->lastpoint sur S2
//
//=======================================================================
+
void ChFi3d_ComputeArete(const ChFiDS_CommonPoint& P1,
const gp_Pnt2d& UV1,
const ChFiDS_CommonPoint& P2,
else if (IFlag == 0) {
if (P1.IsVertex() || P2.IsVertex() || !P1.IsOnArc() || !P2.IsOnArc()) {
- // On construit une droite pour ne pas se tromper
- // d'arc et donc de tangente.
+ // A straight line is constructed to avoid
+ // arc and tangent.
TColgp_Array1OfPnt2d qoles(1,2);
qoles(1)=UV1;
qoles(2)=UV2;
C1.D1(P2.ParameterOnArc(),Pp,Vv2);
hs->ChangeSurface().Load(Surf);
Pcurv = ChFi3d_BuildPCurve(hs,UV1,Vv1,UV2,Vv2,Standard_True);
- // Il y a des cas ou la PCurve ainsi construite sort de la
- // surface, en particulier lorsque celle-ci provient d un
- // prolongement. On fait donc un controle a posteriori et
- // si ca sort on la remplace par la droite UV1 UV2, tant
- // pis pour la tangence avec les arcs voisins!!!
+ // There are some cases when PCurve constructed in this way
+ // leaves the surface, in particular if it results from an
+ // extension. A posteriori checking is required and if
+ // the curve leaves the surface it is replaced by straight line UV1 UV2
+ // non regarding the tangency with neighboring arcs!
Bnd_Box2d bs;
Standard_Real umin,umax,vmin,vmax;
Surf->Bounds(umin,umax,vmin,vmax);
}
}
}
+
//=======================================================================
//function : FilCurveInDS
//purpose :
//=======================================================================
+
+
Handle(TopOpeBRepDS_SurfaceCurveInterference) ChFi3d_FilCurveInDS
(const Standard_Integer Icurv,
const Standard_Integer Isurf,
Pcurv);
return SC1;
}
+
//=======================================================================
//function : TrsfTrans
//purpose :
//=======================================================================
TopAbs_Orientation ChFi3d_TrsfTrans(const IntSurf_TypeTrans T1)
{
- switch (T1) {
+ switch (T1)
+ {
case IntSurf_In: return TopAbs_FORWARD;
case IntSurf_Out: return TopAbs_REVERSED;
}
return TopAbs_INTERNAL;
}
+
//=======================================================================
//function : FilCommonPoint
-//purpose : Chargement du common point
-// gestion du fait que l'on est deja sur un vertex existant
+//purpose : Loading of the common point
+// management of the case when it happens on already existing vertex.
//=======================================================================
+
Standard_EXPORT void ChFi3d_FilCommonPoint(const BRepBlend_Extremity& SP,
const IntSurf_TypeTrans TransLine,
const Standard_Boolean Start,
// BRep_Tool Outil;
Standard_Real Dist, maxtol = Max(Tol,CP.Tolerance());
- CP.SetPoint(SP.Value()); // On commence par le point, le vecteur
+ CP.SetPoint(SP.Value()); // One starts with the point and the vector
if (SP.HasTangent()) {
if (Start) {
- CP.SetVector(SP.Tangent().Reversed()); // On oriente la tangente vers la sortie
+ CP.SetVector(SP.Tangent().Reversed()); // The tangent is oriented to the exit
}
else {
CP.SetVector(SP.Tangent());
}
}
- CP.SetParameter(SP.ParameterOnGuide()); //et le parametre de la spine
+ CP.SetParameter(SP.ParameterOnGuide()); // and the parameter of the spine
- if (SP.IsVertex()) { // On charge le Vertex si besoin est
- // (A l'interieur d'une face)
+ if (SP.IsVertex()) { // the Vertex is loaded if required
+ // (inside of a face)
TopoDS_Vertex V =
Handle(BRepTopAdaptor_HVertex)::DownCast(SP.Vertex())->Vertex();
//////////////////////////////////////////////
CP.SetPoint(BRep_Tool::Pnt(V));
- //la sequence d arcs l information est connu par le vertex (ancestor)
- //dans ce cas on ne calculera pas les transitions c est a ce programme
- //de le faire
+ //the sequence of arcs the information is known by thee vertex (ancestor)
+ //in this case the transitions are not computed, it is done by this program
}
- if (SP.NbPointOnRst() != 0) { // On charge un arc, et/ou un vertex
+ if (SP.NbPointOnRst() != 0) { // An arc, and/or a vertex is loaded
const BRepBlend_PointOnRst& PR = SP.PointOnRst(1);
Handle(BRepAdaptor_HCurve2d)
Dist = DistL; }
if (Dist <= maxtol + BRep_Tool::Tolerance(V[Index_min]) ) {
- // On tombe sur un vertex prexistant
- CP.SetVertex(V[Index_min]); //On Charge l'ancien vertex
+ // a prexisting vertex has been met
+ CP.SetVertex(V[Index_min]); //the old vertex is loaded
CP.SetPoint( BRep_Tool::Pnt(V[Index_min]) );
maxtol = Max(BRep_Tool::Tolerance(V[Index_min]),maxtol);
//// modified by jgv, 18.09.02 for OCC571 ////
//////////////////////////////////////////////
LeParamAmoi = BRep_Tool::Parameter(V[Index_min], E);
}
- else { // Creation d'un arc seul
+ else { // Creation of an arc only
maxtol = Max(BRep_Tool::Tolerance(E),maxtol);
maxtol = Max(SP.Tolerance(),maxtol);
LeParamAmoi = PR.ParameterOnArc();
}
- // Definition de l'arc
+ // Definition of the arc
TopAbs_Orientation Tr;
TopAbs_Orientation Or = E.Orientation();
if (Start) {
CP.SetArc(maxtol, E, LeParamAmoi, Tr);
}
}
- CP.SetTolerance(maxtol); // On finit par la tolerance.
+ CP.SetTolerance(maxtol); // Finally, the tolerance.
}
//=======================================================================
//function : SolidIndex
//purpose :
//=======================================================================
+
Standard_Integer ChFi3d_SolidIndex(const Handle(ChFiDS_Spine)& sp,
TopOpeBRepDS_DataStructure& DStr,
ChFiDS_Map& MapESo,
const Standard_Integer solidindex = DStr.AddShape(shellousolid);
return solidindex;
}
+
//=======================================================================
//function : IndexPointInDS
//purpose :
//=======================================================================
+
Standard_Integer ChFi3d_IndexPointInDS(const ChFiDS_CommonPoint& P1,
TopOpeBRepDS_DataStructure& DStr)
{
if (P1.IsVertex()) {
// ---------------------------------> !*!*!*
- // Attention : On se permet d'ecrabouiller la tolerance
- // il faudrait prevoir un mecanimse propre.
+ // Attention : it is necessary ti implement a mechanism
+ // controlling tolerance.
BRep_Builder B;
B.UpdateVertex(P1.Vertex(), P1.Point(), P1.Tolerance());
return DStr.AddShape(P1.Vertex());
}
return DStr.AddPoint(TopOpeBRepDS_Point(P1.Point(),P1.Tolerance()));
}
+
//=======================================================================
//function : FilPointInDS
//purpose :
//=======================================================================
-Handle(TopOpeBRepDS_CurvePointInterference)
- ChFi3d_FilPointInDS(const TopAbs_Orientation Et,
- const Standard_Integer Ic,
- const Standard_Integer Ip,
- const Standard_Real Par,
- const Standard_Boolean IsVertex)
+
+Handle(TopOpeBRepDS_CurvePointInterference) ChFi3d_FilPointInDS
+(const TopAbs_Orientation Et,
+ const Standard_Integer Ic,
+ const Standard_Integer Ip,
+ const Standard_Real Par,
+ const Standard_Boolean IsVertex)
{
Handle(TopOpeBRepDS_CurvePointInterference) CP1;
if (IsVertex)
TopOpeBRepDS_POINT,Ip,Par);
return CP1;
}
+
//=======================================================================
//function : FilVertexInDS
//purpose :
//=======================================================================
-Handle(TopOpeBRepDS_CurvePointInterference)
- ChFi3d_FilVertexInDS(const TopAbs_Orientation Et,
- const Standard_Integer Ic,
- const Standard_Integer Ip,
- const Standard_Real Par)
+
+Handle(TopOpeBRepDS_CurvePointInterference) ChFi3d_FilVertexInDS
+(const TopAbs_Orientation Et,
+ const Standard_Integer Ic,
+ const Standard_Integer Ip,
+ const Standard_Real Par)
{
Handle(TopOpeBRepDS_CurvePointInterference) CP1 = new
TopOpeBRepDS_VERTEX,Ip,Par);
return CP1;
}
+
//=======================================================================
//function : Orientation
-//purpose : retourne l'orientation d'une interference (la premiere trouvee
-// dans la liste).
+//purpose : returns the orientation of the interference (the first found
+// in the list).
//=======================================================================
-static Standard_Boolean
- ChFi3d_Orientation(const TopOpeBRepDS_ListOfInterference& LI,
- const Standard_Integer igros,
- const Standard_Integer ipetit,
- TopAbs_Orientation& Or,
- const Standard_Boolean isvertex = Standard_False,
- const Standard_Boolean aprendre = Standard_False)
+static Standard_Boolean ChFi3d_Orientation
+(const TopOpeBRepDS_ListOfInterference& LI,
+ const Standard_Integer igros,
+ const Standard_Integer ipetit,
+ TopAbs_Orientation& Or,
+ const Standard_Boolean isvertex = Standard_False,
+ const Standard_Boolean aprendre = Standard_False)
{
- //Dans le cas, ou on veux inserer un point/vertex, on desire savoir
- // si c'est un point ou un vertex, car leur index peuvent etre les memes.
+ //In case, when it is necessary to insert a point/vertex, it should be
+ //known if this is a point or a vertex, because their index can be the same.
TopOpeBRepDS_Kind typepetit;
if (isvertex)
typepetit = TopOpeBRepDS_VERTEX;
return Standard_False;
}
-//=======================================================================
+//====================================================================
//function : Contains
-//purpose : Verifie qu une interference n existe pas deja.
-//=======================================================================
-static Standard_Boolean
- ChFi3d_Contains(const TopOpeBRepDS_ListOfInterference& LI,
- const Standard_Integer igros,
- const Standard_Integer ipetit,
- const Standard_Boolean isvertex = Standard_False,
- const Standard_Boolean aprendre = Standard_False)
+//purpose : Check if the interference does not already exist.
+//====================================================================
+
+static Standard_Boolean ChFi3d_Contains
+(const TopOpeBRepDS_ListOfInterference& LI,
+ const Standard_Integer igros,
+ const Standard_Integer ipetit,
+ const Standard_Boolean isvertex = Standard_False,
+ const Standard_Boolean aprendre = Standard_False)
{
TopAbs_Orientation bidOr;
return ChFi3d_Orientation(LI,igros,ipetit,bidOr,isvertex,aprendre);
}
-//=======================================================================
-//function : QueryAddVertexInEdge
-//purpose :
-//=======================================================================
-static void QueryAddVertexInEdge(TopOpeBRepDS_ListOfInterference& LI,
- const Standard_Integer IC,
- const Standard_Integer IV,
- const Standard_Real par,
- const TopAbs_Orientation Or)
+
+static void QueryAddVertexInEdge
+( TopOpeBRepDS_ListOfInterference& LI,
+ const Standard_Integer IC,
+ const Standard_Integer IV,
+ const Standard_Real par,
+ const TopAbs_Orientation Or)
{
TopOpeBRepDS_ListIteratorOfListOfInterference it(LI);
for (; it.More(); it.Next() ) {
LI.Append(interf);
}
-//=======================================================================
-//function : CutEdge
-//purpose :
-//=======================================================================
static void CutEdge(const TopoDS_Vertex& V,
const Handle(ChFiDS_SurfData)& SD,
TopOpeBRepDS_DataStructure& DStr,
- const Standard_Boolean ,
+ const Standard_Boolean /*isfirst*/,
const Standard_Integer ons)
{
if(!SD->IsOnCurve(ons)) return;
E.Orientation(TopAbs_FORWARD);
TopExp_Explorer ex;
- // les traiter tous en verifiant que ce n est pas
- // deja fait.
+ // process them checking that it has not been done already.
for(ex.Init(E,TopAbs_VERTEX);ex.More();ex.Next()) {
const TopoDS_Vertex& vv = TopoDS::Vertex(ex.Current());
if(vv.IsSame(V)) {
}
}
}
+
//=======================================================================
//function : findIndexPoint
//purpose : returns in <ipon> index of point bounding a courve interfering
// with <Fd> and coinciding with last common point on <OnS> face
//=======================================================================
-static Standard_Boolean
- findIndexPoint(const TopOpeBRepDS_DataStructure& DStr,
- const Handle(ChFiDS_SurfData)& Fd,
- const Standard_Integer OnS,
- Standard_Integer& ipoin)
+
+static Standard_Boolean findIndexPoint(const TopOpeBRepDS_DataStructure& DStr,
+ const Handle(ChFiDS_SurfData)& Fd,
+ const Standard_Integer OnS,
+ Standard_Integer& ipoin)
{
ipoin = 0;
gp_Pnt P = Fd->Vertex(Standard_False,OnS).Point();
}
return Standard_False;
}
+// *******************************************************************
//=======================================================================
//function : FilDS
//purpose :
//=======================================================================
+// *******************************************************************
+
void ChFi3d_FilDS(const Standard_Integer SolidIndex,
const Handle(ChFiDS_Stripe)& CorDat,
TopOpeBRepDS_DataStructure& DStr,
TopOpeBRepDS_ListOfInterference& SolidInterfs =
DStr.ChangeShapeInterferences(SolidIndex);
- ChFiDS_Regul regcout; // pour les CD closed and tangent
- ChFiDS_Regul regfilfil; // pour les joints Surf/Surf
+ ChFiDS_Regul regcout; // for closed and tangent CD
+ ChFiDS_Regul regfilfil; // for connections Surf/Surf
ChFiDS_CommonPoint V3;
ChFiDS_CommonPoint V4;
if (FiLen > Precision::PConfusion()) continue;
TopOpeBRepDS_Curve& cc = DStr.ChangeCurve(IcFil1);
cc.ChangeCurve().Nullify();
-
+#ifdef DEB
+ cout << "Nullify degenerated FI of SurfData " << j <<" on S" << onS << endl;
+#endif
// care of CommonPoint, eap occ354
if (j!=1 && j!=SeqFil.Length()) continue;
Standard_Boolean isfirst = (j==1);
isInDS1 = isInDS1 || SeqFil.Length()-j+1 < CorDat->IsInDS(Standard_False);
}
- // creation de la SolidSurfaceInterference
+ // creation of SolidSurfaceInterference
Handle(TopOpeBRepDS_SolidSurfaceInterference)
SSI = new TopOpeBRepDS_SolidSurfaceInterference
const ChFiDS_CommonPoint& V1 = Fd->VertexFirstOnS1();
const ChFiDS_CommonPoint& V2 = Fd->VertexFirstOnS2();
- // Un petit traitement pour gerer les interference doubles
+ // Processing to manage double interferences
if (j>1) {
if (V1.IsOnArc() && V3.IsOnArc() && V1.Arc().IsSame(V3.Arc())) {
- //on initialise Iarc1
+ //Iarc1 is initialized
//Iarc1 = DStr.AddShape(V1.Arc());
if (ChFi3d_Contains(DStr.ShapeInterferences(Iarc1),Iarc1,Ipoin1) &&
(V1.TransitionOnArc() != V3.TransitionOnArc()) ) {
}
if (V2.IsOnArc() && V4.IsOnArc() && V2.Arc().IsSame(V4.Arc())) {
- //on initialise Iarc2
+ //Iarc2 is initialized
//Iarc2 = DStr.AddShape(V2.Arc());
if ( ChFi3d_Contains(DStr.ShapeInterferences(Iarc2),Iarc2,Ipoin2) &&
(V2.TransitionOnArc() != V4.TransitionOnArc()) ) {
ET1 = TopAbs::Reverse(trafil1);
- // Un petit paragraphe pour traiter les contacts aretes qui touchent
- // un vertex de l'obstacle.
+ // A small paragraph to process contacts of edges, which touch
+ // a vertex of the obstacle.
if(V1.IsVertex() && Fd->IsOnCurve1()) {
const TopoDS_Vertex& vv1 = V1.Vertex();
CutEdge(vv1,Fd,DStr,1,1);
Singulier_en_Bout = (V1.Point().IsEqual(V2.Point(), 0));
if (Singulier_en_Bout) {
- // Queue de Billard
if ((!V1.IsVertex()) || (!V2.IsVertex())) {
-
+#if DEB
+ cout << "Singularity at end out of vertex " << endl;
+#endif
}
else {
- isVertex1 = isVertex2 = Standard_True; //precaution...
- // On elimine l'arete de la spine debouchant sur ce vertex.
+ isVertex1 = isVertex2 = Standard_True; //caution...
+ // The edge is removed from spine starting on this vertex.
TopoDS_Edge Arcspine = spine->Edges(1);
BoutdeVtx = V1.Vertex();
Standard_Integer IArcspine = DStr.AddShape(Arcspine);
Standard_Integer IVtx = CorDat->IndexFirstPointOnS1();
-
- TopAbs_Orientation OVtx = TopAbs_FORWARD;;
-
+#ifndef DEB
+ TopAbs_Orientation OVtx = TopAbs_FORWARD;
+#else
+ TopAbs_Orientation OVtx;
+#endif
for(ex.Init(Arcspine.Oriented(TopAbs_FORWARD),TopAbs_VERTEX);
ex.More(); ex.Next()) {
if(BoutdeVtx.IsSame(ex.Current())) {
TCurv.SetSCI(Interfc1,bidinterf);
}
}
- } // Fin du Traitement Initial (j==1)
+ } // End of the Initial Processing (j==1)
else {
- // ---- Interference entre Conges ------
+ // ---- Interference between Fillets ------
if (!isInDS1) {// eap, Apr 29 2002, occ 293
if (Degene && isVertex1) {
- // On elimine l'arete de la spine debouchant sur ce vertex.
- NumEdge++; // On a dejas trouve l'arete precedente du vertex
+ // The edge is removed from the spine starting on this vertex.
+ NumEdge++; // The previous edge of the vertex has already been found.
TopoDS_Edge Arcspine = spine->Edges(NumEdge);
Standard_Integer IArcspine = DStr.AddShape(Arcspine);
Standard_Integer IVtx = DStr.AddShape(BoutdeVtx);
+#ifndef DEB
TopAbs_Orientation OVtx = TopAbs_FORWARD;
+#else
+ TopAbs_Orientation OVtx;
+#endif
for(ex.Init(Arcspine.Oriented(TopAbs_FORWARD),TopAbs_VERTEX);
ex.More(); ex.Next()) {
if(BoutdeVtx.IsSame(ex.Current())) {
Handle(TopOpeBRepDS_CurvePointInterference)
interfv = ChFi3d_FilVertexInDS(OVtx,IArcspine,IVtx,parVtx);
DStr.ChangeShapeInterferences(IArcspine).Append(interfv);
- } // Fin de l'elimination
+ } // End of the removal
gp_Pnt2d UV1 = Fd->InterferenceOnS1().PCurveOnSurf()->
Value(Fd->InterferenceOnS1().FirstParameter());
Value(Fd->InterferenceOnS2().FirstParameter());
TopOpeBRepDS_Curve& TCurv = DStr.ChangeCurve(Icurv);
if (Degene) {
- // on associe la pcurve via la SCI a la TopOpeBRepDSCurve.
+ // pcurve is associated via SCI to TopOpeBRepDSCurve.
ChFi3d_ComputePCurv(UV1,UV2,PCurv,Pardeb,Parfin);
Interfc1= ChFi3d_FilCurveInDS (Icurv,Isurf,PCurv,ET1);
DStr.ChangeSurfaceInterferences(Isurf).Append(Interfc1);
DStr.ChangeSurfaceInterferences(Isurf).Append(Interfc1);
}
}
- } // Fin Interference entre conges
+ } // End of Interference between fillets
- // ---- Interference Conges / Faces
+ // ---- Interference Fillets / Faces
IcFil1 = Fi1.LineIndex();
if (IcFil1!=0 ) {
Fi1.PCurveOnSurf(),trafil1);
DStr.ChangeSurfaceInterferences(Isurf).Append(Interfc3);
Ishape1 = Fd->IndexOfS1();
- // Cas d arete degeneree : on associe la pcurve via la SCI
- // a la TopOpeBRepDSCurve.
+ // Case of degenerated edge : pcurve is associated via SCI
+ // to TopOpeBRepDSCurve.
TopOpeBRepDS_Curve& cc = DStr.ChangeCurve(IcFil1);
if(cc.Curve().IsNull()) {
Handle(TopOpeBRepDS_Interference) bidinterf;
}
reglist.Append(regon1);
}
- // Indice et type du point en Fin
+ // Indice and type of the point at End
Standard_Integer ipoin;
Standard_Boolean isVertex = Fd->VertexLastOnS1().IsVertex();
if (j == SeqFil.Length()) ipoin = CorDat->IndexLastPointOnS1();
SeqFil(1)->VertexFirstOnS1().Point(), 1.e-7)) ||
(Fd->VertexLastOnS1().Point().IsEqual(
SeqFil(SeqFil.Length())->VertexLastOnS1().Point(), 1.e-7))) )
- // Cas des SurfData coupe de facon "Triangulaire"
+ // Case of SurfData cut in "Triangular" way.
ipoin=CorDat->IndexLastPointOnS1();
// eap, Apr 29 2002, occ 293
else if (isInDS2 && findIndexPoint(DStr, Fd, 1, ipoin)) {
-
+#ifdef DEB
+ cout << "ChFi3d_FilDS: point " << ipoin <<" is found in DS" << endl;
+#endif
}
else ipoin = ChFi3d_IndexPointInDS(Fd->VertexLastOnS1(),DStr);
TopOpeBRepDS_ListOfInterference& Li = DStr.ChangeCurveInterferences(IcFil1);
-
+#ifdef DEB
+ if (!Li.IsEmpty())
+ cout<<"FilDS : Tangency line on several SurfData"<< endl;
+#endif
if (!ChFi3d_Contains(Li,IcFil1,Ipoin1)) {
Interfp1 = ChFi3d_FilPointInDS(TopAbs_FORWARD,IcFil1,Ipoin1,
Fi2.PCurveOnSurf(),trafil2);
DStr.ChangeSurfaceInterferences(Isurf).Append(Interfc4);
Ishape2 = Fd->IndexOfS2();
- // Cas d arete degeneree : on associe la pcurve via la SCI
- // a la TopOpeBRepDSCurve.
+ // Case of degenerated edge : pcurve is associated via SCI
+ // to TopOpeBRepDSCurve.
TopOpeBRepDS_Curve& cc = DStr.ChangeCurve(IcFil2);
if(cc.Curve().IsNull()) {
Handle(TopOpeBRepDS_Interference) bidinterf;
}
reglist.Append(regon2);
}
- // Indice et type du point en Fin
+ // Indice and type of the point in End
Standard_Integer ipoin;
Standard_Boolean isVertex = Fd->VertexLastOnS2().IsVertex();
if (j == SeqFil.Length() ) ipoin = CorDat->IndexLastPointOnS2();
isVertex = isVertex2;
}
else if(Fd->VertexLastOnS2().Point().IsEqual(
- Fd->VertexLastOnS1().Point(), 0) ) { //Pincement !!
+ Fd->VertexLastOnS1().Point(), 0) ) { //Pinch !!
ipoin = Ipoin1;
isVertex = isVertex1;
}
SeqFil(1)->VertexFirstOnS2().Point(), 1.e-7)) ||
(Fd->VertexLastOnS2().Point().IsEqual(
SeqFil(SeqFil.Length())->VertexLastOnS2().Point(), 1.e-7))) )
- // Cas des SurfData coupe de facon "Triangulaire"
+ // Case of SurfData cut in "Triangular" way.
ipoin=CorDat->IndexLastPointOnS2();
// eap, Apr 29 2002, occ 293
else if (isInDS2 && findIndexPoint(DStr, Fd, 2, ipoin)) {
-
+#ifdef DEB
+ cout << "ChFi3d_FilDS: point " << ipoin <<" is found in DS" << endl;
+#endif
}
else ipoin = ChFi3d_IndexPointInDS(Fd->VertexLastOnS2(),DStr);
TopOpeBRepDS_ListOfInterference& Li = DStr.ChangeCurveInterferences(IcFil2);
-
+#ifdef DEB
+ if (!Li.IsEmpty())
+ cout<<"FilDS : Tangency line on several SurfData"<< endl;
+#endif
if (!ChFi3d_Contains(Li,IcFil2,Ipoin2)) {
Interfp2 = ChFi3d_FilPointInDS(TopAbs_FORWARD,IcFil2,Ipoin2,
Fi2.FirstParameter(), isVertex2);
Degene = V3.Point().IsEqual(V4.Point(), 0);
- // Traitement des cas degenere
+ // Processing of degenerated case
if (Degene) {
- // Queue de Billard
Standard_Boolean Vertex = (V3.IsVertex()) && (V4.IsVertex());
if (!Vertex) {
-
+#if DEB
+ if (j == SeqFil.Length()) {
+ cout << " Singularity at the end is out of vertex " << endl;
+ }
+#endif
}
else {
- // On elimine l'arete de la spine debouchant sur ce vertex.
+ // The edge of the spine starting on this vertex is removed.
Standard_Boolean Trouve = Standard_False;
TopoDS_Edge Arcspine;
+#ifndef DEB
TopAbs_Orientation OVtx = TopAbs_FORWARD;
+#else
+ TopAbs_Orientation OVtx;
+#endif
BoutdeVtx = V3.Vertex();
while (NumEdge<= spine->NbEdges() && !Trouve) {
else Trouve = Standard_True;
}
}
- if (!Trouve) NumEdge++; // On passe a l'arete suivante
+ if (!Trouve) NumEdge++; // Go to the next edge
}
Standard_Integer IArcspine = DStr.AddShape(Arcspine);
Standard_Integer IVtx;
interfv = ChFi3d_FilVertexInDS(OVtx,IArcspine,IVtx,parVtx);
DStr.ChangeShapeInterferences(IArcspine).Append(interfv);
}
- } // fin du cas Degene
+ } // end of degenerated case
else if (!(Closed && j == SeqFil.Length())) {
- // Traitement des interference Point / Edges
+ // Processing of interference Point / Edges
if (V3.IsOnArc()) {
if(!(V3.IsVertex() && Fd->IsOnCurve1())) {
Iarc1 = DStr.AddShape(V3.Arc());
}
}
}
+
//=======================================================================
//function : StripeEdgeInter
//purpose : This function examines two stripes for an intersection
// this function will become useless.
//author : akm, 06/02/02. Against bug OCC119.
//=======================================================================
+
void ChFi3d_StripeEdgeInter (const Handle(ChFiDS_Stripe)& theStripe1,
const Handle(ChFiDS_Stripe)& theStripe2,
TopOpeBRepDS_DataStructure& /*DStr*/,
//function : IndexOfSurfData
//purpose :
//=======================================================================
+
Standard_Integer ChFi3d_IndexOfSurfData(const TopoDS_Vertex& V1,
const Handle(ChFiDS_Stripe)& CD,
Standard_Integer& sens)
}
return Index;
}
+
//=======================================================================
//function : EdgeFromV1
//purpose :
}
return E;
}
+
+#ifdef DRAW
+//=======================================================================
+//function : drawline
+//purpose :
+//=======================================================================
+
+static void drawline(const Handle(IntSurf_LineOn2S)& lin)
+{
+ Handle(Draw_Marker3D) p3d;
+ Handle(Draw_Marker2D) p2d;
+ Handle(Draw_Marker2D) p2d2;
+
+ for(Standard_Integer i = 1; i <= lin->NbPoints(); i++) {
+ const IntSurf_PntOn2S& pt = lin->Value(i);
+ gp_Pnt point = pt.Value();
+ Standard_Real u,v,uu,vv;
+ pt.ParametersOnS1(u,v);
+ gp_Pnt2d point2d(u,v);
+ pt.ParametersOnS2(uu,vv);
+ gp_Pnt2d point2d2(uu,vv);
+ if(i == 1 || i == lin->NbPoints()) {
+ p3d = new Draw_Marker3D(point,Draw_Square,Draw_rouge);
+ p2d = new Draw_Marker2D(point2d,Draw_Square,Draw_rouge);
+ p2d2 = new Draw_Marker2D(point2d2,Draw_Square,Draw_rouge);
+ }
+ else {
+ p3d = new Draw_Marker3D(point,Draw_Square,Draw_jaune);
+ p2d = new Draw_Marker2D(point2d,Draw_Square,Draw_jaune);
+ p2d2 = new Draw_Marker2D(point2d2,Draw_Square,Draw_jaune);
+ }
+ dout<<p3d;
+ dout<<p2d;
+ dout<<p2d2;
+
+ dout.Flush();
+ }
+}
+#endif
+
//=======================================================================
//function : ConvTol2dToTol3d
-//purpose : Comme son nom l indique.
+//purpose :
//=======================================================================
Standard_Real ChFi3d_ConvTol2dToTol3d(const Handle(Adaptor3d_HSurface)& S,
Standard_Real vresto3d = 1.e-7*tol2d/vres;
return Max(uresto3d,vresto3d);
}
+
//=======================================================================
//function : EvalTolReached
-//purpose : Comme son nom l indique la fonction ci dessus etant trop
-// dure lorsque le parametrage des surfaces n est pas homogene.
+//purpose : The function above is too hard because
+// parametrization of surfaces is not homogenous.
//=======================================================================
Standard_Real ChFi3d_EvalTolReached(const Handle(Adaptor3d_HSurface)& S1,
//function : trsfsurf
//purpose :
//=======================================================================
+
Handle(Geom_Surface) trsfsurf(const Handle(Adaptor3d_HSurface)& HS,
Handle(Adaptor3d_TopolTool)& /*dom*/)
{
- //Pour l utilisation des domaines voir avec BUBUCH!!
Handle(Geom_Surface) res;
Handle(BRepAdaptor_HSurface) hbs = Handle(BRepAdaptor_HSurface)::DownCast(HS);
Handle(GeomAdaptor_HSurface) hgs = Handle(GeomAdaptor_HSurface)::DownCast(HS);
Standard_Real U1 = HS->FirstUParameter(), U2 = HS->LastUParameter();
Standard_Real V1 = HS->FirstVParameter(), V2 = HS->LastVParameter();
if(!res.IsNull()) {
- // Blindage contre les Construction Error intempestifs
+ // Protection against Construction Errors
Standard_Real u1, u2, v1, v2;
res->Bounds( u1, u2, v1, v2);
if (!res->IsUPeriodic()) {
// dom = new Adaptor3d_TopolTool(temp);
return res;
}
+
//=======================================================================
//function : CurveCleaner
-//purpose : Rend une BSpline le plus continue possible
-// a une tolerance donne
+//purpose : Makes a BSpline as much continued as possible
+// at a given tolerance
//=======================================================================
static void CurveCleaner(Handle(Geom_BSplineCurve)& BS,
const Standard_Real Tol,
const Standard_Integer NbK=BS->NbKnots();
for (Mult = BS->Degree(); Mult > MultMin; Mult--) {
- tol *= 0.5; // Reduction progressive
+ tol *= 0.5; // Progressive reduction
for (ii=NbK; ii>1; ii--) {
if (BS->Multiplicity(ii) == Mult)
BS->RemoveKnot(ii, Mult-1, tol);
}
}
}
+
//=======================================================================
//function : ComputeCurves
-//purpose : Calcule une intersection bornee entre deux HSurfaces.
-// Il faut connaitre les extremites de l intersection et
-// les surfaces doivent avoir ete retouchees en entree
-// pour encadrer au mieux (ni trop pres ni trop loin) les
-// points de debut et fin de l intersection.
-// Les intersections analytiques sont traitees a part.
-// <wholeCurv> means that resulting curve is restricted by
+//purpose : Calculates intersection between two HSurfaces.
+// It is necessary to know the extremities of intersection and
+// the surfaces should be processed at input
+// to fit as good as possible (neither too close nor too far)
+// the points of beginning and end of the intersection.
+// The analytic intersections are processed separately.
+// <wholeCurv> means that the resulting curve is restricted by
// boundaries of input surfaces (eap 30 May occ354)
//=======================================================================
+
Standard_Boolean ChFi3d_ComputeCurves(Handle(Adaptor3d_HSurface)& S1,
Handle(Adaptor3d_HSurface)& S2,
const TColStd_Array1OfReal& Pardeb,
gp_Pnt pdeb2 = S2->Value(Pardeb(3),Pardeb(4));
gp_Pnt pfin2 = S2->Value(Parfin(3),Parfin(4));
- Standard_Real distrefdeb = pdeb1.Distance(pdeb2);//mesure la solidite
- Standard_Real distreffin = pfin1.Distance(pfin2);//des donnees d entree
+ Standard_Real distrefdeb = pdeb1.Distance(pdeb2);//checks the worthiness
+ Standard_Real distreffin = pfin1.Distance(pfin2);//of input data
if(distrefdeb < tol3d) distrefdeb = tol3d;
if(distreffin < tol3d) distreffin = tol3d;
if(distref < distrefdeb) distref = distrefdeb;
if(distref < distreffin) distref = distreffin;
- //On traite a part quelques cas analytiques.
- //Pour reorienter eventuellement le resultat de l intersection
- //analytique, on postule que la tangente en debut doit etre dans
- //le sens de la corde deb/fin.
+ //Some analytic cases are processed separately.
+ //To reorientate the result of the analythic intersection,
+ //it is stated that the beginning of the tangent should be
+ //in the direction of the start/end line.
gp_Vec Vint, Vref(pdeb,pfin);
gp_Pnt Pbid;
Standard_Real Udeb,Ufin;
}
}
else {
- // ici on attaque GeomInt.
- //Pour l utilisation des domaines voir avec BUBUCH!!
+ // here GeomInt is approached.
Handle(Adaptor3d_TopolTool) dom1,dom2;
Handle(Geom_Surface) gs1 = trsfsurf(S1,dom1);
Handle(Geom_Surface) gs2 = trsfsurf(S2,dom2);
#if defined(IRIX) || defined(__sgi)
if(nbl==0) {
-// solution de rattrapage pour SGI
-// si l'intersection de gs1 avec gs2 ne marche pas alors on tente
-// l'intersection de gs2 avec gs1
+// solution of adjustment for SGI
+// if the intersection of gs1 with gs2 doesnot worke
+// then the intersection of gs2 with gs1 is attempted.
inter.Perform(gs2,gs1,tolap,1,1,1);
// inter.Perform(gs2,dom2,gs1,dom1,tolap,1,1,1);
if(!inter.IsDone()) return Standard_False;
nbl = inter.NbLines();
-// si GeomInt ne rend pas d'intersection on ne tente pas la solution de
-// rattrapage
+// if GeomInt does not make the intersection the solution of adjustment
+// is not attempted
if (nbl==0) return Standard_False;
}
#endif
C3d = new Geom_TrimmedCurve(C3d,Uf,Ul);
Pc1 = new Geom2d_TrimmedCurve(Pc1,Uf,Ul);
Pc2 = new Geom2d_TrimmedCurve(Pc2,Uf,Ul);
- //faut il renverser ?
+ //is it necesary to invert ?
Standard_Real distdeb = ptestdeb.Distance(pdeb);
Standard_Real distfin = ptestfin.Distance(pfin);
if(distdeb > distref || distfin > distref) {
}
}
}
+#ifdef DEB
+ cout<<"fail intersection surf/surf adjustment at the main is attempted"<<endl;
+#endif
- // A ce stade :
- // les intersections classiques ont echouees on attaque le
- // cheminement du desespoir.
+ // At this stage :
+ // classic intersections have failed, the path is approached in vain.
// Standard_Real Step = 0.1;
while(1) {
- //Attention les parametres de fleche pour le cheminement et
- //de tolerance pour l'approx ne peuvent etre pris comme ceux
- //du Builder, on les reestime donc comme on peut.
+ //Attention the parameters of arrow for the path and
+ //the tolerance for the approximation can't be taken as those of the
+ //Builder, so they are reestimated as much as possible.
Standard_Real fleche = 1.e-3 * pdeb.Distance(pfin);
Standard_Real tolap = 1.e-7;
IntPatch_ThePWalkingInter
IntKK(S1,S2,tol3d,tol3d,fleche,Step);
- //On connait les extremites de l intersection (Pardeb,Parfin),
- //on essaye de trouver un point de depart franchement au
- //milieu pour ne pas embrouiller le cheminement.
+ //The extremities of the intersection (Pardeb,Parfin) are known,
+ //one tries to find the start point at the
+ //middle to avoid obstacles on the path.
Standard_Boolean depok = Standard_False;
IntSurf_PntOn2S pintdep;
TColStd_Array1OfReal depart(1,4);
depok = IntKK.PerformFirstPoint(depart,pintdep);
}
if(!depok) {
+#ifdef DEB
+ cout<<"intersection surf/surf : failed to compute the start point"<<endl;
+#endif
return Standard_False;
}
pintdep.Parameters(depart(1),depart(2),depart(3),depart(4));
if (IntKK.NbPoints() <= 30) {
Step *= 0.5;
if (Step <= 0.0001) {
+#ifdef DEB
+ cout<<"intersection surf/surf : not enough points"<<endl;
+#endif
return Standard_False;
}
}
else{
- // A ce stade on a une LineOn2S presentable, on la tronque entre les
- // points les plus proches des extremites connues on en fait une
- // WLine et on lance l approx.
- // On retouche ensuite le resultat pour avoir les bons points debut
- // et fin.
+ // At this stage there is a presentable LineOn2S, it is truncated
+ // between the points closest to known extremites
+ // in fact there is a WLine and the approximation is launched.
+ // Then the result is corrected to get proper start and end points.
const Handle(IntSurf_LineOn2S)& L2S = IntKK.Line();
gp_Pnt codeb1 = S1->Value(Pardeb(1),Pardeb(2));
Standard_Real ddeb = Precision::Infinite();
Standard_Real dfin = Precision::Infinite();
Standard_Real dd;
+#ifndef DEB
Standard_Integer indd = 0, indf = 0;
+#else
+ Standard_Integer indd, indf;
+#endif
for(i = 1; i <= nbp; i++) {
dd = L2S->Value(i).Value().Distance(pntd);
if(dd < ddeb) { ddeb = dd; indd = i;}
for (i = indf + 1; i <= nbp; i++) { L2S->RemovePoint(indf + 1); }
nbp = indf;
if(nbp==1) return Standard_False;
- //On insere les extremites dans la ligne si les points extremites de
- //celle-ci en sont trop eloignes et si pardeb et parfin sont bons.
+ //The extremities are inserted in the line if the extremity points on it
+ //are too far and if pardeb and parfin are good.
if(ddeb >= tol3d && bondeb) {
IntSurf_PntOn2S p1 = L2S->Value(1);
IntSurf_PntOn2S p2 = L2S->Value(2);
}
dfin = 0.;
}
- //
- Handle(IntPatch_WLine) WL = new IntPatch_WLine(L2S,Standard_False);
+#ifdef DRAW
+ ChFi3d_SettraceDRAWINT(Standard_True);
+ if(ChFi3d_GettraceDRAWINT()) drawline(L2S);
+#endif
+ Handle(IntPatch_WLine)
+ WL = new IntPatch_WLine(L2S,Standard_False);
GeomInt_WLApprox approx;
approx.SetParameters(tolap,tol2d,4,8,0,1);
- // gerer ici les approx inutiles sur les plans!!!!!!!!!!!
+ // manage here the approximations that are not useful on planes!
approx.Perform(S1,S2,WL,
Standard_True,Standard_True,Standard_True,
1,nbp);
mbs.Curve(2,pol2d1);
TColgp_Array1OfPnt2d pol2d2(1,nbpol);
mbs.Curve(3,pol2d2);
- // On recale les extremites de l intersection sur les points connus.
+ // The extremities of the intersection are reset on known points.
if(ddeb >= tol1) {
pol3d(1) = pntd;
pol2d1(1).SetCoord(Pardeb(1),Pardeb(2));
//=======================================================================
//function : IntCS
-//purpose : Calcul rapide de l intersection courbe surface.
+//purpose : Fast calculation of the intersection curve surface.
//
//=======================================================================
IntCurveSurface_IntersectionPoint pint;
Intersection.Perform(C,S);
Standard_Boolean keepfirst = (wc < -1.e100), keeplast = (wc > 1.e100);
+#ifndef DEB
Standard_Real temp = 0.;
+#else
+ Standard_Real temp;
+#endif
if(keepfirst) temp = 1.e100;
if(keeplast) temp = -1.e100;
Standard_Real dist = 2.e100;
//=======================================================================
//function : ComputesIntPC
-//purpose : Intersection de deux PCurves de type FaceInterference
-// les parametres sur les pcurves du point solution sont
+//purpose : Intersection of two PCurves of type FaceInterference
+// the parameters of the pcurves at the solution point are
// UInt1,UInt2
//=======================================================================
ChFi3d_ComputesIntPC(Fi1,Fi2,HS1,HS2,UInt1,UInt2,bid);
}
-//=======================================================================
-//function : ChFi3d_ComputesIntPC
-//purpose :
-//=======================================================================
void ChFi3d_ComputesIntPC (const ChFiDS_FaceInterference& Fi1,
const ChFiDS_FaceInterference& Fi2,
const Handle(GeomAdaptor_HSurface)& HS1,
Standard_Real& UInt2,
gp_Pnt& P)
{
- // Une seule intersection a realiser, on prend tout de meme
- // le soin de valider les extremites par un extrema c3d/c3d
- // realise sur les pcurveonsurf des conges.
+ // Only one intersection to be carried out, however, the effort
+ // is taken to check the extremities by an extrema c3d/c3d
+ // created on pcurveonsurf of fillets.
Standard_Real x,y,distref2;
Fi1.PCurveOnSurf()->Value(UInt1).Coord(x,y);
gp_Pnt p3d2 = HS2->Value(x,y);
distref2 = p3d1.SquareDistance(p3d2);
P.SetXYZ(0.5*(p3d1.XYZ() + p3d2.XYZ()));
- // recalcul de l'extrema
+ // recalculation of the extremums
Standard_Real delt1 =
Min(0.1,0.05*(Fi1.LastParameter() - Fi1.FirstParameter()));
Handle(Geom2dAdaptor_HCurve) hc2d1 =
// SurfData Fd1 and trims it to allow the intersection computation
//=======================================================================
+
Handle(GeomAdaptor_HSurface) ChFi3d_BoundSurf(TopOpeBRepDS_DataStructure& DStr,
const Handle(ChFiDS_SurfData)& Fd1,
const Standard_Integer& IFaCo1,
const Standard_Integer& IFaArc1)
{
- //rmq : comme en fait les 2 interferences de Fd1 ne servent qu'a donner les
- // bornes, les indices IFaCo1 et IFaArc1 sont inutiles.
- // On les garde ici en option au cas ou il faudrait borner de facon plus
- // restrictive (avec des points d'intersection en argument en plus).
+ //rmq : as in fact 2 interferences of Fd1 serve only to set limits
+ // indexes IFaCo1 and IFaArc1 are not useful.
+ // They are preserver here as an option in case it will be necessary to set
+ // more restrictive limits (with intersection points as additional argument).
Handle(GeomAdaptor_HSurface) HS1 = new GeomAdaptor_HSurface();
GeomAdaptor_Surface& S1 = HS1->ChangeSurface();
S1.Load(DStr.Surface(Fd1->Surf()).Surface(),
mu,Mu,mv-Dv,Mv+Dv);
}
- //Dans le cas d'un tore ou cone, il ne faut pas que l'agrandissement des bounds engendrent une surface avec une periode plus grande que 2PI. lvt
+ //In the case of a torus or cone, it is not necessary that the bounds create a surface with period more than 2PI.
else if (styp == GeomAbs_Torus ||
styp == GeomAbs_Cone) {
Du = Min(PI-0.5*Du,0.1*Du);
}
return HS1;
}
+
+
+
//=======================================================================
//function : SearchPivot
//purpose :
Standard_Real u[3][3],
const Standard_Real t)
{
- //Cette fonction recherche comme pivot une cd dont les sections
- //ne se croisent pas sur la face opposee.
- // - il y aura peut etre des cas suffisamment asymetriques
- // pour qu aucun des trois conges ne convienne!! A VOIR.
- // - dans le cas ou plusieurs conviennent on prend le
- // premier qui n est pas forcement le meilleur, prevoir
- // d affiner cela en comparant les parametres sur les
- // lignes guide et (/ou) les rayons.
+ // This function finds as pivot a cd the sections which of
+ // do not cross on the opposite face.
+ // - probably there will be cases asymmetric to the point that
+ // none of tree fillets will match! To be SEEN.
+ // - in case when several fillets match the
+ // first one taken is not inevitably the best
+ // it should be refined by comparing the parameters on
+ // guide lines and (/or) radiuses.
Standard_Boolean bondeb,bonfin;
for(Standard_Integer i = 0; i <= 2; i++) {
const gp_Pnt& LastP,
Handle(Geom_TrimmedCurve)& gtc)
{
+#ifndef DEB
Standard_Real uf = 0.,ul = 0.;
+#else
+ Standard_Real uf,ul;
+#endif
GeomAdaptor_Curve gac(gc);
switch ( gac.GetType() ) {
case GeomAbs_Line :
gtc = new Geom_TrimmedCurve(gc,uf,ul);
}
-
-
//=======================================================================
-//function : GoodExt
+//function : PerformElSpine
//purpose :
//=======================================================================
+
static Standard_Boolean GoodExt(const Handle(Geom_Curve)& C,
const gp_Vec& V,
const Standard_Real f,
}
return Standard_True;
}
-//=======================================================================
-//function : PerformElSpine
-//purpose :
-//=======================================================================
-Standard_EXPORT
- void ChFi3d_PerformElSpine(Handle(ChFiDS_HElSpine)& HES,
- Handle(ChFiDS_Spine)& Spine,
- const GeomAbs_Shape continuity,
- const Standard_Real tol)
+
+Standard_EXPORT void ChFi3d_PerformElSpine(Handle(ChFiDS_HElSpine)& HES,
+ Handle(ChFiDS_Spine)& Spine,
+ const GeomAbs_Shape continuity,
+ const Standard_Real tol)
{
-
- Standard_Boolean periodic, Bof, checkdeb, cepadur,bIsSmooth;
- Standard_Integer IEdge,IF,IL,nbed, iToApproxByC2;
- Standard_Real WF, WL, Wrefdeb, Wreffin,nwf,nwl,period,pared,tolpared;
- Standard_Real First, Last, epsV, urefdeb, tolrac;
- GeomAbs_Shape aContinuity;
- gp_Pnt PDeb, PFin, Bout;
- gp_Vec VrefDeb, VrefFin;
- Handle(Geom_Curve) Cv;
- Handle(Geom_BoundedCurve) TC;
- Handle(Geom_BSplineCurve) BS, BSpline;
- TopoDS_Edge E, Eold;
- TopoDS_Vertex V;
- //
ChFiDS_ElSpine& ES = HES->ChangeCurve();
- WF = ES.FirstParameter();
- WL = ES.LastParameter();
- Wrefdeb = WF;
- Wreffin = WL;
- nwf = WF;
- nwl = WL;
- nbed = Spine->NbEdges();
- periodic = Spine->IsPeriodic();
+
+ Standard_Real WF = ES.FirstParameter();
+ Standard_Real WL = ES.LastParameter();
+ Standard_Real Wrefdeb = WF;
+ Standard_Real Wreffin = WL;
+ Standard_Integer IF,IL;
+ Standard_Boolean periodic = Spine->IsPeriodic();
+ Standard_Real nwf = WF, nwl = WL,period;
+ Standard_Integer nbed = Spine->NbEdges();
+ Standard_Real pared,tolpared;
+ Handle(Geom_BSplineCurve) BSpline;
+ Handle(Geom_BezierCurve) Bezier;
+
if(periodic) {
period = Spine->Period();
nwf = ElCLib::InPeriod(WF,-tol,period-tol);
Wrefdeb = Max(Spine->FirstParameter(IF),WF);
Wreffin = Min(Spine->LastParameter(IL),WL);
}
- //
+
+ gp_Pnt PDeb, PFin, Bout;
+ gp_Vec VrefDeb, VrefFin;
Spine->D1(WF,PDeb,VrefDeb);
Spine->D1(WL,PFin,VrefFin);
VrefDeb.Normalize();
VrefFin.Normalize();
- //
+
+ Standard_Boolean Bof;
+ Standard_Integer IEdge;
+
+ Standard_Real First, Last, epsV;
TColgp_Array1OfPnt ExtrapPole(1, 5);
TColgp_Array1OfPnt ExtraCoeffs(1, 5);
TColgp_Array1OfXYZ Cont(1,5);
- // Attention on segmente eventuellement la premiere et la
- // derniere arete.
- // Traitment de la premiere arete
- cepadur = 0;
- E=Spine->Edges(IF);
- Bof=BRepLib::BuildCurve3d(E);
+
+ TopoDS_Edge E, Eold;
+ TopoDS_Vertex V;
+
+ // Attention, the first and the last edge are segmented
+
+ // Processing of the first edge
+ E = Spine->Edges(IF);
+ Bof = BRepLib::BuildCurve3d(E);
const BRepAdaptor_Curve& edc = Spine->CurrentElementarySpine(IF);
tolpared = edc.Resolution(tol);
- Cv = BRep_Tool::Curve(E, First, Last);
- urefdeb = Spine->FirstParameter(IF);
- checkdeb = (nwf > urefdeb);
- if(checkdeb) {
- Spine->Parameter(IF,nwf,pared,0);
- }
- //
+ Handle(Geom_Curve) Cv = BRep_Tool::Curve(E, First, Last);
+ Standard_Real urefdeb = Spine->FirstParameter(IF);
+ Standard_Boolean checkdeb = (nwf > urefdeb),cepadur = 0;
+ if(checkdeb) Spine->Parameter(IF,nwf,pared,0);
if(E.Orientation() == TopAbs_REVERSED) {
Standard_Real sov = First;
First = Cv->ReversedParameter(Last);
Last = Cv->ReversedParameter(sov);
- if(checkdeb) {
- pared = Cv->ReversedParameter(pared);
- }
- else{
- pared = First;
- }
- if(First < pared) {
- First = pared;
- }
+ if(checkdeb) pared = Cv->ReversedParameter(pared);
+ else pared = First;
+ if(First < pared) First = pared;
if(IL == IF) {
Standard_Real ureffin = Spine->LastParameter(IL);
Standard_Boolean checkfin = (nwl < ureffin);
Spine->Parameter(IL,nwl,pared,0);
pared = Cv->ReversedParameter(pared);
}
- else {
- pared = Last;
- }
- if(pared < Last) {
- Last = pared;
- }
+ else pared = Last;
+ if(pared < Last) Last = pared;
}
Cv = Cv->Reversed();
- }//if(E.Orientation() == TopAbs_REVERSED)
- else {//#1
- if(!checkdeb) {
- pared = First;
- }
- if(First < pared) {
- First = pared;
- }
+ }
+ else{
+ if(!checkdeb) pared = First;
+ if(First < pared) First = pared;
if(IL == IF) {
Standard_Real ureffin = Spine->LastParameter(IL);
Standard_Boolean checkfin = (nwl < ureffin);
- if(checkfin) {
- Spine->Parameter(IL,nwl,pared,0);
- }
- else {
- pared = Last;
- }
- if(pared < Last) {
- Last = pared;
- }
+ if(checkfin) Spine->Parameter(IL,nwl,pared,0);
+ else pared = Last;
+ if(pared < Last) Last = pared;
}
- }// else {//#1
- //
- if(Abs(Last-First) < tolpared) {
- cepadur = 1;
}
- //
- //Petite veru pour les cas ou un KPart a bouffe l arete
- //sans parvenir a terminer. On tire une droite.
+
+ if(Abs(Last-First) < tolpared) cepadur = 1;
+
+ //In case when KPart consumes an edge
+ //and cannot stop. A line is drawn.
if(cepadur) {
Handle(Geom_Line) L;
gp_Pnt ptemp; gp_Vec vtemp;
L = new Geom_Line(olin,d);
ES.SetCurve(L);
}
- return;// =>
+#ifdef DRAW
+ ChFi3d_SettraceDRAWSPINE(1);
+ if (ChFi3d_GettraceDRAWSPINE()) {
+// POP for NT
+// char name[100];
+ char* name = new char[100];
+ sprintf(name,"elspine_%d",NbSp++);
+ Handle(Geom_Curve) bid = new Geom_TrimmedCurve(L,WF,WL);
+ DrawTrSurf::Set(name,bid);
+ }
+#endif
+ return;
}
- //
- TC = new (Geom_TrimmedCurve)(Cv, First, Last);
- BS=GeomConvert::CurveToBSplineCurve(TC);
+ Handle(Geom_BoundedCurve) TC = new (Geom_TrimmedCurve)(Cv, First, Last);
+ Handle(Geom_BSplineCurve) BS;
+ BS = GeomConvert::CurveToBSplineCurve(TC);
CurveCleaner(BS, Abs(WL-WF)*1.e-4, 0);
- //
//Smoothing of the curve
- iToApproxByC2=0;
- aContinuity=TC->Continuity();
- bIsSmooth=ChFi3d_IsSmooth(TC);
- if (aContinuity < GeomAbs_C2 && !bIsSmooth) {
- ++iToApproxByC2;
- BS = ChFi3d_ApproxByC2(TC);
- TC=BS;
- }
- //
- // Concatenation des aretes suivantes
+ if (TC->Continuity() < GeomAbs_C2 && !ChFi3d_IsSmooth( TC ))
+ {
+ BS = ChFi3d_ApproxByC2( TC );
+ TC = BS;
+ }
+
+ // Concatenation of following edges
GeomConvert_CompCurveToBSplineCurve Concat( TC, Convert_QuasiAngular );
- //
Eold = E;
- for (IEdge=IF+1; IEdge<=IL; ++IEdge) {
+
+ for (IEdge=IF+1; IEdge<=IL; IEdge++) {
Standard_Integer iloc = IEdge;
- if(periodic) {
- iloc = (IEdge - 1)%nbed + 1;
- }
- //
+ if(periodic) iloc = (IEdge - 1)%nbed + 1;
E = Spine->Edges(iloc);
- if (BRep_Tool::Degenerated(E)) {
- continue;
- }
- //
- epsV = tol;
- Bof = TopExp::CommonVertex(Eold, E, V);
- if (Bof) {
- epsV = BRep_Tool::Tolerance(V);
- }
- //
- Bof = BRepLib::BuildCurve3d(E);
- if (!Bof) {
- Standard_ConstructionError::Raise("PerformElSpine : BuildCurve3d error");
- }
- //
- Cv = BRep_Tool::Curve(E, First, Last);
- if(IEdge == IL) {
- Standard_Real ureffin = Spine->LastParameter(iloc);
- Standard_Boolean checkfin = (nwl < ureffin);
- if(checkfin) {
- Spine->Parameter(iloc,nwl,pared,0);
- }
- else {
- pared = Last;
- }
- if(E.Orientation() == TopAbs_REVERSED) {
- Standard_Real sov = First;
- First = Cv->ReversedParameter(Last);
- Last = Cv->ReversedParameter(sov);
- if(checkfin) {
- pared = Cv->ReversedParameter(pared);
+ if (! BRep_Tool::Degenerated(E)) {
+ Bof = TopExp::CommonVertex(Eold, E, V);
+ if (Bof) {epsV = BRep_Tool::Tolerance(V);}
+ else {epsV = tol;}
+ Bof = BRepLib::BuildCurve3d(E);
+ if (!Bof) {Standard_ConstructionError::
+ Raise("PerformElSpine : BuildCurve3d error");}
+ Cv = BRep_Tool::Curve(E, First, Last);
+ if(IEdge == IL) {
+ Standard_Real ureffin = Spine->LastParameter(iloc);
+ Standard_Boolean checkfin = (nwl < ureffin);
+ if(checkfin) Spine->Parameter(iloc,nwl,pared,0);
+ else pared = Last;
+ if(E.Orientation() == TopAbs_REVERSED) {
+ Standard_Real sov = First;
+ First = Cv->ReversedParameter(Last);
+ Last = Cv->ReversedParameter(sov);
+ if(checkfin) pared = Cv->ReversedParameter(pared);
+ else pared = Last;
+ Cv = Cv->Reversed();
}
- else{
- pared = Last;
- }
- Cv = Cv->Reversed();
+ if(pared < Last) Last = pared;
}
- if(pared < Last) {
- Last = pared;
+ TC = new (Geom_TrimmedCurve)(Cv, First, Last);
+ BS = GeomConvert::CurveToBSplineCurve(TC);
+ CurveCleaner(BS, Abs(WL-WF)*1.e-4, 0);
+ //Smoothing of the curve
+ if (TC->Continuity() < GeomAbs_C2 && !ChFi3d_IsSmooth( TC ))
+ {
+ BS = ChFi3d_ApproxByC2( TC );
+ TC = BS;
+ }
+ Standard_Real tolrac = Min(tol,epsV);
+ Bof = Concat.Add( TC, 2*tolrac, Standard_True );
+ // if the adding does not go well, it is attempted to increase the tolerance
+ if (!Bof) {
+ Bof = Concat.Add( TC, 2*epsV, Standard_True );
}
- }
- //
- TC = new (Geom_TrimmedCurve)(Cv, First, Last);
- BS = GeomConvert::CurveToBSplineCurve(TC);
- CurveCleaner(BS, Abs(WL-WF)*1.e-4, 0);
- //
- //Smoothing of the curve
- aContinuity=TC->Continuity();
- bIsSmooth=ChFi3d_IsSmooth(TC);
- if (aContinuity < GeomAbs_C2 && !bIsSmooth) {
- ++iToApproxByC2;
- BS = ChFi3d_ApproxByC2( TC );
- TC = BS;
- }
- //
- tolrac = Min(tol, epsV);
- Bof = Concat.Add( TC, 2.*tolrac, Standard_True );
- // si l'ajout ne s'est pas bien passe on essai d'augmenter la tolerance
- if (!Bof) {
- Bof = Concat.Add( TC, 2.*epsV, Standard_True );
- }
- if (!Bof) {
- Bof = Concat.Add( TC, 200.*epsV, Standard_True );
if (!Bof) {
- Standard_ConstructionError::Raise("PerformElSpine: spine merged error");
- }
+ Bof = Concat.Add( TC, 200*epsV, Standard_True );
+#ifdef DEB
+ cout << "Tolerance of chain is not respected" << endl;
+#endif
+ if (!Bof) {Standard_ConstructionError::
+ Raise("PerformElSpine: spine merged error");}
+ }
}
Eold = E;
- }// for (IEdge=IF+1; IEdge<=IL; ++IEdge) {
- //
- // On a la portion d elspine calculee sans prolongements sur la partie
- // valide des aretes du chemin.
+ }
+
+ // The portion of elspine is calculated without extension
+ // on the valid part of edges of the path.
BSpline = Concat.BSplineCurve();
- // On reparametre ici pour coller au mieux a l abscisse des aretes.
+ // There is a reparametrisation to maximally connect the abscissas of edges.
TColStd_Array1OfReal BSNoeuds (1, BSpline->NbKnots());
BSpline->Knots(BSNoeuds);
BSplCLib::Reparametrize (Wrefdeb, Wreffin, BSNoeuds);
BSpline->SetKnots(BSNoeuds);
- //
- // Traitement des Extremites
- Standard_Integer caredeb, carefin;
- Standard_Real LocalWL, LocalWF, Angle;
+
+ // Processing of Extremities
+ Standard_Real LocalWL = WL;
+ Standard_Real LocalWF = WF;
GeomAdaptor_Curve gacurve;
+ Standard_Integer caredeb = 0, carefin = 0;
Handle(Geom_BSplineCurve) newc;
- //
- caredeb = 0;
- carefin = 0;
- Angle = PI*0.75;
- LocalWL = WL;
- LocalWF = WF;
+ Standard_Real Angle = PI*0.75;
if (!ES.IsPeriodic() && !PDeb.IsEqual(BSpline->Pole(1), tol) ) {
- // Prolongement C3 au debut
- // afin d'eviter des pts d'inflexions dans la partie utile de la
- // spine le prolongement se fait jusqu'a un point eloigne.
- if(BSpline->IsRational()) {
- caredeb = 1;
- }
- //
+ // Extension of C3 at the beginning
+ // to avoid inflexion points in the useful part of the
+ // spine the extension is done till the distant point.
+ if(BSpline->IsRational()) caredeb = 1;
Standard_Real rabdist = Wrefdeb - WF;
Bout = PDeb.Translated(-20*rabdist * VrefDeb);
Standard_Boolean goodext = 0;
goodext = GoodExt(newc,VrefDeb,Wrefdeb,WF,Angle);
}
}
- if(caredeb) {
- caredeb = newc->NbKnots() - BSpline->NbKnots();
- }
+ if(caredeb) caredeb = newc->NbKnots() - BSpline->NbKnots();
BSpline = newc;
LocalWF = BSpline->FirstParameter();
}
- //
+
if (!ES.IsPeriodic() && !PFin.IsEqual(BSpline->Pole(BSpline->NbPoles()), tol) ) {
- // Prolongement C3 en fin
- if(BSpline->IsRational()) {
- carefin = 1;
- }
+ // Extension of C3 at the end
+ if(BSpline->IsRational()) carefin = 1;
Standard_Real rabdist = WL - Wreffin;
Bout = PFin.Translated(20*rabdist * VrefFin);
Standard_Boolean goodext = 0;
goodext = GoodExt(newc, VrefFin, Wreffin,WL,Angle);
}
}
- if(carefin) {
- carefin = newc->NbKnots() - BSpline->NbKnots();
- }
+ if(carefin) carefin = newc->NbKnots() - BSpline->NbKnots();
BSpline = newc;
LocalWL = BSpline->LastParameter();
}
- //
- //Reparametrisation et segmentation sur le domaine de la Spine.
- if(Abs(BSpline->FirstParameter() - WF)<tol) {
- WF = BSpline->FirstParameter();
- }
- if(Abs(BSpline->LastParameter() - WL)<tol) {
- WL = BSpline->LastParameter();
- }
- //
- if ( (LocalWF<WF) || (LocalWL>WL)) { // pour eviter des pb avec segment!
+
+ //Reparametrization and segmentation on the domain of the Spine.
+ if(Abs(BSpline->FirstParameter() - WF)<tol) WF = BSpline->FirstParameter();
+ if(Abs(BSpline->LastParameter() - WL)<tol) WL = BSpline->LastParameter();
+ if ( (LocalWF<WF) || (LocalWL>WL)) { // to avoid problems with segment!
BSpline->Segment(WF, WL);
ES.FirstParameter(WF);
ES.LastParameter(WL);
}
- //
if (BSpline->IsRational()) {
Handle(Geom_BSplineCurve) C1;
C1 = Handle(Geom_BSplineCurve)::DownCast(BSpline->Copy());
GeomConvert::C0BSplineToC1BSplineCurve(C1, tol, 0.1);
- // Il faut s'assurer que l'origine n'a pas bouge (cts21158)
- if (C1->FirstParameter() == BSpline->FirstParameter()) {
- BSpline = C1;
- }
+ // It is necessary to make sure that the origin didn't move (cts21158)
+ if (C1->FirstParameter() == BSpline->FirstParameter()) BSpline = C1;
else {
- //cout << "Attention : Echec de C0BSplineToC1 !" << endl;
+#if DEB
+ cout << "Attention : Fail of C0BSplineToC1 !" << endl;
+#endif
}
}
- //
- Standard_Integer fk, lk, MultMax, ii;
- // Deformation eventuelle pour rendre la spine C2.
- // ou C3 pour des approx C2
- if((caredeb || carefin) && BSpline->Degree() < 8) {
- BSpline->IncreaseDegree(8);
- }
- //
- fk = 2;
- lk = BSpline->NbKnots()-1;
- if(BSpline->IsPeriodic()) {
- fk = 1;
- }
- if(caredeb) {
- fk += caredeb;
- }
- if(carefin) {
- lk -= carefin;
- }
- //
+
+ // Deformation eventual to render spine C2
+ // or C3 for approx C2
+ if((caredeb || carefin) && BSpline->Degree() < 8) BSpline->IncreaseDegree(8);
+ Standard_Integer fk = 2, lk = BSpline->NbKnots()-1;
+ if(BSpline->IsPeriodic()) fk = 1;
+ if(caredeb) fk += caredeb;
+ if(carefin) lk -= carefin;
+ Standard_Integer MultMax, ii;
if (continuity == GeomAbs_C3) {
- if (BSpline->Degree() < 7) {
- BSpline->IncreaseDegree(7);
- }
+ if (BSpline->Degree() < 7) BSpline->IncreaseDegree(7);
MultMax = BSpline->Degree() - 3;
}
else {
- if (BSpline->Degree() < 5) {
- BSpline->IncreaseDegree(5);
- }
+ if (BSpline->Degree() < 5) BSpline->IncreaseDegree(5);
MultMax = BSpline->Degree() - 2;
}
- // correction C2 ou C3 (si possible)
+ // correction C2 or C3 (if possible)
CurveCleaner(BSpline, Abs(WL-WF)*1.e-4, 1);
CurveCleaner(BSpline, Abs(WL-WF)*1.e-2, MultMax);
Standard_Integer MultMin = Max(BSpline->Degree() - 4, 1);
if( BSpline->Multiplicity(ii) > MultMax ) {
Bof = BSpline->RemoveKnot(ii, MultMax, Abs(WL-WF)/10);
}
- // Voir C4
+ // See C4
if( BSpline->Multiplicity(ii) > MultMin ) {
Bof = BSpline->RemoveKnot(ii, MultMin, Abs(WL-WF)*1.e-4);
}
}
- // elspine periodique => BSpline Periodique
+ // elspine periodic => BSpline Periodic
if(ES.IsPeriodic()) {
if(!BSpline->IsPeriodic()) {
BSpline->SetPeriodic();
- //modified by NIZNHY-PKV Fri Dec 10 12:20:22 2010ft
- if (iToApproxByC2) {
- Bof = BSpline->RemoveKnot(1, MultMax, Abs(WL-WF)/10);
- }
- //Bof = BSpline->RemoveKnot(1, MultMax, Abs(WL-WF)/10);
- //modified by NIZNHY-PKV Mon Dec 13 14:12:54 2010t
+ Bof = BSpline->RemoveKnot(1, MultMax, Abs(WL-WF)/10);
}
}
else {
- // Sinon faut il bouger les poles pour les adapter
- // aux nouvelles tangentes ?
+ // Otherwise is it necessary to move the poles to adapt
+ // them to new tangents ?
Standard_Boolean adjust = Standard_False;
gp_Pnt P1, P2;
gp_Vec V1, V2;
ES.FirstPointAndTgt(PDeb,VrefDeb);
Standard_Real scaldeb = VrefDeb.Dot(V1);
Standard_Real disdeb = PDeb.Distance(P1);
- if((Abs(WF-LocalWF) < 1.e-12) &&
- ((scaldeb <= 0.9999999) || disdeb >= tol)) {
- // Oui s'il n'y as pas eu de prolongement et que la tangente n'est pas
- // la bonne.
+ if((Abs(WF-LocalWF) < 1.e-12) &&
+ ((scaldeb <= 0.9999999) ||
+ disdeb >= tol)) {
+ // Yes if there was no extension and the tangent is not the good one.
adjust = Standard_True;
}
BSpline->D1(WL, P2, V2);
Standard_Real scalfin = VrefFin.Dot(V2);
Standard_Real disfin = PFin.Distance(P2);
if((Abs(WL-LocalWL) < 1.e-12) &&
- ((scalfin <= 0.9999999) || disfin >= tol)) {
- // de meme a la fin
+ ((scalfin <= 0.9999999)||
+ disfin >= tol)) {
+ // the same at the end
adjust = Standard_True;
}
- if(adjust) {
- GeomLib::AdjustExtremity(BSpline, PDeb, PFin, VrefDeb, VrefFin);
- }
+ if(adjust) GeomLib::AdjustExtremity(BSpline, PDeb, PFin, VrefDeb, VrefFin);
}
- // Le Resultat
+ // The result
+#if DEB
+ if (! BSpline->IsCN(2)) cout << "Attention Spine non C2 !" << endl;
+#endif
+
ES.SetCurve(BSpline);
+#ifdef DRAW
+ ChFi3d_SettraceDRAWSPINE(1);
+ if (ChFi3d_GettraceDRAWSPINE()) {
+ char name[100];
+ sprintf(name,"elspine_%d",NbSp++);
+ char* Temp = name;
+ DrawTrSurf::Set(Temp,BSpline);
+// DrawTrSurf::Set(name,BSpline);
+ }
+#endif
}
//=======================================================================
//function : cherche_face1
-//purpose : cherche la face F differente de F1 dans la map.
-// La map contient les deux faces adjacentes a une edge
+//purpose : find face F different from F1 in the map.
+// The map contains two faces adjacent to an edge
//=======================================================================
void ChFi3d_cherche_face1 (const TopTools_ListOfShape & map,
const TopoDS_Face & F1,
}
//=======================================================================
//function : cherche_element
-//purpose : cherche l'edge E de F1 differente de E1 et contenant le vertex V
-// Vtx est l'autre vertex de E
+//purpose : find edge E of F1 other than E1 and containing vertex V
+// Vtx is the other vertex of E
//=======================================================================
+
void ChFi3d_cherche_element(const TopoDS_Vertex & V,
const TopoDS_Edge & E1,
const TopoDS_Face & F1,
}
//=======================================================================
//function : cherche_edge
-//purpose : cherche l'edge E de F1 differente de la liste d'edges E1 et
-// contenant le vertex V Vtx est l'autre vertex de E
+//purpose : find edge E of F1 other than the list of edges E1 and
+// containing vertex V Vtx is the other vertex of E.
//=======================================================================
+
void ChFi3d_cherche_edge(const TopoDS_Vertex & V,
const TopTools_Array1OfShape & E1,
const TopoDS_Face & F1,
//=======================================================================
//function : nbface
-//purpose : calcule le nombre de faces communes a un vertex
+//purpose : calculates the number of faces common to a vertex
//
//=======================================================================
Standard_Integer ChFi3d_nbface (const TopTools_ListOfShape & mapVF )
//=======================================================================
//function : edge_common_faces
-//purpose : determine les deux faces partageant une edge.
-// F1 =F2 si on a une arete de couure
+//purpose : determines two faces sharing an edge.
+// F1 = F2 if there is an edge to parce
//=======================================================================
+
void ChFi3d_edge_common_faces (const TopTools_ListOfShape & mapEF,
TopoDS_Face & F1,
TopoDS_Face & F2)
}
/***********************************************************/
-// donne l'angle entre les edges E1 et E2 . Vtx est le vertex
-// commun aux edges
+// gives the angle between edges E1 and E2 . Vtx is the
+// vertex common to the edges
/************************************************************/
Standard_Real ChFi3d_AngleEdge (const TopoDS_Vertex & Vtx,
const TopoDS_Edge& E1,
//==================================================================
// ChercheBordsLibres
-// determine si le vertex V1 a des aretes de bords libres
-// edgelibre1 et edgelibre2 .
-// On suppose qu'un sommet ne peut avoir que 2 aretes de bords libres
+// determines if vertex V1 has edges on free borders
+// edgelibre1 and edgelibre2 .
+// It is supposed that a top can have only 2 edges on free borders
//===================================================================
void ChFi3d_ChercheBordsLibres(const ChFiDS_Map & myVEMap,
const TopoDS_Vertex & V1,
//=======================================================================
//function : NbNotDegeneratedEdges
-//purpose : calcule le nb d'aretes non degenerees de la Map VEMap(Vtx)
-// Attention les aretes de jointures sont comptees deux fois
+//purpose : calculate the number of non-degenerated edges of Map VEMap(Vtx)
+// Attention the edges of junctions are taken into account twice
//=======================================================================
Standard_Integer ChFi3d_NbNotDegeneratedEdges (const TopoDS_Vertex& Vtx,
const ChFiDS_Map& VEMap)
//=======================================================================
//function : NumberOfEdges
-//purpose : calcule le nombre d'aretes arrivant au sommet Vtx
-// les aretes degenerees ne sont pas comptees.
+//purpose : calculate the number of edges arriving to the top Vtx
+// degenerated edges are not taken into account.
//=======================================================================
Standard_Integer ChFi3d_NumberOfEdges(const TopoDS_Vertex& Vtx,
const ChFiDS_Map& VEMap)
else nba=nba/2;
return nba;
}
-//=======================================================================
-//function : ChFi3d_cherche_vertex
-//purpose : function cherche_vertex
-// cherche le vertex commun entre deux edges
-//=======================================================================
+//=====================================================
+// function cherche_vertex
+// finds common vertex between two edges
+//=====================================================
+
void ChFi3d_cherche_vertex (const TopoDS_Edge & E1,
const TopoDS_Edge & E2,
TopoDS_Vertex & vertex,
}
}
}
-//=======================================================================
-//function : ChFi3d_Couture
-//purpose : determine si F a une arete de couture
-//=======================================================================
+//============================================================
+// determines if F has an edge of sewing
+//=============================================================
void ChFi3d_Couture( const TopoDS_Face & F,
Standard_Boolean & couture,
TopoDS_Edge & edgecouture)
}
}
-//=======================================================================
-//function : ChFi3d_CoutureOnVertex
-//purpose :
-//=======================================================================
void ChFi3d_CoutureOnVertex( const TopoDS_Face & F,
const TopoDS_Vertex & V,
Standard_Boolean & couture,
}
}
}
-//=======================================================================
-//function : ChFi3d_IsPseudoSeam
-//purpose :
-//=======================================================================
+
Standard_Boolean ChFi3d_IsPseudoSeam( const TopoDS_Edge& E,
- const TopoDS_Face& F )
+ const TopoDS_Face& F )
{
if (! BRep_Tool::IsClosed( E, F ))
return Standard_False;
return NeighborSeamFound;
}
-//=======================================================================
-//function : ChFi3d_ApproxByC2
-//purpose :
-//=======================================================================
Handle(Geom_BSplineCurve) ChFi3d_ApproxByC2( const Handle(Geom_Curve)& C )
{
Standard_Real First = C->FirstParameter(), Last = C->LastParameter();
Handle(Geom_BSplineCurve) BS = Approx.Curve();
return BS;
}
-//=======================================================================
-//function : ChFi3d_IsSmooth
-//purpose :
-//=======================================================================
+
Standard_Boolean ChFi3d_IsSmooth( const Handle(Geom_Curve)& C )
{
GeomAdaptor_Curve GAC( C );
gp_Pnt P1, P2;
Standard_Integer Discretisation = 30;
+// Standard_Real t = TI(1);
+// LProp.SetParameter(t);
+// if (!LProp.IsTangentDefined())
+// return Standard_False;
+// C->D0(t, P1);
+// LProp.CentreOfCurvature(P2);
+// gp_Vec PrevVec(P1, P2);
+
gp_Vec PrevVec;
Standard_Boolean prevVecFound = Standard_False;
Standard_Integer intrvFound = 0;
//=======================================================================
//function : ChFi3d_FaceTangency
-//purpose : determiner si les faces en vis a vis des edges sont tangents
-// pour aller des faces en vis a vis sur e0 vers les faces en vis
-//a vis sur e1 ,considerer l ensemble des faces partant du sommet commun
+//purpose : determine if the faces opposing to edges are tangent
+// to go from opposing faces on e0 to opposing faces
+// on e1, consider all faces starting at a common top.
//=======================================================================
Standard_Boolean ChFi3d_Builder::FaceTangency(const TopoDS_Edge& E0,
Standard_Integer Nbf;
TopoDS_Face F[2];
- //On verifie qu on ne chaine pas sur une arete de regularite.
+ //It is checked if the connection is not on a regular edge.
for (It.Initialize(myEFMap(E1)), Nbf= 0 ;It.More();It.Next(), Nbf++) {
if (Nbf>1)
Standard_ConstructionError::Raise("ChFi3d_Builder:only 2 faces");
//=======================================================================
//function : TangentExtremity
-//purpose : Test si 2 face sont tangentes en bout d'une edge
+//purpose : Test if 2 faces are tangent at the end of an edge
//=======================================================================
static Standard_Boolean TangentExtremity(const TopoDS_Vertex& V,
const TopoDS_Edge& E,
n1.SetXYZ(theProp1.Normal().XYZ());
if (O1 == TopAbs_REVERSED) n1.Reverse();
}
- else return Standard_False; // On ne sait pas ...
+ else return Standard_False; // It is not known...
Handle(Geom2d_Curve) pc2 = BRep_Tool::CurveOnSurface(e2,f2,f,l);
n2.SetXYZ(theProp2.Normal().XYZ());
if(O2 == TopAbs_REVERSED) n2.Reverse();
}
- else return Standard_False; // On ne sait pas ...
+ else return Standard_False; // It is not known...
return (n1.Angle(n2) < tang);
}
//=======================================================================
//function : TangentOnVertex
-//purpose : Test si les faces support d'une edge sont tangente en bout.
+//purpose : Test if support faces of an edge are tangent at end.
//=======================================================================
static Standard_Boolean TangentOnVertex(const TopoDS_Vertex& V,
const TopoDS_Edge& E,
//=======================================================================
//function : PerformExtremity
-//purpose : Dans le cas ou PerformElement a renvoye BreakPoint
-// a l une ou l autre des extremites, on essaye de raffiner
-// en fonction des concavite entres les faces voisines du
-// sommet.
+//purpose : In case if PerformElement returned BreakPoint at one or
+// another extremity, it is attempted to refine
+// depending on concavities between neighbour faces of the top.
//=======================================================================
void ChFi3d_Builder::PerformExtremity (const Handle(ChFiDS_Spine)& Spine)
E[0] = Spine->Edges(iedge);
V = Spine->LastVertex();
}
- //On verifie avant tout que l on ne meurt pas en tangence.
+ //Before all it is checked if the tangency is not dead.
E[0] = Spine->Edges(iedge);
ConexFaces (Spine,iedge,0,hs1,hs2);
if(TangentExtremity(V,E[0],hs1,hs2,angular)){
}
else{
#ifdef DEB
- cout<<"sommet a plus de 3 aretes"<<endl;
+ cout<<"top has more than 3 edges"<<endl;
#endif
sommetpourri = Standard_True;
break;
}
}
- //petite verue pour debug avec MPS.
if (!Spine->IsPeriodic()) {
TopTools_ListIteratorOfListOfShape It,Jt;
Standard_Integer nbf = 0, jf = 0;
if(nbf>3) {
Spine->SetFirstStatus(ChFiDS_BreakPoint);
#if DEB
- cout<<"sommet a : "<<nbf<<" faces."<<endl;
+ cout<<"top has : "<<nbf<<" faces."<<endl;
#endif
}
nbf = 0, jf = 0;
if(nbf>3) {
Spine->SetLastStatus(ChFiDS_BreakPoint);
#if DEB
- cout<<"sommet a : "<<nbf<<" faces."<<endl;
+ cout<<"top has : "<<nbf<<" faces."<<endl;
#endif
}
}
//=======================================================================
//function : PerformElement
-//purpose : rechercher l ensemble des edges tangents entre eux ;
-// Chaque edge retenu a 2 faces en vis
-// a vis pour 2 edges adjacents tangents il faut que les faces en vis a vis
-// soient tangentes
+//purpose : find all mutually tangent edges ;
+// Each edge has 2 opposing faces. For 2 adjacent tangent edges it is required that
+// the opposing faces were tangent.
//=======================================================================
Standard_Boolean ChFi3d_Builder::PerformElement(const Handle(ChFiDS_Spine)& Spine)
TopoDS_Vertex Ve1,VStart,FVEc,LVEc,FVEv,LVEv;
TopoDS_Edge Ev,Ec(Spine->Edges(1));
if(BRep_Tool::Degenerated(Ec)) return 0;
- //on controle que l arete est bien une arete de cassure
+ //it is checked if the edge is a cut edge
TopoDS_Face ff1,ff2;
ChFi3d_conexfaces(Ec,ff1,ff2,myEFMap);
if(ff1.IsNull() || ff2.IsNull()) return 0;
#else
ChFiDS_State CurSt;
#endif
- if (VStart.IsSame(LVEc)) {//cas ou un seul edge ferme
+ if (VStart.IsSame(LVEc)) {//case if only one edge is closed
CEc.Initialize(Ec);
Wl = BRep_Tool::Parameter(VStart,Ec);
CEc.D1(Wl,P2,V1);
Spine->SetLastStatus(CurSt);
Spine->SetFirstStatus(CurSt);
}
- else { // Progression aval
+ else { // Downstream progression
FVEc = VStart;
TopAbs_Orientation Or1;
while (!Fini) {
Standard_Boolean rev = (Or1 != curor);
Standard_Boolean OnAjoute = Standard_False;
if (FaceTangency(Ec,Ev,FVEv)) {
- //il n'y a pas besoin de tolerance
- // pour se decider (PRO9486) la regularite suffit.
- // On verifie quand meme le non rebrousement (PRO9810)
+ // there is no need of tolerance
+ // to make a decision (PRO9486) the regularity is enough.
+ // However, the abcense of turn-back is checked (PRO9810)
OnAjoute = ((!rev && av1v2 < PI/2)
||(rev && av1v2 > PI/2));
- // Il faut faire Attention au cas singulier (cf CTS21610_1)
+ // mate attention to the single case (cf CTS21610_1)
if (OnAjoute && (degeneOnEc ||
TangentOnVertex(LVEc, Ev,myEFMap, ta)) )
OnAjoute=((!rev && av1v2 < ta) || (rev && (PI - av1v2) < ta));
}
if (OnAjoute) {
- Fini = Standard_False; // Si Si cela peut etre util (Cf PRO14713)
+ Fini = Standard_False; // If this can be useful (Cf PRO14713)
Ec = Ev;
// Ec = TopoDS::Edge(Ev);
Ec.Orientation(Or1);
Nbface++) {}
if (Nbface> 1) CurSt = ChFiDS_BreakPoint;
Fini = ((!rev && av1v2 < ta) || (rev && (PI - av1v2) < ta));
- //attention dans le cas ou sur un vertex il part 3 edges dont l edge courant
- //+un edge bord libre et un edge cassure le status sera au pif
}
}
}
if (CurSt == ChFiDS_Closed) {
Spine->SetFirstStatus(CurSt);
}
- else {// Progression amont
+ else {// Upstream progression
Fini = Standard_False;
Ec = Spine->Edges(1);
curor = Ec.Orientation();
Nbface++) {}
if (Nbface> 1) CurSt = ChFiDS_BreakPoint;
Fini = ((!rev && av1v2 < ta) || (rev && (PI - av1v2) < ta));
- //attention dans le cas ou sur un vertex il part 3 edges dont l edge courant
- //+un edge bord libre et un edge cassure le status sera au pif
}
}
}
// Modified by Sergey KHROMOV - Fri Dec 21 17:08:19 2001 End
//===================================================================
-// Finition par un plan
+// Definition by a plane
//
-// On considere P1 et P2 les points associes aux commonpoints compoint1 et
-// compoint2 ainsi que E1 et E2 les edges qui contiennent P1 et P2.
-// On determine (s'il existe) le plan contenant les
-// trois directions D12 T1 T2 ou D12 represente la direction formee
+// It is considered that P1 and P2 are points associated to commonpoints compoint1 and
+// compoint2, while E1 and E2 are edges containing P1 and P2.
+// The plane containing three directions D12 T1 T2 ou D12 represente la direction formee
// par les points P1 et P2, T1 la tangente de E1 en P1 et T2 la tangente de
-// E2 en P2.
-// On fait ensuite l'intersection du conge HConge par ce plan
-// pour determiner la courbe 3d C3d et la courbe 2d associee
+// E2 en P2 is found (if exists).
+// Then fillet HConge is intersected by this plane
+// to find associated curve 3d C3d and the curve 2d.
//
//====================================================================
static void ChFi3d_CoupeParPlan (const ChFiDS_CommonPoint & compoint1,
//=======================================================================
//function : Projection
-//purpose : Projete un point sur une courbe
+//purpose : Projects a point on a curve
//=======================================================================
static Standard_Boolean Projection(Extrema_ExtPC& PExt,
Standard_Real Dist2, daux2;
Dist2 = C.Value(W).SquareDistance(P);
- // On verifie que ce n'est pas dejas solution
+ // It is checked if it is not already a solution
if (Dist2 < Tol * Tol)
return Standard_True;
}
}
- // Resolution global
+ // Global resolution
PExt.Perform(P);
if ( PExt.IsDone() ) {
for (Standard_Integer ii=1; ii<= PExt.NbExt(); ii++) {
//=======================================================================
//function : IsInput
-//purpose : Verifie si un vecteur "entre dans une Face
+//purpose : Checks if a vector belongs to a Face
//=======================================================================
Standard_Boolean IsInput(const gp_Vec& Vec,
gp_Vec Vec3d[2];
gp_Pnt Point;
- // Recherche des aretes et calcul des vecteurs 3d
+ // Find edges and compute 3D vectors
for ( ; (FaceExp.More() && (Trouve<2)); FaceExp.Next()) {
W = TopoDS::Wire(FaceExp.Current());
for (Trouve=0, WireExp.Init(W) ;
}
}
if (Trouve < 2) return Standard_False;
- // Calcul de la normal et des angles dans le plan vectoriel asssocie
+ // Calculate the normal and the angles in the asssociated vector plane
gp_Vec Normal;
Normal = Vec3d[0] ^ Vec3d[1];
- if (Normal.SquareMagnitude() < Precision::Confusion()) {//Cas colineaire
+ if (Normal.SquareMagnitude() < Precision::Confusion()) {//Colinear case
return (Vec.IsParallel(Vec3d[0],Precision::Confusion()));
}
}
else amin = 0;
- // Projection du vecteur
+ // Projection of the vector
gp_Ax3 Axe(Point, Normal, Vec3d[0]);
gp_Trsf Transf;
Transf.SetTransformation (Axe);
Transf.Transforms(coord);
gp_Vec theProj(coord);
- // et enfin ...
+ // and finally...
Standard_Real Angle = theProj.AngleWithRef(Vec3d[0], Normal);
return ( (Angle >= amin) && (Angle<=amax));
}
//=======================================================================
//function : IsG1
-//purpose : Cherche un voisin G1 par une arrete
+//purpose : Find a neighbor G1 by an edge
//=======================================================================
Standard_Boolean IsG1(const ChFiDS_Map& TheMap,
TopoDS_Face& FVoi)
{
TopTools_ListIteratorOfListOfShape It;
- // On cherche une voisine de E differente de FRef (cas general).
+ // Find a neighbor of E different from FRef (general case).
for(It.Initialize(TheMap(E));It.More();It.Next()) {
if (!TopoDS::Face(It.Value()).IsSame(FRef)) {
FVoi = TopoDS::Face(It.Value());
}
}
}
- // Si on ne l a pas trouvee on regarde si E est un edge de couture,
- // au quel cas on renvoie FVoi = FRef (cas moins frequent).
+ // If is was not found it is checked if E is a cutting edge,
+ // in which case FVoi = FRef is returned (less frequent case).
TopExp_Explorer Ex;
Standard_Boolean orset = Standard_False;
#ifndef DEB
//=======================================================================
//function : SearchFaceOnV
-//purpose : Trouve le(s) face(s) de sortie d'un cheminement par un vertex
-// Les criteres a respecter sont les suivants
-// -1 : La face partage une aretes de regularite avec FRef
-// (condition trop forte qu'il faudrait revoir
-// -2 : Le vecteur sortant du CommonPoint "entre" dans la face
+//purpose : Finds the output face(s) of the path by a vertex
+// The following criteria should be followed
+// -1 : The face shares regular edges with FRef
+// (too hard condition that should be reconsidered)
+// -2 : The vector starting in CommonPoint "belongs" to the face
//========================================================================
static Standard_Integer SearchFaceOnV(const ChFiDS_CommonPoint& Pc,
const TopoDS_Face& FRef,
TopoDS_Face& F1,
TopoDS_Face& F2)
{
- // on verifie que l'on sort bien de la face courante.
+ // it is checked that it leaves the current face.
Standard_Boolean FindFace = IsInput(Pc.Vector(), Pc.Vertex(), FRef);
if (FindFace) {
FindFace = IsInput(Pc.Vector().Reversed(), Pc.Vertex(), FRef);
}
- // Si l'on ne sort pas, c'est fini
+ // If it does not leave, it is finished
if (FindFace) {
F1 = FRef;
return 1;
//=======================================================================
//function : ChangeTransition
-//purpose : Change la transition du second common Point, quand la surface
-// ne traverse pas l'arc
-// Comme on suppose que les Faces d'appuis sont les memes, il suffit
-// de regarder le cas des aretes de coutures
+//purpose : Changes the transition of the second common Point, when the surface
+// does not cross the arc
+// As it is supposed that the support Faces are the same, it is enough
+// to examine the cas of cutting edges.
//========================================================================
static void ChangeTransition(const ChFiDS_CommonPoint& Precedant,
ChFiDS_CommonPoint& Courant,
PCurve2 = BRep_Tool::CurveOnSurface(TopoDS::Edge(aLocalShape), F, f, l);
// PCurve2 = BRep_Tool::CurveOnSurface(TopoDS::Edge(Arc.Reversed()), F, f, l);
if (PCurve1 != PCurve2) {
- // C'est une arete de couture, on doit faire un petit test Geometrique
+ // This is a cutting edge, it is necessary to make a small Geometric test
gp_Vec tgarc;
gp_Pnt P;
BRepAdaptor_Curve AC(Arc);
//=======================================================================
//function : CallPerformSurf
-//purpose : Encapsule l'appel a PerformSurf/SimulSurf
+//purpose : Encapsulates call to PerformSurf/SimulSurf
//========================================================================
void ChFi3d_Builder::
Handle(BRepAdaptor_HSurface) HSon1, HSon2;
HSon1 = HS1;
HSon2 = HS2;
- // Definition du domaine de cheminement It1, It2
+ // Definition of the domain of path It1, It2
It1->Initialize(HS1);
It2->Initialize(HS2);
else{
#ifdef DEB
- ChFi3d_InitChron(ch1);//init perf pour PerformSurf
+ ChFi3d_InitChron(ch1);//initial perform for PerformSurf
#endif
isdone = PerformSurf(SeqSD,HGuide,Spine,Choix,HS1,It1,HS2,It2,
First,Last,Inside,Inside,forward,
RecOnS1,RecOnS2,Soldep,intf,intl);
#ifdef DEB
- ChFi3d_ResultChron(ch1,t_performsurf);// result perf pour PerformSurf
+ ChFi3d_ResultChron(ch1,t_performsurf);// result perf for PerformSurf
#endif
}
- // Cas d'echecs
+ // Case of error
if (!isdone) {
First = thef;
Last = thel;
else{
#ifdef DEB
- ChFi3d_InitChron(ch1);//init perf pour PerformSurf
+ ChFi3d_InitChron(ch1);//init perf for PerformSurf
#endif
isdone = PerformSurf(SeqSD,HGuide,Spine,Choix,HSon1,It1,HSon2,It2,
First,Last,Inside,Inside,forward,
RecOnS1,RecOnS2,Soldep,intf,intl);
#ifdef DEB
- ChFi3d_ResultChron(ch1,t_performsurf);// result perf pour PerformSurf
+ ChFi3d_ResultChron(ch1,t_performsurf);// result perf for PerformSurf
#endif
}
}
//=======================================================================
//function : StripeOrientation
-//purpose : Calcul des orientations de reference determinant le
-// cote concave pour la construction du conge.
+//purpose : Calculates the reference orientation determining the
+// concave face for construction of the fillet.
//=======================================================================
Standard_Boolean ChFi3d_Builder::StripeOrientations
//=======================================================================
//function : StartSol
-//purpose : Calcul d une solution de depart approchee :
-// - on commence par essayer une dizaine de points sur la
-// spine,
-// - en cas d'echec on recherche la solution dans les faces
-// voisines; section plane des aretes de la face adjacente
-// et identication de la face par connexite a cette arete.
+//purpose : Calculates a starting solution :
+// - one starts by parsing about ten points on the spine,
+// - in case of fail one finds the solution on neighbor faces;
+// section plane of edges of the adjacent face
+// and identication of the face by connection to that edge.
//=======================================================================
void ChFi3d_Builder::StartSol(const Handle(ChFiDS_Stripe)& Stripe,
Standard_Integer nbessaimax = 3*nbed;
if (nbessaimax < 10) nbessaimax = 10;
Standard_Real unsurnbessaimax = 1./nbessaimax;
- //On bruite un peu les bouts, plus par superstition qu autre chose.
Standard_Real wf = 0.9981 * Spine->FirstParameter(1) +
0.0019 * Spine->LastParameter(1);
Standard_Real wl = 0.9973 * Spine->LastParameter(nbed) +
PC = BRep_Tool::CurveOnSurface(cured,f1forward,Uf,Ul);
I1->Initialize(HS1);
PC->D1(woned, P1, derive);
- // On des points sur le bord, on cherche des point internes
+ // There are ponts on the border, and internal points are found
if (derive.Magnitude() > Precision::PConfusion()) {
derive.Normalized();
derive.Rotate(PI/2);
return;
}
}
- // On a trouve aucune solution sur les faces adjacentes au trajet
- // on essaye donc les voisines.
+ // No solution was found for the faces adjacent to the trajectory.
+ // Now one tries the neighbor faces.
iedge = 0;
for(nbessai = 0; nbessai <= nbessaimax; nbessai++){
Standard_Real t = nbessai*unsurnbessaimax;
NewF.Orientation(F.Orientation());
pons.SetCoord(0.,0.);
HS->ChangeSurface().Initialize(NewF);
- return; // c'est tout bon !
+ return; // everything is good !
}
}
Standard_Failure::Raise("ChFi3d_BuildPlane : echec .");
//=======================================================================
//function : StartSol
-//purpose : La spec provisoire de StarSol est : lbo 28/03/97
-// Si le commonpoint n est pas OnArc on renvoie la face
-// d entree et on met a jour le point 2d,
-// si il est OnArc
-// si on decroche on renvoie la face d entree et on met
-// a jour le point 2d,
-// sinon
-// ou bien il y a une face voisine tangente et on la renvoie
-// avec le point 2d recalcule
-// ou bien il n y en a pas
-// si l Arc reference Vref (extremite de la spine)
-// on est en bout et on renvoie la face d entree
-// sinon c est un obstacle et on met a jour HC.
+//purpose : If the commonpoint is not OnArc the input face
+// is returned and 2D point is updated,
+// if it is OnArc
+// if it is detached the input face
+// is returned and 2D point is updated,
+// otherwise
+// either there is a neighbor tangent face and it is returned
+// with recalculated 2D point
+// or if there is no face
+// if the reference arc is Vref (extremity of the spine)
+// this is the end and the input face is returned
+// otherwise this is an obstacle and HC is updated.
//=======================================================================
Standard_Boolean
ChFi3d_Builder::StartSol(const Handle(ChFiDS_Spine)& Spine,
- Handle(BRepAdaptor_HSurface)& HS, // Nouvelle face
- gp_Pnt2d& pons,// " Localisation
- Handle(BRepAdaptor_HCurve2d)& HC, // Reprentation de l'obstacle
+ Handle(BRepAdaptor_HSurface)& HS, // New face
+ gp_Pnt2d& pons,// " Localization
+ Handle(BRepAdaptor_HCurve2d)& HC, // Representation of the obstacle
Standard_Real& W,
const Handle(ChFiDS_SurfData)& SD,
const Standard_Boolean isfirst,
const Standard_Integer ons,
- Handle(BRepAdaptor_HSurface)& HSref, // L'autre representation
- Handle(BRepAdaptor_HCurve2d)& HCref, // de l'obstacle
+ Handle(BRepAdaptor_HSurface)& HSref, // The other representation
+ Handle(BRepAdaptor_HCurve2d)& HCref, // of the obstacle
Standard_Boolean& RecP,
Standard_Boolean& RecS,
Standard_Boolean& RecRst,
Standard_Boolean& c1obstacle,
- Handle(BRepAdaptor_HSurface)& HSBis, // Face de secoure
- gp_Pnt2d& PBis, // et son point
+ Handle(BRepAdaptor_HSurface)& HSBis, // Face of support
+ gp_Pnt2d& PBis, // and its point
const Standard_Boolean decroch,
const TopoDS_Vertex& Vref) const
{
if (ons == 1) notons = 2;
else notons = 1;
const ChFiDS_CommonPoint& CPbis = SD->Vertex(isfirst,notons);
- if (CPbis.IsOnArc()) { // On verifie que l'on est pas dans une zone
- // de prolongement. Car dans ce cas CP n'est pas
- // au bout de la surfdata et il ne faut pas en tenir compte
- // sauf cas singuliers (ie pointus) ...
- //ts et tns etaient avant CP.Parameter() et CPbis.Parameter, mais qques fois, ils n'avaient pas de valeurs.
+ if (CPbis.IsOnArc()) { // It is checked if it is not the extension zone
+ // In case CP is not at the end of surfdata and it is not necesary to take it into account
+ // except for separate cases (ie pointus) ...
+ //ts and tns were earlier CP.Parameter() and CPbis.Parameter, but sometimes they had no values.
Standard_Real ts=SD->Interference(ons).Parameter(isfirst), tns=SD->Interference(notons).Parameter(isfirst);
Standard_Boolean isExtend;
- // Test arbitraire (a raffiner)
+ // Arbitrary test (to precise)
if (isfirst) isExtend = (ts-tns > 100*tolesp);
else isExtend = (tns-ts > 100*tolesp);
if (isExtend && !CP.Point().IsEqual(CPbis.Point(), 0) ) {
- // on garde l'etat et on renvoi False (prolongement par plan attendu).
+ // the state is preserved and False is returned (extension by the expected plane).
HS->ChangeSurface().Initialize(F);
pc = SD->Interference(ons).PCurveOnFace();
- // Le point 2d est donne par la trace sur la surface support
+ // The 2nd point is given by its trace on the support surface
RecS = Standard_False;
pons = pc->Value(tns);
return Standard_False;
}
if (CP.IsVertex() && !HC.IsNull() && !decroch){
- //On change d'arete et on met a jour le parametre et
- //eventuellement la face d'appui et(ou) la face de
- //reference.
+ //The edge is changed, the parameter is updated and
+ //eventually the support face and(or) the reference face.
TopoDS_Vertex VCP = CP.Vertex();
TopoDS_Edge EHC = HC->ChangeCurve2d().Edge();
- //On commence par chercher dans Fref une autre arete
- //referencant VCP.
+ //One starts by searching in Fref another edge referencing VCP.
TopExp_Explorer ex1,ex2;
TopoDS_Edge newedge, edgereg;
TopoDS_Face bidface = Fref, facereg;
}
}
if(newedge.IsNull()){
- //On regarde si EHC n'est pas un edge ferme.
+ //It is checked if EHC is not a closed edge.
TopoDS_Vertex V1,V2;
TopExp::Vertices(EHC,V1,V2);
if(V1.IsSame(V2)){
return 1;
}
else if(!edgereg.IsNull()){
- // on change d arete et de face de reference.
+ // the reference edge and face are changed.
Fref = facereg;
HSref->ChangeSurface().Initialize(Fref);
for(ex1.Init(facereg,TopAbs_EDGE); ex1.More() && newedge.IsNull(); ex1.Next()){
}
}
}
- // il faut ici identifier la nouvelle face d'appui du conge :
- // connexe a FRef le long de newedge.
+ // it is necessary to find the new support face of the fillet :
+ // connected to FRef along the newedge.
if(newedge.IsNull()) {
Standard_Failure::Raise
- ("StartSol : chainage impossible,nouvel obstacle non trouve");
+ ("StartSol : chain is not possible, new obstacle not found");
}
if(IsG1(myEFMap,newedge,Fref,Fv)){
Standard_Failure::Raise
- ("StartSol : chainage impossible, config non traitee");
+ ("StartSol : chain is not possible, config non processed");
}
else if(Fv.IsNull()){
Standard_Failure::Raise
- ("StartSol : chainage impossible, nouvel obstacle non trouve");
+ ("StartSol : chain is not possible, new obstacle not found");
}
else{
HS->ChangeSurface().Initialize(Fv);
}
RecP = c1obstacle = 1;
return 1;
- } // Fin du Cas Vertex && Obstacle
+ } // End of Case Vertex && Obstacle
else if (CP.IsOnArc() && !HC.IsNull() && !decroch){
- //On ne change rien, on met juste a jour le parametre.
+ //Nothing is changed, the parameter is only updated.
W = CP.ParameterOnArc();
c1obstacle = 1;
return 1;
HS->ChangeSurface().Initialize(Fv);
RecS = 1;
if (CP.IsVertex()) {
- // On passe directement par le Vertex
+ // One goes directly by the Vertex
Standard_Integer Nb;
TopoDS_Face aux;
- // Et l'on verifie qu'il n'y a pas d'autres candidats
+ // And it is checked that there are no other candidates
Nb = SearchFaceOnV(CP, F, myVEMap, myEFMap, Fv, aux);
pons = BRep_Tool::Parameters(CP.Vertex(), Fv);
}
return 1;
}
- // sinon on transite par l'arc...
+ // otherwise one passes by the arc...
if(!Fv.IsSame(F)){
Fv.Orientation(TopAbs_FORWARD);
TopoDS_Edge newedge;
}
}
//gp_Vec Varc, VSurf;
- // En cas de sortie Tangente, la face courante devient la face de secour
+ // In cas of Tangent output, the current face becomes the support face
if (SortieTangente(CP, F, SD, ons, 0.1)) {
pc = BRep_Tool::CurveOnSurface(CP.Arc(),F,Uf,Ul);
HSBis = new (BRepAdaptor_HSurface)(F);
return Standard_False;
}
}
- else{ // il n'y a pas de face Voisine, on garde l'etat et on renvoi False.
+ else{ // there is no neighbor face, the state is preserved and False is returned.
HS->ChangeSurface().Initialize(F);
W = CP.ParameterOnArc();
pc = BRep_Tool::CurveOnSurface(E,F,Uf,Ul);
FVoi.Nullify();
TopoDS_Edge E;
if (Pc.IsVertex()){
- // attention il faut analyser lensemble des faces qui tournent autour du vertex
- // voir cahier pour les cas a traiter
+ // attention it is necessary to analyze all faces that turn around of the vertex
#if DEB
- cout<<"Commonpoint sur vertex on va au carton"<<endl;
+ cout<<"Commonpoint on vertex, the process hangs up"<<endl;
#endif
- if (Pc.HasVector()) { //Traitement general
+ if (Pc.HasVector()) { //General processing
TopoDS_Face Fbis;
Standard_Integer nb_faces;
nb_faces = SearchFaceOnV(Pc, FRef, myVEMap, myEFMap, FVoi, Fbis);
return ( nb_faces > 0);
}
- else { // Traitement utilisant la spine
+ else { // Processing using the spine
Standard_Boolean FindFace=Standard_False;
gp_Pnt Point;
gp_Vec VecSpine;
Spine->D1(Pc.Parameter(), Point, VecSpine);
- // on verifie que l'on sort bien de la face courante.
+ // It is checked if one leaves from the current face.
FindFace = IsInput(VecSpine, Pc.Vertex(), FRef);
if (FindFace) {
VecSpine.Reverse();
FindFace = IsInput(VecSpine, Pc.Vertex(), FRef);
}
- // Si l'on ne sort pas, c'est fini
+ // If one does not leave, it is ended
if (FindFace) {
FVoi = FRef;
return Standard_True;
}
- // Sinon, on cherche la suivante parmis les Faces partages
- // par une arete communes G1
+ // Otherwise one finds the next among shared Faces
+ // by a common edge G1
TopTools_ListIteratorOfListOfShape ItE, ItF;
for(ItE.Initialize(myVEMap(Pc.Vertex()));
ItE.More() && (!FindFace); ItE.Next()) {
return Standard_False;
}
- // On verifie que la face Selectionnee a bien une des arretes de la spine
- // contenant le vertex dans sa frontierre
- // Ce traitement ne devrait marcher que si le Vertex appartient a la spine
- // Cas singulier, pour d'autre vertex il faudrait faire autre chose
+ // It is checked if the selected face actually possesses edges of the spine
+ // containing the vertex on its front
+ // This processing should go only if the Vertex belongs to the spine
+ // This is a single case, for other vertexes it is required to do other things
Trouve=Standard_False;
for (Standard_Integer IE=1;//, Trouve=Standard_False; 15.11.99 SVV
(IE<=Spine->NbEdges()) && (!Trouve); IE++) {
//=======================================================================
//function : ChFi3d_SingularExtremity
-//purpose : chargement du vertex dans la DS et calcul de la pcurve
-// pour une extremite dans le cas freeboundary singulier
-// ou periodic et singulier a la couture.
+//purpose : load the vertex in the DS and calculate the pcurve
+// for an extremity in case of singular freeboundary
+// or periodic and singular at the cut.
//=======================================================================
static void ChFi3d_SingularExtremity( Handle(ChFiDS_Stripe)& stripe,
TopOpeBRepDS_DataStructure& DStr,
Handle(Geom_Curve) C3d;
Handle(Geom2d_Curve) PCurv;
TopOpeBRepDS_Curve Crv;
- // la SurfData en cause et ses CommonPoints,
+ // SurfData and its CommonPoints,
Standard_Integer Ivtx, Icurv;
Standard_Boolean isfirst;
const ChFiDS_CommonPoint& CV1 = Fd->Vertex(isfirst,1);
const ChFiDS_CommonPoint& CV2 = Fd->Vertex(isfirst,2);
- // Est ce toujours degenere ?
+ // Is it always degenerated ?
if ( CV1.Point().IsEqual( CV2.Point(), 0) ) {
Ivtx = ChFi3d_IndexPointInDS(CV1, DStr);
if (isfirst) {
stripe->SetIndexPoint(Ivtx, isfirst, 2);
if (stripe->Spine()->IsPeriodic()) {
- // cas periodique : On renouvelle l'operation
- // on ne partage pas la courbe 3d.
- // On fabrique 2 aretes degenere confondus en 3d
+ // periodic case : The operation is renewed
+ // the curve 3d is not shared.
+ // 2 degenerated edges coinciding in 3d
isfirst = Standard_False;
Fd = stripe->SetOfSurfData()->Sequence().Last();
VOnS1 = Fd->InterferenceOnS1().PCurveOnSurf()->
//=======================================================================
//function : ChFi3d_MakeExtremities
-//purpose : calcul des Courbes3d et pcurves des extremites dans les
-// cas periodiques et freeboundary.
+//purpose : calculate Curves3d and pcurves of extremities in
+// periodic and freeboundary cases.
//=======================================================================
static Standard_Boolean IsFree(const TopoDS_Shape& E,
const ChFiDS_Map& EFMap)
ChFi3d_SetPointTolerance(DStr,b2,Stripe->IndexFirstPointOnS2());
}
else {
- // Cas de l'extremite singuliere
+ // Case of the single extremity
if (CV1.IsVertex()) {
ChFi3d_SingularExtremity(Stripe, DStr, CV1.Vertex(), tol3d, tol2d);
}
# if DEB
- else { cout << "MakeExtremities : Singularite hors Vertex !!" << endl; }
+ else { cout << "MakeExtremities : Singularity out of Vertex !!" << endl; }
# endif
}
return;
Value(SDdeb->InterferenceOnS1().FirstParameter());
UV2=SDdeb->InterferenceOnS2().PCurveOnSurf()->
Value(SDdeb->InterferenceOnS2().FirstParameter());
-// On essaie l'intersection du conge par un plan
+// The intersection of the fillet by a plane is attempted
Handle(GeomAdaptor_HSurface) HConge=ChFi3d_BoundSurf(DStr,SDdeb,1,2);
ChFi3d_CoupeParPlan(cpdeb1,cpdeb2,HConge,UV1,UV2,
if (!cpdeb2.IsVertex())
ChFi3d_SetPointTolerance(DStr,b2,Stripe->IndexFirstPointOnS2());
}
- else { // Cas de l'extremite singuliere
+ else { // Case of a singular extremity
if (cpdeb1.IsVertex()) {
ChFi3d_SingularExtremity(Stripe, DStr, cpdeb1.Vertex(), tol3d, tol2d);
}
# if DEB
- else { cout << "MakeExtremities : Singularite hors Vertex !!" << endl; }
+ else { cout << "MakeExtremities : Singularity out of Vertex !!" << endl; }
# endif
}
}
Value(SDfin->InterferenceOnS1().LastParameter());
UV2=SDfin->InterferenceOnS2().PCurveOnSurf()->
Value(SDfin->InterferenceOnS2().LastParameter());
-// On essaie l'intersection du conge par un plan
+// Intersection of the fillet by a plane is attempted
Handle(GeomAdaptor_HSurface) HConge=ChFi3d_BoundSurf(DStr,SDfin,1,2);
ChFi3d_CoupeParPlan(cpfin1,cpfin2,HConge,UV1,UV2,
if (!cpfin2.IsVertex())
ChFi3d_SetPointTolerance(DStr,b2,Stripe->IndexLastPointOnS2());
}
- else { // Cas de l'extremite singuliere
+ else { // Case of the single extremity
if (cpfin1.IsVertex()) {
ChFi3d_SingularExtremity(Stripe, DStr, cpfin1.Vertex(), tol3d, tol2d);
}
# if DEB
- else { cout << "MakeExtremities : Singularite hors Vertex !!" << endl; }
+ else { cout << "MakeExtremities : Singularity out of Vertex !!" << endl; }
# endif
}
}
Standard_Boolean& intf,
Standard_Boolean& intl)
{
- if (isfirst) intf = 1; else intl = 1; // Fini.
+ if (isfirst) intf = 1; else intl = 1; // End.
Standard_Integer opp = 3-ons;
if (!SD->Vertex(isfirst,opp).IsOnArc() ||
SD->TwistOnS1() || SD->TwistOnS2() ) {
#ifdef DEB
- cout<<"ChFi3d_Purge : Pas de sortie sur prolongement."<<endl;
+ cout<<"ChFi3d_Purge : No output on extension."<<endl;
#endif
ChFiDS_SequenceOfSurfData& Seq =
Stripe->ChangeSetOfSurfData()->ChangeSequence();
//=======================================================================
//function : InsertAfter
-//purpose : insert Item apres ref dans Seq. Si ref est null item est
-// insere en tete.
+//purpose : insert Item after ref in Seq. If ref is null, the item is
+// inserted at the beginning.
//=======================================================================
static void InsertAfter (Handle(ChFiDS_Stripe)& Stripe,
Handle(ChFiDS_SurfData)& Item)
{
if (Ref == Item)
- Standard_Failure::Raise("InsertAfter : 2fois la meme surfdata.");
+ Standard_Failure::Raise("InsertAfter : twice the same surfdata.");
ChFiDS_SequenceOfSurfData& Seq =
Stripe->ChangeSetOfSurfData()->ChangeSequence();
//=======================================================================
//function : InsertBefore
-//purpose : Insert item avant ref dans Seq. Si ref est null item est
-// insere en queue.
+//purpose : Insert item before ref in Seq. If ref is null, the item is
+// inserted in the queue.
//=======================================================================
static void InsertBefore (Handle(ChFiDS_Stripe)& Stripe,
Handle(ChFiDS_SurfData)& Item)
{
if (Ref == Item)
- Standard_Failure::Raise("InsertBefore : 2fois la meme surfdata.");
+ Standard_Failure::Raise("InsertBefore : twice the same surfdata.");
ChFiDS_SequenceOfSurfData& Seq =
Stripe->ChangeSetOfSurfData()->ChangeSequence();
Standard_Real wl = Guide.LastParameter();
Standard_Real locfleche = (wl - wf) * fleche;
Standard_Real wfsav = wf, wlsav = wl;
- //Maintenant on elargit artificiellement l ElSpine
- //pour aider rsnld.
+ //Now the ElSpine is artificially extended to help rsnld.
Standard_Real prab = 0.01;
Guide.FirstParameter(wf-prab*(wl-wf));
Guide.LastParameter (wl+prab*(wl-wf));
math_Vector SoldepCS(1,3);
math_Vector SoldepCC(1,2);
- // Recuperation d un KPart voisin.
- // Si pas de voisin calcul point de depart.
+ // Restore a neighboring KPart.
+ // If no neighbor calculation start point.
Standard_Boolean forward = Standard_True;
Standard_Boolean Inside = Standard_False;
Standard_Real First = wf;
Standard_Real Last = wl;
Standard_Boolean Ok1 = 1,Ok2 = 1;
- // Recuperation du KPart suivant si il existe
+ // Restore the next KPart if it exists
TopoDS_Vertex Vref;
if(ref.IsNull() && raf.IsNull()){
//sinon solution approchee.
Inside = Standard_True;
#ifdef DEB
- ChFi3d_InitChron(ch1);// init perf pour StartSol
+ ChFi3d_InitChron(ch1);// init perf for StartSol
#endif
StartSol(Stripe,HGuide,HS1,HS2,It1,It2,pp1,pp2,First);
#ifdef DEB
- ChFi3d_ResultChron(ch1,t_startsol); // result perf pour StartSol
+ ChFi3d_ResultChron(ch1,t_startsol); // result perf for StartSol
#endif
Last = wf;
if(Guide.IsPeriodic()) {
Last = First - Guide.Period();
Guide.FirstParameter(Last);
- Guide.LastParameter (First * 1.1);//Extension pour aider rsnld.
+ Guide.LastParameter (First * 1.1);//Extension to help rsnld.
}
}
else{
}
#ifdef DEB
- ChFi3d_InitChron(ch1);// init perf pour startsol
+ ChFi3d_InitChron(ch1);// init perf for startsol
#endif
HC2.Nullify();
#ifdef DEB
- ChFi3d_ResultChron(ch1,t_startsol); // result perf pour startsol
+ ChFi3d_ResultChron(ch1,t_startsol); // result perf for startsol
#endif
if(Spine->IsPeriodic() && (indl < indf)) indl += nbed;
nbed = indl-indf+1;
}
- // Pas Max a la louche : 20 points par arete en moyenne en prenant soin
- // de ne pas comptabiliser les prolongements.
+ // No Max at the touch : 20 points by edge at average without
+ // counting the extensions.
Standard_Real bidf = wf, bidl = wl;
if(!Spine->IsPeriodic()) {
bidf = Max(0.,wf);
bidl = Min(wl,Spine->LastParameter(Spine->NbEdges()));
- // PMN 20/07/98 : Attention au cas ou il n'y a que du prolongement
+ // PMN 20/07/98 : Attention in case if there is only extension
if ((bidl-bidf) < 0.01 * Spine->LastParameter(Spine->NbEdges())) {
bidf = wf;
bidl = wl;
#endif
Standard_Boolean intf = 0, intl = 0;
while(!fini){
- // sont-ce les bouts (pas de prolongement sur les periodiques).
+ // are these the ends (no extension on periodic).
Ok1 = 1,Ok2 = 1;
if(!Spine->IsPeriodic()){
if(wf < tolesp && (complete == Inside)){
if(!ref.IsNull()){
#ifdef DEB
- ChFi3d_InitChron(ch1);// init perf pour StartSol
+ ChFi3d_InitChron(ch1);// init perf for StartSol
#endif
Ok1 = StartSol(Spine,HS1,pp1,HC1,w1,ref,!forward,1,
HS4,pp4,decroch2,Vref);
#ifdef DEB
- ChFi3d_ResultChron(ch1,t_startsol); // result perf pour StartSol
+ ChFi3d_ResultChron(ch1,t_startsol); // result perf for StartSol
#endif
}
- // Plus de face connexe. Construction du plan tangent pour continuer le cheminement
- // jusqu a sortie sur l autre face.
+ // No more connected faces. Construction of the tangent plane to continue the path
+ // till the output on the other face.
if ((!Ok1 && HC1.IsNull()) || (!Ok2 && HC2.IsNull())) {
if ((intf && !forward) || (intl && forward)) {
if (!Ok1) ChFi3d_BuildPlane (DStr,HS1,pp1,ref,!forward,1);
if(forward) Guide.FirstParameter(wf);
else Guide.LastParameter(wl);
}
- else Standard_Failure::Raise("PerformSetOfSurfOnElSpine : Chainage impossible.");
+ else Standard_Failure::Raise("PerformSetOfSurfOnElSpine : Chaining is impossible.");
}
- // Definition du domaine de cheminement It1, It2
+ // Definition of the domain of path It1, It2
It1->Initialize(HS1);
It2->Initialize(HS2);
- // Calcul d'une (plusieur si singularite) SurfaData
+ // Calculate one (several if singularity) SurfaData
SD = new ChFiDS_SurfData();
ChFiDS_SequenceOfSurfData SeqSD;
SeqSD.Append(SD);
Stripe->Choix());
- // Calcul du critere de Choix arete / arete
+ // Calculate the criterion of Choice edge / edge
if (Choix%2 == 0) Choix = 4;
else Choix = 1;
}
else{
#ifdef DEB
- ChFi3d_InitChron(ch1); // init perf pour PerformSurf
+ ChFi3d_InitChron(ch1); // init perf for PerformSurf
#endif
PerformSurf(SeqSD,HGuide,Spine,Choix,
HS1,It1,HC1,HSref1,HCref1,decroch1,Or1,
MaxStep,locfleche,tolesp,First,Last,Inside,Inside,forward,
RecP1,RecRst1,RecP2,RecRst2,SoldepCC);
#ifdef DEB
- ChFi3d_ResultChron(ch1,t_performsurf); //result perf pour PerformSurf
+ ChFi3d_ResultChron(ch1,t_performsurf); //result perf for PerformSurf
#endif
}
SD->ChangeIndexOfS1(DStr.AddShape(HS1->ChangeSurface().Face()));
}
else{
#ifdef DEB
- ChFi3d_InitChron(ch1); // init perf pour PerformSurf
+ ChFi3d_InitChron(ch1); // init perf for PerformSurf
#endif
PerformSurf(SeqSD,HGuide,Spine,Choix,HS1,It1,HC1,HSref1,HCref1,decroch1,
HS2,It2,Or2,MaxStep,locfleche,tolesp,First,Last,
Inside,Inside,forward,RecP1,RecS2,RecRst1,SoldepCS);
#ifdef DEB
- ChFi3d_ResultChron(ch1,t_performsurf);//result perf pour PerformSurf
+ ChFi3d_ResultChron(ch1,t_performsurf);//result perf for PerformSurf
#endif
}
SD->ChangeIndexOfS1(DStr.AddShape(HS1->ChangeSurface().Face()));
}
else{
#ifdef DEB
- ChFi3d_InitChron(ch1); // init perf pour PerformSurf
+ ChFi3d_InitChron(ch1); // init perf for PerformSurf
#endif
PerformSurf(SeqSD,HGuide,Spine,Choix,HS1,It1,Or1,
HS2,It2,HC2,HSref2,HCref2,decroch2,MaxStep,locfleche,tolesp,
First,Last,Inside,Inside,forward,RecP2,RecS1,RecRst2,SoldepCS);
#ifdef DEB
- ChFi3d_ResultChron(ch1,t_performsurf); //result perf pour PerformSurf
+ ChFi3d_ResultChron(ch1,t_performsurf); //result perf for PerformSurf
#endif
}
SD->ChangeIndexOfS1(DStr.AddShape(HS1->ChangeSurface().Face()));
decroch1 = decroch2 = 0;
}
- if(!done) { // Cas d'echec
+ if(!done) { // Case of fail
if ((!Ok1 && !obstacleon1) || (!Ok2 && !obstacleon2)) {
- //Echec dans une partie de prolongement ce n'est pas grave
- //On s'arrete la.
+ //Fail in a part of extension is not serious
+ //Here one stops.
done = Standard_True;
Inside = Standard_False;
if (forward) intl = 1;
else intf = 1;
}
- else { // Sinon invalidation de la stripe.
+ else { // Otherwise invalidation of the stripe.
Spine->SetErrorStatus(ChFiDS_WalkingFailure);
- Standard_Failure::Raise("CallPerformSurf : Echec cheminement!");
+ Standard_Failure::Raise("CallPerformSurf : Path failed!");
}
}
}
if (!Ok1 && !obstacleon1)
- // nettoyage des infos sur le plan de prolongement.
+ // clean infos on the plane of extension.
ChFi3d_Purge (Stripe,SD,ref->Vertex(!forward,1),!forward,1,intf,intl);
if (!Ok2 && !obstacleon2)
- // nettoyage des infos sur le plan de prolongement.
+ // clean infos on the plane of extension.
ChFi3d_Purge (Stripe,SD,ref->Vertex(!forward,2),!forward,2,intf,intl);
- // C'est fini on change la reference
+ // The end. The reference is changed.
ref = refbis;
}
- if(Inside){// on a des solutions de depart pour les suivants.
+ if(Inside){// There are starting solutions for the next.
Inside = Standard_False;
Firstsov = First;
if(Guide.IsPeriodic()) {
}
if(forward){
fini = ((wl - Last) <= 10.*tolesp ||
- (intl && !(obstacleon1 || obstacleon2))); //Cas general
+ (intl && !(obstacleon1 || obstacleon2))); //General case
if (!fini && Guide.IsPeriodic() &&
((wl - Last)< Guide.Period()*1.e-3)) {
- // On test si les recadrage extremes se font sur la meme edge
- // Condition de bouclage
+ // It is tested if reframing of extremes is done at the same edge
+ // Loop Condition
Handle(ChFiDS_SurfData) thefirst, thelast;
thefirst = Stripe->SetOfSurfData()->Sequence().First();
thelast = Stripe->SetOfSurfData()->Sequence().Last();
(thelast->VertexLastOnS2().Arc());
if (fini)
- return; //C'est fini !!
+ return; //It is ended!
}
if(fini && complete) {
- // on repart dans l autre sens.
+ // restart in the opposite direction.
ref = Stripe->SetOfSurfData()->Sequence().First();
forward = Standard_False;
fini = Standard_False;
Last = wf;
}
}
- // On remet l etat dans les wc ou on l a trouve.
+ // The initial state is restored
if(!Guide.IsPeriodic()){
Guide.FirstParameter(wfsav);
Guide.LastParameter (wlsav);
TopAbs_Orientation Or1,Or2,RefOr1,RefOr2;
Standard_Integer Choix,RefChoix;
- // initialisation du stripe.
+ // initialization of the stripe.
Stripe->Reset();
Handle(ChFiDS_HData)& HData = Stripe->ChangeSetOfSurfData();
HData = new ChFiDS_HData();
Standard_Real WEndPeriodic = Spine->LastParameter(Spine->NbEdges());
Spine->D1(WEndPeriodic,PEndPeriodic,TEndPeriodic);
- // Construction des cas particuliers.
+ // Construction of particular cases.
for (Standard_Integer iedge = 1; iedge <= Spine->NbEdges(); iedge++){
if(!ChFiKPart_ComputeData::Compute(DStr,SD,HS1,HS2,Or1,Or2,Spine,iedge)){
#ifdef DEB
- cout<<"echec calcul KPart"<<endl;
+ cout<<"failed calculation KPart"<<endl;
#endif
}
else if(!SplitKPart(SD,LSD,Spine,iedge,HS1,It1,HS2,It2,intf,intl)){
#ifdef DEB
- cout<<"echec calcul KPart"<<endl;
+ cout<<"failed calculation KPart"<<endl;
#endif
LSD.Clear();
}
else iedgelastkpart = iedge;
- if(Spine->IsPeriodic()){//debug provisoire pour les SD qui arrivent dans le desordre.
+ if(Spine->IsPeriodic()){//debug provisory for SD that arrive in desorder.
Standard_Integer nbsd = LSD.Length();
Standard_Real period = Spine->Period();
Standard_Real wfp = WStartPeriodic, wlp = WEndPeriodic;
TgtKP(LSD.Value(j),Spine,iedge,1,PFirst,TFirst);
TgtKP(LSD.Value(j),Spine,iedge,0,PLast,TLast);
- // Determination des portions a approximer
+ // Determine the sections to approximate
if(!YaKPart){
if(Spine->IsPeriodic()){
WStartPeriodic = WFirst;
Spine->SetLastParameter(WEndPeriodic);
}
else if(!intf || (iedge > 1)){
- // portion debut -> premier KPart
- // mise a jour du prolongement.
+ // start section -> first KPart
+ // update of extension.
Spine->SetFirstTgt(Min(0.,WFirst));
CurrentHE->ChangeCurve().LastParameter (WFirst);
CurrentHE->ChangeCurve().SetLastPointAndTgt(PFirst,TFirst);
}
else {
if (WFirst - CurrentHE->FirstParameter() > tolesp) {
- // portion entre deux KPart
+ // section between two KPart
CurrentHE->ChangeCurve().LastParameter(WFirst);
CurrentHE->ChangeCurve().SetLastPointAndTgt(PFirst,TFirst);
Spine->AppendElSpine(CurrentHE);
}
if (!intl || (iedgelastkpart < Spine->NbEdges())) {
- // portion dernier KPart(ou debut du spine) -> Fin du spine.
- // mise a jour du prolongement.
+ // section last KPart(or start of the spine) -> End of the spine.
+ // update of the extension.
if(Spine->IsPeriodic()){
if(WEndPeriodic - WLast > tolesp){
Standard_Integer last = len, i;
Standard_Boolean periodic = Spine->IsPeriodic();
if(periodic) last++;
- // On essaye de reprendre les carreaux qui vrillent.
+ // It is attempted to reprocess the squares that bore.
for(i = 1; i <= len; i++){
Handle(ChFiDS_SurfData)& cursd = SeqSurf.ChangeValue(i);
Standard_Boolean tw1 = cursd->TwistOnS1();
else inext = 0;
}
- // Pour l instant on ne corrige que les surfaces ou le twist est
- // detecte au cheminement, il faudra prevoir un controle plus
- // subtile des traces moches ( taille, courbure, inflexion... )
+ // For the moment only the surfaces where the twist is
+ // detected at the path are corrected, it is necessary to control
+ // more subtly the ugly traces (size, curvature, inflexion... )
if(!tw1 && !tw2) continue;
- // On decide (assez arbitrairement) si la surface incriminee se prete
- // a un remplissage.
+ // It is decided (fairly at random) if the extended surface is ready for the filling.
ChFiDS_FaceInterference& intf1 = cursd->ChangeInterferenceOnS1();
ChFiDS_FaceInterference& intf2 = cursd->ChangeInterferenceOnS2();
Standard_Integer cursurf1 = cursd->IndexOfS1();
Standard_Boolean possibleon2 = (don2 < 2*(ddeb + dfin));
if((tw1 && !possibleon1) || (tw2 && !possibleon2)) {
Spine->SetErrorStatus(ChFiDS_TwistedSurface);
- Standard_Failure::Raise("rattrapage en retouchant les points non ecrit");
+ Standard_Failure::Raise("adjustment by reprocessing the non-written points");
}
- // On regarde si il y a des voisins presentables
+ // It is checked if there are presentable neighbors
Standard_Boolean yaprevon1 = 0, yaprevon2 = 0;
Standard_Boolean samesurfon1 = 0, samesurfon2 = 0;
if(iprev){
yanexton2 = !nextsd->TwistOnS2();
if(samesurfon2) samesurfon2 = (nextsd->IndexOfS2() == cursurf2);
}
- // On construit un contour de remplissage
+ // A contour of filling is constructed
Handle(Geom2d_Curve) PC1 = intf1.PCurveOnFace();
Handle(Geom2d_Curve) PC2 = intf2.PCurveOnFace();
Handle(BRepAdaptor_HSurface) S1 = new BRepAdaptor_HSurface();
if(!yaprevon1 || !yanexton1){
Spine->SetErrorStatus(ChFiDS_TwistedSurface);
Standard_Failure::Raise
- ("rattrapage en retouchant les points non ecrit : pas de voisin");
+ ("adjustment by reprocessing the non-written points: no neighbor");
}
ChFiDS_FaceInterference& previntf1 = prevsd->ChangeInterferenceOnS1();
ChFiDS_FaceInterference& nextintf1 = nextsd->ChangeInterferenceOnS1();
Standard_Real prevpar1 = previntf1.LastParameter();
Standard_Real nextpar1 = nextintf1.FirstParameter();
if(samesurfon1){
- // On regarde si on peut intersecter les traces des voisins
- // pour faire un pointu.
+ // It is checked if it is possible to intersect traces of neighbors
+ // to create a sharp end.
Handle(Geom2d_Curve) pcprev1 = previntf1.PCurveOnFace();
Handle(Geom2d_Curve) pcnext1 = nextintf1.PCurveOnFace();
Standard_Real nprevpar1,nnextpar1;
}
}
else{
- //ici on se fonde sur les tangentes 3d des voisins.
+ //here the base is on 3D tangents of neighbors.
const Handle(Geom_Curve)& c3dprev1 =
DStr.Curve(previntf1.LineIndex()).Curve();
const Handle(Geom_Curve)& c3dnext1 =
if(tw2){
if(!yaprevon2 || !yanexton2){
Standard_Failure::Raise
- ("rattrapage en retouchant les points non ecrit : pas de voisin");
+ ("adjustment by reprocessing the non-written points: no neighbor");
}
ChFiDS_FaceInterference& previntf2 = prevsd->ChangeInterferenceOnS2();
ChFiDS_FaceInterference& nextintf2 = nextsd->ChangeInterferenceOnS2();
Standard_Real prevpar2 = previntf2.LastParameter();
Standard_Real nextpar2 = nextintf2.FirstParameter();
if(samesurfon2){
- // On regarde si on peut intersecter les traces des voisins
- // pour faire un pointu.
+ // It is checked if it is possible to intersect traces of neighbors
+ // to create a sharp end.
Handle(Geom2d_Curve) pcprev2 = previntf2.PCurveOnFace();
Handle(Geom2d_Curve) pcnext2 = nextintf2.PCurveOnFace();
Standard_Real nprevpar2,nnextpar2;
}
}
else{
- //ici on se fonde sur les tangentes 3d des voisins.
+ //here the base is on 3D tangents of neighbors.
const Handle(Geom_Curve)& c3dprev2 =
DStr.Curve(previntf2.LineIndex()).Curve();
const Handle(Geom_Curve)& c3dnext2 =
else{
Bon2 = ChFi3d_mkbound(S2,PC2,tolesp,2.e-4);
}
- // Les parametres des traces des voisins sont a jour, on tire donc des
- // droites uv.
+ // The parameters of neighbor traces are updated, so
+ // straight lines uv are pulled.
const Handle(Geom_Surface)&
sprev = DStr.Surface(prevsd->Surf()).Surface();
const Handle(Geom_Surface)&
Handle(Geom_Surface) newsurf = fil.Surface();
#ifdef DEB
#ifdef DRAW
- //POP pour NT
+ //POP for NT
char* pops = "newsurf";
DrawTrSurf::Set(pops,newsurf);
#endif
#endif
if(pointuon1) {
- newsurf->VReverse(); // on se ramene au sens 1 vers 2;
+ newsurf->VReverse(); // we return to direction 1 from 2;
done = CompleteData(cursd,newsurf,S1,PC1,S2,PC2,
F2.Orientation(),0,0,0,0,0);
cursd->ChangeIndexOfS1(0);
nextsd->ChangeVertexFirstOnS2().SetPoint(cpf2.Point());
}
}
- // On met a jour la tolerance des points.
+ // The tolerance of points is updated.
for(i = 1; i < last; i++){
Standard_Integer j = i%len + 1;
Standard_Integer curs1, curs2;
if(!curp1.IsOnArc() && nextp1.IsOnArc()){
curp1 = nextp1;
if ( (curs1 == nexts1) && !nextsd->IsOnCurve1())
- // Cas ou l'on passe par la frontiere sans sortir
+ // Case when it is not possible to pass along the border without leaving
ChangeTransition(nextp1, curp1, nexts1, myDS);
}
else if(curp1.IsOnArc() && !nextp1.IsOnArc()) {
curp1.SetTolerance(tol1); nextp1.SetTolerance(tol1);
curp2.SetTolerance(tol2); nextp2.SetTolerance(tol2);
}
- // On met a jour les liens edge/nouvelles faces.
+ // The connections edge/new faces are updated.
for (ILES.Initialize(ll) ; ILES.More(); ILES.Next()) {
const Handle(ChFiDS_HElSpine)& curhels = ILES.Value();
const ChFiDS_ElSpine& curels = curhels->ChangeCurve();
IL = Spine->Index(WL,0);
}
if(IF == IL) {
- //traitement rapide
+ //fast processing
Standard_Integer IFloc = IF;
if(periodic) IFloc = (IF - 1)%nbed + 1;
const TopoDS_Edge& Ej = Spine->Edges(IFloc);
else if(IF < IL){
TColStd_Array1OfReal wv(IF,IL - 1);
#ifdef DEB
- cout<<"longueur du trajet : "<<(WL-WF)<<endl;
+ cout<<"length of the trajectory : "<<(WL-WF)<<endl;
#endif
for(i = IF; i < IL; i++){
Standard_Integer iloc = i;
}
else {
#ifdef DEB
- cout<<"echec projection vertex ElSpine!!!"<<endl;
+ cout<<"fail of projection vertex ElSpine!!!"<<endl;
#endif
}
}
#ifdef DEB
OSD_Chronometer ch;
- ChFi3d_InitChron(ch);// init perf pour PerformSetOfKPart
+ ChFi3d_InitChron(ch);// init perf for PerformSetOfKPart
#endif
const Handle(ChFiDS_Spine)& sp = Stripe->Spine();
#ifdef DEB
ChFi3d_ResultChron(ch ,t_perfsetofkpart); // result perf PerformSetOfKPart(
- ChFi3d_InitChron(ch); // init perf pour PerformSetOfKGen
+ ChFi3d_InitChron(ch); // init perf for PerformSetOfKGen
#endif
PerformSetOfKGen(Stripe,Simul);
#ifdef DEB
ChFi3d_ResultChron(ch, t_perfsetofkgen);//result perf PerformSetOfKGen
- ChFi3d_InitChron(ch); // init perf pour ChFi3d_MakeExtremities
+ ChFi3d_InitChron(ch); // init perf for ChFi3d_MakeExtremities
#endif
if(!Simul) ChFi3d_MakeExtremities(Stripe,DStr,myEFMap,tolesp,tol2d);
#include <TopTools_ListIteratorOfListOfShape.hxx>
#ifdef DEB
-// Pour les mesures.
+// For measurements.
#include <OSD_Chronometer.hxx>
//static OSD_Chronometer appclock;
#endif
const Standard_Real preftg)
{
Standard_Boolean found = 0;
- //(1) On verifie si les paramtres fournies sont bon
- // cas ou les pcurves sont paramtres comme la spine.
+ //(1) It is checked if the provided parameters are good
+ // if pcurves have the same parameters as the spine.
gp_Pnt2d point = Carc.Value(prefarc);
Standard_Real distini = point.Distance(Ctg->Value(preftg));
if (distini <= Precision::PConfusion()) {
found = Standard_True;
}
else {
- //(2) On intersecte
+ //(2) Intersection
#ifdef DEB
- cout<< "CompParam : mauvais parametres on intersecte"<<endl;
+ cout<< "CompParam : bad intersection parameters"<<endl;
#endif
IntRes2d_IntersectionPoint int2d;
Geom2dInt_GInter Intersection;
nbseg = Intersection.NbSegments();
if ( nbseg > 0 ){
#ifdef DEB
- cout<< "segments d intersection sur les restrictions"<<endl;
+ cout<< "segments of intersection on the restrictions"<<endl;
#endif
}
nbpt = Intersection.NbPoints();
}
if(!found){
- // (3) On projette...
+ // (3) Projection...
#ifdef DEB
- cout<<"CompParam : echec intersection PC, on projette."<<endl;
+ cout<<"CompParam : failed intersection PC, projection is created."<<endl;
#endif
parc = prefarc;
Geom2dAPI_ProjectPointOnCurve projector(point,Ctg);
if(projector.NbPoints() == 0){
- // Cela arrive parfois dans les cas singuliers ou l'on sort
- // en bout de spine sur vertex...
+ // This happens in some cases when there is a vertex
+ // at the end of spine...
ptg = preftg;
#ifdef DEB
- cout<<"CompParam : echec proj p2d/c2d, on prend l'extremite!" <<endl;
+ cout<<"CompParam : failed proj p2d/c2d, the extremity is taken!" <<endl;
#endif
}
else {
- // On controle que l'on n'as pas calculer n'importe quoi (EDC402 C2)
+ // It is checked if everything was calculated correctly (EDC402 C2)
if (projector.LowerDistance() < distini)
ptg = projector.LowerDistanceParameter();
else ptg = preftg;
//=======================================================================
//function : CompBlendPoint
-//purpose : fabrique le BlendPoint correspondant a une tangence sur Vertex
-// pmn : 15/10/1997 : renvoi false, si l'on n' a pas de pcurve
+//purpose : create BlendPoint corresponding to a tangency on Vertex
+// pmn : 15/10/1997 : returns false, if there is no pcurve
//=======================================================================
static Standard_Boolean CompBlendPoint(const TopoDS_Vertex& V,
//=======================================================================
//function : UpdateLine
-//purpose : Met a jour les extremites apres une invalidation partiel
+//purpose : Updates extremities after a partial invalidation
//=======================================================================
static void UpdateLine(Handle(BRepBlend_Line)& Line,
//=======================================================================
//function : CompleteData
-//purpose : Calcule les courbes et les CommonPoints a partir des donnees
-// calculees par remplissage.
+//purpose : Calculates curves and CommonPoints from the data
+// calculated by filling.
//=======================================================================
Standard_Boolean ChFi3d_Builder::CompleteData
if(!Gf1) Data->ChangeVertexLastOnS1().SetPoint(Surfcoin->Value(ULast,VFirst));
if(!Gf2) Data->ChangeVertexLastOnS2().SetPoint(Surfcoin->Value(ULast,VLast));
- //calcul des courbes cote S1
+ //calculate curves side S1
Handle(Geom_Curve) Crv3d1;
if(!PC1.IsNull()) Crv3d1= Surfcoin->VIso(VFirst);
gp_Pnt2d pd1(UFirst,VFirst), pf1(ULast,VFirst);
Fint1.SetFirstParameter(UFirst);
Fint1.SetLastParameter(ULast);
Fint1.SetInterference(Index1OfCurve,tra1,c2dtrim,PCurveOnSurf);
- //calcul des courbes cote S2
+ //calculate curves side S2
Handle(Geom_Curve) Crv3d2;
if(!PC2.IsNull()) Crv3d2 = Surfcoin->VIso(VLast);
gp_Pnt2d pd2(UFirst,VLast), pf2(ULast,VLast);
//=======================================================================
//function : CompleteData
-//purpose : Calcule la surface les courbes et eventuellement les
-// CommonPoints a partir des donnees calculees dans
-// ComputeData.
+//purpose : Calculates the surface of curves and eventually
+// CommonPoints from the data calculated in ComputeData.
//
-// 11/08/1996 : Utilisation de F(t)
+// 11/08/1996 : Use of F(t)
//
//=======================================================================
//=======================================================================
//function : CompleteData
-//purpose : Nouvelle surcharge pour les fonctions surf/rst
+//purpose : New overload for functions surf/rst
// jlr le 28/07/97 branchement F(t)
//=======================================================================
myConti);
if (!approx.IsDone()) {
#ifdef DEB
- cout << "Approximation non faite !!!" << endl;
+ cout << "Approximation is not done!" << endl;
#endif
return Standard_False;
}
//=======================================================================
//function : CompleteData
-//purpose : Nouvelle surcharge pour les fonctions rst/rst
+//purpose : New overload for functions rst/rst
// jlr le 28/07/97 branchement F(t)
//=======================================================================
//=======================================================================
//function : StoreData
-//purpose : Recopie d un resultat d approx dans une SurfData.
+//purpose : Copy of an approximation result in SurfData.
//=======================================================================
Standard_Boolean ChFi3d_Builder::StoreData(Handle(ChFiDS_SurfData)& Data,
const Standard_Boolean Gf2,
const Standard_Boolean Reversed)
{
- // Petits outils pour les controles.
+ // Small control tools.
static Handle(GeomAdaptor_HCurve) checkcurve;
if(checkcurve.IsNull()) checkcurve = new GeomAdaptor_HCurve();
GeomAdaptor_Curve& chc = checkcurve->ChangeCurve();
}
TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS();
- // On rend l espace parametric de la surface carre a defaut de pouvoir
- // parametrer en U par # R*teta // a revoir lbo 29/08/97
+ // By default parametric space is created using a square surface
+ // to be able to parameterize in U by # R*teta // a revoir lbo 29/08/97
const TColStd_Array1OfReal& ku = approx.SurfUKnots();
const TColStd_Array1OfReal& kv = approx.SurfVKnots();
Standard_Real larg = (kv(kv.Upper())-kv(kv.Lower()));
kku,kv,
approx.SurfUMults(),approx.SurfVMults(),
approx.UDegree(),approx.VDegree());
-// prolongement de la surface
+// extension of the surface
Standard_Real length1,length2;
length1=Data->FirstExtensionValue();
Standard_Integer ion1 = 1, ion2 = 2;
if(Reversed) { Uon1 = ULast; Uon2 = UFirst; ion1 = 2; ion2 = 1; }
- // On remplit la SurfData pour ce qui concerne S1,
+ // The SurfData is filled in what concerns S1,
Handle(Geom_Curve) Crv3d1 = Surf->UIso(Uon1);
gp_Pnt2d pori1(Uon1,0.);
gp_Lin2d lfil1(pori1,gp::DY2d());
if(!ChFi3d_CheckSameParameter(checkcurve,PCurveOnFace,S1,tolC1,tolcheck)){
#ifdef DEB
- cout<<"tol approx sous evaluee : "<<tolC1<<" pour "<<tolcheck<<endl;
+ cout<<"aaproximate tolerance under-valued : "<<tolC1<<" for "<<tolcheck<<endl;
#endif
tolC1 = tolcheck;
}
else TraOn1 = ChFi3d_TrsfTrans(lin->TransitionOnS1());
Fint1.SetInterference(Index1OfCurve,TraOn1,PCurveOnFace,PCurveOnSurf);
- // on remplit la SurfData pour ce qui concerne S2,
+ // SurfData is filled in what concerns S2,
Handle(Geom_Curve) Crv3d2 = Surf->UIso(Uon2);
gp_Pnt2d pori2(Uon2,0.);
gp_Lin2d lfil2(pori2,gp::DY2d());
chc.Load(Crv3d2,par1,par2);
if(!ChFi3d_CheckSameParameter(checkcurve,PCurveOnFace,S2,tolC2,tolcheck)){
#ifdef DEB
- cout<<"tol approx sous evaluee : "<<tolC2<<" pour "<<tolcheck<<endl;
+ cout<<"approximate tolerance under-evaluated : "<<tolC2<<" for "<<tolcheck<<endl;
#endif
tolC2 = tolcheck;
}
(Index2OfCurve,TopAbs_FORWARD,bidpc,PCurveOnSurf);
}
- // on calcule l orientation du conge par rapport aux faces,
+ // the orientation of the fillet in relation to the faces is evaluated,
Handle(Adaptor3d_HSurface) Sref = S1;
PCurveOnFace = Fint1.PCurveOnFace();
if(!Gf2 && !S2.IsNull())
ChFi3d_FilCommonPoint(lin->EndPointOnSecond(),lin->TransitionOnS2(),
Standard_False, Data->ChangeVertex(0,ion2),tolC2);
- // Les parametres sur l ElSpine
+ // Parameters on ElSpine
Standard_Integer nbp = lin->NbPoints();
Data->FirstSpineParam(lin->Point(1).Parameter());
Data->LastSpineParam(lin->Point(nbp).Parameter());
//=======================================================================
//function : ComputeData
-//purpose : Chapeau du cheminement edge/face pour le contournement
-// d obstacle.
+//purpose : Head of the path edge/face for the bypass of obstacle.
//=======================================================================
Standard_Boolean ChFi3d_Builder::ComputeData
#else
Standard_Integer Nbpnt;
#endif
- // on recadre la solution de depart a la demande.
+ // the initial solution is reframed if necessary.
math_Vector ParSol(1,3);
Standard_Real NewFirst = PFirst;
if(RecP || RecS || RecRst){
tolesp,TolGuide,RecRst,RecP,RecS,
NewFirst,ParSol)){
#ifdef DEB
- cout<<"ChFi3d_Builder::ComputeData : echec calcul first section"<<endl;
+ cout<<"ChFi3d_Builder::ComputeData : calculation fail first section"<<endl;
#endif
return Standard_False;
}
if (!TheWalk.IsDone()) {
#ifdef DEB
- cout << "Cheminement non fait" << endl;
+ cout << "Path not created" << endl;
#endif
return Standard_False;
}
if (reverse) {
if (!TheWalk.Complete(Func,FInv,FInvP,FInvC,SpLast)) {
#ifdef DEB
- cout << "Complement non fait" << endl;
+ cout << "Not completed" << endl;
#endif
}
}
if (Nbpnt <= 1 && again == 0) {
again++;
#ifdef DEB
- cout <<"1 seul point de cheminement on essaye MS/50."<<endl;
+ cout <<"one point of the path MS/50 is attempted."<<endl;
#endif
MS = MS/50.; Target = Targetsov;
}
else if (Nbpnt<=nbptmin && again == 0) {
again++;
#ifdef DEB
- cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+ cout <<"Number of points is too small, the step is reduced"<<endl;
#endif
Standard_Real u1 = Lin->Point(1).Parameter();
Standard_Real u2 = Lin->Point(Nbpnt).Parameter();
}
else if(Nbpnt<=nbptmin){
#ifdef DEB
- cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+ cout <<"Number of points is still too small, quit"<<endl;
#endif
return Standard_False;
}
//=======================================================================
//function : ComputeData
-//purpose : Chapeau du cheminement edge/edge pour le contournement
-// d obstacle.
+//purpose : Heading of the path edge/edge for the bypass of obstacle.
//=======================================================================
Standard_Boolean ChFi3d_Builder::ComputeData
#else
Standard_Integer Nbpnt;
#endif
- // on recadre la solution de depart a la demande.
+ // the initial solution is reframed if necessary.
math_Vector ParSol(1,2);
Standard_Real NewFirst = PFirst;
if (RecP1 || RecRst1 || RecP2 || RecRst2) {
tolesp, TolGuide, RecRst1, RecP1, RecRst2, RecP2,
NewFirst, ParSol)){
#ifdef DEB
- cout<<"ChFi3d_Builder::ComputeData : echec calcul first section"<<endl;
+ cout<<"ChFi3d_Builder::ComputeData : fail calculation first section"<<endl;
#endif
return Standard_False;
}
if (!TheWalk.IsDone()) {
#ifdef DEB
- cout << "Cheminement non fait" << endl;
+ cout << "Path not done" << endl;
#endif
return Standard_False;
}
if (reverse) {
if (!TheWalk.Complete(Func, FInv1, FInvP1, FInv2, FInvP2, SpLast)) {
#ifdef DEB
- cout << "Complement non fait" << endl;
+ cout << "Not completed" << endl;
#endif
}
}
if (Nbpnt <= 1 && again == 0) {
again++;
#ifdef DEB
- cout <<"1 seul point de cheminement on essaye MS/50."<<endl;
+ cout <<"one point of path MS/50 is attempted."<<endl;
#endif
MS = MS/50.; Target = Targetsov;
}
else if (Nbpnt<=nbptmin && again == 0) {
again++;
#ifdef DEB
- cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+ cout <<"Number of points is too small, the step is reduced"<<endl;
#endif
Standard_Real u1 = Lin->Point(1).Parameter();
Standard_Real u2 = Lin->Point(Nbpnt).Parameter();
}
else if(Nbpnt<=nbptmin){
#ifdef DEB
- cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+ cout <<"Number of points is still too small, quit"<<endl;
#endif
return Standard_False;
}
//=======================================================================
//function : SimulData
-//purpose : Chapeau du cheminement edge/face pour le contournement
-// d obstacle en mode simulation.
+//purpose : Heading of the path edge/face for the bypass of obstacle in simulation mode.
//=======================================================================
Standard_Boolean ChFi3d_Builder::SimulData
#else
Standard_Integer Nbpnt;
#endif
- // on recadre la solution de depart a la demande.
+ // the starting solution is reframed if needed.
math_Vector ParSol(1,3);
Standard_Real NewFirst = PFirst;
if(RecP || RecS || RecRst){
NewFirst,ParSol)){
#ifdef DEB
- cout<<"ChFi3d_Builder::SimulData : echec calcul first section"<<endl;
+ cout<<"ChFi3d_Builder::SimulData : fail calculate first section"<<endl;
#endif
return Standard_False;
}
MS,TolGuide,ParSol,tolesp,Fleche,Appro);
if (!TheWalk.IsDone()) {
#ifdef DEB
- cout << "Cheminement non fait" << endl;
+ cout << "Path not done" << endl;
#endif
return Standard_False;
}
if (reverse) {
if (!TheWalk.Complete(Func,FInv,FInvP,FInvC,SpLast)) {
#ifdef DEB
- cout << "Complement non fait" << endl;
+ cout << "Not completed" << endl;
#endif
}
}
if (Nbpnt <= 1 && again == 0) {
again++;
#ifdef DEB
- cout <<"1 seul point de cheminement on essaye MS/50."<<endl;
+ cout <<"one point of path MS/50 is attempted."<<endl;
#endif
MS = MS/50.; Target = Targetsov;
}
else if (Nbpnt <= NbSecMin && again == 0) {
again++;
#ifdef DEB
- cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+ cout <<"Number of points is too small, the step is reduced"<<endl;
#endif
Standard_Real u1 = Lin->Point(1).Parameter();
Standard_Real u2 = Lin->Point(Nbpnt).Parameter();
}
else if(Nbpnt<=NbSecMin){
#ifdef DEB
- cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+ cout <<"Number of points is still too small, quit"<<endl;
#endif
return Standard_False;
}
//=======================================================================
//function : SimulData
-//purpose : Chapeau du cheminement edge/edge pour le contournement
-// d obstacle en mode simulation.
+//purpose : Heading of path edge/edge for the bypass
+// of obstacle in simulation mode.
//=======================================================================
Standard_Boolean ChFi3d_Builder::SimulData
#else
Standard_Integer Nbpnt;
#endif
- // on recadre la solution de depart a la demande.
+ // The initial solution is reframed if necessary.
math_Vector ParSol(1,2);
Standard_Real NewFirst = PFirst;
if (RecP1 || RecRst1 || RecP2 || RecRst2) {
NewFirst,ParSol)){
#ifdef DEB
- cout<<"ChFi3d_Builder::SimulData : echec calcul first section"<<endl;
+ cout<<"ChFi3d_Builder::SimulData : calculation fail first section"<<endl;
#endif
return Standard_False;
}
MS, TolGuide, ParSol, tolesp, Fleche, Appro);
if (!TheWalk.IsDone()) {
#ifdef DEB
- cout << "Cheminement non fait" << endl;
+ cout << "Path not created" << endl;
#endif
return Standard_False;
}
if (reverse) {
if (!TheWalk.Complete(Func, FInv1, FInvP1, FInv2, FInvP2, SpLast)) {
#ifdef DEB
- cout << "Complement non fait" << endl;
+ cout << "Not completed" << endl;
#endif
}
}
if (Nbpnt <= 1 && again == 0) {
again++;
#ifdef DEB
- cout <<"1 seul point de cheminement on essaye MS/50."<<endl;
+ cout <<"only one point of path MS/50 is attempted."<<endl;
#endif
MS = MS/50.; Target = Targetsov;
}
else if (Nbpnt <= NbSecMin && again == 0) {
again++;
#ifdef DEB
- cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+ cout <<"Number of points is too small, the step is reduced"<<endl;
#endif
Standard_Real u1 = Lin->Point(1).Parameter();
Standard_Real u2 = Lin->Point(Nbpnt).Parameter();
}
else if(Nbpnt<=NbSecMin){
#ifdef DEB
- cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+ cout <<"Number of points is still too small, quit"<<endl;
#endif
return Standard_False;
}
//=======================================================================
//function : ComputeData
-//purpose : Construction d un conge elementaire par cheminement.
+//purpose : Construction of elementary fillet by path.
//
//=======================================================================
const Standard_Boolean RecOnS1,
const Standard_Boolean RecOnS2)
{
- //Les prolongements en cas de sortie des deux domaines sont faits
- //de facon directe et non plus par cheminement ( trop hasardeux ).
+ //The extrensions are created in case of output of two domains
+ //directly and not by path ( too hasardous ).
Data->FirstExtensionValue(0);
Data-> LastExtensionValue(0);
- //On recupere les faces eventuelles pour les tests de saut d edge.
+ //The eventual faces are restored to test the jump of edge.
TopoDS_Face F1, F2;
Handle(BRepAdaptor_HSurface) HS = Handle(BRepAdaptor_HSurface)::DownCast(S1);
if(!HS.IsNull()) F1 = HS->ChangeSurface().Face();
HS = Handle(BRepAdaptor_HSurface)::DownCast(S2);
if(!HS.IsNull()) F2 = HS->ChangeSurface().Face();
- // Variables d'encadrement du cheminement
+ // Path framing variables
Standard_Real TolGuide=tolguide, TolEsp = tolesp;
Standard_Integer nbptmin = 4;
BRepBlend_Walking TheWalk(S1,S2,I1,I2);
- //Debut du carnage, on eteint les controles 2d du cheminement
- //qui s'accomodent mal des surfaces a parametrages non homogenes
- //en u et en v.
+ //Start of removal, 2D path controls
+ //that qui s'accomodent mal des surfaces a parametrages non homogenes
+ //en u et en v are extinguished.
TheWalk.Check2d(0);
Standard_Real MS = MaxStep;
Standard_Real SpFirst = HGuide->FirstParameter();
Standard_Real SpLast = HGuide->LastParameter();
- // Lorsque le point de depart est interne, on chemine
- // d abord a gauche afin de determiner le Last pour les
- // periodiques.
+ // When the start point is inside, the path goes first to the left
+ // to determine the Last for the periodicals.
Standard_Boolean reverse = (!Forward || Inside);
Standard_Real Target;
if(reverse){
if(!intl) Target = Last;
}
- // Dans le cas de singularite pre-determinee,
- // on en informe le cheminement
+ // In case if the singularity is pre-determined,
+ // the path is indicated.
if (!Spine.IsNull()){
if (Spine->IsTangencyExtremity(Standard_True)) {
TopoDS_Vertex V = Spine->FirstVertex();
}
}
- //On recadre la solution de depart a la demande.
+ //The starting solution is reframed if necessary.
//**********************************************//
math_Vector ParSol(1,4);
Standard_Real NewFirst = PFirst;
tolesp,TolGuide,RecOnS1,RecOnS2,
NewFirst,ParSol)){
#ifdef DEB
- cout<<"ChFi3d_Builder::ComputeData : echec calcul first section"<<endl;
+ cout<<"ChFi3d_Builder::ComputeData : calculation fail first section"<<endl;
#endif
return Standard_False;
}
ParSol = Soldep;
}
- //On calcule d abord la partie valide, sans souci des prolongements.
+ //First the valid part is calculate, without caring for the extensions.
//******************************************************************//
Standard_Integer again = 0;
Standard_Boolean tchernobyl = 0;
Standard_Real u1sov, u2sov;
#endif
TopoDS_Face bif;
- //Un pas max coherent, mais grand, on compte sur la fleche pour detecter
- //les vrillages.
+ //Max step is relevant, but too great, the vector is required to detect
+ //the twists.
if( (Abs(Last-First) <= MS * 5.) &&
(Abs(Last-First) >= 0.01*Abs(NewFirst-Target)) ){
MS = Abs(Last-First)*0.2;
}
while(again < 3){
- //On chemine.
+ //Path.
if(!again && (MS < 5*TolGuide)) MS = 5*TolGuide;
else {
if (5*TolGuide > MS) TolGuide = MS/5;
ParSol,TolEsp,Fleche,Appro);
if (!TheWalk.IsDone()) {
#ifdef DEB
- cout << "Cheminement non fait" << endl;
+ cout << "Path is not created" << endl;
#endif
return Standard_False;
}
if (Inside) complmnt = TheWalk.Complete(Func,FInv,SpLast);
if(!complmnt){
#ifdef DEB
- cout << "Complement non fait" << endl;
+ cout << "Not completed" << endl;
#endif
return Standard_False;
}
- //On controle le resultat avec deux criteres :
- //- y a-t-il assez de points,
- //- est-on alle assez loin.
+ //The result is controlled using two criterions :
+ //- if there is enough points,
+ //- if one has gone far enough.
Nbpnt = Lin->NbPoints();
if (Nbpnt == 0){
#ifdef DEB
- cout <<"0 point de cheminement on sort."<<endl;
+ cout <<"0 point of path, quit."<<endl;
#endif
return Standard_False;
}
okfin = (narc1 > 0 || narc2 > 0 || (Last-lpointpar) < 10*TolGuide);
}
if(!okdeb || !okfin || Nbpnt == 1){
- //Ca frotte, on eteint les controles on espere evaluer un pas max
- //satisfaisant, et on serre les fesses!!!. Si c est deja fait on
- //sort.
+ //It drags, the controls are extended, it is expected to evaluate a
+ //satisfactory maximum step. If it already done, quit.
if(tchernobyl){
#ifdef DEB
- cout <<"Ca frotte meme sans controle, on sort."<<endl;
+ cout <<"If it drags without control, quit."<<endl;
#endif
return Standard_False;
}
TheWalk.Check(0);
if (Nbpnt == 1){
#ifdef DEB
- cout <<"1 seul point de cheminement on essaye MS/100"<<endl;
- cout <<"et on eteint les controles."<<endl;
+ cout <<"only one point of path MS/100 is attempted"<<endl;
+ cout <<"and the controls are extended."<<endl;
#endif
MS *= 0.01;
}
else{
#ifdef DEB
- cout <<"Ca frotte on eteint les controles."<<endl;
+ cout <<"It drags, the controls are extended."<<endl;
#endif
MS = (lpointpar-fpointpar)/Nbpnt; //EvalStep(Lin);
}
else if (Nbpnt < nbptmin){
if(again == 0){
#ifdef DEB
- cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+ cout <<"Number of points is too small, the step is reduced"<<endl;
#endif
u1sov = fpointpar;
u2sov = lpointpar;
if(Abs(fpointpar-u1sov)>=TolGuide ||
Abs(lpointpar-u2sov)>=TolGuide){
#ifdef DEB
- cout <<"Nombre de points encore insuffisant on reduit le pas"<<endl;
+ cout <<"Number of points is still too small, the step is reduced"<<endl;
#endif
MS = (lpointpar - fpointpar) * factor;
}
else{
#ifdef DEB
- cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+ cout <<"Number of points is still too small, quit"<<endl;
#endif
return Standard_False;
}
if(TheWalk.TwistOnS1()){
Data->TwistOnS1(Standard_True);
#ifdef DEB
- cout<<"Cheminement complet mais VRILLE sur S1"<<endl;
+ cout<<"Path completed, but TWIST on S1"<<endl;
#endif
}
if(TheWalk.TwistOnS2()){
Data->TwistOnS2(Standard_True);
#ifdef DEB
- cout<<"Cheminement complet mais VRILLE sur S2"<<endl;
+ cout<<"Parh completed, but TWIST on S2"<<endl;
#endif
}
- //Ici on a un resultat plus ou moins presentable mais qui recouvre
- //la zone minimum visee.
- //On attaque les prolongements.
+ //Here there is a more or less presentable result
+ //however it covers a the minimum zone.
+ //The extensions are targeted.
//*****************************//
Gd1 = Gd2 = Gf1 = Gf2 = Standard_False;
Standard_True, Data->ChangeVertexFirstOnS1(),tolesp);
debarc1 = Standard_True;
if(!SearchFace(Spine,Data->VertexFirstOnS1(),F1,bif)){
- //On regarde si ce n'est pas un obstacle.
+ //It is checked if there is not an obstacle.
debcas1 = Standard_True;
if(!Spine.IsNull()){
if(Spine->IsPeriodic()){
Standard_True, Data->ChangeVertexFirstOnS2(),tolesp);
debarc2 = Standard_True;
if(!SearchFace(Spine,Data->VertexFirstOnS2(),F2,bif)){
- //On regarde si ce n'est pas un obstacle.
+ //It is checked if it is not an obstacle.
debcas2 = Standard_True;
if(!Spine.IsNull()){
if(Spine->IsPeriodic()){
if(oncontinue) {
TheWalk.ClassificationOnS1(!debarc1);
TheWalk.ClassificationOnS2(!debarc2);
- TheWalk.Check2d(Standard_True); // Il faut etre severe (PMN)
+ TheWalk.Check2d(Standard_True); // It should be strict (PMN)
TheWalk.Continu(Func,FInv,Target);
TheWalk.ClassificationOnS1(Standard_True);
TheWalk.ClassificationOnS2(Standard_True);
Standard_True, Data->ChangeVertexFirstOnS1(),tolesp);
debarc1 = Standard_True;
if(!SearchFace(Spine,Data->VertexFirstOnS1(),F1,bif)){
- //On regarde si ce n'est pas un obstacle.
+ //It is checked if it is not an obstacle.
debcas1 = Standard_True;
// if(!Spine.IsNull()) {
// if(Spine->IsPeriodic()){
Standard_True, Data->ChangeVertexFirstOnS2(),tolesp);
debarc2 = Standard_True;
if(!SearchFace(Spine,Data->VertexFirstOnS2(),F2,bif)){
- //On regarde si ce n'est pas un obstacle.
+ //It is checked if it is not an obstacle.
debcas2 = Standard_True;
// if(!Spine.IsNull()){
// if(Spine->IsPeriodic()){
Standard_False, Data->ChangeVertexLastOnS1(),tolesp);
finarc1 = Standard_True;
if(!SearchFace(Spine,Data->VertexLastOnS1(),F1,bif)){
- //On regarde si ce n'est pas un obstacle.
+ //It is checked if it is not an obstacle.
fincas1 = Standard_True;
if(!Spine.IsNull()){
finobst1 = IsObst(Data->VertexLastOnS1(),
Standard_False, Data->ChangeVertexLastOnS2(),tolesp);
finarc2 = Standard_True;
if(!SearchFace(Spine,Data->VertexLastOnS2(),F2,bif)){
- //On regarde si ce n'est pas un obstacle.
+ //It is checked if it is not an obstacle.
fincas2 = Standard_True;
if(!Spine.IsNull()){
finobst2 = IsObst(Data->VertexLastOnS2(),
if(oncontinue){
TheWalk.ClassificationOnS1(!finarc1);
TheWalk.ClassificationOnS2(!finarc2);
- TheWalk.Check2d(Standard_True); // Il faut etre severe (PMN)
+ TheWalk.Check2d(Standard_True); // It should be strict (PMN)
TheWalk.Continu(Func,FInv,Target);
TheWalk.ClassificationOnS1(Standard_True);
TheWalk.ClassificationOnS2(Standard_True);
Standard_False, Data->ChangeVertexLastOnS1(),tolesp);
finarc1 = Standard_True;
if(!SearchFace(Spine,Data->VertexLastOnS1(),F1,bif)){
- //On regarde si ce n'est pas un obstacle.
+ //It is checked if it is not an obstacle.
fincas1 = Standard_True;
// if(!Spine.IsNull()){
// finobst1 = IsObst(Data->VertexLastOnS1(),
Gd1 = debcas1/* && !debobst1*/; // skv(occ67)
Gd2 = debcas2/* && !debobst2*/; // skv(occ67)
if ((debarc1^debarc2) && !unseulsuffitdeb && (First!=SpFirst)) {
- // Cas de cheminement incomplet, cela finit surement mal :
- // on tronque le resultat au lieu de sortie.
+ // Case of incomplete path, of course this ends badly :
+ // the result is truncated instead of exit.
Standard_Real sortie;
Standard_Integer ind;
if (debarc1) sortie = Data->VertexFirstOnS1().Parameter();
|| backwContinueFailed; // eap
else if (intf && unseulsuffitdeb && (intf<5)) {
intf = (Gd1 || Gd2);
- // On controle qu'il n'y pas de nouvelle face.
+ // It is checked if there is no new face.
if (intf &&
((!debcas1 && debarc1) || (!debcas2 && debarc2)) ) intf = 0;
}
Gf1 = fincas1/* && !finobst1*/; // skv(occ67)
Gf2 = fincas2/* && !finobst2*/; // skv(occ67)
if ((finarc1 ^finarc2) && !unseulsuffitfin && (Last!=SpLast)) {
- // Cas de cheminement incomplet, cela finit surement mal :
- // on tronque le resultat au lieu de sortie.
+ // Case of incomplete path, of course, this ends badly :
+ // the result is truncated instead of exit.
Standard_Real sortie;
Standard_Integer ind;
if (finarc1) sortie = Data->VertexLastOnS1().Parameter();
}
}
else if ((intl>=5) && !finarc1 && !finarc2 && (Last!=SpLast) ) {
- // Idem dans le cas ou toute la "Lin" constitue un prolongement
+ // The same in case when the entire "Lin" is an extension
Standard_Real sortie = (First+2*Last)/3;
Standard_Integer ind;
if (Last - sortie > tolesp) {
if (intl && !unseulsuffitfin) intl = (Gf1 && Gf2)//;
|| forwContinueFailed; // eap
else if (intl && unseulsuffitfin && (intl<5)) {
- intl = (Gf1 || Gf2);// On controle qu'il n'y pas de nouvelle face.
+ intl = (Gf1 || Gf2);// It is checked if there is no new face.
if (intl &&
((!fincas1 && finarc1) || (!fincas2 && finarc2)) ) intl = 0;
}
tolesp,TolGuide,RecOnS1,RecOnS2,
NewFirst,ParSol)){
#ifdef DEB
- cout<<"ChFi3d_Builder::SimulData : echec calcul first section"<<endl;
+ cout<<"ChFi3d_Builder::SimulData : calculation fail first section"<<endl;
#endif
return Standard_False;
}
}
Standard_Integer again = 0;
while(again < 3){
- // Lorsque le point de depart est interne, on chemine
- // d abord a gauche afin de determiner le Last pour les
- // periodiques.
+ // When the start point is inside, the path goes first to the left
+ // to determine the Last for the periodicals.
if(!again && (MS < 5*TolGuide)) MS = 5*TolGuide;
else {
if (5*TolGuide > MS) TolGuide = MS/5;
if (!TheWalk.IsDone()) {
#ifdef DEB
- cout << "Cheminement non fait" << endl;
+ cout << "Path not created" << endl;
#endif
return Standard_False;
}
if (Inside) complmnt = TheWalk.Complete(Func,FInv,SpLast);
if(!complmnt){
#ifdef DEB
- cout << "Complement non fait" << endl;
+ cout << "Not completed" << endl;
#endif
return Standard_False;
}
Standard_Real factor = 1./(NbSecMin + 1);
if (Nbpnt == 0){
#ifdef DEB
- cout <<"0 point de cheminement on sort."<<endl;
+ cout <<"0 point of path, quit."<<endl;
#endif
return Standard_False;
}
else if (Nbpnt == 1 && again == 0) {
again++;
#ifdef DEB
- cout <<"1 seul point de cheminement on essaye MS/100."<<endl;
+ cout <<"only one point of path, MS/100 is attempted."<<endl;
#endif
MS *= 0.01; Target = Targetsov;
u1sov = u2sov = Lin->Point(1).Parameter();
else if (Nbpnt< NbSecMin && again == 0) {
again++;
#ifdef DEB
- cout <<"Nombre de points insuffisant on reduit le pas"<<endl;
+ cout <<"Number of points is too small, the step is reduced"<<endl;
#endif
Standard_Real u1 = u1sov = Lin->Point(1).Parameter();
Standard_Real u2 = u2sov = Lin->Point(Nbpnt).Parameter();
if(Abs(u1-u1sov)>=TolGuide || Abs(u2-u2sov)>=TolGuide){
again++;
#ifdef DEB
- cout <<"Nombre de points encore insuffisant on reduit le pas"<<endl;
+ cout <<"Number of points is still too small, the step is reduced"<<endl;
#endif
MS /= 100;
Target = Targetsov;
}
else{
#ifdef DEB
- cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+ cout <<"Number of points is still too small, quit"<<endl;
#endif
return Standard_False;
}
}
else if(Nbpnt < NbSecMin){
#ifdef DEB
- cout <<"Nombre de points toujours insuffisant on sort"<<endl;
+ cout <<"Number of points is still too small, quit"<<endl;
#endif
return Standard_False;
}
//=======================================================================
//function : Update
-//purpose : Calcul de l intersection entre la face en bout et la ligne
-// de tangence pour mise a jour du CommonPoint et de son
-// parametre dans la FaceInterference.
+//purpose : Calculate the intersection of the face at the end of
+// the tangency line to update CommonPoint and its
+// parameter in FaceInterference.
//=======================================================================
static Standard_Boolean Update(Handle(Adaptor3d_HSurface)& fb,
Standard_Real& wop)
{
IntCurveSurface_HInter Intersection;
- //verifier que dans les KPart les bornes de la ligne de tangence
- //sont deja en place a ce stade.
- //Modif de lvt : on recadre les cas periodiques surtout si on a rien trouve.
+ //check if in KPart the limits of the tangency line
+ //are already in place at this stage.
+ //Modif lvt : the periodic cases are reframed, espercially if nothing was found.
Standard_Real w,uf = ct->FirstParameter(),ul = ct->LastParameter();
#ifndef DEB
Standard_Real wbis = 0.;
gp_Pnt2d& FprolUV,
Standard_Real& c3dU)
{
- // rajouter ici des criteres plus ou moins restrictifs pour
- // decider si on fait l intersection avec la face en bout
- // etendue ou si on aiguille sur bouchon.
+ // add more or less restrictive criterions to
+ // decide if the intersection is done with the face at
+ // extended end or if the end is sharp.
Standard_Real uf = FIop.FirstParameter();
Standard_Real ul = FIop.LastParameter();
Handle(GeomAdaptor_HCurve) Hc3df;
//=======================================================================
//function : Update
-//purpose : Calcul de l extrema curveonsurf/curveonsurf pour privilegier
-// les valeurs concernant la trace on surf et la pcurve sur la
-// face en bout.
+//purpose : Calculate the extrema curveonsurf/curveonsurf to prefer
+// the values concerning the trace on surf and the pcurve on the
+// face at end.
//=======================================================================
static Standard_Boolean Update(Handle(Adaptor3d_HSurface)& face,
//=======================================================================
//function : ComputeCurve2d
-//purpose : calcule le 2d de la courbe Ct sur la face Face
+//purpose : calculate the 2d of the curve Ct on face Face
//=======================================================================
static void ComputeCurve2d (Handle(Geom_Curve )& Ct,
}
//=======================================================================
//function : PerformOneCorner
-//purpose : Calcul d un coin a trois aretes incidentes et un conge
-// incident.
-// 3 cas distincts : (22/07/94 seul le 1er est traite)
+//purpose : Calculate a corner with three edges and a fillet.
+// 3 separate case: (22/07/94 only 1st is implemented)
//
-// - meme concavite sur les trois edges, intersection avec la
-// face en bout,
-// - concavite des 2 edges de sortie opposee a celle du conge,
-// si la face en bout s y prete, idem cas 1 sur face etendue,
-// sinon on fait un petit bouchon avec GeomFill,
-// - un seul edge de sortie de concavite opposee a celle du
-// conge et du troisieme edge, on relie le sommet au coin
-// dans le vide du conge et on bouche, soit en agrandissant
-// la face en bout si celle ci est plane et orthogonale a
-// l edge guide, soit par un bouchon type GeomFill.
+// - same concavity on three edges, intersection with the
+// face at end,
+// - concavity of 2 outgoing edges is opposite to the one of the fillet,
+// if the face at end is ready for that, the same in case 1 on extended face,
+// otherwise a small cap is done with GeomFill,
+// - only one outgoing edge has concavity opposed to the edge of the
+// fillet and the third edge, the top of the corner is reread
+// in the empty of the fillet and closed, either by extending the face
+// at end if it is plane and orthogonal to the
+// guiding edge, or by a cap of type GeomFill.
//
// <thePrepareOnSame> means that only needed thing is redefinition
// of intersection pameter of OnSame-Stripe with <Arcprol>
TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS();
#ifdef DEB
- OSD_Chronometer ch;// init perf pour PerformSetOfKPart
+ OSD_Chronometer ch;// init perf for PerformSetOfKPart
#endif
- // le sommet,
+ // the top,
const TopoDS_Vertex& Vtx = myVDataMap.FindKey(Index);
- // On recupere le conge concerne,
+ // The fillet is returned,
ChFiDS_ListIteratorOfListOfStripe StrIt;
StrIt.Initialize(myVDataMap(Index));
if ( ! ChFi3d_SelectStripe (StrIt, Vtx, thePrepareOnSame)) return;
const Handle(ChFiDS_Spine) spine = stripe->Spine();
ChFiDS_SequenceOfSurfData& SeqFil =
stripe->ChangeSetOfSurfData()->ChangeSequence();
- // la SurfData en cause et ses CommonPoints,
+ // SurfData and its CommonPoints,
Standard_Integer sens = 0;
- // Choisit la bonne SurfData
+ // Choose proper SurfData
Standard_Integer num = ChFi3d_IndexOfSurfData(Vtx,stripe,sens);
Standard_Boolean isfirst = (sens == 1);
if (isfirst) {
for (; num<SeqFil.Length() && (
(SeqFil.Value(num)->IndexOfS1()==0) ||
(SeqFil.Value(num)->IndexOfS2()==0) ); ) {
- SeqFil.Remove(num); // On elimine le surplus
+ SeqFil.Remove(num); // The surplus is removed
}
}
else {
for (; num>1 && (
(SeqFil.Value(num)->IndexOfS1()==0) ||
(SeqFil.Value(num)->IndexOfS2()==0) ); ) {
- SeqFil.Remove(num);// On elimine le surplus
+ SeqFil.Remove(num);// The surplus is removed
num--;
}
}
Handle(ChFiDS_SurfData)& Fd = SeqFil.ChangeValue(num);
ChFiDS_CommonPoint& CV1 = Fd->ChangeVertex(isfirst,1);
ChFiDS_CommonPoint& CV2 = Fd->ChangeVertex(isfirst,2);
- //Pour evaluer la boule des nouveaux points.
+ //To evaluate the new points.
Bnd_Box box1,box2;
- // On traite separement les cas bouchon des cas intersection.
+ // The cases of cap and intersection are processed separately.
// ----------------------------------------------------------
ChFiDS_State stat;
if (isfirst) stat = spine->FirstStatus();
if (!CV1.IsOnArc() && !CV2.IsOnArc())
Standard_Failure::Raise("Corner OnSame : no point on arc");
else if (CV1.IsOnArc() && CV2.IsOnArc()) {
- // on explore pour detromper les KPart qui seraient sortis
- // au diable.
- Standard_Boolean sur1 = 0, sur2 = 0;
+ Standard_Boolean sur1 = 0, sur2 = 0;
for(ex.Init(CV1.Arc(),TopAbs_VERTEX); ex.More(); ex.Next()) {
if (Vtx.IsSame(ex.Current())) {
sur1 = 1;
Fad = TopoDS::Face(DStr.Shape(Fd->Index(IFadArc)));
Fop = TopoDS::Face(DStr.Shape(Fd->Index(IFopArc)));
TopTools_ListIteratorOfListOfShape It;
- // On recupere la face en bout sans controle de son unicite.
+ // The face at end is returned without check of its unicity.
for(It.Initialize(myEFMap(Arcpiv));It.More();It.Next()) {
if (!Fad.IsSame(It.Value())) {
Fv = TopoDS::Face(It.Value());
}
}
- // est-ce que la face en bout contient le Vertex ?
+ // Does the face at bout contain the Vertex ?
Standard_Boolean isinface = Standard_False;
for (ex.Init(Fv,TopAbs_VERTEX); ex.More(); ex.Next()) {
if (ex.Current().IsSame(Vtx)) {
Fad = TopoDS::Face(DStr.Shape(Fd->Index(IFadArc)));
Fop = TopoDS::Face(DStr.Shape(Fd->Index(IFopArc)));
//TopTools_ListIteratorOfListOfShape It;
- // On recupere la face en bout sans controle de son unicite.
+ // The face at end is returned without check of its unicity.
for(It.Initialize(myEFMap(Arcpiv));It.More();It.Next()) {
if (!Fad.IsSame(It.Value())) {
Fv = TopoDS::Face(It.Value());
}
if (Fv.IsNull()) StdFail_NotDone::Raise
- ("OneCorner : face en bout non trouvee");
+ ("OneCorner : face at end not found");
Fv.Orientation(TopAbs_FORWARD);
Fad.Orientation(TopAbs_FORWARD);
Fop.Orientation(TopAbs_FORWARD);
- // On recupere de meme l edge qui sera a prolonger.
+ // The edge that will be extended is returned.
for(It.Initialize(myVEMap(Vtx));It.More() && Arcprol.IsNull();It.Next()) {
if (!Arcpiv.IsSame(It.Value())) {
for(ex.Init(Fv,TopAbs_EDGE); ex.More(); ex.Next()) {
Bad.Initialize(Fad);
Bop.Initialize(Fop);
}
- //dans le cas OnSame on va devoir modifier le CommonPoint
- //dans le vide et son parametre dans la FaceInterference.
- //On les recupere donc tous deux dans des references
- //non const. Attention les modifs se font dans le dos
+ //in case of OnSame it is necessary to modify the CommonPoint
+ //in the empty and its parameter in the FaceInterference.
+ //They are both returned in non const references. Attention the modifications are done behind
//de CV1,CV2,Fi1,Fi2.
ChFiDS_CommonPoint& CPopArc = Fd->ChangeVertex(isfirst,IFopArc);
ChFiDS_FaceInterference& FiopArc = Fd->ChangeInterference(IFopArc);
ChFiDS_CommonPoint& CPadArc = Fd->ChangeVertex(isfirst,IFadArc);
ChFiDS_FaceInterference& FiadArc = Fd->ChangeInterference(IFadArc);
- //on initialise le parametre du vertex en l air a la valeur de son
- //copain d en face (point sur arc).
+ //the parameter of the vertex in the air is initialiced with the value of
+ //its opposite (point on arc).
Standard_Real wop = Fd->ChangeInterference(IFadArc).Parameter(isfirst);
Handle(Geom_Curve) c3df;
Handle(GeomAdaptor_HSurface)
Udeb = Cc->FirstParameter();
Ufin = Cc->LastParameter();
- // on determine si la courbe a une intersection avec l'arete de couture
+ // determine if the curve has an intersection with edge of sewing
ChFi3d_Couture(Fv,couture,edgecouture);
stripe->SetIndexPoint(ChFi3d_IndexPointInDS(CV2,DStr),isfirst,2);
if (!intcouture) {
-// il n'y a pas d'intersection avec l'arete de couture
-// on stocke la courbe Cc dans la stripe
-// le stockage dans la DS se fera par FILDS.
+// there is no intersection with the sewing edge
+// the curve Cc is stored in the stripe
+// the storage in the DS is not done by FILDS.
TopOpeBRepDS_Curve Tc(Cc,tolreached);
ICurve = DStr.AddCurve(Tc);
stripe->SetParameters(isfirst,Udeb,Ufin);
}
else {
-// on stocke les courbes curv1 et curv2 dans la DS
-// ces courbes ne seront pas reconstruites par FILDS car
-// on met stripe->InDS(isfirst);
+// curves curv1 are curv2 stored in the DS
+// these curves will not be reconstructed by FILDS as
+// one places stripe->InDS(isfirst);
- // interferences de curv1 et curv2 sur Fv
+ // interferences of curv1 and curv2 on Fv
ComputeCurve2d(curv1,Fv,c2d1);
Handle(TopOpeBRepDS_SurfaceCurveInterference) InterFv;
InterFv = ChFi3d_FilCurveInDS(Icurv1,IShape,c2d1,Et);
ComputeCurve2d(curv2,Fv,c2d2);
InterFv = ChFi3d_FilCurveInDS(Icurv2,IShape,c2d2,Et);
DStr.ChangeShapeInterferences(IShape).Append(InterFv);
- // interferences de curv1 et curv2 sur Isurf
+ // interferences of curv1 and curv2 on Isurf
if (Fd->Orientation()== Fv.Orientation()) Et=TopAbs::Reverse(Et);
c2d1=new Geom2d_TrimmedCurve(Ps,Udeb,par2);
InterFv = ChFi3d_FilCurveInDS(Icurv1,Isurf,c2d1,Et);
InterFv = ChFi3d_FilCurveInDS(Icurv2,Isurf,c2d2,Et);
DStr.ChangeSurfaceInterferences(Isurf).Append(InterFv);
- // limitation de l'arete de couture
+ // limitation of the sewing edge
Standard_Integer Iarc=DStr.AddShape(edgecouture);
Handle(TopOpeBRepDS_CurvePointInterference) Interfedge;
TopAbs_Orientation ori;
Interfedge = ChFi3d_FilPointInDS(ori,Iarc,indpt,par1);
DStr.ChangeShapeInterferences(Iarc).Append(Interfedge);
- // creation des CurveInterferences de Icurv1 et Icurv2
+ // creation of CurveInterferences from Icurv1 and Icurv2
stripe->InDS(isfirst);
Standard_Integer ind1= stripe->IndexPoint(isfirst,1);
Standard_Integer ind2= stripe->IndexPoint(isfirst,2);
if (onsame && inters) {
// VARIANT 1:
- // On rajoute le petit bout de courbe qui manque pour l extension
- // de la face en bout et la limitation de la face opposee.
+ // A small missing end of curve is added for the extension
+ // of the face at end and the limitation of the opposing face.
// VARIANT 2 : extend Arcprol, not create new small edge
// To do: modify for intcouture
const Standard_Boolean variant1 = Standard_True;
- // Tout d abord on coupe les ponts avec l arete de la spine.
+ // First of all the ponts are cut with the edge of the spine.
Standard_Integer IArcspine = DStr.AddShape(Arcspine);
Standard_Integer IVtx = DStr.AddShape(Vtx);
#ifndef DEB
interfv = ChFi3d_FilVertexInDS(OVtx,IArcspine,IVtx,parVtx);
DStr.ChangeShapeInterferences(IArcspine).Append(interfv);
- // On construit maintenant les courbes qui manquent.
+ // Now the missing curves are constructed.
TopoDS_Vertex V2;
for(ex.Init(Arcprol.Oriented(TopAbs_FORWARD),TopAbs_VERTEX);
ex.More(); ex.Next()) {
TopOpeBRepDS_Curve Zob(zob3d,tolreached);
Standard_Integer IZob = DStr.AddCurve(Zob);
-// on determine si Fop a une arete de couture
-// on determine si la courbe a une intersection avec l'arete de couture
+// it is determined if Fop has an edge of sewing
+// it is determined if the curve has an intersection with the edge of sewing
//TopoDS_Edge edgecouture;
//Standard_Boolean couture;
}
if (intcouture) {
-// interference de curv1 et curv2 sur Ishape
+// interference of curv1 and curv2 on Ishape
Et = TopAbs::Reverse(TopAbs::Compose(OVtx,OArcprolv));
ComputeCurve2d(curv1,Fop,c2d1);
Handle(TopOpeBRepDS_SurfaceCurveInterference)
InterFv = ChFi3d_FilCurveInDS(Icurv2,IShape,/*zob2dv*/c2d2,Et);
DStr.ChangeShapeInterferences(IShape).Append(InterFv);
- // limitation de l'arete de couture
+ // limitation of the sewing edge
Standard_Integer Iarc=DStr.AddShape(edgecouture);
Handle(TopOpeBRepDS_CurvePointInterference) Interfedge;
TopAbs_Orientation ori;
Interfedge = ChFi3d_FilPointInDS(ori,Iarc,indpt,par1);
DStr.ChangeShapeInterferences(Iarc).Append(Interfedge);
- // interference de curv1 et curv2 sur Iop
+ // interference of curv1 and curv2 on Iop
Standard_Integer Iop = DStr.AddShape(Fop);
Et = TopAbs::Reverse(TopAbs::Compose(OVtx,OArcprolop));
Handle(TopOpeBRepDS_SurfaceCurveInterference) Interfop;
//=======================================================================
//function : cherche_face
-//purpose : recherche de la face F appartenant a la map , differente des faces
-// F1 F2 F3 et contenant l'edge E
+//purpose : find face F belonging to the map, different from faces
+// F1 F2 F3 and containing edge E
//=======================================================================
static void cherche_face (const TopTools_ListOfShape & map,
//=======================================================================
//function : cherche_edge1
-//purpose : cherche l'edge commune entre les faces F1 et F2
+//purpose : find common edge between faces F1 and F2
//=======================================================================
static void cherche_edge1 (const TopoDS_Face & F1,
//=======================================================================
//function : containV
-//purpose : renvoie vrai si le vertex V appartient a F1
+//purpose : return true if vertex V belongs to F1
//=======================================================================
static Standard_Boolean containV(const TopoDS_Face & F1,
//=======================================================================
//function : containE
-//purpose : renvoie vrai si le l'edge E appartient a F1
+//purpose : return true if edge E belongs to F1
//=======================================================================
static Standard_Boolean containE(const TopoDS_Face & F1,
void ChFi3d_Builder::PerformIntersectionAtEnd(const Standard_Integer Index)
{
- //intersection en bout d'un conge avec au moins deux faces
- // traite les cas suivants:
- // - sommet a n (n>3) aretes adjacentes
- // - sommet a 3 aretes dont le conge sur une des aretes arrive sur plus
- // d'une face
+ // intersection at end of fillet with at least two faces
+ // process the following cases:
+ // - top has n (n>3) adjacent edges
+ // - top has 3 edges and fillet on one of edges touches
+ // more than one face
#ifdef DEB
OSD_Chronometer ch;// init perf
//Standard_Integer sense;
TopoDS_Edge edgelibre1,edgelibre2,EdgeSpine;
Standard_Boolean bordlibre;
- // determination du nombre de faces et d'aretes
+ // determine the number of faces and edges
TopTools_Array1OfShape tabedg(0,nn);
TopoDS_Face F1,F2;
Standard_Integer nface=ChFi3d_nbface(myVFMap(Vtx));
ChFi3d_ChercheBordsLibres(myVEMap,Vtx,bordlibre,edgelibre1,edgelibre2);
if (bordlibre) nbarete=(nbarete-2)/2 +2;
else nbarete=nbarete/2;
- // on determine s'il y a une arete de couture, l'arete de couture
- // et la face qui a une arete de couture
+ // it is determined if there is an edge of sewing and it face
TopoDS_Face facecouture;
TopoDS_Edge edgecouture;
if (couture)
facecouture=fcur;
}
- // on determine si l'une des aretes adjacente au conge est reguliere
+ // it is determined if one of edges adjacent to the fillet is regular
Standard_Boolean reg1,reg2;
TopoDS_Edge Ecur,Eadj1,Eadj2;
TopoDS_Face Fga,Fdr;
reg2=isTangentFaces(Eadj2,Fga,Fdr);
// Modified by Sergey KHROMOV - Fri Dec 21 17:58:24 2001 End
-// on cherche les deux faces communes a l'edge
+// two faces common to the edge are found
if (reg1 || reg2) {
Standard_Boolean compoint1=Standard_False;
Standard_Boolean compoint2=Standard_False;
}
}
}
-// on a une seule face en bout si FindFace est vrai et si la face
-// n'est pas la face avec arete de couture
+// there is only one face at end if FindFace is true and if the face
+// is not the face with sewing edge
TopoDS_Face face;
Handle(ChFiDS_SurfData) Fd = SeqFil.ChangeValue(num);
ChFiDS_CommonPoint& CV1 = Fd->ChangeVertex(isfirst,1);
SDprev = SeqFil(num1);
IsurfPrev = SDprev->Surf();
}
- // calcul de l' orientation orcourbe des courbes en bout
+ // calculate the orientation of curves at end
Standard_Real tolpt=1.e-4;
Standard_Real tolreached;
}
/***********************************************************************/
- // recherche des faces a intersecter avec le conge et des edges servant
- // a limiter ces intersections
- // nbface est le nb de faces a intersecter, Face[i] contient les faces
- // a intersecter (i=0.. nbface-1). Edge[i] contient les edges limitant
- // les intersections (i=0 ..nbface)
+ // find faces intersecting with the fillet and edges limiting intersections
+ // nbface is the nb of faces intersected, Face[i] contais the faces
+ // to intersect (i=0.. nbface-1). Edge[i] contains edges limiting
+ // the intersections (i=0 ..nbface)
/**********************************************************************/
Standard_Integer nb = 1,nbface;
Edge[nbface]=CV2.Arc();
tabedg.SetValue(0,Edge[0]);
tabedg.SetValue(nbface,Edge[nbface]);
- // traitement d'un conge arrivant sur un vertex
- // l'edge contenue dans CV.Arc n'est pas forcement la bonne
- // on cherche l'edge concernee par l'intersection
+ // processing of a fillet arriving on a vertex
+ // edge contained in CV.Arc is not inevitably good
+ // the edge concerned by the intersection is found
Standard_Real dist1,dist2;
if (CV1.IsVertex()) {
}
}
if (!onecorner) {
- // Lorsqu'il y a une arete de regularite les faces adjacentes a l'edge
- // ne sont pas dans Fd->IndexOfS1 ou Fd->IndexOfS2
+ // If there is a regular edge, the faces adjacent to it
+ // are not in Fd->IndexOfS1 or Fd->IndexOfS2
// TopoDS_Face Find1 ,Find2;
// if (isfirst)
// }
// }
- // si nface =3 on a un sommet a trois arete avec un conge incident
- // dont les commons points sont sur des faces differentes
- // sinon on est dans le cas d'un sommet a plus de 3 aretes
+ // if nface =3 there is a top with 3 edges and a fillet
+ // and their common points are on different faces
+ // otherwise there is a case when a top has more than 3 edges
if (nface==3) {
if (CV1.IsVertex ()) findonf1=Standard_True;
}
}
- // findonf1 findonf2 indiquent si F1 et ou F2 sont adajacentes
- // a plusieurs faces en bout
- // on determine ces faces en bout ainsi que les edges concernees par
- // les intersections
+ // findonf1 findonf2 show if F1 and/or F2 are adjacent
+ // to many faces at end
+ // the faces at end and intersected edges are found
if (findonf1 && !isOnSame1) {
if (CV1.TransitionOnArc()==TopAbs_FORWARD)
cherche_edge1(Face[nb-1],Face[nb],Edge[nb]);
nb++;
if (nb>=nn) Standard_Failure::Raise
- ("IntersectionAtEnd : nb de faces limites atteint");
+ ("IntersectionAtEnd : the max number of faces reached");
}
if (!findonf2) Edge[nb]=CV2.Arc();
}
cherche_edge1(Face[nb-1],Face[nb],Edge[nb]);
nb++;
if (nb>=nn) Standard_Failure::Raise
- ("IntersectionAtEnd : nb de faces limites atteint");
+ ("IntersectionAtEnd : the max number of faces reached");
}
Edge[nb]=CV2.Arc();
}
else {
-// on est dans le cas d'un sommet a plus de trois aretes
-// on determine les faces et les aretes concernees
+// this is the case when a top has more than three edges
+// the faces and edges concerned are found
Standard_Boolean /*trouve,*/possible1, possible2;
trouve = possible1 = possible2 = Standard_False;
TopExp_Explorer ex;
return;
}
if (nbarete==4) {
- // si deux edges consecutives sont G1 on a une seule face d'intersection
+ // if two consecutive edges are G1 there is only one face of intersection
Standard_Real ang1=0.0;
TopoDS_Vertex Vcom;
trouve=Standard_False;
Standard_Boolean extend=Standard_False;
Handle(Geom_Surface) Sfacemoins1,Sface;
/***************************************************************************/
- // calcul de l'intersection entre le conge et chaque face
- // et stockage dans la DS
+ // calculate intersection of the fillet and each face
+ // and storage in the DS
/***************************************************************************/
for (nb=1;nb<=nbface;nb++) {
prolface[nb-1]=0;
Handle(Geom_Curve) cint;
Handle(Geom2d_Curve) C2dint1, C2dint2,cface,cfacemoins1;
- //////////////////////////////////////////////////////////////////////
- // determination des intersections entre les edges et le conge
- // pour trouver les limitations des intersections face - conge
- //////////////////////////////////////////////////////////////////////
+ ///////////////////////////////////////////////////////
+ // determine intersections of edges and the fillet
+ // to find limitations of intersections face - fillet
+ ///////////////////////////////////////////////////////
if (nb==1) {
Hc1 = BRep_Tool::CurveOnSurface(Edge[0],Face[0],Ubid,Ubid);
}
else {
if (Hc1.IsNull()) {
- // on a pas trouve de courbe 2d . On etend Sfacemoins1 et on y projette
+ // curve 2d not found. Sfacemoins1 is extended and projection is done there
// CV1.Point ()
ChFi3d_ExtendSurface(Sfacemoins1,prolface[0]);
if (prolface[0]) {
else {
Hc2 = BRep_Tool::CurveOnSurface(E2,Face[nbface-1],Ubid,Ubid);
if (Hc2.IsNull()) {
- // on a pas trouve de courbe 2d , on etend Sfacemoins1
- // on y projette CV2.Point()
+ // curve 2d is not found, Sfacemoins1 is extended CV2.Point() is projected there
ChFi3d_ExtendSurface(Sfacemoins1,prolface[0]);
if (prolface[0]) {
if (prolface[nb-1]) Bs.Initialize(faceprol[nb-1]);
else Bs.Initialize(Face[nb-1]);
- // decalage des parametres s'ils ne sont pas dans
- // la meme periode
+ // offset of parameters if they are not in the same period
// commented by eap 30 May 2002 occ354
// the following code may cause trimming a wrong part of periodic surface
//////////////////////////////////////////////////////////////////////
- // calcul des intersections face - conge
+ // calculate intersections face - fillet
//////////////////////////////////////////////////////////////////////
if (!ChFi3d_ComputeCurves(HGs,HBs,Pardeb,Parfin,Cc,
PerformMoreThreeCorner (Index,1);
return;
}
- // stockage des informations dans la structure de donnees
+ // storage of information in the data structure
- // eval tolerances
+ // evaluate tolerances
p1=Cc->FirstParameter();
p2=Cc->LastParameter();
Standard_Real to1,to2;
//////////////////////////////////////////////////////////////////////
- // stokage dans la DS de la courbe d'intersection
+ // storage in the DS of the intersection curve
//////////////////////////////////////////////////////////////////////
Standard_Boolean Isvtx1=0;
DStr.ChangeCurveInterferences(indcurve[nb-1]).Append(Interfp2);
//////////////////////////////////////////////////////////////////////
- // stockage pour la face
+ // storage for the face
//////////////////////////////////////////////////////////////////////
#ifndef DEB
orface=Face[nb-1].Orientation();
if (orface==orsurfdata ) orien = TopAbs::Reverse(orcourbe);
else orien = orcourbe ;
- // limitation des edges des faces
+ // limitation of edges of faces
if (nb==1) {
Standard_Integer Iarc1= DStr.AddShape(Edge[0]);
Interfedge[0]= ChFi3d_FilPointInDS(CV1.TransitionOnArc(),Iarc1,
//=======================================================================
//function : PerformMoreSurfdata
-//purpose : determine les intersections en bout sur plusieurs
-// surfdata
+//purpose : determine intersections at end on several surfdata
//=======================================================================
void ChFi3d_Builder::PerformMoreSurfdata(const Standard_Integer Index)
{
}
// Modified by Sergey KHROMOV - Thu Apr 11 12:23:40 2002 End
-//=======================================================================
+//==============================================================
//function : FindFace
-//purpose : attention ne marche que si une seule face en commun entre
-// P1,P2,V
+//purpose : attention it works only if there is only one common face
+// between P1,P2,V
//===========================================================
{
if (P1.IsVertex() || P2.IsVertex()) {
#ifdef DEB
- cout<<"changement de face sur vertex plantatoire"<<endl;
+ cout<<"change of face on vertex"<<endl;
#endif
}
if (!(P1.IsOnArc() && P2.IsOnArc())) {
}
#ifdef DEB
if(!ContainsV){
- cout<<"FindFace : l extremite de la spine n est pas dans la face en bout"<<endl;
+ cout<<"FindFace : the extremity of the spine is not in the end face"<<endl;
}
#endif
return Found;
//=======================================================================
//function : MoreSurfdata
-//purpose : detecte si l'intersection en bout concerne plusieurs Surfdata
+//purpose : detects if the intersection at end concerns several Surfdata
//=======================================================================
Standard_Boolean ChFi3d_Builder::MoreSurfdata(const Standard_Integer Index) const
{
- // l'intersection en bout se fait sur plusieurs surfdata si :
- // -le nb de surfdata concernant le vertex est superieur a 1 .
- // -et si l'avant derniere surfdata a un de ses commonpoints sur un des
- // deux arcs qui constituent les intersections de la face en bout et du conge
+ // intersection at end is created on several surfdata if :
+ // - the number of surfdata concerning the vertex is more than 1.
+ // - and if the last but one surfdata has one of commonpoints on one of
+ // two arcs, which constitute the intersections of the face at end and of the fillet
ChFiDS_ListIteratorOfListOfStripe It;
It.Initialize(myVDataMap(Index));
TopoDS_Face Fv;
Standard_Boolean inters,oksurf;
nbsurf= stripe->SetOfSurfData()->Length();
- // Fv est la face en bout
+ // Fv is the face at end
inters = FindFace(Vtx,CV1,CV2,Fv);
if (sens==1) {
num1=1;
if (nbsurf!=1 && inters) {
- // determination de arc1 et arc2 intersection du conge et de la face en bout
+ // determination of arc1 and arc2 intersection of the fillet and the face at end
TopoDS_Edge arc1,arc2;
TopTools_ListIteratorOfListOfShape ItE;
}
-//Cas des conges sur sommet a 4 aretes avec une aretes sur la meme geometrie que l'arete du conge
+//Case of fillets on top with 4 edges, one of them is on the same geometry as the edgeof the fillet
void ChFi3d_Builder::IntersectMoreCorner(const Standard_Integer Index)
#ifdef DEB
OSD_Chronometer ch;// init perf pour PerformSetOfKPart
#endif
- // On recupere le conge concerne,
+ // The fillet is returned,
ChFiDS_ListIteratorOfListOfStripe StrIt;
StrIt.Initialize(myVDataMap(Index));
Handle(ChFiDS_Stripe) stripe = StrIt.Value();
const Handle(ChFiDS_Spine) spine = stripe->Spine();
ChFiDS_SequenceOfSurfData& SeqFil =
stripe->ChangeSetOfSurfData()->ChangeSequence();
- // le sommet,
+ // the top,
const TopoDS_Vertex& Vtx = myVDataMap.FindKey(Index);
- // la SurfData en cause et ses CommonPoints,
+ // the SurfData concerned and its CommonPoints,
Standard_Integer sens = 0;
- // Choisit la bonne SurfData
+ // Choose the proper SurfData
Standard_Integer num = ChFi3d_IndexOfSurfData(Vtx,stripe,sens);
Standard_Boolean isfirst = (sens == 1);
if (isfirst) {
for (; num<SeqFil.Length() && (
(SeqFil.Value(num)->IndexOfS1()==0) ||
(SeqFil.Value(num)->IndexOfS2()==0) ); ) {
- SeqFil.Remove(num); // On elimine le surplus
+ SeqFil.Remove(num); // The surplus is removed
}
}
else {
for (; num>1 && (
(SeqFil.Value(num)->IndexOfS1()==0) ||
(SeqFil.Value(num)->IndexOfS2()==0) ); ) {
- SeqFil.Remove(num);// On elimine le surplus
+ SeqFil.Remove(num);// The surplus is removed
num--;
}
}
Handle(ChFiDS_SurfData)& Fd = SeqFil.ChangeValue(num);
ChFiDS_CommonPoint& CV1 = Fd->ChangeVertex(isfirst,1);
ChFiDS_CommonPoint& CV2 = Fd->ChangeVertex(isfirst,2);
- //Pour evaluer la boule des nouveaux points.
+ //To evaluate the cloud of new points.
Bnd_Box box1,box2;
- // On traite separement les cas bouchon des cas intersection.
+ // The cases of cap are processed separately from intersection.
// ----------------------------------------------------------
TopoDS_Face Fv,Fad,Fop,Fopbis;
if(!CV1.IsOnArc() && !CV2.IsOnArc())
Standard_Failure::Raise("Corner intersmore : no point on arc");
else if(CV1.IsOnArc() && CV2.IsOnArc()){
- // on explore pour detromper les KPart qui seraient sortis
- // au diable.
Standard_Boolean sur1 = 0, sur2 = 0;
for(ex.Init(CV1.Arc(),TopAbs_VERTEX); ex.More(); ex.Next()){
if(Vtx.IsSame(ex.Current())) {
Fad = TopoDS::Face(DStr.Shape(Fd->Index(IFadArc)));
Fop = TopoDS::Face(DStr.Shape(Fd->Index(IFopArc)));
TopTools_ListIteratorOfListOfShape It;
- // On recupere la face en bout sans controle de son unicite.
+ // The face at end is returned without control of its unicity.
for(It.Initialize(myEFMap(Arcpiv));It.More();It.Next()) {
if(!Fad.IsSame(It.Value())){
Fv = TopoDS::Face(It.Value());
}
}
- // est-ce que la face en bout contient le Vertex ?
+ // does the face at end contain the Vertex ?
Standard_Boolean isinface = Standard_False;
for (ex.Init(Fv,TopAbs_VERTEX); ex.More(); ex.Next()){
if (ex.Current().IsSame(Vtx)) {
Fad = TopoDS::Face(DStr.Shape(Fd->Index(IFadArc)));
Fop = TopoDS::Face(DStr.Shape(Fd->Index(IFopArc)));
//TopTools_ListIteratorOfListOfShape It;
- // On recupere la face en bout sans controle de son unicite.
- for(It.Initialize(myEFMap(Arcpiv));It.More();It.Next()) {
+ // The face at end is returned without control of its unicity.
+ for(It.Initialize(myEFMap(Arcpiv));It.More();It.Next()) {
if(!Fad.IsSame(It.Value())){
Fv = TopoDS::Face(It.Value());
break;
}
if(Fv.IsNull()) StdFail_NotDone::Raise
- ("OneCorner : face en bout non trouvee");
+ ("OneCorner : face at end is not found");
Fv.Orientation(TopAbs_FORWARD);
Fad.Orientation(TopAbs_FORWARD);
- // On recupere de meme l edge qui sera a prolonger.
+ // In the same way the edge to be extended is returned.
for(It.Initialize(myVEMap(Vtx));It.More() && Arcprol.IsNull();It.Next()){
if(!Arcpiv.IsSame(It.Value())){
for(ex.Init(Fv,TopAbs_EDGE); ex.More(); ex.Next()){
}
}
- //Fopbis est la face contenant la trace du conge dont le CP.Arc() ne contient pas Vtx.
- //Normalement soit Fobis est la meme que Fop (cylindre), soit Fobis est G1 avec Fop.
+ //Fopbis is the face containing the trace of fillet CP.Arc() which of does not contain Vtx.
+ //Normallly Fobis is either the same as Fop (cylinder), or Fobis is G1 with Fop.
Fopbis.Orientation(TopAbs_FORWARD);
- //on appelle Fop la 4eme face inutilisee du vertex
+ //Fop calls the 4th face non-used for the vertex
cherche_face(myVFMap(Vtx),Arcprol,Fad,Fv,Fv,Fopbis);
Fop.Orientation(TopAbs_FORWARD);
if(Arcprol.IsNull()) StdFail_NotDone::Raise
- ("OneCorner : edge a prolonger non trouve");
+ ("OneCorner : edge to be extended is not found");
for(ex.Init(Fopbis,TopAbs_EDGE); ex.More(); ex.Next()){
if(Arcprol.IsSame(ex.Current())) {
OArcprolop = ex.Current().Orientation();
Bad.Initialize(Fad);
Bop.Initialize(Fop);
}
- // on va devoir modifier le CommonPoint
- //dans le vide et son parametre dans la FaceInterference.
- //On les recupere donc tous deux dans des references
- //non const. Attention les modifs se font dans le dos
- //de CV1,CV2,Fi1,Fi2.
+ // it is necessary to modify the CommonPoint
+ // in the space and its parameter in FaceInterference.
+ // So both of them are returned in references
+ // non const. Attention the modifications are done behind
+ // CV1,CV2,Fi1,Fi2.
ChFiDS_CommonPoint& CPopArc = Fd->ChangeVertex(isfirst,IFopArc);
ChFiDS_FaceInterference& FiopArc = Fd->ChangeInterference(IFopArc);
ChFiDS_CommonPoint& CPadArc = Fd->ChangeVertex(isfirst,IFadArc);
ChFiDS_FaceInterference& FiadArc = Fd->ChangeInterference(IFadArc);
- //on initialise le parametre du vertex en l air a la valeur de son
- //copain d en face (point sur arc).
+ // the parameter of the vertex is initialized with the value
+ // of its opposing vertex (point on arc).
Standard_Real wop = Fd->ChangeInterference(IFadArc).Parameter(isfirst);
Handle(Geom_Curve) c3df;
Handle(GeomAdaptor_HSurface)
gp_Pnt2d p2dbout;
{
- // rajouter ici des criteres plus ou moins restrictifs pour
- // decider si on fait l intersection avec la face en bout
- // etendue ou si on aiguille sur bouchon.
+ // add here more or less restrictive criteria to
+ // decide if the intersection with face is done at the
+ // extended end or if there will be a cap on sharp end.
c3df = DStr.Curve(FiopArc.LineIndex()).Curve();
Standard_Real uf = FiopArc.FirstParameter();
Standard_Real ul = FiopArc.LastParameter();
// if(!inters && BRep_Tool::Continuity(Arcprol,Fv,Fop) != GeomAbs_C0){
if(!inters && isTangentFaces(Arcprol,Fv,Fop)){
// Modified by Sergey KHROMOV - Fri Dec 21 18:08:29 2001 End
- // Arcprol etant une arete de tangence on tente un
- // ultime rattrappage par un extrema curve/curve.
+ // Arcprol is an edge of tangency, ultimate adjustment by an extrema curve/curve is attempted.
Standard_Real ff,ll;
Handle(Geom2d_Curve) gpcprol = BRep_Tool::CurveOnSurface(Arcprol,Fv,ff,ll);
Handle(Geom2dAdaptor_HCurve) pcprol = new Geom2dAdaptor_HCurve(gpcprol);
if (!ChFi3d_ComputeCurves(HGs,HBs,Pardeb,Parfin,Cc,
Ps,
Pc,tolesp,tol2d,tolreached))
- Standard_Failure::Raise("OneCorner : echec calcul intersection");
+ Standard_Failure::Raise("OneCorner : failed calculation intersection");
Udeb = Cc->FirstParameter();
Ufin = Cc->LastParameter();
- // on determine si la courbe a une intersection avec l'arete de couture
+ // check if the curve has an intersection with sewing edge
ChFi3d_Couture(Fv,couture,edgecouture);
}
else{
- Standard_NotImplemented::Raise("OneCorner : bouchon non ecrit");
+ Standard_NotImplemented::Raise("OneCorner : cap not written");
}
Standard_Integer IShape = DStr.AddShape(Fv);
#ifndef DEB
stripe->SetIndexPoint(ChFi3d_IndexPointInDS(CV2,DStr),isfirst,2);
if (!intcouture) {
-// il n'y a pas d'intersection avec l'arete de couture
-// on stocke la courbe Cc dans la stripe
-// le stockage dans la DS se fera par FILDS.
+// there is no intersection with edge of sewing
+// curve Cc is stored in the stripe
+// the storage in the DS is done by FILDS.
TopOpeBRepDS_Curve Tc(Cc,tolreached);
ICurve = DStr.AddCurve(Tc);
stripe->SetParameters(isfirst,Udeb,Ufin);
}
else {
-// on stocke les courbes curv1 et curv2 dans la DS
-// ces courbes ne seront pas reconstruites par FILDS car
-// on met stripe->InDS(isfirst);
+// curves curv1 and curv2 are stored in the DS
+// these curves are not reconstructed by FILDS as
+// stripe->InDS(isfirst) is placed;
- // interferences de curv1 et curv2 sur Fv
+ // interferences of curv1 and curv2 on Fv
ComputeCurve2d(curv1,Fv,c2d1);
Handle(TopOpeBRepDS_SurfaceCurveInterference) InterFv;
InterFv = ChFi3d_FilCurveInDS(Icurv1,IShape,c2d1,Et);
ComputeCurve2d(curv2,Fv,c2d2);
InterFv = ChFi3d_FilCurveInDS(Icurv2,IShape,c2d2,Et);
DStr.ChangeShapeInterferences(IShape).Append(InterFv);
- // interferences de curv1 et curv2 sur Isurf
+ // interferences of curv1 and curv2 on Isurf
if (Fd->Orientation()== Fv.Orientation()) Et=TopAbs::Reverse(Et);
c2d1=new Geom2d_TrimmedCurve(Ps,Udeb,par2);
InterFv = ChFi3d_FilCurveInDS(Icurv1,Isurf,c2d1,Et);
InterFv = ChFi3d_FilCurveInDS(Icurv2,Isurf,c2d2,Et);
DStr.ChangeSurfaceInterferences(Isurf).Append(InterFv);
- // limitation de l'arete de couture
+ // limitation of the sewing edge
Standard_Integer Iarc=DStr.AddShape(edgecouture);
Handle(TopOpeBRepDS_CurvePointInterference) Interfedge;
TopAbs_Orientation ori;
Interfedge = ChFi3d_FilPointInDS(ori,Iarc,indpt,par1);
DStr.ChangeShapeInterferences(Iarc).Append(Interfedge);
- // creation des CurveInterferences de Icurv1 et Icurv2
+ // creation of CurveInterferences from Icurv1 and Icurv2
stripe->InDS(isfirst);
Standard_Integer ind1= stripe->IndexPoint(isfirst,1);
Standard_Integer ind2= stripe->IndexPoint(isfirst,2);
if( inters){
//
- // On rajoute le petit bout de courbe qui manque pour l extension
- // de la face en bout et la limitation de la face opposee.
+ // The small end of curve missing for the extension
+ // of the face at end and the limitation of the opposing face is added.
- // Tout d abord on coupe les ponts avec l arete de la spine.
+ // Above all the points cut the points with the edge of the spine.
Standard_Integer IArcspine = DStr.AddShape(Arcspine);
Standard_Integer IVtx = DStr.AddShape(Vtx);
TopAbs_Orientation OVtx2;
DStr.ChangeShapeInterferences(IArcspine).Append(interfv);
- //Modif de lvt pour trouver la suite de Arcprol dans l'autre face
+ //Modif of lvt to find the suite of Arcprol in the other face
{
TopTools_ListIteratorOfListOfShape It;
for (It.Initialize(myVEMap(Vtx)); It.More(); It.Next()){
}
}
}
- //fin de modif
+ //end of modif
- // On construit maintenant les courbes qui manquent.
+ //Now the missing curves are constructed.
for(ex.Init(Arcprolbis.Oriented(TopAbs_FORWARD),TopAbs_VERTEX);
ex.More(); ex.Next()){
if(Vtx.IsSame(ex.Current())) {
break;
}
}
-// on determine si Fop a une arete de couture
+// it is checked if Fop has a sewing edge
// TopoDS_Edge edgecouture;
// Standard_Boolean couture;
TopOpeBRepDS_Curve Zob(zob3d,tolreached);
Standard_Integer IZob = DStr.AddCurve(Zob);
- // on ne determine pas si la courbe a une intersection avec l'arete de couture
+ // it is not determined if the curve has an intersection with the sewing edge
{
//=======================================================================
//function : PerformTwoCornerbyInter
-//purpose : Effectue un PerformTwoCorner par intersection.
-// Dans le cas Biseau on utilise pour tous les cas le
-// cheminement biparam/biparam; on reapproxime alors la courbe
-// 3d et les 2 pcurves .
+//purpose : Performs PerformTwoCorner by intersection.
+// In case of Biseau for all cases the
+// path is used; 3D curve and 2 pcurves are approximated.
//=======================================================================
Standard_Integer ChFi3d_Builder::PerformTwoCornerbyInter(const Standard_Integer Index)
const TopoDS_Vertex& Vtx = myVDataMap.FindKey(Index);
TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS();
- //On extrait les informations necessaires sur les conges
+ //Information on fillets is extracted
//------------------------------------------------------
- //le premier
+ //the first
//----------
ChFiDS_ListIteratorOfListOfStripe It;
It.Initialize(myVDataMap(Index));
Corner1->ChangeSetOfSurfData()->ChangeSequence();
Handle(ChFiDS_SurfData)& Fd1 = SeqFil1.ChangeValue(IFd1);
- //le deuxieme
+ //the second
//----------
It.Next();
Handle(ChFiDS_Stripe)& Corner2 = It.Value();
Corner2->ChangeSetOfSurfData()->ChangeSequence();
Handle(ChFiDS_SurfData)& Fd2 = SeqFil2.ChangeValue(IFd2);
- // On analyse les concavites, dans le cas de concavites differentes,
- // prevoir un raccord evolutif du type ThreeCorner de R vers 0.
- // Sinon on recherche la face en vis a vis
- // et l intersection eventuelle des 2 pcurves sur cette face.
+ // The concavities are analysed in case of differents concavities,
+ // preview an evolutionary connection of type ThreeCorner of R to 0.
+ // Otherwise the opposite face
+ // and the eventual intersection of 2 pcurves on this face are found.
ChFiDS_State Stat1,Stat2;
Standard_Boolean isfirst1 = (Sens1 == 1);
return done;
}
if (!OkinterCC) {
- // On calcule l'intersection des pcurves sans les restreindre par les
- // common point
+ // The intersection of pcurves is calculated without restricting them by
+ // common points.
OkinterCC= ChFi3d_IsInFront(DStr,Corner1,Corner2,IFd1,IFd2,Sens1,Sens2,
UIntPC1,UIntPC2,FaCo,SameSide,
IFaCo1,IFaCo2,Okvisavis,Vtx,Standard_True,1);
if (!Okvisavis) {
#if DEB
- cout<<"TwoCorner : pas de face commune"<<endl;
+ cout<<"TwoCorner : no common face"<<endl;
#endif
done=Standard_False;
return done;
}
if (!OkinterCC) {
#if DEB
- cout<<"biseau : echec intersection des lignes de tangence sur face commune"<<endl;
+ cout<<"biseau : failed intersection of tangency lines on common face"<<endl;
#endif
done=Standard_False;
return done;
}
Standard_Integer IFaArc1 = 3-IFaCo1, IFaArc2 = 3-IFaCo2;
- // On verifie que les conges ont bien un commonpoint sur un arc commun.
- // Cet edge est le pivot du biseau ou de la rotule.
+ // It is checked if the fillets have a commonpoint on a common arc.
+ // This edge is the pivot of the bevel or of the kneecap.
ChFiDS_CommonPoint& CP1 = Fd1->ChangeVertex(isfirst1,IFaArc1);
ChFiDS_CommonPoint& CP2 = Fd2->ChangeVertex(isfirst2,IFaArc2);
if (!CP1.IsOnArc() || !CP2.IsOnArc()) {
#if DEB
- cout<<"echec 1 des 2 conges n est pas sur arc"<<endl;
+ cout<<"fail 1 of 2 fillets are not on arc"<<endl;
#endif
done=Standard_False;
return done;
if ( ! CP1.Arc().IsSame( CP2.Arc()) ) {
// look like OnSame + OnDiff case (eap, Arp 9 2002, occ266)
#if DEB
- cout<<"PerformTwoCornerbyInter(): conges ne sont pas sur la meme arc"<<endl;
+ cout<<"PerformTwoCornerbyInter(): fillets are not on the same arc"<<endl;
#endif
done = Standard_True;
PerformMoreThreeCorner(Index, 2);
}
}
if(!ok1 || !ok2){
- //On est dans un contexte merdique
#if DEB
- cout<<"echec une des surfaces n a pas de face d appui commune avec l edge pivot"<<endl;
+ cout<<"fail one of surfaces has no common base face with the pivot edge"<<endl;
#endif
done=Standard_False;
return done;
Handle(Geom_Curve) Gc;
if(sameparam) {
- // Du cote face commune, calcul de Pardeb.
+ // Side common face, calculation of Pardeb.
ChFi3d_ComputesIntPC (Fd1->Interference(IFaCo1),
Fd2->Interference(IFaCo2),
HS1,HS2,UIntPC1,UIntPC2);
Pardeb(3)= UV.X(); Pardeb(4)=UV.Y();
gp_Pnt PFaCo = HS1->Surface().Value(Pardeb(1),Pardeb(2));
- // Du cote arc, calcul de Parfin.
+ // Side arc, calculation of Parfin.
Standard_Real UIntArc1 = Fd1->Interference(IFaArc1).Parameter(isfirst1);
Standard_Real UIntArc2 = Fd2->Interference(IFaArc2).Parameter(isfirst2);
!ChFi3d_ComputeCurves(HS1,HS2,Pardeb,Parfin,Gc,
PGc1,PGc2,tolesp,tol2d,tolreached)) {
#if DEB
- cout<<"echec calcul biseau echec interSS"<<endl;
+ cout<<"failed to calculate bevel error interSS"<<endl;
#endif
done=Standard_False;
return done;
!ChFi3d_ComputeCurves(HS1,HS2,Parfin,Pardeb,Gc,
PGc1,PGc2,tolesp,tol2d,tolreached)) {
#if DEB
- cout<<"echec calcul biseau echec interSS"<<endl;
+ cout<<"failed to calculate bevel error interSS"<<endl;
#endif
done=Standard_False;
return done;
}
- // On met a jour les CornerData avec les resultats de l intersection.
+ // CornerData are updated with results of the intersection.
Standard_Real WFirst = Gc->FirstParameter();
Standard_Real WLast = Gc->LastParameter();
Standard_Integer Ipoin1;
isfirst2,IFaCo2);
Corner2->SetIndexPoint(Corner1->IndexPoint(isfirst1,IFaArc1),
isfirst2,IFaArc2);
- //On update les tolerances des points.
+ //The tolerances of points are updated.
Bnd_Box bco,barc;
if(IFaCo1 == 1) ChFi3d_EnlargeBox(DStr,Corner1,Fd1,bco,barc,isfirst1);
else ChFi3d_EnlargeBox(DStr,Corner1,Fd1,barc,bco,isfirst1);
ChFi3d_SetPointTolerance(DStr,bco,Corner1->IndexPoint(isfirst1,IFaCo1));
}
else {
- // Il faut identifier la surface qui deborde,
- // trouver le point de fin de l intersection Surf/Surf
- // par l intersection de la ligne de tangence du petit sur
- // la face opposee avec la surface du gros,
- // et enfin intersecter le gros avec la face en bout
- // entre ce point et le point sur arc.
+ // It is necessary to identify the border surface,
+ // find the end point of the intersection Surf/Surf
+ // by the intersection of the tangency line of the small
+ // on the opposing face with the surface of the big,
+ // and finally intersect the big with the face at end
+ // between this point and the point on arc.
#ifndef DEB
Standard_Boolean parcrois = Standard_False ;
#else
isfirstBig = isfirst1; isfirstSma = isfirst2;
}
- //Intersection du gros avec le petit :
+ //Intersection of the big with the small :
//------------------------------------
- // Pardeb (parametres du point PFaCo)
- // on verifie l'intersection
+ // Pardeb (parameters of point PFaCo)
+ // the intersection is checked
ChFi3d_ComputesIntPC (SmaFD->Interference(IFaCoSma),
BigFD->Interference(IFaCoBig),
SmaHS,BigHS,UIntPCSma,UIntPCBig);
Pardeb(1)= UVi.X(); Pardeb(2)=UVi.Y();
gp_Pnt PFaCo = SmaHS->Value(UVi.X(),UVi.Y());
- // Parfin (parametres du point PMil)
+ // Parfin (parameters of point PMil)
const ChFiDS_FaceInterference& FiArcSma = SmaFD->Interference(IFaArcSma);
Handle(Geom_Curve) ctg = DStr.Curve(FiArcSma.LineIndex()).Curve();
Handle(GeomAdaptor_HCurve) Hctg = new GeomAdaptor_HCurve();
}
if(!ChFi3d_IntCS(BigHS,Hctg,UVi,wi)){
#if DEB
- cout<<"biseau : echec inter C S"<<endl;
+ cout<<"bevel : failed inter C S"<<endl;
#endif
done=Standard_False;
return done;
if (!ChFi3d_ComputeCurves(SmaHS,BigHS,Pardeb,Parfin,Gc,
PGc1,PGc2,tolesp,tol2d,tolreached)) {
#if DEB
- cout<<"echec calcul biseau echec interSS"<<endl;
+ cout<<"failed to calculate bevel failed interSS"<<endl;
#endif
done=Standard_False;
return done;
}
- // On met a jour la SmaCD, c est fini pour elle.
+ // SmaCD is updated, for it this is all.
Standard_Real WFirst = Gc->FirstParameter();
Standard_Real WLast = Gc->LastParameter();
Standard_Integer IpointCo, IpointMil, IpointArc;
SmaCD->SetIndexPoint(IpointMil,isfirstSma,IFaArcSma);
if (IFaCoSma == 2) SmaCD->SetOrientation(TopAbs_REVERSED,isfirstSma);
- // Pour la BigCD on met ces premiers resultats dans la DS.
+ // For BigCD the first results are met in the DS.
BigCD->SetIndexPoint(IpointCo,isfirstBig,IFaCoBig);
BigFD->ChangeVertex(isfirstBig,IFaCoBig) = psmaco;
BigFD->ChangeInterference(IFaCoBig).SetParameter(UIntPCBig,isfirstBig);
Interfp = ChFi3d_FilPointInDS(TopAbs_REVERSED,ICurv,IpointMil,WLast);
Li.Append(Interfp);
- // la transition des courbes d intersection sur la Big
+ // the transition of curves of intersection on the Big
TopAbs_Orientation tra = BigFD->InterferenceOnS1().Transition();
TopAbs_Orientation ofac = DStr.Shape(BigFD->IndexOfS1()).Orientation();
TopAbs_Orientation ofil = BigFD->Orientation();
Interfc = ChFi3d_FilCurveInDS (ICurv,ISurf,PGc2,tracurv);
DStr.ChangeSurfaceInterferences(ISurf).Append(Interfc);
- //On update les tolerances des points (on commence).
+ //The tolerances of points are updated (beginning).
Bnd_Box bco,bmil,barc;
if(IFaCoSma == 1) ChFi3d_EnlargeBox(DStr,SmaCD,SmaFD,bco,bmil,isfirstSma);
else ChFi3d_EnlargeBox(DStr,SmaCD,SmaFD,bmil,bco,isfirstSma);
ChFi3d_EnlargeBox(BigHS,PGc2,WFirst,WLast,bco,bmil);
- // Intersection du gros avec la face en bout :
+ // Intersection of the big with the face at end :
// -------------------------------------------
- // Pardeb (parametres de PMil)
- // On rejoue l intersection courbe surface mais avec la representation
- // pcurve on face de la courbe pour etre bien sur.
+ // Pardeb (parameters of PMil)
+ // The intersection curve surface is tried again, now with representation
+ // pcurve on face of the curve to be sure.
TopoDS_Face F = TopoDS::Face(DStr.Shape(SmaFD->Index(IFaArcSma)));
Handle(BRepAdaptor_HSurface) HF = new BRepAdaptor_HSurface(F);
Standard_Real fsma = FiArcSma.FirstParameter();
Handle(Adaptor3d_HCurveOnSurface) Hconsf = new Adaptor3d_HCurveOnSurface(consf);
if(!ChFi3d_IntCS(BigHS,Hconsf,UVi,wi)) {
#if DEB
- cout<<"biseau : echec inter C S"<<endl;
+ cout<<"bevel : failed inter C S"<<endl;
#endif
done=Standard_False;
return done;
Pardeb(1) = UVi.X(); Pardeb(2) = UVi.Y();
gp_Pnt2d ppff1 = UVi;
- // Parfin (parametres du point cpend)
+ // Parfin (parameters of the point cpend)
Standard_Real ptg = BigFD->Interference(IFaArcBig).Parameter(isfirstBig);
UVi = BigFD->Interference(IFaArcBig).PCurveOnSurf()->Value(ptg);
Parfin(3) = UVi.X(); Parfin(4) = UVi.Y();
// Intersection.
Standard_Real uu1,uu2,vv1,vv2;
ChFi3d_Boite(ppff1,ppff2,uu1,uu2,vv1,vv2);
- // pour le cas ou les deux chanfreins sont sur deux aretes OnSame,
- // il faut etendre la surface portant F, sinon, au moins ne pas la
- // restreindre.
+ // for the case when two chamfers are on two edges OnSame,
+ // it is necessary to extend the surface carrying F, or at least
+ // not to limit it.
ChFi3d_BoundFac(HF->ChangeSurface(),uu1,uu2,vv1,vv2,Standard_True);
if (!ChFi3d_ComputeCurves(HF,BigHS,Pardeb,Parfin,Gc,
PGc1,PGc2,tolesp,tol2d,tolreached)) {
#if DEB
- cout<<"echec calcul biseau echec interSS"<<endl;
+ cout<<"fail calculation bevel fail interSS"<<endl;
#endif
done=Standard_False;
return done;
}
- // On finit de mettre a jour la BigCD et la DS.
+ // End of update of the BigCD and the DS.
WFirst = Gc->FirstParameter();
WLast = Gc->LastParameter();
ICurv = DStr.AddCurve(TopOpeBRepDS_Curve(Gc,tolreached));
DStr.ChangeSurfaceInterferences(ISurf).Append(Interfc);
BigCD->InDS(isfirstBig);
- // Et enfin on met dans la DS les informations cote face.
+ // Finally the information on faces is placed in the DS.
Standard_Integer IShape = DStr.AddShape(F);
if(SmaFD->Surf() == BigFD->Surf()){
tracurv = TopAbs::Compose(etest.Orientation(),
Interfc = ChFi3d_FilCurveInDS(ICurv,IShape,PGc1,tracurv);
DStr.ChangeShapeInterferences(IShape).Append(Interfc);
- //On update les tolerances des points (on finit).
+ //The tolerances of points are updated (end).
Handle(ChFiDS_Stripe) bidst;
if(IFaCoBig == 1) ChFi3d_EnlargeBox(DStr,bidst,BigFD,bco,barc,isfirstBig);
else ChFi3d_EnlargeBox(DStr,bidst,BigFD,barc,bco,isfirstBig);
//=======================================================================
//function : cherche_edge1
-//purpose : cherche l'edge commune entre les faces F1 et F2
+//purpose : find common edge of faces F1 and F2
//=======================================================================
static void cherche_edge1 (const TopoDS_Face & F1,
//=======================================================================
//function : CurveHermite
-//purpose : calcule une courbe 3d au moyen des polynomes d'Hermite.
-// l'arete ic est une arete de regularite . On construit une courbe 3d entre
-// les aretes icmoins et icplus.
+//purpose : calculate a curve 3d using polynoms of Hermite.
+// the edge is a regular edge. Curve 3D is constructed
+// between edges icmoins and icplus.
//=======================================================================
static void CurveHermite (const TopOpeBRepDS_DataStructure& DStr,
//=======================================================================
//function : CalculDroite
-//purpose : calcule une droite 2d passant par le point p2d1 et de direction xdir ydir
+//purpose : calculate a 2D straight line passing through point p2d1 and direction xdir ydir
//=======================================================================
static void CalculDroite(const gp_Pnt2d & p2d1,
//=======================================================================
//function : CalculBatten
-//purpose : calcule un batten entre les courbes 2d curv2d1 et curv2d2 aux points p2d1 et p2d2
+//purpose : calcule a batten between curves 2d curv2d1 and curv2d2 at points p2d1 and p2d2
//=======================================================================
static void CalculBatten (const Handle (GeomAdaptor_HSurface) ASurf,
Ok = Bat.Compute(Iana,25,1.e-2);
#if DEB
if (!Ok) {
- cout<<"pas de batten :";
+ cout<<"no batten :";
Bat.Dump(cout);
}
#endif
//=======================================================================
//function : OrientationIcNonVive
-//purpose : calcule l'orientation de la courbe de raccord entre ic et icplus sachant que ic
-// n'est pas une arete vive
+//purpose : calculate the orientation of the curve between ic and icplus knowing that ic
+// is not a living edge.
//=======================================================================
static void OrientationIcNonVive (const Handle(ChFiDS_Stripe) & CDic,
//=======================================================================
//function : OrientationIcplusNonVive
-//purpose : calcule l'orientation de la courbe de raccord entre ic et icplus sachant que icplus
-// n'est pas une arete vive;
+//purpose : calculate the orientation of the curve between ic and icplus knowing that icplus
+// is not a living edge;
//=======================================================================
static void OrientationIcplusNonVive (const Handle(ChFiDS_Stripe) & CDicplus,
//=======================================================================
//function : OrientationAreteViveConsecutive
-//purpose : calcule l'orientation de la courbe de raccord entre les aretes ic et icplus
-// ou ic et icplus sont vives consecutives
+//purpose : calculate the orientation of the curve between edges ic and icplus
+// where ic and icplus are consecutively living
//=======================================================================
static void OrientationAreteViveConsecutive (const TopoDS_Shape & Fviveicicplus,
const TopoDS_Vertex & V1,
TopAbs_Orientation & orien)
-{ // orinterf est l'orientation de l'edge ic par rapport a la face Fviveicicplus prise FORWARD
+{ // orinterf is orientation of edge ic corresponding to face Fviveicicplus taken FORWARD
#ifndef DEB
TopAbs_Orientation orinterf = TopAbs_FORWARD;
#else
break;
}
}
- // si V1 est le vertex REVERSED de l'edge ic alors la courbe de
- // raccord a la meme orientation que ic
+ // if V1 is vertex REVERSED of edge ic the curve
+ // has the same orientation as ic
TopoDS_Vertex vl;
vl=TopExp::LastVertex(E);
if (vl.IsSame(V1)){
//=======================================================================
//function : PerformTwoCornerSameExt
-//purpose : calcule l'intersection entre les deux stripes stripe1 et stripe2
+//purpose : calculate intersection between two stripes stripe1 and stripe2
//=======================================================================
static void PerformTwoCornerSameExt(TopOpeBRepDS_DataStructure& DStr,
//=======================================================================
//function : CpOnEdge
-//purpose : determine si la surfdata num a un common point sur Eadj1 ou Eadj2
+//purpose : determine if surfdata num has a common point on Eadj1 or Eadj2
//=======================================================================
static void CpOnEdge (const Handle(ChFiDS_Stripe) & stripe,
//=======================================================================
//function : RemoveSurfData
-//purpose : pour chaque stripe suppression des surfdatas initiles
+//purpose : for each stripe removal of unused surfdatas
//=======================================================================
static void RemoveSurfData (const ChFiDS_StripeMap & myVDataMap,
Standard_Integer ind;
if (sense==1) {
ind=0;
- // parmi les surfdatas on cherche le plus grand indice ind tel que
- // la surfdata ait un de ses commonpoint sur Eadj1 et Eadj2
- // on supprime les surfdata de 1 a ind-1
+ // among surfdatas find the greatest indice ind so that
+ // surfdata could have one of commonpoint on Eadj1 and Eadj2
+ // remove surfdata from 1 to ind-1
for (Standard_Integer i=1;i<=nbsurf;i++) {
CpOnEdge (It.Value(),i,isfirst,Eadj1,Eadj2,compoint);
if (compoint) ind=i;
}
else {
ind=num;
- // parmi les surfdatas on cherche le plus petit indice ind tel que
- // la surfdata ait un de ses commonpoint sur Eadj1 et Eadj2
- // on supprime les surfdata de ind+1 a num
+ // among surfdatas find the smallest indice ind so that
+ // surfdata could have one of commonpoint on Eadj1 and Eadj2
+ // remove surfdata from ind+1 to num
for (Standard_Integer i=num;i>=1;i--) {
CpOnEdge (It.Value(),i,isfirst,Eadj1,Eadj2,compoint);
if (compoint) ind=i;
//=======================================================================
//function : PerformMoreThreeCorner
-//purpose : Traite le cas d'un sommet a n aretes.
+//purpose : Process case of a top with n edges.
//=======================================================================
void ChFi3d_Builder::PerformMoreThreeCorner(const Standard_Integer Jndex,
TopoDS_Face F1,F2;
gp_Vec SumFaceNormalAtV1(0,0,0); // is used to define Plate orientation
- // on determine s'il y a une arete de couture
- // la face qui a une arete de couture et l'arete de couture
+ // it is determined if there is a sewing edge
Standard_Boolean couture=Standard_False;
TopoDS_Face facecouture;
TopoDS_Edge edgecouture;
facecouture=fcur;
}
-// On enleve les surfdata inutiles
+// unused surfdata are removed
RemoveSurfData (myVDataMap, myEFMap,edgecouture,facecouture,V1);
- // tri des aretes et des faces
+ // parse edges and faces
trouve=Standard_False;
TopoDS_Edge Enext;
TopoDS_Vertex VV;
ChFi3d_cherche_edge(V1,Evive,Fcur,Enext,VV);
trouve= !Enext.IsNull();
}
- // find sum of all face normales at V1
+ // find sum of all face normals at V1
SummarizeNormal(V1, Fcur, Ecur, SumFaceNormalAtV1);
Standard_Integer nbcouture=0;
}
else ChFi3d_cherche_edge(V1,Evive,Fcur,Enext,VV);
if (Enext.IsNull())Standard_Failure::Raise
- ("PerformMoreThreeCorner: pb dans le tri des aretes et des faces");
+ ("PerformMoreThreeCorner: pb in the parsing of edges and faces");
if (Enext.IsSame(edgelibre1)|| Enext.IsSame(edgelibre2)) {
CD.SetValue(ii, cdbid);
Index.SetValue(ii, 0);
jf.SetValue(ii, 0);
}
else {
-// on cherche si Enext est dans la map des stripes
+// it is found if Enext is in the map of stripes
TopoDS_Edge EE;
/*Standard_Boolean */trouve = Standard_False;
for (It.Initialize(myVDataMap(Jndex));It.More()&&!trouve;It.Next()) {
Evive.SetValue(ii, Enext);
}
else {
- // l'arete ii est vive
+ // edge ii is alive
CD.SetValue(ii, cdbid);
Index.SetValue(ii, 0);
sens.SetValue(ii, -1);
Evive.SetValue(ii, Enext);
jf.SetValue(ii, 0);
}
- // On cherche la face Fnext!=Fcur qui contient Enext
+ // Face Fnext!=Fcur containing Enext
Fnext=Fcur;
ChFi3d_cherche_face1(myEFMap(Enext),Fcur,Fnext);
Indices(nedge,ii,icplus,icmoins);
numfa.SetValue(icplus,ii,numfa.Value(ii,icplus));
Standard_Integer numface1,numface2;
if (trouve) {
- // on regarde si numfa correspond a IndexOfS1 ou IndexOfS2
- // on met a jour en consequence jf
- // si ce n'est pas le cas on recherche parmi les faces precedentes
- // celle qui correspond a IndexOfs1 IndexOfS2 et on remet a jour
- // numfa et Fvive (cts16288)
+ // it is checked if numfa corresponds to IndexOfS1 or IndexOfS2
+ // jf is updated is consequently updated
+ // if it is not the case among the previous faces are found
+ // those which correspond to IndexOfs1 IndexOfS2 and
+ // numfa and Fvive are reupdated (cts16288)
numface2 = SurfIndex(CD, ii, Index.Value(ii), FACE2);
if (numface2==numfa.Value(ii,icplus))
jf.SetValue(ii, 2);
}
}
}
- // on verifie qu'une arete de regularite n'est pas tangente a une autre arete
- // dans ce cas on ne la considere pas comme reguliere (cts60072)
+ // it is checked if a regular edge is not tangent to another edge
+ // in case if it is not considered regular (cts60072)
for (ic=0;ic<nedge;ic++) {
if (regul.Value(ic) ) {
trouve=Standard_False;
}
}
- // la variable deuxconges permet de detecter les cas ou on a un sommet a
- // n aretes et deux conges sur deux aretes tangentes qui ne sont pas
- // des bords libres
- // les courbes de raccord partent du conge jusqu'au sommet
+ // variable deuxconges allows detecting cases when there is a top with
+ // n edges and two fillets on two tangent edges that are not free borders
+ // the connecting curves start from the fillet and end on top
Standard_Boolean deuxconges,deuxcgnontg;
deuxconges=Standard_False;
}
}
- // on utilise la variable deuxconges dans le cas particulier
- // ou on a deux conges et si les deux autres aretes vives
- // sont tangentes (cts60072)
+ // variable deuxconges is used in the special case when there are
+ // two fillets and if two other living edges are tangent (cts60072)
if (nconges==2 && nedge==4) {
TopoDS_Edge E1,E2;
for (ic=0;ic<nedge&&!deuxconges;ic++) {
PerformOneCorner (Jndex, Standard_True);
}
-// si le commonpoint est sur une arete qui n'a pas comme
-// extremite le vertex , on determine a nouveau Evive
-// On determine a nouveau Fvive si elle ne correspondant
-// pas a une des deux faces adjacentes a Evive (cts16288)
+// if the commonpoint is on an edge that does not have a
+// vertex at the extremity, Evive is found anew
+// Fvive is found anew if it does not correspond
+// to two faces adjacent to Evive (cts16288)
if (!deuxconges && !isOnSameDiff)
for (ic=0;ic<nedge;ic++) {
}
}
-// on recupere la premiere arete libre si elle existe
+// the first free edge is restored if it exists
trouve=Standard_False;
for (ic=0; ic<nedge&&!trouve;ic++) {
TopoDS_Edge ecom;
}
}
-// determination de la distance de recul distmin a ne pas depasser
+// determine the minimum recoil distance that can't be exceeded
Standard_Boolean distmini=Standard_False;
gp_Pnt som=BRep_Tool::Pnt(V1),pic;
gp_Pnt2d p2;
if (dst<distmin) distmin=dst;
}
-// calcul des intersections entre les stripes et determination des parametres
-// sur chaque pcurve
+// calculate intersections between stripes and determine the parameters on each pcurve
Standard_Boolean inters=Standard_True;
for (ic=0;ic<nedge;ic++) {
Indices(nedge,ic,icplus,icmoins);
Handle(ChFiDS_Stripe) strip;
Standard_Real angedg;
Standard_Integer iface;
- // si les deux aretes sont tangentes on ne tente pas
- // l'intersection (cts60046)
+ // if two edges are tangent the intersection is not attempted (cts60046)
angedg=Abs(ChFi3d_AngleEdge(V1,TopoDS::Edge(Evive.Value(ic)),TopoDS::Edge(Evive.Value(icplus))));
if (Abs(angedg-PI)>0.01)
ok = ChFi3d_SearchFD(DStr,CD.Value(ic),CD.Value(icplus),sens.Value(ic),sens.Value(icplus),
Index.Value(ic),Index.Value(icplus),
face,sameside,jf1,jfp);
else ok=Standard_False;
- // s'il y a une intersection on regarde si la surfdata ou il y a l'intersection
- // correspond a la premiere ou a la derniere
- // si ce n'est pas le cas on enleve de la SD les surfdata
+ // if there is an intersection it is checked if surfdata with the intersection
+ // corresponds to the first or the last
+ // if this is not the case, the surfdata are removed from SD
if (ok) {
if (i1!=Index.Value(ic) ){
if (!oksea.Value(ic) ) inters=Standard_False;
}
- // cas ou il n'y a pas que des intersections
- // les parametres sur les Pcurves sont les extremites de la stripe
+ // case if there are only intersections
+ // the parametres on Pcurves are the extremities of the stripe
Standard_Real para;
if (!inters) {
for (ic=0;ic<nedge;ic++) {
}
}
-// calcul de la distance max du sommet a chaque point
+// calculate max distance to the top at each point
TColStd_Array1OfReal dist1(0,size);
TColStd_Array1OfReal dist2(0,size);
Standard_Real distance=0.;
}
}
-// decalage des parametres et elimination des points d'intersections
-// trop proches du sommet
+// offset of parameters and removal of intersection points
+// too close to the top
Standard_Real ec, dist;
if (!deuxconges && !deuxcgnontg)
Indices(nedge,ic,icplus,icmoins);
if (sharp.Value(ic) ) {
BRepAdaptor_Curve C(TopoDS::Edge(Evive.Value(ic)));
- // pour passer d'une distance 3d a une distance parametrique
+ // to pass from 3D distance to a parametric distance
if (!tangentregul(ic))
ec = distance*100*C.Resolution(0.01);
else ec=0.0;
para=p.Value(ic,icmoins) - ec;
p.SetValue(ic,icmoins,para);
}
-// il faudra etre sur de rester sur l'edge
+// it is necessary to be on to remain on the edge
p.SetValue(ic,icplus, p.Value(ic,icmoins));
}
else if (!distmini) {
}
}
-// on tente de limiter l'arete vive par un des commonpoint
+// it is attempted to limit the edge by a commonpoint
//
Standard_Real tolcp=0;
if (!sharp.Value(icmoins) && !sharp.Value(icplus))
samecompoint=cp1.Point().Distance(cp2.Point())<tolapp;
if ((dS<d1 || dS<d2)&& !samecompoint) {
-// on recule jusqu'aux Common Points
-// sans sortir de l'Edge ??
+// step back till Common Points
+// without leaving the Edge ??
if (d2<d1 &&cp1.IsOnArc() ) {
-// on choisit cp1
+// cp1 is chosen
p.SetValue(ic,icmoins, cp1.ParameterOnArc());
p.SetValue(ic,icplus, p.Value(ic,icmoins));
isfirst=(sens.Value(icplus)==1);
if (cp1.Tolerance()>tolcp &&cp1.Tolerance()<1 ) tolcp=cp1.Tolerance();
}
else if( cp2.IsOnArc()){
-// on choisit cp2
+// cp2 is chosen
p.SetValue(ic,icmoins, cp2.ParameterOnArc());
p.SetValue(ic,icplus, p.Value(ic,icmoins));
isfirst=(sens.Value(icmoins)==1);
}
}
else {
-// on se recale sur un Common Point uniquement si on en est tres pres
+// step back till Common Point only if it is very close
if (!sharp.Value(icplus)) {
if ((cp1.Point().Distance(PE)<cp1.Tolerance() ||
samecompoint || nconges==1) && cp1.IsOnArc()) {
-// on est tres proche de cp1
+// it is very close to cp1
p.SetValue(ic,icmoins, cp1.ParameterOnArc());
ponctuel.SetValue(ic,Standard_True);
p.SetValue(ic,icplus, p.Value(ic,icmoins));
if (!sharp.Value(icmoins)){
if ((cp2.Point().Distance(PE)<cp2.Tolerance() ||
samecompoint || nconges==1) && cp2.IsOnArc()) {
-// on est tres proche de cp2
+// it is very close to cp2
ponctuel.SetValue(icmoins,Standard_True);
p.SetValue(ic,icmoins, cp2.ParameterOnArc());
p.SetValue(ic,icplus,p.Value(ic,icmoins));
}
}
-// dans le cas d'un bord libre on prend le parametre correspondant
-// au common point sur l'arete libre.
+// in case of a free border the parameter corresponding
+// to the common point on the free edge is chosen.
for (ic=0;ic<nedge;ic++) {
if (TopoDS::Edge(Evive.Value(ic)).IsSame(edgelibre1) ||
}
}
-// si ic est une arete de regularite, on cherche l'arete indfin qui ne
-// soit pas une arete de regularite, on construit une courbe 3d
-// entre les aretes (ou stripes ) icmoins et indfin.
-// On projette ensuite cette courbe3d sur toutes les faces (nbface) qui
-// separent icmoins et indfin
+// if ic is a regular edge, one finds edge indfin which is not
+// a regular edge, and construtc a curve 3d
+// between edges (or stripes ) icmoins and indfin.
+// Then this courbe3d is projected on all faces (nbface) that
+// separate icmoins and indfin
#ifndef DEB
Standard_Integer nbface = 0;
#else
}
}
- // cas ou la courbe de raccord entre ic et icplus traverse plusieurs faces
+ // case when the conncting curve between ic and icplus crosses many faces
TopTools_SequenceOfShape Ecom;
TopTools_SequenceOfShape Eproj;
}
}
-// cas ou deux conges ont les memes commonpoints
-// on procede alors par intersection
-// on verifie cependant que les extremites de l'intersection coincident avec les commonpoints
+// case when two fillets have the same commonpoints
+// one continues then by intersection
+// it is checked if the extremities of the intersection coincide with commonpoints
Standard_Boolean intersection=Standard_False, introuve;
if (nconges==2 && !deuxconges) {
}
}
-// declaration pour plate
+// declaration for plate
GeomPlate_BuildPlateSurface PSurf(3,10,3,tol2d,tolesp,angular);
-// calcul des courbes sur surface pour chaque stripe
+// calculation of curves on surface for each stripe
for (ic=0;ic<nedge;ic++) {
gp_Pnt2d p2d1, p2d2;
if (!sharp.Value(ic)) {
indice= SurfIndex(CD, ic, i.Value(ic,icplus), ChFiSURFACE);
Handle (GeomAdaptor_HSurface) Asurf =
new GeomAdaptor_HSurface(DStr.Surface(indice).Surface());
- // calcul de la courbe 2d
+ // calculation of curve 2d
xdir= p2d2.X()-p2d1.X();
ydir= p2d2.Y()-p2d1.Y();
Standard_Real l0 = sqrt(xdir*xdir+ ydir*ydir );
new GeomPlate_CurveConstraint(HCons,Order.Value(ic),10,tolesp,angular,0.1);
PSurf.Add(Cont);
- // calcul des indices de points et de la courbe pour la DS
+ // calculate indexes of points and of the curve for the DS
isfirst=(sens.Value(ic)==1);
GeomLib::BuildCurve3d(tolapp,CurvOnS,CurvOnS.FirstParameter(),
CurvOnS.LastParameter(),Curv3d,maxapp,avedev);
TopOpeBRepDS_Point tpoint2 (point2,maxapp);
errapp.SetValue(ic,maxapp);
if (ic==0) {
-// il faut creer les deux points
+// it is necessary to create two points
indpoint.SetValue(ic,0,DStr.AddPoint(tpoint1));
indpoint.SetValue(ic,1,DStr.AddPoint(tpoint2));
}
else {
-// les points existent peut-etre deja sur un conge
-// (intersection precedente,...)
+// probably the points are already on the fillet
+// (previous intersection...)
trouve = Standard_False;
for (ii=0;ii<ic&&(!trouve);ii++) {
if (!sharp.Value(ii)) {
indpoint.SetValue(ic,1,DStr.AddPoint(tpoint2));
}
- // mise a jour de la stripe
+ // update of the stripe
isurf1=3-jf.Value(ic); isurf2=jf.Value(ic);
if (isurf1==2) CD.Value(ic)->SetOrientation(TopAbs_REVERSED,isfirst);
CD.Value(ic)->SetCurve(indcurve3d.Value(n3d),isfirst);
}
}
-// calcul des indices de points pour les aretes vives
+// calculate the indices of points for living edges
for (ic=0;ic<nedge;ic++) {
if (sharp.Value(ic)) {
Indices(nedge,ic,icplus,icmoins);
cp = CD.Value(icplus)->SetOfSurfData()->Value(i.Value(icplus,ic))->
ChangeVertex (isfirst,jfp);
if ( cp.Point().Distance(PE) <= Max(1.e-4,tolcp)) {
-// l'arete a ete limitee par le 1er CommonPoint de CD[icplus]
+// edge was limited by the 1st CommonPoint of CD[icplus]
indpoint.SetValue(ic,0,indpoint.Value(icplus,0));
indpoint.SetValue(ic,1,indpoint.Value(icplus,0));
}
cp = CD.Value(icmoins)->SetOfSurfData()->Value(i.Value(icmoins,ic))->
ChangeVertex (isfirst,jf.Value(icmoins));
if ( cp.Point().Distance(PE) <= Max(1.e-4,tolcp)) {
-// l'arete a ete limitee par le 2eme CommonPoint de CD[icmoins]
+// edge was limited by the 2nd CommonPoint of CD[icmoins]
if (indpoint.Value(ic,0)==0) {
indpoint.SetValue(ic,0, indpoint.Value(icmoins,1));
indpoint.SetValue(ic,1, indpoint.Value(icmoins,1));
}
}
- // calcul des courbes intermediaires reliant deux stripes dans le cas ou il n'y a pas
-// d'intersection. La courbe peut etre une droite une projection ou un batten
+// calculation of intermediary curves connecting two stripes in case if
+// there is no intersection. The curve is a straight line, projection or batten
Standard_Boolean raccordbatten;
if (!inters) {
Handle (GeomAdaptor_HSurface) Asurf;
Standard_Real u1bid,u2bid;
- // recuperation de la premiere courbe 2d
- // et du premier point de raccordement
+ // return the 1st curve 2d
+ // and the 1st connection point
if (sharp.Value(ic))
curv2d1 = BRep_Tool::CurveOnSurface(TopoDS::Edge(Evive.Value(ic)),TopoDS::Face(Fvive.Value(ic,icplus)),
u1bid,u2bid);
if (tolu>tolv) ratio=tolu/tolv;
else ratio=tolv/tolu;
- // dans le cas d'une arete de couture on recadre les parametres
+ // in case of a sewing edge the parameters are reframed
if (couture) {
Standard_Boolean PI1=Standard_False, PI2=Standard_False;
Standard_Real xx;
Standard_Real l0 = sqrt(xdir*xdir+ ydir*ydir );
if (l0<1.e-7|| ponctuel.Value(ic)) {
-// raccord inutile
+// unused connection
n3d--;
ponctuel.SetValue(ic,Standard_True);
if (!deuxconges) {
}
}
}
- else { // le raccord est soit une droite soit une projection soit un batten
+ else { // the connection is a straight line, projection or batten
if (ratio>10 && nconges==1) raccordbatten=Standard_True;
if (ratio>10 && raccordbatten) {
CalculDroite(p2d1,xdir,ydir,pcurve);
raccordbatten=Standard_False;
}
- else if (!raccordbatten){ // on recupere les courbes projetees
+ else if (!raccordbatten){ // the projected curves are returned
if (regul.Value(ic)) {
if (cproj2.Value(ic).IsNull()){
raccordbatten=Standard_True;
contraint2=Standard_True;
if (raccordbatten) {
#ifdef DEB
- ChFi3d_InitChron(ch);// init performances pour les batten
+ ChFi3d_InitChron(ch);// initial performances for battens
#endif
Standard_Boolean inverseic,inverseicplus;
if (sharp.Value(ic)) {
CalculBatten(Asurf,TopoDS::Face(Fvive(ic,icplus)),xdir,ydir,p2d1,p2d2,contraint1,contraint2,curv2d1,curv2d2,p.Value(ic,icplus),
p.Value(icplus,ic),inverseic,inverseicplus,pcurve);
#ifdef DEB
- ChFi3d_ResultChron( ch,t_batten); // result performances pour les batten
+ ChFi3d_ResultChron( ch,t_batten); // resulting performances for battens
#endif
}
- // construction des frontieres pour Plate
+ // construction of borders for Plate
Handle (Geom2dAdaptor_HCurve) Acurv=new Geom2dAdaptor_HCurve(pcurve);
Adaptor3d_CurveOnSurface CurvOnS (Acurv,Asurf);
Handle(Adaptor3d_HCurveOnSurface) HCons =
new Adaptor3d_HCurveOnSurface(CurvOnS);
- // on met des contraintes G1 si les aretes ic et icplus ne sont pas toutes les deux vives
+ // constraints G1 are set if edges ic and icplus are not both alive
Order.SetValue(n3d,0);
new GeomPlate_CurveConstraint(HCons,Order.Value(n3d),10,tolesp,angular,0.1);
PSurf.Add(Cont);
- //calcul de la courbe 3d si ce n'est pas une projection
+ //calculation of curve 3d if it is not a projection
if (curveint.IsNull()) {
GeomLib::BuildCurve3d(tolapp,CurvOnS,CurvOnS.FirstParameter(),
CurvOnS.LastParameter(),Curv3d,maxapp1,avedev);
curveint= new Geom_TrimmedCurve(Curv3d,pardeb,parfin);
}
- //stockage dans la DS
+ //storage in the DS
TopOpeBRepDS_Curve tcurv3d( curveint,maxapp1);
indcurve3d.SetValue(n3d, DStr.AddCurve(tcurv3d));
pardeb=curveint->FirstParameter();
parfin=curveint->LastParameter();
if ( sharp.Value(icplus) && indpoint.Value(icplus,0) == 0) {
- // il faut initialiser indpoint[icplus][0] et indpoint[icplus][1]
+ // it is necessary to initialize indpoint[icplus][0] and indpoint[icplus][1]
gp_Pnt point2;
point2 =curveint->Value(parfin);
TopOpeBRepDS_Point tpoint2 (point2,maxapp);
tpt2.Tolerance (tpt2.Tolerance()+maxapp1);
}
- // calcul de l'orientation de la courbe
+ // calculate orientation of the curve
TopAbs_Orientation orinterf;
if (!sharp.Value(ic)) {
OrientationIcNonVive(CD.Value(ic),jf.Value(ic),i.Value(ic,icplus),sens.Value(ic),orinterf);
Interfc=ChFi3d_FilCurveInDS(indcurve3d.Value(n3d),numfa.Value(ic,icplus),pcurve,orinterf);
DStr.ChangeShapeInterferences(numfa.Value(ic,icplus)).Append(Interfc);
}
- } // fin du traitement par arete
- } // fin de la boucle sur les aretes
- } // fin du traitement pour les courbes intermediaires
+ } // end of processing by edge
+ } // end of the loop on edges
+ } // end of processing for intermediary curves
-// stockage dans la DS des courbes projetees sur plusieurs faces
+// storage in the DS of curves projected on several faces
for (ic=0;ic<nedge;ic++) {
if (moresurf.Value(ic) ){
TopoDS_Vertex Vf,Vl;
}
}
- //calcul de l'orientation
+ //calculation of the orientation
TopAbs_Orientation orinterf;
if (P1.Distance(Pcom)>1.e-4) {
if (orvt==TopAbs_FORWARD) {
}
}
-// cas ou les deux bords libres sont tangents
+// case when two free borders are tangent
if (droit)
for (ic=0;ic<nedge;ic++) {
Handle(Geom_Curve) curve,ctrim,rcurve;
}
#ifdef DEB
- ChFi3d_InitChron(ch); // init performances pour plate
+ ChFi3d_InitChron(ch); // init performances for plate
#endif
PSurf.Perform();
#ifdef DEB
- ChFi3d_ResultChron(ch, t_plate); //result performances pour plate
+ ChFi3d_ResultChron(ch, t_plate); //result performances for plate
#endif
- // appel a l'approx
+ // call of approx
#ifdef DEB
- ChFi3d_InitChron(ch); // init performances pour approxplate
+ ChFi3d_InitChron(ch); // init performances for approxplate
#endif
if (PSurf.IsDone()) {
Standard_Integer nbcarreau=9;
apperror=Mapp.CriterionError()*coef;
#ifdef DEB
- ChFi3d_ResultChron(ch, t_approxplate); // result performances pour approxplate
+ ChFi3d_ResultChron(ch, t_approxplate); // result performances for approxplate
#endif
-// Stockage de la surface plate et des courbes correspondantes dans la DS
+// Storage of the surface plate and corresponding curves in the DS
TopAbs_Orientation orplate,orsurfdata,orpcurve,orien;
#ifdef DEB
TopOpeBRepDS_ListOfInterference& SolidInterfs =
DStr.ChangeShapeInterferences(SolInd);
-// dans le cas ou l'on relie au sommet , il faut que les
-// aretes vives qui arrivent au sommet soient enlevees de la DS.
-// Pour cela on les stocke dans la DS avec leur orientation inverse
+// in case when one rereads at top, it is necessary that
+// alive edges that arrive at the top should be removed from the DS.
+// For this they are stored in the DS with their inverted orientation
Standard_Integer nbedge;
TopExp_Explorer ex;
if (deuxconges)
}
}
- // calcul de l'orientation de Plate orplate par rapport aux surfdata
- // on fait le calcul par rapport a la premiere la stripe
+ // calculate orientation of Plate orplate corresponding to surfdata
+ // calculation corresponding to the first stripe
Indices(nedge,0,icplus,icmoins);
isfirst=(sens.Value(0)==1);
const Handle(ChFiDS_SurfData)& Fd =
// else orplate=TopAbs::Reverse(orsurfdata);
orplate = PlateOrientation(Surf,PSurf.Curves2d(),SumFaceNormalAtV1);
- // creation de la solidinterderence pour Plate
+ // creation of solidinterderence for Plate
Handle(TopOpeBRepDS_SolidSurfaceInterference) SSI =
new TopOpeBRepDS_SolidSurfaceInterference(TopOpeBRepDS_Transition(orplate),
TopOpeBRepDS_SOLID,
Isurf);
SolidInterfs.Append(SSI);
- // calcul de l'orientation orien des pcurves de Plate
- // les courbes allant de ic a icplus les pcurves de Plate
- // ont toutes la meme orientation
+ // calculate orientation orien of pcurves of Plate
+ // the curves from ic to icplus the pcurves of Plate
+ // all have the same orientation
Standard_Integer Ishape1,Ishape2;
#ifndef DEB
TopAbs_Orientation trafil1 = TopAbs_FORWARD, trafil2 = TopAbs_FORWARD;
Indices(nedge,ic,icplus,icmoins);
isfirst=(sens.Value(ic)==1);
- // calcul des curves interference relatives aux stripes
+ // calculate curves interference relative to stripes
apperror=Mapp.CriterionError()*coef;
pardeb=CD.Value(ic)->PCurve(isfirst)->FirstParameter();
tpt1.Tolerance (tpt1.Tolerance()+apperror);
tpt2.Tolerance (tpt2.Tolerance()+apperror );
- // calcul de la surfaceinterference
+ // calculate surfaceinterference
Interfc=ChFi3d_FilCurveInDS(indcurve3d.Value(n3d),Isurf,
PSurf.Curves2d()->Value(n3d),orien);
DStr.ChangeSurfaceInterferences(Isurf).Append(Interfc);
}
}
- // stockages des courbes de raccords
+ // storage of connection curves
for (ic=0; ic<nedge;ic++) {
Indices(nedge,ic,icplus,icmoins);
if (!oksea.Value(ic)) {
if (sharp.Value(ic) &&!deuxconges) {
- // limitation de l'arete vive
+ // limitation of the alive edge
TopAbs_Orientation ori;
gp_Pnt Pf,Pl,sommet1;
TopoDS_Vertex Vd = TopExp::FirstVertex(TopoDS::Edge(Evive.Value(ic)));
}
if (!ponctuel.Value(ic) && !libre.Value(ic)) {
- // raccord effectif
+ // actual connection
if (!moresurf.Value(ic)){
n3d++;
TopOpeBRepDS_Curve& tcourb1 = DStr.ChangeCurve(indcurve3d.Value(n3d));
}
}
- //stockage des courbes projetees sur plusieurs faces
+ //storage of curves projected on several faces
for (ic=0; ic<nedge;ic++) {
Indices(nedge,ic,icplus,icmoins);
if (moresurf(ic))
}
}
- // stockage des courbes dans le cas de bords libres tangents
+ // storage of curves in case of tangent free borders
if (droit)
for (ic=0; ic<nedge;ic++) {
Indices(nedge,ic,icplus,icmoins);
}
}
}
- else { // il n'y a qu'un resultat partiel
+ else { // there is only one partial result
done=Standard_False;
hasresult=Standard_True;
for (ic=0; ic<nedge;ic++) {
Indices(nedge,ic,icplus,icmoins);
if (!oksea.Value(ic)) {
if (sharp.Value(ic) &&!deuxconges) {
- // limitation de l'arete vive
+ // limitation of the alive edge
TopAbs_Orientation ori;
gp_Pnt Pf,Pl,sommet1;
TopoDS_Vertex Vd = TopExp::FirstVertex(TopoDS::Edge(Evive.Value(ic)));
#endif
//=======================================================================
//function : CompTra
-//purpose : Calcule la Transition d'un point de debut.
+//purpose : Calculate the Transition from start point.
//=======================================================================
static TopAbs_Orientation CompTra (const TopAbs_Orientation O1,
//=======================================================================
//function : CompCommonpoint
-//purpose : Remplit le commonpoint dans le cas d un vertex.
+//purpose : Fill the commonpoint in case of a vertex.
//=======================================================================
static void CompCommonPoint (ChFiDS_CommonPoint& FilPoint,
//=======================================================================
//function : CpInterf
-//purpose : Construit une nouvelle SurfData partageant les faces,
-// la surface et les courbes.
+//purpose : Construct new SurfData sharing faces, surface and curves.
//=======================================================================
static ChFiDS_FaceInterference CpInterf (TopOpeBRepDS_DataStructure& DStr,
//=======================================================================
//function : CpSD
-//purpose : Construit une nouvelle SurfData partageant les faces,
-// la surface et les courbes.
+//purpose : Construct new SurfData sharing faces, surface and curves.
//=======================================================================
static Handle(ChFiDS_SurfData) CpSD ( TopOpeBRepDS_DataStructure& DStr,
default:
return 0;
}
- Standard_NotImplemented::Raise("calcul abscisse non traite ");
+ Standard_NotImplemented::Raise("calculate abscisse non-processed");
return 0.;
}
return Nl;
}
else {
- //construction du plan contenant la section de CD au parametre ptg.
+ //construction of the plane containing the section of CD with parameter ptg.
gp_Pnt PP;
gp_Vec VV;
Handle(Geom_Curve) c3d;
Handle(GeomAdaptor_HSurface)
plan = new GeomAdaptor_HSurface(GeomAdaptor_Surface(pln));
- // intersection plan spine.
+ // intersection plane spine.
Standard_Boolean found = Standard_False;
Standard_Boolean fini = Standard_False;
Standard_Integer sens = 1;
const Standard_Integer cntlFiOnS)
{
TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS();
- //On recupere points et tangentes sur edge et spine.
+ // Return points and tangents on edge and spine.
Standard_Real wtg = SD->InterferenceOnS1().Parameter(isfirst);
Standard_Boolean bid;
Standard_Real wsp = ParamOnSpine(DStr,wtg,SD,Spine,iedge,0,0,tolesp,bid);
const BRepAdaptor_Curve& bc = Spine->CurrentElementarySpine(iedge);
-//Modif contre Vertex isole sur spine
+//Modif against Vertex isolated on spine
TopoDS_Edge support = bc.Edge();
TopExp::Vertices(support,bout1,bout2);
if (support.Orientation() == TopAbs_REVERSED) {
}
}
}
- //modif de lvt contre vertex isole
+ //modification of lvt against isolated vertex
if(!tron && YaUnVoisin(Spine,iedge,ivois,isfirst)) {
TopTools_ListIteratorOfListOfShape It;
Standard_Integer nbed = -2;
if (iSansFirst != 0) {
if (iSansLast == 0) {
#ifdef DEB
- cout<<"Tri : Pb de Hatcher"<<endl;
+ cout<<"Parsing : Pb of Hatcher"<<endl;
#endif
return 0;
}
CD->ChangeVertex(isFirst,ons).SetPoint(Surf->Value(x,y));
}
else {
-//Modification pour tromper les vertex deja existants
+//Modification to find already existing vertexes
Standard_Integer LeType = 1;
Standard_Integer NbInt = pPH->NbPoints();
if (NbInt>1) {
//=======================================================================
//function : SplitKPart
-//purpose : Reconstitue les SurfData en fonction des restrictions
-// des faces.
+//purpose : Reconstruct SurfData depending on restrictions of faces.
//=======================================================================
Standard_Boolean ChFi3d_Builder::SplitKPart
Standard_Boolean& intf,
Standard_Boolean& intl)
{
- //On lance le hachurage de chacune des faces par les lignes de tangence.
+ //The the hatching of each faces is started by tangency lines.
Standard_Real pitol = Precision::PIntersection();
#endif
Standard_Integer Nb1 = 1,Nb2 = 1;
- // Decoupe des lignes de tangence (hachurage).
+ // Cutting of tangency lines (hatching).
Geom2dHatch_Intersector Inter(pitol,pitol);
Geom2dHatch_Hatcher H1(Inter,tol2d,tolesp), H2(Inter,tol2d,tolesp);
Standard_Integer ie;
Nb1 = H1.NbDomains(iH1);
if(Nb1 == 0) {
#ifdef DEB
- cout<<"SplitKPart : ligne de tangence en dehors de la face"<<endl;
+ cout<<"SplitKPart : tangency line out of the face"<<endl;
#endif
return Standard_False;
}
Nb2 = H2.NbDomains(iH2);
if(Nb2 == 0) {
#ifdef DEB
- cout<<"SplitKPart : ligne de tangence en dehors de la face"<<endl;
+ cout<<"SplitKPart : tangency line out of the face"<<endl;
#endif
return Standard_False;
}
}
- //Recuperation des vertex deb et fin de Spine
+ //Return start and end vertexes of the Spine
TopoDS_Vertex bout1,bout2,boutemp;
const BRepAdaptor_Curve& bc = Spine->CurrentElementarySpine(Iedge);
TopoDS_Edge support = bc.Edge();
bout1 = boutemp;
}
- // Recuperation des faces.
+ // Return faces.
TopoDS_Face F1, F2;
Handle(BRepAdaptor_HSurface)
bhs = Handle(BRepAdaptor_HSurface)::DownCast(S1);
if(!bhs.IsNull()) F2 = bhs->ChangeSurface().Face();
TopoDS_Face FBID;
- // Restriction des SurfDatas par les lignes decoupees.
+ // Restriction of SurfDatas by cut lines.
TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS();
Handle(ChFiDS_SurfData) CD = Data;
CD->ChangeIndexOfS1(DStr.AddShape(F1));
if (C1.IsNull() && C2.IsNull()) {
#ifdef DEB
- cout<<"SplitData : 2 lignes nulles hachurage impossible"<<endl;
+ cout<<"SplitData : 2 zero lines hatching impossible"<<endl;
#endif
return Standard_False;
}
else if (C1.IsNull() || (Nb1 == 1 && !H1.Domain(iH1,1).HasFirstPoint())) {
- // On verifie que le point 2d de l arete degeneree est bien dans
- // la face.
+ // It is checked if the point 2d of the degenerated edge is in the face.
if (C1.IsNull()) {
gp_Pnt2d p2d1 = CD->Get2dPoints(0,1);
TopAbs_State situ = I1->Classify(p2d1,1.e-8,0);
if(situ == TopAbs_OUT) return Standard_False;
}
- // Tri des domaines par parametres croissants,
+ // Parsing of domains by increasing parameters,
if(!Tri(H2,iH2,Ind2,wref,0.,pitol,Nb2)) return 0;
- // Remplissage des SurfData
+ // Filling of SurfData
for(Standard_Integer i = 1; i <= Nb2; i++) {
const HatchGen_Domain& Dom2 = H2.Domain(iH2,Ind2(i));
FillSD(DStr,CD,M2,Dom2,Dom2.FirstPoint().Parameter(),1,2,pitol,bout1);
}
}
else if (C2.IsNull() || (Nb2 == 1 && !H2.Domain(iH2,1).HasFirstPoint())) {
- // On verifie que le point 2d de l arete degeneree est bien dans
- // la face.
+ // It is checked if the point 2d of the degenerated is in the face.
if (C2.IsNull()) {
gp_Pnt2d p2d2 = CD->Get2dPoints(0,2);
TopAbs_State situ = I2->Classify(p2d2,1.e-8,0);
if(situ == TopAbs_OUT) return Standard_False;
}
- // Tri des domaines par parametres croissants,
+ // Parsing of domains by increasing parameters,
if(!Tri(H1,iH1,Ind1,wref,0.,pitol,Nb1)) return 0;
- // Remplissage des SurfData
+ // Filling of SurfData
for(Standard_Integer i = 1; i <= Nb1; i++) {
const HatchGen_Domain& Dom1 = H1.Domain(iH1,Ind1(i));
FillSD(DStr,CD,M1,Dom1,Dom1.FirstPoint().Parameter(),1,1,pitol,bout1);
}
else {
- // Tri des domaines par parametres croissants,
- // lorsqu il y a un cercle 2d sur un plan, on
- // se cale sur la ligne 2d d en face.
+ // Parsing of domains by increasing parameters,
+ // if there is a 2d circle on a plane, one goes on 2D line of opposite face.
Standard_Real period1 = 0., period2 = 0.;
if(ll1.IsPeriodic()) {
if(!Tri(H2,iH2,Ind2,wref,0.,pitol,Nb2)) return 0;
}
- // Remplissage des SurfData
+ // Filling of SurfData
TColStd_SequenceOfInteger ion1, ion2;
for(Standard_Integer i = 1; i <= Nb1; i++) {
const HatchGen_Domain& Dom1 = H1.Domain(iH1,Ind1(i));
}
}
- // Traitement des prolongements.
- // Ne pas tronquer, sinon, pb d'intersection pour les PerformCorner
+ // Processing of extensions.
+ // Do not truncate, otherwise, problems of intersection for PerformCorner
// -----------------------------------------------------------------
- // A l'appel de SplitKPart dans PerformSetOfKPart, les spines ont ete
- // justement, prolongees aux extremites par les methodes Extent pour permettre
- // les intersections. On conserve les extensions des SurfData.
+ // After call of SplitKPart in PerformSetOfKPart, spines have been
+ // extended to the extremities by methods Extent to permit
+ // intersections. Extensions of SurfData are preserved.
if(intf) {
- // On est en debut de spine
+ // We are at the beginning of the spine
//-------------------------
Standard_Integer ifirst = 0;
Standard_Real dist = RealLast(), ptg, dsp;
}
}
if(intl) {
- // on est en fin de spine
+ // we are at the end of the spine
//-----------------------
Standard_Integer ilast = 0;
Standard_Real dist = RealLast(), ptg, dsp;
}
if(!intf) {
- // On vire les SurfData entierement avant le debut de l'arete.
+ // SurfData are entirely suspended before the beginning of the edge.
Standard_Boolean okdoc = SetData.IsEmpty();
Standard_Integer i = 1;
while(!okdoc) {
}
}
if(!intl) {
- // On vire les SurfData entierement apres la fin de l'arete.
+ // SurfData are entirely suspended after the end of the edge.
Standard_Boolean okdoc = SetData.IsEmpty();
Standard_Integer i = 1;
while(!okdoc) {
okdoc = (SetData.IsEmpty() || i > SetData.Length());
}
}
- // Ajout des parametres de la spine sur les SurfDatas.
+ // Add parameters of the spine on SurfDatas.
// for (Standard_Integer i = 1; i <= SetData.Length(); i++) {
Standard_Integer i;
for ( i = 1; i <= SetData.Length(); i++) {
}
if (intf && !SetData.IsEmpty()) {
- // prolongement de la spine par extension
+ // extension of the spine
Spine->SetFirstParameter(SetData.First()->FirstSpineParam());
}
else {
- // Troncature au debut.
+ // Trnncation at the beginning.
for (i = 1; i <= SetData.Length(); i++) {
Handle(ChFiDS_SurfData)& CD8 = SetData.ChangeValue(i);
Standard_Real fsp = CD8->FirstSpineParam();
if (intl && !SetData.IsEmpty()) {
- // prolongement de la spine par extension
+ // extension of the spine
Spine->SetLastParameter(SetData.Last()->LastSpineParam());
}
else {
- // Troncature a la fin.
+ // Truncation at the end.
for (i = SetData.Length(); i >= 1; i--) {
Handle(ChFiDS_SurfData)& CD9 = SetData.ChangeValue(i);
Standard_Real fsp = CD9->FirstSpineParam();
//=======================================================================
//function : ExtentSpinesOnCommonFace
-//purpose : Etend les spines des deux chanfreins de distances dis1,dis2
-// sur leur face commune
-// Les deux lignes guides Spine1 et Spine2 qui se coupent en V
-// isfirst(i) = False si Spine(i) est orientee vers V (i = 1,2)
+//purpose : Extend spines of two chamfers by distance dis1,dis2
+// on their common face
+// Two guide lines Spine1 and Spine2 cross in V
+// isfirst(i) = False if Spine(i) is oriented to V (i = 1,2)
//=======================================================================
void ExtentSpineOnCommonFace(Handle(ChFiDS_Spine)& Spine1,
{
Standard_Real tolesp = 1.e-7;
- // On determine alpha, l'angle d'ouverture entre les
- // tangentes des deux lignes guides en V
+ // alpha, the opening angle between two
+ // tangents of two guidelines in V is found
Standard_Real tga1,tga2;
Standard_Real d1plus = 0., d2plus = 0.;
d2plus = dis2/tga2;
}
- //on prolonge avec les distances calculees
+ //extension by the calculated distance
if (d1plus > 0.) {
d1plus *= 3.;
if (isfirst1){
}
else
- Standard_DomainError::Raise("la face n'est commune a aucune des edges du contour");
+ Standard_DomainError::Raise("the face is not common to any of edges of the contour");
}
}
else csp->SetDists(Dis1,Dis2);
}
else
- Standard_DomainError::Raise("la face n'est commune a aucune des edges du contour");
+ Standard_DomainError::Raise("the face is not common to any of edges of the contour");
}
}
}
}
else
- Standard_DomainError::Raise("la face n'est commune a aucune des edges du contour");
+ Standard_DomainError::Raise("the face is not common to any edges of the contour");
}
}
#ifdef DEB
if(ChFi3d_GettraceCHRON()){
simul.Stop();
- cout<<"Temps total simulation : ";
+ cout<<"Total simulation time : ";
simul.Show();
- cout<<"dont temps construction spine : ";
+ cout<<"Spine construction time : ";
elspine.Show();
- cout<<"et temps cheminement : ";
+ cout<<"and progression time : ";
chemine.Show();
}
#endif
if (chsp.IsNull())
Standard_ConstructionError::Raise
- ("SimulSurf : la spine n est pas celle d un chanfrein");
+ ("SimulSurf : this is not the spine of a chamfer");
Standard_Real radius;
- // Des parametres souples!!!
+ // Flexible parameters!
Standard_Real la = HGuide->LastParameter(), fi = HGuide->FirstParameter();
Standard_Real longueur = la - fi;
Standard_Real MaxStep = longueur * 0.05;
Standard_Real radiusspine = 0, locfleche, w;
gp_Pnt Pbid;
gp_Vec d1,d2;
- // Puisque l ElSpine est parametree par une quasi-abscissecurviligne,
- // on evalue le rayon min par 1/D2 max;
+ // As ElSpine is parameterized by a curvilinear quasi-abscissa,
+ // the min radius is estimated as 1/D2 max;
//for(Standard_Integer i = 0; i <= 20; i++){
Standard_Integer i;
for( i = 0; i <= 20; i++){
Standard_Real dis;
chsp->GetDist(dis);
radius = Max(dis, radiusspine);
- locfleche = radius*1.e-2; //critere graphique
+ locfleche = radius*1.e-2; //graphic criterion
BRepBlend_Chamfer Func(S1,S2,HGuide);
BRepBlend_ChamfInv FInv(S1,S2,HGuide);
chsp->Dists(dis1, dis2);
radius = Max(dis1, dis2);
radius = Max(radius, radiusspine);
- locfleche = radius*1.e-2; //critere graphique
+ locfleche = radius*1.e-2; //graphic criterion
BRepBlend_Chamfer Func(S1,S2,HGuide);
BRepBlend_ChamfInv FInv(S1,S2,HGuide);
chsp->GetDistAngle(dis, angle, disonF1);
radius = Max(dis, dis * tan(angle));
radius = Max(radius, radiusspine);
- locfleche = radius*1.e-2; //critere graphique
+ locfleche = radius*1.e-2; //graphic criterion
Standard_Integer Ch = FindChoiceDistAngle(Choix, disonF1);
if (chsp.IsNull())
Standard_ConstructionError::Raise
- ("PerformSurf : la spine n est pas celle d un chanfrein");
+ ("PerformSurf : this is not the spine of a chamfer");
Standard_Real TolGuide = HGuide->Resolution(tolesp) ;
Func.Set(dis,dis,Choix);
BRepBlend_Walking TheWalk(S1,S2,I1,I2);
- //calcul d'une solution de depart approchee
+ //calculate an approximate starting solution
gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
gp_Pnt pt1, pt2, ptgui;
gp_XYZ temp;
Func.Set(dis1,dis2,Choix);
BRepBlend_Walking TheWalk(S1,S2,I1,I2);
- //calcul d'une solution de depart approchee
+ //calculate an approximate starting solution
gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
gp_Pnt pt1, pt2, ptgui;
gp_XYZ temp;
Func.Set(dis1, angle, Ch);
BRepBlend_Walking TheWalk(S1,S2,I1,I2);
- //calcul d'une solution de depart approchee
+ //calculate an approximate starting solution
gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
gp_Pnt pt1, pt2, ptgui;
gp_XYZ temp;
Func.Set(dis1, angle, Ch);
BRepBlend_Walking TheWalk(S2,S1,I2,I1);
- //calcul d'une solution de depart approchee
+ //calculate an approximate starting solution
gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
gp_Pnt pt1, pt2, ptgui;
gp_XYZ temp;
if (chsp.IsNull())
Standard_ConstructionError::Raise
- ("PerformSurf : la spine n est pas celle d un chanfrein");
+ ("PerformSurf : this is not the spine of a chamfer");
Standard_Boolean gd1,gd2,gf1,gf2;
Handle(BRepBlend_Line) lin;
gd1,gd2,gf1,gf2,RecOnS1,RecOnS2);
if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
done = CompleteData(Data,Func,lin,S1,S2,Or,gd1,gd2,gf1,gf2);
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
}
else if (chsp->IsChamfer() == ChFiDS_TwoDist) {
BRepBlend_Chamfer Func(S1,S2,HGuide);
gd1,gd2,gf1,gf2,RecOnS1,RecOnS2);
if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
done = CompleteData(Data,Func,lin,S1,S2,Or,gd1,gd2,gf1,gf2);
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
}
else {
Standard_Real d1, angle;
if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
done = CompleteData(Data,Func,lin,S1,S2,Or,gd1,gd2,gf1,gf2);
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
}
else {
Standard_Real Rtemp;
Data->ChangeVertexLastOnS2() = tmp;
if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
done = CompleteData(Data,Func,lin,S1,S2,Or2,gd1,gd2,gf1,gf2, Standard_True);
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
}
}
//=======================================================================
//function : ExtentOneCorner
//purpose : extends the spine of the stripe S on the side of the vertex V
-// PMN : 28/11/97 : Reprend le code des conges, et cela semble marcher mieux...
+// PMN : 28/11/97 : Reproduces the code of fillets, and it seems to work better...
//=======================================================================
void ChFi3d_ChBuilder::ExtentOneCorner(const TopoDS_Vertex& V,
Standard_Real Coeff = 0.5;
Handle(ChFiDS_Spine) Spine = S->Spine();
ChFi3d_IndexOfSurfData(V,S,Sens);
- if (Spine->IsTangencyExtremity((Sens == 1))) return; //Pas de prolongement sur queue
+ if (Spine->IsTangencyExtremity((Sens == 1))) return; //No extension on queue
Standard_Real dU = Spine->LastParameter(Spine->NbEdges());
if (Sens == 1) {
Spine->SetFirstParameter(-dU*Coeff);
}
else {
chsp[i]->GetDistAngle(tmd, tmpang, disonF1);
- // on fait un calcul grossier de la distance 2
+ // an approximate calculation of distance 2 is done
if (disonF1) {
d[j] = tmd;
d[j+1] = tmd * tan(tmpang);
if (State[0] == ChFiDS_AllSame ){
/*
- // On cherche l'intersection du chanfrein le plus gros (sur l'arete incidente)
- // avec la face en bout
+ // The greatest intersection of the chamfer is found (on the incident edge)
+ // with the face at end
i = 0;
j = 1;
if(dOnArc[j] > dOnArc[i]) {
}
ExtentOneCorner( V, Stripe[i] ); */
- // il faut que les deux chanfreins touchent la face en bout
+ // it is necessary that two chamfers touch the face at end
for (j=0; j<2; j++)
ExtentOneCorner( V, Stripe[j] );
}
}
else {
chsp[i]->GetDistAngle(tmd, tmpangle, disonF1);
- // on fait un calcul grossier de la distance 2
+ // an approximate calculation of distance 2 is done
if (disonF1) {
d[i][0] = tmd;
}
- // dis[i][j] la distance du chanfrein i sur la face commune avec
- // le chanfrein j
+ // dis[i][j] distance from chamfer i on the common face with
+ // chamfer j
Standard_Real dis[3][3];
for (i=0; i<3; i++) {
//=======================================================================
//function : ConexFaces
-//purpose : F1, F2 connexes a l'edge telles que F1 corresponde
-// a dis
+//purpose : F1, F2 are connected to edge so that F1 corresponds to distance
//=======================================================================
void ChFi3d_ChBuilder::ConexFaces (const Handle(ChFiDS_Spine)& Spine,
Standard_Integer RC,Choix;
TopoDS_Face f1,f2,ff1,ff2;
- //calcul de l'orientation de reference
+ //calculate the reference orientation
// ChFi3d_Builder::StripeOrientations is private
SearchCommonFaces(myEFMap,Spine->Edges(1),ff1,ff2);
ff1.Orientation(TopAbs_FORWARD);
Sb2.Initialize(ff2);
RC = ChFi3d::ConcaveSide(Sb1,Sb2,Spine->Edges(1),tmp1,tmp2);
- //calcul des faces connexes
+ //calculate the connected faces
SearchCommonFaces(myEFMap,Spine->Edges(IEdge),f1,f2);
Sb1.Initialize(f1);
Sb2.Initialize(f2);
//=======================================================================
//function : FindChoiceDistAngle
-//purpose : F1, F2 connexes a l'edge telles que F1 corresponde
-// a dis
+//purpose : F1, F2 connected to the edge so that F1 corresponds to distance
//=======================================================================
Standard_Integer ChFi3d_ChBuilder::FindChoiceDistAngle(const Standard_Integer Choice,
#endif
//*********************************
-// chronometrage de la simulation
+// timing of the simulation
//*********************************
static Standard_Boolean ChFi3d_traceCHRON = Standard_False;
{ return ChFi3d_traceCHRON; }
//*********************************
-// trace d une ligne de cheminement
+// trace a line of path
//*********************************
static Standard_Boolean ChFi3d_traceDRAWWALK = Standard_False;
{ return ChFi3d_traceDRAWWALK; }
//**********************************
-// trace d une ligne d intersection
+// trace a line of intersection
//**********************************
static Standard_Boolean ChFi3d_traceDRAWINT = Standard_False;
{ return ChFi3d_traceDRAWINT; }
//*************************************************
-// recuperation des surfaces des conges approximes.
+// return surfaces of approximated fillets.
//*************************************************
static Standard_Boolean ChFi3d_traceDRAWFIL = Standard_False;
//*************************************************
-// recuperation des faces elargie pour le cheminement.
+// return extended faces for the path.
//*************************************************
static Standard_Boolean ChFi3d_traceDRAWENLARGE = Standard_False;
{ return ChFi3d_traceDRAWENLARGE; }
//*************************************************
-// recuperation de la ligne guide pour les coins triples.
+// return the guideline for the triple corners.
//*************************************************
static Standard_Boolean ChFi3d_traceDRAWSPINE = Standard_False;
{ return ChFi3d_traceDRAWSPINE; }
//*************************************************
-// set du type de ligne guide pour les coins triples.
+// set the type of guideline for the triple corners.
//*************************************************
void ChFi3d_SetcontextSPINEBEZIER(const Standard_Boolean b);
{ return ChFi3d_contextSPINECE; }
//*************************************************
-// Passage force par le cheminement pour les KPart
+// Forced passage by the path for KPart
//*************************************************
static Standard_Boolean ChFi3d_contextFORCEBLEND = Standard_False;
void ChFi3d_SetcontextFORCEBLEND(const Standard_Boolean b)
{ return ChFi3d_contextFORCEFILLING; }
//*************************************************
-// Pas d optimisation pour les approx
+// No optimization for approx
//*************************************************
static Standard_Boolean ChFi3d_contextNOOPT = Standard_False;
void ChFi3d_SetcontextNOOPT(const Standard_Boolean b)
{ return ChFi3d_contextNOOPT; }
// ***********************************************
-// initialisation et resultat d'un chrono
+// initialization and result of a chrono
//************************************************
Standard_EXPORT void ChFi3d_InitChron(OSD_Chronometer& ch)
{
//==============================================================
// function : ChFi3d_CheckSurfData
-// purpose : fonction permettant de tracer une SurfData afin
-// de verifier la bonne construction de tous les
-// elements, notamment des pcurves
+// purpose : function allows to trace SurfData to check
+// construction of all elements, namely pcurves
//==============================================================
#ifdef DRAW
static Standard_Integer NbSD = 0;
void ChFi3d_CheckSurfData(const TopOpeBRepDS_DataStructure& DStr,
const Handle(ChFiDS_SurfData)& Data)
{
- //trace de la surface definie par le chanfrein ou le conge
- // correspondant a la SurfData
+ //trace of the surface defined by the chamfer or the fillet
+ // corresponding to SurfData
Handle(Geom_Surface) surf = (DStr.Surface( Data->Surf())).Surface();
if (!surf.IsNull()){
const TopoDS_Edge& E,
const Handle(Law_Function)& L)
{
- // Voir si il ne faut pas faire un controle des bounds ici!!!!!
+ // Check if it is necessary to check borders!
if(IC <= NbElements()) {
Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Value(IC));
fsp->ChangeLaw(E) = L;
#ifdef DEB
if(ChFi3d_GettraceCHRON()){
simul.Stop();
- cout<<"Temps total simulation : ";
+ cout<<"Total simulation time : ";
simul.Show();
- cout<<"dont temps construction spine : ";
+ cout<<"Spine construction time : ";
elspine.Show();
- cout<<"et temps cheminement : ";
+ cout<<"and process time : ";
chemine.Show();
}
#endif
{
Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
if(fsp.IsNull()) Standard_ConstructionError::Raise
- ("SimulSurf : la spine n est pas celle d un conge");
+ ("SimulSurf : this is not the spine of the fillet");
Handle(BRepBlend_Line) lin;
#ifdef DEB
// TopAbs_Orientation Or = S1->ChangeSurface().Face().Orientation();
#endif
- // Des parametres souples!!!
+ // Flexible parameters!!!
Standard_Real locfleche, MaxStep;
SimulParams(HGuide,fsp,MaxStep,locfleche);
Handle(ChFiDS_SecHArray1) sec;
{
Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
if(fsp.IsNull()) Standard_ConstructionError::Raise
- ("PerformSurf : la spine n est pas celle d un conge");
+ ("PerformSurf : this is not the spine of the fillet");
Handle(BRepBlend_Line) lin;
- // Des parametres souples!!!
+ // Flexible parameters!
Standard_Real locfleche, MaxStep;
SimulParams(HGuide,fsp,MaxStep,locfleche);
Handle(ChFiDS_SecHArray1) sec;
PFirst,MaxStep,locfleche,TolGuide,First,Last,
Soldep,4,Inside,Appro,Forward,RecP,RecS,RecRst);
if(!done) {
- Standard_Failure::Raise("SimulSurf : Echec cheminement!");
+ Standard_Failure::Raise("SimulSurf : Failed process!");
}
Standard_Integer nbp = lin->NbPoints();
sec = new ChFiDS_SecHArray1(1,nbp);
func,finv,finvp,finvc,
PFirst,MaxStep,locfleche,TolGuide,First,Last,
Soldep,4,Inside,Appro,Forward,RecP,RecS,RecRst);
- if(!done) Standard_Failure::Raise("SimulSurf : Echec !");
+ if(!done) Standard_Failure::Raise("SimulSurf : Fail !");
Standard_Integer nbp = lin->NbPoints();
sec = new ChFiDS_SecHArray1(1,nbp);
for(Standard_Integer i = 1; i <= nbp; i++){
const Handle(BRepAdaptor_HSurface)& HSref2,
const Handle(BRepAdaptor_HCurve2d)& PCref2,
Standard_Boolean& Decroch2,
- const Standard_Real /*Fleche*/,
+ const Standard_Real /*Arrow*/,
const Standard_Real TolGuide,
Standard_Real& First,
Standard_Real& Last,
{
Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
if(fsp.IsNull()) Standard_ConstructionError::Raise
- ("PerformSurf : la spine n est pas celle d un conge");
+ ("PerformSurf : it is not the spine of a fillet");
Handle(BRepBlend_Line) lin;
- // Des parametres souples!!!
+ // Flexible parameters!
Standard_Real locfleche, MaxStep;
SimulParams(HGuide,fsp,MaxStep,locfleche);
Handle(ChFiDS_SecHArray1) sec;
func,finv,finvp,finvc,
PFirst,MaxStep,locfleche,TolGuide,First,Last,
Soldep,4,Inside,Appro,Forward,RecP,RecS,RecRst);
- if(!done) Standard_Failure::Raise("SimulSurf : Echec cheminement!");
+ if(!done) Standard_Failure::Raise("SimulSurf : Failed Processing!");
Standard_Integer nbp = lin->NbPoints();
sec = new ChFiDS_SecHArray1(1,nbp);
for(Standard_Integer i = 1; i <= nbp; i++){
func,finv,finvp,finvc,
PFirst,MaxStep,locfleche,TolGuide,First,Last,
Soldep,4,Inside,Appro,Forward,RecP,RecS,RecRst);
- if(!done) Standard_Failure::Raise("SimulSurf : Echec !");
+ if(!done) Standard_Failure::Raise("SimulSurf : Fail !");
Standard_Integer nbp = lin->NbPoints();
sec = new ChFiDS_SecHArray1(1,nbp);
for(Standard_Integer i = 1; i <= nbp; i++){
{
Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
if(fsp.IsNull()) Standard_ConstructionError::Raise
- ("PerformSurf : la spine n est pas celle d un conge");
+ ("PerformSurf : it is not the spine of a fillet");
Handle(BRepBlend_Line) lin;
- // Des parametres souples!!!
+ // Flexible parameters!
Standard_Real locfleche, MaxStep;
SimulParams(HGuide,fsp,MaxStep,locfleche);
Handle(ChFiDS_SecHArray1) sec;
func, finv1, finvp1, finv2, finvp2,
PFirst, MaxStep, locfleche, TolGuide, First, Last,
Soldep, 4, Inside, Appro, Forward, RecP1, RecRst1, RecP2, RecRst2);
- if(!done) Standard_Failure::Raise("SimulSurf : Echec cheminement!");
+ if(!done) Standard_Failure::Raise("SimulSurf : Failed processing!");
Standard_Integer nbp = lin->NbPoints();
sec = new ChFiDS_SecHArray1(1,nbp);
for(Standard_Integer i = 1; i <= nbp; i++){
PFirst, MaxStep, locfleche, TolGuide, First, Last,
Soldep, 4, Inside, Appro, Forward, RecP1, RecRst1, RecP2, RecRst2);
- if(!done) Standard_Failure::Raise("SimulSurf : Echec !");
+ if(!done) Standard_Failure::Raise("SimulSurf : Fail !");
Standard_Integer nbp = lin->NbPoints();
sec = new ChFiDS_SecHArray1(1, nbp);
for(Standard_Integer i = 1; i <= nbp; i++){
{
Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
if(fsp.IsNull()) Standard_ConstructionError::Raise
- ("PerformSurf : la spine n est pas celle d un conge");
+ ("PerformSurf : this is not the spine of a fillet");
Standard_Real TolGuide = HGuide->Resolution(tolesp);
if(fsp->IsConstant()){
BRepBlend_ConstRad Func(S1,S2,HGuide);
Handle(ChFiDS_SurfData) Data = SeqData(1);
Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
if(fsp.IsNull()) Standard_ConstructionError::Raise
- ("PerformSurf : la spine n est pas celle d un conge");
+ ("PerformSurf : this is not the spine of a fillet");
Standard_Boolean gd1,gd2,gf1,gf2, maybesingular;
Handle(BRepBlend_Line) lin;
TopAbs_Orientation Or = S1->ChangeSurface().Face().Orientation();
ChFi3d_ResultChron(ch , t_computedata);// result perf ComputeData
#endif
- if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
+ if(!done) return Standard_False; // recovery is possible PMN 14/05/1998
#ifdef DEB
ChFi3d_InitChron(ch);// init perf CompleteData
ChFi3d_ResultChron(ch , t_completedata);// result perf CompleteData
#endif
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
maybesingular = (Func.GetMinimalDistance()<=100*tolapp3d);
}
else {
ChFi3d_ResultChron(ch , t_completedata);// result perf CompleteData
#endif
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
maybesingular = (Func.GetMinimalDistance()<=100*tolapp3d);
}
if (maybesingular) SplitSurf(SeqData, lin);
Handle(ChFiDS_SurfData) Data = SeqData(1);
Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
if(fsp.IsNull()) Standard_ConstructionError::Raise
- ("PerformSurf : la spine n est pas celle d un conge");
+ ("PerformSurf : this is not the spine of a fillet");
Handle(BRepBlend_Line) lin;
Standard_Real PFirst = First;
Standard_Boolean maybesingular;
Soldep,Inside,Appro,Forward,RecP,RecS,RecRst);
if(!done) {
Spine->SetErrorStatus(ChFiDS_WalkingFailure);
- Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+ Standard_Failure::Raise("PerformSurf : Failed processing!");
}
TopAbs_Orientation Or = HS2->ChangeSurface().Face().Orientation();
done = CompleteData(Data,func,lin,HS1,HS2,Or,1);
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
maybesingular = (func.GetMinimalDistance()<=100*tolapp3d);
}
else {
Soldep,Inside,Appro,Forward,RecP,RecS,RecRst);
if(!done) {
Spine->SetErrorStatus(ChFiDS_WalkingFailure);
- Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+ Standard_Failure::Raise("PerformSurf : Failed processing!");
}
TopAbs_Orientation Or = HS2->ChangeSurface().Face().Orientation();
done = CompleteData(Data,func,lin,HS1,HS2,Or,1);
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
maybesingular = (func.GetMinimalDistance()<=100*tolapp3d);
}
if (maybesingular) SplitSurf(SeqData, lin);
Handle(ChFiDS_SurfData) Data = SeqData(1);;
Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
if(fsp.IsNull()) Standard_ConstructionError::Raise
- ("PerformSurf : la spine n est pas celle d un conge");
+ ("PerformSurf : this is not the spine of a fillet");
Handle(BRepBlend_Line) lin;
Standard_Real PFirst = First;
Standard_Boolean maybesingular;
Soldep,Inside,Appro,Forward,RecP,RecS,RecRst);
if(!done) {
Spine->SetErrorStatus(ChFiDS_WalkingFailure);
- Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+ Standard_Failure::Raise("PerformSurf : Failed processing!");
}
TopAbs_Orientation Or = HS1->ChangeSurface().Face().Orientation();
done = CompleteData(Data,func,lin,HS1,HS2,Or,0);
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
maybesingular = (func.GetMinimalDistance()<=100*tolapp3d);
}
else {
Soldep,Inside,Appro,Forward,RecP,RecS,RecRst);
if(!done) {
Spine->SetErrorStatus(ChFiDS_WalkingFailure);
- Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+ Standard_Failure::Raise("PerformSurf : Failed processing!");
}
TopAbs_Orientation Or = HS1->ChangeSurface().Face().Orientation();
done = CompleteData(Data,func,lin,HS1,HS2,Or,0);
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
maybesingular = (func.GetMinimalDistance()<=100*tolapp3d);
}
if (maybesingular) SplitSurf(SeqData, lin);
Handle(ChFiDS_SurfData) Data = SeqData(1);;
Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
if(fsp.IsNull()) Standard_ConstructionError::Raise
- ("PerformSurf : la spine n est pas celle d un conge");
+ ("PerformSurf : this is not the spine of a fillet");
Handle(BRepBlend_Line) lin;
Standard_Real PFirst = First;
Standard_Boolean maybesingular;
Soldep, Inside, Appro, Forward, RecP1, RecRst1, RecP2, RecRst2);
if(!done) {
Spine->SetErrorStatus(ChFiDS_WalkingFailure);
- Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+ Standard_Failure::Raise("PerformSurf : Failed processing!");
}
TopAbs_Orientation Or = HS1->ChangeSurface().Face().Orientation();
done = CompleteData(Data, func, lin, HS1, HS2, Or);
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
maybesingular = (func.GetMinimalDistance()<=100*tolapp3d);
}
else {
if(!done) {
Spine->SetErrorStatus(ChFiDS_WalkingFailure);
- Standard_Failure::Raise("PerformSurf : Echec cheminement!");
+ Standard_Failure::Raise("PerformSurf : Failed processing!");
}
TopAbs_Orientation Or = HS1->ChangeSurface().Face().Orientation();
done = CompleteData(Data, func, lin, HS1, HS2, Or);
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
maybesingular = (func.GetMinimalDistance()<=100*tolapp3d);
Standard_Real precedant, suivant, courant;
Standard_Real a, b, c;
- // (1) Rechecheche des vi tel que l'iso v=vi soit ponctuelles
+ // (1) Finds vi so that iso v=vi is punctual
VFirst = Min( ref->InterferenceOnS1().FirstParameter(),
ref->InterferenceOnS2().FirstParameter() );
VLast = Max( ref->InterferenceOnS1().LastParameter(),
ref->InterferenceOnS2().LastParameter() );
- // (1.1) Recherche du premier point a l'interieur
+ // (1.1) Finds the first point inside
for (ii=1; ii<=Nbpnt && Line->Point(ii).Parameter()<VFirst; ii++) {}
if (ii==1) ii++;
P = Line->Point(ii);
precedant = P.PointOnS1().Distance(P.PointOnS2());
ii ++;
- // (1.2) Recherche d'un minimum par "points"
+ // (1.2) Find a minimum by "points"
for ( ; ii<=Nbpnt && Line->Point(ii).Parameter()<=VLast; ii++) {
for (;ii<=Nbpnt &&
Line->Point(ii).Parameter()<VLast &&
c = pnt.Parameter();
suivant = pnt.PointOnS1().Distance(pnt.PointOnS2());
if ( (courant < precedant) && (courant < suivant) ) {
- // (1.3) Recherche du minimum exact
+ // (1.3) Find the exact minimum
math_FunctionRoot Resol(Fonc, (a+c)/2,
tol2d,//Surf->VResolution(toleps),
a, c,
Fonc.Value(Resol.Root(), Val);
if (Val< tolapp3d) {
- // On insere la solution (en evitant les risques de confusion)
+ // the solution (avoiding the risks of confusion)
if (LesVi.Length()==0) {
if ( (racine > VFirst+tol2d) &&
(racine < VLast -tol2d) ) {
}
else {
# if DEB
- cout << "Echec calcul de la longeur minimum" << endl;
+ cout << "Failed calculation of the minimum length" << endl;
# endif
}
}
- // mise a jour si non duplication
+ // update if non duplication
a = b;
precedant = courant;
b = c;
courant = suivant;
}
- // (2) Mise a jour de la sequence de SurfData
+ // (2) Update of the sequence of SurfData
if (LesVi.Length()>0) {
TopOpeBRepDS_DataStructure& DStru = myDS->ChangeDS();
Handle(ChFiDS_SurfData) SD;
for (ii=1 ; ii<=LesVi.Length(); ii++) {
T = LesVi(ii);
- // (2.0) copie et insertion
+ // (2.0) copy and insertion
SD = new (ChFiDS_SurfData);
SD->Copy(ref);
SeqData.InsertBefore(ii, SD);
C2 = DStru.Curve(SD->InterferenceOnS2().LineIndex());
SD->ChangeInterferenceOnS2().SetLineIndex(DStru.AddCurve(C2));
- // (2.1) Modif des common Point
+ // (2.1) Modification of common Point
SD-> ChangeVertexLastOnS1().Reset();
SD-> ChangeVertexLastOnS2().Reset();
ref->ChangeVertexFirstOnS1().Reset();
ref->ChangeVertexFirstOnS1().SetTolerance(VertexTol);
ref->ChangeVertexFirstOnS2().SetTolerance(VertexTol);
- // (2.2) Modif des interferences
+ // (2.2) Modification of interferences
SD->ChangeInterferenceOnS1().SetLastParameter(T);
SD->ChangeInterferenceOnS2().SetLastParameter(T);
ref->ChangeInterferenceOnS1().SetFirstParameter(T);
ref->ChangeInterferenceOnS2().SetFirstParameter(T);
- // Les parametres sur l ElSpine
+ // Parameters on ElSpine
SD->LastSpineParam(T);
ref->FirstSpineParam(T);
}
void ChFi3d_FilBuilder::ExtentOneCorner(const TopoDS_Vertex& V,
const Handle(ChFiDS_Stripe)& S)
{
- // revoir en utilisant les donnees au bout des conges (point,rayon,normale
- // aux faces et tangentes a la ligne guide.
+ // review by using the data at end of fillets (point, radius, normal
+ // to the faces and tangents of the guideline).
#ifndef DEB
Standard_Integer Sens = 0;
#else
ChFi3d_IndexOfSurfData(V,S,Sens);
Standard_Real dU = Spine->LastParameter(Spine->NbEdges());
if (Spine->IsTangencyExtremity((Sens == 1)))
- return; //Pas de prolongement sur queue de billard
+ return; //No extension in the queue
if (Spine->Status((Sens == 1)) == ChFiDS_FreeBoundary) {
- Coeff *= 2; // Il faut aller j'usquau bout.Il faudrait evaluer la longeur
+ Coeff *= 2; // It is necessary to go to the end and to evaluate the length
}
if (Sens == 1) {
void ChFi3d_FilBuilder::ExtentTwoCorner(const TopoDS_Vertex& V,
const ChFiDS_ListOfStripe& LS)
{
- // revoir en utilisant les donnees au bout des conges (point,rayon,normale
- // aux faces et tangentes a la ligne guide.
+ // Review by using the data at end of fillets (point, radius, normal
+ // to faces and tangents to the guideline.
Standard_Integer Sens;
Standard_Real Coeff = 0.3, Eval=0.0, dU, rad;
Standard_Integer IE;
Handle(ChFiDS_Stripe) Stripe;
Handle(ChFiDS_Spine) Spine;
- // On calcul une valeur de prolongement symetrique
+ // A value of symetric extension is calculated
for ( ; itel.More(); itel.Next()) {
Stripe = itel.Value();
Spine = Stripe->Spine();
if (dU > Eval) Eval = dU;
}
- // On applique
+ // One applies
for (itel.Initialize(LS) ; itel.More(); itel.Next()) {
IE = ChFi3d_IndexOfSurfData(V,itel.Value(),Sens);
if (!FF && Stripe == itel.Value()) Sens = -Sens;
Stripe = itel.Value();
Spine = Stripe->Spine();
- if (! Spine->IsTangencyExtremity((Sens == 1))) { //Pas de prolongement sur queue
+ if (! Spine->IsTangencyExtremity((Sens == 1))) { //No extension on queue
if (Sens == 1){
Spine->SetFirstParameter(-Eval);
Spine->SetFirstTgt(0.);
void ChFi3d_FilBuilder::ExtentThreeCorner(const TopoDS_Vertex& V,
const ChFiDS_ListOfStripe& LS)
{
- // revoir en utilisant les donnees au bout des conges (point,rayon,normale
- // aux faces et tangentes a la ligne guide.
+ // Review by using the data at end of fillets (point, radius, normal
+ // to faces and tangents to the guideline.
#ifndef DEB
Standard_Integer Sens = 0;
#else
}
}
Handle(ChFiDS_Spine) Spine = Stripe->Spine();
- if (Spine->IsTangencyExtremity((Sens == 1))) return; //Pas de prolongement sur queue
+ if (Spine->IsTangencyExtremity((Sens == 1))) return; //No extension on queue
Standard_Real dU = Spine->LastParameter(Spine->NbEdges());
if (Sens == 1){
Spine->SetFirstParameter(-dU*Coeff);
//=======================================================================
//function : ToricRotule
-//purpose : Teste si on est dans un cas particulier de rotule torique.
-// Il faut trois plans avec deux conges incidents constants
-// de meme rayon et la troisieme face perpendiculaire aux
-// deux autres.
+//purpose : Test if it is a particular case of torus routine.
+// Three planes with two constant incident fillets
+// of the same radius and the third face perpendicular to
+// two others are required.
//=======================================================================
static Standard_Boolean ToricRotule(const BRepAdaptor_Surface& fac,
// gp_Pnt P1,P2;
Standard_Integer nbsurf1,nbsurf2,deb1,fin1,deb2,fin2;
Standard_Real parE1,parE2;
- //On extrait les informations necessaires sur les conges
+ //Necessary information on fillets is extracted
//------------------------------------------------------
- //le premier
+ //the first
//----------
st1 = It.Value();
Isd1 = ChFi3d_IndexOfSurfData(Vtx,st1,Sens1);
- //le deuxieme
+ //the second
//----------
It.Next();
st2 = It.Value();
}
else{ Isd2 = ChFi3d_IndexOfSurfData(Vtx,st2,Sens2); }
- // Si les deux aretes a arrondir sont tangentes on appelle GeomPlate
+ // If two edges to rounded are tangent GeomPlate is called
if (Sens1==1) E1= st1->Spine()->Edges(1);
else E1= st1->Spine()->Edges( st1->Spine()->NbEdges());
if (!Okvisavis) {
-// on ne se limite plus aux premieres ou aux dernieres surfdata
-// pour rechercher celles qui son en vis a vis
+// one is not limited to the first or the last surfdata
+// to find the opposing data
nbsurf1=st1->SetOfSurfData()->Length();
nbsurf2=st2->SetOfSurfData()->Length();
deb1=1;
Isd1=ChFi3d_IndexOfSurfData(Vtx,st1,Sens1);
Isd2=ChFi3d_IndexOfSurfData(Vtx,st2,Sens2);
}
- // StdFail_NotDone::Raise("TwoCorner : pas de face commune");
+ // StdFail_NotDone::Raise("TwoCorner : no common face");
Standard_Integer IFaArc1 = 3-IFaCo1, IFaArc2 = 3-IFaCo2;
SeqFil1 = st1->ChangeSetOfSurfData()->ChangeSequence();
SeqFil2 = st2->ChangeSetOfSurfData()->ChangeSequence();
sd2 = SeqFil2.ChangeValue(Isd2);
surf2 = DStr.Surface(sd2->Surf()).Surface();
TopAbs_Orientation OFaCo = FaCo.Orientation();
- // On analyse les concavites et on recherche la face en vis a vis
- // et l intersection eventuelle des 2 pcurves sur cette face.
+ // The concavities are analyzed and the opposite face and the
+ // eventual intersection of 2 pcurves on this face are found.
ChFiDS_State Stat1,Stat2;
Standard_Boolean isfirst1 = (Sens1 == 1);
Standard_Boolean c1biseau = (Stat1 == ChFiDS_AllSame);
Standard_Boolean c1rotule = (Stat1 == ChFiDS_OnSame && Stat2 == ChFiDS_OnSame);
- // On verifie que les conges ont bien un commonpoint
- // sur un arc commun.
- // Cet edge est le pivot du biseau ou de la rotule.
+ // It is checked if the fillets have a commonpoint on a common arc.
+ // This edge is the pivot of the bevel or the knee.
ChFiDS_CommonPoint& CP1 = sd1->ChangeVertex(isfirst1,IFaArc1);
ChFiDS_CommonPoint& CP2 = sd2->ChangeVertex(isfirst2,IFaArc2);
}
}
if(!ok1 || !ok2){
- //On est dans un contexte merdique
PerformMoreThreeCorner(Index,2);
done=1;
return;
ChFi3d_ResultChron(ch ,t_t2cornerinit);//result perf initialisation
#endif
- //biseau
+ //bevel
//------
ChFiDS_CommonPoint cp11,cp12,cp21,cp22;
ChFiDS_FaceInterference intf11,intf12,intf21,intf22;
return;
}
}
- else if(c1rotule){//on sauve.
+ else if(c1rotule){//save.
cp11 = sd1->Vertex(isfirst1,1);
cp12 = sd1->Vertex(isfirst1,2);
cp21 = sd2->Vertex(isfirst2,1);
ChFi3d_ResultChron(ch , t_perf2cornerbyinter); // result perf PerformTwoCornerbyInter
#endif
if (!done) {
- //on restore
+ // restore
sd1->ChangeVertex(isfirst1,1) = cp11;
sd1->ChangeVertex(isfirst1,2) = cp12;
sd2->ChangeVertex(isfirst2,1) = cp21;
}
if(!c1biseau && !done){
- //on cree une nouvelle cornerdata
+ //new cornerdata is created
//-------------------------------
Handle(ChFiDS_Stripe) corner = new ChFiDS_Stripe();
Handle(ChFiDS_HData)& cornerset = corner->ChangeSetOfSurfData();
if (SameSide) {
if(ToricRotule(BRFaCo,BRS1,BRS2,st1,st2)){
- // Construction directe.
+ // Direct construction.
// ---------------------
- //un petit coup de NextSide, leger....
- //------------------------------------
Standard_Integer bid;
TopAbs_Orientation ori = OFaCo;
TopAbs_Orientation oriS = st1->Orientation(IFaCo1);
#endif
}
else {
- // Construction par remplissage
+ // Construction by filling remplissage
// ----------------------------
Standard_Real uPCArc1, uPCArc2;
gp_Pnt2d p2da1,p2df1,p2da2,p2df2,p2dfac1,p2dfac2;
p2df2 = sd2->Interference(IFaCo2).PCurveOnSurf()->Value(uPCArc2);
sd2->Interference(IFaCo2).PCurveOnFace()->D1(uPCArc2,p2dfac2,v2dfac2);
#ifdef DEB
- ChFi3d_InitChron(ch ); // init perf remplissage
+ ChFi3d_InitChron(ch ); // init perf filling
#endif
B1 = ChFi3d_mkbound(surf1,p2df1,p2da1,tolesp,2.e-4);
B2 = ChFi3d_mkbound(surf2,p2df2,p2da2,tolesp,2.e-4);
HFaPiv,PCurveOnPiv,OFaCo,1,
0,0,0,0);
#ifdef DEB
- ChFi3d_ResultChron(ch , t_remplissage);// result perf remplissage
+ ChFi3d_ResultChron(ch , t_remplissage);// result perf filling
#endif
}
#ifdef DEB
- ChFi3d_InitChron(ch); // init perf mise a jour DS
+ ChFi3d_InitChron(ch); // init perf update DS
#endif
if (done){
- // Mise a jour des 3 CornerData et de la DS
+ // Update 3 CornerData and the DS
// ----------------------------------------
if(resetcp1){
gp_Pnt pjyl = CP1.Point();
Pf2 = CP1;
Pl2 = CP2;
- // le coin pour commencer,
+ // the corner to start,
// -----------------------
ChFiDS_Regul regdeb, regfin;
If1 = ChFi3d_IndexPointInDS(Pf1,DStr);
}
corner->SetSolidIndex(st1->SolidIndex());
- // puis la Stripe du debut,
+ // then the starting Stripe,
// ------------------------
st1->SetCurve(Icf,isfirst1);
st1->SetIndexPoint(If1,isfirst1,IFaCo1);
sd1->ChangeInterference(IFaCo1).SetParameter(par1,isfirst1);
if (IFaCo1 == 2) st1->SetOrientation(TopAbs_REVERSED,isfirst1);
- // puis la Stripe de la fin,
+ // then the end Stripe,
// -------------------------
st2->SetCurve(Icl,isfirst2);
st2->SetIndexPoint(Il1,isfirst2,IFaCo2);
if (IFaCo2 == 2) st2->SetOrientation(TopAbs_REVERSED,isfirst2);
}
#ifdef DEB
- ChFi3d_ResultChron(ch , t_t2cornerDS);// result perf mise a jour DS
+ ChFi3d_ResultChron(ch , t_t2cornerDS);// result perf update DS
#endif
}
else {
- //ici il faut distinguer celui ondiff
+ //it is necessary to make difference with
if(!OkinterCC) {
- Standard_Failure::Raise("TwoCorner : Pas d intersetion pc pc");
+ Standard_Failure::Raise("TwoCorner : No intersection pc pc");
}
Handle(ChFiDS_Stripe) stsam, stdif;
Handle(ChFiDS_SurfData) sdsam, sddif;
ifacodif = IFaCo1; ifaopdif = IFaArc1; isfirstdif = isfirst1;
}
else {
- Standard_Failure::Raise("TwoCorner : Config inconnue");
+ Standard_Failure::Raise("TwoCorner : Config unknown");
}
- //On verifie que la surface ondiff a un point sur arc du cote oppose
- //a la face commune et que cet arc est connexe a la face d appui
- //oppose a la face commune de la surface onsame.
+ //It is checked if surface ondiff has a point on arc from the side opposed
+ //to the common face and if this arc is connected to the base face
+ //opposed to common face of the surface onsame.
ChFiDS_CommonPoint& cpopdif = sddif->ChangeVertex(isfirstdif,ifaopdif);
if(!cpopdif.IsOnArc()) {
Standard_Failure::Raise
- ("TwoCorner : Pas de point sur restriction sur la surface OnDiff");
+ ("TwoCorner : No point on restriction on surface OnDiff");
}
const TopoDS_Edge& Arcopdif = cpopdif.Arc();
const TopoDS_Face& Fopsam = TopoDS::Face(DStr.Shape(sdsam->Index(ifaopsam)));
}
else if(!ex.More()) {
Standard_Failure::Raise
- ("TwoCorner : Pas de face commune pour boucler le contour");
+ ("TwoCorner : No common face to loop the contour");
}
}
#ifdef DEB
- ChFi3d_InitChron(ch ); // init perf remplissage
+ ChFi3d_InitChron(ch ); // init perf filling
#endif
Handle(GeomFill_Boundary) Bsam,Bdif,Bfac;
gp_Pnt2d ppopsam =
HBRFopsam,pcnul,Osurfsam,1,
0,0,0,0);
#ifdef DEB
- ChFi3d_ResultChron(ch , t_remplissage);// result perf remplissage
+ ChFi3d_ResultChron(ch , t_remplissage);// result perf filling
#endif
- if(!done) Standard_Failure::Raise("concavites inverses : echec");
+ if(!done) Standard_Failure::Raise("concavites inverted : fail");
#ifdef DEB
- ChFi3d_InitChron(ch); // init perf mise a jour DS
+ ChFi3d_InitChron(ch); // init perf update DS
#endif
- // Mise a jour des 3 CornerData et de la DS
+ // Update 3 CornerData and the DS
// ----------------------------------------
- // le coin pour commencer,
+ // the corner to start,
// -----------------------
Standard_Real P1deb,P2deb,P1fin,P2fin;
Standard_Integer If1,If2,Il1,Il2,Icf,Icl;
tolreached = Max(tolreached,tolr1);
TopOpeBRepDS_Curve Tcurv1(C3d,tolreached);
Icf = DStr.AddCurve(Tcurv1);
- // ici petite veru pour mettre la pcurve on face dans la DS
+ // place the pcurve on face in the DS
TopAbs_Orientation OpcFopsam = sdsam->Interference(ifaopsam).Transition();
Standard_Integer IFopsam = sdsam->Index(ifaopsam);
if(isfirstsam) OpcFopsam = TopAbs::Reverse(OpcFopsam);
corner->SetSolidIndex(stsam->SolidIndex());
- // puis la Stripe OnSame
+ // then Stripe OnSame
// ---------------------
const ChFiDS_FaceInterference& intcoin1 = coin->InterferenceOnS1();
stsam->SetCurve(intcoin1.LineIndex(),isfirstsam);
- stsam->InDS(isfirstsam); // filDS fait deja le boulot depuis le coin.
+ stsam->InDS(isfirstsam); // filDS already works from the corner.
stsam->ChangePCurve(isfirstsam) = coin->InterferenceOnS1().PCurveOnFace();
stsam->SetIndexPoint(If1,isfirstsam,ifaopsam);
stsam->SetIndexPoint(Il1,isfirstsam,ifacosam);
sdsam->ChangeInterferenceOnS2().SetParameter(uintpcsam,isfirstsam);
if (ifaopsam == 2) stsam->SetOrientation(TopAbs_REVERSED,isfirstsam);
- // puis la Stripe OnDiff
+ // then Stripe OnDiff
// ---------------------
stdif->SetCurve(Icl,isfirstdif);
stdif->ChangePCurve(isfirstdif) = pcsurfdif;
sddif->ChangeInterference(ifacodif).SetParameter(uintpcdif,isfirstdif);
if (ifaopdif == 1) stdif->SetOrientation(TopAbs_REVERSED,isfirstdif);
#ifdef DEB
- ChFi3d_ResultChron(ch , t_t2cornerDS);// result perf mise a jour DS
+ ChFi3d_ResultChron(ch , t_t2cornerDS);// result perf update DS
#endif
}
if(!myEVIMap.IsBound(Vtx)){
//=======================================================================
//function : ToricCorner
-//purpose : Teste si on est dans le cas pariculier d un coin torique
-// (ou spherique limite par des isos).
+//purpose : Test if this is a paricular cas of a torus corner
+// (or spherical limited by isos).
//=======================================================================
static Standard_Boolean ToricCorner(const TopoDS_Face& F,
//=======================================================================
//function : PerformThreeCorner
-//purpose : Calcul du conge sur un sommet avec trois aretes
-// incidentes portant chacune un conge.
+//purpose : Calculate fillet on a top with three edges
+// incident carrying each edge.
//=======================================================================
void ChFi3d_FilBuilder::PerformThreeCorner(const Standard_Integer Jndex)
Index[ii] = ChFi3d_IndexOfSurfData(Vtx,It.Value(),sens[ii]);
CD[ii] = It.Value();
}
- // On verifie que l une des CD ne figure pas deux fois, au quel cas
- // il faut modifier le retour de IndexOfSurfData qui prend la
- // premiere des solutions.
+ // It is checked if one of CD is not present twice in which
+ // case it is necessary to modify the return of IndexOfSurfData
+ // that takes the first solution.
if(CD[0] == CD[1]){
Index[1] = CD[1]->SetOfSurfData()->Length();
sens[1] = -1;
p[1][2],p[2][1],Index[1],Index[2],face[0],sameside[0],
jf[1][2],jf[2][1]);
//
- // Analyse des concavites des 3 conges :
- // - 2 concavites identiques et 1 inverse.
- // - 3 concavites identiques
+ // Analyze concavities of 3 fillets :
+ // - 2 concavities identic and 1 inverted.
+ // - 3 concavities identic
//
if(oksea[2] && oksea[1] && !sameside[2] && !sameside[1])
{ pivot = 0; deb = 1; fin = 2;}
else if(oksea[1] && oksea[0] && !sameside[1] && !sameside[0])
{ pivot = 2; deb = 0; fin = 1;}
else if(oksea[0] && oksea[1] && oksea[2]){
- // 3 concavites identiques.
+ // 3 concavities identic.
pivot = SearchPivot(sens,p,tol2d);
if(pivot < 0){
#ifdef DEB
- cout<<"pivot non trouve, on appelle plate"<<endl;
+ cout<<"pivot not found, plate is called"<<endl;
#endif
PerformMoreThreeCorner(Jndex, 3);
return;
ifacfin = CD[fin]->ChangeSetOfSurfData()->Value(i[fin][pivot])->Index(3-jf[fin][pivot]);
if(ifacfin != ifacdeb){
#ifdef DEB
- cout<<"plusieurs faces d'appui, on appelle plate"<<endl;
+ cout<<"several base faces, plate is called"<<endl;
#endif
PerformMoreThreeCorner(Jndex, 3);
return;
}
if(i[pivot][deb] != i[pivot][fin]){
#ifdef DEB
- cout<<"changement de surfdata sur le pivot, on appelle plate"<<endl;
+ cout<<"load surfdata on the pivot, plate is called"<<endl;
#endif
PerformMoreThreeCorner(Jndex, 3);
return;
if(!c1toric)c1spheric=(Abs(qr[0]-qr[1])<tolesp && Abs(qr[0]-qr[2])<tolesp);
}
- // Autrefois pour eviter les bouclages on mettait toujours les
- // points a l interieur, ca pouvait gener la construction de la
- // ligne guide du coin qui aujourd hui est un cercle.
+ // Previously to avoid loops the points were always located
+ // inside, which could impede the construction of the
+ // guideline of the corner which now is a circle.
// Standard_Integer jjjd = jf[deb][fin], jjjf = jf[fin][deb];
// if (pivdif) jjjd = jf[deb][pivot], jjjf = jf[fin][pivot];
Standard_Integer jjjd = jf[deb][pivot], jjjf = jf[fin][pivot];
0,sens[pivot],Pdp,Vdp,Rdp);
ChFi3d_ExtrSpineCarac(DStr,CD[pivot],i[pivot][fin],p[pivot][fin],
0,sens[pivot],Pfp,Vfp,Rfp);
- //dans le cas allsame on controle que les points sur la face ne
- //sont pas trop pres ce qui risque de faire foirer le cheminement.
+ //in cas of allsame it is checked that points on the face are not
+ //too close, which can stop the work.
if(!pivdif) {
gp_Pnt ptestdeb,ptestfin; gp_Vec bidvec; Standard_Real bidr;
ChFi3d_ExtrSpineCarac(DStr,CD[deb],i[deb][pivot],p[deb][pivot],
if(Abs(p[pivot][deb] - p[pivot][fin]) <= tol2d)
c1toric = ToricCorner(face[pivot],Rdeb,Rfin,Vdp);
}
- // on a le pivot, le CD deb et le CD fin (enfin on espere !?!) :
+ // there is a pivot, the start and the end CD (finally !?!) :
// -------------------------------------------------------------
- // les criteres determinant si le coin est un tore ou une sphere
- // sont uniquement fondes sur la configuration des sections en
- // bout et la nature des faces, il faudra faire des tests pour
- // determiner si une analyse plus subtile des conges incidents
- // n est pas necessaire pour assurer la tangence entre ceux-ci
- // et le coin (en particulier dans les cas a rayon variable).
+ // the criterions determining if the corner is a torus or a sphere
+ // are based only on the configuration of sections at end and the
+ // nature of faces, it is necessary to make tests to
+ // determine if a more detailed analysis of incident fillets
+ // is necessare to provide tangency between them and
+ // the corner (in particular in the case with variable radius).
fdpiv = CD[pivot]->ChangeSetOfSurfData()->ChangeValue(i[pivot][deb]);
- // On construit les HSurfaces et autres outils qui vont bien.
+ // HSurfaces and other suitable tools are constructed.
// ----------------------------------------------------------
TopAbs_Orientation OFac = face[pivot].Orientation();
Handle(GeomAdaptor_HSurface) Surf = new GeomAdaptor_HSurface(gasurf);
// Handle(BRepTopAdaptor_TopolTool) IFac = new BRepTopAdaptor_TopolTool(Fac);
- // Essai de ne pas classifier sur la face pour les cas de conges rentrants
- // qui debordent naturellement.
+ // Try to not classify on the face for cases of reentering fillets which naturally depass
+ // the border.
Handle(GeomAdaptor_HSurface)
bidsurf = new GeomAdaptor_HSurface(Fac->ChangeSurface().Surface());
Handle(Adaptor3d_TopolTool)
IFac = new Adaptor3d_TopolTool(bidsurf);
- // fin de l essai.
+ // end of the attempt.
Handle(Adaptor3d_TopolTool) ISurf = new Adaptor3d_TopolTool(Surf);
Handle(ChFiDS_Stripe) corner = new ChFiDS_Stripe();
Handle(ChFiDS_HData)& cornerset = corner->ChangeSetOfSurfData();
if (c1toric){
#ifdef DEB
- ChFi3d_InitChron(ch); // init perf cas torique
+ ChFi3d_InitChron(ch); // init perf case torus
#endif
- // Construction directe.
+ // Direct Construction.
// ---------------------
done = ChFiKPart_ComputeData::ComputeCorner
(DStr,coin,Fac,Surf,oo1,oo2,o1,o2,Rdeb,Rdp,pfac1,pfac2,psurf1,psurf2);
#ifdef DEB
- ChFi3d_ResultChron(ch , t_torique); // result perf cas torique
+ ChFi3d_ResultChron(ch , t_torique); // result perf case torus
#endif
}
else if(c1spheric){
#ifdef DEB
- ChFi3d_InitChron(ch); //init perf cas spherique
+ ChFi3d_InitChron(ch); //init perf case sphere
#endif
done = ChFiKPart_ComputeData::ComputeCorner
(DStr,coin,Fac,Surf,oo1,oo2,o1,o2,Rdp,pfac1,psurf1,psurf2);
#ifdef DEB
- ChFi3d_ResultChron(ch , t_spherique);// result perf cas spherique
+ ChFi3d_ResultChron(ch , t_spherique);// result perf cas sphere
#endif
}
ChFi3d_InitChron(ch);// init perf not filling
#endif
- //on se calcule une ligne guide,
+ //Calculate a guideline,
//------------------------------
- //Problemes nombreux de bouclages et demi-tours lies
- //a la courbure de la ligne guide !!!!!!
- //POUR L INSTANT CERCLE.
- //Si un jour on change de nature de ligne guide il faudra
- //remettre les points Pdeb et Pfin a l interieur (voir le
- //commentaire a ce sujet a la ligne du calcul de Pdeb et Pfin).
+ //Numerous problems with loops and half-turns connected to
+ //the curvature of the guideline !!!!!!
+ //FOR CIRCLE.
+ //If the nature of guideline is changed it is necessary to
+ //reset points Pdeb and Pfin at the inside (see the
+ //comments about it in the calculation of Pdeb and Pfin).
Standard_Real radpondere = (Rdp+Rfp)/2.;
Standard_Real locfleche = fleche;
Pdeb,Vdeb,
Pfin,Vfin,radpondere);
if(spinecoin.IsNull()){
- // On est dans un cas pourri ou l intersection des plans
- // de section se fait en dehors du secteur.
+ // This is a bad case when the intersection of
+ // section planes is done out of the sector.
spinecoin = ChFi3d_Spine(Pdeb,Vdeb,
Pfin,Vfin,radpondere);
WFirst = 0.; WLast = 1.;
cornerspine->ChangeCurve().SetCurve(spinecoin);
cornerspine->ChangeCurve().FirstParameter(WFirst - pasmax);
cornerspine->ChangeCurve().LastParameter(WLast + pasmax);
- // Juste pour leurrer le Compute data qui ne doit pas
- // en avoir besoin dans ce cas precis ...
+ // Just to confuse Compute that should not require this
+ // in this exact case ...
Handle(ChFiDS_Spine) NullSpine;
- // On calcule le conge : - de deb vers fin
- // - de la face vers la surface
+ // The fillet is calculated - from beginning to end
+ // - from the face to the surface
//
math_Vector Soldep(1,4);
Soldep(1) = pfac1.X();
ChFi3d_InitChron(ch); // init perf filling
#endif
- // le contour a remplir est constitue de droites uv sur deb et fin
- // de deux pcurves (une seule si c1pointu) calculees comme on peut
- // sur piv et la face opposee.
+ // the contour to be fillet consists of straight lines uv in beginning and end
+ // of two pcurves (only one if c1pointu) calculted as possible
+ // on piv and the opposite face.
Handle(GeomFill_Boundary) Bdeb,Bfin,Bpiv,Bfac;
Handle(Geom2d_Curve) PCurveOnFace;
if(!c1pointu)
else fil.Init(Bpiv,Bfin,Bfac,Bdeb,1);
Handle(Geom_Surface) Surfcoin = fil.Surface();
- Surfcoin->VReverse(); // on se ramene au sens face surf;
+ Surfcoin->VReverse(); // revert to direction face surface;
done = CompleteData(coin,Surfcoin,
Fac,PCurveOnFace,
Surf,PCurveOnPiv,fdpiv->Orientation(),0,
}
if (done){
- // Mise a jour des 4 Stripes et de la DS
+ // Update of 4 Stripes and the DS
// -------------------------------------
#ifdef DEB
- ChFi3d_InitChron(ch);// init perf mise a jour DS
+ ChFi3d_InitChron(ch);// init perf update DS
#endif
gp_Pnt2d pp1,pp2;
pbf1->Add(Pf1.Point());pbf2->Add(Pf2.Point());
pbl1->Add(Pl1.Point());pbl2->Add(Pl2.Point());
- // le coin pour commencer,
+ // the start corner,
// -----------------------
ChFiDS_Regul regdeb, regfin;
If1 = ChFi3d_IndexPointInDS(Pf1,DStr);
corner->ChangeIndexLastPointOnS2(Il2);
ChFi3d_EnlargeBox(DStr,corner,coin,*pbl1,*pbl2,0);
- // puis la CornerData du debut,
- // ----------------------------
+ // then CornerData of the beginning,
+ // --------------------------------
Standard_Boolean isfirst = (sens[deb] == 1), rev = (jf[deb][fin] == 2);
Standard_Integer isurf1 = 1, isurf2 = 2;
parpp1 = p[deb][fin]; parpp2 = p[deb][pivot];
if(rev) ChFi3d_EnlargeBox(DStr,CD[deb],fddeb,*pbf2,*pbf1,isfirst);
else ChFi3d_EnlargeBox(DStr,CD[deb],fddeb,*pbf1,*pbf2,isfirst);
- // puis la CornerData de la fin,
- // -----------------------------
+ // then the end CornerData,
+ // ------------------------
isfirst = (sens[fin] == 1); rev = (jf[fin][deb] == 2);
isurf1 = 1; isurf2 = 2;
parpp1 = p[fin][deb]; parpp2 = p[fin][pivot];
if(rev) ChFi3d_EnlargeBox(DStr,CD[fin],fdfin,*pbl2,*pbl1,isfirst);
else ChFi3d_EnlargeBox(DStr,CD[fin],fdfin,*pbl1,*pbl2,isfirst);
- // et enfin le pivot.
+ // anf finally the pivot.
// ------------------
ChFiDS_FaceInterference& fi = coin->ChangeInterferenceOnS2();
isfirst = (sens[pivot] == 1); rev = (jf[pivot][deb] == 2);
fdpiv->ChangeVertex(isfirst,isurf2) = Pl2;
fdpiv->ChangeInterference(isurf1).SetParameter(p[pivot][deb],isfirst);
fdpiv->ChangeInterference(isurf2).SetParameter(p[pivot][fin],isfirst);
- CD[pivot]->InDS(isfirst); // filDS fait deja le boulot depuis le coin.
+ CD[pivot]->InDS(isfirst); // filDS already does it from the corner.
if(rev) ChFi3d_EnlargeBox(DStr,CD[pivot],fdpiv,*pbl2,*pbf2,isfirst);
else ChFi3d_EnlargeBox(DStr,CD[pivot],fdpiv,*pbf2,*pbl2,isfirst);
- //Pour finir on recale les tolerances des points.
+ //To end the tolerances of points are rescaled.
ChFi3d_SetPointTolerance(DStr,*pbf1,If1);
ChFi3d_SetPointTolerance(DStr,*pbf2,If2);
ChFi3d_SetPointTolerance(DStr,*pbl1,Il1);
ChFi3d_SetPointTolerance(DStr,*pbl2,Il2);
}
- //On tronque les corners data et met a jour les index.
+ //The data corners are truncated and index is updated.
//----------------------------------------------------
if(i[deb][pivot] < Index[deb]){
CD[fin]->ChangeSetOfSurfData()->Remove(Index[fin],i[fin][pivot]-1);
i[fin][pivot] = Index[fin];
}
- // il faudra ici tenir compte des coins mutants.
+ // it is necessary to take into account mutant corners.
if(i[pivot][deb] < Index[pivot]) {
CD[pivot]->ChangeSetOfSurfData()->Remove(i[pivot][deb]+1,Index[pivot]);
Index[pivot] = i[pivot][deb];
myListStripe.Append(corner);
#ifdef DEB
- ChFi3d_ResultChron(ch , t_t3cornerDS);// result perf mise a jour DS
+ ChFi3d_ResultChron(ch , t_t3cornerDS);// result perf update DS
#endif
}
par = parandrad(i).X();
rad = parandrad(i).Y();
if (Abs( rad-StartRad ) > Precision::Confusion())
- Standard_DomainError::Raise("Arete non constante");
+ Standard_DomainError::Raise("Edge is not constant");
if (Abs( Ul-par ) <= gp::Resolution())
return StartRad;
if (par > Ul)
Standard_Real ChFiDS_FilSpine::Radius()const
{
- if (!IsConstant()) Standard_DomainError::Raise("Spine non constante");
+ if (!IsConstant()) Standard_DomainError::Raise("Spine is not constant");
return parandrad(1).Y();
}
if(npr.IsEmpty()){
if( Rdeb < 0. && Rfin <0. )
- Standard_DomainError::Raise("construction de la loi impossible");
+ Standard_DomainError::Raise("Impossible to create the law");
else if(Rdeb < 0. || Rfin <0.){
Standard_Real r = (Rfin<0.)? Rdeb : Rfin;
Handle(Law_Constant) loi = new Law_Constant();
}
}
else{
- //tri bourrin!!
if(!yaunpointsurledeb && Rdeb >= 0.) npr.Append(gp_XY(curdeb,Rdeb));
if(!yaunpointsurlefin && Rfin >= 0.) npr.Append(gp_XY(curfin,Rfin));
Standard_Integer nbp = npr.Length();
}
}
}
- //On vire les doublons.
+ //Duplicates are removed.
Standard_Boolean fini = (nbp <= 1);
i = 1;
while (!fini) {
Standard_Integer ideb = Index(deb,Standard_True);
Standard_Integer ifin = Index(fin,Standard_False);
Standard_Integer len = NbEdges();
- // si la spine est periodique attention aux index et aux parametres!!!
+ // if the spine is periodic, attention to the index and parameters
Standard_Real spinedeb = FirstParameter();
Standard_Real spinefin = LastParameter();
}
if(Els->IsPeriodic()){
- //On cree une composite periodique de range eventuellement
- //decale par rapport a l elspine, pour ne pas faire de l
- //origine un point singulier.
+ // A pereodic composite is created at range, which is eventually
+ // offset relatively to the elspine, to avoid a single point at
+ // origin.
loi->SetPeriodic();
- //Y a t il une arete constante?
+ //Is there a constant edge?
// for(Standard_Integer k = 1; k <= len; k++){
Standard_Integer k;
for( k = 1; k <= len; k++){
- if (IsConstant(k)){ // oui !
+ if (IsConstant(k)){ // yes !
spinedeb = deb = curdeb = FirstParameter(k);
spinefin = fin = deb + Period();
for(Standard_Integer l = 1; l <= len; l++){
}
Rdeb = Rfin = Radius(k);
icur++;
- if(len == 1) curfin = LastParameter(k);//car le InPeriod va rendre 0.!!!
+ if(len == 1) curfin = LastParameter(k);//because InPeriod will make 0.!!!
else curfin = ElCLib::InPeriod(LastParameter(k),spinedeb,spinefin);
Handle(Law_Constant) curloi = new Law_Constant();
curloi->Set(Rdeb,curdeb,curfin);
break;
}
}
- if(k > len){ // non !
+ if(k > len){ // no !
if(parandrad.IsEmpty())
- Standard_DomainError::Raise("Rayon non defini");
+ Standard_DomainError::Raise("Radius not defined");
Standard_Integer nbp = parandrad.Length();
if(nbp > 1){
deb = parandrad.First().X();
}
}
else if(IsPeriodic()){
- // le rayon au debut.
+ // start radius.
if (IsConstant(ind(1))) {
Rdeb = Radius(ind(1));
curfin = LastParameter(ind(1));
icur++;
}
else{
- // Il y a forcement un kpart juste avant!
+ // There is inevitably kpart right before!
Standard_Integer iprec = (ind(1) - 1);
if(iprec == 0) iprec = len;
if (IsConstant(iprec)){
Rdeb = Radius(iprec);
}
- else Standard_DomainError::Raise("AppendLaw : pas de precedant constant bizarre!!");
+ else Standard_DomainError::Raise("AppendLaw : previous constant is missing!");
lawencours = Standard_True;
}
- // le rayon a la fin.
+ // the raduis at end.
if (IsConstant(ind(nbed))) Rfin = Radius(ind(nbed));
else{
- // Il y a forcement un kpart juste apres!
+ // There is inevitably kpart right after!
Standard_Integer isuiv = (ind(nbed) + 1);
if(isuiv == len + 1) isuiv = 1;
if (IsConstant(isuiv)) {
Rfin = Radius(isuiv);
}
- else Standard_DomainError::Raise("AppendLaw : pas de suivant constant bizarre!!");
+ else Standard_DomainError::Raise("AppendLaw : next constant is missing!");
}
}
else{
- // le rayon au debut.
+ // the radius at start.
if (IsConstant(ind(1))) {
Rdeb = Radius(ind(1));
curfin = Min(fin,LastParameter(ind(1)));
if (IsConstant(ind(1) - 1)){
Rdeb = Radius(ind(1) - 1);
}
- else Standard_DomainError::Raise("AppendLaw : pas de precedant constant");
+ else Standard_DomainError::Raise("AppendLaw : previous constant is missing");
}
else if(parandrad.IsEmpty()){
- Standard_DomainError::Raise("AppendLaw : pas rayon sur vertex");
+ Standard_DomainError::Raise("AppendLaw : no radius on vertex");
}
else Rdeb = -1.;
lawencours = Standard_True;
}
- // le rayon a la fin.
+ // the radius at end.
if (IsConstant(ind(nbed))) Rfin = Radius(ind(nbed));
else{
if(ind(nbed) < len){
if (IsConstant(ind(nbed) + 1)) Rfin = Radius(ind(nbed) + 1);
- else Standard_DomainError::Raise("AppendLaw : pas de suivant constant");
+ else Standard_DomainError::Raise("AppendLaw : next constant is missing");
}
else if(parandrad.IsEmpty()){
- Standard_DomainError::Raise("AppendLaw : pas rayon sur vertex");
+ Standard_DomainError::Raise("AppendLaw : no radius on vertex");
}
else Rfin = -1.;
}
}
- // On a les infos sur les extremites de l elspine,
- // on parcourt toutes les aretes
+ // There are infos on the extremities of the elspine,
+ // all edges are parsed
for(; icur <= nbed; icur++){
if (IsConstant(ind(icur))) {
Rcur = Radius(ind(icur));
if(IsPeriodic()){
curfin = ElCLib::InPeriod(curfin,spinedeb + tol3d, spinefin + tol3d);
if(ind(icur) == ind(nbed)){
- // Attention le curfin peut etre faut si le dernier edge passe par
- // dessus l origine de la spine periodique.
+ // Attention the curfin can be wrong if the last edge passes
+ // above the origin periodic spline.
Standard_Real biddeb = FirstParameter(ind(icur));
biddeb = ElCLib::InPeriod(biddeb,spinedeb + tol3d, spinefin + tol3d);
if(biddeb >= curfin) curfin = fin;
curfin = Min(fin,curfin);
lawencours = Standard_True;
if(ind(icur) == ind(nbed)){
- // Attention le curfin peut etre faut si le dernier edge passe par
- // dessus l origine de la spine periodique.
+ // Attention the curfin can be wrong if the last edge passes
+ // above the origin periodic spline.
if(IsPeriodic()) {
Standard_Real biddeb = FirstParameter(ind(icur));
curfin = LastParameter(ind(icur));
if(biddeb >= curfin) curfin = fin;
else curfin = Min(fin,curfin);
}
- // ou si on est en fin de spine avec prolongement.
+ // or if it is the end of spine with extension.
else if(ind(icur) == len) curfin = fin;
Law_Laws temp;
mklaw(temp,parandrad,curdeb,curfin,Rdeb,Rfin,
Handle(Law_Function)& ChFiDS_FilSpine::ChangeLaw(const TopoDS_Edge& E)
{
if(!SplitDone()) {
- Standard_DomainError::Raise("ChFiDS_FilSpine::ChangeLaw : les bornes ne sont pas a jour");
+ Standard_DomainError::Raise("ChFiDS_FilSpine::ChangeLaw : the limits are not up-to-date");
}
Standard_Integer IE = Index(E);
if (IsConstant(IE)) {
- Standard_DomainError::Raise("ChFiDS_FilSpine::ChangeLaw : pas de loi sur les aretes constantes");
+ Standard_DomainError::Raise("ChFiDS_FilSpine::ChangeLaw : no law on constant edges");
}
Handle(ChFiDS_HElSpine) hsp = ElSpine(IE);
Standard_Real w = 0.5*(FirstParameter(IE) + LastParameter(IE));
class Spine from ChFiDS inherits TShared from MMgt
- ---Purpose: Contient les informations necessaires a la
- -- construction d un conge volumique :
+ ---Purpose: Contains information necessary for construction of
+ -- a 3D fillet :
--
--
- -- - ligne guide composee d'edges du solide, tangents
- -- entre eux, et bordes par des faces tangentes entre
- -- elles.
+ -- - guideline composed of edges of the solid, tangents
+ -- between them, and borders by faces tangents
+ -- between them.
--
- -- Les outils de construction du Sp
- -- par propagation a partir d un edge du solide sont
- -- fournis dans le Builder de Fil3d.
+ -- Tools for construction of the Sp
+ -- by propagation from an edge of solid
+ -- are provided in the Builder of Fil3d.
--
- -- Le Spine contient par aileurs des
- -- informations concernant la nature des extremites
- -- du conge ( sur bord libre, sur cassure ou ferme ).
+ -- The Spine contains among others the
+ -- information about the nature of extremities
+ -- of the fillet ( on free border , on section or closed ).
--
- -- REMARQUE IMPORTANTE : la ligne guide ainsi
- -- representee n est pas C2, alors que le cheminement
- -- le reclame. Un certain nombre d amenagements
- -- paliatifs (voir les methodes en fin) sont prevus,
- -- s ils sont insuffisants il faudra changer notre
- -- fusil d epaule et doubler le Spine d
- -- une ligne C2 avec les consequences que l on sait
- -- pour gerer les va et vient entre KPart Blend dans
- -- Fil3d.
+ -- IMPORTANT NOTE : the guideline
+ -- represented in this way is not C2, although the path
+ -- claims it. Several palliative workarounds
+ -- (see the methods at the end) are planned,
+ -- but they are not enough. It is necessary to change
+ -- the approach and double the Spine of line C2 with
+ -- the known consequences for management of
+ -- interactions between KPart Blend in Fil3d.
Create(Tol : Real from Standard) returns mutable Spine from ChFiDS;
SetEdges(me : mutable; E : Edge from TopoDS) is static;
- ---Purpose: stocker les edges qui vont composer la ligne guide
+ ---Purpose: store edges composing the guideline
---C++: inline
PutInFirst(me : mutable; E : Edge from TopoDS) is static;
- ---Purpose:stocker l edge en premiere position avant tous les autres
+ ---Purpose: store the edge at the first position before all others
---C++: inline
NbEdges(me) returns Integer is static;
SetFirstStatus(me : mutable; S : State from ChFiDS) is static;
- ---Purpose: stocker si le debut de l ensemble des edges demarre
- -- sur une cassure un bord libre ou forme un contour ferme
+ ---Purpose: stores if the start of a set of edges starts on a
+ -- section of free border or forms a closed contour
---C++: inline
SetLastStatus(me : mutable; S : State from ChFiDS) is static;
- ---Purpose: stocker si la fin de l ensemble des edges demarre
- -- sur une cassure un bord libre ou forme un contour ferme
+ ---Purpose: stores if the end of a set of edges starts on a
+ -- section of free border or forms a closed contour
---C++: inline
AppendElSpine(me : mutable; Els : HElSpine from ChFiDS)
----------------------
Load(me : mutable) is static;
- ---Purpose: preparer la ligne guide en fonction des edges qui
- -- sont des arcs elementaires (prendre un parametrage
- -- unique abscisse curviligne );pour pouvoir appeller
- -- les methodes sur la geometrie (first,last,value,d1,d2)
- -- il faut d abord preparer sinon une exception sera levee
+ ---Purpose: prepare the guideline depending on the edges that
+ -- are elementary arks (take parameters from
+ -- a single curvilinear abscissa); to be able to call
+ -- methods on the geometry (first,last,value,d1,d2)
+ -- it is necessary to start with preparation otherwise an
+ -- exception will be raised
Resolution(me; R3d : Real) returns Real
is static;
is static;
FirstParameter(me; IndexSpine : Integer ) returns Real
- ---Purpose: donne la longueur cumulee de tous les arcs avant le
- -- numero IndexSp
+ ---Purpose: gives the total length of all arcs before the
+ -- number IndexSp
is static;
LastParameter(me; IndexSpine : Integer ) returns Real
- ---Purpose: donne la longueur cumulee jusqu a l arc de numero
+ ---Purpose: gives the total length till the ark with number
-- IndexSpine (inclus)
is static;
Length(me;IndexSpine : Integer ) returns Real
- ---Purpose: donne la longueur de l arc de numero IndexSp
+ ---Purpose: gives the length of ark with number IndexSp
is static;
IsPeriodic(me) returns Boolean
is static;
CurrentElementarySpine (me : mutable; Index : Integer )
- ---Purpose: set la courbe courante et la renvoie
+ ---Purpose: sets the current curve and returns it
returns Curve from BRepAdaptor is static;
---C++: return const &
{
#ifdef DEB
if(Par >= Precision::Confusion())
- cout<<"Prolongement interieur en debut de ligne guide"<<endl;
+ cout<<"Interior extension at the start of guideline"<<endl;
if(IsPeriodic())
- cout<<"WARNING!!! Prolongement sur ligne guide periodique."<<endl;
+ cout<<"WARNING!!! Extension on periodic guideline."<<endl;
#endif
firstprolon = Standard_True;
firstparam = Par;
#ifdef DEB
Standard_Real lll = abscissa->Value(abscissa->Upper());
if((Par - lll) <= -Precision::Confusion())
- cout<<"Prolongement interieur en fin de ligne guide"<<endl;
+ cout<<"Interior extension at the end of guideline"<<endl;
if(IsPeriodic())
- cout<<"WARNING!!! Prolongement sur ligne guide periodique."<<endl;
+ cout<<"WARNING!!! Extension on periodic guideline."<<endl;
#endif
lastprolon = Standard_True;
lastparam = Par;
Standard_Real ChFiDS_Spine::Period() const
{
- if(!IsPeriodic()) Standard_Failure::Raise("Spine non periodique");
+ if(!IsPeriodic()) Standard_Failure::Raise("Non-periodic Spine");
return abscissa->Value(abscissa->Upper());
}
void ChFiDS_Spine::SetFirstTgt(const Standard_Real W)
{
if(IsPeriodic()) Standard_Failure::Raise
- ("Pas de prolongement par tangente sur les contours periodiques");
+ ("No extension by tangent on periodic contours");
#ifdef DEB
if(W >= Precision::Confusion())
- cout<<"Prolongement interieur en debut de ligne guide"<<endl;
+ cout<<"Interior extension at start of the guideline"<<endl;
#endif
- //On vire le flag au cas ou il serait deja positionne pour
- //ne pas planter le d1
+ //The flag is suspended if is already positioned to avoid
+ //stopping d1
hasfirsttgt = Standard_False;
D1(W,firstori,firsttgt);
- //et on le remet.
+ //and it is reset.
hasfirsttgt = Standard_True;
firsttgtpar = W;
}
void ChFiDS_Spine::SetLastTgt(const Standard_Real W)
{
if(IsPeriodic()) Standard_Failure::Raise
- ("Pas de prologement par tangente sur les contours periodiques");
+ ("No extension by tangent periodic contours");
#ifdef DEB
Standard_Real L = W - abscissa->Value(abscissa->Upper());
if(L <= -Precision::Confusion())
- cout<<"Prolongement interieur en fin de ligne guide"<<endl;
+ cout<<"Interior extension at the end of guideline"<<endl;
#endif
- //On vire le flag au cas ou il serait deja positionne pour
- //ne pas planter le d1
+ //The flag is suspended if is already positioned to avoid
+ //stopping d1
haslasttgt = Standard_False;
D1(W,lastori,lasttgt);
- //et on le remet.
+ //and it is reset.
haslasttgt = Standard_True;
lasttgtpar = W;
}
{
if(!abscissa.IsNull()){
#ifdef DEB
- cout<<"nouveau load du CE"<<endl;
+ cout<<"new load of CE"<<endl;
#endif
}
Standard_Integer len = spine.Length();
break;
#endif
}
- Standard_NotImplemented::Raise("calcul abscisse non traite ");
+ Standard_NotImplemented::Raise("calcul abscisse not processed");
return 0.;
}
#endif
else
ctyp = CSpine->CurrentElementarySpine(Iedge).GetType();
- // Recuperation des orientations.
+ // Return orientations.
TopAbs_Orientation OrFace1 = TopAbs_FORWARD, OrFace2 = TopAbs_FORWARD;
Handle(BRepAdaptor_HSurface) HS = Handle(BRepAdaptor_HSurface)::DownCast(S1);
if (!HS.IsNull()) OrFace1 = HS->ChangeSurface().Face().Orientation();
Wref,OrFace2,Standard_False);
}
else{
- Standard_NotImplemented::Raise("cas particulier non ecrit");
+ Standard_NotImplemented::Raise("particular case not written");
}
}
else if(!CSpine.IsNull()){
Wref,OrFace2,Standard_False);
}
else{
- Standard_NotImplemented::Raise("cas particulier non ecrit");
+ Standard_NotImplemented::Raise("particular case not written");
}
}
else if (CSpine->IsChamfer() == ChFiDS_TwoDist) {
Wref,OrFace2,Standard_False);
}
else{
- Standard_NotImplemented::Raise("cas particulier non ecrit");
+ Standard_NotImplemented::Raise("particular case not written");
}
}
else {
Wref,OrFace2,Standard_False, DisOnP);
}
else{
- Standard_NotImplemented::Raise("cas particulier non ecrit");
+ Standard_NotImplemented::Raise("particular case not written");
}
}
}
Standard_ConstructionError::Raise
("la face du conge torique doit etre plane");
}
- // On calcule comme ligne guide le cercle correspondant
- // a la section de S2, et divers elements de construction.
+ // The guideline is the circle corresponding
+ // to the section of S2, and other construction elements.
gp_Cylinder cyl;
gp_Circ circ;
typ1 != GeomAbs_Plane ||
typ2 != GeomAbs_Plane){
Standard_ConstructionError::Raise
- ("rotule torique seulement entre des plans");
+ ("torus joint only between the planes");
}
return ChFiKPart_MakeRotule(DStr,Data,S->Plane(),S1->Plane(),
S2->Plane(),OS,OS1,OS2,Radius,OfS);
if ( Abs(ChamfRad) < Precision::Confusion() ) pointu = Standard_True;
if( ChamfRad < 0 ) {
#ifdef DEB
- cout<<"le chanfrein ne passe pas"<<endl;
+ cout<<"the chamfer can't pass"<<endl;
#endif
return Standard_False;
}
if (ouvert) {
if (Abs(angCon) - Abs(SemiAngl) > -Precision::Confusion() ) {
- cout<<"mauvais choix d'angle pour le chanfrein"<<endl;
+ cout<<"wrong choice of angle for the chamfer"<<endl;
return Standard_False;
}
}
SemiAngl = Abs(angCon) + Angle;
if ( (PI / 2. - SemiAngl) < Precision::Confusion() ) {
- cout <<"mauvais choix d'angle pour le chanfrein"<<endl;
+ cout <<"wrong choice of angle for the chamfer"<<endl;
return Standard_False;
}
Dis1 = move * Tan(SemiAngl) - Dis * Abs(Sin(angCon));
if ( Abs(ChamfRad) < Precision::Confusion() ) pointu = Standard_True;
if( ChamfRad < 0 ) {
#ifdef DEB
- cout<<"le chanfrein ne passe pas"<<endl;
+ cout<<"the chamfer can't pass"<<endl;
#endif
return Standard_False;
}
Standard_Boolean pointu = Standard_False;
Standard_Real ConRad, Rad, SemiAngl;
- //Calcul des distance
+ //Calculation of distance
Standard_Real dis1, dis2, cosNPCyl, sinNPCyl;
if ( (plandab && DisOnP) || (!plandab && !DisOnP) ) {
Rad = Cyl.Radius() - dis1;
if ( Abs(Rad) <= Precision::Confusion() ) pointu = Standard_True;
if(Rad < 0 ) {
- cout<<"le chanfrein ne passe pas"<<endl;
+ cout<<"the chamfer can't pass"<<endl;
return Standard_False;
}
}
//=======================================================================
//function : MakeChAsym
-//purpose : cas cylindre/plan ou plan/cylindre.
+//purpose : case cylinder/plane or plane/cylinder.
//=======================================================================
Standard_Boolean ChFiKPart_MakeChAsym(TopOpeBRepDS_DataStructure& DStr,
const Standard_Boolean plandab,
const Standard_Boolean DisOnP)
{
- // calcul du conge plan.
- // or1 et or2 permettent de determiner dans lequel des 4 cotes crees par
- // l'intersection des 2 surfaces_on est
- // _|_ et Ofpl qui est l'orientation de la face du plan permettant
- // |4 de determiner le cote de la matiere
+ // calculation of the fillet plane.
+ // or1 and or2 permit to determine in which of four sides created by
+ // intersection of 2 surfaces we are
+ // _|_ Ofpl is orientation of the plane face allowing
+ // |4 to determine the side of the material
gp_Pnt OrSpine = ElCLib::Value(First, Spine);
gp_Pnt POnCyl, POnPln, OrCyl;
{NorF.Reverse();}
gp_Ax3 AxCyl = Cyl.Position();
- // OrCyl est le point sur l'axe du cylindre dans le plan normal a l'axe
- // contenant OrSpine
+ // OrCyl is the point on axis of cylinder in the plane normal to the
+ // axis containing OrSpine
gp_Pnt Loc = AxCyl.Location();
gp_Vec LocSp(Loc, OrSpine);
gp_XYZ temp = AxCyl.Direction().XYZ();
temp = temp.Multiplied(LocSp.XYZ().Multiplied(temp) );
OrCyl.SetXYZ( (Loc.XYZ()).Added(temp) );
- //construction de POnPln
+ //construction of POnPln
gp_Vec VecTranslPln,tmp;
tmp = gp_Vec(OrSpine,OrCyl);
gp_Vec VecTranslCyl;
VecTranslCyl = gp_Vec(OrSpine,OrCyl);
- // Calcul des distances dis1 et dis2, en fonction de Dis et Angle
+ // Calculation of distances dis1 and dis2, depending on Dis and Angle
gp_Vec DirSOrC = VecTranslCyl.Normalized();
Standard_Real cosA1 = DirSOrC.Dot(VecTranslPln.Normalized());
Standard_Real sinA1 = Sqrt(1. - cosA1 * cosA1);
dis2 = temp2 + temp1 * (cosAhOC - temp1);
if (dis2 < -1.E-09) {
- cout<<"angle du chanfrein trop grand"<<endl;
+ cout<<"too great angle of chamfer"<<endl;
return Standard_False;
}
else if (dis2 < 1.E-09) {
dis2 = Dis;
}
- //construction de POnCyl
+ //construction of POnCyl
Standard_Real alpha = ( 2*ASin(dis2*0.5/ray) );
gp_Vec VecTemp = VecTranslCyl.Reversed();
ElSLib::CylinderD1(UOnCyl, VOnCyl, AxCyl, Cyl.Radius(),
POnCyl, DUOnCyl, DVOnCyl);
- // Construction du point sur le plan
+ // Construction of the point on the plane
if (!IsDisOnP) {
gp_Vec Corde(POnCyl, OrSpine);
gp_Vec TCyl = DUOnCyl.Crossed(DVOnCyl);
POnPln.SetXYZ( (OrSpine.XYZ()).Added(VecTranslPln.XYZ()) );
- //construction du chanfrein
+ //construction of the chamfer
ElSLib::Parameters(Pln,POnPln,UOnPln,VOnPln);
POnPln = ElSLib::PlaneValue(UOnPln,VOnPln,AxPln);
- //construction de YDir pour aller de face1 vers face2.
+ //construction of YDir to go from face1 to face2.
gp_Vec YDir(POnPln,POnCyl);
if (!plandab){
YDir.Reverse();
Handle(Geom_Plane) Chamfer = new Geom_Plane(AxCh);
Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(Chamfer,DStr));
- // On charge les FaceInterferences avec les pcurves et courbes 3d.
+ // FaceInterferences are loaded with pcurves and curves 3d.
//----------- edge plan-Chamfer
gp_Pnt2d PPln2d(UOnPln,VOnPln);
gp_Dir2d VPln2d(XDir.Dot(AxPln.XDirection()),
if ( !IsDisOnP && PosChamfPln )
toreverse = !toreverse;
- // On regarde si l orientation du Chamfer est la meme que celle du plan
+ // It is checked if the orientation of the Chamfer is the same as of the plane
if (toreverse)
{Data->ChangeOrientation() = TopAbs::Reverse(Ofpl);}
else
if ((!plandab && toreverse) || (plandab && !toreverse))
{trans=TopAbs_REVERSED;}
- //trans permet de determiner le cote "matiere" sur S1(2) delimite par L3d
+ //trans allows to determine the "material" side on S1(2) limited by L3d
if (plandab)
{Data->ChangeInterferenceOnS1().
SetInterference(ChFiKPart_IndexCurveInDS(L3d,DStr),trans,LFac,LFil);}
Rad = Cyl.Radius()- Dis1;
if ( Abs(Rad) <= Precision::Confusion() ) pointu = Standard_True;
if(Rad < 0 ) {
- cout<<"le chanfrein ne passe pas"<<endl;
+ cout<<"the chamfer can't pass"<<endl;
return Standard_False;
}
}
//=======================================================================
//function : MakeChamfer
-//purpose : cas cylindre/plan ou plan/cylindre.
+//purpose : case cylinder/plane or plane/cylinder.
//=======================================================================
Standard_Boolean ChFiKPart_MakeChamfer(TopOpeBRepDS_DataStructure& DStr,
const TopAbs_Orientation Ofpl,
const Standard_Boolean plandab)
{
- //calcul du conge plan.
- //or1 et or2 permettent de determiner dans lequel des 4 cotes crees par
- //l'intersection des 2 surfaces_ on est
- // _|_ et Ofpl qui est l'orientation de la face du plan permettant
- // |4 de determiner le cote de la matiere
+ // calculation of the fillet plane.
+ // or1 and or2 permit to determine in which of four sides created by
+ // intersection of 2 surfaces we are
+ // _|_ Ofpl is orientation of the plane face allowing
+ // |4 to determine the side of the material
+
Standard_Real dis1=Dis1, dis2=Dis2;
if (!plandab){
{NorF.Reverse();}
gp_Ax3 AxCyl = Cyl.Position();
- // OrCyl est le point sur l'axe du cylindre dans le plan normal a l'axe
- // contenant OrSpine
+ // OrCyl is the point on axis of cylinder in the plane normal to the
+ // axis containing OrSpine
gp_Pnt Loc = AxCyl.Location();
gp_Vec LocSp(Loc, OrSpine);
gp_XYZ temp = AxCyl.Direction().XYZ();
// OrCyl.SetXYZ( (AxCyl.Location().XYZ()).Added(temp) );
- //construction de POnPln
+ //construction of POnPln
gp_Vec VecTranslPln,tmp;
tmp = gp_Vec(OrSpine,OrCyl);
POnPln.SetXYZ( (OrSpine.XYZ()).Added(VecTranslPln.XYZ()) );
- //construction de POnCyl
+ //construction of POnCyl
Standard_Real alpha = ( 2*ASin(dis2*0.5/Cyl.Radius()) );
// gp_Vec VecTranslCyl;
// VecTranslCyl = gp_Vec(OrSpine,OrCyl);
POnCyl.SetXYZ( OrCyl.XYZ().Added(VecCylTransl.XYZ()) );
- //construction du chanfrein
+ //construction of chamfer
Standard_Real UOnCyl,VOnCyl,UOnPln,VOnPln;
ElSLib::Parameters(Cyl,POnCyl,UOnCyl,VOnCyl);
POnCyl = ElSLib::CylinderValue(UOnCyl,VOnCyl,AxCyl,Cyl.Radius());
ElSLib::Parameters(Pln,POnPln,UOnPln,VOnPln);
POnPln = ElSLib::PlaneValue(UOnPln,VOnPln,AxPln);
- //construction de YDir pour aller de face1 vers face2.
+ //construction of YDir to go to face1 from face2.
gp_Vec YDir(POnPln,POnCyl);
if (!plandab){
YDir.Reverse();
Handle(Geom_Plane) Chamfer = new Geom_Plane(AxCh);
Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(Chamfer,DStr));
- // On charge les FaceInterferences avec les pcurves et courbes 3d.
- //----------- edge plan-Chamfer
+ // FaceInterferences are loaded with pcurves and curves 3d.
+ //----------- edge plane-Chamfer
gp_Pnt2d PPln2d(UOnPln,VOnPln);
gp_Dir2d VPln2d(XDir.Dot(AxPln.XDirection()),
XDir.Dot(AxPln.YDirection()));
if (PosChamfPln )
toreverse = !toreverse;
- // On regarde si l orientation du Chamfer est la meme que celle du plan
+ // It is checked if the orientation of the Chamfer is the same as of the plane
if (toreverse)
{Data->ChangeOrientation() = TopAbs::Reverse(Ofpl);}
else
if ((!plandab && toreverse) || (plandab && !toreverse))
{trans=TopAbs_REVERSED;}
- //trans permet de determiner le cote "matiere" sur S1(2) delimite par L3d
+ //trans permits to determine the "material" side on S1(2) limited by L3d
if (plandab)
{Data->ChangeInterferenceOnS1().
SetInterference(ChFiKPart_IndexCurveInDS(L3d,DStr),trans,LFac,LFil);}
{Data->ChangeInterferenceOnS2().
SetInterference(ChFiKPart_IndexCurveInDS(L3d,DStr),trans,LFac,LFil);}
- //------------edge cylindre-Chamfer
+ //------------edge cylinder-Chamfer
gp_Pnt2d PCyl2d(UOnCyl,VOnCyl);
gp_Dir2d VCyl2d=gp::DY2d();
if ( XDir.Dot(AxCyl.Direction())<0 )
//=======================================================================
//function : PCurve
-//purpose : Calcule une droite sous forme de BSpline pour garantir
-// les parametres.
+//purpose : Calculate a straight line in form of BSpline to guarantee
+// the parameters.
//=======================================================================
Handle(Geom2d_BSplineCurve) ChFiKPart_PCurve(const gp_Pnt2d& UV1,
//=======================================================================
//function : ProjPC
-//purpose : Pour les coins spheriques dont les contours ne sont
-// pas des isos on projette le cercle.
+//purpose : For spherical corners the contours which of are not
+// isos the circle is projected.
//=======================================================================
void ChFiKPart_ProjPC(const GeomAdaptor_Curve& Cg,
break;
#endif
default :
- Standard_NotImplemented::Raise("echec approximation de la pcurve ");
+ Standard_NotImplemented::Raise("failed approximation of the pcurve ");
}
}
else {
- Standard_NotImplemented::Raise("approx pcurve sur une surface gauche");
+ Standard_NotImplemented::Raise("approximate pcurve on the left surface");
}
}
//=======================================================================
//function : IndexCurveInDS
-//purpose : Met une Curve dans la DS et renvoie son index.
+//purpose : Place a Curve in the DS and return its index.
//=======================================================================
Standard_Integer ChFiKPart_IndexCurveInDS(const Handle(Geom_Curve)& C,
//=======================================================================
//function : IndexSurfaceInDS
-//purpose : Met une Surface dans la DS et renvoie son index.
+//purpose : Place a Surface in the DS and return its index.
//=======================================================================
Standard_Integer ChFiKPart_IndexSurfaceInDS(const Handle(Geom_Surface)& S,
//=======================================================================
//function : MakeFillet
-//purpose : cas cone/plan ou plan/cone.
+//purpose : case cone/plane or plane/cone.
//=======================================================================
Standard_Boolean ChFiKPart_MakeFillet(TopOpeBRepDS_DataStructure& DStr,
const TopAbs_Orientation Ofpl,
const Standard_Boolean plandab)
{
-//calcul du conge (tore ou sphere).
+//calculate the fillet (torus or sphere).
Standard_Boolean c1sphere = Standard_False;
gp_Ax3 PosPl = Pln.Position();
gp_Dir Dpnat = PosPl.XDirection().Crossed(PosPl.YDirection());
Precision::Confusion());
gp_Pnt Pv;
if (CInt.IsDone()) {
- //On met l origine du conge au point de depart fourni sur la
- //ligne guide.
+ //The origin of the fillet is set at the start point on the
+ //guideline.
Pv = ElCLib::Value(ElCLib::Parameter(CInt.Circle(1),PtSp),
CInt.Circle(1));
}
Rad = Maxrad - Rabio;
if(Abs(Rad) <= Precision::Confusion()){ c1sphere = Standard_True; }
else if(Rad < 0){
- cout<<"le conge ne passe pas"<<endl;
+ cout<<"the fillet does not pass"<<endl;
return Standard_False;
}
}
Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(gtor,DStr));
}
- // On regarde si l orientation du conge est la meme que celle
- // des faces.
+ // It is checked if the orientation of the fillet is the same
+ // as of the faces.
gp_Pnt P,PP;
gp_Vec deru,derv;
P.SetCoord(cPln.X()+Rad*Dx.X(),
if (toreverse) { Data->ChangeOrientation() = TopAbs_REVERSED; }
else { Data->ChangeOrientation() = TopAbs_FORWARD; }
- // On charge les FaceInterferences avec les pcurves et courbes 3d.
+ // FaceInterferences are loaded with pcurves and curves 3d.
// ---------------------------------------------------------------
- // La face plane.
+ // The plane face.
// --------------
Handle(Geom2d_Circle) GCirc2dPln;
trans,GCirc2dPln,GLin2dFil1);
}
- // La face conique.
+ // The conic face.
// ----------------
P.SetCoord(Pv.X()+Rabio*ddc.X(),
//=======================================================================
//function : MakeFillet
-//purpose : cas cylindre/plan ou plan/cylindre.
+//purpose : case cylinder/plane or plane/cylinder.
//=======================================================================
Standard_Boolean ChFiKPart_MakeFillet(TopOpeBRepDS_DataStructure& DStr,
const TopAbs_Orientation Ofpl,
const Standard_Boolean plandab)
{
- //calcul du conge cylindre.
+ //calculate the cylinder fillet.
- //plan deporte de radius
+ //plane deviated from radius
gp_Ax3 AxPln = Pln.Position();
gp_Dir NorPln = AxPln.XDirection().Crossed(AxPln.YDirection());
gp_Dir NorF(NorPln);
if (Or1 == TopAbs_REVERSED) { NorF.Reverse(); }
gp_Pln PlanOffset = Pln.Translated(Radius*gp_Vec(NorF));
- // Cylindre parallele
+ // Parallel cylinder
Standard_Real ROff = Cyl.Radius();
Standard_Boolean dedans = Standard_False;
}
else {
#ifdef DEB
- cout<<"le conge ne passe pas"<<endl;
+ cout<<"the fillet does not pass"<<endl;
#endif
return Standard_False;
}
- // intersection du plan parallele et du cylindre parallele.
+ // intersection of the parallel plane and of the parallel cylinder.
gp_Cylinder CylOffset(Cyl.Position(),ROff);
IntAna_QuadQuadGeo LInt(PlanOffset,CylOffset,
Precision::Angular(),Precision::Confusion());
}
else {return Standard_False;}
- // Construction conge
+ // Construction fillet
if (DirFillet.Dot(Spine.Direction()) < 0.) {DirFillet.Reverse();}
Standard_Real UOnCyl,VOnCyl,UOnPln,VOnPln;
OtherDir = tmp;
}
gp_Ax3 AxFil (OrFillet,DirFillet,XDir);
- // construction YDir pour aller de face1 vers face2.
+ // construction YDir to go from face1 to face2.
if ((XDir^OtherDir).Dot(DirFillet) < 0.)
AxFil.YReverse();
Fillet = new Geom_CylindricalSurface(AxFil,Radius);
Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(Fillet,DStr));
- // On charge les FaceInterferences avec les pcurves et courbes 3d.
- // edge plan-Fillet
+ // FaceInterferences are loaded with pcurves and curves 3D.
+ // edge plane-Fillet
gp_Pnt2d PPln2d(UOnPln,VOnPln);
gp_Dir2d VPln2d(DirFillet.Dot(AxPln.XDirection()),
DirFillet.Dot(AxPln.YDirection()));
ElSLib::CylinderD1(UOnFillet,V,AxFil,Radius,P,deru,derv);
gp_Dir NorFil(deru.Crossed(derv));
Standard_Boolean toreverse = ( NorFil.Dot(NorPln) <= 0. );
- // On regarde si l orientation du cylindre est la meme que celle
- // du plan.
+ // It is checked if the orientation of the cylinder is the same as of the plane.
if (toreverse) {Data->ChangeOrientation() = TopAbs::Reverse(Ofpl);}
else {Data->ChangeOrientation() = Ofpl;}
SetInterference(ChFiKPart_IndexCurveInDS(L3d,DStr),
trans,LFac,LFil);
- // edge cylindre-Fillet.
+ // edge cylinder-Fillet.
gp_Pnt2d PCyl2d(UOnCyl,VOnCyl);
gp_Dir2d DPC = gp::DY2d();
if (DirFillet.Dot(AxCyl.Direction()) < 0.) DPC.Reverse();
//=======================================================================
//function : MakeFillet
-//purpose : cas cylindre/plan ou plan/cylindre.
+//purpose : case cylinder/plane or plane/cylinder.
//=======================================================================
Standard_Boolean ChFiKPart_MakeFillet(TopOpeBRepDS_DataStructure& DStr,
const Standard_Boolean plandab)
{
-//calcul du conge (tore ou sphere).
+//calculation of the fillet (torus or sphere).
Standard_Boolean c1sphere = Standard_False;
gp_Ax3 PosPl = Pln.Position();
gp_Dir Dpnat = PosPl.XDirection().Crossed(PosPl.YDirection());
Or.Z()+Radius*Dp.Z());
gp_Pnt PtSp;
gp_Vec DSp;
- // Modification pour les PtSp trouves du mauvais cote de l'arete de couture.
+ // Modification for the PtSp found at the wrong side of the sewing edge.
gp_Pnt PtSp2;
gp_Vec DSp2;
Standard_Real acote = 1e-7;
ElCLib::D1(PR,Spine,PtSp2,DSp);
}
}
- // fin de modif
+ // end of modif
gp_Dir Dx(gp_Vec(Or,PtSp));
Dx = Dp.Crossed(Dx.Crossed(Dp));
gp_Dir Dy(DSp);
if(Abs(Rad) <= Precision::Confusion()){ c1sphere = Standard_True; }
else if(Rad < 0){
#ifdef DEB
- cout<<"le conge ne passe pas"<<endl;
+ cout<<"the fillet can't pass"<<endl;
#endif
return Standard_False;
}
Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(gtor,DStr));
}
- // On regarde si l orientation du conge est la meme que celle
- // des faces.
+ // It is checked if the orientation of the fillet is the same as of faces.
gp_Pnt P,PP;
gp_Vec deru,derv;
P.SetCoord(cPln.X()+Rad*Dx.X(),
if (toreverse) { Data->ChangeOrientation() = TopAbs_REVERSED; }
else { Data->ChangeOrientation() = TopAbs_FORWARD; }
- // On charge les FaceInterferences avec les pcurves et courbes 3d.
+ // FaceInterferences are loaded with pcurves and curves 3d.
- // La face plane.
+ // The plane face.
Handle(Geom2d_Circle) GCirc2dPln;
Handle(Geom_Circle) GCircPln;
gp_Ax2 circAx2 = FilAx3.Ax2();
trans,GCirc2dPln,GLin2dFil1);
}
- // La face cylindrique.
+ // The cylindrical face.
P.SetCoord(Or.X()+cylrad*Dx.X(),
Or.Y()+cylrad*Dx.Y(),
Or.Z()+cylrad*Dx.Z());
//=======================================================================
//function : ChFiKPart_Sphere
-//purpose : Construction d un conge spherique dont les contours ne sont
-// pas tous des isos, a partir de ses trois sommets.
+//purpose : Construction of a spherical fillet the contours which of
+// are not all isos, from three tops.
//=======================================================================
Standard_Boolean ChFiKPart_Sphere(TopOpeBRepDS_DataStructure& DStr,
const gp_Pnt2d& P1S2,
const gp_Pnt2d& P2S2)
{
- // Construction de la sphere :
- // - pole sud sur PS1
- // - origine des u donnee par P1S2
- // - u+ vers P2S2
+ // Construction of the sphere :
+ // - pole south on PS1
+ // - origine of u given by P1S2
+ // - u+ to P2S2
Standard_Real ptol = Precision::Confusion();
gp_Pnt p1,p2,p3;
dz = gp_Dir(gp_Vec(p1,cen));
if(Abs(ds1.Dot(dz)-1.)>ptol){
#ifdef DEB
- cout<<"centre du coin spherique non trouve"<<endl;
+ cout<<"center of the spherical corner not found"<<endl;
#endif
return Standard_False;
}
gsph = new Geom_SphericalSurface(FilAx3,Rad);
Data->ChangeSurf(ChFiKPart_IndexSurfaceInDS(gsph,DStr));
- // on compare la normale de la sphere a celle de la face
- // orientee pour determiner l orientation finale du conge.
+ // the normal of the sphere is compared to the normal of the face
+ // oriented to determine the final orientation of the fillet.
Standard_Boolean toreverse = ( ddz.Dot(df1) <= 0. );
if (toreverse) { Data->ChangeOrientation() = TopAbs_REVERSED; }
else { Data->ChangeOrientation() = TopAbs_FORWARD; }
- // On calcule les parametres de p2 et p3 sur la Sphere pour avoir
- // les ranges des courbes.
+ // Parameters of p2 and p3 are calculated on the Sphere to have
+ // ranges of curves.
Standard_Real uu1,vv1,uu2,vv2;
ElSLib::SphereParameters(FilAx3,Rad,p2,uu1,vv1);
uu1 = 0.;
ElSLib::SphereParameters(FilAx3,Rad,p3,uu2,vv2);
- // On charge les FaceInterferences avec les pcurves et courbes 3d.
+ // FaceInterferences are loaded with pcurves and curves 3d.
- // Le cote pointu.
+ // Pointed side.
Handle(Geom_Curve) C;
Handle(Geom2d_Curve) C2d;
SetInterference(ChFiKPart_IndexCurveInDS(C,DStr),
trans,C2d,C2dFil);
- // L autre cote.
+ // The other side.
Standard_Real ang = ddx.Angle(ddy);
gp_Dir dci = ddx.Crossed(ddy);
if (uco > ufin) {
if (Abs(theval)<PI) {
- // test si uco est dans le secteur oppose
+ // test if uco is in the opposite sector
if (uco > udeb+PI && uco < ufin+PI){
udeb = udeb + PI;
ufin = ufin + PI;
ElCLib::D1(uc1,cer,ptarr,vecarr);
gp_Ax1 ax1(ptarr, axisdir);
gp_Dir dirarr(-vecarr);
- //calcul de l'angle de rotation
+ //calculate angle of rotation
Standard_Real beta(0.);
Standard_Real length = LA->ArrowAspect()->Length();
if (length < Precision::Confusion()) length = 1.e-04;
}
else
{
- // Creating the arc from AttachmentPoint2 to its "projection"
+ // Creating the arc from AttachmentPoint2 to its projection
Standard_Real Alpha = Abs( LastParAttachCirc - FirstParAttachCirc );
Standard_Integer NodeNumber = Max (4 , Standard_Integer (50. * Alpha / PI));
Graphic3d_Array1OfVertex ApproxArc( 0, NodeNumber-1 );
if (uco > ufin) {
if (Abs(theval)<PI) {
- // test si uco est dans le secteur oppose
+ // test if uco is in the opposite sector
if (uco > udeb+PI && uco < ufin+PI){
udeb = udeb + PI;
ufin = ufin + PI;
ElCLib::D1(uc1,cer,ptarr,vecarr);
gp_Ax1 ax1(ptarr, Norm);
gp_Dir dirarr(-vecarr);
- //calcul de l'angle de rotation
+ //calculate the angle of rotation
Standard_Real beta;
Standard_Real length = LA->ArrowAspect()->Length();
if (length < Precision::Confusion()) length = 1.e-04;
//==========================================================================
// function : DsgPrs_AnglePresentation::Add
-// purpose : ODL 4-fevrier-97
-// on peut choisir le symbol des extremites de la cote (fleche, point ...)
+// purpose : It is possible to choose the symbol of extremities of the face (arrow, point...)
//==========================================================================
void DsgPrs_AnglePresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
if (uco > ufin) {
if (Abs(theval)<PI) {
- // test si uco est dans le secteur oppose
+ // test if uco is in the opposite sector
if (uco > udeb+PI && uco < ufin+PI){
udeb = udeb + PI;
ufin = ufin + PI;
Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,OffsetPoint);
-// Lignes de rappel
+// Lines of recall
gp_Vec vecarr;
gp_Pnt ptarr;
ElCLib::D1(uc1,cer,ptarr,vecarr);
gp_Ax1 ax1(ptarr, Norm);
gp_Dir dirarr(-vecarr);
- //calcul de l'angle de rotation
+ //calculate angle of rotation
Standard_Real beta(0.);
Standard_Real length = LA->ArrowAspect()->Length();
if (length < Precision::Confusion()) length = 1.e-04;
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrap);
-// On trace les fleches
+// One traces the arrows
DsgPrs::ComputeSymbol(aPresentation,LA,ptarr,ptarr1,dirarr,dirarr2,ArrowPrs);
}
if (uco > ufin) {
if (Abs(theval)<PI) {
- // test si uco est dans le secteur oppose
+ // test if uco is in the opposite sector
if (uco > udeb+PI && uco < ufin+PI){
udeb = udeb + PI;
ufin = ufin + PI;
ElCLib::D1(uc1,cer,ptarr,vecarr);
gp_Ax1 ax1(ptarr, Norm);
gp_Dir dirarr(-vecarr);
- //calcul de l'angle de rotation
+ //calculate the angle of rotation
Standard_Real beta;
Standard_Real length = LA->ArrowAspect()->Length();
if (length < Precision::Confusion()) length = 1.e-04;
//==========================================================================
// function : DsgPrs_Chamf2dPresentation::Add
-// purpose : ODL 4-fevrier-97
-// on peut choisir le symbol des extremites de la cote (fleche, point ...)
+// purpose : it is possible to choose the symbol of extremities of the face (arrow, point ...)
//==========================================================================
void DsgPrs_Chamf2dPresentation::Add(
//==========================================================================
// function : DsgPrs_DiameterPresentation::Add
-// purpose : ODL 4-fevrier-97
-// on peut choisir le symbol des extremites de la cote (fleche, point ...)
+// purpose : it is possible to choose the symbol of extremities of the face (arrow, point ...)
//==========================================================================
void DsgPrs_DiameterPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
const Handle(Prs3d_Drawer)& aDrawer,
Standard_Real parat = ElCLib::Parameter(aCircle, AttachmentPoint);
gp_Pnt ptoncirc = ElCLib::Value (parat, aCircle);
- // ligne de cote
+ // sideline
gp_Pnt center = aCircle.Location();
gp_Vec vecrap (ptoncirc,center);
// AspectText3d from Graphic3d
Standard_Real parEndOfArrow = ElCLib::Parameter(aCircle,AttachmentPoint); //
gp_Pnt EndOfArrow;
- gp_Pnt DrawPosition = AttachmentPoint;// attachment point
+ gp_Pnt DrawPosition = AttachmentPoint;// point of attachment
Standard_Boolean otherside = Standard_False;
gp_Pnt Center = aCircle.Location();
PointMax.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
- // trait de cote : 1er groupe
+ // face processing : 1st group
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
Prs3d_Root::NewGroup(aPresentation);
if (outside) {
arrdir.Reverse();
}
- // fleche 1 : 2eme groupe
+ // arrow 1 : 2nd group
Prs3d_Arrow::Draw(aPresentation,Proj1,arrdir,
LA->Arrow1Aspect()->Angle(),
LA->Arrow1Aspect()->Length());
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
- // fleche 2 : 3eme groupe
+ // arrow 2 : 3rd group
Prs3d_Arrow::Draw(aPresentation,Proj2,arrdir.Reversed(),
LA->Arrow2Aspect()->Angle(),
LA->Arrow2Aspect()->Length());
Prs3d_Root::NewGroup(aPresentation);
- // texte : 4eme groupe
+ // text : 4th group
Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
AttachmentPoint1.Coord(X,Y,Z);
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
- // trait de rappel 1 : 5eme groupe
+ // processing of call 1 : 5th group
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
AttachmentPoint2.Coord(X,Y,Z);
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
- // trait de rappel 2 : 6eme groupe
+ // processing of call 2 : 6th group
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
}
PointMax.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
- // trait de cote
+ // processing of face
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
Proj1.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
- // trait de rappel 1
+ // processing of call 1
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
AttachmentPoint2.Coord(X,Y,Z);
Proj2.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
- // trait de rappel 2
+ // processing of call 2
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- // texte
+ // text
Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
- // symbols aux extremites de la cote
+ // symbols at the extremities of the face
DsgPrs::ComputeSymbol(aPresentation,LA,Proj1,Proj2,arrdir,arrdir.Reversed(),ArrowPrs);
}
PointMax.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
- // trait de cote : 1er groupe
+ // processing of side : 1st group
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
Prs3d_Root::NewGroup(aPresentation);
if (outside) {
arrdir.Reverse();
}
- // fleche 1 : 2eme groupe
+ // arrow 1 : 2nd group
Prs3d_Arrow::Draw(aPresentation,Proj1,arrdir,
LA->Arrow1Aspect()->Angle(),
LA->Arrow1Aspect()->Length());
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
- // fleche 2 : 3eme groupe
+ // arrow 2 : 3rd group
Prs3d_Arrow::Draw(aPresentation,Proj2,arrdir.Reversed(),
LA->Arrow2Aspect()->Angle(),
LA->Arrow2Aspect()->Length());
Prs3d_Root::NewGroup(aPresentation);
- // texte : 4eme groupe
+ // text : 4th group
Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
AttachmentPoint1.Coord(X,Y,Z);
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
- // trait de rappel 1 : 5eme groupe
+ // processing of call 1 : 5th group
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
AttachmentPoint2.Coord(X,Y,Z);
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
- // trait de rappel 2 : 6eme groupe
+ // processing of call 2 : 6th group
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
}
//==========================================================================
// function : DsgPrs_ParalPresentation::Add
-// purpose : ODL 4-fevrier-97
-// on peut choisir le symbol des extremites de la cote (fleche, point ...)
+// purpose : it is possible to choose the symbol of extremities of the face (arrow, point...)
//==========================================================================
void DsgPrs_ParalPresentation::Add (const Handle(Prs3d_Presentation)& aPresentation,
const Handle(Prs3d_Drawer)& aDrawer,
PointMax.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
- // trait de cote
+ // processing of face
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) {
Proj1.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
- // trait de rappel 1
+ // processing of call 1
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
AttachmentPoint2.Coord(X,Y,Z);
Proj2.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
- // trait de rappel 2
+ // processing of call 2
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- // texte
+ // text
Prs3d_Text::Draw(aPresentation,LA->TextAspect(),aText,offp);
- //fleches
+ //arrows
DsgPrs::ComputeSymbol(aPresentation,LA,Proj1,Proj2,arrdir,arrdir.Reversed(),ArrowPrs);
gp_Pnt P1,P2;
//===================================
- // SYMETRIE D'EDGE PERPEND. A L'AXE
+ // SYMETRY OF EDGE PERPEND. TO THE AXIS
// ____ : ____
// edge2 | : -=- | edge 1
// |<------:------>|
/*//=======================================================
- // POUR EVITER LES CROISSEMENTS
- // P1 -=- P2 P2 -=- P1
- // \<-->/ |<-->|
- // \ / | |
- // \/ | |
- // /\ | |
- // / \ | |
- // Pattach2 /____\ Pattach1 Pattach2 /______\ Pattach1
- // / NON \ / OUI \
+ // TO AVOID CROSSING
+ // P1 -=- P2 P2 -=- P1
+ // \<-->/ |<-->|
+ // \ / | |
+ // \/ | |
+ // /\ | |
+ // / \ | |
+ // Pattach2 /____\ Pattach1 Pattach2 /______\ Pattach1
+ // / NO \ / YES \
//=======================================================
*/
P2 = PntTempo;
}
/* //===================================
- // CASSURES DES TRAITS DE RAPPEL
+ // FRACTURES OF TRAITS OF CALL
// / \
// / \
// | -=- |
if(aAxis.Distance(P1) > D1*(1 + coeff) && !Cross){
- //==== TRAIT DE COTE ===========
+ //==== PROCESSING OF FACE ===========
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Pj_P1 = ElCLib::Value(ElCLib::Parameter(aAxis,P1),aAxis);
P2.SetCoord(X,Y,Z);
//=================================
- // COTATION A L'EXTERIEUR
+ // LISTING AT THE EXTERIOR
// -=-
// ->|----------|<------
// | |
V(2).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //==== TRAIT DE RAPPEL 1 =====
+ //==== PROCESSING OF CALL 1 =====
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
AttachmentPoint1.Coord(X,Y,Z);
Vc(3).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vc);
- //==== TRAIT DE RAPPEL 2 =====
+ //==== PROCESSING OF CALL 2 =====
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
AttachmentPoint2.Coord(X,Y,Z);
}
/*//===================================
- // CASSURES DES TRAITS DE RAPPEL
+ // FRACTURES OF PROCESSING OF CALL
// -=-
// |<--------->|
// | |
*/
else if (aAxis.Distance(P1) < D1*(1 - coeff) || Cross) {
- //------ TRAIT DE COTE ------------
+ //------ PROCESSING OF FACE ------------
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Pj_P1 = ElCLib::Value(ElCLib::Parameter(aAxis,P1),aAxis);
P2.SetCoord(X,Y,Z);
//=================================
- // COTATION A L'EXTERIEUR
+ // LISTING AT THE EXTERIOR
// -=-
// ->|----------|<------
// | |
V(2).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //==== TRAIT DE RAPPEL 1 =====
+ //==== PROCESSING OF CALL 1 =====
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
AttachmentPoint1.Coord(X,Y,Z);
Vc(3).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vc);
- //==== TRAIT DE RAPPEL 2 =====
+ //==== PROCESSING OF CALL 2 =====
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
AttachmentPoint2.Coord(X,Y,Z);
}
else {
- //==== TRAIT DE COTE ===========
+ //==== PROCESSING OF FACE ===========
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
PointMin.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //==== TRAIT DE RAPPEL 1 =====
+ //==== PROCESSING OF CALL 1 =====
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
AttachmentPoint1.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //==== TRAIT DE RAPPEL 2 =====
+ //==== PROCESSING OF CALL 2 =====
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
AttachmentPoint2.Coord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
}
- //==== FLECHES ================
+ //==== ARROWS ================
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) outside = Standard_True;
gp_Dir arrdir = L3.Direction().Reversed();
if (outside) arrdir.Reverse();
- // fleche 1 ----
+ // arrow 1 ----
Prs3d_Arrow::Draw(aPresentation,P1,arrdir,
LA->Arrow1Aspect()->Angle(),
LA->Arrow1Aspect()->Length());
- // fleche 2 ----
+ // arrow 2 ----
Prs3d_Arrow::Draw(aPresentation,P2,arrdir.Reversed(),
LA->Arrow2Aspect()->Angle(),
LA->Arrow2Aspect()->Length());
- //--------------------------------------------------------------------------------------
- //| SYMBOLE DE SYMETRIE |
- //--------------------------------------------------------------------------------------
+ //-------------------------------------------------------------------------------------
+ //| SYMBOL OF SYMMETRY |
+ //-------------------------------------------------------------------------------------
- // ------- : Segment superieur
- // ----------- : Axe
- // ------- : Segment inferieur
+ // ------- : Superior Segment
+ // ----------- : Axis
+ // ------- : Inferior Segment
gp_Vec Vvar(P1,P2);
gp_Vec vec;
//pm = P1.Translated(Vvar.Multiplied(.5));
pOff = OffsetPoint.Translated(vecB);
- //Calcul des points extremes de l'axe du symbole
+ //Calculate the extremities of the symbol axis
gp_Vec vecAxe = vecA.Multiplied(.7);
pOff.Translated(vecAxe).Coord(X,Y,Z);
V(1).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //Calcul des points extremes du segment sup du symbole
+ //Calculate the extremities of the superior segment of the symbol
gp_Vec vec1 = vecAxe.Multiplied(.6);
vecAxe = Vaxe.Multiplied(vecAxe.Magnitude());
gp_Vec vec2 = vecAxe.Multiplied(.4);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //Calcul des points extremes du segment inf du symbole
+ //Calculate the extremities of the inferior segment of the symbol
pOff.Translated(vec1.Added(vec2.Reversed())).Coord(X,Y,Z);
V(1).SetCoord(X,Y,Z);
pOff.Translated(vec1.Reversed().Added(vec2.Reversed())).Coord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
/*//--------------------------------------------------------------------------------------
- //| REPERAGE DE L'AXE DE SYMETRIE |
+ //| MARKING OF THE SYMMETRY AXIS |
//--------------------------------------------------------------------------------------
// ____
- // \ / :Curseur
+ // \ / :Cursor
// \/
// /\
// /__\
Graphic3d_Array1OfVertex V(1,2);
Quantity_Length X,Y,Z;
- //==== TRAIT DE COTE ===========
+ //==== PROCESSING OF FACE ===========
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
PointMin.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //==== TRAIT DE RAPPEL 1 =====
+ //==== PROCESSING OF CALL 1 =====
Standard_Integer nbp = 10;
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
}
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vc1);
- //==== TRAIT DE RAPPEL 2 =====
+ //==== PROCESSING OF CALL 2 =====
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
gp_Pnt Center2 = ProjCenter1.Translated(Vp.Reversed());
}
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vc2);
- //==== FLECHES ================
+ //==== ARROWS ================
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) outside = Standard_True;
gp_Dir arrdir = L3.Direction().Reversed();
if (outside) arrdir.Reverse();
- // fleche 1 ----
+ // arrow 1 ----
Prs3d_Arrow::Draw(aPresentation,P1,arrdir,
LA->Arrow1Aspect()->Angle(),
LA->Arrow1Aspect()->Length());
- // fleche 2 ----
+ // arrow 2 ----
Prs3d_Arrow::Draw(aPresentation,P2,arrdir.Reversed(),
LA->Arrow2Aspect()->Angle(),
LA->Arrow2Aspect()->Length());
- //--------------------------------------------------------------------------------------
- //| SYMBOLE DE SYMETRIE |
- //--------------------------------------------------------------------------------------
+ //-------------------------------------------------------------------------------------
+ //| SYMBOL OF SYMMETRY |
+ //-------------------------------------------------------------------------------------
- // ------- : Segment superieur
- // ----------- : Axe
- // ------- : Segment inferieur
+ // ------- : Superior Segment
+ // ----------- : Axis
+ // ------- : Inferior Segment
gp_Vec Vvar(P1,P2);
gp_Vec vec;
pm = P1.Translated(Vvar.Multiplied(.5));
pOff = OffsetPnt.Translated(vecB);
- //Calcul des points extremes de l'axe du symbole
+ //Calculation of extremas of the axis of the symbol
gp_Vec vecAxe = vecA.Multiplied(.7);
pOff.Translated(vecAxe).Coord(X,Y,Z);
V(1).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //Calcul des points extremes du segment sup du symbole
+ //Calculation of extremas of the superior segment of the symbol
gp_Vec vec1 = vecAxe.Multiplied(.6);
vecAxe = Vaxe.Multiplied(vecAxe.Magnitude());
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //Calcul des points extremes du segment inf du symbole
+ //Calculation of extremas of the inferior segment of the symbol
pOff.Translated(vec1.Added(vec2.Reversed())).Coord(X,Y,Z);
V(1).SetCoord(X,Y,Z);
pOff.Translated(vec1.Reversed().Added(vec2.Reversed())).Coord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
/*//--------------------------------------------------------------------------------------
- //| REPERAGE DE L'AXE DE SYMETRIE |
+ //| MARKING OF THE AXIS OF SYMMETRY |
//--------------------------------------------------------------------------------------
// ____
- // \ / :Curseur
+ // \ / :Cursor
// \/
// /\
// /__\
if (AttachmentPoint1.IsEqual(AttachmentPoint2,Precision::Confusion())){
//==============================================================
- // CAS DE SYMETRIE OU LE POINT REFERENCE EST SUR L'AXE DE SYM.:
+ // SYMMETRY WHEN THE REFERENCE POINT IS ON THE AXIS OF SYM.:
//==============================================================
- //Marker de localisation de la cote
+ //Marker of localisation of the face
Handle(Graphic3d_AspectMarker3d) MarkerAsp = new Graphic3d_AspectMarker3d();
MarkerAsp->SetType(Aspect_TOM_BALL);
MarkerAsp->SetScale(0.8);
AttachmentPoint1.Z());
Prs3d_Root::CurrentGroup(aPresentation)->Marker(V3d);
- //Trace du segment de raccordement
+ //Trace of the linking segment
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Graphic3d_Array1OfVertex Vrac(1,2);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrac);
//--------------------------------------------------------------------------------------
- //| SYMBOLE DE SYMETRIE |
+ //| SYMBOL OF SYMMETRY |
//--------------------------------------------------------------------------------------
- // ------- : Segment superieur
- // ----------- : Axe
- // ------- : Segment inferieur
+ // ------- : Superior Segment
+ // ----------- : Axis
+ // ------- : Inferior Segment
- //Calcul des points extremes de l'axe du symbole
+ //Calculate extremas of the axis of the symbol
gp_Vec VAO (AttachmentPoint1,OffsetPoint);
gp_Vec uVAO = VAO.Divided(VAO.Magnitude());
gp_Pnt pDaxe = OffsetPoint.Translated(uVAO.Multiplied(3.));
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrac);
- //Calcul des points extremes du segment sup du symbole
+ //Calculate extremas of the superior segment of the symbol
gp_Vec nVAO (-uVAO.Y(),uVAO.X(),uVAO.Z());
gp_Pnt sgP11 = pDaxe.Translated(uVAO.Multiplied(2.).Added(nVAO.Multiplied(2.)));
gp_Pnt sgP12 = sgP11.Translated(uVAO.Multiplied(8.));
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrac);
- //Calcul des points extremes du segment inf du symbole
+ //Calculate extremas of the inferior segment of the symbol
gp_Vec nVAOr = nVAO.Reversed();
gp_Pnt sgP21 = pDaxe.Translated(uVAO.Multiplied(2.).Added(nVAOr.Multiplied(2.)));
gp_Pnt sgP22 = sgP21.Translated(uVAO.Multiplied(8.));
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(Vrac);
}
//==============================================================
- // AUTRES CAS :
+ // OTHER CASES :
//==============================================================
else{
Graphic3d_Array1OfVertex V(1,2);
Quantity_Length X,Y,Z;
- //==== TRAIT DE COTE ===========
+ //==== PROCESSING OF FACE ===========
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
PointMin.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //==== TRAIT DE RAPPEL 1 =====
+ //==== PROCESSING OF CALL 1 =====
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
AttachmentPoint1.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //==== TRAIT DE RAPPEL 2 =====
+ //==== PROCESSING OF CALL 2 =====
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
AttachmentPoint2.Coord(X,Y,Z);
V(2).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //==== FLECHES ================
+ //==== ARROWS ================
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
if (dist < (LA->Arrow1Aspect()->Length()+LA->Arrow2Aspect()->Length())) outside = Standard_True;
gp_Dir arrdir = L3.Direction().Reversed();
if (outside) arrdir.Reverse();
- // fleche 1 ----
+ // arrow 1 ----
Prs3d_Arrow::Draw(aPresentation,P1,arrdir,
LA->Arrow1Aspect()->Angle(),
LA->Arrow1Aspect()->Length());
- // fleche 2 ----
+ // arrow 2 ----
Prs3d_Arrow::Draw(aPresentation,P2,arrdir.Reversed(),
LA->Arrow2Aspect()->Angle(),
LA->Arrow2Aspect()->Length());
//==== POINTS ================
- //Marker de localisation des points d'attachement:
+ //Marker of localization of attachment points:
Prs3d_Root::NewGroup(aPresentation);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Handle(Graphic3d_AspectMarker3d) MarkerAspAtt = new Graphic3d_AspectMarker3d();
AttachmentPoint2.Z());
Prs3d_Root::CurrentGroup(aPresentation)->Marker(Vatt2);
- //--------------------------------------------------------------------------------------
- //| SYMBOLE DE SYMETRIE |
- //--------------------------------------------------------------------------------------
+ //-------------------------------------------------------------------------------------
+ //| SYMBOL OF SYMMETRY |
+ //-------------------------------------------------------------------------------------
- // ------- : Segment superieur
- // ----------- : Axe
- // ------- : Segment inferieur
+ // ------- : Superior Segment
+ // ----------- : Axis
+ // ------- : Inferior Segment
gp_Vec vec(P1,P2);
gp_Vec vecA = vec.Multiplied(.1);
pm = P1.Translated(vec.Multiplied(.5));
pOff = OffsetPoint.Translated(vecB);
- //Calcul des points extremes de l'axe du symbole
+ //Calculate the extremas of the axis of the symbol
gp_Vec vecAxe = vecA.Multiplied(.7);
pOff.Translated(vecAxe).Coord(X,Y,Z);
V(1).SetCoord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //Calcul des points extremes du segment sup du symbole
+ //Calculate the extremas of the superior segment of the symbol
gp_Vec vec1 = vecAxe.Multiplied(.6);
vecAxe = Vaxe.Multiplied(vecAxe.Magnitude());
Prs3d_Root::CurrentGroup(aPresentation)->SetPrimitivesAspect(LA->LineAspect()->Aspect());
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
- //Calcul des points extremes du segment inf du symbole
+ //Calculate the extremas of the inferior segment of the symbol
pOff.Translated(vec1.Added(vec2.Reversed())).Coord(X,Y,Z);
V(1).SetCoord(X,Y,Z);
pOff.Translated(vec1.Reversed().Added(vec2.Reversed())).Coord(X,Y,Z);
Prs3d_Root::CurrentGroup(aPresentation)->Polyline(V);
/* //--------------------------------------------------------------------------------------
- //| REPERAGE DE L'AXE DE SYMETRIE |
+ //| MARKING OF THE AXIS OF SYMMETRY |
//--------------------------------------------------------------------------------------
// ____
- // \ / :Curseur
+ // \ / :Cursor
// \/
// /\
// /__\
// Created: Wed Jun 24 12:49:59 1992
// Author: Gilles DEBARBOUILLE
// <gde@phobox>
-// Historique :
-// CRD : 03/07/97 : Portage Windows NT.
+// History :
+// CRD : 03/07/97 : Porting Windows NT.
#include <Standard_Stream.hxx>
const Standard_CString avalue) const
{
Handle(Dynamic_ObjectParameter) objectparameter;
- cout<<"Le parametre "<<aname<<" du type "<<atype<<" avec "<<avalue<<" n'existe pas."<<endl;
+ cout<<"Parameter "<<aname<<" of type "<<atype<<" with "<<avalue<<" does not exist."<<endl;
return objectparameter;
}
// Author: Gilles DEBARBOUILLE
// <gde@phobox>
// Historique :
-// CRD : 15/04/97 : Passage WOK++ : Remplacement de TYPE par STANDARD_TYPE
-// CRD : 03/07/97 : Portage Windows NT.
+// CRD : 15/04/97 : Passage WOK++ : Replace TYPE by STANDARD_TYPE
+// CRD : 03/07/97 : Porting Windows NT.
#include <Standard_Stream.hxx>
}
else
{
- cout<<"la definition n'est pas une method definition"<<endl;
+ cout<<"the definition is not a method definition"<<endl;
return Standard_False;
}
}
const Standard_CString avalue) const
{
Handle(Dynamic_ObjectParameter) objectparameter;
- cout<<"Le parametre "<<aname<<" du type "<<atype<<" avec "<<avalue<<" n'existe pas."<<endl;
+ cout<<"Parameter "<<aname<<" of type "<<atype<<" with "<<avalue<<" does not exist."<<endl;
return objectparameter;
}
gp_Pnt pdeb = Ed->Value(f);
gp_Pnt pfin = Ed->Value(l);
Standard_Real u,v;
- //on regarde si les extremites ne sont pas solution
+ //check if the extremities are not solution
ElSLib::Parameters(P,pdeb,u,v);
gp_Pnt projdeb = ElSLib::Value(u,v,P);
Standard_Real dprojdeb = pdeb.Distance(projdeb);
//=======================================================================
//function : Add
-//purpose : creation d une spine sur un paquet d'aretes
+//purpose : creation of spine on a set of edges
//
-// 0 : pas de probleme
-// 1 : liste vide
-// 2 : aretes non g1
-// 3 : faces adjacentes non G1
-// 4 : l'arete n'est pas sur le shape
-// 5 : l'arete n'est pas vive
+// 0 : no problem
+// 1 : empty list
+// 2 : non g1 edges
+// 3 : non G1 adjacent faces
+// 4 : edge is not on the shape
+// 5 : edge is not alive
//=======================================================================
Standard_Integer FilletSurf_InternalBuilder::Add(const TopTools_ListOfShape& E,
TopoDS_Edge cured = TopoDS::Edge(It.Value());
if(cured.IsNull()) return 4;
if(!myEFMap.Contains(cured)) return 4;
- //on controle que l arete est bien une arete de cassure
+ //check if the edge is a fracture edge
TopoDS_Face ff1,ff2;
for(It.Initialize(myEFMap(cured));It.More();It.Next()){
if (ff1.IsNull()) {
Handle(ChFiDS_Spine)& sp = st->ChangeSpine();
Standard_Boolean periodic = sp->IsPeriodic();
- //On controle que les aretes de la liste E sont bien dans le contour,
- //on retire les aretes du contour qui ne sont pas dans la liste,
- //on controle que le residu est bien monobloc.
+ //It is checked if edges of list E are in the contour,
+ //the edges that arenot in the list are removed from the contour,
+ //it is checked that the remainder is monoblock.
for(It.Initialize(E); It.More(); It.Next()){
TopoDS_Edge cured = TopoDS::Edge(It.Value());
sp = newsp;
}
- //On construit l ElSpine dans la foulee
+ //ElSpine is immediately constructed
Handle(ChFiDS_HElSpine) hels = new ChFiDS_HElSpine();
gp_Vec TFirst,TLast;
gp_Pnt PFirst,PLast;
void FilletSurf_InternalBuilder::Perform()
{
- //On se contente d un PerformSetOfSurfOnElSpine.
+ //PerformSetOfSurfOnElSpine is enough.
Handle(ChFiDS_Stripe) Stripe = myListStripe.First();
Handle(ChFiDS_HData)& HData = Stripe->ChangeSetOfSurfData();
Handle(ChFiDS_SurfData) Data = SeqData(1);
Handle(ChFiDS_FilSpine) fsp = Handle(ChFiDS_FilSpine)::DownCast(Spine);
if(fsp.IsNull()) Standard_ConstructionError::Raise
- ("PerformSurf : la spine n est pas celle d un conge");
+ ("PerformSurf : this is not the spine of a fillet");
Handle(BRepBlend_Line) lin;
TopAbs_Orientation Or = S1->ChangeSurface().Face().Orientation();
if(!fsp->IsConstant()) Standard_ConstructionError::Raise
- ("PerformSurf : pas de rayons variables");
+ ("PerformSurf : no variable radiuses");
// Standard_Boolean maybesingular; //pour scinder les Surfdata singulieres
BRepBlend_ConstRad Func(S1,S2,Guide);
Standard_False, Data->ChangeVertexLastOnS2(), tolesp);
}
done = CompleteData(Data,Func,lin,S1,S2,Or,0,0,0,0);
- if(!done) Standard_Failure::Raise("PerformSurf : Echec approximation!");
+ if(!done) Standard_Failure::Raise("PerformSurf : Failed approximation!");
// maybesingular = (Func.GetMinimalDistance()<=100*tolapp3d);
Standard_Boolean ok = 0;
if(!Forward){
#define PERF //GG_270298
-// Eviter d'appeler IsKind() qui est couteux.
#ifdef WNT
if( i <= myObjects.Length() ) {
myObjects.Remove(i) ;
- // pas tres astucieux mais qui va utiliser Remove (anObject) ?
+ // not very clever, but who will use Remove (anObject) ?
for( j=1 ; j<=anObject->Length() ; j++ ) {
Remove(anObject->Primitive(j)) ;
}
myBufferId = this->HashCode(IntegerLast());
- // On a demande l'epaisseur maximum des primitives lignes
- // contenues dans le buffer
+ // Maximum depth of primitive lines
+ // contained in the buffer is required
if (theWidthIndex < 0) {
Standard_Real theWidthMax;
- // Il n'y a pas de primitives lignes => epaisseur par defaut
+ // There are no primitive lines => thickness by default
if (! MaxWidth (theWidthMax, theWidthIndex))
theWidthIndex = 0;
}
- // On demande la font de la 1ere primitive text du buffer
+ // The font of the 1st primitive text from the buffer is required
if( theFontIndex < 0) {
Standard_Integer i;
Handle(Graphic2d_Primitive) agp;
if( theFontIndex < 0 ) theFontIndex = 0;
}
- // On demande la couleur de la 1ere primitive du buffer
+ // The color of the 1st primitive from the buffer is required
if( theColorIndex < 0) {
Standard_Integer i;
for (i=1; i<=myPrimitives.Length(); i++) {
#else
if (agp->IsKind (STANDARD_TYPE (Graphic2d_Line))) {
#endif
- // Il y a des lignes dans le Buffer
- // et non pas de la friture sur la ligne
+ // There are lines in the Buffer
+ // and not by fracture on the line
Result = Standard_True;
IndexCur =
(*(Handle(Graphic2d_Line) *) &agp)->WidthIndex ();
if ((IndexCur <= 0) || (IndexCur > size)) {
- // Cas des epaisseurs non precisees, IndexCur == 0
- // ou alors il y a vraiment un gros probleme !
+ // Case when thicknesses are not precised, IndexCur == 0
+ // or there is a really huge problem !
}
else {
- // +1 car dans la table il y a en 1 une entry par defaut
- // qui definit une epaisseur par defaut
+ // +1 because in the table there is 1 default entry
+ // which defines default thickness
WidthCur = (theWidthMap->Entry (IndexCur+1)).Width ();
if (theWidth < WidthCur) {
theWidth = WidthCur;
aTrsf.Transforms (A, B);
a = Standard_ShortReal (A); b = Standard_ShortReal (B);
if( Abs(f-e) < Standard_ShortReal(2.*Standard_PI) ) {
- // Pour calculer les nouveaux angles d'ouverture
- // le calcul est fait sur le cercle trigonometrique
- // et l'on tient pas compte dans ce cas de la translation
- // sauf pour les transformation de type Mirror
- // dont le determinant est negatif.
+ // To calculate new aperture angles
+ // the calculation is done on the trigonometric circle
+ // and in this case the translation is not taken into account
+ // except for transformations of type Mirror
+ // with negative determinant.
#ifndef BUC50076
aTrsf.SetValue (1, 3, 0.0);
aTrsf.SetValue (2, 3, 0.0);
// Modified 23/02/98 : FMN ; Remplacement PI par Standard_PI
// Modified 16/03/98 GG
// OPTIMISATION
-// Ajouter un champs myWDriver et myPDriver initialise correctement
-// lorsque le driver est du type "WindowDriver" ou "plotterdriver".
-// Eviter l'appel des contructeurs vides.
+// Add fields myWDriver and myPDriver initializing correctly
+// when the driver is "WindowDriver" or "plotterdriver".
+// Avoid call of empty contructors.
#define CTS17857//GG_200897
-// Permettre d'inhiber le clipping sur les primitives.
+// Allow suppressing clipping on primitives.
#define CSR_PRO12324 //SYL_030798
-// le Plot d'un objet en echo doit se faire en normal
+// the Plot of an objet should be a normal
#define DCB_220798 // DCB
// Using pointers to drivers instead of handles
Standard_Boolean status = Standard_True;
if ( dx == 0. ) {
- // Bug de rejection des lignes infinies
+ // Bug with rejection of infinite lines
// if ( my >= 0. && my <= mySpaceHeight )
x1 = mx; y1 = 0.; x2 = mx; y2 = mySpaceHeight;
}
else if ( dy == 0.) {
- // Bug de rejection des lignes infinies
+ // Bug with rejection of infinite lines
// if ( mx >= 0. && mx <= mySpaceWidth )
x1 = 0.; y1 = my; x2 = mySpaceWidth; y2 = my;
}
/*=====================================================================
- FONCTION :
+ FUNCTION :
----------
- Classe Graphic2d_Ellips
+ Class Graphic2d_Ellips
TEST :
------
Voir TestG2D/TestG21
- REMARQUES:
+ NOTES:
----------
- HISTORIQUE DES MODIFICATIONS :
+ HISTORY OF MODIFICATIONS :
--------------------------------
27-01-98 : GG ; OPTIMISATION LOADER
- Transformer les variables static globales en static
- locales.
+ Transform global static variables into static locals.
=====================================================================*/
#define G002 //Add new DrawElement(), DrawVertex() methods
myAngle =Standard_ShortReal(anAngle);
- // Cas de l'ellipse horizontale
+ // Case of horizontal ellipse
if (Abs (anAngle) <= RealEpsilon ()) {
myMinX = myX - myMajorRadius;
myMaxX = myX + myMajorRadius;
}
}
}
- Standard_ShortReal xf1,yf1,xf2,yf2; //Les foyers.
+ Standard_ShortReal xf1,yf1,xf2,yf2; //Sources.
Standard_ShortReal q =
Standard_ShortReal(Sqrt( Abs( myMajorRadius*myMajorRadius - myMinorRadius*myMinorRadius) ));
Standard_ShortReal cos = Standard_ShortReal(Cos(myAngle));
Standard_ShortReal sin = Standard_ShortReal(Sin(myAngle));
- //Focus 1 et 2 calcules pour l' ellipse dont le centre
- // est ramene a l' origine du repere(0,0)
+ // Focus 1 and 2 calculated for the ellipse with centre
+ // at the origin of mark(0,0)
xf1 = q*cos;
yf1 = q*sin;
xf2 = -q*cos;
SetPickedIndex( 0 );
}
#else
- Standard_ShortReal xf1,yf1,xf2,yf2; //Les foyers.
+ Standard_ShortReal xf1,yf1,xf2,yf2; //Sourses.
Standard_ShortReal Xp, Yp;
Standard_ShortReal q =
Sqrt( Abs( myMajorRadius*myMajorRadius - myMinorRadius*myMinorRadius) );
Standard_ShortReal cos = Cos (myAngle);
Standard_ShortReal sin = Sin (myAngle);
- //Focus 1 et 2 calcules pour l' ellipse dont le centre
- // est ramene a l' origine du repere(0,0)
+ // Focus 1 and 2 calculated for the ellipse with centre
+ // at the origin of mark(0,0)
xf1 = q*cos;
yf1 = q*sin;
xf2 = -q*cos;
Standard_ShortReal cos = Standard_ShortReal( Cos(myAngle) );
Standard_ShortReal sin = Standard_ShortReal( Sin(myAngle) );
- //Focus 1 et 2 calcules pour l' ellipse dont le centre
+ //Focus 1 and 2 calcules pour l' ellipse dont le centre
// est ramene a l' origine du repere(0,0)
xf1 = Standard_ShortReal( q * cos );
yf1 = Standard_ShortReal( q * sin );
// S3824 10/06/98 : GG ;
-// 1) La methode "Fit" comporte un argum optionnel supplementaire
-// "Expand" permettant de ne pas ajuster la largeur du texte
-// lorsque celle ci est < a la taille du FIT.
-// 2) La methode "Trunc" permet de tronquer le texte a la
-// taille precisee.
+// 1) Method "Fit" includes optional argument
+// "Expand" allowing to avoid adjusting text width
+// when it is less then size of FIT.
+// 2) Method "Trunc" allows trunkating the text to the
+// exact size.
#define PRO14304 //GG_160698
-// Corrige une erreur de calcul sur les MINMAX provoquant
-// la disparition du text
#define PERF //GG_200898
// The MinMax are now computed at the right time and no more
cosa -= A; sina -= B;
if( aTrsf.IsNegative() ) hscale = - hscale;
#else
- // Pour calculer les nouveaux angles d'ouverture
- // le calcul est fait sur le cercle trigonometrique
- // et l'on tient pas compte dans ce cas de la translation.
+ // To calculate new aperture angles
+ // the calculation is done on the trigonometric circle
+ // and taken into account in case of translation.
aTrsf.SetValue (1, 3, 0.0);
aTrsf.SetValue (2, 3, 0.0);
aTrsf.Transforms (cosa, sina);
//
// S3593 //GG_270298
-// Eviter d'appeler IsKind() qui est couteux.
-// Ajouter un champs myIsUpToDate permettant de savoir
-// si l'objet est a jour.
-// Ajouter un champs myIsTransformed permettant de savoir
-// si l'objet est transforme.
+// Avoid calling IsKind() which is expensive.
+// Add field myIsUpToDate informing if the object is updated.
+// Add field myIsTransformed informing if the object is transformed.
//
#define G002 //GG_140400
#ifdef OK
//
- // Pour retracer ce qui est necessaire
- // On parcourt les primitives de 1 jusqu'a Index
- // et on recupere l'Index de la premiere primitive
- // dont le rectangle englobant intersecte celui
- // de la primitive retiree.
+ // To retrace whatever is necessary
+ // Parse the primitives from 1 to Index
+ // and return l'Index of the first primitive
+ // with bounding box intersecting the bounding
+ // box of the removed primitive.
//
Standard_Boolean stop = Standard_False;
Standard_ShortReal sMinx, sMiny, sMaxx, sMaxy;
for (Standard_Integer i=1; i<Index && ! stop; i++) {
(Primitive (i))->MinMax (x, X, y, Y);
//
- // Les lignes infinies
+ // Infinite lines
//
if ((x == RF) || (X == RL) || (y == RF) || (Y == RL)) {
- // infinie horizontale
+ // infinite horizontal
if (y == Y) stop = (sMiny <= y) && (y <= sMaxy);
- // infinie verticale
+ // infinite vertical
if (x == X) stop = (sMinx <= x) && (x <= sMaxx);
- // infinie oblique
+ // infinite diagonal
if ((y != Y) && (x != X)) {
- // Pb pas d'interrogation possible
- // sur le contenu de la primitive.
+ // no interrogation possible
+ // about the content of the primitive.
stop = Standard_True;
}
}
(thePrimitive->Family() == Graphic2d_TOP_MARKER);
if (! TheFlag) {
if( thePrimitive->MinMax (x, X, y, Y) ) {
- // Tests pour cause de lignes infinies
+ // Tests for cause of infinite lines
if (x != RF) sMinx = (sMinx < x ? sMinx : x);
if (X != RL) sMaxx = (sMaxx > X ? sMaxx : X);
if (y != RF) sMiny = (sMiny < y ? sMiny : y);
}
}
- // Attention, il se peut que :
- // sMinx = sMiny = ShortRealLast (); et
+ // Attention, it is possible that :
+ // sMinx = sMiny = ShortRealLast (); and
// sMaxx = sMaxy = ShortRealFirst();
if (sMinx > sMaxx) {
status = Standard_False;
(thePrimitive->Family() == Graphic2d_TOP_MARKER);
if (TheFlag) {
if( thePrimitive->MinMax (x, X, y, Y) ) {
- // Tests pour cause de lignes infinies
+ // Tests for cause of infinite lines
if (x != RF) sMinx = (sMinx < x ? sMinx : x);
if (X != RL) sMaxx = (sMaxx > X ? sMaxx : X);
if (y != RF) sMiny = (sMiny < y ? sMiny : y);
}
}
- // Attention, il se peut que :
- // sMinx = sMiny = ShortRealLast (); et
+ // Attention, it is possible that :
+ // sMinx = sMiny = ShortRealLast (); and
// sMaxx = sMaxy = ShortRealFirst();
if (sMinx > sMaxx) {
status = Standard_False;
#define PRO6894 //GG_150197
-// Completer les cas de justification des textes
+// Complete cases of text justification
// S3824 10/06/98 : GG ;
-// 1) La methode "Fit" comporte un argum optionnel supplementaire
-// "Expand" permettant de ne pas ajuster la largeur du texte
+// 1) Method "Fit" includes optional argument
+// "Expand" allowing to not adjust the text width
// lorsque celle ci est < a la taille du FIT.
-// 2) La methode "Trunc" permet de tronquer le texte a la
-// taille precisee.
+// 2) Method "Trunc" allows truncating the text to the
+// indicated size.
#define PRO14304 //GG_160698
-// Corrige une erreur de calcul sur les MINMAX provoquant
-// la disparition du text
+// Correct calculation error on MINMAX causing
+// the text to disappear
#define PERF //GG_200898
// The MinMax are now computed at the right time and no more
cosa -= A; sina -= B;
if( aTrsf.IsNegative() ) hscale = - hscale;
#else
- // Pour calculer les nouveaux angles d'ouverture
- // le calcul est fait sur le cercle trigonometrique
- // et l'on tient pas compte dans ce cas de la translation.
+ // To calculate new aperture angles
+ // calculation is done on the trigonometric circle
+ // and in this case translation is taken into account.
aTrsf.SetValue (1, 3, 0.0);
aTrsf.SetValue (2, 3, 0.0);
aTrsf.Transforms (cosa, sina);
#define WTO0001 //GG_140596
-// Calcul des min-max faux apres transformation.
#define PRO5663 //GG_291196
-// Renseigner les MinMax de l'image !.
#include <Graphic2d_Image.ixx>
#include <Graphic2d_Image.pxx>
else
FillAndDraw (aDrawer);
- // Dans le cas d'un GraphicObject Highlighted
- // on trace le rectangle englobant de l'image
+ // In case of GraphicObject Highlighted
+ // bounding box of the image is traced
if (myGOPtr->IsHighlighted ()) {
Standard_Integer Width = myImage->Width ();
Standard_Integer Height = myImage->Height ();
//
- // - 2 sur Width et Height pour eviter que
- // le bord soit en dehors de l'image.
+ // - 2 on Width and Height to avoid
+ // border outside of the image.
//
if (Width > 2) Width -= 2;
if (Height > 2) Height -= 2;
UpperY = myImage->UpperY ();
if (Height*Width <= Graphic2d_Image::SmallSize ()) {
- // Les petites images sont remplies d'un coup
+ // Small images are filled at once
pixels = new Aspect_RGBPixel [Height*Width];
Quantity_Array1OfColor Array (0, Width-1);
- // Parcours de l'image Lignes-Colonnes (Height-Width)
+ // Parsing of the image Lines-Columns (Height-Width)
for (i=0, ii=LowerY; ii<=UpperY; i++, ii++) {
myImage->RowColor (ii, Array);
for (j=0; j<Width; j++) {
delete [] pixels;
}
else {
- // Les grandes images sont remplies ligne a ligne
+ // Great images are filled line by line
pixels = new Aspect_RGBPixel [Width];
Quantity_Array1OfColor Array (0, Width-1);
- // Parcours de l'image Lignes-Colonnes (Height-Width)
+ // Parsing of image Lines-Columns (Height-Width)
for (i=0, ii=LowerY; ii<=UpperY; i++, ii++) {
myImage->RowColor (ii, Array);
for (j=0; j<Width; j++) {
/*=====================================================================
- FONCTION :
+ FUNCTION :
----------
- Classe Graphic2d_ImageFile
+ Class Graphic2d_ImageFile
TEST :
------
- Voir TestG2D/TestG21
+ See TestG2D/TestG21
- REMARQUES:
- ----------
-
- HISTORIQUE DES MODIFICATIONS :
- --------------------------------
-
- 27-01-98 : GG ; OPTIMISATION LOADER
- Transformer les variables static globales en static
- locales.
-
- 05-11-97 : GG : JAP60017
- Nouvelle methode SetScale(...) pour pouvoir
- changer le facteur d'echelle de l'image dynamiquement
-
- 11-07-97 : GG ; BUC50015
- Tenir compte de l'attribut Zoomable de l'image
- pour en determiner les MIN-MAX.
=====================================================================*/
#define S3593 //GG_100398
-// Optimisation concernant le chargement des images,
-// eviter de recharger des images deja chargees!
-// Utiliser les methodes du driver qui sont optimisees.
#define xTRACE
Standard_ShortReal scale = (myIsZoomable) ? Standard_ShortReal(aDrawer->Scale()) : Standard_ShortReal(1.);
aDrawer->DrawImageFile (myFileName.ToCString(), Xc, Yc, scale*myScale);
- // Dans le cas d'un GraphicObject Highlighted
- // on trace le rectangle englobant de l'image
+ // In case of GraphicObject Highlighted
+ // the bounding box of the image is traced
if (myGOPtr->IsHighlighted ()) {
#ifdef TRACE
Standard_Boolean Reopen = Standard_False;
aWidth = aHeight = aDepth = 0;
if (aFile.IsOpen () && aFile.IsLocked()) {
- cout << "Can't analyse an locked file.\n" << flush;
+ cout << "Can't analyse a locked file.\n" << flush;
return Result;
}
Voir TestG2D/TestG21
- REMARQUES:
- ----------
-
- HISTORIQUE DES MODIFICATIONS :
- --------------------------------
-
- 27-01-98 : GG ; OPTIMISATION LOADER
- Transformer les variables static globales en static
- locales.
- 23/02/98 : FMN ; Remplacement PI par Standard_PI
-
=====================================================================*/
#define PRO12982 //GG_230498
-// Prendre en compte le soulignement dans le calcul de la taille
-// du paragraphe.
+// Take into account the underlining in calculation of
+// paragraph size.
#define PRO11004 //GG_051197
-// Le pourtour du paragraphe n'est pas un rectangle
+// The contour of the paragraph is not rectangle
#define PRO11005 //GG_131197
-// La couleur de fond du paragraphe n'est pas respectee
-// En mode Highlight,on ne voit plus les textes.
+// Text can't be seen in mode Highlight.
#define PRO11041 //GG_201197
-// Modification de SetCurrentFont(...,aHScale,aWScale)
-// de maniere a pouvoir parametrer la taille du texte.
+// Modification of SetCurrentFont(...,aHScale,aWScale)
+// to parameterize the size of the text.
#define PRO12320//GG_120297
-// Espacer les textes en fonction de la hauteur capitalisee de la
-// chaine de caracteres.
+// Compose texts depending on the summary height of the
+// chain of characters.
#define PERF //GG_200898
// The MinMax are now computed at the right time and no more
aTrsf.Transforms (A, B);
- // Pour calculer les nouveaux angles d'ouverture
- // le calcul est fait sur le cercle trigonometrique
- // et l'on tient pas compte dans ce cas de la translation.
+ // To calculate new aperture angles
+ // the calculation is done on trigonometric circle
+ // and in this case translation is not taken into account.
aTrsf.SetValue (1, 3, 0.0);
aTrsf.SetValue (2, 3, 0.0);
aTrsf.Transforms (cosa, sina);
Standard_ShortReal twidth = 0.,theight = 0.,txoffset = 0.,tyoffset = 0.;
Standard_ShortReal lwidth = 0.,lheight = 0.,loffset = 0.;
myWidth = myHeight = 0. ;
- for( i=1,j=lrow=0 ; i<=length ; i++ ) { // Passe 1,gets texts minmax
+ for( i=1,j=lrow=0 ; i<=length ; i++ ) { // Passe 1, gets texts minmax
descriptor = myTextDescriptorList.Value(i) ;
atext = myTextStringList.Value(i) ;
hscale = scale*myTextHScaleList.Value(i) ;
Voir TestG2D/TestG21
- REMARQUES:
- ----------
-
- HISTORIQUE DES MODIFICATIONS :
- --------------------------------
-
- 27-01-98 : GG ; OPTIMISATION LOADER
- Transformer les variables static globales en static
- locales.
- 10-12-97 : GG ; Envoyer plutot des polylines que des segments lorsque
- le type de trait n'est pas SOLID de maniere a assurer
- la continuite.
=====================================================================*/
// PRO13369 //GG_280498
-// Attention sous WNT
-// MapPolylineFromTo() doit etre appele avec le
-// nombre exacte de points
+// MapPolylineFromTo() should be called with exact number of points
#define G002 //GG_140400 Use SetPickedIndex method
if( V1.IsEqual(P->Value(lv)) ) {
//first vertex of segment is the same that the last vertex of the
//ref line
- if( ip > 1 ) { //Try to concatenates ref line with others
+ if( ip > 1 ) { //Try to concatenate ref line with others
for( ipp=1 ; ipp<ip ; ipp++ ) {
PP = myPolylines.Value(ipp); //other polyline
if( V2.IsEqual(PP->Value(1)) ) {
} else if( V2.IsEqual(P->Value(lv)) ) {
//second vertex of segment is the same that the last vertex of the
//ref line
- if( ip > 1 ) { //Try to concatenates ref line with others
+ if( ip > 1 ) { //Try to concatenate ref line with others
for( ipp=1 ; ipp<ip ; ipp++ ) {
PP = myPolylines.Value(ipp); //other polyline
if( V1.IsEqual(PP->Value(1)) ) {
} else if( V1.IsEqual(P->Value(1)) ) {
//first vertex of segment is the same that the first vertex of the
//ref line
- if( ip > 1 ) { //Try to concatenates ref line with others
+ if( ip > 1 ) { //Try to concatenate ref line with others
for( ipp=1 ; ipp<ip ; ipp++ ) {
PP = myPolylines.Value(ipp); //other polyline
if( V2.IsEqual(PP->Value(PP->Length())) ) {
} else if( V2.IsEqual(P->Value(1)) ) {
//second vertex of segment is the same that the first vertex of the
//ref line
- if( ip > 1 ) { //Try to concatenates ref line with others
+ if( ip > 1 ) { //Try to concatenate ref line with others
for( ipp=1 ; ipp<ip ; ipp++ ) {
PP = myPolylines.Value(ipp); //other polyline
if( V1.IsEqual(PP->Value(PP->Length())) ) {
-// Modified 23/02/98 : FMN ; Remplacement PI par Standard_PI
-// S3824 10/06/98 : GG ;
-// 1) La methode "Fit" comporte un argum optionnel supplementaire
-// "Expand" permettant de ne pas ajuster la largeur du texte
-// lorsque celle ci est < a la taille du FIT.
-// 2) La methode "Trunc" permet de tronquer le texte a la
-// taille precisee.
#define PERF //GG_200898
// The MinMax are now computed at the right time and no more
cosa -= A; sina -= B;
if( aTrsf.IsNegative() ) hscale = - hscale;
#else
- // Pour calculer les nouveaux angles d'ouverture
- // le calcul est fait sur le cercle trigonometrique
- // et l'on tient pas compte dans ce cas de la translation.
+ // To calculate new aperture angles
+ // calculation is done on the trigonometric circle
+ // and in this case translation is not taken into account.
aTrsf.SetValue (1, 3, 0.0);
aTrsf.SetValue (2, 3, 0.0);
aTrsf.Transforms (cosa, sina);
#define xTRACE
#define CSR_PRO12324 //SYL_030798
-// Pas de plot si objet non plottable
+// No plot if object not plottable
//
// Modified 17/12/1998 SYL pour S3604
// Aspect_PlotterDriver devient PlotMgt_PlotterDriver
for (i=1; i<=Length; i++) {
myGraphicObjects.Value (i)->MinMax (x, X, y, Y);
- // Le GraphicObject peut etre vide
+ // GraphicObject can be empty
if (x > RF) Minx = (Minx < x ? Minx : x);
if (X < RL) Maxx = (Maxx > X ? Maxx : X);
if (y > RF) Miny = (Miny < y ? Miny : y);
if (Y < RL) Maxy = (Maxy > Y ? Maxy : Y);
}
- // Attention, il se peut que :
- // Minx = Miny = ShortRealLast (); et
+ // Attention, it is possible that :
+ // Minx = Miny = ShortRealLast (); and
// Maxx = Maxy = ShortRealFirst();
if (Minx > Maxx) { Minx = RealFirst (); Maxx = RealLast (); }
if (Miny > Maxy) { Miny = RealFirst (); Maxy = RealLast (); }
for (i=1; i<=Length; i++) {
if (IsIn (aList->Value(i))) {
(aList->Value(i))->MinMax (x, X, y, Y);
- // Le GraphicObject peut etre vide
+ // GraphicObject can be empty
if (x > RF) Minx = (Minx < x ? Minx : x);
if (X < RL) Maxx = (Maxx > X ? Maxx : X);
if (y > RF) Miny = (Miny < y ? Miny : y);
}
}
- // Attention, il se peut que :
- // Minx = Miny = ShortRealLast (); et
+ // Attention, it is possible that :
+ // Minx = Miny = ShortRealLast (); and
// Maxx = Maxy = ShortRealFirst();
if (Minx > Maxx) { Minx = RealFirst (); Maxx = RealLast (); }
if (Miny > Maxy) { Miny = RealFirst (); Maxy = RealLast (); }
for (i=1; i<=Length; i++) {
myGraphicObjects.Value (i)->MarkerMinMax (x, X, y, Y);
- // Le GraphicObject peut etre vide
+ // GraphicObject can be empty
if (x > RF) Minx = (Minx < x ? Minx : x);
if (X < RL) Maxx = (Maxx > X ? Maxx : X);
if (y > RF) Miny = (Miny < y ? Miny : y);
if (Y < RL) Maxy = (Maxy > Y ? Maxy : Y);
}
- // Attention, il se peut que :
- // Minx = Miny = ShortRealLast (); et
+ // Attention, it is possible that :
+ // Minx = Miny = ShortRealLast (); and
// Maxx = Maxy = ShortRealFirst();
if (Minx > Maxx) { Minx = RealFirst (); Maxx = RealLast (); }
if (Miny > Maxy) { Miny = RealFirst (); Maxy = RealLast (); }
for (i=1; i<=Length; i++) {
if (IsIn (aList->Value(i))) {
(aList->Value(i))->MarkerMinMax (x, X, y, Y);
- // Le GraphicObject peut etre vide
+ // GraphicObject can be empty
if (x > RF) Minx = (Minx < x ? Minx : x);
if (X < RL) Maxx = (Maxx > X ? Maxx : X);
if (y > RF) Miny = (Miny < y ? Miny : y);
}
}
- // Attention, il se peut que :
- // Minx = Miny = ShortRealLast (); et
+ // Attention, it is possible that :
+ // Minx = Miny = ShortRealLast (); and
// Maxx = Maxy = ShortRealFirst();
if (Minx > Maxx) { Minx = RealFirst (); Maxx = RealLast (); }
if (Miny > Maxy) { Miny = RealFirst (); Maxy = RealLast (); }
for (Index=1; Index<=Length; Index++)
//myGraphicObjects.Value(Index)->Erase ();
// CAL le 17/11/97.
- // On met 1 car il faut effacer N fois le premier de la liste
- // En effet cette liste est mise a jour par la methode ci dessous
- // qui est appelee par Graphic2d_GraphicObject::Erase.
+ // 1 is set as it is required to remove N times the first from the list
+ // Acytually this list is updated by method below
+ // called by Graphic2d_GraphicObject::Erase.
#ifdef OCC154
myGraphicObjects.Value(Index)->Erase();
#else
//-Version
-//-Design Declaration des variables specifiques au contexte
-// de trace des facettes 3d
+//-Design Declaration of variables specific to the context
+// of tracing of facets 3D
-//-Warning Un contexte de trace de facette 3d herite du contexte
-// defini par :
-// - le style de l'interieur de la facette
-// - le style du bord de la facette
-// - la couleur
-// Il possede en plus d'une definition de matiere
-// pour les faces internes et externes.
+//-Warning Ccontext of tracing of facets 3d inherits the context
+// defined by :
+// - the style of the interior of the facet
+// - the style of the facet border
+// - the color
+// Additionally, it has more than one definition of material
+// for internal and external faces.
//-References
// OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
}
-// le :(InteriorStyle, InteriorColor, EdgeColor, EdgeLineType, EdgeLineWidth)
-// car AspectFillArea3d herite de AspectFillArea et il faut appeler
-// l'initialisation de AspectFillArea avec InteriorStyle, InteriorColor,
-// EdgeColor, EdgeLineType et EdgeLineWidth.
+// (InteriorStyle, InteriorColor, EdgeColor, EdgeLineType, EdgeLineWidth)
+// because AspectFillArea3d inherits AspectFillArea and it is necessary to call
+// initialisation of AspectFillArea with InteriorStyle, InteriorColor,
+// EdgeColor, EdgeLineType and EdgeLineWidth.
Graphic3d_AspectFillArea3d::Graphic3d_AspectFillArea3d (const Aspect_InteriorStyle InteriorStyle, const Quantity_Color& InteriorColor, const Quantity_Color& EdgeColor, const Aspect_TypeOfLine EdgeLineType, const Standard_Real EdgeLineWidth, const Graphic3d_MaterialAspect& FrontMaterial, const Graphic3d_MaterialAspect& BackMaterial):
Aspect_AspectFillArea (InteriorStyle, InteriorColor, EdgeColor, EdgeLineType, EdgeLineWidth), DistinguishModeActive (Standard_False), EdgeModeActive (Standard_False), BackFaceRemovalActive (Standard_False), MyTextureMap(), MyTextureMapState(Standard_False), MyFrontMaterial (FrontMaterial), MyBackMaterial (BackMaterial) {
//-Version
-//-Design Declaration des variables specifiques au contexte
-// de trace des lignes 3d
+//-Design Declaration of variables specific to the context
+// of tracing of lines 3d
-//-Warning Un contexte de trace de lignes 3d herite du contexte
-// defini par :
-// - la couleur
-// - le type de trait
-// - l'epaisseur
+//-Warning Context of tracing of lines 3d inherits the context
+// defined by :
+// - the color
+// - the type of trait
+// - the thickness
//-References
Graphic3d_AspectLine3d::Graphic3d_AspectLine3d () {
}
-// le :(AColor, AType, AWidth)
-// car AspectLine3d herite de AspectLine et il faut appeler
-// l'initialisation de AspectLine avec AColor, AType, AWidth.
+// (AColor, AType, AWidth)
+// because AspectLine3d inherits AspectLine and it is necessary to call
+// initialisation of AspectLine with AColor, AType, AWidth.
Graphic3d_AspectLine3d::Graphic3d_AspectLine3d (const Quantity_Color& AColor, const Aspect_TypeOfLine AType, const Standard_Real AWidth):Aspect_AspectLine (AColor, AType, AWidth) {}
//-Version
-//-Design Declaration des variables specifiques au contexte
-// de trace des markers 3d
-
-// Rappels Un contexte de trace de markers 3d herite du contexte
-// defini par :
-// - la couleur
-// - le type de marker
-// - l'echelle
+//-Design Declaration of variables specific to the context
+// of trace of markers 3d
+
+// Rappels Context of trace of markers 3d inherits the context
+// defined by :
+// - the color
+// - the type of marker
+// - the scale
//-Warning
//-Version
-//-Design Declaration des variables specifiques au contexte
-// de trace des textes 3d
-
-//-Warning Un contexte de trace de texte est defini par :
-// - la font utilisee
-// - la couleur
-// - l'echelle
-// - l'espace entre caracteres
+//-Design Declaration of variables specific to the context
+// of trace of texts 3d
+
+//-Warning A context of trace of text is defined by :
+// - the font used
+// - the color
+// - the scale
+// - the space between characters
//-References
}
this->InitMaps (connexion,Xw_TOM_READONLY,Ncolors,UseDefault);
- // 24/07/97
- // avant : this->InitMaps (connexion,Mapping,Ncolors,UseDefault);
- // uniquement pour HPUX
- // info GG :
- // L'action doit etre generalisee puisque l'on trouve le meme pb
- //sur HP et SIL lie au fait que la root est PseudoColor.
- // Ceci est donc compatible avec SUN et DEC ou la root est TrueColor.
- // De toute facon seul le driver Xdps a besoin d'un ColorCube et
- //il le cree tout seul s'il n'existe pas deja .
+
}
(TheSharedLibrary.DlError ());
}
else {
- // Gestion des traces
+ // Management of traces
char *tracevalue = NULL;
tracevalue = (char *)(getenv ("CSF_GraphicTrace"));
if (tracevalue)
(TheSharedLibrary.DlError ());
}
else {
- // Sequence artistique :
- // new_GLGraphicDriver est une OSD_Function :
+ // Sequence :
+ // new_GLGraphicDriver is OSD_Function :
// typedef int (* OSD_Function)(...);
- // d'ou le magnifique cast en GraphicDriver.
+ // that is why good cast in GraphicDriver.
Handle(Graphic3d_GraphicDriver)
(*fp) (Standard_CString) = NULL;
fp = (Handle(Graphic3d_GraphicDriver)
// MyGraphicDriver = (*fp) (TheSharedLibrary.Name ());
- // Gestion des traces
+ // Management of traces
if (tracevalue)
MyGraphicDriver->SetTrace
((Standard_Integer) atoi (tracevalue));
-- File: Graphic3d_Group.cdl
-- Created: Vendredi 6 Septembre 1991
-- Author: NW,JPB,CAL
- -- 27/09/97 ; PCT : ajout du controle manuel des textures
+ -- 27/09/97 ; PCT : add manual control of textures
-- 11/97 ; CAL : ajout polyline par 2 points
-- 16/06/2000 : ATS: Study G005 - Group store presentations of it's objects in field
-- MyListOfPArray to avoid deletion of handle-manipulating
---Level: Public
---Purpose: Links up points to create a face drawn
-- using the current fill attributes (AspectFillArea3d))
- -- The first and last points are not duplicates.
+ -- The first and last points are not duplicated.
-- The normal is defined and normalised for each vertex.
-- The texture coordinate is defined for each vertex.
---Category: Methods to create Polygon
//-Version
-//-Design Declaration des variables specifiques aux groupes
-// de primitives
+//-Design Declaration of variables specific to groups
+// of primitives
-//-Warning Un groupe est defini dans une structure
-// Il s'agit de la plus petite entite editable
+//-Warning A group is definedv in a structure
+// This is the smallest editable entity
//-References
MyBounds.ZMax = ShortRealFirst ();
//
-// Un petit commentaire sur l'utilisation du This !
+// A small commentary on the usage of This !
//
-// Un Graphic3d_Group est cree dans une structure. Graphic3d_Structure est
-// donc un manager de Graphic3d_Group. Dans le constructeur de Graphic3d_Group
-// est appele une methode de Graphic3d_Structure, Add, qui permet d'ajouter
-// l'instance du Graphic3d_Group dans son manager. Il y a donc 2 references
-// a <me> et tout va bien.
+// Graphic3d_Group is created in a structure. Graphic3d_Structure is a
+// manager of Graphic3d_Group. In the constructor of Graphic3d_Group
+// a method Add of Graphic3d_Structure is called. It allows adding
+// the instance of Graphic3d_Group in its manager. So there are 2 references
+// to <me> and everything works well.
//
-// This () est l'instance de la classe, c-a-d le groupe courant
+// This () is the instance of the class, the current groupe
//Handle(Graphic3d_Group) me = Handle(Graphic3d_Group)::DownCast (This ());
Standard_Integer TheLabelBegin, TheLabelEnd;
//-Version
-//-Design Declaration des variables specifiques aux groupes
-// de primitives
+//-Design Declaration of variables specific to groups
+// of primitives
-//-Warning Un groupe est defini dans une structure
-// Il s'agit de la plus petite entite editable
+//-Warning A group is defined in a structure
+// This is the smallest editable entity
//-References
#include <Graphic3d_StructureManager.hxx>
-// Structures c necessaires a l'interfacage avec les routines c
-// Routines C a declarer en extern
+// Structures are necessairy for interfacing with routines c
+// Routines C should be declared externally
//-Methods, in order
Standard_Boolean Graphic3d_Group::IsDeleted () const {
void Graphic3d_Group::MinMaxCoord (Standard_Real& XMin, Standard_Real& YMin, Standard_Real& ZMin, Standard_Real& XMax, Standard_Real& YMax, Standard_Real& ZMax) const {
if (IsEmpty ()) {
- // Groupe vide
+ // Empty Group
XMin = YMin = ZMin = ShortRealFirst ();
XMax = YMax = ZMax = ShortRealLast ();
}
// File Graphic3d_MaterialAspect.cxx
// Created Fevrier 1992
-// Author NW,JPB,CAL
-// modified 1/07/97 ; PCT : ajout texture mapping
-// 8/04/98 ; FGU : Ajout Emission
-// 9/07/98 ; CAL : Ajout de l'initialisation de l'EmissiveCoef
-// 26/03/99 ; FMN : Ajout methodes SetColor() et Color()
-// 26/03/99 : FMN ; Compatibilite ascendante: Ajout des anciens noms de materiaux.
-// 09/04/99 : GG ; Compatibilite ascendante: NameOfPhysicalMaterial disparait
-// 07/07/99 : GG ; MyEmissiveActivity MUST be initialized in the
-// constructor of the class.
-// 23/11/99 : GG ; BUC60488 : Add Name() & Reset() methods
#define BUC60565 //GG_19/10/99 ; Don't change the color components when the corresponding
// coefficient is modified because the resulting color is computed in
//-Version
-//-Design Declaration des variables specifiques aux definition
-// des matieres
+//-Design Declaration of variables specific to the definition
+// of materials
-//-Warning Une matiere est definie par :
-// - Un coefficient de transparence
-// - Un coefficient de reflection diffuse
-// - Un coefficient de reflection ambiante
-// - Un coefficient de reflection speculaire
-// - Un coefficient d emission
+//-Warning A material is defined by :
+// - coefficient of transparence
+// - coefficient of disperse reflection
+// - coefficient of ambiant reflection
+// - coefficient of specular reflection
+// - coefficient of emission
-// 2 proprietes permettent de definir une matiere :
-// - sa transparence
-// - sa reflection c-a-d ses proprietes d'absorbtion
-// et de diffusion de la lumiere
+// 2 properties permiting to define a material :
+// - transparence
+// - reflection, i.e. absorbtion properties
+// and light diffusion
-// La reflection diffuse est percue comme une composante
-// La reflection speculaire est percue comme une composante
-// de la couleur de la source lumineuse
+// Disperse reflection is considered a component
+// The specular reflection is considered a component
+// of the color of the light source
-// Pour determiner les 3 couleurs de reflection il faut :
-// - Un coefficient de reflection diffuse
-// - Un coefficient de reflection ambiante
-// - Un coefficient de reflection speculaire
+// To determine 3 colors of reflection it is necessary :
+// - coefficient of disperse reflection
+// - coefficient of ambiant reflection
+// - coefficient of specular reflection
-// ( Sous GL, on determine 3 couleurs )
+// ( Under GL, 3 colors are determined)
//-References Getting started with DEC PHIGS, annexe C
// Iris Advanced Graphics, unite D
switch (AName) {
case Graphic3d_NOM_PLASTIC : /* Blue plastic */
- /* Coefficient d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.0078125);
MyAmbientCoef = Standard_ShortReal (0.5);
MyDiffuseCoef = Standard_ShortReal (0.24);
break;
case Graphic3d_NOM_SHINY_PLASTIC : /* black plastic */
- /* Coef d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (1.0);
MyAmbientCoef = Standard_ShortReal (0.44);
MyDiffuseCoef = Standard_ShortReal (0.5);
break;
case Graphic3d_NOM_NEON_GNC:
- /* Coef d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.05);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
break;
case Graphic3d_NOM_METALIZED :
- /* Coef d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.13);
MyAmbientCoef = Standard_ShortReal (0.9);
MyDiffuseCoef = Standard_ShortReal (0.47);
MySpecularCoef = Standard_ShortReal (0.45);
MyAmbientActivity = Standard_False;
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
//MyDiffuseColor.SetValues (0.87, 0.96, 1.0, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
//MySpecularColor.SetValues (0.93, 0.95, 0.78, Quantity_TOC_RGB);
break;
-// Compatibilite ascendante materiaux physiques. On prend la meme definition
-// que dans le createur suivant.
+// Ascending Compatibility physical materials. The same definition is taken
+// as in the next constructor.
case Graphic3d_NOM_BRASS :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Initialisation des coefficients et couleur d eclairage : brass */
+ /* Initialisation of coefficients and lighting color : brass */
MyShininess = Standard_ShortReal (0.21794844);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
MySpecularCoef = Standard_ShortReal (1.0);
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (0.329412, 0.223529, 0.027451, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (0.780392, 0.568627, 0.113725, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (0.992157, 0.941176, 0.807843, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_BRONZE :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coef d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.2);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
MySpecularCoef = Standard_ShortReal (1.0);
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (0.2125, 0.1275, 0.054, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (0.714, 0.4284, 0.18144, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (0.393548, 0.271906, 0.166721, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_COPPER :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coefficient d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.93);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
MySpecularCoef = Standard_ShortReal (1.0);
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (0.33, 0.26, 0.23, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (0.50, 0.11, 0.0, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (0.95, 0.73, 0.0, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_GOLD :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coefficient d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.0625);
MyAmbientCoef = Standard_ShortReal (0.3);
MyDiffuseCoef = Standard_ShortReal (0.4);
MySpecularCoef = Standard_ShortReal (0.9);
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (1.0, 0.76862745, 0.31764706, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (1.0, 0.69, 0.0, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (1.0, 0.98, 0.78, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_PEWTER :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coefficient d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.076923047);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
MySpecularCoef = Standard_ShortReal (1.0);
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (0.105882, 0.058824, 0.113725, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (0.427451, 0.470588, 0.541176, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (0.333333, 0.333333, 0.521569, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_PLASTER :
#ifdef BUG // The plaster material must be considered as Generic.
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coefficient d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.2);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
MySpecularCoef = Standard_ShortReal (1.0);
#else
- /* Coefficient d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.0078125)
;
MyAmbientCoef = Standard_ShortReal (0.26);
MySpecularCoef = Standard_ShortReal (0.06);
#endif
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (0.19225, 0.19225, 0.19225, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (0.50754, 0.50754, 0.50754, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (0.508273, 0.508273, 0.508273, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_SILVER :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coefficient d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.2);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
MySpecularCoef = Standard_ShortReal (1.0);
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (0.19225, 0.19225, 0.19225, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (0.50754, 0.50754, 0.50754, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (0.508273, 0.508273, 0.508273, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_STEEL :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coefficient d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.06);
MyAmbientCoef = Standard_ShortReal (0.01);
MyDiffuseCoef = Standard_ShortReal (0.03);
MySpecularCoef = Standard_ShortReal (0.98);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (1.0, 1.0, 1.0, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_STONE :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coefficient d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.17);
MyAmbientCoef = Standard_ShortReal (0.19);
MyDiffuseCoef = Standard_ShortReal (0.75);
MySpecularCoef = Standard_ShortReal (0.08);
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (1.0, 0.8, 0.62, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (1.0, 0.8, 0.62, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (0.98, 1.0, 0.60, Quantity_TOC_RGB);
break;
-// Compatibilite ascendante materiaux physiques. On prend la meme definition
-// que dans le createur suivant. Nouveaux materials
+// Ascending Compatibility of physical materials. Takes the same definition
+// as in the next constructor. New materials
case Graphic3d_NOM_CHROME :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coef d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.1);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
MySpecularCoef = Standard_ShortReal (1.0);
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (0.35, 0.35, 0.35, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (0.4, 0.4, 0.4, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (0.974597, 0.974597, 0.974597, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_NEON_PHC:
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coef d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.05);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
MyAmbientActivity = Standard_False;
MyDiffuseActivity = Standard_False;
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (1.0, 1.0, 1.0, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (1.0, 1.0, 1.0, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (1.0, 1.0, 1.0, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MyEmissiveColor.SetValues (0.0, 1.0, 0.46, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_ALUMINIUM :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coef d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.09);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
MySpecularCoef = Standard_ShortReal (1.0);
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (0.30, 0.30, 0.30, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (0.30, 0.30, 0.30, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (0.70, 0.70, 0.80, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_OBSIDIAN :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coef d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.3);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
MySpecularCoef = Standard_ShortReal (1.0);
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (0.05375, 0.05, 0.06625, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (0.18275, 0.17, 0.22525, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (0.332741, 0.328634, 0.346435, Quantity_TOC_RGB);
break;
case Graphic3d_NOM_JADE :
MyMaterialType = Graphic3d_MATERIAL_PHYSIC;
- /* Coef d eclairage */
+ /* Lighting Coefficient */
MyShininess = Standard_ShortReal (0.1);
MyAmbientCoef = Standard_ShortReal (1.0);
MyDiffuseCoef = Standard_ShortReal (1.0);
MySpecularCoef = Standard_ShortReal (1.0);
- /* Couleur issue de l ambient */
+ /* Color resulting from ambient */
MyAmbientColor.SetValues (0.135, 0.2225, 0.1575, Quantity_TOC_RGB);
- /* Couleur issue du diffus */
+ /* Color resulting from dispersed */
MyDiffuseColor.SetValues (0.54, 0.89, 0.63, Quantity_TOC_RGB);
- /* Couleur issue du speculaire */
+ /* Color resulting from specular */
MySpecularColor.SetValues (0.316228, 0.316228, 0.316228, Quantity_TOC_RGB);
break;
default:
}
}
-/* Affectation type du materiel */
+/* Attribution of the type of material */
void Graphic3d_MaterialAspect::SetMaterialType( const Graphic3d_TypeOfMaterial AType ) {
MyMaterialType = AType ;
#ifdef IMP171201
#endif
}
-/* Affectation couleur eclairage ambient */
+/* Attribution of color ambient lighting */
void Graphic3d_MaterialAspect::SetAmbientColor (const Quantity_Color& AColor) {
MyAmbientColor = AColor;
#endif
}
-/* Affectation couleur eclairage diffus */
+/* Attribution of color dispersed lighting */
void Graphic3d_MaterialAspect::SetDiffuseColor (const Quantity_Color& AColor) {
MyDiffuseColor = AColor;
#endif
}
-/* Affectation couleur eclairage speculaire */
+/* Attribution of color specular lighting */
void Graphic3d_MaterialAspect::SetSpecularColor (const Quantity_Color& AColor) {
MySpecularColor = AColor;
#endif
}
-/* Affectation du coefficient d emission */
+/* Attribution of coefficient of emission */
void Graphic3d_MaterialAspect::SetEmissive (const Standard_Real AValue) {
if ((AValue < 0.0) || (AValue > 1.0))
return (MyAmbientColor);
}
-/* Acces a la couleur de l eclairage ambient */
+/* Access to the color of the ambient lighting */
Quantity_Color Graphic3d_MaterialAspect::AmbientColor () const {
return (MyAmbientColor);
}
-/* Acces a la couleur de l eclairage diffus */
+/* Access to the color of the dispersed lighting */
Quantity_Color Graphic3d_MaterialAspect::DiffuseColor () const {
return (MyDiffuseColor);
}
-/* Acces a la couleur de l eclairage speculaire */
+/* Access to the color of the specular lighting */
Quantity_Color Graphic3d_MaterialAspect::SpecularColor () const {
return (MySpecularColor);
}
-/* Acces a la couleur d emission */
+/* Access to the color of emission */
Quantity_Color Graphic3d_MaterialAspect::EmissiveColor () const {
return (MyEmissiveColor);
}
-/* Acces type du materiel */
+/* Access to the type of material */
Standard_Boolean Graphic3d_MaterialAspect::MaterialType( const Graphic3d_TypeOfMaterial AType ) const {
return ( MyMaterialType == AType ) ;
}
}
-/* Acces a la couleur de l eclairage ambient */
+/* Access to the color of the ambient lighting */
Standard_Real Graphic3d_MaterialAspect::Ambient () const {
return (Standard_Real (MyAmbientCoef));
}
-/* Acces a la couleur de l eclairage diffus */
+/* Access to the color of the dispersed lighting */
Standard_Real Graphic3d_MaterialAspect::Diffuse () const {
return (Standard_Real (MyDiffuseCoef));
}
-/* Valeur du coefficient d emission */
+/* Value of the coefficient of emission */
Standard_Real Graphic3d_MaterialAspect::Emissive () const {
return (Standard_Real (MyEmissiveCoef));
}
-/* Acces a la couleur de l eclairage speculaire */
+/* Access to the color of the specular lighting */
Standard_Real Graphic3d_MaterialAspect::Specular () const {
return (Standard_Real (MySpecularCoef));
}
-/* Acces au coefficient de transparence */
+/* Access to the coefficient of transparency */
Standard_Real Graphic3d_MaterialAspect::Transparency () const {
return (Standard_Real (MyTransparencyCoef));
}
-/* Acces au coefficient de brillance */
+/* Access to the coefficient of shineness */
Standard_Real Graphic3d_MaterialAspect::Shininess () const {
return (Standard_Real (MyShininess));
}
-/* Affectation du coefficient de brillance */
+/* Attribution of the coefficient of shineness */
void Graphic3d_MaterialAspect::SetShininess (const Standard_Real AValue) {
if ((AValue < 0.0) || (AValue > 1.0))
Standard_Integer Graphic3d_MaterialAspect::NumberOfMaterials() {
Standard_Integer n =sizeof(theMaterials)/sizeof(Material);
if( n > Graphic3d_NOM_DEFAULT ) {
- cout << " *** Graphic3d_MaterialAspect::NumberOfMaterials() may returns a badvalue due to incoherente size between material name array and enum" << endl;
+ cout << " *** Graphic3d_MaterialAspect::NumberOfMaterials() may return a badvalue due to incoherente size between material name array and enum" << endl;
}
return Graphic3d_NOM_DEFAULT;
}
//-Version
-//-Design Declaration des variables specifiques aux structures
-// graphiques
+//-Design Declaration of variables specific to graphic structures
-//-Warning Une structure est definie dans un manager
-// Il s'agit d'une sequence de groupes de primitives
+//-Warning A structure is defined in a manager
+// This is a sequence of groups of primitives
//-References
Handle(Graphic3d_AspectFillArea3d) aAspectFillArea3d =
new Graphic3d_AspectFillArea3d ();
- // Recuperation des valeurs par defaut
+ // Return default values
AManager->PrimitivesAspect (aAspectLine3d, aAspectText3d,
aAspectMarker3d, aAspectFillArea3d);
aAspectFillArea3d->SetPolygonOffsets( Aspect_POM_Fill, 1., 0. );
// OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets
- // Mise a jour de la CStructure associee
+ // Update the associated CStructure
UpdateStructure (aAspectLine3d, aAspectText3d,
aAspectMarker3d, aAspectFillArea3d);
Standard_Integer i, Length;
// Standard_Address APtr = (void *) This ().operator->();
Standard_Address APtr = (void *) this;
- // Il faut enlever le pointeur possible sur cette structure
- // que l'on est en train de detruire, dans la liste des descendants
- // des ancetres de cette structure et dans la liste des ancetres
- // des descendants de cette meme structure.
+ // It is necessary to remove the eventual pointer on the structure
+ // that can be destroyed, in the list of descendants
+ // of ancesters of this structure and in the list of ancesters
+ // of descendants of the same structure.
Length = MyDescendants.Length ();
for (i=1; i<=Length; i++)
MyCStructure.ContainsFacet = 0;
MyCStructure.IsDeleted = 1;
- // Destruction de me dans la bibliotheque graphique
+ // Destruction of me in the graphic library
MyGraphicDriver->RemoveStructure (MyCStructure);
- // Liberation de l'identification de la structure detruite
- // dans le premier manager qui a gere la creation de la structure.
+ // Liberation of the identification if the destroyed structure
+ // in the first manager that performs creation of the structure.
if ( MyFirstPtrStructureManager )
MyFirstStructureManager->Remove (Standard_Integer (MyCStructure.Id));
if (IsDeleted ()) return;
- // Highlight sur une structure deja Highlighted.
+ // Highlight on already Highlighted structure.
if (MyCStructure.highlight) {
Aspect_TypeOfUpdate UpdateMode = MyStructureManager->UpdateMode ();
if (UpdateMode == Aspect_TOU_WAIT)
UnHighlight ();
else {
- // Pour eviter d'appeler la methode : Update ()
- // Inutile et peut-etre couteux.
+ // To avoid call of method : Update ()
+ // Not useful and can be costly.
MyStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
UnHighlight ();
MyStructureManager->SetUpdateMode (UpdateMode);
if (! MyCStructure.highlight)
MyHighlightColor = AColor;
else {
- // Changement de highlight color sur une structure deja Highlighted.
+ // Change highlight color on already Highlighted structure.
Aspect_TypeOfUpdate UpdateMode = MyStructureManager->UpdateMode ();
if (UpdateMode == Aspect_TOU_WAIT)
UnHighlight ();
else {
- // Pour eviter d'appeler la methode : Update ()
- // Inutile et peut-etre couteux.
+ // To avoid call of method : Update ()
+ // Not useful and can be costly.
MyStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
UnHighlight ();
MyStructureManager->SetUpdateMode (UpdateMode);
Standard_Boolean Graphic3d_Structure::IsRotated () const {
- // Test un peu leger !
+ // A somewhat light test !
return ( MyCStructure.Transformation[0][1] != 0.
|| MyCStructure.Transformation[0][2] != 0.
|| MyCStructure.Transformation[1][0] != 0.
Result = MyCStructure.Transformation[i][j] != 0.;
#ifdef TRACE_ISTRSF
- cout << "La structure " << Identification ();
+ cout << "Structure " << Identification ();
if (Result)
- cout << " est transformee\n" << flush;
+ cout << " is transformed\n" << flush;
else
- cout << " n'est pas transformee\n" << flush;
+ cout << " is not transformed\n" << flush;
#endif
return Result;
if (IsDeleted ()) return (Standard_False);
- // Une structure contient au moins une facette :
- // si l'un de ses groupes est contient au moins une facette.
+ // A structure contains at least one facet :
+ // if one of these groups contains at least one facet.
Standard_Boolean Result1 = Standard_False;
Standard_Boolean Result2 = Standard_False;
Result1 = (MyCStructure.ContainsFacet > 0);
- // Si un des groupes contient au moins une facette alors
- // la structure aussi.
+ // If one of groups contains at least one facet, the structure contains it too.
if (Result1) return (Result1);
Length = MyDescendants.Length ();
- // Je m'arrete au premier descendant qui contient au moins une facette.
+ // Stop at the first descendant containing at least one facet.
for (i=1; i<=Length && ! Result2; i++)
Result2 = ((Graphic3d_Structure *)
(MyDescendants.Value (i)))->ContainsFacet ();
if (IsDeleted ()) return (Standard_True);
- // Une structure est vide :
- // si l'ensemble de ses groupes est vide ou tous ses
- // groupes sont vides et si l'ensemble de ses descendants
- // est vide ou tous ses descendants sont vides.
+ // A structure is empty :
+ // if all these groups are empty or if all
+ // groups are empty and all their descendants
+ // are empty or if all its descendants are empty.
Standard_Boolean Result1 = Standard_True;
Standard_Integer i, Length = MyGroups.Length ();
- // Je m'arrete au premier groupe non vide
+ // Stop at the first non-empty group
for (i=1; i<=Length && Result1; i++)
Result1 = (MyGroups.Value (i))->IsEmpty ();
- // Si un des groupes est non vide alors la structure l'est aussi.
+ // If a group is non-empty the structure is also non-empty.
if (! Result1) return (Standard_False);
Standard_Boolean Result2 = Standard_True;
Length = MyDescendants.Length ();
- // Je m'arrete au premier descendant non vide
+ // Stop at the first non-empty descendant
for (i=1; i<=Length && Result2; i++)
Result2 = ((Graphic3d_Structure *)
(MyDescendants.Value (i)))->IsEmpty ();
MyGraphicDriver->ContextStructure (MyCStructure);
// CAL 14/04/95
- // Les attributs sont "IsSet" lors de la premiere mise a jour
- // d'un contexte (line, marker...)
+ // attributes are "IsSet" during the first update
+ // of a context (line, marker...)
MyCStructure.ContextLine.IsSet = 1;
MyCStructure.ContextFillArea.IsSet = 1;
MyCStructure.ContextMarker.IsSet = 1;
#endif
// CAL 14/04/95
- // Les attributs sont "IsSet" lors de la premiere mise a jour
- // d'un contexte (line, marker...)
+ // Attributes are "IsSet" during the first update
+ // of context (line, marker...)
MyCStructure.ContextLine.IsSet = 1;
MyCStructure.ContextFillArea.IsSet = 1;
MyCStructure.ContextMarker.IsSet = 1;
MyGraphicDriver->ContextStructure (MyCStructure);
// CAL 14/04/95
- // Les attributs sont "IsSet" lors de la premiere mise a jour
- // d'un contexte (line, marker...)
+ // Attributes are "IsSet" during the first update of a context (line, marker...)
MyCStructure.ContextLine.IsSet = 1;
MyCStructure.ContextFillArea.IsSet = 1;
MyCStructure.ContextMarker.IsSet = 1;
MyGraphicDriver->ContextStructure (MyCStructure);
- // CAL 14/04/95
- // Les attributs sont "IsSet" lors de la premiere mise a jour
- // d'un contexte (line, marker...)
+ // Attributes are "IsSet" during the first update of a context (line, marker...)
MyCStructure.ContextLine.IsSet = 1;
MyCStructure.ContextFillArea.IsSet = 1;
MyCStructure.ContextMarker.IsSet = 1;
Display ();
}
else {
- // Pour eviter d'appeler la methode : Update ()
- // Inutile et peut-etre couteux.
+ // To avoid calling method : Update ()
+ // Not useful and can be costly.
MyStructureManager->SetUpdateMode (Aspect_TOU_WAIT);
Erase ();
MyVisual = AVisual;
MyAncestors.Append ((void *) AStructure.operator->());
AStructure->Connect (this, Graphic3d_TOC_DESCENDANT);
- // MyGraphicDriver->Connect est appele dans le cas
- // d'un connect entre mere et fille
+ // MyGraphicDriver->Connect is called in case
+ // if connection between parent and child
}
}
break;
if ((void *) (MyDescendants.Value (i)) ==
(void *) (AStructure.operator->())) indexD = i;
- // On cherche dans les Descendants
+ // Search in the Descendants
if (indexD != 0) {
MyDescendants.Remove (indexD);
AStructure->Disconnect (this);
if ((void *) (MyAncestors.Value (i)) ==
(void *) (AStructure.operator->())) indexA = i;
- // On cherche dans les Ancestors
+ // Search in the Ancestors
if (indexA != 0) {
MyAncestors.Remove (indexA);
AStructure->Disconnect (this);
- // Pas de call a MyGraphicDriver->Disconnect
- // dans le cas d'un ancetre
+ // No call of MyGraphicDriver->Disconnect
+ // in case of an ancestor
}
}
case Graphic3d_TOC_DESCENDANT :
Length = MyDescendants.Length ();
for (i=1; i<=Length; i++)
- // Value (1) et non Value (i) car MyDescendants
- // est modifiee par :
+ // Value (1) instead of Value (i) as MyDescendants
+ // is modified by :
// Graphic3d_Structure::Disconnect (AStructure)
- // qui enleve AStructure de MyDescendants
+ // that takes AStructure from MyDescendants
((Graphic3d_Structure *)
(MyDescendants.Value (1)))->Disconnect (this);
break;
case Graphic3d_TOC_ANCESTOR :
Length = MyAncestors.Length ();
for (i=1; i<=Length; i++)
- // Value (1) et non Value (i) car MyAncestors
- // est modifiee par :
+ // Value (1) instead of Value (i) as MyAncestors
+ // is modified by :
// Graphic3d_Structure::Disconnect (AStructure)
- // qui enleve AStructure de MyAncestors
+ // that takes AStructure from MyAncestors
((Graphic3d_Structure *)
(MyAncestors.Value (1)))->Disconnect (this);
break;
TColStd_Array2OfReal AMatrix44 (0, 3, 0, 3);
// Assign the new transformation in an array [0..3][0..3]
- // Evite des problemes si le user a defini sa matrice [1..4][1..4]
+ // Avoid problemes if the user has defined matrice [1..4][1..4]
// ou [3..6][-1..2] !!
lr = AMatrix.LowerRow ();
ur = AMatrix.UpperRow ();
if (AType == Graphic3d_TOC_REPLACE) {
MyCStructure.Composition = 0;
- // La mise a jour de la CStructure
+ // Update of CStructure
for (i=0; i<=3; i++)
for (j=0; j<=3; j++) {
MyCStructure.Transformation[i][j] =
if (AType == Graphic3d_TOC_POSTCONCATENATE) {
MyCStructure.Composition = 1;
- // Pour simplifier la gestion des indices
+ // To simplify management of indices
for (i=0; i<=3; i++)
for (j=0; j<=3; j++)
AMatrix44 (i, j) = AMatrix (lr + i, lc + j);
- // Le calcul de produit de matrices
+ // Calculation of the product of matrices
for (i=0; i<=3; i++)
for (j=0; j<=3; j++) {
NewTrsf (i, j) = 0.0;
NewTrsf (i, j) = valuenewtrsf;
}
}
- // La mise a jour de la CStructure
+ // Update of CStructure
for (i=0; i<=3; i++)
for (j=0; j<=3; j++)
MyCStructure.Transformation[i][j] = float (NewTrsf (i, j));
}
- // Si transformation, non validation des parties cachees deja calculees.
+ // If transformation, no validation of hidden already calculated parts.
if (IsRotated ())
ReCompute ();
if ((XTMin == RF) && (YTMin == RF) &&
(ZTMin == RF) && (XTMax == RL) &&
(YTMax == RL) && (ZTMax == RL)) {
- // Cas impossible car cela voudrait dire
- // que la structure est vide
+ // Case impossible as it would mean that
+ // the structure is empty
XMin = RF;
YMin = RF;
ZMin = RF;
void Graphic3d_Structure::Add (const Handle(Graphic3d_Group)& AGroup) {
- // Methode appelee que par le constructeur de Graphic3d_Group
- // Ce n'est pas la peine de tester l'existence de <AGroup>
- // dans la sequence MyGroups.
+ // Method called only by the constructor of Graphic3d_Group
+ // It is easy to check presence of <AGroup>
+ // in sequence MyGroups.
MyGroups.Append (AGroup);
}
for (Standard_Integer i=1; i<=Length && index==0; i++)
if (MyGroups.Value (i) == AGroup) index = i;
- // On cherche dans les Groups
+ // Search in Groups
if (index != 0) {
Standard_Integer GroupLabelBegin, GroupLabelEnd;
AGroup->Labels (GroupLabelBegin, GroupLabelEnd);
if ((XMin == RL) && (YMin == RL) &&
(ZMin == RL) && (XMax == RF) &&
(YMax == RF) && (ZMax == RF)) {
- // Cas impossible car cela voudrait dire
- // que la structure est vide
+ // Case impossible as it would mean
+ // that the structure is empty
XMin = RF;
YMin = RF;
ZMin = RF;
while (IteratorD.More ()) {
Graphic3d_Structure::Network
(IteratorD.Key (), AType, ASet);
- // IteratorD.Next () se positionne
- // sur la prochaine structure
+ // IteratorD.Next () is located on the next structure
IteratorD.Next ();
}
break;
while (IteratorA.More ()) {
Graphic3d_Structure::Network
(IteratorA.Key (), AType, ASet);
- // IteratorA.Next () se positionne
- // sur la prochaine structure
- IteratorA.Next ();
+ // IteratorD.Next () is located on the next structure
+ IteratorA.Next ();
}
break;
}
break;
case Aspect_TOHM_BOUNDBOX :
if (IsEmpty () || IsInfinite ()) {
- // Structure vide ou infinie
+ // Empty or infinite structure
XMin = YMin = ZMin = 0.;
XMax = YMax = ZMax = 0.;
}
void Graphic3d_Structure::SetComputeVisual (const Graphic3d_TypeOfStructure AVisual) {
- // On ne memorise le ComputeVisual que lorsque la structure est
- // declaree TOS_ALL, TOS_WIREFRAME ou TOS_SHADING.
- // C'est cette declaration qui va nous permettre de calculer
- // la bonne representation de la structure calculee par Compute
- // et non pas le passage en TOS_COMPUTED.
+ // The ComputeVisual is saved only if the structure is
+ // declared TOS_ALL, TOS_WIREFRAME or TOS_SHADING.
+ // This declaration permits to calculate
+ // proper representation of the structure calculated by Compute
+ // instead of passage to TOS_COMPUTED.
if (AVisual != Graphic3d_TOS_COMPUTED)
MyComputeVisual = AVisual;
void Graphic3d_Structure::SetManager (const Handle(Graphic3d_StructureManager)& AManager, const Standard_Boolean WithPropagation) {
- // Toutes les structures connectees doivent suivre ?
+ // All connected structures should follow ?
#ifdef IMPLEMENTED
if (WithPropagation) {
Standard_Integer i, Length;
}
#endif
- // changement d'identification ?
+ // change of identification ?
// MyStructureManager->Remove (Standard_Integer (MyCStructure.Id));
// AManager->NewIdentification ();
// MyCStructure.Id = int (AManager->NewIdentification ());
MyStructureManager->SetUpdateMode (UpdateMode);
AManager->SetUpdateMode (NewUpdateMode);
- // Nouveau manager
+ // New manager
MyPtrStructureManager = (void *) AManager.operator->();
}
Standard_Boolean Graphic3d_Structure::HLRValidation () const {
- // Les parties cachees stockees dans <me> sont valides si :
- // 1/ le proprietaire est defini.
- // 2/ elles n'ont pas ete invalidees.
+ // Hidden parts stored in <me> are valid if :
+ // 1/ the owner is defined.
+ // 2/ they are not invalid.
Standard_Boolean Result = MyOwner != NULL && MyCStructure.HLRValidation != 0;
//-Version
-//-Design Declaration des variables specifiques aux managers
+//-Design Declaration of variables specific to managers
-//-Warning Un manager manipule un ensemble de structures
+//-Warning Manager manages a set of structures
//-References
if (Initialisation) {
Initialisation = Standard_False;
- /* tableau pour gerer les identificateurs de StructureManager */
+ /* table to manage IDs of StructureManager */
for (i=1; i<=Limit; i++) StructureManager_ArrayId[i] = 0;
StructureManager_CurrentId = 1;
}
}
- // Si toutes les structures sont vides ou infinies
+ // If all structures are empty or infinite
if (Flag) {
XMin = YMin = ZMin = RF;
XMax = YMax = ZMax = RL;
OSD_File File(MyPath);
File.Open(OSD_ReadOnly, Protection);
- // ouverture du fichier ok ?
+ // open file ok ?
if ( File.IsOpen() == Standard_False ) {
TCollection_AsciiString sysname;
MyPath.SystemName(sysname);
////////////////////////
- // lecture du fichier //
+ // file reading //
////////////////////////
// Euclid ?
///////////
- // plantouille royalement
Handle(AlienImage_EuclidAlienImage) EuclidAlienImage = new AlienImage_EuclidAlienImage() ;
if (EuclidAlienImage->Read( File )) {
}
- // lever exception: type de fichier inconnu
+ // raise exception: file type unknown
return TheAlienImage;
}
//-Version
-//-Design Declaration des variables specifiques aux points
+//-Design Declaration of variables specific to points
-//-Warning Un point est defini par ses coordonnees et sa couleur
+//-Warning A point is defined by its coordinates and color
//-References
//-Global data definitions
-// -- la couleur du point
+// -- point color
// MyColor : Color;
//-Constructors
Graphic3d_VertexC::Graphic3d_VertexC () {
}
-// le :(AX, AY, AZ) car VertexC herite de Vertex et il faut appeler le
-// constructeur de Vertex avec AX, AY et AZ pour mettre a jour
-// les fields MyX, MyY, MyZ.
+// :(AX, AY, AZ) as VertexC inherits Vertex and it is necessary to call
+// constructor of Vertex with AX, AY and AZ to update fields MyX, MyY, MyZ.
Graphic3d_VertexC::Graphic3d_VertexC (const Standard_Real AX, const Standard_Real AY, const Standard_Real AZ, const Quantity_Color& AColor):
Graphic3d_Vertex (AX, AY, AZ),
MyColor (AColor) {
}
-// le :(APoint) car VertexC herite de Vertex et il faut appeler le
-// constructeur de Vertex avec APoint pour mettre a jour
-// les fields MyX, MyY, MyZ.
+// :(APoint) as VertexC inherits Vertex and it is necessary to call
+// constructor of Vertex with APoint to update fields MyX, MyY, MyZ.
Graphic3d_VertexC::Graphic3d_VertexC (const Graphic3d_Vertex& APoint, const Quantity_Color& AColor):
Graphic3d_Vertex (APoint),
//-Version
-//-Design Declaration des variables specifiques aux points
+//-Design Declaration of variables specific to points
-//-Warning Un point est defini par ses coordonnees, sa normale
-// et sa couleur
+//-Warning A point is defined by its coordinates, normal
+// and color
//-References
//-Global data definitions
-// -- la couleur
+// -- the color
// MyColor : Color;
//-Constructors
}
-// le :(AX, AY, AZ) car VertexNC herite de VertexN et il faut appeler le
-// constructeur de VertexN avec AX, AY, AZ, ANX, ANY et ANZ pour
-// mettre a jour les fields.
+// :(AX, AY, AZ) as VertexNC inherits VertexN and it is necessary to call
+// constructor of VertexN with AX, AY, AZ, ANX, ANY and ANZ to
+// update fields.
Graphic3d_VertexNC::Graphic3d_VertexNC (const Standard_Real AX, const Standard_Real AY, const Standard_Real AZ, const Standard_Real ANX, const Standard_Real ANY, const Standard_Real ANZ, const Quantity_Color& AColor,const Standard_Boolean FlagNormalise):
Graphic3d_VertexN (AX, AY, AZ, ANX, ANY, ANZ,FlagNormalise),
MyColor (AColor) {
}
-// le :(APoint, AVector) car VertexNC herite de VertexN et il faut appeler le
-// constructeur de VertexN avec APoint et AVector pour mettre a jour
-// les fields.
+// :(APoint, AVector) as VertexNC inherits VertexN and it is necessary to call
+// constructor of VertexN with APoint and AVector to
+// update fields.
Graphic3d_VertexNC::Graphic3d_VertexNC (const Graphic3d_Vertex& APoint, const Graphic3d_Vector& AVector, const Quantity_Color& AColor,const Standard_Boolean FlagNormalise):
Graphic3d_VertexN (APoint, AVector,FlagNormalise),
(MySharedLibrary.DlError ());
}
else {
- // Gestion des traces
+ // Management of traces
OSD_Environment beurk("CSF_GraphicTrace");
TCollection_AsciiString val = beurk.Value();
if (val.Length() > 0 )
(MySharedLibrary.DlError ());
}
else {
- // Sequence artistique :
- // new_GLGraphicDriver est une OSD_Function :
+ // Sequence :
+ // new_GLGraphicDriver is OSD_Function :
// typedef int (* OSD_Function)(...);
- // d'ou le magnifique cast en GraphicDriver.
+ // wherefrom a good cast in GraphicDriver.
//Handle( Graphic3d_GraphicDriver ) ADriver = new Graphic3d_GraphicDriver ( TheShr );
GET_DRIVER_PROC fp = ( GET_DRIVER_PROC )new_GLGraphicDriver;
(MySharedLibrary.DlError ());
MyGraphicDriver = ( *fp ) ( TheShr );
- // Gestion des traces
+ // Management of traces
if ( val.Length() > 0 && val.IsIntegerValue() )
MyGraphicDriver->SetTrace(val.IntegerValue());
}
TolVertex=TolVertex1;
}
//
- //-- Verification des cas ou on a oublie de coder degenereted
+ //-- Verification of cases when forgotten to code degenereted
if(!degenerated) {
Standard_Real aR2;
gp_Pnt P3da, P3db;
}
//
//-- ------------------------------------------------------------
- //-- On regarde la distance uv entre le point de debut de l edge
- //-- et le dernier point enregistre dans SeqPnt2d
- //-- On cherche a eloigner le premier point de l edge courant
- //-- du dernier point enregistre
+ //-- Check distance uv between the start point of the edge
+ //-- and the last point saved in SeqPnt2d
+ //-- To to set the first point of the current
+ //-- afar from the last saved point
Avant = nbpnts;
for(iX=firstpoint; iX<=aNbs1; iX++) {
Standard_Boolean IsRealCurve3d;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//
if(NbEdges) {
- //-- on compte ++ avec un explorateur normal et -- avec le Wire Exploreur
+ //-- count ++ with normal explorer and -- with Wire Explorer
TColgp_Array1OfPnt2d PClass(1,2);
gp_Pnt2d anInitPnt(0., 0.);
//
Standard_Integer nbtabclass = TabClass.Length();
//
if(nbtabclass>0) {
- //-- Si une erreur sur un wire a ete detecte : On met tous les TabOrien a -1
+ //-- if an error on a wire was detected : all TabOrien set to -1
if(BadWire) {
TabOrien(1)=-1;
}
return(TopAbs_IN);
}
- //-- U1 est le First Param et U2 ds ce cas est U1+Period
+ //-- U1 is the First Param and U2 is in this case U1+Period
Standard_Real u, v, uu, vv, uperiod, vperiod;
Standard_Boolean IsUPer, IsVPer, urecadre, vrecadre;
TopAbs_State Status= TopAbs_UNKNOWN;
}
} // if(TabOrien(1)!=-1) {
- else { //-- TabOrien(1)=-1 Wire Faux
+ else { //-- TabOrien(1)=-1 Wrong Wire
BRepClass_FaceClassifier aClassifier;
aClassifier.Perform(Face,Puv,Toluv);
Status = aClassifier.State();
return(TopAbs_IN);
}
- //-- U1 est le First Param et U2 ds ce cas est U1+Period
+ //-- U1 is the First Param and U2 in this case is U1+Period
Standard_Real u=_Puv.X();
Standard_Real v=_Puv.Y();
Standard_Real uu = u, vv = v;
Status = TopAbs_OUT;
}
}
- else { //-- TabOrien(1)=-1 Wire Faux
+ else { //-- TabOrien(1)=-1 Wrong Wire
BRepClass_FaceClassifier aClassifier;
aClassifier.Perform(Face,Puv,Tol);
Status = aClassifier.State();
} // end of if (!Precision::IsNegativeInfinite(fprm) && !Precision::IsPositiveInfinite(lprm))
else {
- // on regarde si on garde
+ // check if keep
//
Standard_Boolean bFNIt, bLPIt;
Standard_Real aTestPrm, dT=100.;
}// end of if (ok) {
}// end of for (Standard_Integer j=0; j<=17; j++)
- }// end of else { on regarde si on garde
+ }// end of else { check if keep
}// for (i=1; i<=myLConstruct.NbParts(); i++)
}// IntPatch_Circle: IntPatch_Ellipse:
break;
ilprm = (Standard_Integer)lprm;
}
}
- //-- lbr :
- //-- Si une des surfaces est un plan , on approxime en 2d
- //-- sur cette surface et on remonte les points 2d en 3d.
+ //-- If one of surfaces is a plane , 2D approximation is done on
+ //-- this surface and 2D points are returned in 3D.
if(typs1 == GeomAbs_Plane) {
theapp3d.Perform(myHS1, myHS2, WL, Standard_False,Standard_True, myApprox2,ifprm,ilprm);
}
S->Bounds(umin, umax, vmin, vmax);
if (S->IsUPeriodic() && !C2d.IsNull()) {
- // Recadre dans le domaine UV de la face
+ // Reframe in domain UV of the face
Standard_Real period, U0, du, aEps;
du =0.0;
IntTools_SequenceOfCurves aNewCvs;
//
- // 1. Treatment of periodic and closed curves
+ // 1. Processing of periodic and closed curves
aNbCurves=mySeqOfCurve.Length();
for (i=1; i<=aNbCurves; i++) {
const IntTools_Curve& aIC=mySeqOfCurve(i);
// ------------------------------------------------------------------------------------------------
// static function: ParameterOutOfBoundary
// purpose: Computes a new parameter for given curve. The corresponding 2d points
-// does not lay on any boundary of given faces
+// do not lie on any boundary of given faces
// ------------------------------------------------------------------------------------------------
Standard_Boolean ParameterOutOfBoundary(const Standard_Real theParameter,
const Handle(Geom_Curve)& theCurve,
}
default:
{
- //-- Le cas de biparametrees periodiques est gere en amont
+ //-- Case of periodic biparameters is processed upstream
myHS1IsUPeriodic = myHS1IsVPeriodic = Standard_False;
break;
}
}
default:
{
- //-- Le cas de biparametrees periodiques est gere en amont
+ //-- Case of periodic biparameters is processed upstream
myHS2IsUPeriodic = myHS2IsVPeriodic = Standard_False;
break;
}
Pmid.Parameters(u1,v1,u2,v2);
Recadre(myHS1,myHS2,u1,v1,u2,v2);
const TopAbs_State in1 = myDom1->Classify(gp_Pnt2d(u1,v1),Tol);
- if(in1 != TopAbs_OUT) { //-- !=ON donne Pb
+ if(in1 != TopAbs_OUT) {
const TopAbs_State in2 = myDom2->Classify(gp_Pnt2d(u2,v2),Tol);
- if(in2 != TopAbs_OUT) { //-- !=ON
+ if(in2 != TopAbs_OUT) {
seqp.Append(firstp);
seqp.Append(lastp);
}
}
}
if (!intrvtested) {
- // on garde a priori. Il faudrait un point 2d sur chaque
- // surface pour prendre la decision. Sera fait dans
- // l`appelant
+ // Keep a priori. A point 2d on each
+ // surface is required to make the decision. Will be done in the caller
seqp.Append(GeomInt_LineTool::FirstParameter(L));
seqp.Append(GeomInt_LineTool::LastParameter(L));
}
done = Standard_False;
seqp.Clear();
nbvtx = GeomInt_LineTool::NbVertex(L);
- if (nbvtx == 0) { // on garde a priori. Il faudrait un point 2d sur chaque
- // surface pour prendre la decision. Sera fait dans
- // l`appelant
+ if (nbvtx == 0) { // Keep a priori. Point 2d is required on each
+ // surface to make the decision. Will be done in the caller
seqp.Append(GeomInt_LineTool::FirstParameter(L));
seqp.Append(GeomInt_LineTool::LastParameter(L));
done = Standard_True;
{
if (Abs(prm-seqpss(j).Parameter()) <= Tol)
{
- // on cumule
+ // accumulate
GeomInt_ParameterAndOrientation& valj = seqpss.ChangeValue(j);
if (or1 != TopAbs_INTERNAL) {
if (valj.Orientation1() != TopAbs_INTERNAL) {
}
if (prm < seqpss(j).Parameter()-Tol ) {
- // on insere avant la position j
+ // insert before position j
seqpss.InsertBefore(j,GeomInt_ParameterAndOrientation(prm,or1,or2));
inserted = Standard_True;
break;
}
}
- // on determine l`etat en debut de ligne
+ // determine the state at the beginning of line
Standard_Boolean trim = Standard_False;
Standard_Boolean dansS1 = Standard_False;
Standard_Boolean dansS2 = Standard_False;
break;
}
}
- dansS1 = Standard_True; // on garde dans le doute
+ dansS1 = Standard_True; // Keep in doubt
}
for (i=1; i<= nbvtx; i++)
break;
}
}
- dansS2 = Standard_True; // on garde dans le doute
+ dansS2 = Standard_True; // Keep in doubt
}
- if (!trim) { // on a necessairement dansS1 == dansS2 == Standard_True
+ if (!trim) { // necessarily dansS1 == dansS2 == Standard_True
seqp.Append(GeomInt_LineTool::FirstParameter(L));
seqp.Append(GeomInt_LineTool::LastParameter(L));
done = Standard_True;
return;
}
- // On epluche la sequence seqpss pour constituer les bouts valides
- // et les stocker dans seqp(2*i+1) et seqp(2*i+2)
+ // sequence seqpss is peeled to create valid ends
+ // and store them in seqp(2*i+1) and seqp(2*i+2)
Standard_Real thefirst = GeomInt_LineTool::FirstParameter(L);
Standard_Real thelast = GeomInt_LineTool::LastParameter(L);
}
}
- // le petit dernier a rajouter
+ // finally to add
if (dansS1 && dansS2)
{
lastp = thelast;
Quantity_Length dx,dy,dz; aDirection.Coord(dx,dy,dz);
//
-// Pointe de la fleche:
+// Point of the arrow:
Quantity_Length xo,yo,zo; aLocation.Coord(xo,yo,zo);
-// Centre du cercle base de la fleche:
+// Center of the base circle of the arrow:
Quantity_Length xc = xo - dx * aLength;
Quantity_Length yc = yo - dy * aLength;
Quantity_Length zc = zo - dz * aLength;
-// Construction d'un repere i,j pour le cercle:
+// Construction of i,j mark for the circle:
Quantity_Length xn=0., yn=0., zn=0.;
if ( Abs(dx) <= Abs(dy) && Abs(dx) <= Abs(dz)) xn=1.;
// Author: Jean-Louis FRENKEL
// Modified by rob 09-oct-96
// <jlf@stylox>
-// rob 18-may-98 : Pb de la Trsf dont le type n'est pas calcule en fonction
-// des coefficients.
+
#define IMP040200 //GG Recompute HLR after transformation
// in all the case.
//=======================================================================
//function : Compute
-//purpose : Les methodes pour les parties cachees...
+//purpose : Methods for hidden parts...
//=======================================================================
Handle(Graphic3d_Structure) PrsMgr_Presentation3d::
Compute(const Handle(Graphic3d_DataStructureManager)& aProjector)
{
#ifdef DEB
- cout<<"passage dans g = Compute(P) "<<endl;
+ cout<<"passage in g = Compute(P) "<<endl;
#endif
Handle(Prs3d_Presentation) g = new Prs3d_Presentation(Handle(PrsMgr_PresentationManager3d)::DownCast(PresentationManager())->StructureManager());
myPresentableObject->Compute(Projector(aProjector),g);
const Handle(Graphic3d_Structure)& TheStructToFill)
{
#ifdef DEB
- cout<<"passage dans Compute(P,Str)"<<endl;
+ cout<<"passage in Compute(P,Str)"<<endl;
#endif
TheStructToFill->Clear();
const Handle(Prs3d_Presentation)& P = *((Handle(Prs3d_Presentation)*) &TheStructToFill);
const Handle(Geom_Transformation)& TheTrsf)
{
#ifdef DEB
- cout<<"passage dans G = Compute(P,Trsf)"<<endl;
+ cout<<"passage in G = Compute(P,Trsf)"<<endl;
#endif
Handle(Prs3d_Presentation) g = new Prs3d_Presentation(Handle(PrsMgr_PresentationManager3d)::DownCast(PresentationManager())->StructureManager());
g->Transform(TheTrsf);
}
else{
- // en attendant que la chose soit effectue dans gp_Trsf...rob
+ // waiting that something is done in gp_Trsf...rob
Standard_Boolean good (Standard_True);
for (Standard_Integer i=1;i<=3 && good ;i++){
for (Standard_Integer j=1;j<=3 && good ;j++){
if(good){
#ifdef DEB
- cout<<"\ton a verifie que la Trsf est une Translation"<<endl;
+ cout<<"\t it is checked if Trsf is a Translation"<<endl;
#endif
myPresentableObject->Compute(Projector(aProjector),g);
g->Transform(TheTrsf);
}
else{
#ifdef DEB
- cout<<"\tla Trsf n'est pas seulement translation..."<<endl;
+ cout<<"\t Trsf is not only translation..."<<endl;
#endif
myPresentableObject->Compute(Projector(aProjector),TheTrsf,g);
}
{
#ifdef DEB
- cout<<"passage dans Compute(P,Trsf,Str)"<<endl;
+ cout<<"passage in Compute(P,Trsf,Str)"<<endl;
#endif
Handle(Prs3d_Presentation) P = *((Handle(Prs3d_Presentation)*)&TheStructToFill);
#ifdef IMP040200
TheStructToFill->Clear();
myPresentableObject->Compute(Projector(aProjector),TheTrsf,P);
-#else //Does not work properly ,HLR seems deactivated for view rotation
+#else //Does not work properly, HLR seems deactivated for view rotation
if(TheTrsf->Form()== gp_Translation){
#ifdef DEB
- cout<<"\tla Trsf est une translation"<<endl;
+ cout<<"\t Trsf is a translation"<<endl;
#endif
// myPresentableObject->Compute(Projector(aProjector),P);
P->Transform(TheTrsf);
}
else{
- // en attendant que la chose soit effectue dans gp_Trsf...rob
+ // waiting that something is done in gp_Trsf...rob
Standard_Boolean good (Standard_True);
for (Standard_Integer i=1;i<=3 && good ;i++){
for (Standard_Integer j=1;j<=3 && good ;j++){
}
if(good && !TheStructToFill->IsEmpty()){
#ifdef DEB
- cout<<"\ton a verifie que la Trsf est une Translation"<<endl;
+ cout<<"\t it is checked if Trsf is a Translation"<<endl;
#endif
P->Transform(TheTrsf);
TheStructToFill->Clear();
#ifdef DEB
- cout<<"\tla Trsf n'est pas seulement translation..."<<endl;
+ cout<<"\t Trsf is not only translation..."<<endl;
#endif
myPresentableObject->Compute(Projector(aProjector),TheTrsf,P);
//=======================================================================
//function : Select3D_SensitiveCircle (constructeur)
-//purpose : Definition d'un cercle sensible
+//purpose : Definition of a sensitive circle
//=======================================================================
static Standard_Integer S3D_GetCircleNBPoints(const Handle(Geom_Circle)& C,
const Standard_Integer anInputNumber)
//=======================================================================
//function : Select3D_SensitiveCircle (constructeur)
-//purpose : Definition d'un arc sensible
+//purpose : Definition of a sensitive arc
//=======================================================================
Select3D_SensitiveCircle::
Select3D_SensitiveCircle(const Handle(SelectBasics_EntityOwner)& OwnerId,
{
- // dans le cas Edge (pourtour de la face seulement
- //on regarde si le point souris X,Y se trouve a l'interieur du triangle
- // pi,pi+1,pi+2 a la tolerance pres... si oui on a fini...
+ // in case of Edge (for the face it is only checked if
+ // the mouse point X,Y is found inside the triangle
+ // pi,pi+1,pi+2 with close tolerance... if yes, finish...
if(mynbpoints>1){
Standard_Boolean Found =Standard_False;
Standard_Integer i = 0;
Standard_Real V1V1 = V1.SquareModulus();
DMin2 =
(V1V1 <=aTol2) ?
- Min(DMin2,V.SquareModulus()): // si le segment est trop petit...
+ Min(DMin2,V.SquareModulus()): // if the segment is too small...
Min(DMin2,Vector*Vector/V1V1);
}
//Modif on jul-21-97 : changement en harray1 pour eventuelles connexions ...
#include <Select3D_SensitiveFace.ixx>
-#include <Select3D_Projector.hxx>
#include <SelectBasics_BasicTool.hxx>
#include <gp_Pnt2d.hxx>
#include <gp_Pnt.hxx>
#define AutoInitFlags(aflag) (aflag = 0)
//==================================================
-// Function: faire disparaitre ce constructeur a la prochaine version...
-// Purpose : simplement garde pour ne pas perturber la version update
+// Function: Hide this constructor to the next version...
+// Purpose : simply avoid interfering with the version update
//==================================================
Select3D_SensitiveFace::
Bnd_Box2d(mybox2d).Get(Xmin,Ymin,Xmax,Ymax);
DMin2 = gp_XY(Xmax-Xmin,Ymax-Ymin).SquareModulus();
}
- // calcul d'un critere de distance mini...
- // au depart Dmin = taille de la boite englobante 2D,
- // ensuite distance mini du polyedre ou du cdg...
+ // calculation of a criterion of minimum distance...
+ // from start Dmin = size of the bounding box 2D,
+ // then min. distance of the polyhedron or cdg...
Standard_Real aTol2 = aTol*aTol;
gp_XY CDG(0.,0.);
Standard_Real V1V1 = V1.SquareModulus();
DMin2 =
(V1V1 <=aTol2) ?
- Min(DMin2,V.SquareModulus()): // si le segment est trop petit...
+ Min(DMin2,V.SquareModulus()): // if the segment is too small...
Min(DMin2,Vector*Vector/V1V1);
//cdg ...
gp_XY PlaneTest(CDG);PlaneTest-=((Select3D_Pnt2d*)mypolyg2d)[I-1];
Standard_Real valtst = PlaneTest^V1;
if(isplane2d && Abs(valtst)>aTol) isplane2d=Standard_False;
}
- if (isplane2d)
- {
- return Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+
+ if(isplane2d) {
+ Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+
+ return Standard_True;
}
//detection d'une auto - intersection dans le polygon 2D; si oui on sort
// if (!AutoComputeFlag(myautointer)) {
// if (AutoInterFlag(myautointer)) return Standard_True;
// //
- //sinon on regarde si le point est dans la face...
+ //otherwise it is checked if the point is in the face...
TColgp_Array1OfPnt2d aArrayOf2dPnt(1, mynbpoints);
Points2D(aArrayOf2dPnt);
CSLib_Class2d TheInOutTool(aArrayOf2dPnt,aTol,aTol,Xmin,Ymin,Xmax,Ymax);
res = Standard_True;
}
}
- if (res)
- {
- return Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
- }
- return Standard_False;
+ if(res)
+ Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+
+ return res;
}
//=======================================================================
//=======================================================================
Standard_Real Select3D_SensitiveFace::ComputeDepth(const gp_Lin& EyeLine) const
{
- Standard_Real aDepth = Precision::Infinite();
- Standard_Real aDepthMin = !mylastprj.IsNull() ? mylastprj->DepthMin() : -Precision::Infinite();
- Standard_Real aDepthMax = !mylastprj.IsNull() ? mylastprj->DepthMax() : Precision::Infinite();
- Standard_Real aDepthTest;
- for (Standard_Integer i = 0; i < mynbpoints - 1; i++)
- {
- aDepthTest = ElCLib::Parameter (EyeLine, ((Select3D_Pnt* )mypolyg3d)[i]);
- if (aDepthTest < aDepth && (aDepthTest > aDepthMin) && (aDepthTest < aDepthMax))
- {
- aDepth = aDepthTest;
- }
- }
- return aDepth;
+ Standard_Real val(Precision::Infinite());
+ for(Standard_Integer i=0;i<mynbpoints-1;i++)
+ val = Min(val,ElCLib::Parameter(EyeLine,((Select3D_Pnt*)mypolyg3d)[i]));
+ return val;
}
//purpose :
//=======================================================================
-void Select3D_SensitiveGroup::Project(const Handle(Select3D_Projector)& aProjector)
+void Select3D_SensitiveGroup::Project(const Select3D_Projector& aProjector)
{
Select3D_SensitiveEntity::Project(aProjector); // to set the field last proj...
-
+
for(Select3D_ListIteratorOfListOfSensitive It(myList);It.More();It.Next()){
It.Value()->Project(aProjector);
}
myLastTol = aTol;
for(Select3D_ListIteratorOfListOfSensitive It(myList);It.More();It.Next()){
myLastRank++;
- if (It.Value()->Matches (X, Y, aTol, DMin))
- {
- myX = X; myY = Y; myLastTol = aTol;
- // compute and validate the depth (will call ::ComputeDepth())
- return Select3D_SensitiveEntity::Matches (X, Y, aTol, DMin);
+ if(It.Value()->Matches(X,Y,aTol,DMin)){
+ myX = X;myY = Y;myLastTol = aTol;
+ SetLastDepth( Precision::Infinite() );
+
+ Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+ return Standard_True;
}
}
- // no match
- myLastRank = 0;
- SetLastDepth (ShortRealLast());
+ myLastRank =0;
+ SetLastDepth(0.0);
return Standard_False;
}
//=======================================================================
//function : ComputeDepth
-//purpose : pour optimiser, on prend le min des profondeurs pour
-// les entites qui repondent OUI a Matches(X,Y,...)
-// on commence le test a partir de mylastRank...
+//purpose : to optimise, the minimum depth for
+// entities that answer YES to Matches(X,Y,...) is taken
+// the test is started from mylastRank...
//=======================================================================
Standard_Real Select3D_SensitiveGroup::ComputeDepth(const gp_Lin& EyeLine) const
{
- Standard_Integer currank = 0;
- Standard_Real DMin, thedepth (Precision::Infinite());
- for (Select3D_ListIteratorOfListOfSensitive It(myList);It.More();It.Next())
- {
+ Standard_Integer currank(0);
+ Standard_Real DMin,thedepth(Precision::Infinite());
+ for(Select3D_ListIteratorOfListOfSensitive It(myList);It.More();It.Next()){
currank++;
- if (currank >= myLastRank)
- {
- // this recomputes and validates the depth for the entity
- if (It.Value()->Matches (myX, myY, myLastTol, DMin))
- {
- It.Value()->ComputeDepth (EyeLine);
- if (It.Value()->Depth() < thedepth)
- {
- // search for topmost entity
- thedepth = It.Value()->Depth();
- //myLastRank = currank; // can not do this here...
- }
+ if(currank>=myLastRank){
+ if(It.Value()->Matches(myX,myY,myLastTol,DMin)){
+ It.Value()->ComputeDepth(EyeLine);
+ thedepth = Min(Depth(),
+ It.Value()->Depth());
}
}
+
}
return thedepth;
}
return nbboxes;
}
-void Select3D_SensitiveGroup::SetLastPrj(const Handle(Select3D_Projector)& Prj)
+void Select3D_SensitiveGroup::SetLastPrj(const Select3D_Projector& Prj)
{
Select3D_SensitiveEntity::SetLastPrj(Prj);
for(Select3D_ListIteratorOfListOfSensitive It(myList);It.More();It.Next())
B.Enlarge(aTol);
if(B.IsOut(TheP)) return 2;
- // on classifie le point par rapport aux demi -espaces delimites
- // par chaque cote du triangle (a la tolerance pres)
+ // the point is classified corresponding to demi-spaces limited
+ // by each side of the triangle (with tolerance)
gp_XY V01(p1);V01-=p0;
gp_XY V02(p2);V02-=p0;
gp_XY V12(p2);V12-=p1;
Standard_Real TolTol = aTol*aTol;
- // regardons les cas particuliers...
- //si l'un des vecteurs est quasi nul (2 points sont confondus),
- // on sort tout de suite (on est deja dans la boite d'encombrement, c'est bon...)
+ // check these particular cases...
+ // if one of vectors is almost null (2 points are mixed),
+ // leave at once (it is already in the bounding box, which is good...)
DMin = aTol;
{
Standard_Real LV = V02.SquareModulus();
if ( LV <= gp::Resolution())
- return 0; // les 3 points sont confondus, et TheP est dans la boite englobante B...
+ return 0; // 3 points are mixed, and TheP is in the bounding box B...
if ( S3D_Str_NearSegment (p0, p2, TheP, aTol, DMin) )
return 0;
return 2;
}
- // normale a p0p1 orientee...
+ // oriented normal to p0p1...
gp_Dir2d N (-V01.Y(), V01.X());
Standard_Boolean Neg = (N * V02 < 0.);
if ( Neg )
if ( aD1 < -aTol )
return 2;
- // normale a p1p2 orientee...
+ // oriented normal to p1p2...
if(Neg)
N.SetCoord(p2.Y()-p1.Y(),p1.X()-p2.X());
else
Vec.SetCoord(TheP.X()-p1.X(),TheP.Y()-p1.Y());
Standard_Real aD2 = Vec * N.XY();
if ( aD2 < -aTol )
- return 2; // dehors
+ return 2; // outside
- // normale a p2p0 orientee...
+ // oriented normal to p2p0...
// attention v20 (x0-x2) => N y2-y0 => -N y0-y2
// (y0-y2) x0-x2 x2-x0
if(Neg)
Vec.SetCoord(TheP.X()-p2.X(),TheP.Y()-p2.Y());
Standard_Real aD3 = Vec * N.XY();
if ( aD3 < -aTol )
- return 2; // dehors
+ return 2; // outside
// compute 2d distance to triangle
Standard_Real aD = Min (aD1, Min (aD2, aD3));
void Select3D_SensitiveTriangle::Dump(Standard_OStream& S,const Standard_Boolean FullDump) const
{
- // les generalites....
+ // general information....
S<<"\tSensitiveTriangle 3D :\n";
if(HasLocation())
}
Standard_Real prof(Precision::Infinite());
- // formule calcul du parametre du point sur l'intersection
+ // formula calculation of the point parameters on intersection
// t = (P1P2 ^P1P3)* OP1 / ((P1P2^P1P3)*Dir)
- gp_Pnt Oye = EyeLine.Location(); // origine de la ligne oeil/point vise...
+ gp_Pnt Oye = EyeLine.Location(); // origin of the target line eye/point...
gp_Dir Dir = EyeLine.Direction();
gp_Vec P1P2 (P1,P2), P1P3(P1,P3);
#include <Select3D_SensitiveTriangulation.ixx>
#include <gp_Pnt2d.hxx>
-#include <Poly.hxx>
#include <Poly_Connect.hxx>
#include <CSLib_Class2d.hxx>
#include <TColStd_Array1OfInteger.hxx>
for (j = 0; j < 3; j++)
if (t[j] == 0) nFree++;
}
- return nFree;
+ return nFree;
}
static Standard_Boolean S3D_STriangul_NearSegment (const gp_XY& p0, const gp_XY& p1, const gp_XY& TheP,
const Standard_Real aTol, Standard_Real& aDMin)
gp_XY V01(p1);V01-=p0;
gp_XY Vec(TheP);Vec -= p0;
-
+
Standard_Real u = Vec*V01.Normalized();
if(u<-aTol) return Standard_False;
Standard_Real u1 = u-aTol;
// VEdg-= PEdg2.XY();
// VCur-=PCur.XY();
// Standard_Real long1 = VEdg.SquareModulus();
-
+
// if(long1<=TolTol)
// return VCur.SquareModulus();
// Standard_Real Val = VEdg^VCur;
// return Val*Val/long1;
-
+
// }
static Standard_Boolean S3D_IsEdgeIn(const Standard_Integer e1,
//=======================================================================
//function : Select3D_SensitiveTriangulation
-//purpose :
+//purpose :
//=======================================================================
Select3D_SensitiveTriangulation::
myNodes2d(1,Trg->NbNodes()),
myDetectedTr(-1)
{
- // Code honteusement vole a DBRep_DrawableShape::Display...
- // calcul des edges libres et du cdg 3d de la triangulation:
- // Ce code devrait, pour plus de facilites etre integre dans la poly_triangulation...
+ // calculate free edges and cdg 3d of the triangulation:
+ // This code should have been integrated in poly_triangulation...
Standard_Integer fr = 1;
const Poly_Array1OfTriangle& triangles = myTriangul->Triangles();
- const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
+ const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
Standard_Integer nbTriangles (myTriangul->NbTriangles());
gp_XYZ cdg(0,0,0);
Standard_Integer n[3];
-
- // pour rechercher les connexions dans le cas ou on ne s'occupe de la frontiere...
+
+ // to find connections in case when the border is not concerned...
if(!myIntFlag){
myFreeEdges = new TColStd_HArray1OfInteger(1,2*S3D_NumberOfFreeEdges(Trg));
TColStd_Array1OfInteger& FreeE = myFreeEdges->ChangeArray1();
}
}
-
+
if(nbTriangles!=0) cdg /= nbTriangles;
myCDG3D = gp_Pnt(cdg);
-
+
ComputeTotalTrsf();
if(myTrsf.Form()!=gp_Identity)
//=======================================================================
//function : Select3D_SensitiveTriangulation
-//purpose :
+//purpose :
//=======================================================================
Select3D_SensitiveTriangulation::
Select3D_SensitiveTriangulation(const Handle(SelectBasics_EntityOwner)& OwnerId,
}
//=======================================================================
//function : Project
-//purpose :
+//purpose :
//=======================================================================
-void Select3D_SensitiveTriangulation::Project(const Handle(Select3D_Projector)& aPrj)
+void Select3D_SensitiveTriangulation::Project(const Select3D_Projector& aPrj)
{
Select3D_SensitiveEntity::Project(aPrj); // to set the field last proj...
-
+
mybox2d.SetVoid();
- const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
-
+ const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
+
gp_Pnt2d ProjPT;
-
+
for(Standard_Integer I=1;I<=myTriangul->NbNodes();I++){
if(myTrsf.Form()!=gp_Identity)
- aPrj->Project(Nodes(I).Transformed(myTrsf),ProjPT);
+ aPrj.Project(Nodes(I).Transformed(myTrsf),ProjPT);
else
- aPrj->Project(Nodes(I),ProjPT);
-
+ aPrj.Project(Nodes(I),ProjPT);
+
myNodes2d.SetValue(I,ProjPT);
mybox2d.Add(ProjPT);
}
-
- aPrj->Project(myCDG3D,myCDG2D);
+
+ aPrj.Project(myCDG3D,myCDG2D);
}
//=======================================================================
//function : Areas
-//purpose :
+//purpose :
//=======================================================================
-void Select3D_SensitiveTriangulation::Areas(SelectBasics_ListOfBox2d& boxes)
+void Select3D_SensitiveTriangulation::Areas(SelectBasics_ListOfBox2d& boxes)
{
boxes.Append(mybox2d);
}
+//=======================================================================
+//function : getUV
+//purpose : compute parameters of the picked point on triangle in 2d
+// Note: parameters of point P on triangle (P1, P2, P3) are defined
+// as U and V such that P = P1 + U * (P2 - P1) + V * (P3 - P1);
+// Range: U >= 0, V >= 0, U + V <= 1
+//=======================================================================
+
+static gp_XY getUV (const gp_XY& aP2d1, const gp_XY& aP2d2, const gp_XY& aP2d3,
+ const gp_XY& aPick)
+{
+ gp_XY aDU = aP2d2 - aP2d1;
+ gp_XY aDV = aP2d3 - aP2d1;
+ Standard_Real aDet = aDU ^ aDV;
+
+ // case of non-degenerated triangle
+ gp_XY aDP = aPick - aP2d1;
+ if ( Abs (aDet) > gp::Resolution() )
+ {
+ Standard_Real aU = (aDP ^ aDV) / aDet;
+ Standard_Real aV = -(aDP ^ aDU) / aDet;
+ if ( aU < 0. ) aU = 0.;
+ if ( aV < 0. ) aV = 0.;
+ if ( aU + aV > 1. ) { Standard_Real aD = aU + aV; aU /= aD; aV /= aD; }
+ return gp_XY (aU, aV);
+ }
+
+ // degenerated case (in 2d projection)
+ Standard_Real aL2U = aDU.SquareModulus();
+ Standard_Real aL2V = aDV.SquareModulus();
+ if ( aL2U < gp::Resolution() ) // side 1-2 is degenerated
+ {
+ if ( aL2V < gp::Resolution() ) // whole triangle is degenerated to point
+ return gp_XY (0., 0.);
+ else
+ return gp_XY (0., (aDP * aDV) / aL2V);
+ }
+ else if ( aL2V < gp::Resolution() ) // side 1-3 is degenerated
+ return gp_XY ((aDP * aDU) / aL2U, 0.);
+ else // sides 1-2 and 1-3 are collinear
+ {
+ // select parameter on one of sides so as to have points closer to picked
+ Standard_Real aU = Min (1., Max (0., (aDP * aDU) / aL2U));
+ Standard_Real aV = Min (1., Max (0., (aDP * aDV) / aL2V));
+ gp_XY aP2dU = aP2d1 + aU * aDU;
+ gp_XY aP2dV = aP2d1 + aV * aDV;
+ if ( (aPick - aP2dU).SquareModulus() < (aPick - aP2dV).SquareModulus() )
+ return gp_XY ((aDP * aDU) / aL2U, 0.);
+ else
+ return gp_XY (0., (aDP * aDV) / aL2V);
+ }
+}
+
//=======================================================================
//function : Matches
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean Select3D_SensitiveTriangulation::Matches(const Standard_Real X,
const Standard_Real Y,
const Standard_Real aTol,
- Standard_Real& DMin)
+ Standard_Real& DMin)
{
// get view direction (necessary for calculation of depth) from field mylastprj of the base class
- if (mylastprj.IsNull())
+ if ( ! mylastprj )
return Standard_False;
DMin = Precision::Infinite();
myDetectedTr = -1;
const Poly_Array1OfTriangle& triangles = myTriangul->Triangles();
- // on regarde si on est a l'interieur d'1 triangle 2d.
+ // it is checked if we are inside the triangle 2d.
if(myIntFlag)
{
- gp_Lin EyeLine = mylastprj->Shoot(X,Y);
+ gp_Lin EyeLine = (*((Select3D_Projector*)mylastprj)).Shoot(X,Y);
if ( myTrsf.Form()!=gp_Identity )
EyeLine.Transform (myTrsf.Inverted());
Standard_Real aMinDepth = Precision::Infinite();
- const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
+ const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
for (Standard_Integer itr=1; itr<=myTriangul->NbTriangles(); itr++)
{
Standard_Integer n1,n2,n3;
const gp_XY& aPnt2d1 = myNodes2d(n1).XY();
const gp_XY& aPnt2d2 = myNodes2d(n2).XY();
const gp_XY& aPnt2d3 = myNodes2d(n3).XY();
- gp_XY aUV;
- Standard_Real aDistSquare = Poly::PointOnTriangle (aPnt2d1, aPnt2d2, aPnt2d3, BidPoint, aUV);
- if ( aDistSquare > aTol * aTol )
+ Standard_Real DD = 0.;
+ if (Status (BidPoint, aPnt2d1, aPnt2d2, aPnt2d3, aTol, DD) == 2)
continue;
// compute depth on this triangle
+ gp_XY aUV = getUV (aPnt2d1, aPnt2d2, aPnt2d3, BidPoint);
Standard_Real aDepth1 = ElCLib::Parameter (EyeLine, Nodes(n1));
Standard_Real aDepth2 = ElCLib::Parameter (EyeLine, Nodes(n2));
Standard_Real aDepth3 = ElCLib::Parameter (EyeLine, Nodes(n3));
- Standard_Real aDepth = aDepth1 + aUV.X() * (aDepth2 - aDepth1) +
+ Standard_Real aDepth = aDepth1 + aUV.X() * (aDepth2 - aDepth1) +
aUV.Y() * (aDepth3 - aDepth1);
- // take triangle with lowest depth and within defined depth interval
- if (aDepth < aMinDepth &&
- aDepth > mylastprj->DepthMin() &&
- aDepth < mylastprj->DepthMax())
+ // take triangle with lowest depth
+ if ( aDepth < aMinDepth )
{
aMinDepth = aDepth;
myDetectedTr = itr;
- DMin = Sqrt (aDistSquare);
+ DMin = DD;
}
}
}
-
- // Cas Uniquement Test sur Frontiere de la triangulation...
- //
+
+ // Case only Test on Border of the triangulation...
+ //
else
{
//Standard_Integer ifirst;
Standard_Integer nn = FreeE.Length(), Node1,Node2;
//Standard_Real LEdg;
//Standard_Real DMinDMin,TolTol = aTol*aTol;
-
+
for (Standard_Integer ifri =1; ifri <= nn && myDetectedTr < 0; ifri+=2)
{
Node1 = FreeE(ifri);
myNodes2d(Node2).XY(),
BidPoint, aTol, DMin) )
{
- for(Standard_Integer itr=1; itr <= myTriangul->NbTriangles(); itr++)
+ for(Standard_Integer itr=1; itr <= myTriangul->NbTriangles(); itr++)
{
Standard_Integer n1,n2,n3;
- triangles(itr).Get(n1,n2,n3);
- if(S3D_IsEdgeIn(Node1,Node2,n1,n2,n3))
+ triangles(itr).Get(n1,n2,n3);
+ if(S3D_IsEdgeIn(Node1,Node2,n1,n2,n3))
{
- myDetectedTr = itr;
+ myDetectedTr = itr;
break; // return first found; selection of closest is not implemented yet
}
- }
+ }
}
}
- }
+ }
if ( myDetectedTr <= 0 )
return Standard_False;
-
- // compute and validate the depth (::Depth()) along the eyeline
- return Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+ Select3D_SensitiveEntity::Matches(X,Y,aTol,DMin);
+ return Standard_True;
}
//=======================================================================
//function : Matches
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean Select3D_SensitiveTriangulation::Matches(const Standard_Real XMin,
const Standard_Real YMin,
const Standard_Real XMax,
const Standard_Real YMax,
- const Standard_Real aTol)
+ const Standard_Real aTol)
{
Bnd_Box2d B;
B.Update(Min(XMin,XMax)-aTol,
Min(YMin,YMax)-aTol,
Max(XMin,XMax)+aTol,
Max(YMin,YMax)+aTol);
-
+
for(Standard_Integer i=myNodes2d.Lower();i<=myNodes2d.Upper();i++){
if(B.IsOut(myNodes2d(i)))
return Standard_False;
//=======================================================================
//function : Matches
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean Select3D_SensitiveTriangulation::
Matches (const TColgp_Array1OfPnt2d& aPoly,
const Bnd_Box2d& aBox,
const Standard_Real aTol)
-{
+{
Standard_Real Umin,Vmin,Umax,Vmax;
aBox.Get(Umin,Vmin,Umax,Vmax);
Standard_Real Tolu,Tolv;
//=======================================================================
//function : IsFree
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean Select3D_SensitiveTriangulation::IsFree(const Standard_Integer IndexOfTriangle,
TColStd_Array1OfInteger& FreeE = myFreeEdges->ChangeArray1();
for(Standard_Integer I=1;I<=FreeE.Length() && FoundIndex==-1;I+=2){
-
+
if(FreeE(I) == n[0]){
-
+
if(FreeE(I+1)== n[1] || FreeE(I+1)== n[2]) FoundIndex=I;}
else if(FreeE(I) == n[1]){
if(FreeE(I+1)== n[0] || FreeE(I+1)== n[2]) FoundIndex=I;}
else if(FreeE(I) == n[2]){
if(FreeE(I+1)== n[0] || FreeE(I+1)== n[1]) FoundIndex=I;}
}
-
+
return FoundIndex!=-1;
}
//=======================================================================
//function : GetConnected
-//purpose :
+//purpose :
//=======================================================================
Handle(Select3D_SensitiveEntity) Select3D_SensitiveTriangulation::
GetConnected(const TopLoc_Location& aLoc)
{
-
- Handle(Select3D_SensitiveTriangulation) NiouEnt =
+
+ Handle(Select3D_SensitiveTriangulation) NiouEnt =
new Select3D_SensitiveTriangulation(myOwnerId,myTriangul,myiniloc,myFreeEdges,myCDG3D,myIntFlag);
-
+
if(HasLocation()) NiouEnt->SetLocation(Location());
// TopLoc_Location TheLocToApply = HasLocation() ? Location()*aLoc : aLoc;
// if(!TheLocToApply.IsIdentity())
NiouEnt->UpdateLocation(aLoc);
-
+
return NiouEnt;
}
//=======================================================================
//function : ResetLocation
-//purpose :
+//purpose :
//=======================================================================
-void Select3D_SensitiveTriangulation::ResetLocation()
+void Select3D_SensitiveTriangulation::ResetLocation()
{
Select3D_SensitiveEntity::ResetLocation();
ComputeTotalTrsf();
//=======================================================================
//function : Dump
-//purpose :
+//purpose :
//=======================================================================
-void Select3D_SensitiveTriangulation::Dump(Standard_OStream& S,const Standard_Boolean FullDump) const
+void Select3D_SensitiveTriangulation::Dump(Standard_OStream& S,const Standard_Boolean FullDump) const
{
S<<"\tSensitiveTriangulation 3D :"<<endl;
if(myiniloc.IsIdentity())
S<<"\t\tExisting Initial Location"<<endl;
if(HasLocation())
S<<"\t\tExisting Location"<<endl;
-
+
S<<"\t\tNb Triangles : "<<myTriangul->NbTriangles()<<endl;
S<<"\t\tNb Nodes : "<<myTriangul->NbNodes()<<endl;
S<<"\t\tNb Free Edges: "<<myFreeEdges->Length()/2<<endl;
//=======================================================================
//function : ComputeDepth
-//purpose :
+//purpose :
//=======================================================================
Standard_Real Select3D_SensitiveTriangulation::ComputeDepth(const gp_Lin& EyeLine) const
{
- if(myDetectedTr==-1) return Precision::Infinite(); // non implemente actuellement...
+ if(myDetectedTr==-1) return Precision::Infinite(); // currently not implemented...
const Poly_Array1OfTriangle& triangles = myTriangul->Triangles();
- const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
-
+ const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
+
Standard_Integer n1,n2,n3;
triangles(myDetectedTr).Get(n1,n2,n3);
gp_Pnt P[3]={Nodes(n1),Nodes(n2),Nodes(n3)};
P[i].Transform(myTrsf);
}
}
-
- // formule calcul du parametre du point sur l'intersection
+
+ // formula calculate the parameter of the point on the intersection
// t = (P1P2 ^P1P3)* OP1 / ((P1P2^P1P3)*Dir)
Standard_Real prof(Precision::Infinite());
- gp_Pnt Oye = EyeLine.Location(); // origine de la ligne oeil/point vise...
+ gp_Pnt Oye = EyeLine.Location(); // origin of the target line eye/point...
gp_Dir Dir = EyeLine.Direction();
- gp_Vec Vtr[3];
+ gp_Vec Vtr[3];
for(Standard_Integer i=0;i<=2;i++)
Vtr[i] = gp_Vec(P[i%3],P[(i+1)%3]);
Vtr[2] = -Vtr[2];
-
- // eliminons tout de suite les cas singuliers...
+
+ // remove singular cases immediately...
Standard_Integer SingularCase(-1);
if(Vtr[0].SquareMagnitude()<= Precision::Confusion())
SingularCase = 0;
if(Vtr[2].SquareMagnitude()<= Precision::Confusion())
if( SingularCase < 0 ) SingularCase = 1;
#endif
-
- // 3 pts confondus...
+
+ // 3 pts mixed...
if(SingularCase ==2){
prof= ElCLib::Parameter(EyeLine,P[0]);
return prof;
}
-
+
if(SingularCase!=0)
Vtr[0].Normalize();
if(SingularCase!=1 &&
SingularCase!=2)
Vtr[2].Normalize();
gp_Vec OPo(Oye,P[0]);
- // 2 points confondus... on recherche l'intersection entre le segment et la ligne oeil/point vise.
- //
+ // 2 points mixed... the intersection between the segment and the target line eye/point.
+ //
if(SingularCase!=-1){
gp_Vec V = SingularCase==0 ? Vtr[2] : Vtr[0];
gp_Vec Det = Dir^V;
prof = VSM.Z()/Det.Z();
}
else{
-
+
Standard_Real val1 = OPo.DotCross(Vtr[0],Vtr[2]);
Standard_Real val2 = Dir.DotCross(Vtr[0],Vtr[2]);
-
+
if(Abs(val2)>Precision::Confusion())
prof =val1/val2;
- }
+ }
if (prof==Precision::Infinite()){
prof= ElCLib::Parameter(EyeLine,P[0]);
prof = Min (prof, ElCLib::Parameter(EyeLine,P[1]));
prof = Min (prof, ElCLib::Parameter(EyeLine,P[2]));
}
-
+
return prof;
}
//=======================================================================
//function : DetectedTriangle
-//purpose :
+//purpose :
//=======================================================================
Standard_Boolean Select3D_SensitiveTriangulation::DetectedTriangle(gp_Pnt& P1,
gp_Pnt& P2,
gp_Pnt& P3) const
{
- if(myDetectedTr==-1) return Standard_False; // non implemente actuellement...
+ if(myDetectedTr==-1) return Standard_False; // currently not implemented...
const Poly_Array1OfTriangle& triangles = myTriangul->Triangles();
- const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
+ const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
Standard_Integer n1,n2,n3;
triangles(myDetectedTr).Get(n1,n2,n3);
-
+
P1 = Nodes(n1);
P2 = Nodes(n2);
P3 = Nodes(n3);
P2.Transform(myTrsf);
P3.Transform(myTrsf);
}
-
+
return Standard_True;
}
//=============================================================================
// Function : DetectedTriangle2d
-// Purpose :
+// Purpose :
//=============================================================================
-Standard_Boolean Select3D_SensitiveTriangulation::DetectedTriangle2d(
+Standard_Boolean Select3D_SensitiveTriangulation::DetectedTriangle2d(
gp_Pnt2d& P1, gp_Pnt2d& P2, gp_Pnt2d& P3) const
{
- if(myDetectedTr==-1)
- return Standard_False; // non implemente actuellement...
+ if(myDetectedTr==-1)
+ return Standard_False; // currently not implemented...
const Poly_Array1OfTriangle& triangles = myTriangul->Triangles();
- const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
+ const TColgp_Array1OfPnt& Nodes = myTriangul->Nodes();
Standard_Integer n1,n2,n3;
triangles( myDetectedTr ).Get(n1,n2,n3);
int aLower = myNodes2d.Lower();
int anUpper = myNodes2d.Upper();
- if ( n1 >= aLower && n1 <= anUpper &&
+ if ( n1 >= aLower && n1 <= anUpper &&
n2 >= aLower && n2 <= anUpper &&
n3 >= aLower && n3 <= anUpper )
{
P3 = myNodes2d.Value( n3 );
return Standard_True;
}
- else
+ else
return Standard_False;
-
+
}
-void Select3D_SensitiveTriangulation::ComputeTotalTrsf()
+void Select3D_SensitiveTriangulation::ComputeTotalTrsf()
{
Standard_Boolean hasloc = (HasLocation() || !myiniloc.IsIdentity());
-
+
if(hasloc){
if(myiniloc.IsIdentity())
myTrsf = Location().Transformation();
// Author: Mister rmi
// <rmi>
-
-// Modified jmi/rob 29/8/96
-// appel de Loadmode dans Load d'un objet fait une seule fois.
-//
+
#include <SelectMgr_SelectionManager.ixx>
#include <SelectMgr_ViewerSelector.hxx>
if (!anObject->HasSelection(aMode)) LoadMode(anObject,aMode);
- // ATTENTION : si la selection est a remettre a jour, on le fait la ....
const Handle(SelectMgr_Selection)& Sel = anObject->Selection(aMode);
switch(Sel->UpdateStatus()){
if( SelectDebugModeOnSM() ) cout<<"===>SelectMgr_SelectionManager::Update"<<endl;
if(ForceUpdate){
- if( SelectDebugModeOnSM() ) cout<<"\tRecalcul Complet des selections"<<endl;
+ if( SelectDebugModeOnSM() ) cout<<"\t Global Recalculation of selections"<<endl;
if(aMode==-1){
anObject->UpdateSelection();
anObject->UpdateLocation();
}
return;
}
- // l'objet n'est pas connu du SMgr.
+ // objet is not known to SMgr.
if (!(myglobal.Contains(anObject) || mylocal.IsBound(anObject))){
- if( SelectDebugModeOnSM() ) {cout<<"\tObjet non charge dans le SelectionManager"<<endl;
- cout<<"\t on flagge ses selections eventuelles"<<endl;}
+ if( SelectDebugModeOnSM() ) {cout<<"\t Object not loaded in the SelectionManager"<<endl;
+ cout<<"\t eventual selections are flagged"<<endl;}
if( aMode == -1 ){
for(anObject->Init();anObject->More();anObject->Next()){
if( SelectDebugModeOnSM() ) cout<<"\t\t Mode "<<anObject->CurrentSelection()->Mode()<<" ";
anObject->Selection(aMode)->UpdateStatus(SelectMgr_TOU_Full);
}
- // la il l'est, il s'agit de recalculer ce qui doit l'etre
- // et de flagger ce qui est en sommeil...
+ // recalculate whatever is required
+ // and set flag on top...
else{
TColStd_MapIteratorOfMapOfTransient It;
Handle(Standard_Transient) Tr;
Standard_Boolean Found;
- // on balaye les selections de l'objet
+ // object selections are parsed
for(anObject->Init();anObject->More();anObject->Next()){
const Handle(SelectMgr_Selection)& Sel = anObject->CurrentSelection();
Standard_Integer curmode = Sel->Mode();
Found = Standard_False;
- // balayage des selecteurs ...
+ // parsing of selections ...
for(It.Initialize(myselectors);It.More();It.Next()){
Tr = It.Key();
Handle(SelectMgr_ViewerSelector) VS = *((Handle(SelectMgr_ViewerSelector)*)&Tr);
Found = Standard_True;
switch(Sel->UpdateStatus()){
case SelectMgr_TOU_Full:
- anObject->UpdateSelection(curmode); // pas de break expres...
+ anObject->UpdateSelection(curmode); // no break on purpose...
case SelectMgr_TOU_Partial:
anObject->UpdateLocation(Sel);
break;
//=======================================================================
//function : Update
-//purpose : On recalcule les Selections si elles sont flaggees
-// "A RECALCULER" et qu'elles sont activees dans un des selecteurs.
-// Si ForceUpdate = True, et qu'elles sont "A RECALCULER"
-// On le fait sans se preoccuper de l'etat d'activation.
+//purpose : Selections are recalculated if they are flagged
+// "TO RECALCULATE" and activated in one of selectors.
+// If ForceUpdate = True, and they are "TO RECALCULATE"
+// This is done without caring for the state of activation.
//=======================================================================
void SelectMgr_SelectionManager::Update(const Handle(SelectMgr_SelectableObject)& anObject,
const Standard_Boolean ForceUpdate)
if(ForceUpdate){
switch(Sel->UpdateStatus()){
case SelectMgr_TOU_Full:
- anObject->UpdateSelection(Sel->Mode()); // pas de break expres...
+ anObject->UpdateSelection(Sel->Mode()); // no break on purpose...
case SelectMgr_TOU_Partial:
anObject->UpdateLocation(Sel);
wasrecomputed = Standard_True;
Sel->UpdateStatus(SelectMgr_TOU_None);
}
- // on regarde quels selecteurs sont concernes par la selection
- // pour refaire les projections si besoin est.
+ // it is checked which selectors are concerned by the selection
+ // to redo projections if necessary.
Handle(Standard_Transient) Tr;
for(TColStd_MapIteratorOfMapOfTransient It(myselectors);It.More();It.Next()){
Tr = It.Key();
if(VS->Status(Sel)==SelectMgr_SOS_Activated)
switch(Sel->UpdateStatus()){
case SelectMgr_TOU_Full:
- anObject->UpdateSelection(Sel->Mode()); // pas de break expres...
+ anObject->UpdateSelection(Sel->Mode()); // no break on purpose...
case SelectMgr_TOU_Partial:
anObject->UpdateLocation(Sel);
wasrecomputed = Standard_True;
//==================================================
// Function: Update
-// Purpose : Attention, il faut savoir ce que l'on fait....
+// Purpose : Attention, it is required to know what is done...
//==================================================
void SelectMgr_SelectionManager::
Update(const Handle(SelectMgr_SelectableObject)& anObject,
if(ForceUpdate){
switch(Sel->UpdateStatus()){
case SelectMgr_TOU_Full:
- anObject->UpdateSelection(Sel->Mode()); // pas de break expres...
+ anObject->UpdateSelection(Sel->Mode()); // no break on purpose...
case SelectMgr_TOU_Partial:
anObject->UpdateLocation(Sel);
wasrecomputed = Standard_True;
if (toupdate) UpdateConversion();
if (tosort) UpdateSort();
if (myactivenb!=0){
- // on utilise les Bnd box dans un premier temps
+ // the Bnd boxes are used for the first time
Bnd_Box2d aBox;
Standard_Integer NbPnt = aPoly.Length();
Standard_Integer i;
//==================================================
// Function: LoadResult
-// Purpose : on laisse tomber pour l'instant la taille
-// de la primitive dans les criteres de tri...
-// On prend la priorite, la profondeur et
-// la distance mini au CDG ou Bords...
+// Purpose : for the moment the size of the primitive
+// is not taken into account in the search criteriai...
+// The priority, the depth and the min. distance to CDG or Borders is taken...
//==================================================
void SelectMgr_ViewerSelector::
LoadResult()
}
}
- // pas de tri a faire dans le cas d'une selection par rectangle elastique (BUG ANALYST)
+ // do not parse in case of selection by elastic rectangle (BUG ANALYST)
if(mystored.IsEmpty()) return;
if(myIndexes.IsNull())
myIndexes = new TColStd_HArray1OfInteger(1,mystored.Extent());
else if(mystored.Extent() !=myIndexes->Length())
myIndexes = new TColStd_HArray1OfInteger (1,mystored.Extent());
- // pour travailler plus vite...
+ // to work faster...
TColStd_Array1OfInteger& thearr = myIndexes->ChangeArray1();
for(Standard_Integer I=1;I<=mystored.Extent();I++)
thearr(I)=I;
else if(mystored.Extent() !=myIndexes->Length())
myIndexes = new TColStd_HArray1OfInteger (1,mystored.Extent());
- // pour travailler plus vite...
+ // to work faster...
TColStd_Array1OfInteger& thearr = myIndexes->ChangeArray1();
for(Standard_Integer I=1;I<=mystored.Extent();I++)
thearr(I)=I;
TCollection_AsciiString SelectMgr_ViewerSelector::
Status(const Handle(SelectMgr_SelectableObject)& SO) const
{
- TCollection_AsciiString Status("Status Objet :\n\t");
+ TCollection_AsciiString Status("Status Object :\n\t");
Standard_Boolean Found= Standard_False;
for(SO->Init();SO->More();SO->Next()){
if(myselections.IsBound(SO->CurrentSelection()))
TCollection_AsciiString(SO->CurrentSelection()->Mode()) +
" present - " ;
if(myselections(SO->CurrentSelection()))
- Status = Status + " Actif \n\t";
+ Status = Status + " Active \n\t";
else
- Status = Status + " Inactif \n\t";
+ Status = Status + " Inactive \n\t";
}
}
- if(!Found) Status = Status + "Non Present dans le selecteur\n\n";
+ if(!Found) Status = Status + "Not Present in the selector\n\n";
return Status;
}
TCollection_AsciiString SelectMgr_ViewerSelector::
Status () const
{
- // les primitives sensibles presentes
- //------------------------------------
+ // sevsitive primitives present
+ //-----------------------------
TCollection_AsciiString Status("\t\tSelector Status :\n\t");
- // les selections
- //---------------
+ // selections
+ //-----------
Standard_Integer NbActive =0,NbPrim=0;
Status = Status + "Number of already computed selections : " +
TCollection_AsciiString(myselections.Extent());
//=======================================================================
//function : SortResult
-//purpose : on a un certain nombre d'entites rangees avec leur critere
-// (profondeur, taille, priorite , distance de la souris
-// par rapport aux bords ou au CDG de la primitive detectee.
-// on va trier :
-// les priorites maxi.
-// puis un savant dosage entre profondeur et distance...
-// enfin on stocke dans myindexes les rangs en fonction de ce tri.
-// il ne reste plus qu'a lire
+//purpose : there is a certain number of entities ranged by criteria
+// (depth, size, priority, mouse distance from borders or
+// CDG of the detected primitive. Parsing :
+// maximum priorities .
+// then a reasonable compromise between depth and distance...
+// finally the ranges are stored in myindexes depending on the parsing.
+// so, it is possible to only read
//=======================================================================
void SelectMgr_ViewerSelector::SortResult()
{
if(myIndexes.IsNull() || anExtent != myIndexes->Length())
myIndexes = new TColStd_HArray1OfInteger (1, anExtent);
- // pour travailler plus vite...
+ // to work faster...
TColStd_Array1OfInteger& thearr = myIndexes->ChangeArray1();
- // on charge les index de 1 a N
+ // indices from 1 to N are loaded
Standard_Integer I ;
for (I=1; I <= anExtent; I++)
thearr(I)=I;
myprim (I) = myPrimArr (ind);
}
// OCC4201 (AGV): fin
- // ne nous restera plus qu'a recuperer les proprietaires correspondant aux index tries...
+ // it is enough to return owners corresponding to parced indices...
}
// find vertices not under ancestors.
TopAbs_ShapeEnum E = aShape.ShapeType();
if (E == TopAbs_COMPOUND) {
- // il faut presenter les vertex isoles a defaut de les cacher.
+ // it is necessary to present isolated vertexes instead of hiding them.
for (ex.Init(aShape, TopAbs_VERTEX, TopAbs_EDGE); ex.More(); ex.Next()) {
StdPrs_WFShape::Add(aPresentation, ex.Current(), aDrawer);
}
}
- // stockage dans le groupe:
+ // storage in the group:
HLRBRep_ListIteratorOfListOfBPoint ItB;
{
if ( ! aDrawer->ShadingAspectGlobal() ) {
-// Si la surface est fermee, on ne tracera pas les faces tournant le dos:
+// If the surface is closed, the faces from back-side are not traced:
Handle(Graphic3d_AspectFillArea3d) Asp = aDrawer->ShadingAspect()->Aspect();
if ( ! aDrawer->ShadingAspectGlobal() ) {
-// Si la surface est fermee, on ne tracera pas les faces tournant le dos:
+// If the surface is closed, the faces from back-side are not traced:
Handle(Graphic3d_AspectFillArea3d) Asp = aDrawer->ShadingAspect()->Aspect();
DU = (U2-U1)/ N1;
DV = (V2-V1)/ N2;
- // Calcul de la premiere ligne;
+ // Calculation of the first line;
for ( i = 1; i<= N2+1; i++) {
aSurface.D1(U1 , V1 + DV * (i-1),P,D1U,D1V);
}
break;
}
- Standard_Boolean First = Standard_True; // pour eviter de faire le begindraw s'il n'y a
- // rien (couteux ) rob 230996
+ Standard_Boolean First = Standard_True; // to avoid begindraw if there is nothing (expensive)
for(it.Initialize(mynew);it.More();it.Next()){
//==================================================
// Function: Load
-// Purpose : Version debuggee....
+// Purpose :
//==================================================
void StdSelect_BRepSelectionTool
aPriority,
NbPOnEdge);
- //chargement des selectables...
+ //loading of selectables...
for (aSelection->Init();aSelection->More();aSelection->Next()) {
Handle(SelectBasics_EntityOwner) BOwn = aSelection->Sensitive()->OwnerId();
Handle(SelectMgr_EntityOwner) Own = *((Handle(SelectMgr_EntityOwner)*) &BOwn);
//=====================================================
// Function : GetEdgeSensitive
-// Purpose : cree un edge sensible pour pouvoir l'ajouter
-// dans computeselection a "aselection" (cas d'une selection d'un edge)
-// ou a "aSensitiveWire" (cas d'une selection d'un wire; dans ce cas la,
-// c'est le sensitive wire qui est ajoute a "aselection" )
-// odl - pour la selection par rectangle -
+// Purpose : create a sensitive edge to add it
+// in computeselection to "aselection" (case of selection of an edge)
+// or to "aSensitiveWire" (case of selection of a wire; in this case,
+// the sensitive wire is added to "aselection" )
+// odl - for selection by rectangle -
//=====================================================
void StdSelect_BRepSelectionTool
::GetEdgeSensitive (const TopoDS_Shape& shap,
}
default:
{
- // modif-rob : on prend le meme deroulement que dans StdPrs_Curve
- // nb de points...
- //============================================
-
+
//aLimit = myDrawer->MaximalParameterValue(); ??
Standard_Real aLimit = 200.; // TODO (kgv) - do we need set MaxParam here?
Standard_Real V1 = cu3d.FirstParameter();
const Standard_Real MaxParam,
const Standard_Boolean InteriorFlag)
{
- // voyons s y a une triangulation de la face...
+ // check if there is triangulation of the face...
BRepAdaptor_Curve cu3d;
Handle(Poly_Triangulation) T;
TopLoc_Location loc;
return Standard_True;
}
- // pour les faces a bugs de triangulation ou sans autotriangulation ....
- // tres laid et ne devrait meme plus exister ...
+ // for faces with triangulation bugs or without autotriangulation ....
+ // very ugly and should not even exist ...
BRepAdaptor_Surface BS;
BS.Initialize (F);
BS.D0(FirstU,LastV,pcur);
P->SetValue(4,pcur);
P->SetValue(5,P->Value(1));
- // si le plan est "infini", on ne le rend sensible que sur sa frontiere delimitee par MaxParam
+ // if the plane is "infinite", it is sensitive only on the border limited by MaxParam
if(FirstU ==-MaxParam && LastU==MaxParam && FirstV ==-MaxParam && LastV==MaxParam)
LL.Append(new Select3D_SensitiveFace
(Owner, P, Select3D_TOS_BOUNDARY));
return Standard_True;
}
- // IL S'AGIT DE CONSTRUIRE UN POLYGONE "SENSIBLE" A PARTIR DU CONTOUR EXTERIEUR DE LA FACE...
- // CA N'EST PAS BEAU DU TOUT MAIS...
+ // This is construction of a sevsitive polygon from the exterior contour of the face...
+ // It is not good at all, but...
TopoDS_Wire aWire;
// Standard_Integer NbEdges=1;
TopExp_Explorer EW(F,TopAbs_WIRE);
if(EW.More())
- aWire = TopoDS::Wire(EW.Current()); // en esperant que c'est le premier... a voir
+ aWire = TopoDS::Wire(EW.Current()); // believing that this is the first... to be seen
#ifdef OCC872
if ( aWire.IsNull() )
if(BS.GetType()==GeomAbs_Cylinder ||
BS.GetType()==GeomAbs_Torus ||
BS.GetType()==GeomAbs_Cone ||
- BS.GetType()==GeomAbs_BSplineSurface) // beuurkk pour l'instant...
+ BS.GetType()==GeomAbs_BSplineSurface)
{
Standard_Real ff= wf ,ll= wl ;
Standard_Real dw
Standard_Integer ArrayPosition = WirePoints.Length();
Handle(TColgp_HArray1OfPnt) facepoints = new TColgp_HArray1OfPnt(1,ArrayPosition);
- // beurk beurk beurk...
for(Standard_Integer I=1 ;I<=ArrayPosition;I++)
{facepoints->SetValue (I, WirePoints.Value(I));}
- if ((facepoints->Array1()).Length() > 1) { // 1 si un seul edge circulaire plein.
+ if ((facepoints->Array1()).Length() > 1) { // 1 if only one circular edge
Select3D_TypeOfSensitivity TS = InteriorFlag ? Select3D_TOS_INTERIOR : Select3D_TOS_BOUNDARY;
LL.Append(new Select3D_SensitiveFace
(Owner, facepoints, TS));
// <rob@fidox>
-// Modifie par jmi le 21/9/96
-// Utilisation des termes StdSelect_Sphere pour StdSelect_Cone
-// StdSelect_Torus pour StdSelect_PlaneOrCone
-// StdSelect_Revol pour StdSelect_CylinderOrCone
-// en attendant la possibilite de modifier du CDL.
-// mettre a jour alors Placement-menu.ccl de DsgFront
-// et Part-placement.ccl de AssemblyScripts
-
#define BUC60576 //GG_5/10/99 Adds Cone to enum TypeOfFace
);
}
#ifdef BUC60576
- case StdSelect_Cone: // en attendant la liberation du cdl, on l'utilise pour Cone
+ case StdSelect_Cone: // waiting for the free cdl, it is used for Cone
{
BRepAdaptor_Surface surf(TopoDS::Face(anobj));
return (surf.GetType() == GeomAbs_Cone);
-//syl le 28/9/98: reactivation de 3 polices buggees + reagencement des polices
#include <V2d_DefaultMap.ixx>
#include <TColStd_Array1OfInteger.hxx>
#include <Aspect_ColorMapEntry.hxx>
if ( Norme >= 0.0001 ) {
VX= DX/Norme; VY = DY/Norme; VZ = DZ/Norme;
-//Construction d'un repere i,j pour le cercle:
+//Construction of marker i,j for the circle:
Xn=0., Yn=0., Zn=0.;
if ( Abs(VX) <= Abs(VY) && Abs(VX) <= Abs(VZ)) Xn=1.;
else if ( Abs(VY) <= Abs(VZ) && Abs(VY) <= Abs(VX)) Yn=1.;
cin >> u; cin >> v;
V3d::SetPlane (aViewer, x1, y1, z1, x2, y2, z2);
- // Pour relancer le calcul selon le nouveau plan
+ // To restart the calculation on the new plane
if (aViewer->Grid ()->IsActive ()) {
Standard_Real xo, yo;
Quantity_PlaneAngle angle;
Standard_Real X,Y,Z;
Graphic3d_Vertex P,T;
-// Le point oeil definit la position de la camera
+// The eye point defines the position of the camera
aView->Eye(X,Y,Z);
P.SetCoord(X,Y,Z);
MyPosition = P;
- // Le point vise definit la cible de la camera
+ // The target point defines the target of the camera
aView->At(X,Y,Z);
T.SetCoord(X,Y,Z);
MyTarget = T;
-// Angle d'inclinaison de la camera
+// Incline Angle of the camera
MyAngle = aView->Twist();
-// Angle d'ouverture de la camera
+// Aperture Angle of the camera
MyAperture = (aView->DynamicType()==STANDARD_TYPE(V3d_PerspectiveView)) ?
((Handle(V3d_PerspectiveView)&)aView)->Angle() : 0.;
Standard_Real X0,Y0,Z0,Xn,Yn,Zn;
-// Le point cible reste inchange, seul la position de la camera est modifiee
-// en conservant la direction.
+// Targer point remains unchanged, only the position of the camera is modified
+// preserving the direction.
Graphic3d_Vector D(MyTarget,MyPosition);
D.Normalize();
D.Coord(Xn,Yn,Zn);
Rayon = this->Radius();
MyPosition.Coord(XP,YP,ZP);
SymetricPointOnSphere(aView,MyTarget,MyPosition,Rayon,X,Y,Z,VX,VY,VZ);
- // Actuellement est on sur le point vu
+ // This point is visible
if ( (VX*(X-XP) < 0.) && (VY*(Y-YP) < 0.) && (VZ*(Z-ZP) < 0.) ) {
this->SetPosition(X,Y,Z);
}
Rayon = this->Radius();
MyPosition.Coord(XP,YP,ZP);
SymetricPointOnSphere(aView,MyTarget,MyPosition,Rayon,X,Y,Z,VX,VY,VZ);
- // Actuellement est on sur le point cache
+ // This point is hidden
if ( (VX*(X-XP) > 0.) && (VY*(Y-YP) > 0.) && (VZ*(Z-ZP) > 0.) ) {
this->SetPosition(X,Y,Z);
}
Rayon = this->Radius();
MyPosition.Coord(XP,YP,ZP);
SymetricPointOnSphere(aView,MyTarget,MyPosition,Rayon,X,Y,Z,VX,VY,VZ);
- // Avons nous le point cache ou le point vu
+ // Is it a visible or a hidden point?
if ( (VX*(X-XP) > 0.) || (VY*(Y-YP) > 0.) || (VZ*(Z-ZP) > 0.) )
-// la source est sur la face cachee
+// the source is on the hidden face
Val = Standard_False;
else
- // la source est sur la face vue.
+ // the source is on the visible face.
Val = Standard_True;
return Val;
Graphic3d_Array1OfVertex VN2(1,NbPoints+1);
Graphic3d_Array1OfVertex V2(1,2);
-// Direction de la camera
+// Direction of the camera
MyPosition.Coord(XP,YP,ZP);
MyTarget.Coord(X0,Y0,Z0);
Dx = X0 - XP; Dy = Y0 - YP; Dz = Z0 - ZP;
Lng = this->Radius()/10.;
-// Recherche des centres des carres de base du boitier de la camera :
+// Find centers of base squares of the case of the camera :
Xc1 = XP - Dx * Lng; Yc1 = YP - Dy * Lng; Zc1 = ZP - Dz * Lng;
Xc2 = XP + Dx * Lng; Yc2 = YP + Dy * Lng; Zc2 = ZP + Dz * Lng;
-// Construction d'un repere i,j pour les rectangles :
+// Construction of a mark i,j for rectangles :
Xn=0., Yn=0., Zn=0.;
if ( Abs(Dx) <= Abs(Dy) && Abs(Dx) <= Abs(Dz)) Xn=1.;
Yj = Dz * Xi - Dx * Zi;
Zj = Dx * Yi - Dy * Xi;
-// Dessin du boitier
+// Scheme of the case
for (i = 1 ; i <= NbPoints ; i++) {
cosinus = Cos ( Alpha + (i - 1) * Standard_PI/2. );
sinus = Sin ( Alpha + (i - 1) * Standard_PI/2. );
- // Premier carre de base
+ // First base square
X = Xc1 + (cosinus * Xi + sinus * Xj) * Lng / 2.;
Y = Yc1 + (cosinus * Yi + sinus * Yj) * Lng / 2.;
Z = Zc1 + (cosinus * Zi + sinus * Zj) * Lng / 2.;
if(i==1) VN1(NbPoints+1).SetCoord(X,Y,Z);
V2(1).SetCoord(X,Y,Z);
-// Second carre de base
+// Second base square
X = Xc2 + (cosinus * Xi + sinus * Xj) * Lng / 2.;
Y = Yc2 + (cosinus * Yi + sinus * Yj) * Lng / 2.;
Z = Zc2 + (cosinus * Zi + sinus * Zj) * Lng / 2.;
gsymbol->Polyline(VN1);
gsymbol->Polyline(VN2);
-// Dessin de l'objectif
+// Scheme of the objective
for (i = 1 ; i <= NbPoints ; i++) {
cosinus = Cos ( Alpha + (i - 1) * Standard_PI/2. );
if(i==1) VN1(NbPoints+1).SetCoord(X,Y,Z);
V2(1).SetCoord(X,Y,Z);
-// Second carre de base
+// Second base square
X = Xc2 + Dx * Lng / 6. + (cosinus * Xi + sinus * Xj) * Lng / 3.;
Y = Yc2 + Dy * Lng / 6. + (cosinus * Yi + sinus * Yj) * Lng / 3.;
Z = Zc2 + Dz * Lng / 6. + (cosinus * Zi + sinus * Zj) * Lng / 3.;
V3d_TypeOfUpdate UpdSov;
-// Creation d'une structure d'elements reperables (la position de
-// la camera, et la sphere de deplacement de cette camera)
+// Creation of a structure of markable elements (position of the
+// camera, and the sphere of displacement of this camera)
Pres = TPres;
Handle(V3d_Viewer) TheViewer = aView->Viewer();
Handle(Graphic3d_Group) gsphere;
if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) gsphere = new Graphic3d_Group(MyGraphicStructure);
-// Creation d'une structure d'elements non reperables ( meridien et
-// parallele ).
+// Creation of a structure of non-markable elements (meridian and
+// parallel ).
Handle(Graphic3d_Group) gnopick = new Graphic3d_Group(MyGraphicStructure1);
MyGraphicStructure1->SetPick(Standard_False);
MyTarget.Coord(X0,Y0,Z0);
-//Affichage de la position de la camera.
+// Display of the position of the camera.
gcamera->SetPickId(1);
if (Pres == V3d_SIMPLE) {
-// on dessine un viseur
+// a viewfinder is drawn
Graphic3d_Array1OfVertex PViseur(1,2);
aView->Project(X0,Y0,Z0,PXT,PYT);
aView->Convert(PXT,PYT,IXP,IYP);
PViseur(2).SetCoord(X+X0-XT,Y+Y0-YT,Z+Z0-ZT);
gcamera->Polyline(PViseur);
}
-// on dessine une camera
+// a camera is drawn
else this->Symbol(gcamera,aView);
-//Affichage de la sphere de reperage (limite au cercle).
+// Display of the marking sphere (limited to circle).
if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) {
gsphere->SetPickId(2);
V3d::CircleInPlane(gsphere,X0,Y0,Z0,VX,VY,VZ,Rayon);
-//Affichage du rayon de la sphere (ligne + texte)
+// Display of the radius of the sphere (line + text)
if (Pres == V3d_COMPLETE) {
gradius->SetPickId(3);
gradius->Text(ValOfRadius.ToCString(),PText,0.01);
}
-//Affichage du meridien
+// Display of the meridian
Quantity_Color Col2(Quantity_NOC_GREEN);
Handle(Graphic3d_AspectLine3d) Asp2 = new Graphic3d_AspectLine3d
(Col2,Aspect_TOL_SOLID,1.);
gnopick->SetPrimitivesAspect(Asp2);
- // Definition de l'axe du cercle
+ // Definition of the axis of circle
aView->Up(DXRef,DYRef,DZRef);
this->Position(X,Y,Z);
DXini = X-X0; DYini = Y-Y0; DZini = Z-Z0;
V3d::CircleInPlane(gnopick,X0,Y0,Z0,VX,VY,VZ,Rayon);
-//Affichage de la parallele
+// Display of the parallel
-// Definition de l'axe du cercle
+// Definition of the axis of circle
aView->Proj(VX,VY,VZ);
aView->Up(X1,Y1,Z1);
DXRef = VY * Z1 - VZ * Y1;
MyTarget.Coord(X0,Y0,Z0);
aView->Project(X0,Y0,Z0,PXT,PYT);
aView->Convert(PXT,PYT,IPX,IPY);
- // Coord 3d dans le plan de projection de la cible.
+ // Coord 3d in the plane of projection of the target.
aView->Convert(IPX,IPY,XT,YT,ZT);
switch (WhatPick) {
case V3d_POSITIONCAMERA :
- // Les Coordonnees doivent rester a l'interieur de la sphere
+ // Coordinates should remain inside of the sphere
Rayon = this->Radius();
XMinTrack = PXT - Rayon;
XMaxTrack = PXT + Rayon;
DeltaY = Y0 - YP;
DeltaZ = Z0 - ZP;
-// On recherche le point d'intersection des droites definies
-// par :
-// - Droite passant par le point de projection et l'oeil
-// si on est en perspective, parralele a la normale de la
-// vue si on a une vue axonometrique.
-// position dans la vue est // a la normale de la vue
-// - La distance position de la camera cible est egale au
-// rayon.
+// The point of intersection of straight lines defined by :
+// - Straight line passing by the point of projection and the eye
+// if this is a perspective, parallel to the normal of the
+// view if there is an axonometric view.
+// position in the view is parallel to the normal of the view
+// - The distance position of the target camera cible is equal
+// to the radius.
A = VX*VX + VY*VY + VZ*VZ ;
B = -2. * (VX*DeltaX + VY*DeltaY + VZ*DeltaZ);
}
case V3d_SPACECAMERA :
aView->Convert(PXT,PYT,IPX,IPY);
-// Dans ce cas Xpix,Ypix correspondent a une distance , relative
-// a la translation que l'on veut effectuer sur la sphere.
+// In case Xpix,Ypix corresponding to a distance , relative
+// to the translation that is planned to be done on the sphere.
aView->Convert(IPX+Xpix,IPY+Ypix,X,Y,Z);
X = X+X0-XT;
Y = Y+Y0-YT;
break;
case V3d_ExtRADIUSCAMERA :
-// on cherche a conserver la direction cible positionnement de la
-// camera ==> on projette le point sur la direction cible camera.
+// It is attempted to preserve the target positioning direction of the
+// camera ==> the point is projected on the target camera direction.
this->Position(Xi,Yi,Zi);
aView->Project(Xi,Yi,Zi,PXP,PYP);
DX = PXP - PXT;
}
break;
case V3d_IntRADIUSCAMERA :
-// on cherche a conserver la direction cible positionnement
-// de la camera ==> on projette le point sur la direction
-// cible camera.
+// It is attempted to preserve the target positioning direction of the
+// camera ==> the point is projected on the target camera direction.
this->Position(Xi,Yi,Zi);
aView->Project(Xi,Yi,Zi,PXP,PYP);
DX = PXP - PXT;
Rap = NewRprj/OldRprj;
Rayon = this->Radius();
Rayon = Rayon * Rap;
-// la camera doit rester a une position fixe, seule la cible
-// est modifie.
+// the camera should remain at a fixed position, only the target is modified.
Graphic3d_Vector Dir(MyPosition,MyTarget);
Dir.Normalize();
Dir.Coord(X,Y,Z);
aView->At(Xv,Yv,Zv);
aView->Project(Xv,Yv,Zv,PXT,PYT);
aView->Convert(PXT,PYT,IPX,IPY);
-// Recherche de tangage ==> Xpix = IPX et Ypix inverse
-// C'est le point vise qui tourne autour de l'axe passant par l'oeil et
-// de direction un vecteur appartenant au plan de la vue et
-// perpendiculaire au vecteur haut de la vue.
+// Find the pitching ==> Xpix = IPX and Ypix inverted
+// The target point turns around an axis passing through the eye and the
+// direction of vector belonging to the view plane
+// and perpendicular to the vector above the view.
if ( Ypix != IPY ) {
aView->Size(Width,Height);
IHeight = aView->Convert(Height);
Xf = Xp * MatRot(0,0) + Yp * MatRot(0,1) + Zp * MatRot(0,2);
Yf = Xp * MatRot(1,0) + Yp * MatRot(1,1) + Zp * MatRot(1,2);
Zf = Xp * MatRot(2,0) + Yp * MatRot(2,1) + Zp * MatRot(2,2);
-// Rotation du point vise (cible de la camera)
+// Rotation of the target point (target of the camera)
X1 = Xc * MatRot(0,0) + Yc * MatRot(0,1) + Zc * MatRot(0,2);
Y1 = Xc * MatRot(1,0) + Yc * MatRot(1,1) + Zc * MatRot(1,2);
Z1 = Xc * MatRot(2,0) + Yc * MatRot(2,1) + Zc * MatRot(2,2);
Xc = X1 + Xp - Xf ; Yc = Y1 + Yp - Yf ; Zc = Z1 + Zp - Zf;
MyTarget.SetCoord(Xc,Yc,Zc);
}
-// Recherche de roulis determine par Xpix
+// Find the rolling determined by Xpix
if ( Xpix != IPX ) {
IWidth = aView->Convert(Width);
Beta = ((IPX - Xpix)*Standard_PI)/(IWidth*2.);
void V3d_Camera::EarthPilot( const Handle(V3d_View)& aView,
const Standard_Integer Xpix,
const Standard_Integer Ypix) {
-// Le pilotage en mode terrestre, ressemble a la conduite d'une voiture
-// Dans ce cas, seul le point cible est modifie.
+// Piloting in land mode, resembles to the car driving
+// In this case, only the target point is modified.
Standard_Real Xp,Yp,Zp,Xc,Yc,Zc,Xv,Yv,Zv,Xf,Yf,Zf;
Standard_Real VX,VY,VZ,DXH,DYH,DZH,A,B,C,PXT,PYT,X1,Y1,Z1,Dist;
aView->At(Xv,Yv,Zv);
aView->Project(Xv,Yv,Zv,PXT,PYT);
aView->Convert(PXT,PYT,IPX,IPY);
- // Recherche d' inclinaison==> Xpix = IPX et Ypix inverse
-// C'est le point vise qui tourne autour de l'axe passant par l'oeil et
-// de direction un vecteur appartenant au plan de la vue et
-// perpendiculaire au vecteur haut de la vue.
+// Find the pitching ==> Xpix = IPX and Ypix inverted
+// The target point turns around an axis passing through the eye and the
+// direction of vector belonging to the view plane
+// and perpendicular to the vector above the view.
if ( Ypix != IPY ) {
aView->Size(Width,Height);
IHeight = aView->Convert(Height);
Xf = Xp * MatRot(0,0) + Yp * MatRot(0,1) + Zp * MatRot(0,2);
Yf = Xp * MatRot(1,0) + Yp * MatRot(1,1) + Zp * MatRot(1,2);
Zf = Xp * MatRot(2,0) + Yp * MatRot(2,1) + Zp * MatRot(2,2);
-// Rotation du point vise (cible de la camera)
+// Rotation of the target point (target of the camera)
X1 = Xc * MatRot(0,0) + Yc * MatRot(0,1) + Zc * MatRot(0,2);
Y1 = Xc * MatRot(1,0) + Yc * MatRot(1,1) + Zc * MatRot(1,2);
Z1 = Xc * MatRot(2,0) + Yc * MatRot(2,1) + Zc * MatRot(2,2);
Xc = X1 + Xp - Xf ; Yc = Y1 + Yp - Yf ; Zc = Z1 + Zp - Zf;
}
-// Recherche de virage ==> Ypix = IPY . Le point vise tourne aoutour
-// d'un axe // au vecteur haut passant par l'oeil
+// Find turning ==> Ypix = IPY . The target point rotates around
+// an axis // a vector above passing through the eye
if ( Xpix != IPX ) {
IWidth = aView->Convert(Width);
Beta = ((IPX - Xpix)*Standard_PI)/(IWidth*2.);
Xf = Xp * MatRot(0,0) + Yp * MatRot(0,1) + Zp * MatRot(0,2);
Yf = Xp * MatRot(1,0) + Yp * MatRot(1,1) + Zp * MatRot(1,2);
Zf = Xp * MatRot(2,0) + Yp * MatRot(2,1) + Zp * MatRot(2,2);
- // Rotation du point vise (cible de la camera)
+ // Rotation of the target point (target of the camera)
X1 = Xc * MatRot(0,0) + Yc * MatRot(0,1) + Zc * MatRot(0,2);
Y1 = Xc * MatRot(1,0) + Yc * MatRot(1,1) + Zc * MatRot(1,2);
Z1 = Xc * MatRot(2,0) + Yc * MatRot(2,1) + Zc * MatRot(2,2);
}
void V3d_Camera::Move (const Standard_Real Dist) {
-// Deplacement de la camera en conservant la direction camera - cible.
+// Displacement of the camera by preserving the direction camera - target.
Standard_Real XP,YP,ZP,X0,Y0,Z0,DX,DY,DZ,Norme;
void V3d_Camera::GoUp (const Standard_Real Haut) {
-// Deplacement de la camera suivant l'axe z, en conservant la direction camera
-// cible de la camera
+// Displacement of the camera by axis z, preserving the direction camera -
+// target of the camera
MyPosition.SetZCoord(MyPosition.Z()+Haut);
MyTarget.SetZCoord(MyTarget.Z()+Haut);
DeltaY = Y0 - YP;
DeltaZ = Z0 - ZP;
-// On recherche le point d'intersection des droites definies
-// par :
-// - Droite passant par le point de projection et l'oeil
-// si on est en perspective, parralele a la normale de la
-// vue si on a une vue axonometrique.
-// position dans la vue est // a la normale de la vue
-// - La distance position de la camera cible est egale au
-// rayon.
+// The point of intersection of straight lines defined by :
+// - Straight line passing by the point of projection and the eye
+// if this is a perspective, parallel to the normal of the
+// view if there is an axonometric view.
+// position in the view is parallel to the normal of the view
+// - The distance position of the target camera cible is equal
+// to the radius.
A = VX*VX + VY*VY + VZ*VZ ;
B = -2. * (VX*DeltaX + VY*DeltaY + VZ*DeltaZ);
----------
Classe V3d_CircularGrid :
- HISTORIQUE DES MODIFICATIONS :
+ VERSION HISTORY :
--------------------------------
- 16-08-98 : CAL ; S3892. Ajout grilles 3d.
- 13-10-98 : CAL ; S3892. Ajout de la gestion de la taille des grilles 3d.
- 23-10-98 : CAL ; PRO 15885. Patch K4403 et K4404
- 03-11-98 : CAL ; PRO 16161. Patch K4418 et K4419
IMP230300: GG The color fields and methods have moved in Aspect_Grid
Trsf (1, 4) = xl,
Trsf (2, 4) = yl,
Trsf (3, 4) = zl;
- // Transformation de changement de repere
+ // Transformation change of marker
Trsf (1, 1) = xdx,
Trsf (2, 1) = xdy,
Trsf (3, 1) = xdz,
Trsf (3, 3) = dz;
myStructure->SetTransform (Trsf, Graphic3d_TOC_REPLACE);
- // Translation de l'origine
+ // Translation of the origin
Trsf (1, 4) = -XOrigin (),
Trsf (2, 4) = -YOrigin (),
Trsf (3, 4) = 0.0;
- // Rotation Alpha autour de l'axe -Z
+ // Rotation Alpha around axis -Z
Trsf (1, 1) = CosAlpha,
Trsf (2, 1) = -SinAlpha,
Trsf (3, 1) = 0.0,
Trsf (3, 3) = 1.0;
myStructure->SetTransform (Trsf,Graphic3d_TOC_POSTCONCATENATE);
- // CAL : 19 aout 1998
- // Il y avait aussi la possibilite de faire le calcul
- // de changement de repere par :
- // gp_Trsf::SetTransformation
- // (myGridPlane, myViewer->PrivilegedPlane ());
#ifdef TRACE_VALUES
Standard_Integer i, j;
#ifdef TRACE_MAKE
cout << "MakeCercles" << endl;
#endif
- // cercles
+ // circles
#ifdef IMP300300
Standard_Integer nblines = 0;
#endif
#ifdef TRACE_MAKE
cout << "MakeDiametres" << endl;
#endif
- // diametres
+ // diameters
myGroup1->Clear ();
myGroup1->SetGroupPrimitivesAspect (MarkerAttrib);
myGroup1->BeginPrimitives ();
MyType = V3d_DIRECTIONAL ;
MyLight = new Visual3d_Light(C,V, Headlight) ;
- // On choisit aleatoirement comme cible l'origine
+ // The initial target is chosen at random
MyTarget = T;
-// On deduit une position
+// Position is found
P.SetCoord(-V.X(),-V.Y(),-V.Z());
MyDisplayPosition = P;
Rayon = this->Radius();
aView->Project(Xi,Yi,Zi,PXT,PYT);
aView->Convert(PXT,PYT,IXP,IYP);
-// Coord 3d dans le plan de projection de la source.
+// Coordinated 3d in the plane of projection of the source.
aView->Convert(IXP,IYP,XT,YT,ZT);
aView->Convert(PXT,PYT+Rayon,IXP,IYP);
aView->Convert(IXP,IYP,X,Y,Z);
X = X+Xi-XT; Y = Y+Yi-YT; Z = Z+Zi-ZT;
Dist = Sqrt( Square(X-Xi) + Square(Y-Yi) + Square(Z-Zi) );
-// Axe de rotation.
+// Axis of rotation.
A = (X-Xi)/Dist;
B = (Y-Yi)/Dist;
C = (Z-Zi)/Dist;
-// On dessine une sphere
+// A sphere is drawn
V3d::CircleInPlane(gsymbol,Xi,Yi,Zi,VX,VY,VZ,Rayon/40.);
for( j=1 ; j<=3 ; j++ ) {
Beta = j * Standard_PI/4.;
Xf = Xi * MatRot(0,0) + Yi * MatRot(0,1) + Zi * MatRot(0,2);
Yf = Xi * MatRot(1,0) + Yi * MatRot(1,1) + Zi * MatRot(1,2);
Zf = Xi * MatRot(2,0) + Yi * MatRot(2,1) + Zi * MatRot(2,2);
-// Rotation de la normale
+// Rotation of the normal
X1 = VX * MatRot(0,0) + VY * MatRot(0,1) + VZ * MatRot(0,2);
Y1 = VX * MatRot(1,0) + VY * MatRot(1,1) + VZ * MatRot(1,2);
Z1 = VX * MatRot(2,0) + VY * MatRot(2,1) + VZ * MatRot(2,2);
V3d::CircleInPlane(gsymbol,Xi,Yi,Zi,VX,VY,VZ,Rayon/40.);
}
-// On dessine la fleche
+// The arrow is drawn
Rayon = this->Radius();
this->Direction(DX,DY,DZ);
X = Xi + DX*Rayon/10.; Y = Yi + DY*Rayon/10.; Z = Zi + DZ*Rayon/10.;
V3d_TypeOfRepresentation Pres;
V3d_TypeOfUpdate UpdSov;
-// Creation d'une structure slight d'elements reperables (la position de
-// la light, et le domaine d'eclairage represente par un cercle)
-// Creation d'une structure snopick d'elements non reperables ( cible, meridien et
-// parallele ).
+// Creation of a structure of markable elements (position of the
+// light, and the domain of lighting represented by a circle)
+// Creation of a structure of non-markable elements (target, meridian and
+// parallel).
Pres = TPres;
Handle(V3d_Viewer) TheViewer = aView->Viewer();
Y0 = MyTarget.Y();
Z0 = MyTarget.Z();
-//Affichage de la position de la light.
+//Display of the position of the light.
glight->SetPickId(1);
this->Color(Quantity_TOC_RGB,R1,G1,B1);
glight->SetPrimitivesAspect(Asp1);
this->Symbol(glight,aView);
- //Affichage de la sphere de reperage (limite au cercle).
+ // Display of the markable sphere (limit at the circle).
if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) {
gsphere->SetPickId(2);
V3d::CircleInPlane(gsphere,X0,Y0,Z0,VX,VY,VZ,Rayon);
-//Affichage du meridien
+//Display of the meridian
Quantity_Color Col2(Quantity_NOC_GREEN);
Handle(Graphic3d_AspectLine3d) Asp2 = new Graphic3d_AspectLine3d
(Col2,Aspect_TOL_SOLID,1.);
gnopick->SetPrimitivesAspect(Asp2);
-// Definition de l'axe du cercle
+// Definition of the axis of circle
aView->Up(DXRef,DYRef,DZRef);
this->DisplayPosition(X,Y,Z);
DXini = X-X0; DYini = Y-Y0; DZini = Z-Z0;
V3d::CircleInPlane(gnopick,X0,Y0,Z0,VX,VY,VZ,Rayon);
-// Affichage de la parallele
+// Display of the parallel
-// Definition de l'axe du cercle
+// Definition of the axis of circle
aView->Proj(VX,VY,VZ);
aView->Up(X1,Y1,Z1);
DXRef = VY * Z1 - VZ * Y1;
HISTORIQUE DES MODIFICATIONS :
--------------------------------
00-09-92 : GG ; Creation.
- 18-06-96 : FMN ; Ajout MyGraphicStructure1 pour sauvegarder snopick
30-03-98 : ZOV ; PRO6774 (reconstruction of the class hierarchy and suppressing useless methods)
IMP230300: GG Add SetColor() and Color() methods
IMP231100: GG Add IsDisplayed() method
DeltaY = Y0 - YP;
DeltaZ = Z0 - ZP;
-// On recherche le point d'intersection des droites definies
-// par :
-// - Droite passant par le point de projection et l'oeil
-// si on est en perspective, parralele a la normale de la
-// vue si on a une vue axonometrique.
-// position dans la vue est // a la normale de la vue
-// - La distance position de la camera cible est egale au
-// rayon.
+// The point of intersection of straight lines defined by :
+// - Straight line passing by the point of projection and the eye
+// if this is a perspective, parralel to the normal of the view
+// if this is an axonometric view.
+// position in the view is parallel to the normal of the view
+// - The distance position of the target camera is equal to the radius.
A = VX*VX + VY*VY + VZ*VZ ;
B = -2. * (VX*DeltaX + VY*DeltaY + VZ*DeltaZ);
Standard_Real Xc,Yc,Zc, Xp,Yp,Zp;
- // Recalcul de la position
+ // Recalculation of the position
MyTarget.Coord(Xc,Yc,Zc);
Position (Xp,Yp,Zp) ;
Standard_Real X0,Y0,Z0, Xn,Yn,Zn, Xp,Yp,Zp;
- // Le point cible reste inchange, seul la position de la lumiere est modifiee
- // en conservant la direction.
+ // The target point remains unchanged, only the position of the light is modified
+ // by preserving the direction.
Position (Xp,Yp,Zp);
Graphic3d_Vector D(MyTarget, Graphic3d_Vertex(Xp, Yp, Zp));
D.Normalize();
V3d_Light::SymetricPointOnSphere (aView,
MyTarget, Graphic3d_Vertex(Xp,Yp,Yp), Radius(), X,Y,Z, VX,VY,VZ);
- // Actuellement est on sur le point vu
+ // This is a visible point
if ((VX*(X-Xp) < 0.) && (VY*(Y-Yp) < 0.) && (VZ*(Z-Zp) < 0.))
SetPosition (X,Y,Z);
}
V3d_Light::SymetricPointOnSphere (aView,
MyTarget, Graphic3d_Vertex(Xp,Yp,Yp), Radius(), X,Y,Z, VX,VY,VZ);
- // Actuellement est on sur le point cache
+ // This is a hidden point
if ((VX*(X-Xp) > 0.) && (VY*(Y-Yp) > 0.) && (VZ*(Z-Zp) > 0.))
SetPosition (X,Y,Z);
}
V3d_Light::SymetricPointOnSphere (aView,
MyTarget, Graphic3d_Vertex(Xp,Yp,Yp), Radius(), X,Y,Z, VX,VY,VZ);
- // Avons nous le point cache ou le point vu
+ // Is it a visible or a hidden point
return ( (VX*(X-Xp) > 0.) || (VY*(Y-Yp) > 0.) || (VZ*(Z-Zp) > 0.) )?
- // la source est sur la face cachee
+ // the source is on the hidden face
Standard_False:
- // la source est sur la face vue.
+ // the source is on the visible face.
Standard_True;
}
V3d_TypeOfRepresentation Pres;
V3d_TypeOfUpdate UpdSov;
-// Creation d'une structure slight d'elements reperables (la position de
-// la light, et le domaine d'eclairage represente par un cercle)
-// Creation d'une structure snopick d'elements non reperables ( cible, meridien et
-// parallele ).
+// Creation of a structure of markable elements (position of the
+// light, and the domain of lighting represented by a circle)
+// Creation of a structure snopick of non-markable elements (target, meridian and
+// parallel).
+
Pres = TPres;
Handle(V3d_Viewer) TheViewer = aView->Viewer();
Y0 = MyTarget.Y();
Z0 = MyTarget.Z();
-//Affichage de la position de la light.
+// Display of the light position.
glight->SetPickId(1);
this->Color(Quantity_TOC_RGB,R1,G1,B1);
glight->SetPrimitivesAspect(Asp1);
this->Symbol(glight,aView);
-//Affichage de la sphere de reperage (limite au cercle).
+// Display of the marking sphere (limit at the circle).
if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) {
if (MyType != V3d_DIRECTIONAL) {
- //Affichage du rayon de la sphere (ligne + texte)
+ //Display of the radius of the sphere (line + text)
if (Pres == V3d_COMPLETE) {
gradius->SetPickId(3);
}
- //Affichage du meridien
+ // Display of the meridian
Quantity_Color Col2(Quantity_NOC_GREEN);
Handle(Graphic3d_AspectLine3d) Asp2 = new Graphic3d_AspectLine3d
(Col2,Aspect_TOL_SOLID,1.);
gnopick->SetPrimitivesAspect(Asp2);
- // Definition de l'axe du cercle
+ // Definition of the axis of circle
aView->Up(DXRef,DYRef,DZRef);
this->Position(X,Y,Z);
DXini = X-X0; DYini = Y-Y0; DZini = Z-Z0;
V3d::CircleInPlane(gnopick,X0,Y0,Z0,VX,VY,VZ,Rayon);
- // Affichage de la parallele
+ // Display of the parallel
- // Definition de l'axe du cercle
+ // Definition of the axis of circle
aView->Proj(VX,VY,VZ);
aView->Up(X1,Y1,Z1);
DXRef = VY * Z1 - VZ * Y1;
Z0 = MyTarget.Z();
aView->Project(X0,Y0,Z0,PXT,PYT);
aView->Convert(PXT,PYT,IPX,IPY);
-// Coord 3d dans le plan de projection de la cible.
+// Coord 3d in the plane of projection of the target.
aView->Convert(IPX,IPY,XT,YT,ZT);
switch (WhatPick) {
case V3d_POSITIONLIGHT :
- // Les Coordonnees doivent rester a l'interieur de la sphere
+ // The Coordinates should remain inside of the sphere
Rayon = Radius();
XMinTrack = PXT - Rayon;
XMaxTrack = PXT + Rayon;
DeltaY = Y0 - YP;
DeltaZ = Z0 - ZP;
-// On recherche le point d'intersection des droites definies
-// par :
-// - Droite passant par le point de projection et l'oeil
-// si on est en perspective, parralele a la normale de la
-// vue si on a une vue axonometrique.
-// position dans la vue est // a la normale de la vue
-// - La distance position de la camera cible est egale au
-// rayon.
+// The point of intersection of straight lines defined by :
+// - Straight line passing by the point of projection and the eye
+// if this is a perspective, parralel to the normal of the view
+// if this is an axonometric view.
+// position in the view is parallel to the normal of the view
+// - The distance position of the target camera is equal to the radius.
A = VX*VX + VY*VY + VZ*VZ ;
B = -2. * (VX*DeltaX + VY*DeltaY + VZ*DeltaZ);
case V3d_SPACELIGHT :
aView->Convert(PXT,PYT,IPX,IPY);
-// Dans ce cas Xpix,Ypix correspondent a une distance , relative
-// a la translation que l'on veut effectuer sur la sphere.
+// In this case Xpix,Ypix correspond to a distance, relative
+// to the translation that is planned to be performed on the sphere.
aView->Convert(IPX+Xpix,IPY+Ypix,X,Y,Z);
X = X+X0-XT;
Y = Y+Y0-YT;
case V3d_ExtRADIUSLIGHT :
if (MyType == V3d_DIRECTIONAL)
break;
-// on cherche a conserver la direction cible positionnement de la
-// source ==> on projette le point sur la direction cible source.
+// it is attempted to preserve the target direction position of the
+// source ==> the point is projected on the target source direction.
this->Position(Xi,Yi,Zi);
aView->Project(Xi,Yi,Zi,PXP,PYP);
DX = PXP - PXT;
case V3d_IntRADIUSLIGHT :
if (MyType == V3d_DIRECTIONAL)
break;
-// on cherche a conserver la direction cible positionnement
-// de la source ==> on projette le point sur la direction
-// cible source.
+// it is attempted to preserve the target direction position of the
+// source ==> the point is projected on the target source direction.
Position(Xi,Yi,Zi);
aView->Project(Xi,Yi,Zi,PXP,PYP);
DX = PXP - PXT;
Rap = NewRprj/OldRprj;
Rayon = Radius();
Rayon = Rayon * Rap;
-// la source doit rester a une position fixe, seule la cible
-// est modifie.
+// the source should remain at a fixed position,
+// only the target is modified.
Position (xPos, yPos, zPos);
Graphic3d_Vector Dir(Graphic3d_Vertex(xPos,yPos,zPos), MyTarget);
Dir.Normalize();
X = Xi + Rayon*X;
Y = Yi + Rayon*Y;
Z = Zi + Rayon*Z;
-// la source doit rester a une position fixe, seule la cible
-// est modifie.
+// the source should remain at a fixed position,
+// only the target is modified.
MyTarget.SetCoord(X,Y,Z);
Display(aView,MyTypeOfRepresentation);
(aView->Viewer())->UpdateLights();
MyType = V3d_POSITIONAL ;
MyLight = new Visual3d_Light(C,P,A1,A2) ;
MyTarget = T;
- // La Structure graphique sera initialisee lors de l'affichage.
+ // Graphic structure is initialized during the display.
}
Rayon = this->Radius();
aView->Project(Xi,Yi,Zi,PXT,PYT);
aView->Convert(PXT,PYT,IXP,IYP);
-// Coord 3d dans le plan de projection de la source.
+// 3D Coordinate in the plane of projection of the source.
aView->Convert(IXP,IYP,XT,YT,ZT);
aView->Convert(PXT,PYT+Rayon,IXP,IYP);
aView->Convert(IXP,IYP,X,Y,Z);
X = X+Xi-XT; Y = Y+Yi-YT; Z = Z+Zi-ZT;
Dist = Sqrt( Square(X-Xi) + Square(Y-Yi) + Square(Z-Zi) );
-// Axe de rotation.
+// Axis of rotation.
A = (X-Xi)/Dist;
B = (Y-Yi)/Dist;
C = (Z-Zi)/Dist;
-// On dessine une sphere
+// A sphere is drawn
V3d::CircleInPlane(gsymbol,Xi,Yi,Zi,VX,VY,VZ,Rayon/40.);
for( j=1 ; j<=3 ; j++ ) {
Beta = j * Standard_PI/4.;
Xf = Xi * MatRot(0,0) + Yi * MatRot(0,1) + Zi * MatRot(0,2);
Yf = Xi * MatRot(1,0) + Yi * MatRot(1,1) + Zi * MatRot(1,2);
Zf = Xi * MatRot(2,0) + Yi * MatRot(2,1) + Zi * MatRot(2,2);
-// Rotation de la normale
+// Rotation of the normal
X1 = VX * MatRot(0,0) + VY * MatRot(0,1) + VZ * MatRot(0,2);
Y1 = VX * MatRot(1,0) + VY * MatRot(1,1) + VZ * MatRot(1,2);
Z1 = VX * MatRot(2,0) + VY * MatRot(2,1) + VZ * MatRot(2,2);
V3d_TypeOfRepresentation Pres;
V3d_TypeOfUpdate UpdSov;
-// Creation d'une structure slight d'elements reperables (la position de
-// la light, et le domaine d'eclairage represente par un cercle)
-// Creation d'une structure snopick d'elements non reperables ( cible, meridien et
-// parallele ).
+// Creation of a structure slight of markable elements (position of the
+// light, and the domain of lighting represented by a circle)
+// Creation of a structure snopick of non-markable elements (target, meridian and
+// parallel).
Pres = TPres;
Handle(V3d_Viewer) TheViewer = aView->Viewer();
Y0 = MyTarget.Y();
Z0 = MyTarget.Z();
-//Affichage de la position de la light.
+// Display of the position of the light.
glight->SetPickId(1);
this->Color(Quantity_TOC_RGB,R1,G1,B1);
glight->SetPrimitivesAspect(Asp1);
this->Symbol(glight,aView);
-//Affichage de la sphere de reperage (limite au cercle).
+// Display of the markable sphere (limit at the cercle).
if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) {
gsphere->SetPickId(2);
V3d::CircleInPlane(gsphere,X0,Y0,Z0,VX,VY,VZ,Rayon);
-//Affichage du rayon de la sphere (ligne + texte)
+// Display of the radius of the sphere (line + text)
if (Pres == V3d_COMPLETE) {
gradius->SetPickId(3);
gradius->Text(ValOfRadius.ToCString(),PText,0.01);
}
-//Affichage du meridien
+// Display of the meridian
Quantity_Color Col2(Quantity_NOC_GREEN);
Handle(Graphic3d_AspectLine3d) Asp2 = new Graphic3d_AspectLine3d
(Col2,Aspect_TOL_SOLID,1.);
gnopick->SetPrimitivesAspect(Asp2);
-// Definition de l'axe du cercle
+// Definition of the axis of circle
aView->Up(DXRef,DYRef,DZRef);
this->Position(X,Y,Z);
DXini = X-X0; DYini = Y-Y0; DZini = Z-Z0;
V3d::CircleInPlane(gnopick,X0,Y0,Z0,VX,VY,VZ,Rayon);
-// Affichage de la parallele
+// Display of the parallel
-// Definition de l'axe du cercle
+// Definition of the axis of circle
aView->Proj(VX,VY,VZ);
aView->Up(X1,Y1,Z1);
DXRef = VY * Z1 - VZ * Y1;
#define NO_TRACE_MINMAX
#define NO_TRACE_MAKE
#define NO_TRACE_VALUES
-#define NO_TRACE_PLANE // Penser a virer du cdl my*GridPlane my*ViewPlane
+#define NO_TRACE_PLANE
#define MYMINMAX 25.
#define MYFACTOR 50.
Trsf (1, 4) = xl,
Trsf (2, 4) = yl,
Trsf (3, 4) = zl;
- // Transformation de changement de repere
+ // Transformation of change of marker
Trsf (1, 1) = xdx,
Trsf (2, 1) = xdy,
Trsf (3, 1) = xdz,
Trsf (3, 3) = dz;
myStructure->SetTransform (Trsf, Graphic3d_TOC_REPLACE);
- // Translation de l'origine
+ // Translation of the origin
Trsf (1, 4) = -XOrigin (),
Trsf (2, 4) = -YOrigin (),
Trsf (3, 4) = 0.0;
- // Rotation Alpha autour de l'axe -Z
+ // Rotation Alpha around axis -Z
Trsf (1, 1) = CosAlpha,
Trsf (2, 1) = -SinAlpha,
Trsf (3, 1) = 0.0,
Trsf (3, 3) = 1.0;
myStructure->SetTransform (Trsf,Graphic3d_TOC_POSTCONCATENATE);
- // CAL : 19 aout 1998
- // Il y avait aussi la possibilite de faire le calcul
- // de changement de repere par :
- // gp_Trsf::SetTransformation
- // (myGridPlane, myViewer->PrivilegedPlane ());
#ifdef TRACE_VALUES
Standard_Integer i, j;
#ifdef TRACE_MAKE
cout << "MakeVerticales" << endl;
#endif
- // verticales
+ // verticals
myGroup1->Clear ();
LineAttrib->SetColor (myTenthColor);
myGroup1->SetGroupPrimitivesAspect (LineAttrib);
P1.SetCoord (0.0, -myYSize, -zl);
P2.SetCoord (0.0, myYSize, -zl);
myGroup1->Polyline (P1, P2, Standard_False);
- nblines = 1; // on commence par une ligne gris fonce
+ nblines = 1; // start with a dark grey line
LineAttrib->SetColor (myColor);
myGroup1->SetPrimitivesAspect (LineAttrib);
for (xl = aXStep; xl < myXSize; xl += aXStep) {
#ifdef TRACE_MAKE
cout << "MakeHorizontales" << endl;
#endif
- // horizontales
+ // horizontals
myGroup2->Clear ();
LineAttrib->SetColor (myTenthColor);
myGroup2->SetGroupPrimitivesAspect (LineAttrib);
P1.SetCoord (-myXSize, 0., -zl);
P2.SetCoord (myXSize, 0., -zl);
myGroup2->Polyline (P1, P2, Standard_False);
- nblines = 1; // on commence par une ligne gris fonce
+ nblines = 1; // start with a dark grey line
LineAttrib->SetColor (myColor);
myGroup2->SetPrimitivesAspect (LineAttrib);
for (yl = aYStep; yl < myYSize; yl += aYStep) {
#ifdef TRACE_MAKE
cout << "MakeHorizontales" << endl;
#endif
- // horizontales
+ // horizontals
myGroup1->Clear ();
myGroup1->SetGroupPrimitivesAspect (MarkerAttrib);
myGroup1->BeginPrimitives ();
MyType = V3d_SPOT ;
MyLight = new Visual3d_Light(C,P,D,CN,A1,A2,AN) ;
- // On fixe la cible, a partir de la position de la light et de la direction.
+ // The target is fixed, starting from the light position and the direction.
T.SetCoord(X + D.X(), Y + D.Y(), Z + D.Z());
MyTarget = T;
}
V3d_TypeOfRepresentation Pres;
V3d_TypeOfUpdate UpdSov;
-// Creation d'une structure slight d'elements reperables (la position de
-// la light, et le domaine d'eclairage represente par un cercle)
-// Creation d'une structure snopick d'elements non reperables ( cible, meridien et
-// parallele ).
+// Creation of a structure slight of markable elements (position of the
+// light, and the domain of lighting represented by a circle)
+// Creation of a structure snopick of non-markable elements (target, meridian and
+// parallel).//
Pres = TPres;
Handle(V3d_Viewer) TheViewer = aView->Viewer();
Y0 = MyTarget.Y();
Z0 = MyTarget.Z();
-//Affichage de la position de la light.
+//Display of the position of the light.
glight->SetPickId(1);
this->Color(Quantity_TOC_RGB,R1,G1,B1);
glight->SetPrimitivesAspect(Asp1);
this->Symbol(glight,aView);
-//Affichage de la sphere de reperage (limite au cercle).
+// Display of the reference sphere (limited by circle).
if (Pres == V3d_COMPLETE || Pres == V3d_PARTIAL) {
gsphere->SetPickId(2);
V3d::CircleInPlane(gsphere,X0,Y0,Z0,VX,VY,VZ,Rayon);
-//Affichage du rayon de la sphere (ligne + texte)
+// Display of the radius of the sphere (line + text)
if (Pres == V3d_COMPLETE) {
gradius->SetPickId(3);
gradius->Text(ValOfRadius.ToCString(),PText,0.01);
}
-//Affichage du meridien
+// Display of the meridian
Quantity_Color Col2(Quantity_NOC_GREEN);
Handle(Graphic3d_AspectLine3d) Asp2 = new Graphic3d_AspectLine3d
(Col2,Aspect_TOL_SOLID,1.);
gnopick->SetPrimitivesAspect(Asp2);
-// Definition de l'axe du cercle
+// Definition of the axis of the circle
aView->Up(DXRef,DYRef,DZRef);
this->Position(X,Y,Z);
DXini = X-X0; DYini = Y-Y0; DZini = Z-Z0;
V3d::CircleInPlane(gnopick,X0,Y0,Z0,VX,VY,VZ,Rayon);
-// Affichage de la parallele
+// Display of the parallel
-// Definition de l'axe du cercle
+// Definition of the axis of the circle
aView->Proj(VX,VY,VZ);
aView->Up(X1,Y1,Z1);
DXRef = VY * Z1 - VZ * Y1;
File V3d_View_1.cxx :
- HISTORIQUE DES MODIFICATIONS :
- --------------------------------
- 01-03-92 : NW,JPB,CAL ; Creation.
- 13-07-97 : FMN: Debug sur le ZClipping BUC40193
- Debug sur le ZCueing aussi
- 24-12-97 : FMN ; Suppression de GEOMLITE
-
-************************************************************************/
-
/*----------------------------------------------------------------------*/
/*
* Includes
#include <V3d_RectangularGrid.hxx>
#include <V3d_CircularGrid.hxx>
-// Pour l'echo du point choisi
+// For the echo of the chosen point
#include <Visual3d_TransientManager.hxx>
/*----------------------------------------------------------------------*/
* Constant
*/
-// en cas NO_TRACE_ECHO et de NO_TRACE_POINTS, dans V3d_View_4.cxx ET dans
-// V3d_View.cxx, virer MyGridEchoStructure et MyGridEchoGroup dans le cdl
+// in case NO_TRACE_ECHO and NO_TRACE_POINTS, in V3d_View_4.cxx and
+// V3d_View.cxx, suspend MyGridEchoStructure and MyGridEchoGroup in cdl
#define TRACE_ECHO
#define NO_TRACE_VALUES
#define NO_TRACE_POINTS
-#define MYEPSILON1 0.0001 // Comparaison avec 0.0
-#define MYEPSILON2 Standard_PI / 180. // Delta entre 2 angles
+#define MYEPSILON1 0.0001 // Comparison with 0.0
+#define MYEPSILON2 Standard_PI / 180. // Delta between 2 angles
#ifdef TRACE_POINTS
#include <Graphic3d_AspectLine3d.hxx>
Trsf1 (1, 4) = xl,
Trsf1 (2, 4) = yl,
Trsf1 (3, 4) = zl;
- // Transformation de changement de repere
+ // Transformation change of marker
Trsf1 (1, 1) = xdx,
Trsf1 (2, 1) = xdy,
Trsf1 (3, 1) = xdz,
TColStd_Array2OfReal Trsf2 (1, 4, 1, 4);
Trsf2 (4, 4) = 1.0;
Trsf2 (4, 1) = Trsf2 (4, 2) = Trsf2 (4, 3) = 0.0;
- // Translation de l'origine
+ // Translation of the origin
Trsf2 (1, 4) = -MyGrid->XOrigin (),
Trsf2 (2, 4) = -MyGrid->YOrigin (),
Trsf2 (3, 4) = 0.0;
- // Rotation Alpha autour de l'axe -Z
+ // Rotation Alpha around axis -Z
Trsf2 (1, 1) = CosAlpha,
Trsf2 (2, 1) = -SinAlpha,
Trsf2 (3, 1) = 0.0,
Standard_Real valueoldtrsf;
Standard_Real valuenewtrsf;
Standard_Integer i, j, k;
- // Le calcul de produit de matrices
+ // Calculation of the product of matrices
for (i=1; i<=4; i++)
for (j=1; j<=4; j++) {
MyTrsf (i, j) = 0.0;
cout << "AVertex : " << X1 << ", " << Y1 << ", " << Z1 << endl;
#endif
- // Cas ou le plan de la grille et le plan de la vue
- // sont perpendiculaires a MYEPSILON2 radians pres
+ // Casw when the plane of the grid and the plane of the view
+ // are perpendicular to MYEPSILON2 close radians
if (Abs (VPN.Angle (GPN) - Standard_PI / 2.) < MYEPSILON2) {
NewPoint.SetCoord (X1, Y1, Z1);
#ifdef TRACE_POINTS
Standard_Real XBp, YBp;
X1 = XO, Y1 = YO, Z1 = 0.0;
- // MyTrsf * Point pour se retrouver sur le plan de la grille 3D
+ // MyTrsf * Point to return to the plane of 3D grid
P1.SetCoord (X1, Y1, Z1);
CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
CurPoint.Coord (X2, Y2, Z2);
XS = theGrid->XStep (), YS = theGrid->YStep ();
X1 = XO + XS, Y1 = YO, Z1 = 0.0;
- // MyTrsf * Point pour se retrouver sur le plan de la grille 3D
+ // MyTrsf * Point to return to the plane of 3D grid
P1.SetCoord (X1, Y1, Z1);
CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
CurPoint.Coord (X2, Y2, Z2);
#endif
X1 = XO, Y1 = YO + YS, Z1 = 0.0;
- // MyTrsf * Point pour se retrouver sur le plan de la grille 3D
+ // MyTrsf * Point to return to the plane of 3D grid
P1.SetCoord (X1, Y1, Z1);
CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
CurPoint.Coord (X2, Y2, Z2);
Standard_Real (Standard_Integer (Abs (Y1)+0.5)) * YS :
- Standard_Real (Standard_Integer (Abs (Y1)+0.5)) * YS);
#ifdef TRACE_VALUES
- cout << "Point choisi : " << X1 << ", " << Y1 << endl;
+ cout << "Chosen point : " << X1 << ", " << Y1 << endl;
#endif
- // MyTrsf * Point pour se retrouver sur le plan
- // de la grille 3D
+ // MyTrsf * Point to return to the plane of 3D grid
P1.SetCoord (X1, Y1, Z1);
CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
CurPoint.Coord (X2, Y2, Z2);
}
else {
cout << "*****************" << endl;
-cout << "Determinant nul !" << endl;
+cout << "Zero Determinant!" << endl;
cout << "*****************" << endl;
#ifdef TRACE_VALUES
- cout << "Determinant nul !" << endl;
+ cout << "Zero Determinant !" << endl;
#endif
AVertex.Coord (X2, Y2, Z2);
CurPoint.SetCoord (X2, Y2, Z2);
X1 = XO + Cos (Alpha * i) * RS,
Y1 = YO + Sin (Alpha * i) * RS,
Z1 = 0.0;
- // MyTrsf * Point pour se retrouver sur le plan
- // de la grille 3D
+ // MyTrsf * Point to return to the plane of 3D grid
P1.SetCoord (X1, Y1, Z1);
CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
CurPoint.Coord (X2, Y2, Z2);
AngleCur = Angle;
XCurp = XAp, YCurp = YAp;
#ifdef TRACE_VALUES
- cout << "Angle entre OP et O" << CAR [i-1]
+ cout << "Angle between OP and O" << CAR [i-1]
<< " : " << Angle << endl;
#endif
}
Standard_Real DistOCur = Sqrt (XCurp*XCurp + YCurp*YCurp);
- // Determination du cercle de la grille le plus proche de P
+ // Determination of the circle of the grid closest to P
Standard_Integer N = Standard_Integer (DistOP / DistOCur + 0.5);
Standard_Real Radius = N * RS;
#ifdef TRACE_VALUES
- cout << "Cercle : " << N << " Radius : " << Radius << endl;
+ cout << "Circle : " << N << " Radius : " << Radius << endl;
#endif
X1 = Cos (Alpha * ICur) * Radius,
Z1 = 0.0;
#ifdef TRACE_VALUES
- cout << "Point choisi : " << X1 << ", " << Y1 << endl;
+ cout << "Chosen Point : " << X1 << ", " << Y1 << endl;
#endif
- // MyTrsf * Point pour se retrouver sur le plan de la grille 3D
+ // MyTrsf * Point to return to the plane of 3D grid
P1.SetCoord (X1, Y1, Z1);
CurPoint = V3d_View::TrsPoint (P1, MyTrsf);
CurPoint.Coord (X2, Y2, Z2);
/***********************************************************************
- FONCTION :
+ FUNCTION :
----------
- Classe Visual3d_ContextView.cxx :
+ Class Visual3d_ContextView.cxx :
- Declaration des variables specifiques aux contextes des vues.
+ Declaration of variables specific to view contexts.
- Un contexte de vues est defini par :
- - l'activite de l'aliasing
- - l'activite du depth-cueing
- - l'activite du Z clipping
- - l'activite des sources lumineuses definies
- - le type de visualisation demande
- - le modele de shading si besoin est
+ A view context is defined by :
+ - the activity of aliasing
+ - the activity of depth-cueing
+ - the activity of Z clipping
+ - the activity of defined light sources
+ - the required type of visualization
+ - the model of shading if required
- HISTORIQUE DES MODIFICATIONS :
- --------------------------------
- Mars 1992 : NW,JPB,CAL ; Creation.
- 01-08-97 : PCT ; Ajout support texture mapping
- 01-10-97 : CAL ; Retrait de DownCast.
************************************************************************/
Standard_Integer LengthL = MyLights.Length ();
Standard_Integer indexL = 0;
- // Recherche de la light <ALight> dans la
- // sequence des lights deja allumees
+ // Find light <ALight> in
+ // the sequence of already active lights
for (Standard_Integer i=1; i<=LengthL && indexL==0; i++)
if ((void *) (MyLights.Value (i)) ==
(void *) (ALight.operator->())) indexL = i;
- // Il s'agit d'une nouvelle light a activer
+ // This is the activation of a new light
if (indexL == 0)
MyLights.Append ((void *) ALight.operator->());
Standard_Integer LengthL = MyLights.Length ();
Standard_Integer indexL = 0;
- // Recherche de la light <ALight> dans la
- // sequence des lights deja allumees
+ // Find light <ALight> in
+ // the sequence of already active lights
for (Standard_Integer i=1; i<=LengthL && indexL==0; i++)
if ((void *) (MyLights.Value (i)) ==
(void *) (ALight.operator->())) indexL = i;
- // Il s'agit d'une light allumee
+ // This is the activation of a new light
if (indexL != 0) MyLights.Remove (indexL);
}
Standard_Integer LengthC = MyClipPlanes.Length ();
Standard_Integer indexC = 0;
- // Recherche du plan <AClipPlane> dans la
- // sequence des plans deja actives
+ // Find plane <AClipPlane> in the
+ // sequence of already active planes
for (Standard_Integer i=1; i<=LengthC && indexC==0; i++)
if ((void *) (MyClipPlanes.Value (i)) ==
(void *) (AClipPlane.operator->())) indexC = i;
- // Il s'agit d'un nouveau plan a activer
+ // This is the activation of a new plane
if (indexC == 0)
MyClipPlanes.Append ((void *) AClipPlane.operator->());
Standard_Integer LengthC = MyClipPlanes.Length ();
Standard_Integer indexC = 0;
- // Recherche du plan <AClipPlane> dans la
- // sequence des plans deja actives
+ // Find plane <AClipPlane> in the
+ // sequence of already active planes
for (Standard_Integer i=1; i<=LengthC && indexC==0; i++)
if ((void *) (MyClipPlanes.Value (i)) ==
(void *) (AClipPlane.operator->())) indexC = i;
- // Il s'agit d'un plane actif
+ // This is an active plane
if (indexC != 0) MyClipPlanes.Remove (indexC);
}
/***********************************************************************
- FONCTION :
+ FUNCTION :
----------
File Visual3d_Light :
- Declaration des variables specifiques aux sources lumineuses
+ Declaration of variables specific to light sources
- REMARQUES:
+ NOTES:
----------
- Une source lumineuse est definie par :
- - son type
- - sa couleur
- - les facteurs d'attenuation (positionnelle et spot uniquement )
- - son angle ( pour spot uniquement )
- - sa concentration ( pour spot uniquement )
- - sa direction ( directionnelle et spot uniquement )
- - sa position ( positionnelle et spot uniquement )
+ A light source is defined by :
+ - type
+ - color
+ - reduction factors ( for positional and spot only )
+ - its angle ( for spot only )
+ - its concentration ( for spot only )
+ - its direction ( directional and spot only )
+ - its position ( positional and spot only )
- Elle est active dans une vue, dans le contexte associe.
+ It is active in a view, in the associated context.
ATTENTION:
----------
- - AngleCone est exprime en radian [Pex] alors que OpenGl travaille
- en degres. Les limites pour Pex sont [0,PI] alors que pour OpenGl
- ce sont [0,90].
- - On utilise 2 facteurs d'attenuation avec Pex alors qu'OpenGl en utilise 3.
- - Les facteurs d'attenuation sont limites entre [0.0,1.0] pour Pex alors
- que pour OpenGl la limite est [0.0,n]
- - La concentration varie entre [0.,1.0] pour Pex et [0,128] pour OpenGl.
-
- HISTORIQUE DES MODIFICATIONS :
- --------------------------------
- 01-03-92 : NW,JPB,CAL ; Creation.
- 19-12-96 : FMN ; PRO6793:
- Modification des bornes pour AngleCone [0,PI/2]
- Ajout commentaires dans le cdl.
- Ajout tests sur les bornes.
- 10-07-97 : PCT
- Ajout des headlights
- 23-02-98 : FMN ; Remplacement PI par Standard_PI
+ - AngleCone is given in radian [Pex] while OpenGl works in
+ degreees. The limits for Pex are [0,PI] while for OpenGl this is [0,90].
+ - Two reduction factors are used with Pex while OpenGl uses three.
+ - The ereduction factors have range [0.0,1.0] for Pex and
+ for OpenGl the range is [0.0,n]
+ - The concentration varies from [0.,1.0] for Pex to [0,128] for OpenGl.
************************************************************************/
//-Version
-//-Design Declaration des variables specifiques a la classe
-// decrivant un reperage.
+//-Design Declaration of variables specific to the class
+// describing marking.
-//-Warning Un retour de reperage est defini par :
-// - une sequence de (Elem_Num, Pick_Id, Structure)
-// - une profondeur
+//-Warning A return of marking is defined by :
+// - sequence of (Elem_Num, Pick_Id, Structure)
+// - depth
//-References
switch (MyContext.Order ()) {
case Visual3d_TOO_TOPFIRST :
- // MyPickPathSequence->First retourne le premier
- // PickPath qui se trouve dans la sequence.
+ // MyPickPathSequence->First returns the first
+ // PickPath found in the sequence.
Result = MyPickPathSequence->Sequence().First ();
break;
case Visual3d_TOO_BOTTOMFIRST :
- // MyPickPathSequence->Last retourne le dernier
- // PickPath qui se trouve dans la sequence.
+ // MyPickPathSequence->Last returns the last
+ // PickPath found in the sequence.
Result = MyPickPathSequence->Sequence().Last ();
break;
switch (MyContext.Order ()) {
case Visual3d_TOO_TOPFIRST :
- // MyPickPathSequence->First retourne le premier
- // PickPath qui se trouve dans la sequence.
+ // MyPickPathSequence->First returns the first
+ // PickPath found in the sequence.
Result = MyPickPathSequence->Sequence().First ();
break;
case Visual3d_TOO_BOTTOMFIRST :
- // MyPickPathSequence->Last retourne le dernier
- // PickPath qui se trouve dans la sequence.
+ // MyPickPathSequence->Last returns the last
+ // PickPath found in the sequence.
Result = MyPickPathSequence->Sequence().Last ();
break;
switch (MyContext.Order ()) {
case Visual3d_TOO_TOPFIRST :
- // MyPickPathSequence->First retourne le premier
- // PickPath qui se trouve dans la sequence.
+ // MyPickPathSequence->First returns the first
+ // PickPath found in the sequence.
Result = MyPickPathSequence->Sequence().First ();
break;
case Visual3d_TOO_BOTTOMFIRST :
- // MyPickPathSequence->Last retourne le dernier
- // PickPath qui se trouve dans la sequence.
+ // MyPickPathSequence->Last returns the last
+ // PickPath found in the sequence.
Result = MyPickPathSequence->Sequence().Last ();
break;
//-Version
-//-Design Declaration des variables specifiques a la classe
-// decrivant un reperage.
+//-Design Declaration of variables specific to the classe
+// describing a marking.
-//-Warning Un reperage est defini par :
-// - un vecteur (Elem_Num, Pick_Id, Structure)
+//-Warning Marking is defined by :
+// - vector (Elem_Num, Pick_Id, Structure)
//-References
Classe Visual3d_View.cxx :
- Declaration des variables specifiques aux vues.
+ Declaration of variables specific to views.
- Une vue est definie par :
- - un ViewManager
- - un ContextView
- - un ViewMapping
- - une ViewOrientation
+ A view is defined by :
+ - ViewManager
+ - ContextView
+ - ViewMapping
+ - ViewOrientation
HISTORIQUE DES MODIFICATIONS :
--------------------------------
#ifdef RIC120302
MyCView.DefWindow.XParentWindow = ( HWND )(theWindow->HParentWindow());
#endif
- wd = ( WNT_WindowData* )GetWindowLongPtr (( HWND )(theWindow->HWindow()), GWLP_USERDATA);
+#ifndef _WIN64
+ wd = ( WNT_WindowData* )GetWindowLong (( HWND )(theWindow->HWindow()), GWL_USERDATA);
+#else
+ wd = ( WNT_WindowData* )GetWindowLong (( HWND )(theWindow->HWindow()), GWLP_USERDATA);
+#endif
wd -> WNT_WDriver_Ptr = ( void* )this;
wd -> WNT_VMgr = ( void* )MyPtrViewManager;
#endif /* WNT */
MyGradientBackground = MyWindow->GradientBackground();
SetGradientBackground(MyGradientBackground,1);
- Standard_Boolean AWait = Standard_False; // => mise a jour immediate
+ Standard_Boolean AWait = Standard_False; // => immediate update
MyGraphicDriver->SetVisualisation (MyCView);
MyGraphicDriver->AntiAliasing (MyCView, MyContext.AliasingIsOn ());
MyGraphicDriver->DepthCueing (MyCView, MyContext.DepthCueingIsOn ());
MyGraphicDriver->ClipLimit (MyCView, AWait);
MyGraphicDriver->Environment(MyCView);
- // Mise a jour des plans de model clipping
+ // Update planses of model clipping
UpdatePlanes ();
- // Mise a jour des sources lumineuses
+ // Update light sources
UpdateLights ();
/*
- * Association view-window n'entraine pas le display
- * des structures qui peuvent etre affichees dans la
- * nouvelle vue.
- * En effet, l'association vue-fenetre est faite, mais
- * l'affichage ne sera realise que lorsque la vue sera
- * activee (Activate).
+ * Association view-window does not cause the display
+ * of structures that can be displayed in the new view.
+ * In fact, association view-window is done, but the
+ * display is produced only if the view is activated (Activate).
*/
SetRatio ();
MyViewMapping.SetWindowLimit(Umin,Vmin,Umax,Vmax) ;
- // Mise a jour avant le SetViewMapping.
+ // Update before SetViewMapping.
MyCView.DefWindow.dx = float( Dxw );
MyCView.DefWindow.dy = float( Dyw );
SetViewMapping (MyViewMapping);
// SetViewMappingDefault ();
- // FMN+ Mise a jout Ratio pour le MyViewMappingReset
+ // FMN+ Update Ratio for MyViewMappingReset
MyViewMappingReset.WindowLimit(Umin,Vmin,Umax,Vmax) ;
Xc = (Umin + Umax)/2. ; Yc = (Vmin + Vmax)/2. ;
MyViewMappingReset.SetWindowLimit(Umin,Vmin,Umax,Vmax) ;
- // FMN- Mise a jout Ratio pour le MyViewMappingReset
+ // FMN- Update Ratio for MyViewMappingReset
MyGraphicDriver->RatioWindow (MyCView);
}
- // On force a recalculer les 2 matrices.
+ // Force recalculation of 2 matrices.
//
- // La vue courante peut servir a reconstruire une vue copie
- // qui est elle meme. Grace au SetWindow et au SetRatio on
- // impose le recalcul des matrices de cette nouvelle vue.
+ // The current view can help to reconstruct a copied view
+ // that is itself. Owing to SetWindow and SetRatio the
+ // recalculation of matrices of this new view is imposed.
MyMatOfMapIsEvaluated = Standard_False;
MyMatOfOriIsEvaluated = Standard_False;
if (MyCView.Context.NbActiveLight > 0) {
- // Allocation dynamique
+ // Dynamic Allocation
lights = new CALL_DEF_LIGHT [MyCView.Context.NbActiveLight];
MyCView.Context.ActiveLight = lights;
Graphic3d_Vector LightDirection;
Visual3d_TypeOfLightSource LightType=Visual3d_TOLS_AMBIENT;
- // Parcours des sources lumineuses
+ // Parcing of light sources
for (j=0; j<MyCView.Context.NbActiveLight; j++) {
LightType = (MyContext.ActivatedLight (j+1))->LightType ();
#ifdef BUC60570
}
#endif
- // gestion des sources lumineuses
+ // management of light sources
if (! IsDeleted ())
if (IsDefined ())
MyGraphicDriver->SetLight (MyCView);
- // Desallocation dynamique
+ // Dynamic allocation
if (MyCView.Context.NbActiveLight > 0) delete [] lights;
}
if (MyCView.Context.NbActivePlane > 0) {
- // Allocation dynamique
+ // Dynamic Allocation
#ifdef GER61454 //Keep the plane address for the next Update !
if( !MyCView.Context.ActivePlane )
MyCView.Context.ActivePlane = new CALL_DEF_PLANE [j];
#endif
Standard_Real A, B, C, D;
- // Parcours des plans de clipping
+ // Parcing of clipping planes
for (j=0; j<MyCView.Context.NbActivePlane; j++) {
planes[j].WsId = MyCView.ViewId;
}
- // gestion des plans de model clipping
+ // Management of planes of clipping model
if (! IsDeleted ())
if (IsDefined ())
MyGraphicDriver->SetPlane (MyCView);
- // Desallocation dynamique
+ // Dynamic allocation
#ifdef GER61454
if ( MyCView.Context.ActivePlane && (MyCView.Context.NbActivePlane == 0)
) {
if (! IsDefined ())
Visual3d_ViewDefinitionError::Raise ("Window not defined");
- // A ce niveau, seule la GL peut mettre a jour le background.
- // Il ne faut pas appeler MyWindow->SetBackground (ABack); car
- // cette methode lance une mise a jour du fond de fenetre par X
- // (si le fenetrage est X bien-sur)
+ // At this level, only GL can update the background.
+ // It is not necessary to call MyWindow->SetBackground (ABack); as
+ // this method starts update of window background by X
+ // (if the windowing is X)
Standard_Real R, G, B;
MyBackground = ABack;
Standard_Integer i, j;
// Assign the new transformation in an array [0..3][0..3]
- // Evite des problemes si le user a defini sa matrice [1..4][1..4]
+ // Avoid problems if the has defined a matrice [1..4][1..4]
// ou [3..6][-1..2] !!
lr = AMatrix.LowerRow ();
ur = AMatrix.UpperRow ();
Standard_Real X, Y, Z;
- // Tests sur la modification des parametres.
+ // Tests on modification of parameters.
Standard_Boolean VUPIsModified = Standard_False;
Standard_Boolean VRPIsModified = Standard_False;
Standard_Boolean VRUIsModified = Standard_False;
cout << "no modification\n" << flush;
#endif
- // Mise en route que si l'un des parametres est modifie
+ // restart if one of parameters is modified
if (VUPIsModified || VRPIsModified || VRUIsModified || ScaleIsModified || CustomIsModified) {
if (VUPIsModified || VRPIsModified || VRUIsModified || CustomIsModified) {
if (! IsDefined ()) return;
-Standard_Boolean AWait = Standard_False; // => mise a jour immediate
+Standard_Boolean AWait = Standard_False; // => immediate update
MyGraphicDriver->ViewOrientation (MyCView, AWait);
Compute ();
Standard_Real X, Y, Z;
- // Tests sur la modification des parametres.
+ // Tests on modification of parameters.
Standard_Boolean VUPIsModified = Standard_False;
Standard_Boolean VRPIsModified = Standard_False;
Standard_Boolean VRUIsModified = Standard_False;
cout << "no modification\n" << flush;
#endif
- // Mise en route que si l'un des parametres est modifie
+ // Restart if one of parameters is modified
if (VUPIsModified || VRPIsModified || VRUIsModified || CustomIsModified) {
if (VUPIsModified || VRPIsModified || VRUIsModified || CustomIsModified) {
if (! IsDefined ()) return;
-Standard_Boolean AWait = Standard_False; // => mise a jour immediate
+Standard_Boolean AWait = Standard_False; // => immediate update
MyGraphicDriver->ViewOrientation (MyCView, AWait);
Compute ();
if (! IsDefined ()) return;
-Standard_Boolean AWait = Standard_False; // => mise a jour immediate
+Standard_Boolean AWait = Standard_False; // => immediate update
MyGraphicDriver->ViewMapping (MyCView, AWait);
// Passage Parallele/Perspective
if (! IsDefined ()) return;
-Standard_Boolean AWait = Standard_False; // => mise a jour immediate
+Standard_Boolean AWait = Standard_False; // => immediate update
MyGraphicDriver->ViewMapping (MyCView, AWait);
if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
Visual3d_TypeOfVisualization OldVisualMode;
Visual3d_TypeOfVisualization NewVisualMode;
- // Pour gerer l'affichage uniquement en cas de
- // changement de mode de visualisation.
+ // To manage display only in case of
+ // change of visualisation mode.
OldVisualMode = MyContext.Visualization ();
NewVisualMode = CTX.Visualization ();
Visual3d_TypeOfModel OldModel;
Visual3d_TypeOfModel NewModel;
- // Pour gerer le changement de visualisation uniquement
- // en cas de changement de mode de visualisation ou de
- // type de shading.
+ // To manage change of visualisation only in case
+ // of change of mode of visualisation or of type of shading.
OldModel = MyContext.Model ();
NewModel = CTX.Model ();
Standard_Boolean OldAliasingMode;
Standard_Boolean NewAliasingMode;
- // Pour gerer l'antialiasing uniquement en cas de changement.
+ // To manage antialiasing only in case of change.
OldAliasingMode = MyContext.AliasingIsOn ();
NewAliasingMode = CTX.AliasingIsOn ();
Standard_Real OldDepthCueingBackPlane;
Standard_Real NewDepthCueingBackPlane;
- // Pour gerer le depth cueing uniquement en cas de changement.
+ // To manage the depth cueing only in case of change.
OldDepthCueingMode = MyContext.DepthCueingIsOn ();
NewDepthCueingMode = CTX.DepthCueingIsOn ();
Standard_Real OldZClippingBackPlane;
Standard_Real NewZClippingBackPlane;
- // Pour gerer le Zclipping uniquement en cas de changement.
+ // To manage the Zclipping only in case of change.
OldFrontZClippingMode = MyContext.FrontZClippingIsOn ();
NewFrontZClippingMode = CTX.FrontZClippingIsOn ();
OldBackZClippingMode = MyContext.BackZClippingIsOn ();
UpdateView ();
-Standard_Boolean AWait = Standard_False; // => mise a jour immediate
+Standard_Boolean AWait = Standard_False; // => immediate update
if (IsDefined ()) {
- // gestion des modes de visualisation et des types de shading.
+ // management of visualization modes and types of shading.
if ((OldVisualMode != NewVisualMode) || (OldModel != NewModel))
MyGraphicDriver->SetVisualisation (MyCView);
- // gestion de l'antialiasing.
+ // management of antialiasing.
if (OldAliasingMode != NewAliasingMode)
MyGraphicDriver->AntiAliasing (MyCView, NewAliasingMode);
- // gestion du depth_cueing.
+ // management of depth_cueing.
if ((OldDepthCueingMode != NewDepthCueingMode) ||
(OldDepthCueingFrontPlane != NewDepthCueingFrontPlane) ||
(OldDepthCueingBackPlane != NewDepthCueingBackPlane)) {
(MyCView, NewDepthCueingMode);
}
- // gestion du Zclipping
+ // management of Zclipping
if ((OldFrontZClippingMode != NewFrontZClippingMode) ||
(OldBackZClippingMode != NewBackZClippingMode) ||
(OldZClippingFrontPlane != NewZClippingFrontPlane) ||
MyGraphicDriver->ClipLimit (MyCView, AWait);
}
- // gestion des textures
+ // management of textures
if ( (OldTexEnvId != NewTexEnvId) ||
(OldSurfaceDetail != NewSurfaceDetail) )
MyGraphicDriver->Environment(MyCView);
- // Mise a jour des plans de model clipping
+ // Update of planes of model clipping
UpdatePlanes ();
- // Mise a jour des sources lumineuses
+ // Update of light sources
UpdateLights ();
}
if (OldVisualMode != NewVisualMode) {
/*
- * Changement de contexte =>
- * Erase des structures qui ne peuvent pas etre affichees
- * avec le nouveau mode de visualisation.
- * On ne doit pas prevenir le ViewManager car
- * cette structure ne doit pas disparaitre de la
- * liste des structures affichees chez celui-ci.
+ * Change of context =>
+ * Remove structures that cannot be displayed
+ * in the new visualisation mode.
+ * It is not necessary to warn ViewManager as
+ * this structure should not disappear from
+ * the list of structures displayed in it.
*/
Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
Visual3d_TypeOfAnswer Answer;
while (S1Iterator.More ()) {
Answer = AcceptDisplay (S1Iterator.Key ());
- // Si la structure n'est plus affichable dans le
- // nouveau contexte de la vue, on l'efface.
+ // If the structure can't be displayed in the
+ // new context of the view, it is removed.
if ((Answer == Visual3d_TOA_NO) ||
(Answer == Visual3d_TOA_COMPUTE))
//Erase (S1Iterator.Key (), Aspect_TOU_WAIT);
FooSequence.Append (S1Iterator.Key ());
- // S1Iterator.Next () se positionne sur la
- // prochaine structure
+ // S1Iterator.Next () is located on the next structure
S1Iterator.Next ();
}
Standard_Integer Length = FooSequence.Length ();
- // On efface les structures stockees
+ // The stored structures are removed
for (i=1; i<=Length; i++)
Erase (FooSequence.Value (i), Aspect_TOU_WAIT);
if (Length != 0) FooSequence.Clear ();
/*
- * Changement de contexte =>
- * Display des structures qui peuvent etre affichees
- * avec le nouveau mode de visualisation.
- * On recupere toutes les structures ayant le statut
- * Displayed dans le ViewManager et on l'affiche dans
- * la vue directement, si la structure n'est pas deja
- * affichee et si la vue l'accepte dans son contexte.
+ * Change of context =>
+ * Display structures that can be displayed
+ * with the new visualisation mode.
+ * All structures with status Displayed are removed from the ViewManager
+ * and displayed in the view directly, if the structure is not already
+ * displayed and if the view accepts it in its context.
*/
i = MyViewManager->NumberOfDisplayedStructures ();
Handle(Graphic3d_Structure) SG = it.Key();
if (! IsDisplayed (SG)) {
Answer = AcceptDisplay(SG);
- // Si la structure est affichable dans le
- // nouveau contexte de la vue, on l'affiche.
+ // If the structure can be displayed in the
+ // new context of the view, it is displayed.
if ((Answer == Visual3d_TOA_YES) ||
(Answer == Visual3d_TOA_COMPUTE))
//Display (MyViewManager->DisplayedStructure (j),
}
Length = FooSequence.Length ();
- // On affiche les structures stockees
+ // The stored structures are displayed
for (i=1; i<=Length; i++)
Display (FooSequence.Value (i), Aspect_TOU_WAIT);
if (Length != 0) FooSequence.Clear ();
while (Iterator.More ()) {
SG.Add (Iterator.Key ());
- // Iterator.Next () se positionne sur la
- // prochaine structure
+ // Iterator.Next () is located on the next structure
Iterator.Next ();
}
MyCView.Active = 1;
/*
- * Activation d'une nouvelle vue =>
- * Display des structures qui peuvent etre affichees
- * dans cette nouvelle vue.
- * On recupere toutes les structures ayant le statut
- * Displayed dans le ViewManager et on l'affiche dans
- * la vue directement, si la structure n'est pas deja
- * affichee et si la vue l'accepte dans son contexte.
+ * Activation of a new view =>
+ * Display structures that can be displayed in this new view.
+ * All structures with status
+ * Displayed in ViewManager are returned and displayed in
+ * the view directly, if the structure is not already
+ * displayed and if the view accepts it in its context.
*/
Visual3d_TypeOfAnswer Answer;
Handle(Graphic3d_Structure) SG = it.Key();
if (! IsDisplayed (SG)) {
Answer = AcceptDisplay(SG);
- // Si la structure est affichable dans le
- // nouveau contexte de la vue, on l'affiche.
+ // If the structure can be displayed in the
+ // new context of the view, it is displayed.
if ((Answer == Visual3d_TOA_YES) ||
(Answer == Visual3d_TOA_COMPUTE))
Display (SG,Aspect_TOU_WAIT);
}
- // Si l'activation/desactivation du ZBuffer doit etre automatique
- // en fonction de la presence de facettes ou pas
+ // If the activation/desactivation of ZBuffer should be automatic
+ // depending on the presence or absence of facets.
if (MyViewManager->ZBufferAuto ()) {
Standard_Boolean BContainsFacet = ContainsFacet ();
Standard_Boolean BZBuffer = ZBufferIsActivated ();
- // Si la vue contient des facettes
- // et si le ZBuffer n'est pas actif
+ // If the view contains facets
+ // and if ZBuffer is not active
if (BContainsFacet && ! BZBuffer)
SetZBufferActivity (1);
- // Si la vue ne contient pas des facettes
- // et si le ZBuffer est actif
+ // If the view does not contain facets
+ // and if ZBuffer is active
if (! BContainsFacet && BZBuffer)
SetZBufferActivity (0);
}
MyGraphicDriver->DeactivateView (MyCView);
/*
- * Deactivation d'une vue =>
- * Effacement des structures qui sont affichees
- * dans cette vue.
- * On recupere toute structure ayant le statut
- * Displayed dans le ViewManager et on l'efface dans
- * la vue directement, si la structure n'est pas deja
- * effacee et si la vue l'accepte dans son contexte.
- */
+ * Deactivation of a view =>
+ * Removal of structures displayed in this view.
+ * All structures with status
+ * Displayed in ViewManager are returned and removed from
+ * the view directly, if the structure is not already
+ * displayed and if the view accepts it in its context.
+ */
Visual3d_TypeOfAnswer Answer;
Graphic3d_MapOfStructure Map;
Handle(Graphic3d_Structure) SG = it.Key();
if (! IsDisplayed (SG)) {
Answer = AcceptDisplay(SG);
- // Si la structure etait affichable, on l'efface.
+ // If the structure was displayed it is removed.
if ((Answer == Visual3d_TOA_YES) ||
(Answer == Visual3d_TOA_COMPUTE))
Erase (SG,Aspect_TOU_WAIT);
if (MyViewManager->UpdateMode () == Aspect_TOU_ASAP) Update ();
- // Plus d'action possible sur la vue maintenant
+ // No action currently possible in the view
MyCView.Active = 0;
}
if (! MyWindow->IsMapped ()) return;
// san - 14/04/2004 - set up Z buffer state before redrawing
- // Si l'activation/desactivation du ZBuffer doit etre automatique
- // en fonction de la presence de facettes ou pas
+ // If the activation/desactivation of ZBuffer should be automatic
+ // depending on the presence or absence of facets.
if (MyViewManager->ZBufferAuto ()) {
Standard_Boolean BContainsFacet = ContainsFacet ();
Standard_Boolean BZBuffer = ZBufferIsActivated ();
- // Si la vue contient des facettes
- // et si le ZBuffer n'est pas actif
+ // If the view contains facets
+ // and if ZBuffer is not active
if (BContainsFacet && ! BZBuffer)
SetZBufferActivity (1);
- // Si la vue ne contient pas des facettes
- // et si le ZBuffer est actif
+ // If the view contains only facets
+ // and if ZBuffer is active
if (! BContainsFacet && BZBuffer)
SetZBufferActivity (0);
}
if (! MyWindow->IsMapped ()) return;
// san - 14/04/2004 - set up Z buffer state before redrawing
- // Si l'activation/desactivation du ZBuffer doit etre automatique
- // en fonction de la presence de facettes ou pas
+ // If activation/desactivation of ZBuffer should be automatic
+ // depending on the presence or absence of facets.
if (MyViewManager->ZBufferAuto ()) {
Standard_Boolean BContainsFacet = ContainsFacet ();
Standard_Boolean BZBuffer = ZBufferIsActivated ();
- // Si la vue contient des facettes
- // et si le ZBuffer n'est pas actif
+ // If the view contains facets
+ // and if ZBuffer is not active
if (BContainsFacet && ! BZBuffer)
SetZBufferActivity (1);
- // Si la vue ne contient pas des facettes
- // et si le ZBuffer est actif
+ // If the view contains only facets
+ // and if ZBuffer is active
if (! BContainsFacet && BZBuffer)
SetZBufferActivity (0);
}
if (! MyWindow->IsMapped ()) return;
- // Si l'activation/desactivation du ZBuffer doit etre automatique
- // en fonction de la presence de facettes ou pas
+ // If activation/desactivation of ZBuffer should be automatic
+ // depending on the presence or absence of facets.
if (MyViewManager->ZBufferAuto ()) {
Standard_Boolean BContainsFacet = ContainsFacet ();
Standard_Boolean BZBuffer = ZBufferIsActivated ();
- // Si la vue contient des facettes
- // et si le ZBuffer n'est pas actif
- if (BContainsFacet && ! BZBuffer)
+ // If the view contains facets
+ // and if ZBuffer is not active
+ if (BContainsFacet && ! BZBuffer)
SetZBufferActivity (1);
- // Si la vue ne contient pas des facettes
- // et si le ZBuffer est actif
+ // If the view does not contain facets
+ // and if ZBuffer is active
if (! BContainsFacet && BZBuffer)
SetZBufferActivity (0);
}
Visual3d_TypeOfAnswer Visual3d_View::AcceptDisplay (const Handle(Graphic3d_Structure)& AStructure) const {
-// Recuperation type de visualisation de la vue
+// Return type of visualization of the view
Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
-// Recuperation type de visualisation de la structure
+// Return type of visualization of the structure
Graphic3d_TypeOfStructure StructType = AStructure->Visual ();
Visual3d_TypeOfAnswer Result = Visual3d_TOA_NO;
if (StructType == Graphic3d_TOS_ALL)
- // La structure accepte tout type de vue
+ // The structure accepts any type of view
Result = Visual3d_TOA_YES;
else {
if ((StructType == Graphic3d_TOS_SHADING)
Standard_Integer Index = IsComputed (AStructure);
if (Index != 0) {
#ifdef TRACE_CLEAR
- cout << "La structure " << AStructure->Identification ()
- << " calculee, dans la view "
- << Identification () << ", par la structure "
+ cout << "Structure " << AStructure->Identification ()
+ << " calculated in the view "
+ << Identification () << ", by structure "
<< MyCOMPUTEDSequence.Value (Index)->Identification ()
- << " est videe.\n";
+ << " is emptied.\n";
cout << flush;
#endif
MyCOMPUTEDSequence.Value (Index)->GraphicClear (WithDestruction);
if (IndexM != 0 && IndexD != 0) {
#ifdef TRACE_CONNECT
- cout << "La structure " << AMother->Identification ()
- << " est connectee a la structure "
+ cout << "Structure " << AMother->Identification ()
+ << " is connected to structure "
<< ADaughter->Identification () << endl;
- cout << "Ces structures sont calculees.\n";
- cout << "Dans la view " << Identification ()
- << "La structure "
+ cout << "These structures are calculated.\n";
+ cout << "In the view " << Identification ()
+ << "Structure "
<< MyCOMPUTEDSequence.Value (IndexM)->Identification ()
- << " est connectee a la structure "
+ << " is connected to the structure "
<< MyCOMPUTEDSequence.Value (IndexD)->Identification ()
<< endl;
#endif
if (IndexM != 0 && IndexD != 0) {
#ifdef TRACE_CONNECT
- cout << "La structure " << AMother->Identification ()
- << " est disconnectee de la structure "
+ cout << "Structure " << AMother->Identification ()
+ << " is disconnected from the structure "
<< ADaughter->Identification () << endl;
- cout << "Ces structures sont calculees.\n";
- cout << "Dans la view " << Identification ()
- << "La structure "
+ cout << "These structures are calculated.\n";
+ cout << "In the view " << Identification ()
+ << "Structure "
<< MyCOMPUTEDSequence.Value (IndexM)->Identification ()
- << " est disconnectee de la structure "
+ << " is disconnected from the structure "
<< MyCOMPUTEDSequence.Value (IndexD)->Identification ()
<< endl;
#endif
if (! IsDefined ()) return;
if (! IsActive ()) return;
- // Si Display sur une structure qui est dans la liste
- // des structures calculees alors qu'elle n'est pas
- // ou plus, du type calcule =>
- // On l'enleve ainsi que l'ancienne compute associee
- // Ceci arrive lorsque la hlhsr redevient du type
- // non computed apres un SetVisual.
+ // If Display on a structure present in the list
+ // of calculated structures while it is not
+ // or more, of calculated type =>
+ // - removes it as well as the associated old computed
+ // THis happens when hlhsr becomes again of type e
+ // non computed after SetVisual.
Standard_Integer Index = IsComputed (AStructure);
if ((Index != 0) && (AStructure->Visual () != Graphic3d_TOS_COMPUTED)) {
return;
}
- // Mode degenere actif
+ // Mode degenerated active
#ifdef G003
if ( !ComputedMode () || DegenerateModeIsOn () )
Answer = Visual3d_TOA_YES;
cout << "Index : " << Index << "\n" << flush;
#endif
if (Index != 0) {
- // Deja calculee, mais la COMPUTED est-elle encore valide ?
+ // Already computed, is COMPUTED still valid?
#ifdef TRACE_DISPLAY
if (MyCOMPUTEDSequence.Value (Index)->HLRValidation ()) {
- cout << "La structure "
+ cout << "Structure "
<< MyTOCOMPUTESequence.Value (Index)->Identification ()
- << " deja calculee, dans la view "
+ << "already calculated, in the view "
<< Identification () << ", par la structure "
<< MyCOMPUTEDSequence.Value (Index)->Identification ()
- << "\n n'a pas a etre recalculee car HLR est valide\n";
+ << "\n was not recalculated as HLR is valid\n";
cout << flush;
}
else {
- cout << "La structure "
+ cout << "Structure "
<< MyTOCOMPUTESequence.Value (Index)->Identification ()
- << " deja calculee, dans la view "
- << Identification () << ", par la structure "
+ << " already calculated, in the view "
+ << Identification () << ", by the structure "
<< MyCOMPUTEDSequence.Value (Index)->Identification ()
- << "\n doit etre recalculee car HLR est invalide\n";
+ << "\n should be recalculated as HLR is invalid\n";
cout << flush;
}
#endif
Standard_Integer OldStructId =
MyCOMPUTEDSequence.Value (Index)->Identification ();
- // Cas COMPUTED valide
+ // Case COMPUTED valide
if (MyCOMPUTEDSequence.Value (Index)->HLRValidation ()) {
- // a afficher
+ // to be displayed
if (! IsDisplayed (AStructure)) {
MyDisplayedStructure.Add (AStructure);
MyGraphicDriver->DisplayStructure (
return;
}
- // Cas COMPUTED invalide
+ // Case COMPUTED invalid
else {
- // Existe-t-il une autre representation valide ?
- // Recherche dans la sequence des structures deja calculees
- // 1/ D'une structure ayant le meme Owner que <AStructure>
- // 2/ Qui ne soit pas <AStructure>
- // 3/ Dont la COMPUTED soit valide
+ // Is there another valid representation ?
+ // Find in the sequence of already calculated structures
+ // 1/ Structure having the same Owner as <AStructure>
+ // 2/ That is not <AStructure>
+ // 3/ The COMPUTED which of is valid
Standard_Integer NewIndex = HaveTheSameOwner (AStructure);
- // Cas COMPUTED invalide, AVEC une valide de remplacement
+ // Case of COMPUTED invalid, WITH a valid of replacement
if (NewIndex != 0) {
- // a afficher
+ // to be displayed
if (! IsDisplayed (AStructure)) {
MyCOMPUTEDSequence.SetValue
(Index, MyCOMPUTEDSequence.Value (NewIndex));
return;
}
- // Cas COMPUTED invalide, SANS une valide de remplacement
+ // Cas COMPUTED invalid, WITHOUT a valid of replacement
else {
- // On efface la COMPUTED si affichee
+ // COMPUTED is removed if displayed
if (IsDisplayed (AStructure))
MyGraphicDriver->EraseStructure (
MyCView,
<< "\n" << flush;
#endif
- // On ajoute la TOCOMPUTE et la COMPUTED associee aux sequences
+ // TOCOMPUTE and COMPUTED associated to sequences are added
MyTOCOMPUTESequence.Append (AStructure);
MyCOMPUTEDSequence.Append (TheStructure);
<< "\n" << flush;
#endif
- // On enleve, si necessaire, les anciennes
+ // The previous are removed if necessary
if (Index != 0) {
MyTOCOMPUTESequence.Remove (Index);
MyCOMPUTEDSequence.Remove (Index);
<< "\n" << flush;
#endif
-// Recuperation type de visualisation de la vue
+// Return type of visualisation of the view
Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
-// De quel type sera la computed ?
+// Of which type will be the computed ?
Standard_Boolean ComputeWireframe = ((ViewType == Visual3d_TOV_WIREFRAME) &&
(AStructure->ComputeVisual () != Graphic3d_TOS_SHADING));
}
#ifdef TRACE_DISPLAY
- cout << "La structure " << StructId
- << " dans la view " << Identification ()
- << " est calculee par la structure "
+ cout << "Structure " << StructId
+ << " in the view " << Identification ()
+ << " is calculated by the structure "
<< TheStructure->Identification ();
if (Answer == Visual3d_TOA_YES)
- cout << " et affichee\n";
+ cout << " and displayed\n";
else
- cout << " mais pas affichee\n";
+ cout << " but not displayed\n";
cout << flush;
#endif
- // On ne l'affiche que si la structure calculee
- // est du bon type par rapport a celui de la vue.
+ // It is displayed only if the calculated structure
+ // has a proper type corresponding to the one of the view.
if (Answer != Visual3d_TOA_NO) {
if (! IsDisplayed (AStructure))
MyDisplayedStructure.Add (AStructure);
if (IsDeleted ()) return;
- // Pas de test sur window car la structure est affichee que
- // si la window existe, donc un seul test suffit.
+ // No test on window as the structure is displayed only if
+ // the window exists, so only one test is enough.
if (IsDisplayed (AStructure)) {
Visual3d_TypeOfAnswer Answer = AcceptDisplay (AStructure);
- // Mode degenere actif
+ // Degenerated mode is active
#ifdef G003
if ( !ComputedMode () || DegenerateModeIsOn () )
Answer = Visual3d_TOA_YES;
MyCOMPUTEDSequence.Value (Index)->Identification ();
#ifdef TRACE_COMP
cout << "Structure " << AStructure->Identification ()
- << " calculee, dans la view "
- << Identification () << ", par la structure "
- << StructId << " est effacee. \n";
+ << " calculated, in the view "
+ << Identification () << ", by the structure "
+ << StructId << " is removed. \n";
cout << flush;
#endif
MyGraphicDriver->EraseStructure
(MyCView, *(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure ());
}
- // Le else est impossible
+ // else is impossible
}
MyDisplayedStructure.Remove (AStructure);
if (AnUpdateMode == Aspect_TOU_ASAP) Update ();
Standard_Integer Index = IsComputed (AStructure);
if (Index != 0) {
#ifdef TRACE_HIGH
- cout << "La structure " << AStructure->Identification ()
- << " calculee, dans la view "
- << Identification () << ", par la structure "
+ cout << "Structure " << AStructure->Identification ()
+ << " calculated, in the view "
+ << Identification () << ", by the structure "
<< MyCOMPUTEDSequence.Value (Index)->Identification ()
- << " passe en mode highlight.\n";
+ << " passes in highlight mode.\n";
cout << flush;
#endif
(MyCOMPUTEDSequence.Value (Index))->SetHighlightColor
Standard_Integer Index = IsComputed (AStructure);
if (Index != 0) {
#ifdef TRACE_TRSF
- cout << "La structure " << AStructure->Identification ()
- << " calculee, dans la view "
- << Identification () << ", par la structure "
+ cout << "The structure " << AStructure->Identification ()
+ << " calculated, in the view "
+ << Identification () << ", by the structure "
<< MyCOMPUTEDSequence.Value (Index)->Identification ()
- << " est transformee.\n";
+ << " is transformed.\n";
cout << flush;
#endif
- // Test un peu leger !
- // On ne transmet la trsf que si c'est :
- // une translation
- // un scale
+ // Test is somewhat light !
+ // trsf is transferred only if it is :
+ // a translation
+ // a scale
if (ATrsf (0, 1) != 0. || ATrsf (0, 2) != 0.
|| ATrsf (1, 0) != 0. || ATrsf (1, 2) != 0.
|| ATrsf (2, 0) != 0. || ATrsf (2, 1) != 0.)
Standard_Integer Index = IsComputed (AStructure);
if (Index != 0) {
#ifdef TRACE_HIGH
- cout << "La structure " << AStructure->Identification ()
- << " calculee, dans la view "
- << Identification () << ", par la structure "
+ cout << "Structure " << AStructure->Identification ()
+ << " calculated, in the view "
+ << Identification () << ", by the structure "
<< MyCOMPUTEDSequence.Value (Index)->Identification ()
- << " passe en mode unhighlight.\n";
+ << " passes in unhighlight mode.\n";
cout << flush;
#endif
MyCOMPUTEDSequence.Value (Index)->GraphicUnHighlight ();
if ((MyTOCOMPUTESequence.Value (i))->Identification ()
== StrId) Result = i;
#ifdef TRACE_ISCOMP
- cout << "\nDans la vue " << Identification () << " la structure ";
+ cout << "\n In the view " << Identification () << " the structure ";
if (Result != 0)
- cout << StrId << " est calculee par "
+ cout << StrId << " is calculated by "
<< MyCOMPUTEDSequence.Value (Result)->Identification ()
<< "\n" << flush;
else
- cout << StrId << " n'est pas calculee\n" << flush;
+ cout << StrId << " is not calculated\n" << flush;
#endif
#ifdef TRACE_LENGTH
Standard_Integer i = MyDisplayedStructure.Extent ();
- // On s'arrette a la premiere structure qui est du type TOS_COMPUTED
+ // Stop at the first structure of type TOS_COMPUTED
while (! Result && Iterator.More ()) {
Result =
(((Iterator.Key ())->Visual ()) == Graphic3d_TOS_COMPUTED);
- // Iterator.Next () se positionne sur la
- // prochaine structure
+ // Iterator.Next () is located on the
+ // next structure
Iterator.Next ();
}
Graphic3d_MapIteratorOfMapOfStructure Iterator (ASet);
- // On s'arrette a la premiere structure qui contient une facette
+ // Stop at the first structure containing a facet
for ( Iterator.Initialize (ASet);
Iterator.More () && ! Result;
Iterator.Next ())
if ( ZM != RealLast() && ZM > ZMax )
ZMax = ZM ;
}
- // Seules les structures non vides et non infinies
- // sont prises en compte pour le calcul des MinMax
+ // Only non-empty and non-infinite structures
+ // are taken into account for calculation of MinMax
if (! (Iterator.Key ())->IsInfinite () &&
! (Iterator.Key ())->IsEmpty ()) {
(Iterator.Key ())->MinMaxValues(Xm, Ym, Zm, XM, YM, ZM);
}
}
- // Les cas suivants ne sont pas debiles
- // Par exemple si toutes les structures sont vides ou infinies
+ // The following cases are relevant
+ // For exemple if all structures are empty or infinite
if (XMax < XMin) { Xm = XMin; XMin = XMax; XMax = Xm; }
if (YMax < YMin) { Ym = YMin; YMin = YMax; YMax = Ym; }
if (ZMax < ZMin) { Zm = ZMin; ZMin = ZMax; ZMax = Zm; }
math_Vector PtDC (0,3), PtWC (0,3);
// RLE method:
-// Sinon utiliser un new sur une Visual3d_View (constructeur+destructeur)
-// car Projects est une const methode or MatrixOfOrientation et
-// MatrixOfMapping ne le sont pas.
+// Otherwise use new on Visual3d_View (constructor+destructor)
+// as Projects is a const method or MatrixOfOrientation and
+// MatrixOfMapping is not.
Visual3d_View * const newthis = (Visual3d_View * const) this;
newthis->MatrixOfOrientation ();
newthis->MatrixOfMapping ();
Standard_Real bpd = MyViewMapping.BackPlaneDistance ();
/*
- * Les coordonnees de PtNPC sont decrites dans l'espace
+ * Coordinates of PtNPC are described in the space
* [0-1]x[0-1]x[0-1].
- * Il faut transformer x et y dans le window space.
- * Il faut transformer z dans l'espace du back et front
- * plane, en pensant aux plans de clipping.
- * Ces plans de z clipping sont definis entre 0 et 1.
+ * It is necessary to transform x and y in the window space.
+ * It is necessary to transform z in the space of back and front
+ * plane, taking into account clipping planes.
+ * Z clipping planes are defined between 0 and 1.
*/
APX = PtNPC (0) * (uM - um) + um;
APX /= Ratio;
/*
- * Les coordonnees de APX, APY, APZ sont decrites dans
- * l'espace [0-1]x[0-1]x[0-1].
- * Il faut transformer x et y dans le window space.
- * Il faut transformer z dans l'espace du back et front
- * plane, en pensant aux plans de clipping.
- * Ces plans de z clipping sont definis entre 0 et 1.
- */
+ * Coordinates of APX, APY, APZ are described in the space
+ * [0-1]x[0-1]x[0-1].
+ * It is necessary to transform x and y in the window space.
+ * It is necessary to transform z in the space of back and front
+ * plane, taking into account clipping planes.
+ * Z clipping planes are defined between 0 and 1.
+ */
APX = APX * (uM - um) + um;
APY = APY * (vM - vm) + vm;
}
if ((! IsDefined ()) || (! IsActive ())) return (Standard_False);
-// -1 => non force par le programmeur => depend du type de visualisation
-// 0 ou 1 => force par le programmeur
+// -1 => not forced by the programmer => depends on the type of visualisation
+// 0 ou 1 => forced by the programmer
if (MyCView.Context.ZBufferActivity == -1)
if (MyContext.Visualization () == Visual3d_TOV_SHADING)
for (i=1; i<=Length; i++)
(MyCOMPUTEDSequence.Value (i))->SetHLRValidation (Standard_False);
- // Si le mode degenere est actif, on ne recalcule rien
+ // if the degenerated node is active, nothing is recomputed
#ifdef G003
if ( DegenerateModeIsOn () || !ComputedMode () ) return;
#else
#endif // G003
/*
- * Forcer le HLRValidation a False sur toutes les structures
- * calculees dans la vue.
+ * Force HLRValidation to False on all structures
+ * calculated in the view.
*/
#ifdef TRACE_LENGTH
if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ()) {
#endif
/*
- * Changement d'orientation ou de type de projection =>
- * Erase des structures qui ont ete calculees pour
- * l'orientation precedente.
- * Recalcul des nouvelles structures.
- * Passage du mode degenere ON a OFF =>
- * Erase des structures qui ont ete calculees avant que
- * le mode degenere passe a ON.
- * Recalcul des nouvelles structures.
+ * Change of orientation or of projection type =>
+ * Remove structures that were calculated for the
+ * previous orientation.
+ * Recalculation of new structures.
+ * Passage of the degenerated mode ON to OFF =>
+ * Remove structures that were calculated before
+ * the degenerated mode passed to ON.
+ * Recalculate new structures.
*/
Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
Visual3d_TypeOfAnswer Answer;
while (S1Iterator.More ()) {
Answer = AcceptDisplay (S1Iterator.Key ());
- // Si la structure etait calculee, on la recalcule.
+ // If the structure was calculated, it is recalculated.
if (Answer == Visual3d_TOA_COMPUTE) {
#ifdef TRACE
cout << "AcceptDisplay ("
FooSequence.Append (S1Iterator.Key ());
}
- // S1Iterator.Next () se positionne sur la
- // prochaine structure
+ // S1Iterator.Next () is located on the next structure
S1Iterator.Next ();
}
Length = FooSequence.Length ();
- // On affiche les structures stockees
+ // All stored structures are displayed
for (i=1; i<=Length; i++)
Display (FooSequence.Value (i), Aspect_TOU_WAIT);
if (Length != 0) FooSequence.Clear ();
Standard_Integer Index = IsComputed (AStructure);
if (Index == 0) {
#ifdef TRACE_COMP
- cout << "La structure " << AStructure->Identification ()
- << " n'est pas calculee dans la view "
+ cout << "Structure " << AStructure->Identification ()
+ << " is not calculated in the view "
<< Identification () << "\n";
cout << flush;
#endif
MyCOMPUTEDSequence.Value (Index)->Identification ();
#ifdef TRACE_COMP
Standard_Integer StructId = AStructure->Identification ();
- cout << "La structure " << StructId
- << " calculee, dans la view "
- << Identification () << ", par la structure "
- << OldStructId << " est recalculee.\n";
+ cout << "Structure " << StructId
+ << " calculated, in the view "
+ << Identification () << ", by the structure "
+ << OldStructId << " is recalculated.\n";
cout << flush;
#endif
#endif
TheStructure->SetHLRValidation (Standard_True);
-// Recuperation type de visualisation de la vue
+// Return type of visualisation of the view
Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
-// De quel type sera la computed ?
+// Of which type will be the computed ?
Standard_Boolean ComputeWireframe = ((ViewType == Visual3d_TOV_WIREFRAME) &&
(AStructure->ComputeVisual () != Graphic3d_TOS_SHADING));
TheStructure->GraphicHighlight (Aspect_TOHM_COLOR);
}
- // On la range
- // Recherche de la structure <AStructure>
- // dans la sequence des structures a calculer
+ // Ot is ranged
+ // Find structure <AStructure>
+ // in the sequence of structures to be calculated.
NewStructId = TheStructure->Identification ();
- // On efface l'ancienne calculee et on affiche la nouvelle
+ // The previous calculation is removed and the new one is dislayed
MyGraphicDriver->EraseStructure (
MyCView,
*(Graphic3d_CStructure *)MyCOMPUTEDSequence.Value (Index)->CStructure ());
}
#endif
- // On ajoute la hlhsr et
- // la nouvelle compute associee
+ // hlhsr and the new associated compute are added
MyTOCOMPUTESequence.Append (AStructure);
MyCOMPUTEDSequence.Append (TheStructure);
<< "\n" << flush;
#endif
- // On enleve la hlhsr et
- // l'ancienne compute associee
+ // hlhsr and the new associated compute are removed
MyTOCOMPUTESequence.Remove (Index);
MyCOMPUTEDSequence.Remove (Index);
cout << flush;
#endif
- // Si le mode degenere est deja actif, on ne recalcule rien
+ // If the degenerated mode is already active, nothing is recalculated
if (DegenerateModeIsOn ()) return;
DegenerateModeIsActive = Standard_True;
MyCView.IsDegenerates = 1;
#else
/*
- * Changement d'activite du mode degenere
- * Erase des structures qui ont ete calculees
- * et affichees quand le mode etait off.
- * Affichage des structures non calculees.
+ * Change of activity of the degenerated mode
+ * Remove structures that were calculated
+ * and displayed when the mode was off.
+ * Display of non-calculated structures.
*/
Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
Visual3d_TypeOfAnswer Answer;
while (S1Iterator.More ()) {
Answer = AcceptDisplay (S1Iterator.Key ());
- // Si la structure etait a calculer, on efface la
- // structure calculee et l'on l'affiche
- // (C'est le role du passage en mode degenere)
+ // If the structure was calculated, the previous one is
+ // removed and the new one is displayed
+ // (This is the role of passage into degenerated mode)
if (Answer == Visual3d_TOA_COMPUTE) {
Standard_Integer Index = IsComputed (S1Iterator.Key ());
StructId =
MyCOMPUTEDSequence.Value (Index)->Identification ();
#ifdef TRACE_COMP
- cout << "La structure " << S1Iterator.Key ()->Identification ()
- << " calculee, dans la view "
- << Identification () << ", par la structure "
- << StructId << " passe en mode degenere.\n";
- cout << "On efface " << StructId << " puis on affiche "
+ cout << "Structure " << S1Iterator.Key ()->Identification ()
+ << " calculated, in the view "
+ << Identification () << ", by structure "
+ << StructId << " passes in degenerated mode.\n";
+ cout << "Remove" << StructId << " then display "
<< S1Iterator.Key ()->Identification () << "\n";
cout << flush;
#endif
);
}
else {
- // Le else est impossible (OUI !)
- // Si le mode etait non degenere avant alors la
- // structure calculee associee a S1Iterator.Key ()
- // existe vraiment et donc Index != 0
+ // Else is impossible)
+ // If the mode was not degenerated previously, the
+ // calculated structure associated to S1Iterator.Key ()
+ // really exists and Index != 0
}
}
- // S1Iterator.Next () se positionne sur la
- // prochaine structure
+ // S1Iterator.Next () is located on the next structure
S1Iterator.Next ();
}
#endif //G003
cout << flush;
#endif
- // Si le mode degenere est deja inactif, on ne recalcule rien
+ // If the degenerated mode is already inactive, nothing is recalculated
if (! DegenerateModeIsOn ()) return;
DegenerateModeIsActive = Standard_False;
MyCView.IsDegenerates = 0;
#else
/*
- * Changement d'activite du mode degenere
- * Erase des structures qui ont ete affichees
- * quand le mode etait on.
- * Calcul des structures.
+ * Change of activity of degenerated mode
+ * Remove structures that were displayed
+ * when the mode was on.
+ * Calculation of structures.
*/
Graphic3d_MapIteratorOfMapOfStructure S1Iterator (MyDisplayedStructure);
Visual3d_TypeOfAnswer Answer;
while (S1Iterator.More ()) {
Answer = AcceptDisplay (S1Iterator.Key ());
- // Si la structure etait a calculer, on l'efface
- // et on affiche la structure calculee
- // (C'est le role du passage en mode non degenere)
-
+ // If the structure was calculated, the previous one is
+ // removed and the new one is displayed
+ // (This is the role of passage into degenerated mode)
+
if (Answer == Visual3d_TOA_COMPUTE) {
Standard_Integer Index = IsComputed (S1Iterator.Key ());
if (Index != 0) {
StructId =
MyCOMPUTEDSequence.Value (Index)->Identification ();
#ifdef TRACE_COMP
- cout << "La structure " << S1Iterator.Key ()->Identification ()
- << " calculee, dans la view "
- << Identification () << ", par la structure "
- << StructId << " passe en mode normal.\n";
- cout << "On efface " << S1Iterator.Key ()->Identification ()
- << " puis on affiche " << StructId << "\n";
+ cout << "Structure " << S1Iterator.Key ()->Identification ()
+ << " calculated, in the view "
+ << Identification () << ", by the structure "
+ << StructId << " passes into normal mode.\n";
+ cout << "Remove " << S1Iterator.Key ()->Identification ()
+ << " then display " << StructId << "\n";
cout << flush;
#endif
MyGraphicDriver->EraseStructure
}
}
else {
- // Le else est impossible (NON !)
- // Le mode degenere a ete active avant l'affichage
- // de la structure. La structure a donc ete ensuite
- // affichee dans le mode degenere et donc sans que la
- // structure calculee existe.
- // On la calcule
+ // Else is impossible
+ // Degenerated mode was activated before display of the
+ // structure. So the structure was displayed in the
+ // degenerated mode, but the calculated structure didn't exist.
+ // It is calculated.
// Compute + Validation
Handle(Graphic3d_Structure) AStructure = (S1Iterator.Key ());
#endif
TheStructure->SetHLRValidation (Standard_True);
-// Recuperation type de visualisation de la vue
+// Return type of visualisation of the view
Visual3d_TypeOfVisualization ViewType = MyContext.Visualization ();
-// De quel type sera la computed ?
+// Of which type will be the computed ?
Standard_Boolean ComputeWireframe = ((ViewType == Visual3d_TOV_WIREFRAME) &&
((S1Iterator.Key ())->ComputeVisual () != Graphic3d_TOS_SHADING));
TheStructure->GraphicHighlight (Aspect_TOHM_COLOR);
}
- // On la range
+ // Make range
Standard_Integer Result = 0;
Standard_Integer Length = MyTOCOMPUTESequence.Length ();
- // Recherche de la structure <S1Iterator.Key ()>
- // dans la sequence des structures a calculer
+ // Find structure <S1Iterator.Key ()>
+ // in the sequence of structures to be calculated
StructId = (S1Iterator.Key ())->Identification ();
for (i=1; i<=Length && Result==0; i++)
if ((MyTOCOMPUTESequence.Value (i))->Identification () ==
if (Result != 0)
MyCOMPUTEDSequence.ChangeValue (Result) = TheStructure;
else {
- // On ajoute la hlhsr et la nouvelle compute associee
+ // hlhsr and the associated new compute are added
#ifdef TRACE_LENGTH
if (MyTOCOMPUTESequence.Length () != MyCOMPUTEDSequence.Length ()) {
cout << "In Visual3d_View::SetDegenerateModeOff, ";
#endif
}
- // On efface la degeneree et on affiche la calculee
+ // The degenerated is removed and the calculated is displayed
MyGraphicDriver->EraseStructure
(MyCView,
*(Graphic3d_CStructure *)(S1Iterator.Key ()->CStructure ()));
}
}
- // S1Iterator.Next () se positionne sur la
- // prochaine structure
+ // S1Iterator.Next () is located on the next structure
S1Iterator.Next ();
}
while (S1Iterator.More ()) {
if (DegenerateModeIsOn ())
- // Le mode etant degenere on plotte la structure
- // affichee sans s'occuper si elle est calculee
+ // As the mode is degenerated the displayed structure
+ // is plotted without taking into account if it is calculated or not
(S1Iterator.Key ())->Plot (APlotter);
else {
Standard_Integer Index = IsComputed (S1Iterator.Key ());
- // Le mode n'etant pas degenere on plotte la structure
- // affichee si elle n'est pas calculee sinon
- // on plotte la structure calculee associee
+ // As the mode is not degenerated the displayed structure
+ // is plotted as if it was not calculated, otherwise the
+ // associated calculated structure is plotted.
if (Index == 0)
(S1Iterator.Key ())->Plot (APlotter);
else
(MyCOMPUTEDSequence.Value (Index))->Plot (APlotter);
}
- // S1Iterator.Next () se positionne sur la
- // prochaine structure
+ // S1Iterator.Next () is located on the next structure
S1Iterator.Next ();
}
Standard_Integer Result = 0;
Standard_Integer Length = MyTOCOMPUTESequence.Length ();
- // Recherche dans la sequence des structures deja calculees
- // 1/ D'une structure ayant le meme Owner que <AStructure>
- // 2/ Qui ne soit pas <AStructure>
- // 3/ Dont la COMPUTED soit valide
+ // Find in the sequence of already calculated structures
+ // 1/ Structure with the same Owner as <AStructure>
+ // 2/ Which is not <AStructure>
+ // 3/ COMPUTED which of is valid
for (Standard_Integer i=1; i<=Length && Result==0; i++)
if ((MyTOCOMPUTESequence.Value (i)->Owner () == AStructure->Owner ())
&& (MyTOCOMPUTESequence.Value (i)->Identification () !=
----------
Classe Visual3d_ViewManager.cxx :
- Declaration des variables specifiques aux visualiseurs
+ Declaration of variables specific to visualisers
HISTORIQUE DES MODIFICATIONS :
--------------------------------
/*----------------------------------------------------------------------*/
/*
- * Constantes
+ * Constants
*/
#define NO_DOWNCAST
(MyIterator.Value ())->ChangeDisplayPriority
(AStructure, OldPriority, NewPriority);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
//Standard_Integer LengthD = MyDisplayedStructure.Extent() ();
- // Meme si physiquement la structure ne peut pas
- // etre affichee (pb de type de visualisation)
- // elle a le statut Displayed.
+ // Even if physically the structure cannot
+ // be displayed (pb of visualisation type)
+ // it has status Displayed.
if (!MyDisplayedStructure.Contains(AStructure))
return;
while (MyIterator.More ()) {
(MyIterator.Value ())->ReCompute (AStructure);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
Standard_Integer indexD = 0;
-// Meme si physiquement la structure ne peut pas
-// etre affichee (pb de type de visualisation)
-// elle a le statut Displayed.
+ // Even if physically the structure cannot
+ // be displayed (pb of visualisation type)
+ // it has status Displayed.
if (!MyDisplayedStructure.Contains(AStructure))
return;
//
- // Recompute structure in one activated view
+ // Recompute structure in all activated views
//
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
if ((MyIterator.Value ())->Identification () == ViewId)
theView->ReCompute (AStructure);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
while (MyIterator.More ()) {
(MyIterator.Value ())->Clear (AStructure, WithDestruction);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
while (MyIterator.More ()) {
(MyIterator.Value ())->Connect (AMother, ADaughter);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
while (MyIterator.More ()) {
(MyIterator.Value ())->Disconnect (AMother, ADaughter);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
void Visual3d_ViewManager::Display (const Handle(Graphic3d_Structure)& AStructure) {
- // Meme si physiquement la structure ne peut pas
- // etre affichee (pb de type de visualisation)
- // elle a le statut Displayed.
+ // Even if physically the structure cannot
+ // be displayed (pb of visualisation type)
+ // it has status Displayed.
MyDisplayedStructure.Add(AStructure);
while (MyIterator.More ()) {
(MyIterator.Value ())->Display (AStructure);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
void Visual3d_ViewManager::Erase (const Handle(Graphic3d_Structure)& AStructure) {
-// Meme si physiquement la structure ne pouvait pas
-// etre affichee (pb de type de visualisation)
-// elle avait le statut Displayed.
+// Even if physically the structure cannot
+ // be displayed (pb of visualisation type)
+ // it has status Displayed.
MyDisplayedStructure.Remove(AStructure);
while (MyIterator.More ()) {
(MyIterator.Value ())->Erase (AStructure);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
while (MyIterator.More ()) {
(MyIterator.Value ())->Highlight (AStructure, AMethod);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
while (MyIterator.More ()) {
(MyIterator.Value ())->SetTransform (AStructure, ATrsf);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
while (MyIterator.More ()) {
(MyIterator.Value ())->UnHighlight (AStructure);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
if (Dx > MaxDx) MaxDx = Dx;
if (Dy > MaxDy) MaxDy = Dy;
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
if (! MyUnderLayer.IsNull ())
while (MyIterator.More ()) {
(MyIterator.Value ())->Redraw (MyUnderLayer, MyOverLayer);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
while (MyIterator.More ()) {
(MyIterator.Value ())->Update (MyUnderLayer, MyOverLayer);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
if ((MyIterator.Value ())->IsActive ())
SG->Add (MyIterator.Value ());
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
Result =
(MyIterator.Value ())->ContainsComputedStructure ();
- // MyIterator.Next () se positionne
- // sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
while (MyIterator.More ()) {
SG->Add (MyIterator.Value ());
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
void Visual3d_ViewManager::ConvertCoord (const Handle(Aspect_Window)& AWindow, const Graphic3d_Vertex& AVertex, Standard_Integer& AU, Standard_Integer& AV) const {
-// On convertit que si les donnees sont correctes
+// Convert only if the data is correct
Standard_Boolean Exist;
Graphic3d_CView TheCView;
//Graphic3d_Vertex Point;
stop = 1;
}
- // MyIterator.Next () se positionne
- // sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
Graphic3d_Vertex Visual3d_ViewManager::ConvertCoord (const Handle(Aspect_Window)& AWindow, const Standard_Integer AU, const Standard_Integer AV) const {
-// On convertit que si les donnees sont correctes
+// Convert only if the data is correct
Graphic3d_CView TheCView;
Graphic3d_Vertex Point;
0, 0, Width, Height,
AU, AV, x, y, z);
- // Le unproject est realise par UnProjectRaster
+ // unproject is done by UnProjectRaster
if (Result) {
Point.SetCoord
(Standard_Real (x), Standard_Real (y), Standard_Real (z));
}
- // Le unproject n'est pas realisable par UnProjectRaster
- // Code a virer des que les drivers Phigs et Pex seront abandonnes.
+ // unproject cannot be done by UnProjectRaster
+ // Code suspended since drivers Phigs and Pex are abandoned.
else {
Standard_Real NPCX, NPCY, NPCZ;
stop = 1;
}
- // MyIterator.Next () se positionne
- // sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
void Visual3d_ViewManager::ConvertCoordWithProj (const Handle(Aspect_Window)& AWindow, const Standard_Integer AU, const Standard_Integer AV, Graphic3d_Vertex& Point, Graphic3d_Vector& Proj) const {
-// On convertit que si les donnees sont correctes
+// Conversion only if the data is correct
Graphic3d_CView TheCView;
if (! ViewExists (AWindow, TheCView)) {
0, 0, Width, Height,
AU, AV, x, y, z, dx, dy, dz);
- // Le unproject est realise par UnProjectRaster
+ // unproject is done by UnProjectRaster
if (Result) {
Point.SetCoord
(Standard_Real (x), Standard_Real (y), Standard_Real (z));
(Standard_Real (dx), Standard_Real (dy), Standard_Real (dz));
Proj.Normalize();
}
- // Le unproject n'est pas realisable par UnProjectRaster
- // Code a virer des que les drivers Phigs et Pex seront abandonnes.
+ // unproject cannot be done by UnProjectRaster
+ // Code is suspended since drivers Phigs are Pex abandoned.
else {
Standard_Real NPCX, NPCY, NPCZ;
stop = 1;
}
- // MyIterator.Next () se positionne
- // sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
Visual3d_PickDescriptor Visual3d_ViewManager::Pick (const Visual3d_ContextPick& CTX, const Handle(Aspect_Window)& AWindow, const Standard_Integer AX, const Standard_Integer AY) {
-// On active le reperage que si les donnees sont correctes
+// The marking is activated only if the data is correct
Standard_Boolean DoPick = Standard_False;
CALL_DEF_PICK apick;
Standard_Integer Width, Height;
- // Parcours de la liste des vues pour rechercher
- // une vue ayant pour fenetre celle specifiee
+ // Parse the list of views to find a
+ // view having this specified window
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
int TheWindowIdOfView;
const Handle(WNT_Window) theWindow = *(Handle(WNT_Window) *) &AspectWindow;
TheWindowIdOfView = int (theWindow->HWindow ());
#endif // WNT
- // Comparaison sur les windows ids
+ // Comparision on window IDs
if (TheWindowIdOfView == TheSpecifiedWindowId) {
DoPick = Standard_True;
- // Mise a jour
+ // Update
apick.WsId =
int ((MyIterator.Value ())->Identification ());
}
} /* if ((MyIterator.Value ())->IsDefined ()) { */
- // MyIterator.Next () se positionne
- // sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
else
apick.Pick.depth = 0;
- // Picking : le retour
+ // Picking : return
Standard_Integer i, j=0;
Standard_Integer NbPick;
}
}
- // Pas tres efficace, a revoir (CAL 22/09/95)
+ // Not very efficient, revise (CAL 22/09/95)
if (apick.Pick.depth > 2) {
Handle(Graphic3d_Structure) StructCur =
Graphic3d_StructureManager::Identification (j);
PDes.AddPickPath (PPat);
NbPick++;
}
- // IteratorD.Next () se positionne
- // sur la prochaine structure
+ // IteratorD.Next () is located on the next structure
IteratorD.Next ();
}
}
Standard_Boolean Exist = Standard_False;
- // Parcours de la liste des vues pour rechercher
- // une vue ayant pour fenetre celle specifiee
+ // Parse the list of views to find
+ // a view with the specified window
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
int TheWindowIdOfView;
const Handle(WNT_Window) theWindow = *(Handle(WNT_Window) *) &AspectWindow;
TheWindowIdOfView = int (theWindow->HWindow ());
#endif // WNT
- // Comparaison sur les windows ids
+ // Comparaison on window IDs
if (TheWindowIdOfView == TheSpecifiedWindowId) {
Exist = Standard_True;
TheCView = *(CALL_DEF_VIEW *)(MyIterator.Value ())->CView ();
}
} /* if ((MyIterator.Value ())->IsDefined ()) */
- // MyIterator.Next () se positionne
- // sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
if (! (MyIterator.Value ())->IsActive ())
(MyIterator.Value ())->Activate ();
- // MyIterator.Next () se positionne
- // sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
if ((MyIterator.Value ())->IsActive ())
(MyIterator.Value ())->Deactivate ();
- // MyIterator.Next () se positionne
- // sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
Standard_Integer Visual3d_ViewManager::MaxNumOfViews () const {
- // on retourne le nombre theorique de vues definissables pour le
- // Visual3d_ViewManager courant.
+ // Retourne the planned of definable views for the current
+ // Visual3d_ViewManager.
return
(Standard_Integer ((View_IDMAX-View_IDMIN+1)/Visual3d_ViewManager::Limit ()));
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
while (MyIterator.More ()) {
(MyIterator.Value ())->SetTransparency (AFlag);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
if (MyZBufferAuto && AFlag) return;
if (! MyZBufferAuto && ! AFlag) return;
- // si de False on passe a True :
- // pas de probleme, au prochain update de vue, celle-ci se
- // posera les bonnes questions pour reagir (SetVisualisation)
- // si de True on passe a False :
- // il faut modifier le ZBufferActivity de chaque vue pour que
- // le zbuffer ne soit actif que si le contexte le demande.
- // Dans ce cas on passe -1 pour que la vue se pose la question
- // Rappel : 0 on force la desactivation, 1 on force l'activation
+ // if pass from False to True :
+ // no problem, at the next view update, it
+ // will properly ask questions to answer (SetVisualisation)
+ // if pass from True to False :
+ // it is necessary to modify ZBufferActivity at each view so that
+ // zbuffer could be active only if required by context.
+ // In this case -1 is passed so that the view ask itself the question
+ // Note : 0 forces the desactivation, 1 forces the activation
if (! AFlag) {
Visual3d_SetIteratorOfSetOfView MyIterator(MyDefinedView);
while (MyIterator.More ()) {
(MyIterator.Value ())->SetZBufferActivity (-1);
- // MyIterator.Next () se positionne sur la prochaine vue
+ // MyIterator.Next () is located on the next view
MyIterator.Next ();
}
}
// Created Fevrier 1992
// Author NW,JPB,CAL
// Modified
-// 18-11-98 : FMN ; Correction sur la gestion de la perspective (cf Programming Guide)
-// Nouvelle valeur init du ViewMapping
// 22-12-98 : FMN ; Rename CSF_WALKTHROW en CSF_WALKTHROUGH
// 23-07-07 : NKV ; Define custom PROJECTION matrix for OpenGl context
//-Version
-//-Design Declaration des variables specifiques au
-// mapping des vues
+//-Design Declaration of variables specific to mapping of views
-//-Warning Rappels Le mapping d'une vue est defini par :
-// - le point reference de projection
-// - le type de projection
-// - une distance pour le Back Plane
-// - une distance pour le Front Plane
-// - une distance pour le Projection Plane
+//-Warning Mapping of a view is defined by :
+// - reference point of projection
+// - type of projection
+// - distance for the Back Plane
+// - distance for the Front Plane
+// - distance for the Projection Plane
//-References
//-Version
-//-Design Declaration des variables specifiques a
-// l'orientation des vues
+//-Design Declaration of variables specific to the orientation of views
-//-Warning L'orientation d'une vue est definie par :
-// - le point origine du repere
-// - le vecteur normal au plan de visualisation
-// - le vecteur vertical de l'observateur
+//-Warning The view orientation is defined by :
+// - the point of origin of the reference mark
+// - the normal vector to the visualisation plane
+// - the vertical vector of the viewer
//-References