3-四完璧なアイデアのRevitの二次開発

生成するためのパイプラインは、二次肘の基本的な開発の唯一のチュートリアルの例を見つけたとき、私は3ウェイおよび4ウェイの生成例を追加します。

最も簡単な曲がりの生成、本はチュートリアルがあり、低曲げ角度の要件を生成します。

Autodesk.Revit.UI.Selectionを使用しました。
Autodesk.Revit.Attributesを使用しました。
Autodesk.Revit.DBを使用しました。
Autodesk.Revit.UIを使用しました。

[トランザクション(TransactionMode.Manual)]
    クラスNewElbow:IExternalCommand
    {
        公共の結果(ExternalCommandData commandData、REF文字列メッセージ、ELEMENTSET要素)を実行
        {
            のUIApplication uiApp = commandData.Application。
            文書ドキュメント= uiApp.ActiveUIDocument.Document。
            選択SEL = uiApp.ActiveUIDocument.Selection。

            // 2本のチューブを選択し
            、VAR参照編1 = sel.PickObject(ObjectType.Elementは、 "最初のパイプを選択してください")
            MEPCurve AS MEPCurve duct1 = doc.GetElement(参照編1)を、

            VAR参考2 = sel.PickObject(ObjectType.Element、 "第二のパイプを選択");
            MEPCurve duct2 = doc.GetElement MEPCurve AS(参考2)。

            //弯头
            ConnectTwoDuctsWithElbow(DOC、duct1、duct2)。

            Result.Succeededを返します。
        }
        /// <要約>
        ///连接管道
        /// </要約>
        /// <PARAM NAME = "DOC"> </ PARAM>
        /// <PARAM NAME = "duct1"> </ PARAM>
        / // <PARAM NAME = "duct2"> </ PARAM>
        パブリック静的ボイドConnectTwoDuctsWithElbow(文書DOC、MEPCurve duct1、MEPCurve duct2)
        {
            ダブルminDistance = double.MaxValue。
            コネクタコネクタ1、コネクタ2。
            コネクタ1 =コネクタ2 = NULL;

            foreachの(duct1.ConnectorManager.ConnectorsにおけるコネクタCON1)
            {
                foreachの(duct2.ConnectorManager.ConnectorsにおけるコネクタCON2)
                {
                    VARのDIS = con1.Origin.DistanceTo(con2.Origin)。
                    IF(DIS <minDistance)
                    {
                        minDistance = DIS。
                        コネクタ1 = CON1;
                        コネクタ2 = CON2。
                    }

                }
            }

            もし(!コネクタ1 = NULL &&コネクタ2 = NULL)
            {
                使用して(トランザクションTRAN =新しいトランザクション(DOC))
                {
                    tran.Start( "1033067630");

                    VaRの肘= doc.Create.NewElbowFitting(コネクタ1、コネクタ2)。

                    tran.Commit();
                }
            }
        }
    }

角度を注意することが、最も重要な3つのことを、三方を取りました!アングル!アングル!、第一の管の第二のチューブに垂直に1度を超えないようにしてください!非常に厳しいです!

プライマリとセカンダリのための問題があります。以下のように三方ボール弁絶縁以下のプロトコルを用いて要求されます

[トランザクション(TransactionMode.Manual)]
    クラスNewTeeFitting:IExternalCommand
    {
        公共の結果は実行(ExternalCommandData commandData、REF文字列メッセージ、ELEMENTSET要素)
        {

            UIApplication uiApp = commandData.Application。
            文書ドキュメント= uiApp.ActiveUIDocument.Document。
            選択SEL = uiApp.ActiveUIDocument.Selection。

            // 2本のパイプ選び
            VAR参照編1 = sel.PickObject(ObjectType.Elementは、 "最初のパイプを選択してください");
            MEPCurve AS MEPCurve duct1 = doc.GetElement(参照編1)を、

            VAR参考2 = sel.PickObject(ObjectType.Element、 "第二のパイプを選択");
            MEPCurve duct2 = doc.GetElement MEPCurve AS(参考2)。


            曲線curve1 .Curve =(LocationCurveとしてdoc.GetElement(参照編).Location)。

            曲線curve2 .Curve =(LocationCurveとしてdoc.GetElement(参考2).Location)。

            ductList = GetMainDuct(duct1、duct2)でした。

            MEPCurve MainDuct = ductList [0]; //メインパイプ
            MEPCurve LessDuct = ductList [1]; //マイナーパイプ

            MEPCurve duct3 = NULL; //メインパイプ

            IntersectionResultArray intersectPoint =新しいIntersectionResultArray();

            VAR X = curve1.Intersect(intersectPointアウトcurve2)。

            もし(x == SetComparisonResult.Overlap)
            {
                使用して(トランザクションTRAN =新しいトランザクション(DOC))
                {
                    tran.Start( "1033067630");

                    VAR OrginPoint = intersectPoint.get_Item(0).XYZPoint。

                    VAR ELEMENTID = PlumbingUtils.BreakCurve(DOC、MainDuct.Id、OrginPoint)。

                    MEPCurveとしてduct3 = doc.GetElement(ELEMENTID)。

                    tran.Commit();
                }
            }


            ConnectTwoDuctsWithElbow(DOC、MainDuct、duct3、LessDuct)。

            Result.Succeededを返します。
        }

        /// <要約>
        ///区分主要管道与次要管道
        /// </要約>
        /// <PARAM NAME = "duct1"> </ param>の
        /// <PARAM NAME = "duct2"> < / PARAM>
        /// <戻る> </戻り>
        パブリック静的リスト<MEPCurve> GetMainDuct(MEPCurve duct1、MEPCurve duct2)
        {
            リスト<MEPCurve> mEPCurves =新しいリスト<MEPCurve>();

            曲線curve1 .Curve =(LocationCurveとしてduct1.Location)。
            曲線curve2 .Curve =(LocationCurveとしてduct2.Location)。

            一覧<ダブル> disList =新しいリスト<ダブル>();
            ダブルDIS = double.MaxValue。
            XYZ pointA1 = curve1.GetEndPoint(0)。
            XYZ pointA2 = curve1.GetEndPoint(1)。
            XYZ pointB1 = curve2.GetEndPoint(0)。
            XYZ pointB2 = curve2.GetEndPoint(1)。

            VAR distance1 = curve2.Distance(pointA1)。
            VAR distance2 = curve2.Distance(pointA2)。
            VAR distance3 = curve1.Distance(pointB1)。
            VAR distance4 = curve1.Distance(pointB2)。

            disList.Add(distance1)。
            disList.Add(distance2)。
            disList.Add(distance3)。
            disList.Add(distance4)。

            disList.Minヘイズ=();
            ここで、x = disList.IndexOf(DIS)。

            IF(X <2)
            {
                mEPCurves.Add(duct2)。
                mEPCurves.Add(duct1)。
                mEPCurvesを返します。
            }
            他
            {
                mEPCurves.Add(duct1)。
                mEPCurves.Add(duct2)。
                mEPCurvesを返します。
            }


        }

        /// <要約>
        ///创建连接
        /// </要約>
        /// <PARAM NAME = "DOC"> </ PARAM>
        /// <PARAM NAME = "duct1">主要管道1 </ PARAM >
        /// <PARAM NAME = "duct2">主要管道2 </ param>の
        /// <PARAM NAME = "duct3">次要管道</ param>の
        公共の静的な無効ConnectTwoDuctsWithElbow(文書ドキュメント、MEPCurve duct1、MEPCurve duct2 、MEPCurve duct3)
        {
            ダブルminDistance = double.MaxValue。
            コネクタコネクタ1、コネクタ2、connector3。
            コネクタ1 =コネクタ2 = connector3 = NULL;

            foreachの(duct1.ConnectorManager.ConnectorsにおけるコネクタCON1)
            {
                foreachの(duct2.ConnectorManager.ConnectorsにおけるコネクタCON2)
                {
                    VARのDIS = con1.Origin.DistanceTo(con2.Origin)。
                    IF(DIS <minDistance)
                    {
                        minDistance = DIS。
                        コネクタ1 = CON1;
                        コネクタ2 = CON2。
                    }

                }
            }

            minDistance = double.MaxValue; //重置
            foreachの(duct3.ConnectorManager.ConnectorsにおけるコネクタCON3)
            {
                VARのDIS = con3.Origin.DistanceTo(connector1.Origin)。
                IF(DIS <minDistance)
                {
                    minDistance = DIS。
                    connector3 = CON3。
                }
            }


            もし(!!!コネクタ1 = NULL &&コネクタ2 = NULL && connector3 = NULL)
            {
                使用して(トランザクションTRAN =新しいトランザクション(DOC))
                {
                    tran.Start( "XX");

                    VaRの肘= doc.Create.NewTeeFitting(コネクタ1、コネクタ2、connector3)。

                    tran.Commit();
                }
            }
        }
    }

 

4問題が依然として注目すべきである、最終パスである角度、及び接続パラメータ、第一パラメータと第2の共通ライン、第三及び第四パラメータ共線(すなわち、同じライン)

[トランザクション(TransactionMode.Manual)]
    クラスNewCross:IExternalCommand
    {
        公共の結果(ExternalCommandData commandData、REF文字列メッセージ、ELEMENTSET要素)を実行
        {
            MEPCurve duct3、duct4。
            duct3 = duct4 = NULL;
            UIApplication uiApp = commandData.Application。
            文書ドキュメント= uiApp.ActiveUIDocument.Document。
            選択SEL = uiApp.ActiveUIDocument.Selection。

            // 2つのダクト選択
            参照編1 = sel.PickObject(ObjectType.Elementは、 "第1のダクトを選択してください")VAR;
            MEPCurve AS MEPCurve duct1 = doc.GetElement(参照編1)を、

            VAR参考2 = sel.PickObject(ObjectType.Element、 "第2ダクトを選択");
            MEPCurve duct2 = doc.GetElement MEPCurve AS(参考2)。

            曲線curve1 .Curve =(LocationCurveとしてdoc.GetElement(参照編).Location)。

            曲線curve2 .Curve =(LocationCurveとしてdoc.GetElement(参考2).Location)。

            IntersectionResultArray intersectPoint =新しいIntersectionResultArray();

            VAR X = curve1.Intersect(intersectPointアウトcurve2)。

            もし(x == SetComparisonResult.Overlap)
            {
                使用して(トランザクションTRAN =新しいトランザクション(DOC))
                {
                    tran.Start( "X")。

                    VAR OrginPoint = intersectPoint.get_Item(0).XYZPoint。

                    VAR elementId3 = PlumbingUtils.BreakCurve(DOC、duct1.Id、OrginPoint)。

                    duct3 = doc.GetElement MEPCurveとして(elementId3); // 1つのラインのduct1とduct3 

                    VAR elementId4 = PlumbingUtils.BreakCurve(DOC、duct2.Id、OrginPoint)。

                    duct4 = doc.GetElement MEPCurveとして(elementId4); // 1つのラインのduct2とduct4

                    tran.Commit();
                }
            }

            ConnectTwoDuctsWithElbow(DOC、duct1、duct3、duct2、duct4); //四通

            Result.Succeededを返します。
        }
        /// <要約>
        ///创建连接、四通前2个共线、后2个共线
        /// </要約>
        /// <PARAM NAME = "DOC"> </ PARAM>
        // /ます。<param name = "duct1"> </ param>の
        /// <PARAM NAME = "duct2"> </ param>の
        /// <PARAM NAME = "duct3"> </ param>の
        公共の静的な無効ConnectTwoDuctsWithElbow(文書ドキュメント、MEPCurve duct1、MEPCurve duct2、MEPCurve duct3、MEPCurve duct4)
        {
            ダブルminDistance = double.MaxValue。
            コネクタコネクタ1、コネクタ2、connector3、connector4。
            コネクタ1 =コネクタ2 = connector3 = connector4 = NULL;

            foreachの(duct1.ConnectorManager.ConnectorsにおけるコネクタCON1)
            {
                foreachの(duct2.ConnectorManager.ConnectorsにおけるコネクタCON2)
                {
                    VARのDIS = con1.Origin.DistanceTo(con2.Origin)。
                    IF(DIS <minDistance)
                    {
                        minDistance = DIS。
                        コネクタ1 = CON1;
                        コネクタ2 = CON2。
                    }

                }
            }

            minDistance = double.MaxValue; //重置
            foreachの(duct3.ConnectorManager.ConnectorsにおけるコネクタCON3)
            {
                VARのDIS = con3.Origin.DistanceTo(connector1.Origin)。
                IF(DIS <minDistance)
                {
                    minDistance = DIS。
                    connector3 = CON3。
                }
            }

            minDistance = double.MaxValue; //重置
            foreachの(duct4.ConnectorManager.ConnectorsにおけるコネクタCON4)
            {
                VARのDIS = con4.Origin.DistanceTo(connector1.Origin)。
                IF(DIS <minDistance)
                {
                    minDistance = DIS。
                    connector4 = CON4。
                }
            }


            もし(!!!!コネクタ1 = NULL &&コネクタ2 = NULL && connector3 = NULL && connector4 = NULL)
            {
                使用して(トランザクションTRAN =新しいトランザクション(DOC))
                {
                    tran.Start( "XX");

                    VaRの肘= doc.Create.NewCrossFitting(コネクタ1、コネクタ2、connector3、connector4)。

                    tran.Commit();
                }
            }
        }
    }
関連ボーエン:三方構造思考

BQ44F-BQ45F ウェイ絶縁バルブ
Q944F-Q945F 電動ボールバルブ
Q644F-Q645F 空気圧ボールバルブ
Q44F-Q45F ステンレス鋼ボール弁
Q14F-Q15F ティーねじボールと
Q44H-Q44Y Q45H Q45Y-はハードボール弁をシール
Q44F- Q45F -wayシールバルブ4



おすすめ

転載: www.cnblogs.com/sktvalves/p/10974881.html