Проверка наличия элементов в TextStyleTable

Автор Тема: Проверка наличия элементов в TextStyleTable  (Прочитано 5522 раз)

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

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

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
Здравствуйте, только начал нормально осваивать С# под AutoCAD, написал маленькую программку по созданию подписей координат на чертеже. Но что то встрял с проверкой наличия нужного текстового стиля и слоя в чертеже... Получаю их из транзакции, а вот как заранее проверить их наличие в чертеже пока как-то разобраться не могу... Соответственно если в чертеже нет нужного мне слоя то программа падает. Буду благодарен если подскажете в какую сторону смотреть. А то информацию по программированию в автокаде приходится собирать по всей сети, и как-то не могу наткнуться на нужную мне тему. Буду благодарен если кинете просто пару ссылок на уже существующие примеры или темы.

Код - C# [Выбрать]
  1. using (var tr1 = Application.DocumentManager.MdiActiveDocument.Database.TransactionManager.StartTransaction())
  2.             {
  3.                 TextStyleTable Tt1 = (TextStyleTable)tr1.GetObject(mainDoc.Database.TextStyleTableId, OpenMode.ForRead);
  4.                 TextStyleTableRecord TextSt1 = tr1.GetObject(Tt1["LIKE14"], OpenMode.ForRead) as TextStyleTableRecord;
  5.                 LayerTable lt1 = (LayerTable)tr1.GetObject(mainDoc.Database.LayerTableId, OpenMode.ForRead);
  6.                 LayerTableRecord LayerSt1 = tr1.GetObject(lt1["02_Сетка"], OpenMode.ForRead) as LayerTableRecord;
  7.                 tr1.Commit();

Отмечено как Решение Александр Ривилис 16-08-2017, 13:20:56

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Соответственно если в чертеже нет нужного мне слоя то программа падает.
А что она должна делать в таком случае?
Проверить, есть ли нужный слой, можно просто. Достаточно добавить после 5-й строки:
Код - C# [Выбрать]
  1. bool hasLayer = lt1.Has("02_Сетка");
Аналогично и с текстовым стилем.

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

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
Цитировать
А что она должна делать в таком случае?
Это и должна! ) Спасибо огромное за подсказку, не знал про Has! И за канал на ютубе тоже кстати спасибо, тоже помог разобраться с некоторыми моментами! )
Хотел реализовать примерно так, но до этого не получалось:
Код - C# [Выбрать]
  1.             {
  2.                 TextStyleTable Tt1 = (TextStyleTable)tr1.GetObject(mainDoc.Database.TextStyleTableId, OpenMode.ForRead);
  3.                 if (Tt1.Has(textStyleStr) == false)
  4.                 {
  5.                     textStyleStr = "Standard";
  6.                 }
  7.                 TextStyleTableRecord TextSt1 = tr1.GetObject(Tt1[textStyleStr], OpenMode.ForRead) as TextStyleTableRecord;
  8.                 LayerTable lt1 = (LayerTable)tr1.GetObject(mainDoc.Database.LayerTableId, OpenMode.ForRead);
  9.                 if (lt1.Has(layerStr) == false)
  10.                 {
  11.                     layerStr = "0";
  12.                 }
  13.                 LayerTableRecord LayerSt1 = tr1.GetObject(lt1[layerStr], OpenMode.ForRead) as LayerTableRecord;
  14.                 tr1.Commit();



Если еще подскажете тему, или материалы где можно разобраться с системами координат буду еще больше благодарен!
А то метод GetPoint при выборе точки на чертеже перемещает ее совсем не туда куда мне надо, если система координат стоит пользовательская а не мировая.
И еще раз спасибо за помощь!

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если еще подскажете тему, или материалы где можно разобраться с системами координат буду еще больше благодарен!
А то метод GetPoint при выборе точки на чертеже перемещает ее совсем не туда куда мне надо, если система координат стоит пользовательская а не мировая.
И еще раз спасибо за помощь!
Один вопрос - одна тема. Не стесняйся на каждый вопрос, не относящийся напрямую к предыдущему, создавать новую тему.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
И за канал на ютубе тоже кстати спасибо, тоже помог разобраться с некоторыми моментами! )
На здоровье  :)

Пара замечаний к приведенному коду:
1.
Код - C# [Выбрать]
  1. if (Tt1.Has(textStyleStr) == false)
Это очень "по-индийски". Правильнее так:
Код - C# [Выбрать]
  1. if (!Tt1.Has(textStyleStr))
2.
Код - C# [Выбрать]
  1. textStyleStr = "Standard";
  2. layerStr = "0";
В принципе, ничего криминального, но лучше использовать свойства:
Код - C# [Выбрать]
  1. SymbolUtilityServices.LayerZeroName
  2. SymbolUtilityServices.TextStyleStandardName
А еще лучше - использовать специальные методы:
Код - C# [Выбрать]
  1. SymbolUtilityServices.GetTextStyleStandardId(mainDoc.Database)
  2. SymbolUtilityServices.GetLayerZeroId(mainDoc.Database) или mainDoc.Database.LayerZero
Можно еще использовать вместо стандартного текстового стиля и нулевого слоя текущий стиль и текущий слой в чертеже:
Код - C# [Выбрать]
  1. mainDoc.Database.Textstyle
  2. mainDoc.Database.Clayer

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

  • ADN OPEN
  • Сообщений: 9
  • Карма: 0
Ого! Спасибо еще раз за информацию! Так действительно лучше! )

Цитировать
Один вопрос - одна тема. Не стесняйся на каждый вопрос, не относящийся напрямую к предыдущему, создавать новую тему.
Понял! Учту!