| McNeel Wiki | |||||
| edit · print · help · all topics | |||||
Main Pages
Languages
| The following sample code demonstrates how to divide a selected curve object by a specified length. C++
CRhinoCommand::result CCommandTest::RunCommand(
const CRhinoCommandContext& context )
{
CRhinoGetObject go;
go.SetCommandPrompt( L"Select curve to divide" );
go.SetGeometryFilter( CRhinoGetObject::curve_object );
go.GetObjects( 1, 1 );
if( go.CommandResult() != CRhinoCommand::success )
return go.CommandResult();
const CRhinoObjRef& objref = go.Object(0);
const ON_Curve* crv = objref.Curve();
if( !crv )
return CRhinoCommand::failure;
double crv_length = 0.0;
crv->GetLength( &crv_length );
if( crv_length < ON_ZERO_TOLERANCE )
return CRhinoCommand::failure;
ON_wString s;
s.Format( L"Curve length is %g. Segment Length", crv_length );
CRhinoGetNumber gn;
gn.SetCommandPrompt( s );
gn.SetLowerLimit( 0.0, TRUE );
gn.SetUpperLimit( crv_length, TRUE );
gn.GetNumber();
if( gn.CommandResult() != CRhinoCommand::success )
return gn.CommandResult();
double seg_length = gn.Number();
int seg_count = (int)floor( crv_length / seg_length );
double fractional_end = (seg_count * seg_length) / crv_length;
double t0, t1;
crv->GetDomain( &t0, &t1 );
crv->GetNormalizedArcLengthPoint( fractional_end, &t1 );
seg_count++;
ON_SimpleArray<double> t( seg_count );
t.SetCount( seg_count );
for( int i = 0; i < seg_count; i++ )
{
double param = (double)i / ((double)seg_count-1);
t[i] = param;
}
ON_Interval sub_domain( t0, t1 );
crv->GetNormalizedArcLengthPoints( seg_count,
(double*)&t[0], (double*)&t[0],
0.0, 1.0e-8, &sub_domain );
for( int i = 0; i < seg_count; i++ )
{
ON_3dPoint pt = crv->PointAt( t[i] );
context.m_doc.AddPointObject( pt );
}
context.m_doc.Redraw();
return CRhinoCommand::success;
}
VB.NET (Rhino 4)
Public Overrides Function RunCommand(ByVal context As IRhinoCommandContext) _
As IRhinoCommand.result
Dim go As New MRhinoGetObject()
go.SetCommandPrompt("Select curve to divide")
go.SetGeometryFilter(IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object)
go.GetObjects(1, 1)
If (go.CommandResult() <> IRhinoCommand.result.success) Then
Return go.CommandResult()
End If
Dim objref As IRhinoObjRef = go.Object(0)
Dim crv As IOnCurve = objref.Curve()
If (crv Is Nothing) Then Return IRhinoCommand.result.failure
Dim crv_length As Double = 0.0
crv.GetLength(crv_length)
If (crv_length < OnUtil.On_ZERO_TOLERANCE) Then
Return IRhinoCommand.result.failure
End If
Dim s As String = String.Format("Curve length is {0:f3}. Segment Length", _
crv_length)
Dim gn As New MRhinoGetNumber()
gn.SetCommandPrompt(s)
gn.SetLowerLimit(0.0, True)
gn.SetUpperLimit(crv_length, True)
gn.GetNumber()
If (gn.CommandResult() <> IRhinoCommand.result.success) Then
Return gn.CommandResult()
End If
Dim seg_length As Double = gn.Number()
Dim seg_count As Integer = CType(Math.Floor(crv_length / seg_length), Integer)
Dim fractional_end As Double = (seg_count * seg_length) / crv_length
Dim t0 As Double = 0
Dim t1 As Double = 0
crv.GetDomain(t0, t1)
crv.GetNormalizedArcLengthPoint(fractional_end, t1)
Dim t(seg_count) As Double
For i As Integer = 0 To seg_count
t(i) = i / seg_count
Next
Dim sub_domain As New OnInterval(t0, t1)
crv.GetNormalizedArcLengthPoints(t, t, 0.0, 0.00000001, sub_domain)
For i As Integer = 0 To seg_count
Dim pt As On3dPoint = crv.PointAt(t(i))
context.m_doc.AddPointObject(pt)
Next
context.m_doc.Redraw()
Return IRhinoCommand.result.success
End Function
C# (Rhino 4)
public override IRhinoCommand.result RunCommand(IRhinoCommandContext context)
{
MRhinoGetObject go = new MRhinoGetObject();
go.SetCommandPrompt( "Select curve to divide" );
go.SetGeometryFilter( IRhinoGetObject.GEOMETRY_TYPE_FILTER.curve_object );
go.GetObjects( 1, 1 );
if( go.CommandResult() != IRhinoCommand.result.success )
return go.CommandResult();
MRhinoObjRef objref = go.Object(0);
IOnCurve crv = objref.Curve();
if( crv == null )
return IRhinoCommand.result.failure;
double crv_length = 0.0;
crv.GetLength( ref crv_length );
if( crv_length < OnUtil.On_ZERO_TOLERANCE )
return IRhinoCommand.result.failure;
MRhinoGetNumber gn = new MRhinoGetNumber();
string s = string.Format("Curve length is {0:f3}. Segment length",crv_length);
gn.SetCommandPrompt( s );
gn.SetLowerLimit( 0.0, true );
gn.SetUpperLimit( crv_length, true );
gn.GetNumber();
if(gn.CommandResult() != IRhinoCommand.result.success)
return gn.CommandResult();
double seg_length = gn.Number();
int seg_count = (int)System.Math.Floor( crv_length / seg_length );
double fractional_end = (seg_count * seg_length) / crv_length;
double t0=0, t1=0;
crv.GetDomain( ref t0, ref t1 );
crv.GetNormalizedArcLengthPoint( fractional_end, ref t1);
seg_count++;
double[] t = new double[seg_count];
for( int i = 0; i < seg_count; i++ )
{
double param = (double)i / ((double)seg_count-1);
t[i] = param;
}
OnInterval sub_domain = new OnInterval(t0,t1);
crv.GetNormalizedArcLengthPoints( t, ref t, 0.0, 1.0e-8, sub_domain );
for( int i = 0; i < seg_count; i++ )
{
On3dPoint pt = crv.PointAt( t[i] );
context.m_doc.AddPointObject( pt );
}
context.m_doc.Redraw();
return IRhinoCommand.result.success;
}
| ||||
| Last Modified [7/23/2008] rename · changes · history · subscriptions · references · file upload | |||||