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

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

Страницы: 1 [2] 3 4 ... 10
11
AutoCAD .NET API / Re: Данные в атрибутах блока в мультивыноске
« Последний ответ от alz 27-03-2024, 22:20:48 »
Очень много лишнего, зачем лезть в описание блока? Берете сразу вставку через свойство мультивыноски
https://help.autodesk.com/view/OARX/2024/ENU/?guid=OARX-ManagedRefGuide-Autodesk_AutoCAD_DatabaseServices_MLeader_BlockContentId
12
AutoCAD .NET API / Данные в атрибутах блока в мультивыноске
« Последний ответ от Atomohod 27-03-2024, 21:35:43 »
Здравствуйте!
Борюсь с такой задачей - есть мультивыноска в которой в качестве контента привязан пользовательский блок с атрибутами. Нужно считать значения атрибутов из этого блока внутри выноски. Написал такой код:
Код - C# [Выбрать]
  1.  [CommandMethod("GetMultileaderAttributeInfo")]
  2.  public void GetMultileaderAttributeInfo()
  3.  {
  4.      Document acDoc = Application.DocumentManager.MdiActiveDocument;
  5.      Database acCurDb = acDoc.Database;
  6.  
  7.      using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  8.      {
  9.          // Prompt the user to select a multileader
  10.          PromptEntityOptions peo = new PromptEntityOptions("\nSelect a multileader: ");
  11.          peo.SetRejectMessage("\nSelected entity is not a multileader.");
  12.          peo.AddAllowedClass(typeof(MLeader), false);
  13.          PromptEntityResult per = acDoc.Editor.GetEntity(peo);
  14.  
  15.          if (per.Status != PromptStatus.OK) return;
  16.  
  17.          ObjectId mlId = per.ObjectId;
  18.          MLeader ml = (MLeader)acTrans.GetObject(mlId, OpenMode.ForRead);
  19.        
  20.          // Check if the multileader has block content
  21.          if (ml.ContentType == ContentType.BlockContent)
  22.          {
  23.              BlockTableRecord btr = acTrans.GetObject(ml.BlockContentId, OpenMode.ForWrite) as BlockTableRecord;
  24.  
  25.              if (btr.HasAttributeDefinitions)
  26.              {
  27.                  ObjectIdCollection breferences = btr.GetBlockReferenceIds(true, false);
  28.                  foreach (ObjectId item in breferences)
  29.                  {
  30.  
  31.                      BlockReference blkRef = (BlockReference)acTrans.GetObject(item, OpenMode.ForRead);
  32.  
  33.                    
  34.  
  35.                        
  36.                          // Iterate through the block's attributes
  37.                          foreach (ObjectId attId in blkRef.AttributeCollection)
  38.                          {
  39.                              AttributeReference attRef = (AttributeReference)acTrans.GetObject(attId, OpenMode.ForRead);
  40.                              Editor ed = acDoc.Editor;
  41.                              ed.WriteMessage($"Attribute Tag: {attRef.Tag}, Value: {attRef.TextString}");
  42.                          }
  43.                      
  44.                  }
  45.  
  46.  
  47.              }
  48.          }
  49.          else
  50.          {
  51.              Console.WriteLine("The selected multileader does not have block content.");
  52.          }
  53.  
  54.          acTrans.Commit();
  55.      }
  56.  }

Но проблема в том что я не знаю как добраться до blockreference который привязан к конкретной выделенной в данный момент выноске. Я перебираю просто все вставки блока, но не понимаю, как определить где нужная.
13
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>
14
Могу поделиться опытом, если кто не читал чаты бета-тестеров.
Жги =)
15
AutoCAD .NET API / Re: Таблица совместимости версий AutoCAD и .NET Framework
« Последний ответ от avc 27-03-2024, 15:18:42 »
Таки все таки .NET 8
Ага. И это реальная жопа... Причем проблем подкинули мелкомягкие, а не Autodesk. Могу поделиться опытом, если кто не читал чаты бета-тестеров.
17
AutoCAD .NET API / Re: Miror и Blockreference
« Последний ответ от Привалов Дмитрий 27-03-2024, 14:16:22 »
есть какие-либо мысли как это решить
Возможно вопрос относится к другой теме, не программирования

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

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



Может у старейшин есть какие-либо мысли как это решить?
19
AutoCAD .NET API / Re: Событие выбора
« Последний ответ от alz 26-03-2024, 08:04:23 »
А в каждом событии из 6/11 одни и те же ObjectId или разные? Может тут как-то распределено по группам объектов на каждую группу свое событие.
20
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 раз вызывается.
Страницы: 1 [2] 3 4 ... 10