for circle and arc of circle also store angle to local x-axis
This commit is contained in:
@@ -1699,7 +1699,11 @@ void GeomCircle::Save(Base::Writer& writer) const
|
||||
GeomCurve::Save(writer);
|
||||
|
||||
gp_Pnt center = this->myCurve->Axis().Location();
|
||||
gp_Dir norm = this->myCurve->Axis().Direction();
|
||||
gp_Dir normal = this->myCurve->Axis().Direction();
|
||||
gp_Dir xdir = this->myCurve->XAxis().Direction();
|
||||
|
||||
gp_Ax2 xdirref(center, normal); // this is a reference XY for the circle
|
||||
double AngleXU = -xdir.AngleWithRef(xdirref.XDirection(),normal);
|
||||
|
||||
writer.Stream()
|
||||
<< writer.ind()
|
||||
@@ -1707,9 +1711,10 @@ void GeomCircle::Save(Base::Writer& writer) const
|
||||
<< "CenterX=\"" << center.X() <<
|
||||
"\" CenterY=\"" << center.Y() <<
|
||||
"\" CenterZ=\"" << center.Z() <<
|
||||
"\" NormalX=\"" << norm.X() <<
|
||||
"\" NormalY=\"" << norm.Y() <<
|
||||
"\" NormalZ=\"" << norm.Z() <<
|
||||
"\" NormalX=\"" << normal.X() <<
|
||||
"\" NormalY=\"" << normal.Y() <<
|
||||
"\" NormalZ=\"" << normal.Z() <<
|
||||
"\" AngleXU=\"" << AngleXU <<
|
||||
"\" Radius=\"" << this->myCurve->Radius() <<
|
||||
"\"/>" << endl;
|
||||
}
|
||||
@@ -1720,6 +1725,7 @@ void GeomCircle::Restore(Base::XMLReader& reader)
|
||||
GeomCurve::Restore(reader);
|
||||
|
||||
double CenterX,CenterY,CenterZ,NormalX,NormalY,NormalZ,Radius;
|
||||
double AngleXU=0;
|
||||
// read my Element
|
||||
reader.readElement("Circle");
|
||||
// get the value of my Attribute
|
||||
@@ -1729,13 +1735,20 @@ void GeomCircle::Restore(Base::XMLReader& reader)
|
||||
NormalX = reader.getAttributeAsFloat("NormalX");
|
||||
NormalY = reader.getAttributeAsFloat("NormalY");
|
||||
NormalZ = reader.getAttributeAsFloat("NormalZ");
|
||||
if (reader.hasAttribute("AngleXU"))
|
||||
AngleXU = reader.getAttributeAsFloat("AngleXU");
|
||||
Radius = reader.getAttributeAsFloat("Radius");
|
||||
|
||||
// set the read geometry
|
||||
gp_Pnt p1(CenterX,CenterY,CenterZ);
|
||||
gp_Dir norm(NormalX,NormalY,NormalZ);
|
||||
|
||||
gp_Ax1 normaxis(p1,norm);
|
||||
gp_Ax2 xdir(p1, norm);
|
||||
xdir.Rotate(normaxis,AngleXU);
|
||||
|
||||
try {
|
||||
GC_MakeCircle mc(p1, norm, Radius);
|
||||
GC_MakeCircle mc(xdir, Radius);
|
||||
if (!mc.IsDone())
|
||||
throw Base::Exception(gce_ErrorStatusText(mc.Status()));
|
||||
|
||||
@@ -1913,7 +1926,11 @@ void GeomArcOfCircle::Save(Base::Writer &writer) const
|
||||
Handle(Geom_Circle) circle = Handle(Geom_Circle)::DownCast(this->myCurve->BasisCurve());
|
||||
|
||||
gp_Pnt center = circle->Axis().Location();
|
||||
gp_Dir norm = circle->Axis().Direction();
|
||||
gp_Dir normal = circle->Axis().Direction();
|
||||
gp_Dir xdir = circle->XAxis().Direction();
|
||||
|
||||
gp_Ax2 xdirref(center, normal); // this is a reference XY for the arc
|
||||
double AngleXU = -xdir.AngleWithRef(xdirref.XDirection(),normal);
|
||||
|
||||
writer.Stream()
|
||||
<< writer.ind()
|
||||
@@ -1921,9 +1938,10 @@ void GeomArcOfCircle::Save(Base::Writer &writer) const
|
||||
<< "CenterX=\"" << center.X() <<
|
||||
"\" CenterY=\"" << center.Y() <<
|
||||
"\" CenterZ=\"" << center.Z() <<
|
||||
"\" NormalX=\"" << norm.X() <<
|
||||
"\" NormalY=\"" << norm.Y() <<
|
||||
"\" NormalZ=\"" << norm.Z() <<
|
||||
"\" NormalX=\"" << normal.X() <<
|
||||
"\" NormalY=\"" << normal.Y() <<
|
||||
"\" NormalZ=\"" << normal.Z() <<
|
||||
"\" AngleXU=\"" << AngleXU <<
|
||||
"\" Radius=\"" << circle->Radius() <<
|
||||
"\" StartAngle=\"" << this->myCurve->FirstParameter() <<
|
||||
"\" EndAngle=\"" << this->myCurve->LastParameter() <<
|
||||
@@ -1936,6 +1954,7 @@ void GeomArcOfCircle::Restore(Base::XMLReader &reader)
|
||||
Geometry::Restore(reader);
|
||||
|
||||
double CenterX,CenterY,CenterZ,NormalX,NormalY,NormalZ,Radius,StartAngle,EndAngle;
|
||||
double AngleXU=0;
|
||||
// read my Element
|
||||
reader.readElement("ArcOfCircle");
|
||||
// get the value of my Attribute
|
||||
@@ -1945,6 +1964,8 @@ void GeomArcOfCircle::Restore(Base::XMLReader &reader)
|
||||
NormalX = reader.getAttributeAsFloat("NormalX");
|
||||
NormalY = reader.getAttributeAsFloat("NormalY");
|
||||
NormalZ = reader.getAttributeAsFloat("NormalZ");
|
||||
if (reader.hasAttribute("AngleXU"))
|
||||
AngleXU = reader.getAttributeAsFloat("AngleXU");
|
||||
Radius = reader.getAttributeAsFloat("Radius");
|
||||
StartAngle = reader.getAttributeAsFloat("StartAngle");
|
||||
EndAngle = reader.getAttributeAsFloat("EndAngle");
|
||||
@@ -1952,8 +1973,13 @@ void GeomArcOfCircle::Restore(Base::XMLReader &reader)
|
||||
// set the read geometry
|
||||
gp_Pnt p1(CenterX,CenterY,CenterZ);
|
||||
gp_Dir norm(NormalX,NormalY,NormalZ);
|
||||
|
||||
gp_Ax1 normaxis(p1,norm);
|
||||
gp_Ax2 xdir(p1, norm);
|
||||
xdir.Rotate(normaxis,AngleXU);
|
||||
|
||||
try {
|
||||
GC_MakeCircle mc(p1, norm, Radius);
|
||||
GC_MakeCircle mc(xdir, Radius);
|
||||
if (!mc.IsDone())
|
||||
throw Base::Exception(gce_ErrorStatusText(mc.Status()));
|
||||
GC_MakeArcOfCircle ma(mc.Value()->Circ(), StartAngle, EndAngle, 1);
|
||||
|
||||
Reference in New Issue
Block a user