#c# #.net #autocad #autocad-plugin
Вопрос:
Привет, Как получить свойство объекта чертежа AutoCAD(геометрия) с помощью .NET API. Если я получу свойство После того, как мне нужно будет сохранить значение свойства в своей базе данных.
- Я не знаю, как хранить информацию об объектах Autocad в базе данных SQL.
- Мне нужна ссылка на примеры видео Autocad для .net API.
- Мне нужна ссылка на примеры видео для подключения 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#.
Комментарии:
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();
}
}