フォローする

.NET - 曲線を分割する

更新 : 2018-01-11 06:06:45 UTC

Curve オブジェクトを分割するには GetSplitCurves メソッドを使用します。
GetSplitCurves メソッドは、曲線オブジェクトから指定されたポイントをもとにして、
分割された形状の曲線オブジェクトを作成していきます。

指定する値として、Point3dCollection オブジェクトか DoubleCollection オブジェクトを使用します。

Point3dCollection オブジェクトを使用する場合は、指定した点の座標をもとに分割を行い、
DoubleCollection オブジェクトを使用する場合は、始点から終点までのパラメーターの数値内で、
指定された値の割合で曲線を分割していきます。

分割結果として作成オブジェクトは、元のオブジェクトの形式とは異なる場合があります。
例えば、円オブジェクトを分割した場合は、円弧オブジェクトが複数作成されます。

下の例では、曲線オブジェクトを入力した数で均等に分割します。

VB.NET

<CommandMethod("SPLITSAMPLE")>
Public Sub SplitSample()
	Dim db = Application.DocumentManager.MdiActiveDocument.Database
	Dim ed = Application.DocumentManager.MdiActiveDocument.Editor
	Dim res1 = ed.GetEntity(vbLf + "分割する曲線を選択")
	If res1.Status <> PromptStatus.OK Then Return
	Using trans = db.TransactionManager.StartTransaction()
		Using ent As Entity = trans.GetObject(res1.ObjectId, OpenMode.ForRead)
			If TypeOf ent Is Curve Then
				Dim crv As Curve = ent
				Dim opt2 = New PromptIntegerOptions(vbLf + "分割数を入力")
				opt2.DefaultValue = 2
				opt2.UseDefaultValue = True
				opt2.LowerLimit = 2
				Dim res2 = ed.GetInteger(opt2)
				If res2.Status <> PromptStatus.OK Then Return
				Dim doubles = New DoubleCollection()
				For idx = 1 To res2.Value
					doubles.Add(crv.EndParam / res2.Value * idx)
				Next
				Dim crvs = crv.GetSplitCurves(doubles)
				If crvs.Count = 0 Then Return
				Dim curSpace As BlockTableRecord = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite)
				For Each obj As Curve In crvs
					curSpace.AppendEntity(obj)
					trans.AddNewlyCreatedDBObject(obj, True)
				Next
				crv.UpgradeOpen()
				crv.Erase()
			Else
				ed.WriteMessage(vbLf + "選択されたオブジェクトは曲線ではありません")
				Return
			End If
		End Using
		trans.Commit()
	End Using
End Sub
C#
[CommandMethod("SPLITSAMPLE")]
public void SplitSample()
{
	var db = Application.DocumentManager.MdiActiveDocument.Database;
	var ed = Application.DocumentManager.MdiActiveDocument.Editor;
	var res1 = ed.GetEntity("\n分割する曲線を選択");
	if (res1.Status != PromptStatus.OK) return;
	using (var trans = db.TransactionManager.StartTransaction())
	{
		using (var ent = trans.GetObject(res1.ObjectId, OpenMode.ForRead) as Entity)
		{
			if (ent is Curve)
			{
				var crv = ent as Curve;
				var opt2 = new PromptIntegerOptions("\n分割数を入力");
				opt2.DefaultValue = 2;
				opt2.UseDefaultValue = true;
				opt2.LowerLimit = 2;
				var res2 = ed.GetInteger(opt2);
				if (res2.Status != PromptStatus.OK) return;
				var doubles = new DoubleCollection();
				for (var idx = 1; idx <= res2.Value; idx++)
				{
					doubles.Add(crv.EndParam / res2.Value * idx);
				}
				var crvs = crv.GetSplitCurves(doubles);
				if (crvs.Count == 0) return;
				var curSpace = trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
				foreach (Curve obj in crvs)
				{
					curSpace.AppendEntity(obj);
					trans.AddNewlyCreatedDBObject(obj, true);
				}
				crv.UpgradeOpen();
				crv.Erase();
			}
			else
			{
				ed.WriteMessage("\n選択されたオブジェクトは曲線ではありません");
				return;
			}
		}
		trans.Commit();
	}
}

 

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています
他にご質問がございましたら、リクエストを送信してください

コメント