какой метод предлагает пользователю выбрать только один объект, а не несколько, и можно ли это сделать без именного набора?Можно. Метод GetEntity:
То есть через код я никак не смогу обратиться к тем данным?Сможете, но только в AutoCAD Civil 3D или в AutoCAD Map 3D. Это я уточняю.
Не могу найти в Help что-нибудь по Object Data.Думаю, что не там ищешь. В AutoCAD Civil 3D этого в документации нет. Есть в AutoCAD Map 3D. Так что его придётся качать и устанавливать. Или качать и устанавливать ObjectARX Map 3D SDK. Но там есь документация только для C++ или VB.NET/C#.
А в интернете подобного нет?Подобного - это какого?
На сайте Autodesk только про команды пишут. Может я не там ищу?Здесь всё о программировании для 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.
Благодарю Вас. Думаю, что завтра будут результаты.Боюсь, что всё будет не так просто. Я установил AutoCAD Map 3D, но документации в нём нет. Так что переход на .NET придётся делать сразу и про VBA забыть.
Буду импровизировать. :)Я пока задал вопрос в ADN DevHelp где можно найти эту документацию, так как её не оказалось и в offline-документации. Это крайне странно.
VBA (https://forums.autodesk.com/t5/autocad-map-3d-forum/vba-data-checking-on-map-tables-and-data/td-p/630822)Перечитай тему. Я этот вопрос задал в ADN DevHelp.
куда дели файлы справки из Map 3D?
на VBA кажись тоже можно добраться до OD - я находил файл справки в самом Map 3DКод - C# [Выбрать]
public List<KeyValuePair<string, string>> GetParams(ObjectId id) { MapApplication mapApp = HostMapApplicationServices.Application; ProjectModel activeProject = mapApp.ActiveProject; OD.Tables tableList = activeProject.ODTables; OD.Table cTable; List<KeyValuePair<string, string>> rList = new List<KeyValuePair<string, string>>(); try { if (!id.IsErased) { using (OD.Records records = tableList.GetObjectRecords(0, id, OpenMode.OpenForRead, false)) { if (records.Count > 0) { OD.Record trec = records[0]; cTable = tableList[trec.TableName]; for (int i = 0; i < trec.Count; i++) { if (ATTRS_Dict.Keys.Contains(cTable.FieldDefinitions[i].Name)) { rList.Add(new KeyValuePair<string, string>(cTable.FieldDefinitions[i].Name, trec[i].StrValue)); } } } } } } catch (Exception ex) { } return rList; }
Проверил, что в AutoCAD Map 3D 2012 API References есть не только Lisp API, но и COM/AcriveX API (т.е. VBA).Это файл acmapatm.chmБольшое спасибо, сейчас буду смотреть
Нашел статью: Where to get the AutoCAD Map AutoLISP ReferenceСкачал zip-папку, нашел нужный файл и раздел Object Data, но он пустой, как и все остальные разделы. Почему так?
Проверил, что в AutoCAD Map 3D 2012 API References есть не только Lisp API, но и COM/AcriveX API (т.е. VBA).Это файл acmapatm.chm
Разблокируй сначала файл:Нашел статью: Where to get the AutoCAD Map AutoLISP ReferenceСкачал zip-папку, нашел нужный файл и раздел Object Data, но он пустой, как и все остальные разделы. Почему так?
Проверил, что в AutoCAD Map 3D 2012 API References есть не только Lisp API, но и COM/AcriveX API (т.е. VBA).Это файл acmapatm.chm
Ни один файл не отображает информацию, только имена разделов есть.
Это код на мою программу на С#?это пример чтения OD
но он пустой, как и все остальные разделы. Почему так?https://community.spiceworks.com/topic/1961503-solved-windows-10-chm-help-files-showing-up-blank
АвтоКАД не хочет определять эти переменные. Что не так?Ты похоже не подключил:
АвтоКАД не хочет определять эти переменные. Что не так?Ты похоже не подключил:
(https://lh3.googleusercontent.com/-uCLtNXRLE2Q/W_q1333oZFI/AAAAAAAAPSs/MetlAtKzkhUV1KKnWGi2C6H2w64gezysQCHMYCw/s0/clipboard.png)
Теперь мой ACAD понимает эти типы данныхЗамечательно.
но я всё равно не понимаю, как присвоить переменной запись "КН" и занести её в мультивыноску, которую мы потом вставим.Раздели эту задачу на две.
ResUn = returnObj.ODtb("Result_un")Почему ты решил, что так должно работать?
Примеры вчера смотрел с англоязычных форумов, по памяти написал, но скорее всего ошибся.ResUn = returnObj.ODtb("Result_un")Почему ты решил, что так должно работать?
Примеры вчера смотрел с англоязычных форумов, по памяти написал, но скорее всего ошибся.100% У AcadObject нет ни свойства, ни метода с именем ODtb
Set amap = ThisDrawing.Application. _Ругается на синтаксис
GetInterfaceObject("AutoCADMap.Application")
Больше код похож на создание таблицы, а не поиск нужного элемента.Совершенно не похож.
Просто не понимаю, почему ошибка вылетает?Я тоже. Как минимум запусти в режиме отладки пошагово и посмотри на чем вылетает.
Так у меня-то в чертеже есть тот самый OD:Result_UnНо у тебя есть и примитивы без неё. Вот на них похоже и вылет. Поэтому я еще добавил проверку:
Попробовал несколько раз.Где пошаговая отладка? На какой строке вылет?
А нельзя ли эти данные из Result_un взять с помощью GetXData?Нет. Они не в XData. Если бы было всё так просто, то оно работало бы в чистом AutoCAD.
На этой строке всё прекращается и выскакивает ошибка.Ну это совсем плохо. Тут я тебе не помогу. Или проблема с инсталляцией или с Windows. В чем ты проверяешь? В Civil 3D или в Map 3D? В какой версии? Из какой версии подключал в References?
В References нашел только Autodesk Map 3D 2005.Думаю что без установки Map 3D 2018 ничего не будет. Но лучше не лезть в дебри и забыть про VBA. Думаю не зря Autodesk'овцы не дают документацию для VBA в последних версиях. Скорее всего оно не работает. Не вижу за последние лет 10 чтобы кто-то использовал VBA в Map 3D.
Изучить C# и написать на нём? А это поможет с моим-то Civil'ом?Да. Это должно сразу нормально работать с Civil'е
Нет. Они не в XData. Если бы было всё так просто, то оно работало бы в чистом AutoCAD.я видел lisp'ы которые это делали и без Map API, но это ещё тот гемор...
я видел lisp'ы которые это делали и без Map API, но это ещё тот гемор...Ну тогда точно не VBA, так с его помощью нельзя получить dxf-коды объекта. Т.е. это или lisp, или arx, или .NET через P/Invoke
примерно как с динамическими блоками работать на прямую...
Впрочем и проекта на котором можно проверить у меня нЯ выслал Вам на почту тестовый файл. Если не трудно, проверьте, может это только у меня фатальная ошибка вылетает?
У меня не только не вылетает, но и получил результат (в AutoCAD Map 3d 2019):Впрочем и проекта на котором можно проверить у меня нЯ выслал Вам на почту тестовый файл. Если не трудно, проверьте, может это только у меня фатальная ошибка вылетает?
Совместно с Дмитрий Загорулькин провели исследование. В версиях 2016, 2017, 2018 нам не удалось заставить работать код. В AutoCAD Map 3d 2019 (у меня) и в AutoCAD Civil 3d 2019 (у Дмитрия) - работает.
Вот такая ошибка на строке:Код - Visual Basic [Выбрать]
Set amap = ThisDrawing.Application.GetInterfaceObject("AutoCADMap.Application")
(https://lh3.googleusercontent.com/-4upCeY750Cg/W_wiilqVrPI/AAAAAAAAPTo/4FB-tCuYprwiyxqAuK9g3bWJUFHX2ju5wCHMYCw/s0/clipboard2.png)
С путями доступа к файлу вроде всё в порядке.
Значит с моим AutoCAD Civil 2018 такой номер не пройдет. Очень жаль, но спасибо, что помогли написать код. Думаю, что скоро перейду на 2019Мы не оставили надежды разобраться в чем дело.
Возможно, что решение для 2018 Civil 3D ещё есть?Решение с .NET (C#/VB.NET) однозначно должно быть.
Ещё бы внедрить C# в АutoCADТы имеешь в виду Visual Studio? Нет. С этим ничего не будет.
Я клоню к тому, что пока не знаю, как установить среду в АвтоКад для C#. Или она есть уже в нём?Там не нужна среда. Ставишь Visual Studio 2015 или 2017. Результат компиляции - dll-файл, который грузится в AutoCAD командой NETLOAD или еще парочкой способов.
Возможно, будет проще поставить ещё AutoCAD Civil 2016, раз такие делаУ Дмитрия с Civil 3D 2016 не заработало. Сложно сказать, что лучше.