Оффтопик. Изучаем C#

Автор Тема: Оффтопик. Изучаем C#  (Прочитано 689352 раз)

0 Пользователей и 4 Гостей просматривают эту тему.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 863
  • Карма: 173
    • Мои плагины к Автокаду
Re: Оффтопик. Изучаем C#
« Ответ #270 : 17-02-2024, 13:47:06 »
Изучаю .Net8. Это сильно кастрированая система, в ней часть старых функций приходится докачивать как nuget пакеты. Вопрос в том, как заставить Студию из этих пакетов вытащить только нужные dll и скопировать в папку плагина? И как заставить программу на компьтерах пользователей находить эти dll в папке плагина (просто положить рядом с основной dll не помогает)? Или может есть еще варианты, как лучше передавать пользователям эти nuget?

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1123
  • Карма: 173
Re: Оффтопик. Изучаем C#
« Ответ #271 : 17-02-2024, 15:49:03 »
как заставить Студию из этих пакетов вытащить только нужные dll и скопировать в папку плагина?
Насколько я знаю никак
как заставить программу на компьтерах пользователей находить эти dll в папке плагина (просто положить рядом с основной dll не помогает)?
AssemblyResolve или ее альтернативы, которые на форуме болтались - это если говорить про ACAD-дополнения.
Или может есть еще варианты, как лучше передавать пользователям эти nuget?
NuGet имеет смысл, как мне кажется, только для разработчика. Пользователям инсталлер подавай ;)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 863
  • Карма: 173
    • Мои плагины к Автокаду
Re: Оффтопик. Изучаем C#
« Ответ #272 : 17-02-2024, 17:08:36 »
Спасибо. Я наивно надеялся, что MS придумали эти странные пакеты, чтоб они сами ставились у пользователей по первому обращению. Я даже заметил, что Студия создает странный скрипт (json) с перечислением пакетов в папке рядом с dll. Но чуда не свершилось и скрипт этот не запускается  :(
Значит буду подбирать методом тыка какие dll нужны ( уж больно их там много в каждом пакете)... Вот жеж придумали MS геморрой...
« Последнее редактирование: 16-03-2024, 13:27:46 от avc »

Оффлайн Валерий Ивлев

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Оффтопик. Изучаем C#
« Ответ #273 : 21-10-2024, 09:12:28 »
Доброго времени суток.
Прошу совета опытных специалистов.
Как лучше организовать хранение CSV файлов с исходными данными для дальнейшего использования в C# AutoCAD плагинах:
1 Для автоматической записи в bundle.
2 Для автоматической записи в проект на GitHub.
3 Планируется что CSV могут меняться в процессе работы пользователем.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 863
  • Карма: 173
    • Мои плагины к Автокаду
Re: Оффтопик. Изучаем C#
« Ответ #274 : 21-10-2024, 09:23:12 »
Цитировать
1 Для автоматической записи в bundle.
Раз файл поставляется с плагином внутри bundle, то там и хранить его можно. Там же куда компилируются dll плагина. В bundle обычное есть подпапка  Contents\Resources - вот хорошее место.

Оффлайн Валерий Ивлев

  • ADN OPEN
  • Сообщений: 13
  • Карма: 0
Re: Оффтопик. Изучаем C#
« Ответ #275 : 22-10-2024, 08:47:56 »
Спасибо за ответ.
Для автоматизации копирования dll в bundle и Resources использовал Properties\Post-build event command line:

xcopy /Y "$(TargetPath)" "%AppData%\Autodesk\ApplicationPlugins\XXX.bundle\Contents\"
xcopy /E /I /Y "$(ProjectDir)Resources" "$(TargetDir)Resources"
xcopy /E /I /Y "$(ProjectDir)Resources" "%AppData%\Autodesk\ApplicationPlugins\XXX.bundle\Contents\Resources"
xcopy /Y "$(TargetPath)" "c:\Autodesk\C#\XXX.bundle\Contents\"
xcopy /E /I /Y "$(ProjectDir)Resources" "c:\Autodesk\C#\XXX.bundle\Contents\Resources"

1 строка обновляет dll в рабочей папке bundle
2, 3 строки обновляют папку Resources в каталоге сборки и в рабочей папки bundle
4, 5 строки обновляют проект для локального хранилища

Папка Resources залетает на GitHub автоматически
« Последнее редактирование: 22-10-2024, 11:50:01 от Валерий Ивлев »

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 77
  • Карма: 10
Re: Оффтопик. Изучаем C#
« Ответ #276 : 03-02-2026, 12:17:21 »
У меня тупой вопрос. Я попробовал скомпилировать простейший код из примера для начинающих. Но выдает ошибки.

В AutoCAD 2022 создал библиотеку классов .NetFramework
В проект - свойства - целевая рабочая среда поставил .NETFramework 4.8
В раздел ссылки в свойствах Решения добавил  acmgd.dll и acdbmgd.dll из папки автокада, в свойствах у них "Копировать локально" в False.

Код:

Код - C# [Выбрать]
  1. using Autodesk.AutoCAD.Runtime;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3.  
  4. namespace AutocadPlugin
  5. {
  6.         public class test : IExtensionApplication
  7.         {
  8.                 [CommandMethod("hello")]
  9.                 public void Helloworld()
  10.                 {
  11.                         var editor = Application.DocumentManager.MdiActiveDocument.Editor;
  12.                         editor.WriteMessage("Привет из Autocad плагина");
  13.                 }
  14.  
  15.                 public void Initialize()
  16.                 {
  17.                         var editor = Application.DocumentManager.MdiActiveDocument.Editor;
  18.                         editor.WriteMessage("Инициализация плагина.." + Environment.NewLine);
  19.                 }
  20.  
  21.                 public void Terminate()
  22.                 {
  23.  
  24.                 }
  25.  
  26.         }
  27. }
  28.  

Подсвечиваются красным:
 CommandMethod   - CS0246 не удалось найти тип или имя пространства имен
DocumentManager -   CS0012 Тип Application  определен в сборке, на которую нет ссылки.  И CS0117  Application  не содержит определения DocumentManager
 Environment - CS0103   имя  Environment не существует в текущем контексте.

Что я делаю не так? Нужно добавить какие-то библиотеки в using ? Или  ошибка  в чем-то ином

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 863
  • Карма: 173
    • Мои плагины к Автокаду
Re: Оффтопик. Изучаем C#
« Ответ #277 : 03-02-2026, 13:28:51 »
У вас забыт using System; Поэтому недоступен Environment.
Попробуйте полностью написать Autodesk.AutoCAD.ApplicationServices.Application и Autodesk.AutoCAD.Runtime.CommandMethod

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 77
  • Карма: 10
Re: Оффтопик. Изучаем C#
« Ответ #278 : 03-02-2026, 14:57:53 »
У вас забыт using System; Поэтому недоступен Environment.
Попробуйте полностью написать Autodesk.AutoCAD.ApplicationServices.Application и Autodesk.AutoCAD.Runtime.CommandMethod

Да, и похоже я забыл добавить accoremgd.dll в ссылки. После этого проблема исчезла.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1123
  • Карма: 173
Re: Оффтопик. Изучаем C#
« Ответ #279 : 03-02-2026, 15:13:37 »
Может, проще NuGet-пакет поставить?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 77
  • Карма: 10
Re: Оффтопик. Изучаем C#
« Ответ #280 : 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",


Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 863
  • Карма: 173
    • Мои плагины к Автокаду
Re: Оффтопик. Изучаем C#
« Ответ #281 : 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 не встречал.

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 77
  • Карма: 10
Re: Оффтопик. Изучаем C#
« Ответ #282 : 08-02-2026, 15:16:30 »
У BlockReference динамических блоков есть две ссылки: BlockTableRecord и DynamicBlockTableRecord. первая - это экземпляр динамического блока с конкретным набором параметров и скрытым именем (на *), а вторая - это как раз исходный предок всех экземпляров с видимым пользователю именем. Это имя отображает и BlockReference.Name тоже.
Никаких EffectiveName я что-то в API не встречал.

К примеру у меня есть динамический блок "Клеммник" с кучей динамических атрибутов. Как в одну  строку получить его имя "Клеммник", а не "*U10500" ?
« Последнее редактирование: 08-02-2026, 16:01:53 от Electric »

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 863
  • Карма: 173
    • Мои плагины к Автокаду
Re: Оффтопик. Изучаем C#
« Ответ #283 : 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;
но я бы не рекомендовал писать это в одну строку ;))

Оффлайн Electric

  • ADN OPEN
  • **
  • Сообщений: 77
  • Карма: 10
Re: Оффтопик. Изучаем C#
« Ответ #284 : 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# ?