Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука

Автор Тема: Разбор программных кодов из "Программирование для AutoCAD 2013-2015" Полещука  (Прочитано 19900 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Всем привет. Я начинающий разработчик(c#). Всю инфу беру из книги выше, а также использую Managed .NET Developer's Guide (http://help.autodesk.com/view/ACD/2017/ENU/?guid=GUID-C3F3C736-40CF-44A0-9210-55F6A939B6F2).
Так вот, работаю в VS2015, а тестирую все на Autocad2017x64 (возможно, все дело именно в этом, в книге то AutoCAD 2013-2015). Некоторые программные коды из книги у меня не работают, и я не могу понять, почему. Соответственно, создаю тему, где можно было бы разобраться, при Вашей помощи, уважаемые, с возникающими проблемами.

Хотелось бы начать с программного кода для работы с таблицами: стр. 239-266 в книге.
При выполнении сборки появлялась следующая ошибка:

При отладке первое, что выбивается:

Ни в первом, ни во втором случае не понимаю, что нужно исправить.
Более подробного и настолько круто закомментированного кода по работе с таблицами в акаде я не нашел, поэтому хочу заставить его работать, чтобы потом вынести для себя все необходимое.

Скачать данный код можно из шапки темы: Н.Н.Полещук. "Программирование для AutoCAD 2013-2015". ДМК Пресс, 2015.
Соответственно, путь к нему будет таким: *\Глава 4 (.NET)\AutoCAD 2015\05 TableStyleSample\

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я не понял. У тебя не компилируется код в VS 2015? Какой путь указан в Reference Paths? Лучше всего указать путь к ObjectARX SDK (подкаталог \inc), но можно и к каталогу с acad.exe (обычно это: C:\Program Files\Autodesk\AutoCAD 2017). После этого код нормально компилируется без ошибок.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Я не понял. У тебя не компилируется код в VS 2015? Какой путь указан в Reference Paths? Лучше всего указать путь к ObjectARX SDK (подкаталог \inc), но можно и к каталогу с acad.exe (обычно это: C:\Program Files\Autodesk\AutoCAD 2017). После этого код нормально компилируется без ошибок.
Да, если под компиляцией подразумевать Сборку, то нет, не компилируется (1-й скрин из шапки темы).
Насчет путей и ссылок(все на папку ObjectARX SDK):


Все добавлено.

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

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

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Кстати и с нумерацией строк у тебя что-то не то. Указанная строка на первом рисунке в исходном тексте имеет номер 1190.
Дописывал комментарии, ничего серьезного, вот, пожалуйста, исходный код:


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Всё очень странно. А какая разрядность AutoCAD 2017 у тебя?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Код не только компилируется, но и исправно работает в AutoCAD 2017 x64:

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Покажи весь текст из окна Output при построении проекта (в виде текста, а не картинки).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Обратил внимание, что не задана препроцессорная переменная NEWER_THAN_AUTOCAD_2013 (есть NEWER_THAN_AUTOCAD_2012 и есть NEWER_THAN_AUTOCAD_2014). Поэтому часть кода не выполняется - добавил её сюда:



Это уже замечание к Андрею Бушману. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Покажи весь текст из окна 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). Поэтому часть кода не выполняется - добавил её сюда:

Добавил, ничего не изменилось.
Сейчас запишу скринкаст, если нужно (с момента скачки кода, до момента его сборки)?

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

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

Отмечено как Решение Максим Маркевич 16-07-2016, 18:08:48

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Кажется я понял в чем у тебя проблема. Добавь еще в Reference Paths путь к ObjectARX SDK подкаталог \inc-x64 (если у тебя AutoCAD x64) или \inc-win32 (если AutoCAD x86):



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

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Кажется я понял в чем у тебя проблема. Добавь еще в Reference Paths путь к ObjectARX SDK подкаталог \inc-x64 (если у тебя AutoCAD x64) или \inc-win32 (если AutoCAD x86):
Судя по всему у тебя берётся путь к не тем сборкам Autodesk.AutoCAD.Interop.dll и Autodesk.AutoCAD.Interop.Common.dll.

Огромнейшее спасибо!!!!! Дай Бог Вам здоровья! :)
Все, теперь поеду на дачу!  :D

Оффлайн Максим МаркевичАвтор темы

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Не хочу флуд разводить, поэтому спрошу здесь, тема касается таблиц в акаде.
Модифицировал код из Полещука.
В Autocad2016x64 все работает, а вот в Autocad2014x64 выдает следующую ошибку:

Весь код прикреплять стыдно (мои первые пробы, боюсь, не вынесут слабонервные), прикреплю кусок, где происходит сбой:
Код - 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.     }

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

Подредактировал отображение кода.
« Последнее редактирование: 21-07-2016, 19:01:21 от Александр Ривилис »

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

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