Последние сообщения

Последние сообщения

Страницы: [1] 2 3 ... 10
1
AutoCAD .NET API / Re: Как получить имя стиля таблицы в .NET ?
« Последний ответ от avc 12-02-2026, 18:55:51 »
Так же как любой другой именованный объект чертежа. У таблицы берете ID стиля, получаете стиль на чтение и берете его имя.
2
AutoCAD .NET API / Как получить имя стиля таблицы в .NET ?
« Последний ответ от Electric 12-02-2026, 16:56:29 »
Есть таблица автокада со стилем "Адреса кабелей". Как через .NET получить это имя стиля в виде текстовой строки?
3
AutoCAD .NET API / Re: Оффтопик. Изучаем C#
« Последний ответ от avc 11-02-2026, 15:59:17 »
Ок, учту это. Обычно на форумах Оффтопик - место для бардака :)
тут конкретная тема оффтопика: Изучаем C#. Оффтопик в смысле не про AutoCAD
4
AutoCAD .NET API / Re: Оффтопик. Изучаем C#
« Последний ответ от Electric 11-02-2026, 15:55:04 »
А что вы стесняетесь спрашивать в новой теме? Ваш вопрос не по C#, а по API - поднимайте новую тему, не делайте бардак.

Ок, учту это. Обычно на форумах Оффтопик - место для бардака :)
5
AutoCAD .NET API / Re: Оффтопик. Изучаем C#
« Последний ответ от avc 11-02-2026, 15:53:21 »
Как получить текстовое значение и XY координаты всех указателей мультивыноски с помощью C# ?

Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// Куда указывает первая стрелка. Может вернуть Point3dExt.NanPoint
  3.     /// </summary>
  4.     /// <param name="ml"></param>
  5.     public static Point3d
  6.     FirstArrow(this MLeader ml)
  7.     {
  8.       int index = ml.FirstArrowIndex();
  9.       if (index < 0) return Point3dExt.Null;
  10.       return ml.GetFirstVertex(index);
  11.     }
  12.  
  13.     /// <summary>
  14.     /// Куда указывают все стрелки. Может вернуть пустой список
  15.     /// </summary>
  16.     /// <param name="ml"></param>
  17.     public static List<Point3d>
  18.     Arrows(this MLeader ml)
  19.     {
  20.       if (ml is null || ml.IsErased) return new List<Point3d>();
  21.       ArrayList arr = ml.GetLeaderIndexes();
  22.       if (arr.Count == 0) return new List<Point3d>(); //можно нарисовать MLeader вообще без стрелок!
  23.       List<Point3d> ret = new(arr.Count);
  24.       foreach (object i in arr)
  25.       {
  26.         ArrayList arr1 = ml.GetLeaderLineIndexes((int)i);
  27.         if (arr1.Count == 0) continue;
  28.         foreach (object j in arr1)
  29.           ret.Add(ml.GetFirstVertex((int)j));
  30.       }
  31.       return ret;
  32.     }
  33.  
  34.     /// <summary>
  35.     /// Получить текст из текстовой выноски или из единственного атрибута блока
  36.     /// </summary>
  37.     public static string
  38.     GetContents(this MLeader ml, bool fieldCodes, Transaction tr)
  39.     {
  40.       if (ml.ContentType == ContentType.BlockContent)
  41.         return ml.GetBlockAttribute("", fieldCodes, tr);
  42.  
  43.       if (ml.HasContent() && ml.ContentType == ContentType.MTextContent)
  44.         try
  45.         {
  46.           using MText mt = ml.MText; // бывает InvalidOperationException
  47.           if (fieldCodes) return mt?.GetMTextWithFieldCodes() ?? "";
  48.           return mt?.Text ?? "";
  49.         }
  50.         catch { }
  51.       return "";
  52.     }
  53.  
  54.  
А что вы стесняетесь спрашивать в новой теме? Ваш вопрос не по C#, а по API - поднимайте новую тему, не делайте бардак.
6
AutoCAD .NET API / Re: Оффтопик. Изучаем C#
« Последний ответ от Electric 11-02-2026, 15:32:58 »
В COM я получал текстовую строку мультивыноски и список xy координат точек-указателей мультивыноски таким способом:

Код - Python [Выбрать]
  1. txt = obj.TextString        
  2. line_count = 0
  3. while True:
  4.     try:
  5.         leader_points = obj.GetLeaderLineVertices(line_count)  
  6.         cable_txt_x = round(leader_points[0], 1)
  7.         cable_txt_y = round(leader_points[1], 1)
  8.         line_count += 1
  9.     except Exception:
  10.         break
  11.      return True

Как получить текстовое значение и XY координаты всех указателей мультивыноски с помощью C# ?
7
AutoCAD .NET API / Re: Оффтопик. Изучаем C#
« Последний ответ от avc 08-02-2026, 15:24:02 »
К примеру у меня есть динамический блок "Клеммник" с кучей динамических атрибутов. Как в одну  строку получить его имя "Клеммник", а "*U10500" ?
Код - C# [Выбрать]
  1. string instanceName = blockRef.IsDynamicBlock || !blockRef.AnonymousBlockTableRecord.IsNull ? (tr.GetObject(blockRef.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord)?.Name : blockRef.Name;
но я бы не рекомендовал писать это в одну строку ;))
8
AutoCAD .NET API / Re: Оффтопик. Изучаем C#
« Последний ответ от Electric 08-02-2026, 15:16:30 »
У BlockReference динамических блоков есть две ссылки: BlockTableRecord и DynamicBlockTableRecord. первая - это экземпляр динамического блока с конкретным набором параметров и скрытым именем (на *), а вторая - это как раз исходный предок всех экземпляров с видимым пользователю именем. Это имя отображает и BlockReference.Name тоже.
Никаких EffectiveName я что-то в API не встречал.

К примеру у меня есть динамический блок "Клеммник" с кучей динамических атрибутов. Как в одну  строку получить его имя "Клеммник", а не "*U10500" ?
9
AutoCAD .NET API / Re: Оффтопик. Изучаем C#
« Последний ответ от avc 08-02-2026, 15:03:02 »
У BlockReference динамических блоков есть две ссылки: BlockTableRecord и DynamicBlockTableRecord. первая - это экземпляр динамического блока с конкретным набором параметров и скрытым именем (на *), а вторая - это как раз исходный предок всех экземпляров с видимым пользователю именем. Это имя отображает и BlockReference.Name тоже.
Прежде чем обращаться к DynamicBlockTableRecord стоит проверить, что это именно динамический блок:
 if (blockRef.IsDynamicBlock || !blockRef.AnonymousBlockTableRecord.IsNull)...
В AutoCAD искаженные динамические блоки IsDynamicBlock=false, но есть AnonymousBlockTableRecord.
По моему у экземпляров динамических блоков всегда имя на *U, а не на *T. Так что возможно просто таблицы попались вместо блоков.
Никаких EffectiveName я что-то в API не встречал.
10
AutoCAD .NET API / Re: Оффтопик. Изучаем C#
« Последний ответ от Electric 08-02-2026, 14:35:25 »
Другой вопрос.
В python при работе через win32com  я достаточно просто получал имена блока, выделенного мышью:

Код - Python [Выбрать]
  1. realName = block.Name
  2. effectiveName = block.EffectiveName

Как в  одну строку получить EffectiveName блока на C# ?

Я попробовал такой код:

Код - C# [Выбрать]
  1. // БЛОКИ
  2.                             else if (entity is BlockReference block)
  3.                             {
  4.  
  5.                                 // Получаем EffectiveName в одну строку
  6.                                 string effectiveName = ((BlockTableRecord)tr.GetObject(block.DynamicBlockTableRecord, OpenMode.ForRead)).Name;
  7.  
  8.                                 data.BlockData = new BlockData
  9.                                 {
  10.                                     Name = block.Name, // Оригинальное имя
  11.                                     BlockName = effectiveName, // EffectiveName
  12.                                     InsertionPoint = new Point3dData
  13.                                     {
  14.                                         X = Math.Round(block.Position.X, 3),
  15.                                         Y = Math.Round(block.Position.Y, 3),
  16.                                         Z = Math.Round(block.Position.Z, 3)
  17.                                     },
  18.                                     Rotation = Math.Round(block.Rotation, 6),
  19.                                     XScaleFactor = Math.Round(block.ScaleFactors.X, 3),
  20.                                     YScaleFactor = Math.Round(block.ScaleFactors.Y, 3),
  21.                                     Attributes = new List<AttributeData>(),
  22.                                     InternalObjects = new List<InternalObjectData>()
  23.                                 };

но похоже, он все время возвращает  обычное имя:

Цитировать
      "Name": "*T1150",
      "BlockName": "*T1150",

Страницы: [1] 2 3 ... 10