Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 22-01-2019, 23:10:32

Название: Полное удаление типа линии из чертежа
Отправлено: Atomohod от 22-01-2019, 23:10:32
Здравствуйте!
Продолжаю бороться с контрагентскими чертежами, пытаюсь заменить тип линий во всем чертеже на используемый нашим КБ. Написал коротенький код:
Код - C# [Выбрать]
  1. public static void NormalizeLinetypes()
  2.         {
  3.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  4.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  5.             Database db = acDoc.Database;
  6.             using ( Transaction tr = db.TransactionManager.StartTransaction() )
  7.             {
  8.                
  9.                                
  10.                 ObjectId linetypeToChange = GetLinetype();
  11.                 ObjectId targetLinetype = GetLinetype();
  12.  
  13.                 BlockTable bt = (BlockTable) tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
  14.  
  15.                 foreach ( ObjectId btrId in bt )
  16.                 {
  17.                     BlockTableRecord btr = (BlockTableRecord) tr.GetObject(btrId, OpenMode.ForWrite);
  18.                     foreach ( ObjectId id in btr )
  19.                     {
  20.                         Entity ent = (Entity) tr.GetObject(id, OpenMode.ForWrite);
  21.                      
  22.                         if ( ent != null && ent.LinetypeId == linetypeToChange )
  23.                         {
  24.                             ent.LinetypeId = targetLinetype;
  25.                             ent.LineWeight = LineWeight.ByLayer;
  26.                             ent.LinetypeScale = 1;
  27.                             ent.Color = Color.FromColorIndex(ColorMethod.ByLayer, 256);
  28.                         }
  29.                     }
  30.                 }
  31.  
  32.                 tr.Commit();
  33.             }
  34.         }
  35.  private static ObjectId GetLinetype()
  36.         {
  37.             LinetypeDialog ltd = new LinetypeDialog();
  38.  
  39.             DialogResult dr = ltd.ShowDialog();
  40.  
  41.             if ( dr == DialogResult.OK )
  42.  
  43.             {
  44.                 ObjectId selected = ltd.Linetype;
  45.                 return selected;
  46.             }
  47.             else
  48.             {
  49.                 return default(ObjectId);
  50.             }
  51.         }
Запускаю, вроде бы тип линий действительно заменяет, но как я понял не везде-при попытке обработать чертеж purge, нежелательный тип линии не удаляется. Как изменить код, чтобы он абсолютно везде заменил тип линии на желаемый?
Название: Re: Полное удаление типа линии из чертежа
Отправлено: Александр Ривилис от 22-01-2019, 23:26:12
Давай пример чертежа (dwg-файл) и укажи какой тип линии на какой меняешь. Попытаюсь разобраться.
PURGE не удаляет объекты в двух трёх случаях:
1. На объект есть HardReference.
2. Объект является встроенным (например, тип линии CONTINIOUS, слой 0 и блок *Model_Space)
P.S.: Забыл про третий случай:
3. Если этот объект - текущий. Например, текущий тип линии - в системной переменной CELTYPE (https://knowledge.autodesk.com/ru/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2018/RUS/AutoCAD-Core/files/GUID-28460EAB-7005-4E82-A97C-47A728F420E5-htm.html)
Название: Re: Полное удаление типа линии из чертежа
Отправлено: Atomohod от 22-01-2019, 23:38:41
Давай пример чертежа (dwg-файл) и укажи какой тип линии на какой меняешь.
Тут проблема-чертеж в закрытой сети. мне его не достать. Что такое HardReference? Я не удаляю встроенные типы линий, чертеж контрагентский - выполнялся аж в четырех КАДах- Autocad, Nanocad, Autocad Mechanical и вдобавок там виды с 3д то ли Inventor, то ли SolidWorks. Потом все это собрали вместе и выдали нам. Все пришлые типы линий я как раз и пытаюсь уничтожить.
Название: Re: Полное удаление типа линии из чертежа
Отправлено: Александр Ривилис от 22-01-2019, 23:57:51
Тут проблема-чертеж в закрытой сети. мне его не достать.
Увы.
Что такое HardReference?
Это читай в ObjectARX SDK. Посмотреть все HardReference'ы для типа линий можно при помощи MGDDBG:
(https://farm5.staticflickr.com/4826/46117559074_9ac9e0d448_o.png)

ARXDBG и MGDDBG - утилиты для анализа AutoCAD, чертежа и т.д. (http://adn-cis.org/forum/index.php?topic=7274.0)
Название: Re: Полное удаление типа линии из чертежа
Отправлено: Atomohod от 22-01-2019, 23:59:28
Посмотреть все HardReference'ы для типа линий можно при помощи MGDDBG:
А как отвязать такие ссылки, чтобы заменить тип линий?
Название: Re: Полное удаление типа линии из чертежа
Отправлено: Александр Ривилис от 23-01-2019, 00:03:59
Посмотреть все HardReference'ы для типа линий можно при помощи MGDDBG:
А как отвязать такие ссылки, чтобы заменить тип линий?
Никак если не удалить объекты, которые ссылаются на этот тип линии (если замена типа линии не помогла). Но без конкретного чертежа сказать более точно что-то трудно. Я дал общее направление.
Кстати, есть еще особенные типы линий BYBLOCK и BYLAYER (ПОБЛОКУ и ПОСЛОЮ)
Название: Re: Полное удаление типа линии из чертежа
Отправлено: Atomohod от 23-01-2019, 00:05:04
ОК, попробую что-нибудь придумать.
Название: Re: Полное удаление типа линии из чертежа
Отправлено: Александр Ривилис от 23-01-2019, 00:18:02
Совсем забыл. Каждый слой (LayerTableRecord) имеет свойство LinetypeObjectId. Так что следует еще пройтись по всем слоям и заменить и им типы линий.
Название: Re: Полное удаление типа линии из чертежа
Отправлено: Привалов Дмитрий от 23-01-2019, 00:34:07
Запускаю, вроде бы тип линий действительно заменяет, но как я понял не везде-при попытке обработать чертеж purge, нежелательный тип линии не удаляется. Как изменить код, чтобы он абсолютно везде заменил тип линии на желаемый?
1. Проведи Audit файла. У некоторых файлов бывает сильно нарушена структура.
2. Твой код проходит по примитивам в блоках, но меняет только стиль линий у общего свойства для всех Entity. Посмотри свойства у размеров и свойства у ячеек в таблицах там тоже есть стили линий. Т.е. тебе придется дополнительно  обрабатывать каждый тип объекта.
3. Твой код не трогает слои и стили, а зря, там тоже находятся стили линий.
4. Прокси примитивы содержат внутри Entity, скорее всего их нужно разбить, а потом проводить чистку.
Название: Re: Полное удаление типа линии из чертежа
Отправлено: Александр Ривилис от 23-01-2019, 01:58:20
Привалов Дмитрий,
Ну тогда добавлю, что на ObjectId типа линии может быть ссылка в XData любого объекта и любая XRecord может содержать ObjectId типа линии в качестве HardPointerId