2年前に寸法線を描いてBakeする記事を書きましたが、Rhino6では書き方が変わっていますので、前回のコードを簡略化して、少し丁寧に解説しつつ新しく書き直します。以下にコードを掲載していますが、ここでは分解して説明します。
DrawDimensionsForRhino6GH(GitHub Gistに飛びます)
まずは、usingについて、色の設定とDimensionStyleを扱うために以下を書きます。
using System.Drawing;
using Rhino.DocObjects;
次にRunScript内の記述です。適当にPlaneを用意します。
//Planeを適当に作成。
Point3d plnPt1 = new Point3d(200, 400, 0);
Point3d plnPt2 = new Point3d(900, 600, 0);
Point3d plnPt3 = new Point3d(1200, 800, 0);
Plane dimPlane = new Plane(plnPt1, plnPt2, plnPt3);
次にLinearDimensionオブジェクトを作成して、寸法スタイルを設定します。
このParentDimensionStyleプロパティはRhino5時代のRhinocommonにはありませんでした。Rhino6ではAnnotationBaseクラスのプロパティが以前より色々充実しているように思います。
//寸法の間隔を点でリストに追加。Point2dであることに注意。
Point2d dimPt1 = new Point2d(0, -150);
Point2d dimPt2 = new Point2d(1500, -150);//LinearDimensionオブジェクトを作成。
LinearDimension lineDim =
new LinearDimension(dimPlane, dimPt1, dimPt2, new Point2d(dimPt1.X, dimPt1.Y - 250));//寸法スタイルを設定する。
lineDim.ParentDimensionStyle = this.FindDimStyleByName("dim_GH-Bake");
次に、コンポーネント内で描画するための準備でリストにデータを格納します。
ひとつだけのデータでも格納します。
//描画のためにひとつのデータでもリストに入れてから描画した方が無難。計算の回し方で問題を起こす場合があるので。
this.lineDimList.Add(lineDim);
最後にBakeの機能を持たせます。
//ボタンを押したらBakeする。
if(bake)
{
//doc.Objects.AddLinearDimension(lineDim); でもOK。
Rhino.RhinoDoc.ActiveDoc.Objects.AddLinearDimension(lineDim);
}
RunScript内の記述はここまで。
Custom additional code以下の記述に移ります。
まずRunScriptから外にデータを渡すためにここでリストを宣言してnewします。
//RunScriptの{}の外にデータを渡すために外で宣言する。
public ListlineDimList = new List ();
RunScript内で使う、寸法スタイルを呼び出すメソッドをここで書いています。
指定した名前の寸法スタイルがあればそれを使い、なければ新しく作成します。ここはやりたい事によって書き方が大きく変わってくるでしょう。
Rhino5では初めに寸法スタイルをRhino側に登録してから設定を書き換え、最後にCommitChangesメソッドを使って更新を掛けていました。
ですが、Rhino6ではCommitChangesメソッドが廃止されたため、一通り設定した後にスタイルの更新を行う事ができません。
なので、一通り設定した後にRhino側に寸法の登録を行っています。(この書き方が正しいのかはわかりません。)
public DimensionStyle FindDimStyleByName(string dimStyleName)
{
DimensionStyle dimStyle = doc.DimStyles.FindName(dimStyleName);if(dimStyle == null)
{
//指定した名前のDimensionStyleがなかった場合は新規作成する。
DimensionStyle newDimStyle = new DimensionStyle();//DimensionStyleのプロパティについては下記説明とほぼ同じ単語なので参照
//https://docs.mcneel.com/rhino/6/help/es-es/documentproperties/dimensions_style.htm
newDimStyle.LengthResolution = 1;
newDimStyle.AngleResolution = 2;
newDimStyle.TextHeight = 80;
newDimStyle.TextGap = 20;
newDimStyle.ExtensionLineExtension = 0;
newDimStyle.ExtensionLineOffset = 10;
newDimStyle.CentermarkSize = 30;
newDimStyle.ArrowType1 = DimensionStyle.ArrowType.Dot;
newDimStyle.ArrowType2 = DimensionStyle.ArrowType.Dot;
newDimStyle.ArrowLength = 40;
newDimStyle.LeaderArrowType = DimensionStyle.ArrowType.Dot;
newDimStyle.LeaderArrowLength = 40;
newDimStyle.TextVerticalAlignment = TextVerticalAlignment.Bottom;
newDimStyle.TextHorizontalAlignment = TextHorizontalAlignment.Center;newDimStyle.Name = dimStyleName;
newDimStyle.Index = doc.DimStyles.Add(newDimStyle, false);return newDimStyle;
}
else
{
//DimensionStyleに名前があった場合はそのStyleを返す。
return dimStyle;
}
}
DrawViewportWiresメソッドを使ってコンポーネント内で寸法の記述を行います。
Rhino6からDisplayPipelineクラスの中に、DrawAnnotationメソッドが実装されていますので、簡単に描画できます。
そして、念のためにClippingBoxの設定も行っておきます。
public override void DrawViewportWires(IGH_PreviewArgs args)
{
foreach(LinearDimension item in lineDimList)
{
//Rhino6からDrawAnnotationで寸法が描画できる。
args.Display.DrawAnnotation(item, Color.Red);
}
}public override BoundingBox ClippingBox
{
get
{
//GHファイル内に、このコンポーネント以外にオブジェクトがない場合はこのBoundingBoxを作っておく必要がある。
return lineDimList[0].GetBoundingBox(Plane.WorldXY);;
}
}
最後にBreforeRunScript内で宣言したリストをClearしておきます。
謎かもしれませんが、そういうものだと思っておいて良いと思います。
public override void BeforeRunScript()
{
//RunScriptの{}の外にリストを宣言、newした場合はこのメソッドの中でClear()しておく。
lineDimList.Clear();
}
コメントをするにはログインしてください。