フォーム

フォーム

フォームを作成する

ファミリの作成と同様に、コンセプト デザイン環境には新しいフォームを作成する機能が備わっています。次のタイプのフォームを作成できます。押し出し、回転、スイープ、スイープ ブレンド、ロフト、サーフェス フォーム。ファミリの作成で使用される Blend、Extrusion、Revolution、Sweep、SweptBlend クラスを使用するのではなく、マス ファミリはすべてのタイプのフォームに Form クラスを使用します。

押し出しフォームは、平面上の閉じられた曲線ループから作成されます。回転フォームは、3D フォームの作成の際に形状を回転させる軸となるプロファイルと同じ平面にあるプロファイルと線分から作成されます。スイープ フォームは、平面パスに沿ってスイープされる 2D プロファイルから作成されます。スイープ ブレンドは、単一の曲線に沿ってスイープされる複数のプロファイル(それぞれが平面)から作成されます。ロフト フォームは、別々の平面上に配置された複数のプロファイルから作成されます。単一のサーフェス フォームは、押し出しと同様にプロファイルから作成されますが、高さは指定しません。

次の例では、簡単な押し出しフォームを作成します。フォームを作成するために使用する ModelCurves は参照線に変換されないため、作成されるフォームに吸収されることに注意してください。

コード領域 14-3: 押し出しフォームを作成

private Form CreateExtrusionForm(Autodesk.Revit.DB.Document document)
{
    Form extrusionForm = null;

    // Create one profile
    ReferenceArray ref_ar = new ReferenceArray();

    XYZ ptA = new XYZ(10, 10, 0);
    XYZ ptB = new XYZ(90, 10, 0);
    ModelCurve modelcurve = MakeLine(document, ptA, ptB);
    ref_ar.Append(modelcurve.GeometryCurve.Reference);

    ptA = new XYZ(90, 10, 0);
    ptB = new XYZ(10, 90, 0);
    modelcurve = MakeLine(document, ptA, ptB);
    ref_ar.Append(modelcurve.GeometryCurve.Reference);

    ptA = new XYZ(10, 90, 0);
    ptB = new XYZ(10, 10, 0);
    modelcurve = MakeLine(document, ptA, ptB);
    ref_ar.Append(modelcurve.GeometryCurve.Reference);

    // The extrusion form direction
    XYZ direction = new XYZ(0, 0, 50);

    extrusionForm = document.FamilyCreate.NewExtrusionForm(true, ref_ar, direction);

    int profileCount = extrusionForm.ProfileCount;

    return extrusionForm;
}

public ModelCurve MakeLine(Document doc, XYZ ptA, XYZ ptB)
{
    Autodesk.Revit.ApplicationServices.Application app = doc.Application;
    // Create plane by the points
    Line line = Line.CreateBound(ptA, ptB);
    XYZ norm = ptA.CrossProduct(ptB);
    if (norm.IsZeroLength()) norm = XYZ.BasisZ;
    Plane plane = app.Create.NewPlane(norm, ptB);
    SketchPlane skplane = SketchPlane.Create(doc, plane);
    // Create line here
    ModelCurve modelcurve = doc.FamilyCreate.NewModelCurve(line, skplane);
    return modelcurve;
}

図 56: 作成された押し出しフォーム

次の例は、一連の CurveByPoints オブジェクトを使用してロフト フォームを作成する方法を表しています。

コード領域 14-4: ロフト フォームを作成

private Form CreateLoftForm(Autodesk.Revit.Document document)
{
        Form loftForm = null;
        
        ReferencePointArray rpa = new ReferencePointArray();
        ReferenceArrayArray ref_ar_ar = new ReferenceArrayArray();
        ReferenceArray ref_ar = new ReferenceArray();
        ReferencePoint rp = null;
        XYZ xyz = null;
        
        // make first profile curve for loft
        xyz = document.Application.Create.NewXYZ(0, 0, 0);
        rp = document.FamilyCreate.NewReferencePoint(xyz);
        rpa.Append(rp);
        
        xyz = document.Application.Create.NewXYZ(0, 50, 10);
        rp = document.FamilyCreate.NewReferencePoint(xyz);
        rpa.Append(rp);

        xyz = document.Application.Create.NewXYZ(0, 100, 0);
        rp = document.FamilyCreate.NewReferencePoint(xyz);
        rpa.Append(rp);
        
        CurveByPoints cbp = document.FamilyCreate.NewCurveByPoints(rpa);
        ref_ar.Append(cbp.GeometryCurve.Reference);
        ref_ar_ar.Append(ref_ar);
        rpa.Clear();
        ref_ar = new ReferenceArray();
        
        // make second profile curve for loft
        xyz = document.Application.Create.NewXYZ(50, 0, 0);
        rp = document.FamilyCreate.NewReferencePoint(xyz);
        rpa.Append(rp);
        
        xyz = document.Application.Create.NewXYZ(50, 50, 30);
        rp = document.FamilyCreate.NewReferencePoint(xyz);
        rpa.Append(rp);
        
        xyz = document.Application.Create.NewXYZ(50, 100, 0);
        rp = document.FamilyCreate.NewReferencePoint(xyz);
        rpa.Append(rp);
        
        cbp = document.FamilyCreate.NewCurveByPoints(rpa);
        ref_ar.Append(cbp.GeometryCurve.Reference);
        ref_ar_ar.Append(ref_ar);
        rpa.Clear();
        ref_ar = new ReferenceArray();
        
        // make third profile curve for loft
        xyz = document.Application.Create.NewXYZ(75, 0, 0);
        rp = document.FamilyCreate.NewReferencePoint(xyz);
        rpa.Append(rp);
        
        xyz = document.Application.Create.NewXYZ(75, 50, 5);
        rp = document.FamilyCreate.NewReferencePoint(xyz);
        rpa.Append(rp);

        xyz = document.Application.Create.NewXYZ(75, 100, 0);
        rp = document.FamilyCreate.NewReferencePoint(xyz);
        rpa.Append(rp);
        
        cbp = document.FamilyCreate.NewCurveByPoints(rpa);
        ref_ar.Append(cbp.GeometryCurve.Reference);
        ref_ar_ar.Append(ref_ar);
        
        loftForm = document.FamilyCreate.NewLoftForm(true, ref_ar_ar);

        return loftForm;
}

図 57: 作成されたロフト フォーム

フォームの修正

作成後は、フォームのサブ要素(面、エッジ、曲線、頂点など)やプロファイル全体を変更することでフォームを修正できます。フォームを変更するメソッドは次のとおりです。

  • AddEdge
  • AddProfile
  • DeleteProfile
  • DeleteSubElement
  • MoveProfile
  • MoveSubElement
  • RotateProfile
  • RotateSubElement
  • ScaleSubElement

さらに、エッジやプロファイルを追加してフォームを修正し、その後上記のメソッドを使用して修正することもできます。

次の例では、特定のフォームの最初のプロファイル曲線を指定したオフセットだけ移動させます。それに対応する図では、前の例のロフト フォームにこのコードを適用した結果を表しています。

コード領域 14-5: プロファイルを移動

public void MoveForm(Form form)
{
        int profileCount = form.ProfileCount;
        if (form.ProfileCount > 0)
        {
                int profileIndex = 0;   // modify the first form only
                if (form.CanManipulateProfile(profileIndex))
                {
                XYZ offset = new XYZ(-25, 0, 0);
                form.MoveProfile(profileIndex, offset);
                }
        }
}

図 58: 修正後のロフト フォーム

次の例は、特定のフォームの頂点を 1 つ移動する方法を表しています。それに対応する図では、前の例の押し出しにこのコードを適用した効果を表しています。

コード領域 14-6: サブ要素を移動

public void MoveSubElement(Form form)
{
        if (form.ProfileCount > 0)
        {
                int profileIndex = 0;   // get first profile
                ReferenceArray ra = form.get_CurveLoopReferencesOnProfile(profileIndex, 0);
                foreach (Reference r in ra)
                {
                        ReferenceArray ra2 = form.GetControlPoints(r);
                        foreach (Reference r2 in ra2)
                        {
                                Point vertex = document.GetElement(r2).GetGeometryObjectFromReference(r2) as Point;

                                XYZ offset = new XYZ(0, 15, 0);
                                form.MoveSubElement(r2, offset);
                                break;  // just move the first point
                        }
                }
        }
}

図 59: 修正後の押し出しフォーム