Полное удаление типа линии из чертежа

Автор Тема: Полное удаление типа линии из чертежа  (Прочитано 8355 раз)

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

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Продолжаю бороться с контрагентскими чертежами, пытаюсь заменить тип линий во всем чертеже на используемый нашим КБ. Написал коротенький код:
Код - 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, нежелательный тип линии не удаляется. Как изменить код, чтобы он абсолютно везде заменил тип линии на желаемый?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Давай пример чертежа (dwg-файл) и укажи какой тип линии на какой меняешь. Попытаюсь разобраться.
PURGE не удаляет объекты в двух трёх случаях:
1. На объект есть HardReference.
2. Объект является встроенным (например, тип линии CONTINIOUS, слой 0 и блок *Model_Space)
P.S.: Забыл про третий случай:
3. Если этот объект - текущий. Например, текущий тип линии - в системной переменной CELTYPE
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Давай пример чертежа (dwg-файл) и укажи какой тип линии на какой меняешь.
Тут проблема-чертеж в закрытой сети. мне его не достать. Что такое HardReference? Я не удаляю встроенные типы линий, чертеж контрагентский - выполнялся аж в четырех КАДах- Autocad, Nanocad, Autocad Mechanical и вдобавок там виды с 3д то ли Inventor, то ли SolidWorks. Потом все это собрали вместе и выдали нам. Все пришлые типы линий я как раз и пытаюсь уничтожить.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Тут проблема-чертеж в закрытой сети. мне его не достать.
Увы.
Что такое HardReference?
Это читай в ObjectARX SDK. Посмотреть все HardReference'ы для типа линий можно при помощи MGDDBG:


ARXDBG и MGDDBG - утилиты для анализа AutoCAD, чертежа и т.д.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Посмотреть все HardReference'ы для типа линий можно при помощи MGDDBG:
А как отвязать такие ссылки, чтобы заменить тип линий?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Посмотреть все HardReference'ы для типа линий можно при помощи MGDDBG:
А как отвязать такие ссылки, чтобы заменить тип линий?
Никак если не удалить объекты, которые ссылаются на этот тип линии (если замена типа линии не помогла). Но без конкретного чертежа сказать более точно что-то трудно. Я дал общее направление.
Кстати, есть еще особенные типы линий BYBLOCK и BYLAYER (ПОБЛОКУ и ПОСЛОЮ)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
ОК, попробую что-нибудь придумать.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Совсем забыл. Каждый слой (LayerTableRecord) имеет свойство LinetypeObjectId. Так что следует еще пройтись по всем слоям и заменить и им типы линий.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Запускаю, вроде бы тип линий действительно заменяет, но как я понял не везде-при попытке обработать чертеж purge, нежелательный тип линии не удаляется. Как изменить код, чтобы он абсолютно везде заменил тип линии на желаемый?
1. Проведи Audit файла. У некоторых файлов бывает сильно нарушена структура.
2. Твой код проходит по примитивам в блоках, но меняет только стиль линий у общего свойства для всех Entity. Посмотри свойства у размеров и свойства у ячеек в таблицах там тоже есть стили линий. Т.е. тебе придется дополнительно  обрабатывать каждый тип объекта.
3. Твой код не трогает слои и стили, а зря, там тоже находятся стили линий.
4. Прокси примитивы содержат внутри Entity, скорее всего их нужно разбить, а потом проводить чистку.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Привалов Дмитрий,
Ну тогда добавлю, что на ObjectId типа линии может быть ссылка в XData любого объекта и любая XRecord может содержать ObjectId типа линии в качестве HardPointerId
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение