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

10/07/2017

Как проверить средствами .NET имеется ли в типе линии текст или нет

Недавно партнер ADN поинтересовался методом, который позволил бы определить содержится ли текст в типе линии или нет перед тем, как получить этот текст.

Чтобы получить текст из типа линии можно воспользоваться методом LinetypeTableRecord.TextAt, но он генерирует исключение eNotApplicable если текста нет в переданном индексе типа линии. Чтобы исключить генерацию исключения можно проверить на  ObjectId.Null значение, которое возвращает LinetypeTableRecord.ShapeStyleAt. Этот метод возвращает ObjectId.Null если нет текста в указанном индексе в LinetypeTableRecord.

Вот короткий пример проверки наличия текста перед извлечением текста из типа линии :  

Код - C#: [Выделить]
  1. [CommandMethod("LineTypeText")]
  2. public void LineTypeText()
  3. {
  4.   Document doc = Application.DocumentManager.MdiActiveDocument;
  5.   Database db = doc.Database;
  6.   Transaction tr = db.TransactionManager.StartTransaction();
  7.  
  8.   Editor ed = doc.Editor;
  9.   using (tr)
  10.   {
  11.     DBObject tmpObj = tr.GetObject(db.LinetypeTableId, OpenMode.ForRead);
  12.     LinetypeTable pLineTable = (LinetypeTable)tmpObj;
  13.     if ((pLineTable != null))
  14.     {
  15.       foreach (ObjectId tblRecId in pLineTable)
  16.       {
  17.         LinetypeTableRecord pLineType = (LinetypeTableRecord)tr.GetObject(tblRecId, OpenMode.ForRead);
  18.         if ((pLineType != null))
  19.         {
  20.           for (int dash = 0; dash < pLineType.NumDashes; dash++)
  21.           {
  22.             /* LinetypeTableRecord.ShapeStyleAt возвращает ObjectId TextStyleTableRecord для формы
  23.             (или текстового стиля для текста если это текст вместо формы) по указанному индексу в LinetypeTableRecord.
  24.             Если нет ни текста, ни формы в этом индексе то возвращается ObjectId.Null.*/
  25.             ObjectId objIdShape = pLineType.ShapeStyleAt(dash);
  26.             if (objIdShape != ObjectId.Null)
  27.             {
  28.               string pText = "";
  29.               pText = pLineType.TextAt(dash);
  30.               if (pText == "")
  31.               {
  32.                 ed.WriteMessage("Нет текста в тире");
  33.               }
  34.               else
  35.               {
  36.                 ed.WriteMessage("Тире: " + dash.ToString());
  37.                 ed.WriteMessage("\nТире текст: " + pText);
  38.               }
  39.             }
  40.           }
  41.         }
  42.       }
  43.     }
  44.   }
  45. }

 

Вот так выглядят результаты работы этого кода:

 

Источник: http://adndevblog.typepad.com/autocad/2017/06/check-needed-to-determine-if-a-text-is-present-in-a-linetype-using-net-.html

 

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=7911

Опубликовано 10.07.2017