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

ADN Club => AutoCAD .NET API => Тема начата: Максим Маркевич от 16-07-2016, 15:06:36

Название: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 16-07-2016, 15:06:36
Всем привет. Я начинающий разработчик(c#). Всю инфу беру из книги выше, а также использую Managed .NET Developer's Guide (http://help.autodesk.com/view/ACD/2017/ENU/?guid=GUID-C3F3C736-40CF-44A0-9210-55F6A939B6F2 (http://help.autodesk.com/view/ACD/2017/ENU/?guid=GUID-C3F3C736-40CF-44A0-9210-55F6A939B6F2)).
Так вот, работаю в VS2015, а тестирую все на Autocad2017x64 (возможно, все дело именно в этом, в книге то AutoCAD 2013-2015). Некоторые программные коды из книги у меня не работают, и я не могу понять, почему. Соответственно, создаю тему, где можно было бы разобраться, при Вашей помощи, уважаемые, с возникающими проблемами.

Хотелось бы начать с программного кода для работы с таблицами: стр. 239-266 в книге.
При выполнении сборки появлялась следующая ошибка:
(https://s31.postimg.org/n9ac7r5rb/Screen_Shot_002.png) (https://postimg.org/image/n9ac7r5rb/)
При отладке первое, что выбивается:
(https://s31.postimg.org/48f52xpef/Screen_Shot_001.png) (https://postimg.org/image/48f52xpef/)
Ни в первом, ни во втором случае не понимаю, что нужно исправить.
Более подробного и настолько круто закомментированного кода по работе с таблицами в акаде я не нашел, поэтому хочу заставить его работать, чтобы потом вынести для себя все необходимое.

Скачать данный код можно из шапки темы: Н.Н.Полещук. "Программирование для AutoCAD 2013-2015". ДМК Пресс, 2015.
Соответственно, путь к нему будет таким: *\Глава 4 (.NET)\AutoCAD 2015\05 TableStyleSample\
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 16-07-2016, 16:27:54
Я не понял. У тебя не компилируется код в VS 2015? Какой путь указан в Reference Paths? Лучше всего указать путь к ObjectARX SDK (подкаталог \inc), но можно и к каталогу с acad.exe (обычно это: C:\Program Files\Autodesk\AutoCAD 2017). После этого код нормально компилируется без ошибок.
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 16-07-2016, 16:33:28
Я не понял. У тебя не компилируется код в VS 2015? Какой путь указан в Reference Paths? Лучше всего указать путь к ObjectARX SDK (подкаталог \inc), но можно и к каталогу с acad.exe (обычно это: C:\Program Files\Autodesk\AutoCAD 2017). После этого код нормально компилируется без ошибок.
Да, если под компиляцией подразумевать Сборку, то нет, не компилируется (1-й скрин из шапки темы).
Насчет путей и ссылок(все на папку ObjectARX SDK):
(https://s32.postimg.org/w3930u7vl/Screen_Shot.png) (https://postimg.org/image/w3930u7vl/)
(https://s31.postimg.org/b9xwxhryf/Screen_Shot_001.png) (https://postimg.org/image/b9xwxhryf/)
Все добавлено.
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 16-07-2016, 16:34:06
Кстати и с нумерацией строк у тебя что-то не то. Указанная строка на первом рисунке в исходном тексте имеет номер 1190.
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 16-07-2016, 16:37:31
Кстати и с нумерацией строк у тебя что-то не то. Указанная строка на первом рисунке в исходном тексте имеет номер 1190.
Дописывал комментарии, ничего серьезного, вот, пожалуйста, исходный код:
(https://s32.postimg.org/y8jn6yxnl/Screen_Shot_002.png) (https://postimg.org/image/y8jn6yxnl/)
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 16-07-2016, 16:43:01
Всё очень странно. А какая разрядность AutoCAD 2017 у тебя?
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 16-07-2016, 16:45:52
Код не только компилируется, но и исправно работает в AutoCAD 2017 x64:

Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 16-07-2016, 16:48:49
Покажи весь текст из окна Output при построении проекта (в виде текста, а не картинки).
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 16-07-2016, 16:59:53
Обратил внимание, что не задана препроцессорная переменная NEWER_THAN_AUTOCAD_2013 (есть NEWER_THAN_AUTOCAD_2012 и есть NEWER_THAN_AUTOCAD_2014). Поэтому часть кода не выполняется - добавил её сюда:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F109793%2F7842324.6%2F0_12d967_17504078_orig.png&hash=0a104b28b473049a4a7df52cec5381db)

Это уже замечание к Андрею Бушману. :)
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 16-07-2016, 17:13:28
Покажи весь текст из окна Output при построении проекта (в виде текста, а не картинки).
1>------ Build started: Project: TableStyleSample, Configuration: Debug Any CPU ------
1>E:\CADCAE\C#.NET\Пробы кода\TableStyleSample\TableStyleSample.cs(1191,11,1191,41): error CS1503: Argument 2: cannot convert from 'long' to 'int'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Обратил внимание, что не задана препроцессорная переменная NEWER_THAN_AUTOCAD_2013 (есть NEWER_THAN_AUTOCAD_2012 и есть NEWER_THAN_AUTOCAD_2014). Поэтому часть кода не выполняется - добавил её сюда:

Добавил, ничего не изменилось.
Сейчас запишу скринкаст, если нужно (с момента скачки кода, до момента его сборки)?
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 16-07-2016, 17:41:54
Сейчас запишу скринкаст, если нужно (с момента скачки кода, до момента его сборки)?
Запиши. Может увижу в чем проблема. Но она явно с твоей стороны.
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 16-07-2016, 17:54:36
Кажется я понял в чем у тебя проблема. Добавь еще в Reference Paths путь к ObjectARX SDK подкаталог \inc-x64 (если у тебя AutoCAD x64) или \inc-win32 (если AutoCAD x86):



Судя по всему у тебя берётся путь к не тем сборкам Autodesk.AutoCAD.Interop.dll и Autodesk.AutoCAD.Interop.Common.dll.

Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 16-07-2016, 18:09:57
Кажется я понял в чем у тебя проблема. Добавь еще в Reference Paths путь к ObjectARX SDK подкаталог \inc-x64 (если у тебя AutoCAD x64) или \inc-win32 (если AutoCAD x86):
Судя по всему у тебя берётся путь к не тем сборкам Autodesk.AutoCAD.Interop.dll и Autodesk.AutoCAD.Interop.Common.dll.

Огромнейшее спасибо!!!!! Дай Бог Вам здоровья! :)
Все, теперь поеду на дачу!  :D
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 21-07-2016, 19:00:25
Не хочу флуд разводить, поэтому спрошу здесь, тема касается таблиц в акаде.
Модифицировал код из Полещука.
В Autocad2016x64 все работает, а вот в Autocad2014x64 выдает следующую ошибку:
(https://s31.postimg.org/nsr1vl5ev/Screen_Shot.png) (https://postimg.org/image/nsr1vl5ev/)
Весь код прикреплять стыдно (мои первые пробы, боюсь, не вынесут слабонервные), прикреплю кусок, где происходит сбой:
Код - C# [Выбрать]
  1. [Rt.CommandMethod(group, "CreateTble",Rt.CommandFlags.Modal)]
  2.     public void CreateTble() {
  3.            
  4.             Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
  5.             Ed.Editor edd = doc.Editor;
  6.             if (doc == null)
  7.         return;
  8.       Db.Database db = doc.Database;
  9.             using (doc.LockDocument())
  10.             {
  11.                 using (Db.Transaction tr = db.TransactionManager.StartTransaction())
  12.                 {
  13.                     Db.DBDictionary dict = tr.GetObject(db.TableStyleDictionaryId,Db.OpenMode.ForRead) as Db.DBDictionary;
  14.                     if (!dict.Contains(tableStyle2Name))
  15.                         TableStyleWithTemplate_Command();
  16.                     Db.TableStyle ts = tr.GetObject(dict.GetAt(tableStyle2Name),
  17.                       Db.OpenMode.ForRead) as Db.TableStyle;
  18.                     Db.TableTemplate template =tr.GetObject(ts.Template,Db.OpenMode.ForRead) as
  19.                       Db.TableTemplate;
  20.                     // Включим отображение толщин линий, дабы увидеть результат нашей работы
  21.                     cad.SetSystemVariable("LWDISPLAY", 1);
  22.                     // Создаём новую таблицу, на основе созданного нами шаблона.
  23.                     Db.Table tableInstance = new Db.Table();
  24.                     tableInstance.CopyFrom(template,Db.TableCopyOptions.FillTarget);
  25.                     tableInstance.GenerateLayout();
  26.                     // Точка вставки таблицы
  27.                     Ed.PromptPointResult pr = edd.GetPoint("\nУкажите точку вставки таблицы: ");
  28.                     if (pr.Status == PromptStatus.OK)
  29.                     {
  30.                         tableInstance.Position = pr.Value;
  31.                     }
  32.                     //tableInstance.Position = new Gm.Point3d(50, 0, 0);
  33.                     Db.BlockTable bt = tr.GetObject(db.BlockTableId, Db.OpenMode.ForRead) as Db.BlockTable;
  34.                     Db.BlockTableRecord modelSpace = tr.GetObject(bt[Db.BlockTableRecord.ModelSpace],
  35.                     Db.OpenMode.ForWrite) as Db.BlockTableRecord;
  36.                     modelSpace.AppendEntity(tableInstance);
  37.                     tr.AddNewlyCreatedDBObject(tableInstance, true);
  38.                     tr.Commit();
  39.                 }
  40.             }
  41.       Object acadObject = cad.AcadApplication;
  42.       acadObject.GetType().InvokeMember("ZoomExtents", BindingFlags.InvokeMethod, null, acadObject, null);
  43.     }

Может кто-то сталкивался и знает, в чем дело? Заранее, спасибо за ответ.

Подредактировал отображение кода.
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 21-07-2016, 19:05:48
Весь код прикреплять стыдно
Стыдно должно быть не читать правила форума и мою подпись по поводу правильного форматирования кода на форуме!
Ошибка достаточно четко идентифицирована (eNullObjectId) и в этом контексте это означает, что ts.Template возвращает ObjectId.kNull - видимо таблица без шаблона.
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 21-07-2016, 19:31:26
У меня миссклик произошёл. Сразу же полез править в соответствии со скринкастом у Вас. Но Вы не оставили никаких шансов. Видимо, мы одновременно даже правили. Я бы исправился. Извиняюсь.
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 21-07-2016, 19:32:38
Но Вы не оставили никаких шансов
:) С ошибкой всё понятно?
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 22-07-2016, 01:14:58
С ошибкой всё понятно?
Суть ошибки то я понимаю.
Но вот как с ней бороться, это задача..
Ошибка достаточно четко идентифицирована (eNullObjectId) и в этом контексте это означает, что ts.Template возвращает ObjectId.kNull - видимо таблица без шаблона.
Именно, а все потому, что для 2014х64 автокада не работает присвоение:
Код - C# [Выбрать]
  1. tableStyle2.Template = template.ObjectId;
То есть оно, почему-то, только для чтения:
(https://s32.postimg.org/7zmjyiub5/Screen_Shot.png) (https://postimg.org/image/7zmjyiub5/)
А, соответсвенно, и вот это:
Код - C# [Выбрать]
  1. Db.TableTemplate template =tr.GetObject(ts.Template,Db.OpenMode.ForRead) as Db.TableTemplate;
Думаю, что нужно какой-то другой способ использовать, но понятия не имею, какой.
Напоминаю, в автокадах 2016 и 2017 все хорошо работает.
Я могу предоставить только такой "топорный" анализ, так как пока еще многое не понимаю.



Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 22-07-2016, 09:36:42
Для AutoCAD 2014 убери в настройках проекта NEWER_THAN_AUTOCAD_2014
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 22-07-2016, 20:47:50
Для AutoCAD 2014 убери в настройках проекта NEWER_THAN_AUTOCAD_2014
Я понимаю, что таким образом выполнение кода будет происходить по 2-й ветке (при помощи COM):
Код - C# [Выбрать]
  1. #if NEWER_THAN_AUTOCAD_2014
  2.                     tableStyle2.Template = template.ObjectId;
  3. #elif NEWER_THAN_AUTOCAD_2009
  4.           Com.IAcadTableStyle customTableStyle2 = (Com.IAcadTableStyle)tableStyle2.AcadObject;
  5. #endif
Но вот здесь, все равно, будет ошибка (ObjectId.kNull):
Код - C# [Выбрать]
  1. Db.TableTemplate template =tr.GetObject(ts.Template,Db.OpenMode.ForRead) as
  2.                       Db.TableTemplate;
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 22-07-2016, 22:07:23
Я понимаю, что таким образом выполнение кода будет происходить по 2-й ветке (при помощи COM):
Там ветка более сложная:
Код - C# [Выбрать]
  1. #if NEWER_THAN_AUTOCAD_2014
  2.           tableStyle2.Template =
  3.             template.ObjectId;
  4. #elif NEWER_THAN_AUTOCAD_2009
  5.           Com.IAcadTableStyle customTableStyle2 = (Com.IAcadTableStyle)tableStyle2 .AcadObject;
  6.  
  7. #if PLATFORM_X86
  8.           customTableStyle2.TemplateId = template.ObjectId.OldIdPtr.ToInt32();
  9. #else
  10.           customTableStyle2.TemplateId = template.ObjectId.OldIdPtr.ToInt64();
  11. #endif // #if PLATFORM_X86
  12.  
  13. #else
  14.           Com.IAcadTableStyle2 customTableStyle2 = (Com.IAcadTableStyle2)tableStyle2.AcadObject;
  15. #if PLATFORM_X86
  16.           customTableStyle2.TemplateId = template.ObjectId.OldIdPtr.ToInt32();
  17. #else
  18.           customTableStyle2.TemplateId = template.ObjectId.OldIdPtr.ToInt64();
  19. #endif // #if PLATFORM_X86
  20.  
  21. #endif // #if NEWER_THAN_AUTOCAD_2009

Но вот здесь, все равно, будет ошибка (ObjectId.kNull):
Ты это уже проверил?
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 23-07-2016, 23:11:29
Кстати, я бы заменил бы этот код на такой:
Код - C# [Выбрать]
  1. #if NEWER_THAN_AUTOCAD_2014
  2.           tableStyle2.Template =  template.ObjectId;
  3. #elif NEWER_THAN_AUTOCAD_2009
  4.           Com.IAcadTableStyle customTableStyle2 =
  5.               (Com.IAcadTableStyle)tableStyle2.AcadObject;
  6.           customTableStyle2.TemplateId =
  7.               ((Com.IAcadObject)template.AcadObject).ObjectID;
  8. #else
  9.           Com.IAcadTableStyle2 customTableStyle2 =
  10.               (Com.IAcadTableStyle2)tableStyle2.AcadObject;
  11.           customTableStyle2.TemplateId =
  12.               ((Com.IAcadObject)template.AcadObject).ObjectID;
  13. #endif // #if NEWER_THAN_AUTOCAD_2009
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 24-07-2016, 09:13:52
Там ветка более сложная:
Просто x86 я не рассматриваю, поэтому адаптировал код под себя.
Но вот здесь, все равно, будет ошибка (ObjectId.kNull):
Ты это уже проверил?
Да, именно по этой причине я и написал.
Причем, если взять программный код в чистоте, из книжки, то он сработает. Таблицы создадутся.
Поэтому сейчас сел за более детальный разбор программного кода, просто я многое взял из Полещука, не осознав до конца, вот и наказан за такое.
Кстати, я бы заменил бы этот код на такой:
Выглядит лаконичней, сейчас поразбираюсь. Спасибо.

Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Андрей Бушман от 24-07-2016, 11:17:36
Кажется я понял в чем у тебя проблема. Добавь еще в Reference Paths путь к ObjectARX SDK подкаталог \inc-x64 (если у тебя AutoCAD x64) или \inc-win32 (если AutoCAD x86):
Чтобы раз и навсегда избавиться от подобных проблем, можно использовать соответствующие NuGet пакеты. В виду того, что пакеты автодеска не доведены до ума (http://bushman-andrey.blogspot.ru/2016/07/nuget-autocad-net-api.html), то можно использовать мои (https://www.nuget.org/profiles/Bush).
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Андрей Бушман от 24-07-2016, 11:21:16
evthisrel, ты уверен, что определил правильный набор отладочных символов в настройках проекта? Например, если у тебя AutoCAD x64, то не следует определять символ PLATFORM_X86.
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 24-07-2016, 13:07:05
Просто x86 я не рассматриваю, поэтому адаптировал код под себя.
Неправильно адаптировал - выкинул существенный код с присвоением customTableStyle2.TemplateId значения. Поэтому он у тебя потом и ObjectId.kNull.
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 25-07-2016, 02:58:11
Чтобы раз и навсегда избавиться от подобных проблем, можно использовать соответствующие NuGet пакеты. В виду того, что пакеты автодеска не доведены до ума, то можно использовать мои.
Очень удобно. Спасибо большое!!!
evthisrel, ты уверен, что определил правильный набор отладочных символов в настройках проекта? Например, если у тебя AutoCAD x64, то не следует определять символ PLATFORM_X86.
Да, с этим был порядок. Дело было в том, что уже подметил Александр Ривилис:
Неправильно адаптировал - выкинул существенный код с присвоением customTableStyle2.TemplateId значения. Поэтому он у тебя потом и ObjectId.kNull.
Я лоханулся немного с адаптацией. :(
Сейчас у меня еще одна проблемка. Суть такова..
Я пытаюсь написать плагин, точнее он, вроде как, готов, находится в стадии тестирования, где пользователь выделяет определенные блоки, на уровне программного кода из них считываются свойства и атрибуты, и формируется спецификация. Соответственно, всю теория по созданию спецификации черпал из программного кода Андрея Бушмана, который размещен в книге Полещука. Так вот, там все подробно расписано и для того, чтобы создать табличный стиль на основе шаблона, я создаю табличный стиль "Базовый", причем у себя я это не делаю в разных методах, а загоняю все в один.
То есть, я создаю базовый табличный стиль, потом стиль на основе шаблона и выполняю вставку таблицы (все в одном методе Specification), так вот хочу в конце добавить удаление табличного стиля "Базовый", так как он мне больше не нужен, и не хочется оставлять в документе что-то лишнее.
Код - C# [Выбрать]
  1. //Команды, определённые в данном коде:
  2. //Specification - создание спецификации путем извлечения информации из блоков.
  3. using Autodesk.AutoCAD.Colors;
  4. using AppServCore = Autodesk.AutoCAD.ApplicationServices.Core;
  5. using AppServ = Autodesk.AutoCAD.ApplicationServices;
  6. using Autodesk.AutoCAD.Runtime;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.Geometry;
  9. using Autodesk.AutoCAD.EditorInput;
  10. using Autodesk.AutoCAD.Interop;
  11. using Autodesk.AutoCAD.Interop.Common;
  12. [assembly: CommandClass(typeof(Evth.CAD.Samples.Styles.CreateTable))]
  13. namespace Evth.CAD.Samples.Styles
  14. {
  15.     public class CreateTable
  16.     {
  17.     // Наименование группы команд
  18.     private const string Group = "Samples";
  19.     private const string TextStyleName = "Текст таблиц";
  20.     private const string TableStyleName1 = "Базовый";
  21.     private const string TableStyleName2 = "Спецификация";
  22.         [CommandMethod(Group, "Specification", CommandFlags.Modal)]
  23.         public void Specification()
  24.         {
  25.         var list1 = new List<string>();
  26.         var list2 = new List<string>();
  27.         var list3 = new List<string>();
  28.             var doc = AppServCore.Application.DocumentManager.MdiActiveDocument;
  29.             if (doc == null)
  30.                 return;
  31.             var db = doc.Database;
  32.             var ed = doc.Editor;
  33.             using (doc.LockDocument())
  34.             {
  35.                 var activeDocument = default(AcadDocument);
  36.                 activeDocument = (AcadDocument)
  37.                 AppServ.DocumentExtension.GetAcadDocument(AppServCore.Application.DocumentManager.MdiActiveDocument);
  38.                 using (var tr = db.TransactionManager.StartTransaction())
  39.                 {
  40.  
  41.                     ***************************
  42.                    //Пропускаю момент формирования списков list1..3 (это происходит путем выделения блоков и считывания нужной инфы
  43.                    ***************************
  44.  
  45.                     var tst = tr.GetObject(db.TextStyleTableId, OpenMode.ForWrite) as TextStyleTable;
  46.                     var textStyleId = ObjectId.Null;
  47.                     if (tst.Has(TextStyleName))
  48.                     {
  49.                         textStyleId = tst[TextStyleName];
  50.                     }
  51.                     else
  52.                     {
  53.                         var textStyle = new TextStyleTableRecord();
  54.                         textStyle.Name = TextStyleName;
  55.                         // ttf или, к примеру, shx файл.
  56.                         textStyle.FileName = "Isocpeur.shx";
  57.                         textStyle.XScale = 0.95;
  58.                         tst.Add(textStyle);
  59.                         tr.AddNewlyCreatedDBObject(textStyle, true);
  60.                         textStyleId = textStyle.ObjectId;
  61.                     }
  62.                     var tableStylesDictionary = tr.GetObject(db.TableStyleDictionaryId, OpenMode.ForWrite) as DBDictionary;
  63.                     TableStyle tableStyle;
  64.                     var tableStyleId = ObjectId.Null;
  65.                     if (tableStylesDictionary.Contains(TableStyleName1))
  66.                     {
  67.                         return;
  68.                     }
  69.                     else
  70.                     {
  71.                         tableStyle = new TableStyle();
  72.                         tableStyleId = tableStylesDictionary.SetAt(TableStyleName1, tableStyle);
  73.                         tr.AddNewlyCreatedDBObject(tableStyle, true);
  74.                     }
  75.                     // Некоторые операции будут выполняться через COM, т.к. некоторые настройки
  76.                     // Бушману удалось выполнить только через COM.
  77.                     var customTableStyle = (IAcadTableStyle)tableStyle.AcadObject;
  78.                     customTableStyle.FlowDirection = AcTableDirection.acTableTopToBottom;
  79.                     // Шаг 1: Сначала создаём таблицу, которая должна применяться в качестве шаблона.
  80.                     var table = new Table();
  81.                     table.SetDatabaseDefaults();
  82.                     table.TableStyle = tableStyleId;
  83.                     table.Position = new Point3d(0, 0, 0);
  84.                     const int columnsCount = 6;
  85.                     int rowsCount = list1.Count + 4;
  86.                     table.SetSize(rowsCount, columnsCount);
  87.                     table.Height = 15;
  88.                     table.Width = 20;
  89.                     table.ColorIndex = 5;
  90.                     // Заполняем таблицу...
  91.                     String[,] str = new String[rowsCount, columnsCount];
  92.                     for (int i = 0; i < rowsCount; i++)
  93.                     {
  94.                         for (int j = 0; j < columnsCount; j++)
  95.                         {
  96.                             str[i, j] = String.Empty;
  97.                         }
  98.                     }
  99.                     str[0, 0] = "Спецификация";
  100.                     str[1, 0] = "Поз.";
  101.                     str[1, 1] = "Обозначение";
  102.                     str[1, 2] = "Наименование";
  103.                     str[1, 3] = "Кол.";
  104.                     str[1, 4] = "Масса  ед.,кг";
  105.                     str[1, 5] = "Приме- чание";
  106.                     for (int i = 0; i < rowsCount; i++)
  107.                     {
  108.                         for (int j = 0; j < columnsCount; j++)
  109.                         {
  110.                             table.Cells[i, j].SetValue(str[i, j], ParseOption.ParseOptionNone);
  111.                         }
  112.                         table.Rows[i].Height = 8;
  113.                     }
  114.                     table.Rows[1].Height = 15;
  115.                     table.Columns[0].Width = 15;
  116.                     table.Columns[1].Width = 60;
  117.                     table.Columns[2].Width = 65;
  118.                     table.Columns[3].Width = 10;
  119.                     table.Columns[4].Width = 15;
  120.                     table.Columns[5].Width = 20;
  121.                     for (int i = 0; i < list1.Count; i++)
  122.                     {
  123.                         table.Cells[i + 2, 0].SetValue(list1[i] +
  124.                             Convert.ToString(Math.Round(Convert.ToDouble(list3[i]) / 100, 0, MidpointRounding.AwayFromZero)),
  125.                             ParseOption.ParseOptionNone);
  126.                     }
  127.                     for (int i = 0; i < list1.Count; i++)
  128.                     {
  129.                         table.Cells[i + 2, 2].SetValue(" " + list1[i] + "  СТБ 1704-2012" + " L=" + list3[i],
  130.                             ParseOption.ParseOptionNone);
  131.                     }
  132.                     for (int i = 0; i < list1.Count; i++)
  133.                     {
  134.                         table.Cells[i + 2, 4].SetValue(Convert.ToString(Math.Round(Math.Pow(Convert.ToDouble(list1[i]), 2) *
  135.                             Math.PI / 4 * Convert.ToDouble(list3[i]) * 7850 / Math.Pow(10, 9), 2, MidpointRounding.AwayFromZero)),
  136.                             ParseOption.ParseOptionNone);
  137.                     }
  138.                      for (Int32 i = 0; i < columnsCount; i++)
  139.                     {
  140.                         table.Columns[i].Alignment = CellAlignment.MiddleCenter;
  141.                     }
  142.                      for (Int32 i = 0; i < 2; i++)
  143.                     {
  144.                         table.Rows[i].Alignment = CellAlignment.MiddleCenter;
  145.                         if (i == 0)
  146.                             table.Rows[i].Style = "_TITLE";
  147.                         else
  148.                             table.Rows[i].Style = "_HEADER";
  149.                     }
  150.                     for (int i = 2; i < rowsCount; i++)
  151.                     {
  152.                         table.Cells[i, 2].Alignment = CellAlignment.MiddleLeft;
  153.                     }
  154.                     table.GenerateLayout();
  155.                     // Шаг 2: Назначаем созданную нами выше таблицу, шаблоном для табличного стиля
  156.                     var tableStyle2 = new TableStyle();
  157.                     tableStyle2.CopyFrom(tableStyle);
  158.                     var tableStyle2Id = tableStylesDictionary.SetAt(TableStyleName2, tableStyle2);
  159.                     tr.AddNewlyCreatedDBObject(tableStyle2, true);
  160.                     var template =new TableTemplate(table, TableCopyOptions.TableCopyColumnWidth |
  161.                         TableCopyOptions.TableCopyRowHeight |TableCopyOptions.ConvertFormatToOverrides);
  162.                     db.AddDBObject(template);
  163.                     tr.AddNewlyCreatedDBObject(template, true);
  164. #if NEWER_THAN_AUTOCAD_2014
  165.           tableStyle2.Template =  template.ObjectId;
  166. #elif NEWER_THAN_AUTOCAD_2009
  167.            IAcadTableStyle customTableStyle2 = (IAcadTableStyle)tableStyle2.AcadObject;
  168.            customTableStyle.TemplateId =((IAcadObject)template.AcadObject).ObjectID;
  169. #else
  170.           Com.IAcadTableStyle2 customTableStyle2 = (Com.IAcadTableStyle2)tableStyle2.AcadObject;
  171.           customTableStyle2.TemplateId = ((Com.IAcadObject)template.AcadObject).ObjectID;
  172. #endif
  173.           //Выполняем настройки таблиуцы (вызываем приватный метод)
  174.           InitializeEmbededCellStyles(tableStyle2, textStyleId);
  175.                     var dict = tr.GetObject(db.TableStyleDictionaryId, OpenMode.ForRead) as DBDictionary;
  176.                     var ts = tr.GetObject(dict.GetAt(TableStyleName2),
  177.                       OpenMode.ForRead) as TableStyle;
  178.                     var template2 = tr.GetObject(ts.Template, OpenMode.ForRead) as
  179.                       TableTemplate;
  180.                     var tableInstance = new Table();
  181.                     tableInstance.CopyFrom(template2, TableCopyOptions.FillTarget);
  182.                     tableInstance.GenerateLayout();
  183.                     PromptPointResult pr = ed.GetPoint("\nУкажите точку вставки таблицы: ");
  184.                     if (pr.Status == PromptStatus.OK)
  185.                     {
  186.                         tableInstance.Position = pr.Value;
  187.                     }
  188.                     var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  189.                     var modelSpace = tr.GetObject(bt[BlockTableRecord.ModelSpace],
  190.                     OpenMode.ForWrite) as BlockTableRecord;
  191.                     modelSpace.AppendEntity(tableInstance);
  192.                     tr.AddNewlyCreatedDBObject(tableInstance, true);
  193.  
  194.                    *****************************************************
  195.                    // Вот здесь хочу удалить стиль "Базовый", но никак не выходит              
  196.                    *****************************************************
  197.  
  198.                     tr.Commit();
  199.                 }
  200.             }
  201.         }


Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Александр Ривилис от 25-07-2016, 18:49:14
так вот хочу в конце добавить удаление табличного стиля "Базовый", так как он мне больше не нужен, и не хочется оставлять в документе что-то лишнее.
Не пробовал tableStyle.Erase(); ? Возможно нужно создать вторую транзакцию.
Название: Re: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука
Отправлено: Максим Маркевич от 26-07-2016, 01:02:36
Не пробовал tableStyle.Erase(); ? Возможно нужно создать вторую транзакцию.
Пробовал, но не берусь говорить, что не работает данный вариант (возможно, плохо пробовал).
Нашел более деликатный способ решения данного вопроса, а именно обошелся без создания базового стиля.
Код - C# [Выбрать]
  1. var tableStyle = new TableStyle() as TableStyle;
  2. tableStyleId = tableStylesDictionary.SetAt("Standard", tableStyle);
То есть воспользовался существующим "Standard". Довел свой адаптированный код до ума, то есть подчистил его и упростил, но уже с полным пониманием дела, а посему доволен как слон. :)