Прошу помощи с кодом

Автор Тема: Прошу помощи с кодом  (Прочитано 17749 раз)

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

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Прошу помощи с кодом
« : 24-11-2018, 21:17:14 »
Здравствуйте. Пишу на форум впервые. У меня такая проблема возникла. Не могу написать код, поэтому прошу помощи здесь.
Писал на VBA для Acad Civil 2018.
Возникли трудности:
1. Ещё плохо разбираюсь с методами и свойствами самого Автокада.
2. Мне нужны были данные из таблицы объектных данных (как я понял, так они называются. Показал на скрине #1). А точнее "КН". Вот именно это я и не могу взять в свой код.

Суть кода такова:
1. Предлагает пользователю выбрать 1 объект (полилиния или блок с данными)
2. Выбирает данные записи "КН" и заносит их в некую переменную.
3. Предлагает пользователю указать точку, куда будет указывать мультивыноска, которая уже несет в себе запись "КН".
4. Вставляет эту выноску.

Почему VBA?
- Предложили. Но недавно узнал, что можно и на C#. С языками C и C++ знаком, думаю, что проблем не будет изучить C#.
Зачем нужен этот код?
- Долго заходить в свойства объекта, копировать нужную запись и вставлять в мультивыноску. Думал, что сам смогу свой полезный код написать, ошибся с выводами.

Прошу помочь написать код и сказать, какой метод предлагает пользователю выбрать только один объект, а не несколько, и можно ли это сделать без именного набора?



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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #1 : 24-11-2018, 21:24:37 »
какой метод предлагает пользователю выбрать только один объект, а не несколько, и можно ли это сделать без именного набора?
Можно. Метод GetEntity:
Код - Visual Basic [Выбрать]
  1. Dim returnObj As AcadObject
  2. Dim basePnt As Variant
  3.  
  4. On Error Resume Next
  5.  
  6. ThisDrawing.Utility.GetEntity returnObj, basePnt, "Выберите объект"
  7.  
  8. If Err = 0 Then
  9.     MsgBox "Тип объекта: " & returnObj.EntityName, , "Пример GetEntity"
  10. End If
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #2 : 24-11-2018, 21:26:26 »
Эти данные судя по всему ObjectData, которые есть в Civil 3D и Map 3D, но их нет (точнее к ним нет доступа) в чистом AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #3 : 24-11-2018, 21:39:10 »
Спасибо за пример с выборкой объекта.

Файлы, которые я загружаю с объектами, которые имеют те данные, имеют тип .mid и .mif. Всё, что могу сказать по этому поводу.
То есть через код я никак не смогу обратиться к тем данным?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #4 : 24-11-2018, 21:40:42 »
То есть через код я никак не смогу обратиться к тем данным?
Сможете, но только в AutoCAD Civil 3D или в AutoCAD Map 3D. Это я уточняю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #5 : 24-11-2018, 22:07:10 »
Не могу найти в Help что-нибудь по Object Data. Если бы я знал способы обращения к записям таблицы..
Есть только небольшой список команд работы с Object Data
« Последнее редактирование: 24-11-2018, 22:51:13 от Vlad_001 »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #6 : 24-11-2018, 23:10:05 »
Не могу найти в Help что-нибудь по Object Data.
Думаю, что не там ищешь. В AutoCAD Civil 3D этого в документации нет. Есть в AutoCAD Map 3D. Так что его придётся качать и устанавливать. Или качать и устанавливать ObjectARX Map 3D SDK. Но там есь документация только для C++ или VB.NET/C#.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #7 : 24-11-2018, 23:12:40 »
А в интернете подобного нет? Мне попадаются только англоязычные форумы.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #8 : 24-11-2018, 23:17:24 »
А в интернете подобного нет?
Подобного - это какого?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #9 : 24-11-2018, 23:19:57 »
Справку, как в обычном автокаде Help, с расписанными методами и свойствами. На сайте Autodesk только про команды пишут. Может я не там ищу?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #10 : 24-11-2018, 23:40:20 »
На сайте Autodesk только про команды пишут. Может я не там ищу?
Здесь всё о программировании для Map 3D:
https://www.autodesk.com/developer-network/platform-technologies/autocad-map-3d
В частности там сказано:

Цитировать
Documentation and Samples

The Docs subfolder in the AutoCAD Map ObjectARX SDK (download links below) installation directory contains Help files and Developers Guide for all the APIs, except the ActiveX (COM Automation) and AutoLISP® APIs.

Documentation for the ActiveX (COM Automation) and AutoLISP® APIs are in the Help subfolder of the AutoCAD Map.

Т.е. документация для VBA (это ActiveX (COM Automation)) - находится в самом AutoCAD Map 3D. Т.е. его нужно установить.

Здесь ObjectARX Map 3D SDK: https://www.autodesk.com/developer-network/platform-technologies/autocad/map3d-objectarx
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #11 : 24-11-2018, 23:42:13 »
Благодарю Вас. Думаю, что завтра будут результаты.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #12 : 25-11-2018, 00:10:05 »
Благодарю Вас. Думаю, что завтра будут результаты.
Боюсь, что всё будет не так просто. Я установил AutoCAD Map 3D, но документации в нём нет. Так что переход на .NET придётся делать сразу и про VBA забыть.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #13 : 25-11-2018, 00:13:12 »
Буду импровизировать. :)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #14 : 25-11-2018, 00:36:41 »
Буду импровизировать. :)
Я пока задал вопрос в ADN DevHelp где можно найти эту документацию, так как её не оказалось и в offline-документации. Это крайне странно.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Прошу помощи с кодом
« Ответ #15 : 25-11-2018, 10:33:42 »
на VBA кажись тоже можно добраться до OD - я находил файл справки в самом Map 3D
Код - C# [Выбрать]
  1.         public List<KeyValuePair<string, string>> GetParams(ObjectId id)
  2.         {
  3.             MapApplication mapApp = HostMapApplicationServices.Application;
  4.             ProjectModel activeProject = mapApp.ActiveProject;
  5.             OD.Tables tableList = activeProject.ODTables;
  6.             OD.Table cTable;
  7.             List<KeyValuePair<string, string>> rList = new List<KeyValuePair<string, string>>();
  8.             try
  9.             {
  10.                 if (!id.IsErased)
  11.                 {
  12.                     using (OD.Records records = tableList.GetObjectRecords(0, id, OpenMode.OpenForRead, false))
  13.                     {
  14.                         if (records.Count > 0)
  15.                         {
  16.                             OD.Record trec = records[0];
  17.                             cTable = tableList[trec.TableName];
  18.                             for (int i = 0; i < trec.Count; i++)
  19.                             {
  20.                                 if (ATTRS_Dict.Keys.Contains(cTable.FieldDefinitions[i].Name))
  21.                                 {
  22.                                     rList.Add(new KeyValuePair<string, string>(cTable.FieldDefinitions[i].Name, trec[i].StrValue));
  23.                                 }
  24.                             }
  25.                         }
  26.                     }
  27.                 }
  28.  
  29.             }
  30.             catch (Exception ex)
  31.             {
  32.  
  33.             }
  34.             return rList;
  35.         }

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Прошу помощи с кодом
« Ответ #16 : 25-11-2018, 10:46:22 »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #17 : 25-11-2018, 11:33:01 »
trir,
И где ты здесь увидел VBA? Там только .NET.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Прошу помощи с кодом
« Ответ #18 : 25-11-2018, 11:58:52 »
VBA
куда дели файлы справки из Map 3D?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #19 : 25-11-2018, 12:01:47 »
VBA
куда дели файлы справки из Map 3D?
Перечитай тему. Я этот вопрос задал в ADN DevHelp.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #20 : 25-11-2018, 16:13:16 »
Нашел статью: Where to get the AutoCAD Map AutoLISP Reference
Проверил, что в AutoCAD Map 3D 2012 API References есть не только Lisp API, но и COM/AcriveX API (т.е. VBA).Это файл acmapatm.chm
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #21 : 25-11-2018, 16:44:30 »
на VBA кажись тоже можно добраться до OD - я находил файл справки в самом Map 3D
Код - C# [Выбрать]
  1.         public List<KeyValuePair<string, string>> GetParams(ObjectId id)
  2.         {
  3.             MapApplication mapApp = HostMapApplicationServices.Application;
  4.             ProjectModel activeProject = mapApp.ActiveProject;
  5.             OD.Tables tableList = activeProject.ODTables;
  6.             OD.Table cTable;
  7.             List<KeyValuePair<string, string>> rList = new List<KeyValuePair<string, string>>();
  8.             try
  9.             {
  10.                 if (!id.IsErased)
  11.                 {
  12.                     using (OD.Records records = tableList.GetObjectRecords(0, id, OpenMode.OpenForRead, false))
  13.                     {
  14.                         if (records.Count > 0)
  15.                         {
  16.                             OD.Record trec = records[0];
  17.                             cTable = tableList[trec.TableName];
  18.                             for (int i = 0; i < trec.Count; i++)
  19.                             {
  20.                                 if (ATTRS_Dict.Keys.Contains(cTable.FieldDefinitions[i].Name))
  21.                                 {
  22.                                     rList.Add(new KeyValuePair<string, string>(cTable.FieldDefinitions[i].Name, trec[i].StrValue));
  23.                                 }
  24.                             }
  25.                         }
  26.                     }
  27.                 }
  28.  
  29.             }
  30.             catch (Exception ex)
  31.             {
  32.  
  33.             }
  34.             return rList;
  35.         }

Это код на мою программу на С#?

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #22 : 25-11-2018, 16:45:43 »
Проверил, что в AutoCAD Map 3D 2012 API References есть не только Lisp API, но и COM/AcriveX API (т.е. VBA).Это файл acmapatm.chm
Большое спасибо, сейчас буду смотреть

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #23 : 25-11-2018, 16:57:44 »
Нашел статью: Where to get the AutoCAD Map AutoLISP Reference
Проверил, что в AutoCAD Map 3D 2012 API References есть не только Lisp API, но и COM/AcriveX API (т.е. VBA).Это файл acmapatm.chm
Скачал zip-папку, нашел нужный файл и раздел Object Data, но он пустой, как и все остальные разделы. Почему так?
Ни один файл не отображает информацию, только имена разделов есть.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #24 : 25-11-2018, 17:25:14 »
Нашел статью: Where to get the AutoCAD Map AutoLISP Reference
Проверил, что в AutoCAD Map 3D 2012 API References есть не только Lisp API, но и COM/AcriveX API (т.е. VBA).Это файл acmapatm.chm
Скачал zip-папку, нашел нужный файл и раздел Object Data, но он пустой, как и все остальные разделы. Почему так?
Ни один файл не отображает информацию, только имена разделов есть.
Разблокируй сначала файл:

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

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Прошу помощи с кодом
« Ответ #25 : 25-11-2018, 17:25:56 »
Цитировать
Это код на мою программу на С#?
это пример чтения OD
справка не очень полезная, но в своё время именно она помогла мне разобраться в теме - редкий случай когда COM и NET совпадают почти один в один

Цитировать
но он пустой, как и все остальные разделы. Почему так?
https://community.spiceworks.com/topic/1961503-solved-windows-10-chm-help-files-showing-up-blank

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #26 : 25-11-2018, 17:39:10 »


АвтоКАД не хочет определять эти переменные. Что не так?
Вроде говорили, что Цивил должен определять типы данных из Мап 3Д

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #27 : 25-11-2018, 17:47:27 »
АвтоКАД не хочет определять эти переменные. Что не так?
Ты похоже не подключил:



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

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #28 : 25-11-2018, 17:50:43 »
АвтоКАД не хочет определять эти переменные. Что не так?
Ты похоже не подключил:


А где открывается данное окно?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #29 : 25-11-2018, 17:51:49 »


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

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #30 : 25-11-2018, 18:06:59 »
Теперь мой ACAD понимает эти типы данных, но я всё равно не понимаю, как присвоить переменной запись "КН" и занести её в мультивыноску, которую мы потом вставим.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #31 : 25-11-2018, 18:14:27 »
Теперь мой ACAD понимает эти типы данных
Замечательно.
но я всё равно не понимаю, как присвоить переменной запись "КН" и занести её в мультивыноску, которую мы потом вставим.
Раздели эту задачу на две.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #32 : 25-11-2018, 18:31:41 »
Код - Visual Basic [Выбрать]
  1. Sub mm()
  2. Dim amap As AcadMap
  3. Dim returnObj As Object
  4. Dim ODfdfs As ODFieldDefs
  5. Dim ODfdf As ODFieldDef
  6. Dim ODtb As ODTable
  7. Dim ODrc As ODRecord
  8.  
  9.  
  10.  
  11.  
  12. Dim basePnt As Variant
  13.  
  14. On Error Resume Next
  15.  
  16. ThisDrawing.Utility.GetEntity returnObj, basePnt, "Выберите объект"
  17.  
  18. If Err = 0 Then
  19. MsgBox "Тип объекта: " & returnObj.EntityName, , "Пример GetEntity"
  20. End If
  21.  
  22. ResUn = returnObj.ODtb("Result_un")
  23. kn = ResUn.Item("КН")
  24.  
  25. MsgBox "КН: " & kn
  26.  
  27. End Sub
  28.  

Не выходит считать саму запись

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #33 : 25-11-2018, 18:44:09 »
ResUn = returnObj.ODtb("Result_un")
Почему ты решил, что так должно работать?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #34 : 25-11-2018, 18:48:38 »
ResUn = returnObj.ODtb("Result_un")
Почему ты решил, что так должно работать?
Примеры вчера смотрел с англоязычных форумов, по памяти написал, но скорее всего ошибся.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Прошу помощи с кодом
« Ответ #35 : 25-11-2018, 18:52:22 »
а зачем так замачиваться, когда есть аннотации?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #36 : 25-11-2018, 18:52:54 »
Примеры вчера смотрел с англоязычных форумов, по памяти написал, но скорее всего ошибся.
100% У AcadObject нет ни свойства, ни метода с именем ODtb
Я раскопал в документации такой код. Попробуй:
Код - Visual Basic [Выбрать]
  1. Dim amap As AcadMap
  2.  
  3. Dim acadObj As Object
  4.  
  5. Dim ODtb As ODTable
  6.  
  7. Dim i As Integer
  8.  
  9. Dim prj As Project
  10.  
  11. Dim ODrcs As ODRecords
  12.  
  13. Dim boolVal As Boolean
  14.  
  15.  
  16.  
  17. Set amap = ThisDrawing.Application. _
  18.  
  19. GetInterfaceObject("AutoCADMap.Application")
  20.  
  21. Set prj = amap.Projects(ThisDrawing)
  22.  
  23. prj.ProjectOptions.DontAddObjectsToSaveSet = True
  24.  
  25. Set ODtb = prj.ODTables.Item("SampleOD")
  26.  
  27. Set ODrcs = ODtb.GetODRecords
  28.  
  29. For Each acadObj In ThisDrawing.ModelSpace
  30.  
  31. boolVal = ODrcs.Init(acadObj, True, False)
  32.  
  33. Debug.Print ODrcs.Record.tableName
  34.  
  35. Debug.Print ODrcs.Record.ObjectID
  36.  
  37. For i = 0 To ODrcs.Record.Count - 1
  38.  
  39. Debug.Print ODrcs.Record.Item(i).Value
  40.  
  41. Next i
  42.  
  43. Next

Вместо "SampleOD" наверное "Result_un"
Чтобы было проще проверять - удали всё из чертежа кроме одной полилинии с этими данными.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #37 : 25-11-2018, 18:55:39 »
Set amap = ThisDrawing.Application. _
 
GetInterfaceObject("AutoCADMap.Application")
Ругается на синтаксис

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Прошу помощи с кодом
« Ответ #38 : 25-11-2018, 19:06:39 »
Set amap = ThisDrawing.Application.GetInterfaceObject("AutoCADMap.Application")

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #39 : 25-11-2018, 20:25:11 »
Дома попробовал поработать с данным кодом, выдает фатальную ошибку. Больше код похож на создание таблицы, а не поиск нужного элемента. Просто не понимаю, почему ошибка вылетает?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #40 : 25-11-2018, 20:56:41 »
Больше код похож на создание таблицы, а не поиск нужного элемента.
Совершенно не похож.
Просто не понимаю, почему ошибка вылетает?
Я тоже. Как минимум запусти в режиме отладки пошагово и посмотри на чем вылетает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Прошу помощи с кодом
« Ответ #41 : 25-11-2018, 21:16:42 »
вылетает если boolVal = False
код обходит все примитивы в моделе и читает их OD, а OD нет - вылетеат

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #42 : 25-11-2018, 21:26:36 »
Так у меня-то в чертеже есть тот самый OD:Result_Un

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #43 : 25-11-2018, 21:41:51 »
Попробуй вот такой код:
Код - Visual Basic [Выбрать]
  1. Sub PrintAllOData()
  2.     Dim amap As AcadMap
  3.     Dim acadObj As Object
  4.     Dim ODtbs As ODTables
  5.     Dim ODtb As ODTable
  6.     Dim i As Integer
  7.     Dim prj As Project
  8.     Dim ODrcs As ODRecords
  9.     Dim boolVal As Boolean
  10.      
  11.     Set amap = ThisDrawing.Application.GetInterfaceObject("AutoCADMap.Application")
  12.     Set prj = amap.Projects(ThisDrawing)
  13.     prj.ProjectOptions.DontAddObjectsToSaveSet = True
  14.     Set ODtbs = prj.ODTables
  15.    
  16.     For Each ODtb In ODtbs
  17.       Debug.Print ODtb.Name
  18.       Set ODrcs = ODtb.GetODRecords
  19.       For Each acadObj In ThisDrawing.ModelSpace
  20.         boolVal = ODrcs.Init(acadObj, False, False)
  21.         If boolVal = True Then
  22.           Debug.Print ODrcs.Record.tableName
  23.           Debug.Print ODrcs.Record.ObjectID
  24.           For i = 0 To ODrcs.Record.Count - 1
  25.            Debug.Print ODrcs.Record.Item(i).Value
  26.           Next i
  27.         End If
  28.       Next
  29.     Next
  30.     Set ODrcs = Nothing
  31. End Sub

Еще раз повторяю. Удали из чертежа ВСЁ (!!!), кроме одной (или нескольких) полилининий с ObjectData.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #44 : 25-11-2018, 21:44:00 »
Так у меня-то в чертеже есть тот самый OD:Result_Un
Но у тебя есть и примитивы без неё. Вот на них похоже и вылет. Поэтому я еще добавил проверку:
Код - Visual Basic [Выбрать]
  1.         If boolVal = True Then
Off-Topic: показать
P.S.: Похоже пока ты очень далёк от программирования...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #45 : 25-11-2018, 21:53:13 »



Попробовал несколько раз.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #46 : 25-11-2018, 21:54:33 »
Попробовал несколько раз.
Где пошаговая отладка? На какой строке вылет?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #47 : 25-11-2018, 22:15:26 »
Код - Visual Basic [Выбрать]
  1.  Set amap = ThisDrawing.Application.GetInterfaceObject("AutoCADMap.Application")

На этой строке всё прекращается и выскакивает ошибка.

А нельзя ли эти данные из Result_un взять с помощью GetXData?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #48 : 25-11-2018, 22:21:38 »
А нельзя ли эти данные из Result_un взять с помощью GetXData?
Нет. Они не в XData. Если бы было всё так просто, то оно работало бы в чистом AutoCAD.
На этой строке всё прекращается и выскакивает ошибка.
Ну это совсем плохо. Тут я тебе не помогу. Или проблема с инсталляцией или с Windows. В чем ты проверяешь? В Civil 3D или в Map 3D? В какой версии? Из какой версии подключал в References?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #49 : 25-11-2018, 22:25:41 »
Дома у меня Win 7. Проверяю в Civil 3D 2018. В References нашел только Autodesk Map 3D 2005. Могу скинуть вам тестовый файл с одним объектом только в личку. Может это что-то даст

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #50 : 25-11-2018, 22:32:43 »
В References нашел только Autodesk Map 3D 2005.
Думаю что без установки Map 3D 2018 ничего не будет. Но лучше не лезть в дебри и забыть про VBA. Думаю не зря Autodesk'овцы не дают документацию для VBA в последних версиях. Скорее всего оно не работает. Не вижу за последние лет 10 чтобы кто-то использовал VBA в Map 3D.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #51 : 25-11-2018, 22:35:01 »
Изучить C# и написать на нём? А это поможет с моим-то Civil'ом?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #52 : 25-11-2018, 22:36:06 »
Изучить C# и написать на нём? А это поможет с моим-то Civil'ом?
Да. Это должно сразу нормально работать с Civil'е
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #53 : 25-11-2018, 22:38:09 »
Вернусь с результатами или с вопросами.  ;D

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #54 : 25-11-2018, 23:06:05 »
На виртуальной машине у меня только Civil 3D 2016 и поставить Civil 3D 2018 сейчас возможности нет. Проверил с ним:


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

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63
Re: Прошу помощи с кодом
« Ответ #55 : 25-11-2018, 23:29:45 »
Цитировать
Нет. Они не в XData. Если бы было всё так просто, то оно работало бы в чистом AutoCAD.
я видел lisp'ы которые это делали и без Map API, но это ещё тот гемор...
примерно как с динамическими блоками работать на прямую...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #56 : 25-11-2018, 23:32:39 »
я видел lisp'ы которые это делали и без Map API, но это ещё тот гемор...
примерно как с динамическими блоками работать на прямую...
Ну тогда точно не VBA, так с его помощью нельзя получить dxf-коды объекта. Т.е. это или lisp, или arx, или .NET через P/Invoke
Но если бы был пример чертежа, то я попробовал бы на него взглянуть. Например, через ARXDBG/MGDDBG.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #57 : 26-11-2018, 12:15:41 »
Впрочем и проекта на котором можно проверить у меня н
Я выслал Вам на почту тестовый файл. Если не трудно, проверьте, может это только у меня фатальная ошибка вылетает?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #58 : 26-11-2018, 16:11:56 »
Впрочем и проекта на котором можно проверить у меня н
Я выслал Вам на почту тестовый файл. Если не трудно, проверьте, может это только у меня фатальная ошибка вылетает?
У меня не только не вылетает, но и получил результат (в AutoCAD Map 3d 2019):


Использовал слегка модифицированный код:
Код - Visual Basic [Выбрать]
  1. Sub PrintAllOData()
  2.    Dim amap As AcadMap
  3.    Dim acadObj As Object
  4.    Dim ODtbs As ODTables
  5.    Dim ODtb As ODTable
  6.    Dim i As Integer
  7.    Dim prj As Project
  8.    Dim ODrcs As ODRecords
  9.    Dim ODrc As ODRecord
  10.    Dim ODflds As ODFieldDefs
  11.  
  12.    Dim boolVal As Boolean
  13.    
  14.    Set amap = ThisDrawing.Application.GetInterfaceObject("AutoCADMap.Application")
  15.    Set prj = amap.Projects(ThisDrawing)
  16.    prj.ProjectOptions.DontAddObjectsToSaveSet = True
  17.    Set ODtbs = prj.ODTables
  18.  
  19.    For Each ODtb In ODtbs
  20.      If ODtb.Name = "Result_un" Then
  21.        Set ODrcs = ODtb.GetODRecords
  22.        Set ODflds = ODtb.ODFieldDefs
  23.        
  24.        For Each acadObj In ThisDrawing.ModelSpace
  25.          boolVal = ODrcs.Init(acadObj, True, True)
  26.          If boolVal = True Then
  27.          On Error GoTo Err_1
  28.            Set ODrc = ODrcs.Record
  29.            Debug.Print ODrc.tableName
  30.            Debug.Print ODrc.ObjectID
  31.            For i = 0 To ODrc.Count - 1
  32.             Debug.Print ODflds.Item(i).Name & ": " & ODrc.Item(i).Value
  33.            Next i
  34. Err_1:
  35.          End If
  36.        Next
  37.      End If
  38.    Next
  39.    Set ODrcs = Nothing
  40. End Sub
« Последнее редактирование: 26-11-2018, 19:16:48 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #59 : 26-11-2018, 19:45:22 »
Совместно с Дмитрий Загорулькин провели исследование. В версиях 2016, 2017, 2018 нам не удалось заставить работать код. В AutoCAD Map 3d 2019 (у меня) и в AutoCAD Civil 3d 2019 (у Дмитрия) - работает.
Вот такая ошибка на строке:
Код - Visual Basic [Выбрать]
  1. Set amap = ThisDrawing.Application.GetInterfaceObject("AutoCADMap.Application")



С путями доступа к файлу вроде всё в порядке.



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

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #60 : 26-11-2018, 19:49:24 »
Совместно с Дмитрий Загорулькин провели исследование. В версиях 2016, 2017, 2018 нам не удалось заставить работать код. В AutoCAD Map 3d 2019 (у меня) и в AutoCAD Civil 3d 2019 (у Дмитрия) - работает.
Вот такая ошибка на строке:
Код - Visual Basic [Выбрать]
  1. Set amap = ThisDrawing.Application.GetInterfaceObject("AutoCADMap.Application")



С путями доступа к файлу вроде всё в порядке.

Значит с моим AutoCAD Civil 2018 такой номер не пройдет. Очень жаль, но спасибо, что помогли написать код. Думаю, что скоро перейду на 2019

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #61 : 26-11-2018, 19:50:30 »
Значит с моим AutoCAD Civil 2018 такой номер не пройдет. Очень жаль, но спасибо, что помогли написать код. Думаю, что скоро перейду на 2019
Мы не оставили надежды разобраться в чем дело.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #62 : 26-11-2018, 19:51:42 »
Возможно, что решение для 2018 Civil 3D ещё есть?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #63 : 26-11-2018, 19:52:36 »
Возможно, что решение для 2018 Civil 3D ещё есть?
Решение с .NET (C#/VB.NET) однозначно должно быть.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #64 : 26-11-2018, 19:54:15 »
Ещё бы внедрить C# в АutoCAD

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #65 : 26-11-2018, 19:55:17 »
Ещё бы внедрить C# в АutoCAD
Ты имеешь в виду Visual Studio? Нет. С этим ничего не будет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #66 : 26-11-2018, 19:56:50 »
Я клоню к тому, что пока не знаю, как установить среду в АвтоКад для  C#. Или она есть уже в нём?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #67 : 26-11-2018, 19:59:24 »
Я клоню к тому, что пока не знаю, как установить среду в АвтоКад для  C#. Или она есть уже в нём?
Там не нужна среда. Ставишь Visual Studio 2015 или 2017. Результат компиляции - dll-файл, который грузится в AutoCAD командой NETLOAD или еще парочкой способов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #68 : 26-11-2018, 20:35:26 »
Обнаружил еще один интересный факт. Сохранил переданный чертеж в формате AutoCAD 2013 (чтобы его можно было открыть в Civil 3d 2016). Хотя данные Civil'а должны были стать proxy, но ObjectData осталась и чертеж нормально открылся в Civil 3D 2016. И код с ним сработал:


Так что и в Civil 3D 2016 работает. Возможности у меня проверить в Civil 3D 2018 нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #69 : 26-11-2018, 20:37:44 »
Возможно, будет проще поставить ещё AutoCAD Civil 2016, раз такие дела

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Прошу помощи с кодом
« Ответ #70 : 26-11-2018, 21:51:11 »
Возможно, будет проще поставить ещё AutoCAD Civil 2016, раз такие дела
У Дмитрия с Civil 3D 2016 не заработало. Сложно сказать, что лучше.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Vlad_001Автор темы

  • ADN OPEN
  • Сообщений: 30
  • Карма: 0
Re: Прошу помощи с кодом
« Ответ #71 : 26-11-2018, 22:12:47 »
У меня тоже пока что никаких результатов.