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

ADN Club => AutoCAD .NET API => Тема начата: Дмитриий от 16-08-2017, 11:29:00

Название: Проверка наличия элементов в TextStyleTable
Отправлено: Дмитриий от 16-08-2017, 11:29:00
Здравствуйте, только начал нормально осваивать С# под 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();
Название: Re: Проверка наличия элементов в TextStyleTable
Отправлено: Дмитрий Загорулькин от 16-08-2017, 11:51:33
Соответственно если в чертеже нет нужного мне слоя то программа падает.
А что она должна делать в таком случае?
Проверить, есть ли нужный слой, можно просто. Достаточно добавить после 5-й строки:
Код - C# [Выбрать]
  1. bool hasLayer = lt1.Has("02_Сетка");
Аналогично и с текстовым стилем.
Название: Re: Проверка наличия элементов в TextStyleTable
Отправлено: Дмитриий от 16-08-2017, 13:14:48
Цитировать
А что она должна делать в таком случае?
Это и должна! ) Спасибо огромное за подсказку, не знал про 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 при выборе точки на чертеже перемещает ее совсем не туда куда мне надо, если система координат стоит пользовательская а не мировая.
И еще раз спасибо за помощь!
Название: Re: Проверка наличия элементов в TextStyleTable
Отправлено: Александр Ривилис от 16-08-2017, 13:20:44
Если еще подскажете тему, или материалы где можно разобраться с системами координат буду еще больше благодарен!
А то метод GetPoint при выборе точки на чертеже перемещает ее совсем не туда куда мне надо, если система координат стоит пользовательская а не мировая.
И еще раз спасибо за помощь!
Один вопрос - одна тема. Не стесняйся на каждый вопрос, не относящийся напрямую к предыдущему, создавать новую тему.
Название: Re: Проверка наличия элементов в TextStyleTable
Отправлено: Дмитрий Загорулькин от 16-08-2017, 13:35:11
И за канал на ютубе тоже кстати спасибо, тоже помог разобраться с некоторыми моментами! )
На здоровье  :)

Пара замечаний к приведенному коду:
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
Название: Re: Проверка наличия элементов в TextStyleTable
Отправлено: Дмитриий от 16-08-2017, 13:54:03
Ого! Спасибо еще раз за информацию! Так действительно лучше! )

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