Помогите, кто может!
Да уж... Начало не настраивает на позитив.
Пробежался по диагонали по исходникам... Александр Наумович предпочитает говорить в несколько сглаженной манере. Код автора данной темы, мягко говоря отвратителен. В суть клинописи не вникал, далее лишь самые поверхностные замечания.
1. Не забывай проверять результат, полученный из Application.DocumentManager.MdiActiveDocument на равенство null (актуально для AutoCAD 2015 и более новых версий, но заблаговременно можно добавить и в код более старых). Мало ли кто и когда дёрнет твой метод...
2. В первой строке кода метода ты создаёшь и инициализируешь переменную doc. Соответственно у тебя автоматом отпадает необходимость в первом параметре метода, поскольку Editor ты можешь спокойно получить от Document. Вообще в сигнатуре метода слишком много лишних, а так же непродуманных параметров:
- от параметра Editor ed можно спокойно избавиться, т.к. он легко получается из doc.
- Вместо BlockReference br лучше\надёжней\безопасней передавать его ObjectId.
- Transaction tr лишний, его можно получить из db.
3. Начинать код тела метода всегда следует с проверки валидности переданных аргументов. У тебя какая-либо проверка напрочь отсутствует.
4. Что это за хитрая конструкция?
lt.UpgradeOpen();
ObjectId idl = lt[LayerName];
lt.DowngradeOpen();
Для того, чтобы получить идентификатор нужного слоя, нет никакой необходимости дёргать UpgradeOpen()\DowngradeOpen().
Кроме того, прежде чем получать идентификатор слоя, неплохо сначала проверить, а есть ли он вообще (см. метод SymbolTable.Has(string)), а то может и дёргать-то не за что...
5. prop.PropertyName.Contains(LayerName)... А если рЕгИстрЫ символов вдруг не совпадут, то Титаник потонет? Вопрос риторический, положительный ответ очевиден.
6. prop.PropertyName.Contains(LayerName) && prop.PropertyName.Contains("X")...
А ежели в имени слоя вдруг так же окажется буква "X", то можно кричать "Браво"? Аналогично и для "Y"...
7. double X = Convert.ToDouble(prop.Value); А если вдруг окажется не Double? Почитай о методе Double.TryParse.
8. if ((attRef.Tag == LayerName) && (attRef.TextString != ""))... Во первых, в случае несовпадения регистров символов, оператор == пошлёт тебе пламенный привет. Во вторых, вместо второй конструкции прочитай об String.IsNullOrEmpty.
9. применительно к DrawLeaderName(ed, br, name, StX, StY, startPt.Z); справедливо всё то, что изложено в п.2.