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

ADN Club => VBA => Тема начата: Vlad_001 от 24-11-2018, 21:17:14

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

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

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

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

(https://i.postimg.cc/k2T1sMvh/1.jpg) (https://postimg.cc/k2T1sMvh)
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 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
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 24-11-2018, 21:26:26
Эти данные судя по всему ObjectData, которые есть в Civil 3D и Map 3D, но их нет (точнее к ним нет доступа) в чистом AutoCAD.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 24-11-2018, 21:39:10
Спасибо за пример с выборкой объекта.

Файлы, которые я загружаю с объектами, которые имеют те данные, имеют тип .mid и .mif. Всё, что могу сказать по этому поводу.
То есть через код я никак не смогу обратиться к тем данным?
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 24-11-2018, 21:40:42
То есть через код я никак не смогу обратиться к тем данным?
Сможете, но только в AutoCAD Civil 3D или в AutoCAD Map 3D. Это я уточняю.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 24-11-2018, 22:07:10
Не могу найти в Help что-нибудь по Object Data. Если бы я знал способы обращения к записям таблицы..
Есть только небольшой список команд работы с Object Data
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 24-11-2018, 23:10:05
Не могу найти в Help что-нибудь по Object Data.
Думаю, что не там ищешь. В AutoCAD Civil 3D этого в документации нет. Есть в AutoCAD Map 3D. Так что его придётся качать и устанавливать. Или качать и устанавливать ObjectARX Map 3D SDK. Но там есь документация только для C++ или VB.NET/C#.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 24-11-2018, 23:12:40
А в интернете подобного нет? Мне попадаются только англоязычные форумы.
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 24-11-2018, 23:17:24
А в интернете подобного нет?
Подобного - это какого?
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 24-11-2018, 23:19:57
Справку, как в обычном автокаде Help, с расписанными методами и свойствами. На сайте Autodesk только про команды пишут. Может я не там ищу?
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 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
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 24-11-2018, 23:42:13
Благодарю Вас. Думаю, что завтра будут результаты.
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 00:10:05
Благодарю Вас. Думаю, что завтра будут результаты.
Боюсь, что всё будет не так просто. Я установил AutoCAD Map 3D, но документации в нём нет. Так что переход на .NET придётся делать сразу и про VBA забыть.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 00:13:12
Буду импровизировать. :)
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 00:36:41
Буду импровизировать. :)
Я пока задал вопрос в ADN DevHelp где можно найти эту документацию, так как её не оказалось и в offline-документации. Это крайне странно.
Название: Re: Прошу помощи с кодом
Отправлено: trir от 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.         }
Название: Re: Прошу помощи с кодом
Отправлено: trir от 25-11-2018, 10:46:22
вот и доки (http://docs.autodesk.com/MAP/2014/ENU/Developer_Guides/index.html?url=filesMAP_GEO/GUID-295BB5A9-DA33-42C9-9C92-48764FBE96CD.htm,topicNumber=MAP_GEOd30e218), ещё (https://knowledge.autodesk.com/support/autocad-map-3d/getting-started/caas/simplecontent/content/map-3d-documentation.html)
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 11:33:01
trir,
И где ты здесь увидел VBA? Там только .NET.
Название: Re: Прошу помощи с кодом
Отправлено: trir от 25-11-2018, 11:58:52
VBA (https://forums.autodesk.com/t5/autocad-map-3d-forum/vba-data-checking-on-map-tables-and-data/td-p/630822)
куда дели файлы справки из Map 3D?
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 12:01:47
VBA (https://forums.autodesk.com/t5/autocad-map-3d-forum/vba-data-checking-on-map-tables-and-data/td-p/630822)
куда дели файлы справки из Map 3D?
Перечитай тему. Я этот вопрос задал в ADN DevHelp.
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 16:13:16
Нашел статью: Where to get the AutoCAD Map AutoLISP Reference (https://knowledge.autodesk.com/support/autocad-map-3d/learn-explore/caas/sfdcarticles/sfdcarticles/Where-to-get-the-AutoCAD-Map-AutoLISP-Reference.html)
Проверил, что в AutoCAD Map 3D 2012 API References (http://download.autodesk.com/us/support/files/autocad_map_3d_2012_api_references.zip?_ga=2.141626610.1385163752.1542310948-1744486056.1537302899) есть не только Lisp API, но и COM/AcriveX API (т.е. VBA).Это файл acmapatm.chm
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 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.         }

Это код на мою программу на С#?
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 16:45:43
Проверил, что в AutoCAD Map 3D 2012 API References есть не только Lisp API, но и COM/AcriveX API (т.е. VBA).Это файл acmapatm.chm
Большое спасибо, сейчас буду смотреть
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 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, но он пустой, как и все остальные разделы. Почему так?
Ни один файл не отображает информацию, только имена разделов есть.
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 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, но он пустой, как и все остальные разделы. Почему так?
Ни один файл не отображает информацию, только имена разделов есть.
Разблокируй сначала файл:

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

Цитировать
но он пустой, как и все остальные разделы. Почему так?
https://community.spiceworks.com/topic/1961503-solved-windows-10-chm-help-files-showing-up-blank
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 17:39:10
(https://i.postimg.cc/30H3LgXF/3.jpg) (https://postimg.cc/30H3LgXF)

АвтоКАД не хочет определять эти переменные. Что не так?
Вроде говорили, что Цивил должен определять типы данных из Мап 3Д
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 17:47:27
АвтоКАД не хочет определять эти переменные. Что не так?
Ты похоже не подключил:
(https://lh3.googleusercontent.com/-uCLtNXRLE2Q/W_q1333oZFI/AAAAAAAAPSs/MetlAtKzkhUV1KKnWGi2C6H2w64gezysQCHMYCw/s0/clipboard.png)


 
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 17:50:43
АвтоКАД не хочет определять эти переменные. Что не так?
Ты похоже не подключил:
(https://lh3.googleusercontent.com/-uCLtNXRLE2Q/W_q1333oZFI/AAAAAAAAPSs/MetlAtKzkhUV1KKnWGi2C6H2w64gezysQCHMYCw/s0/clipboard.png)

А где открывается данное окно?
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 17:51:49
(https://lh3.googleusercontent.com/-tQhaP1Y5Qyg/W_q28Z-InmI/AAAAAAAAPS0/AqomJrF0LUYzrev5aQOp6EgSaQ9hr0H1gCHMYCw/s0/clipboard2.png)

Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 18:06:59
Теперь мой ACAD понимает эти типы данных, но я всё равно не понимаю, как присвоить переменной запись "КН" и занести её в мультивыноску, которую мы потом вставим.
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 18:14:27
Теперь мой ACAD понимает эти типы данных
Замечательно.
но я всё равно не понимаю, как присвоить переменной запись "КН" и занести её в мультивыноску, которую мы потом вставим.
Раздели эту задачу на две.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 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.  

Не выходит считать саму запись
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 18:44:09
ResUn = returnObj.ODtb("Result_un")
Почему ты решил, что так должно работать?
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 18:48:38
ResUn = returnObj.ODtb("Result_un")
Почему ты решил, что так должно работать?
Примеры вчера смотрел с англоязычных форумов, по памяти написал, но скорее всего ошибся.
Название: Re: Прошу помощи с кодом
Отправлено: trir от 25-11-2018, 18:52:22
а зачем так замачиваться, когда есть аннотации?
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 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"
Чтобы было проще проверять - удали всё из чертежа кроме одной полилинии с этими данными.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 18:55:39
Set amap = ThisDrawing.Application. _
 
GetInterfaceObject("AutoCADMap.Application")
Ругается на синтаксис
Название: Re: Прошу помощи с кодом
Отправлено: trir от 25-11-2018, 19:06:39
Set amap = ThisDrawing.Application.GetInterfaceObject("AutoCADMap.Application")
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 20:25:11
Дома попробовал поработать с данным кодом, выдает фатальную ошибку. Больше код похож на создание таблицы, а не поиск нужного элемента. Просто не понимаю, почему ошибка вылетает?
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 20:56:41
Больше код похож на создание таблицы, а не поиск нужного элемента.
Совершенно не похож.
Просто не понимаю, почему ошибка вылетает?
Я тоже. Как минимум запусти в режиме отладки пошагово и посмотри на чем вылетает.
Название: Re: Прошу помощи с кодом
Отправлено: trir от 25-11-2018, 21:16:42
вылетает если boolVal = False
код обходит все примитивы в моделе и читает их OD, а OD нет - вылетеат
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 21:26:36
Так у меня-то в чертеже есть тот самый OD:Result_Un
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 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.
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 21:44:00
Так у меня-то в чертеже есть тот самый OD:Result_Un
Но у тебя есть и примитивы без неё. Вот на них похоже и вылет. Поэтому я еще добавил проверку:
Код - Visual Basic [Выбрать]
  1.         If boolVal = True Then
Off-Topic: показать
P.S.: Похоже пока ты очень далёк от программирования...
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 21:53:13

(https://i.postimg.cc/gXR8qzmf/3.jpg) (https://postimg.cc/gXR8qzmf)

Попробовал несколько раз.
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 21:54:33
Попробовал несколько раз.
Где пошаговая отладка? На какой строке вылет?
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 22:15:26
Код - Visual Basic [Выбрать]
  1.  Set amap = ThisDrawing.Application.GetInterfaceObject("AutoCADMap.Application")

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

А нельзя ли эти данные из Result_un взять с помощью GetXData?
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 22:21:38
А нельзя ли эти данные из Result_un взять с помощью GetXData?
Нет. Они не в XData. Если бы было всё так просто, то оно работало бы в чистом AutoCAD.
На этой строке всё прекращается и выскакивает ошибка.
Ну это совсем плохо. Тут я тебе не помогу. Или проблема с инсталляцией или с Windows. В чем ты проверяешь? В Civil 3D или в Map 3D? В какой версии? Из какой версии подключал в References?
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 22:25:41
Дома у меня Win 7. Проверяю в Civil 3D 2018. В References нашел только Autodesk Map 3D 2005. Могу скинуть вам тестовый файл с одним объектом только в личку. Может это что-то даст
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 22:32:43
В References нашел только Autodesk Map 3D 2005.
Думаю что без установки Map 3D 2018 ничего не будет. Но лучше не лезть в дебри и забыть про VBA. Думаю не зря Autodesk'овцы не дают документацию для VBA в последних версиях. Скорее всего оно не работает. Не вижу за последние лет 10 чтобы кто-то использовал VBA в Map 3D.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 22:35:01
Изучить C# и написать на нём? А это поможет с моим-то Civil'ом?
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 22:36:06
Изучить C# и написать на нём? А это поможет с моим-то Civil'ом?
Да. Это должно сразу нормально работать с Civil'е
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 25-11-2018, 22:38:09
Вернусь с результатами или с вопросами.  ;D
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 23:06:05
На виртуальной машине у меня только Civil 3D 2016 и поставить Civil 3D 2018 сейчас возможности нет. Проверил с ним:
(https://lh3.googleusercontent.com/-HZ7S1ht5h0g/W_sAI0-6EUI/AAAAAAAAPTE/bXYeRBLeXG4dbwamD1smmXlcS76dIjfkQCHMYCw/s0/clipboard3.png)

Фаталов никаких нет. Впрочем и проекта на котором можно проверить у меня нет.
Название: Re: Прошу помощи с кодом
Отправлено: trir от 25-11-2018, 23:29:45
Цитировать
Нет. Они не в XData. Если бы было всё так просто, то оно работало бы в чистом AutoCAD.
я видел lisp'ы которые это делали и без Map API, но это ещё тот гемор...
примерно как с динамическими блоками работать на прямую...
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 25-11-2018, 23:32:39
я видел lisp'ы которые это делали и без Map API, но это ещё тот гемор...
примерно как с динамическими блоками работать на прямую...
Ну тогда точно не VBA, так с его помощью нельзя получить dxf-коды объекта. Т.е. это или lisp, или arx, или .NET через P/Invoke
Но если бы был пример чертежа, то я попробовал бы на него взглянуть. Например, через ARXDBG/MGDDBG.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 26-11-2018, 12:15:41
Впрочем и проекта на котором можно проверить у меня н
Я выслал Вам на почту тестовый файл. Если не трудно, проверьте, может это только у меня фатальная ошибка вылетает?
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 26-11-2018, 16:11:56
Впрочем и проекта на котором можно проверить у меня н
Я выслал Вам на почту тестовый файл. Если не трудно, проверьте, может это только у меня фатальная ошибка вылетает?
У меня не только не вылетает, но и получил результат (в AutoCAD Map 3d 2019):
(https://lh3.googleusercontent.com/-R1lNdjpNPME/W_vwuQFkStI/AAAAAAAAPTU/p4AcdkAPlUwEv3ClhhkFxx2WzsPcPt0hQCHMYCw/s0/clipboard.png)

Использовал слегка модифицированный код:
Код - 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
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 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")

(https://lh3.googleusercontent.com/-4upCeY750Cg/W_wiilqVrPI/AAAAAAAAPTo/4FB-tCuYprwiyxqAuK9g3bWJUFHX2ju5wCHMYCw/s0/clipboard2.png)

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



 
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 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")

(https://lh3.googleusercontent.com/-4upCeY750Cg/W_wiilqVrPI/AAAAAAAAPTo/4FB-tCuYprwiyxqAuK9g3bWJUFHX2ju5wCHMYCw/s0/clipboard2.png)

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

Значит с моим AutoCAD Civil 2018 такой номер не пройдет. Очень жаль, но спасибо, что помогли написать код. Думаю, что скоро перейду на 2019
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 26-11-2018, 19:50:30
Значит с моим AutoCAD Civil 2018 такой номер не пройдет. Очень жаль, но спасибо, что помогли написать код. Думаю, что скоро перейду на 2019
Мы не оставили надежды разобраться в чем дело.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 26-11-2018, 19:51:42
Возможно, что решение для 2018 Civil 3D ещё есть?
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 26-11-2018, 19:52:36
Возможно, что решение для 2018 Civil 3D ещё есть?
Решение с .NET (C#/VB.NET) однозначно должно быть.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 26-11-2018, 19:54:15
Ещё бы внедрить C# в АutoCAD
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 26-11-2018, 19:55:17
Ещё бы внедрить C# в АutoCAD
Ты имеешь в виду Visual Studio? Нет. С этим ничего не будет.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 26-11-2018, 19:56:50
Я клоню к тому, что пока не знаю, как установить среду в АвтоКад для  C#. Или она есть уже в нём?
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 26-11-2018, 19:59:24
Я клоню к тому, что пока не знаю, как установить среду в АвтоКад для  C#. Или она есть уже в нём?
Там не нужна среда. Ставишь Visual Studio 2015 или 2017. Результат компиляции - dll-файл, который грузится в AutoCAD командой NETLOAD или еще парочкой способов.
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 26-11-2018, 20:35:26
Обнаружил еще один интересный факт. Сохранил переданный чертеж в формате AutoCAD 2013 (чтобы его можно было открыть в Civil 3d 2016). Хотя данные Civil'а должны были стать proxy, но ObjectData осталась и чертеж нормально открылся в Civil 3D 2016. И код с ним сработал:
(https://lh3.googleusercontent.com/-CDF-aN9yqzY/W_wszSDlYsI/AAAAAAAAPT0/XbGn9DW3F1UomZSoqlBgdzH5OoDlhxL8ACHMYCw/s0/clipboard3.png)

Так что и в Civil 3D 2016 работает. Возможности у меня проверить в Civil 3D 2018 нет.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 26-11-2018, 20:37:44
Возможно, будет проще поставить ещё AutoCAD Civil 2016, раз такие дела
Название: Re: Прошу помощи с кодом
Отправлено: Александр Ривилис от 26-11-2018, 21:51:11
Возможно, будет проще поставить ещё AutoCAD Civil 2016, раз такие дела
У Дмитрия с Civil 3D 2016 не заработало. Сложно сказать, что лучше.
Название: Re: Прошу помощи с кодом
Отправлено: Vlad_001 от 26-11-2018, 22:12:47
У меня тоже пока что никаких результатов.