Как получить свойство геометрии AutoCAD с помощью .Net Api c#

#c# #.net #autocad #autocad-plugin

Вопрос:

Привет, Как получить свойство объекта чертежа AutoCAD(геометрия) с помощью .NET API. Если я получу свойство После того, как мне нужно будет сохранить значение свойства в своей базе данных.

  1. Я не знаю, как хранить информацию об объектах Autocad в базе данных SQL.
  2. Мне нужна ссылка на примеры видео Autocad для .net API.
  3. Мне нужна ссылка на примеры видео для подключения Autocad к базе данных.

Мой код API:

 public class Class1
    {
        [CommandMethod("ListLayers")]

        #region Test
        public static void ListLayers()
        {
            Document document = Application.DocumentManager.MdiActiveDocument;
            Database database = document.Database;
            using (Transaction transaction = database.TransactionManager.StartTransaction())
            {
                BlockTable blockTable = transaction.GetObject(database.BlockTableId, OpenMode.ForRead) as BlockTable;
                foreach (ObjectId blockTableObjectId in blockTable)
                {
                    BlockTableRecord blockTableRecord = transaction.GetObject(blockTableObjectId, OpenMode.ForRead) as BlockTableRecord;
                    document.Editor.WriteMessage("n Block Name:"   blockTableRecord.BlockEndId);
                    object acadobj = blockTableRecord.AcadObject;
                    Type type = acadobj.GetType();
                    PropertyInfo[] propertyInfos = type.GetProperties();
                    foreach (var propertyInfo in propertyInfos)
                    {

                    }
                }
                LayerTable layerTable = transaction.GetObject(database.LayerTableId, OpenMode.ForRead) as LayerTable;
                foreach (ObjectId layerObjectId in layerTable)
                {
                    LayerTableRecord layerTableRecord = transaction.GetObject(layerObjectId, OpenMode.ForRead) as LayerTableRecord;
                    document.Editor.WriteMessage("n Layer Name: "   layerTableRecord.Name);
                }
                transaction.Commit();
            }
        }
        #endregion

    }
 

Мне нужно получить свойство и сохранить его в свой объект C#. AutoCcad_Object_PropertyImage

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

1. Геометрические свойства объектов различаются в зависимости от типа объекта. Например, окружность определяется ее центром (Point3d), ее радиусом (double) и ее нормалью (Vector3d), линия-ее начальной точкой (Point3d) и ее конечной точкой (Point3d). Вы должны указать, на какие типы объектов вы ориентируетесь, и для каждого типа, на какие свойства.

2. Мне нужны свойства всех моих объектов рисования. Например: В моем чертеже Autocad у меня есть один круг, Один прямоугольник и несколько чертежей плана дома. поэтому нужны все свойства, основанные на типе, например, тип круга, прямоугольник и т. Д.,

Ответ №1:

Вы можете использовать отражение, чтобы получить все свойства сущности. В следующем примере метод PrintDump выводит результат на текстовый экран AutCAD, но вы можете изменить его в соответствии со своими потребностями.

 using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.Reflection;
using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;

namespace DumpEntityProperties
{
   public class Commands
   {
       [CommandMethod("Dump")]
       public void Dump()
       {
           var doc = AcAp.DocumentManager.MdiActiveDocument;
           var db = doc.Database;
           var ed = doc.Editor;
           var result = ed.GetEntity("nSelect entity: ");
           if (result.Status == PromptStatus.OK)
               PrintDump(result.ObjectId, ed);
           AcAp.DisplayTextScreen = true;
       }

       private void PrintDump(ObjectId id, Editor ed)
       {
           var flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly;

           using (var tr = id.Database.TransactionManager.StartTransaction())
           {
               var dbObj = tr.GetObject(id, OpenMode.ForRead);
               var types = new List<Type>();
               types.Add(dbObj.GetType());
               while (true)
               {
                   var type = types[0].BaseType;
                   types.Insert(0, type);
                   if (type == typeof(RXObject))
                       break;
               }
               foreach (Type t in types)
               {
                   ed.WriteMessage($"nn - {t.Name} -");
                   foreach (var prop in t.GetProperties(flags))
                   {
                       ed.WriteMessage("n{0,-40}: ", prop.Name);
                       try
                       {
                           ed.WriteMessage("{0}", prop.GetValue(dbObj, null));
                       }
                       catch (System.Exception e)
                       {
                           ed.WriteMessage(e.Message);
                       }
                   }
               }
               tr.Commit();
           }
       }
   }
}
 

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

1. ОК. Я попробую этот код, после того как обновлю

2. Привет, гилеКАД, все работает нормально. Это код, выбирающий конкретную сущность и получающий свойства. Мне нужно получить все свойства чертежа

3. Например: В AutoCAD у меня есть Один Круг и один треугольник. Поэтому мне нужно получить информацию о свойствах круга и треугольника.

Ответ №2:

Я пишу некоторый код, который получает все сущности в пространстве моделей. Как и в файле чертежа Autocad, он содержит круг, прямоугольник, треугольник или какое-либо изображение. все свойства чертежа будут получены.

 public static class SingleEntitySelection
    {
        [CommandMethod("Dump")]
        public static void Dump()
        {
            var doc = AcAp.DocumentManager.MdiActiveDocument;
            var db = doc.Database;
            var ed = doc.Editor;
            var opts = new PromptSelectionOptions();
            opts.AllowSubSelections = true;
            opts.SelectEverythingInAperture = true;
            var result = ed.SelectAll();
            if (result.Status == PromptStatus.OK)
            {
                for (int i = 0; i < result.Value.Count; i  )
                {
                    PrintDump(result.Value[i].ObjectId, ed);
                    AcAp.DisplayTextScreen = true;
                }
            }
            AcAp.DisplayTextScreen = true;
        }

        public static void PrintDump(ObjectId id, Editor ed)
        {
            var flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly;

            using (var tr = id.Database.TransactionManager.StartTransaction())
            {
                var dbObj = tr.GetObject(id, OpenMode.ForRead);
                var types = new List<Type>();
                types.Add(dbObj.GetType());
                while (true)
                {
                    var type = types[0].BaseType;
                    types.Insert(0, type);
                    if (type == typeof(RXObject))
                        break;
                }
                foreach (Type t in types)
                {
                    ed.WriteMessage($"nn - {t.Name} -");
                    foreach (var prop in t.GetProperties(flags))
                    {
                        ed.WriteMessage("n{0,-40}: ", prop.Name);
                        try
                        {
                            ed.WriteMessage("{0}", prop.GetValue(dbObj, null));
                        }
                        catch (System.Exception e)
                        {
                            ed.WriteMessage(e.Message);
                        }
                    }
                }
                tr.Commit();
            }
        }