понедельник, 22 октября 2012 г.

Revit API - Создание линии детализации

UPD: 2024.04.03 Наверное это первое что я сделал в Revit API.
 
В этом коде полно косяков. Ни в коем случае не используйте его в качестве примера!
 
Теперь я умею чертить линии детализации!

Добавил к коду, выложенному в блоге Рода Ховарта (тынц), определение координат в зависимости от направления вида, проверку на возможность создания линии в текущем виде.

 using System;
using System.Collections.Generic;
using Autodesk.Revit.ApplicationServices;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI;


namespace Draw_Line
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)]
    [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]

    public class Draw_Line : IExternalCommand
    {
        Application app;
        Document doc;

        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {


            UIApplication rvtUIApp = commandData.Application;
            UIDocument uiDoc = rvtUIApp.ActiveUIDocument;
            app = rvtUIApp.Application;
            doc = uiDoc.Document;


            Draw_Annotation_Line(100, 200, 1000, 3000); //Здесь задаются точки х1, у1, х2, у2
            return Result.Succeeded;
        }

        public void Draw_Annotation_Line(double X_1, double Y_1, double X_2, double Y_2)
        {

            bool line_created;
            double X_Rd = doc.ActiveView.RightDirection.X;
            double Y_Rd = doc.ActiveView.RightDirection.Y;
            double Y_Ud = doc.ActiveView.UpDirection.Y;
            double Z_Ud = doc.ActiveView.UpDirection.Z;

            double x1 = Math.Round(Constant.MmToFeet(X_1 * (X_Rd)), 10);
            double y1 = Math.Round(Constant.MmToFeet(X_1 * Y_Rd + Y_1 * Y_Ud), 10);
            double z1 = Math.Round(Constant.MmToFeet(Y_1 * (Z_Ud)), 10);
            double x2 = Math.Round(Constant.MmToFeet(X_2 * (X_Rd)), 10);
            double y2 = Math.Round(Constant.MmToFeet(X_2 * Y_Rd + Y_2 * Y_Ud), 10);
            double z2 = Math.Round(Constant.MmToFeet(Y_2 * (Z_Ud)), 10);
            XYZ point1 = app.Create.NewXYZ(x1, y1, z1);
            XYZ point2 = app.Create.NewXYZ(x2, y2, z2);
            Line line = app.Create.NewLineBound(point1, point2);
            try
            {

                DetailCurve detailCurve = doc.Create.NewDetailCurve(doc.ActiveView, line);
                line_created = true;
            }
            catch
            {
                line_created = false;

            }
            if (line_created == true)
                TaskDialog.Show("Done", "Line Created");
            else TaskDialog.Show("Error", "Line Not Created");

        }

        public class Constant
        {
            /// <summary>
            /// Conversion factor to convert millimetres to feet.
            /// </summary>
            const double _mmToFeet = 0.0032808399;

            public static double MmToFeet(double mmValue)
            {
                return mmValue * _mmToFeet;
            }
        }
    }
}

Комментариев нет:

Отправить комментарий