Problem
You have drawn an ellipse in Rhino, using the Ellipse command. While reading the .3dm file, using openNURBS, the ellipse is classified as as ON::curve_object
. How does one get the ellipse’s construction data, such as center point, major and minor axes, etc?
Solution
Unlike some curve types (e.g. Lines, Arcs, Polylines, etc.) which have their own ON_Curve
-derived classes, there is no special class that is used to represent elliptical curves. Ellipses and elliptical arcs are simply NURBS, or ON_NurbsCurve
, curves.
To test to see if a curve is an ellipse or an elliptical arc, first try to cast the ON_Curve
object as an ON_NurbsCurve
object. If successful, then use ON_NurbsCurve::IsEllipse()
to verify the NURBS curve is an ellipse and to obtain its construction data.
Sample
ONX_Model model = ...
ONX_ModelComponentIterator it(model, ON_ModelComponent::Type::ModelGeometry);
const ON_ModelComponent* model_component = nullptr;
for (model_component = it.FirstComponent(); nullptr != model_component; model_component = it.NextComponent())
{
const ON_ModelGeometryComponent* model_geometry = ON_ModelGeometryComponent::Cast(model_component);
if (nullptr != model_geometry)
{
// Test for NURBS curve object
const ON_NurbsCurve* nurb = ON_NurbsCurve::Cast(model_geometry->Geometry(nullptr));
if (nullptr != nurb)
{
ON_Ellipse ellipse;
double tolerance = model.m_settings.m_ModelUnitsAndTolerances.m_absolute_tolerance;
bool rc = nurb->IsEllipse(nullptr, &ellipse, tolerance);
if (rc)
{
// Center
ON_3dPoint origin = ellipse.plane.origin;
// Major and minor axes
ON_3dVector xaxis = ellipse.radius[0] * ellipse.plane.xaxis;
ON_3dVector yaxis = ellipse.radius[1] * ellipse.plane.yaxis;
// Quad points
ON_3dPoint p0(origin - xaxis);
ON_3dPoint p1(origin + xaxis);
ON_3dPoint p2(origin - yaxis);
ON_3dPoint p3(origin + yaxis);
// Foci
ON_3dPoint f1, f2;
ellipse.GetFoci(f1, f2);
// TODO: do something with ellipse
}
}
}
}