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

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

Страницы: 1 2 [3] 4 5 ... 10
21
AutoCAD .NET API / AutoCAD 2025 - переползаю на Net8
« Последний ответ от avc 27-03-2024, 19:08:04 »
Эта тема - не вопрос. Просто делюсь опытом.
Итак Autodesk внял мольбам и дал возможность программировать на современном C#. Но эта хорошая затея вылилась в большую головную боль. И будет теперь болью надолго.
Главная проблема: Microsoft не довели до ума этот Net8 и потеряли уйму совершенно необходимой функциональности. В эту версию не встроена работа с реестром Windows, c железом (WMI), с данными (SQL) и так далее. Отчасти это решается закачкой отдельных библиотек (NuGet). И вот тут начинается свистопляска. У библиотек этих куча несовместимых версий. В сам AutoCAD как оказалось входят старые версии и надо компилировать именно под них. Несколько версий одной библиотеки в один AutoCAD не загрузишь и если разные плагины на разные версии скомпилированы, то это не просто сбой, это фатал AutoCAD. А завтра Autodesk обновит эти библиотеки и все плагины надо будет перекомпилировать. В общем стараниями Microsoft, мы погрузились в темные древние времена вечно несовместимых ActiveX...
Теперь по порядку.
Старые проекты не скомпилировать под Net8. Надо создавать новый проект. Есть плагин к VS для миграции. Но он не работает. Он не перененосит настройки из AssemblyInfo, теряет все ресурсы форм и компонентов WinForms, не подгружает недостающие библиотеки, забытые Microsoft. Создаем проект с ноля - так быстрее.
Ищем нужные NuGet пакеты. Из того что у меня используется, оказалось что System.Managment уже есть в AutoCAD 2025. Но (!) он там старый, версия 6.0. Нужно именно 6.0 подключать к проекту, иначе будет фатал при попытке принудительной загрузки нового 8.0 или при инициализации классов его использующих (если не пытаться загружать dll принудительно).
Далее из всех этих NuGet надо вытащить нужные dll и доставить их всем пользователям плагинов!! Теперь ваш плагин это сложная составная программа, а не один файл. Увы. Придется делать инсталлятор, если у вас его еще нет. Вытащить dll не просто. У этих NuGet нет свойства "копировать в целевую папку". И вообще с удобным визуальным интерфейсом настроек проекта Microsoft распрощались. Теперь все полезные настройки надо долго гуглить и вставлять в жуткий html-файл проекта. Брррр. Настройка, чтоб dll копировались в папку плагина:
Код - XML [Выбрать]
  1. <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

Теперь нам надо у пользователя загрузить эти dll. Но в папке плагина Автокад их не находит. Либо надо требовать права админа инсталлтору и закидывать в системные папки (я пробовал прям в папку AutoCAD - это работает). Либо в коде прописать принудительную загрузку. В Initialize добавляем:
Код - C# [Выбрать]
  1.         if (CadApp.Version.Major >= 25) // Net8
  2.         {
  3.           Assembly.LoadFrom(Path.Combine(path, "System.CodeDom.dll"));
  4.           Assembly.LoadFrom(Path.Combine(path, "System.Data.SqlClient.dll"));
  5.           Assembly.LoadFrom(Path.Combine(path, "System.Management.dll"));
  6.         }
А вот например sni.dll загружать почему-то нельзя. Сам загрузится из System.Data.SqlClient.dll. Многие пишут что надо менять System.Data.SqlClient на Microsoft.Data.SqlClient. Но нет, там совсем другие классы и методы, старый код не компилируется.

Далее у нас получился проект без версии. Добавляем в него наш старый AssemblyInfo как ссылку и опять лезем в конфиг проекта:
Код - XML [Выбрать]
  1.     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  2.     <GenerateAssemblyVersionAttribute>true</GenerateAssemblyVersionAttribute>
Без второй строчки (о которой никто не пишет!!) версия dll не будет видна в проводнике Windows.

Теперь надо еще сам код редактировать. К запуску процессов добавляем UseShellExecute = true:
Код - C# [Выбрать]
  1. #if NET8_0_OR_GREATER
  2.         Process.Start(new ProcessStartInfo(myexe) { UseShellExecute = true });
  3. #else
  4.         Process.Start(myexe);
  5. #endif

Еще у меня появился конфликт RegistryKey с автокадовским API
Код - C# [Выбрать]
  1. #if NET8_0_OR_GREATER
  2. using RegistryKey = Microsoft.Win32.RegistryKey;
  3. #endif

VS завалила меня бредовыми предупреждениями. Заблокировал тоже в файле проекта:
Код - XML [Выбрать]
  1.     <NoWarn>
  2.                 1701;1702;CA1416;SYSLIB0021;SYSLIB0022;SYSLIB0011;SYSLIB0014
  3.         </NoWarn>

Еще шаманил с ресурсами. Итого начало файла проекта получилось таким:
Код - XML [Выбрать]
  1. <Project Sdk="Microsoft.NET.Sdk">
  2.   <PropertyGroup>
  3.     <TargetFramework>net8.0-windows</TargetFramework>
  4.         <RuntimeIdentifier>win-x64</RuntimeIdentifier>
  5.     <OutputType>Library</OutputType>
  6.     <RootNamespace>AVC</RootNamespace>
  7.     <AssemblyName>AVC_Plugin_Ac25</AssemblyName>
  8.     <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  9.         <GenerateAssemblyVersionAttribute>true</GenerateAssemblyVersionAttribute>
  10.         <UseWindowsForms>true</UseWindowsForms>
  11.     <UseWPF>true</UseWPF>
  12.     <ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
  13.         <AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
  14.         <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
  15.         <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
  16.     <GenerateResourceWarnOnBinaryFormatterUse>false</GenerateResourceWarnOnBinaryFormatterUse>
  17.   </PropertyGroup>
  18.   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  19.     <OutputPath>C:\Users\shurik\AppData\Roaming\Autodesk\ApplicationPlugins\AVC_Pro.bundle\Contents\Windows\</OutputPath>
  20.     <DefineConstants>DEBUG;TRACE;CAD</DefineConstants>
  21.     <LangVersion>preview</LangVersion>
  22.   </PropertyGroup>
  23.   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  24.     <DebugType>none</DebugType>
  25.     <OutputPath>C:\Users\shurik\AppData\Roaming\Autodesk\ApplicationPlugins\AVC_Pro.bundle\Contents\Windows\</OutputPath>
  26.     <DefineConstants>CAD;STOPHACK</DefineConstants>
  27.     <LangVersion>preview</LangVersion>
  28.     <NoWarn>
  29.                 1701;1702;CA1416;SYSLIB0021;SYSLIB0022;SYSLIB0011;SYSLIB0014
  30.         </NoWarn>
22
Могу поделиться опытом, если кто не читал чаты бета-тестеров.
Жги =)
23
AutoCAD .NET API / Re: Таблица совместимости версий AutoCAD и .NET Framework
« Последний ответ от avc 27-03-2024, 15:18:42 »
Таки все таки .NET 8
Ага. И это реальная жопа... Причем проблем подкинули мелкомягкие, а не Autodesk. Могу поделиться опытом, если кто не читал чаты бета-тестеров.
25
AutoCAD .NET API / Re: Miror и Blockreference
« Последний ответ от Привалов Дмитрий 27-03-2024, 14:16:22 »
есть какие-либо мысли как это решить
Возможно вопрос относится к другой теме, не программирования

Скорее всего нужно переделать опреации в динамическом блоке:
1. Размер не должен участвовать в операции отзеркаливания, только треугольник. Добавить смещение размера
2. Либо зеркалить размер без текста. Значение размера вывести атрибутом, который не зеркалиться а смещается.
3. Отзеркаливание заменить на видимость(левую и правую половинку можно скрывать.
26
AutoCAD .NET API / Re: Miror и Blockreference
« Последний ответ от Валерий Ивлев 27-03-2024, 13:41:47 »
Доброго дня.
Нашел проблему с отражением, которую не могу никак решить:
Есть динамический блок внутри которого есть Размер.
Необходимо отразить блок, чтобы при этом направление размерного текста не переворачивалось "с заду на перед".
Могу это сделать используя динамический параметр отражения, но хотелось бы применить средства, описанные в этой ветке, не используя внутреннюю динамику в блоке (пытаюсь максимально "облегчить" блок). С текстом, атрибутами блока проблем нету, а вот с размерами))))

p.s. стандартная комманда Mirror также зеркалит размерный текст.
p.s.s. mirrtext  не влияет



Может у старейшин есть какие-либо мысли как это решить?
27
AutoCAD .NET API / Re: Событие выбора
« Последний ответ от alz 26-03-2024, 08:04:23 »
А в каждом событии из 6/11 одни и те же ObjectId или разные? Может тут как-то распределено по группам объектов на каждую группу свое событие.
28
AutoCAD .NET API / Re: Событие выбора
« Последний ответ от Lemieux 25-03-2024, 20:56:26 »
Не важно как выделять, метод вызывается 6 раз при любом выделении.
1.
https://www.theswamp.org/index.php?topic=31864.0
Протестируй их вариант, внутри команды подписа и отписка от события.
ed.SelectionAdded += onSelectionAdded;
PromptSelectionResult psr = ed.GetSelection(opt);
ed.SelectionAdded -= onSelectionAdded;

2. Попробуй сравнить выделение рамкой и через выделить все Ctrl+A, то же будет 6 событий?
1. Мне нужно без команды, а только знать, что человек выбрал
2. Если нажать CTRL+A то вообще 11 раз вызывается.
29
AutoCAD .NET API / Re: Событие выбора
« Последний ответ от Привалов Дмитрий 25-03-2024, 10:00:50 »
Не важно как выделять, метод вызывается 6 раз при любом выделении.
1.
https://www.theswamp.org/index.php?topic=31864.0
Протестируй их вариант, внутри команды подписа и отписка от события.
ed.SelectionAdded += onSelectionAdded;
PromptSelectionResult psr = ed.GetSelection(opt);
ed.SelectionAdded -= onSelectionAdded;

2. Попробуй сравнить выделение рамкой и через выделить все Ctrl+A, то же будет 6 событий?
30
AutoCAD .NET API / Re: Событие выбора
« Последний ответ от Lemieux 25-03-2024, 08:03:15 »
Может кто-то знает, почему эвент вызывается несколько раз
Код выложен не полный, и это лишь догадка.
Вероятно, у тебя каждый раз при запуске команды добавляется подписка на событие.
Application.DocumentManager.MdiActiveDocument.Editor.SelectionAdded += OnSelectionAdded;
Подписка на событие происходит, когда инициализируется плагин.

и так странно добавляет объекты к выделению
Скорее всего при выделении рамкой при каждом попадании в рамку объекта вызывается данное событие.
Не важно как выделять, метод вызывается 6 раз при любом выделении.
Страницы: 1 2 [3] 4 5 ... 10