Objectarx как установить в автокад
Автор:
Приложения ObjectARX должны быть загружены перед использованием любой из определенных в них команд или функций.
Имеется возможность загрузки приложения ObjectARX, используя один из следующих подходов:
- Параметр "Загрузить" команды ARX или команда ЗАГПРИЛ с указанием вручную, какие приложения ObjectARX требуется загрузить
- Список автозагрузки команды ЗАГПРИЛ для автоматической загрузки файла ObjectARX
- Функция AutoLISP arxload с указанием, какие приложения ObjectARX требуется загрузить
Автоматическая загрузка приложений ObjectARX
Некоторые приложения ObjectARX используют файл acad.rx, в котором содержится список файлов приложения ObjectARX, автоматически загружаемых при запуске AutoCAD.
Для создания и редактирования этого файла можно использовать любой текстовый редактор или текстовый процессор, который сохраняет тексты в формате ASCII. При необходимости этот файл можно изменять, удаляя неиспользуемые или добавляя нужные имена ObjectARX-приложений. Кроме того, перечень приложений для автоматической загрузки можно выбрать с помощью параметра ЗАГПРИЛ. В последнем случае редактирование файлов не требуется.
Так как в программных продуктах на основе AutoCAD поиск файла acad.rx производится в порядке, заданном в стандартных библиотечных путях, в каждой папке с чертежами можно хранить свой файл acad.rx. Это позволяет загружать требуемый набор ObjectARX приложений для различных типов чертежей. Пусть, например, трехмерные чертежи хранятся в папке с именем AcadJobs/3d_dwgs. Если эта папка установлена текущей, в нее можно скопировать файл acad.rx и внести в него следующие изменения:
Если поместить новый файл acad.rx в папку AcadJobs/3d_dwgs, задать эту папку в качестве текущей и запустить программу, указанные приложения ObjectARX загружаются и становятся доступными из командной строки AutoCAD. Поскольку исходный файл acad.rx остается в папке программных файлов AutoCAD, файл по умолчанию acad.rx будет загружен при запуске программы из другой папки, в которой отсутствует файл acad.rx.
С помощью функции arxload приложения ObjectARX можно загружать из MNL-файлов. Это позволяет при загрузке файла меню также загружать все необходимые ObjectARX-приложения, которые должны вызываться из данного меню.
Загрузка приложения ObjectARX с помощью AutoLISP
Синтаксис функции arxload во многом идентичен синтаксису функции load , используемой для работы с AutoLISP-файлами. При успешной загрузке приложения ObjectARX функция arxload возвращает имя программы. Вызов функции arxload имеет следующий синтаксис:
Функция arxload имеет два аргумента имя_файла и при_ошибке . Как и у функции load , аргумент имя_файла является обязательным и должен представлять собой полный путь и имя файла загружаемого приложения ObjectARX. Аргумент при_ошибке является необязательным и при загрузке приложений ObjectARX из командной строки, как правило, опускается. В следующем примере производится загрузка приложения ObjectARX myapp.arx.
Как и в случае с файлами AutoLISP, программа производит поиск указанного файла по библиотечному пути поиска. Для загрузки файла, находящегося вне папок, указанных в библиотечном пути, требуется задание полного пути к нему.
Примечание Для разделения имен папок при вводе пути следует использовать одну прямую косую черту (/) или две обратных косых черты (\\). Это связано с тем, что в AutoLISP символ обратной косой черты (\\) имеет специальное назначение.Попытка повторной загрузки уже находящегося в памяти приложения приводит к появлению ошибки. Перед использованием arxload следует с помощью функции arx проверить, нет ли приложения в списке уже загруженных.
Для выгрузки приложения с помощью AutoLISP служит функция arxunload . На следующем примере можно посмотреть, как производится выгрузка приложения myapp.
Использование функции arxunload приводит к выгрузке из памяти не только приложения ObjectARX, но и определенных в нем команд.
Как обеспечить синхронизацию AcDbMLeader с его стилем AcDbMLeaderStyle Автор: Александр Ривилис
Вопрос: Если создавать мультивыноску (класс AcDbMLeader) при помощи команды _MLEADER, то эта мультивыноска будет следовать изменениям в её стиле мультивыноски (класс AcDbMLeaderStyle). А если создавать при помощи кода, то мультивыноска не следует за изменениями в стиле мултивыноски. Почему? И как сделать, чтобы поведение созданной программно мультивыноски было такой же, что и у созданной в команде _MLEADER?
Ответ: Для того, чтобы сделать такое поведение необходимо выполнить два условия:
1) Необходимо вызвать метод AcDbMLeader::setOverride с параметром isOverride == false (это значит, что параметр не переопределён в мултивыноске и используется тот, который в стиле мультивыноски) и параметром propertyType соответствующим тому свойству, которое должно браться из стиля мультивыноски. Вызывать этот метод можно несколько раз с разными значениями propertyType.
2) Необходимо вызвать метод AcDbMLeaderStyle::addPersistentReactor для того, чтобы добавить AcDbMLeader::objectId() к стилю мультивыноски, чтобы стиль был в курсе какие мультивыноски следует обновлять.
Удаление выбранных примитивов из групп, в которых они содержатся Автор: Александр Ривилис
Вопрос: Как средствами ObjectARX можно удалить выбранные примитивы из групп, в которых они содержатся?
Ответ: Для этого в первую очередь необходимо отключить групповой выбор (PICKSTYLE должно быть равно 0 или 2), чтобы можно было выбирать отдельные примитивы из групп. Ниже приведен код, позволяющий удалять выбранные примитивы из групп:
Как выполнить расчленение группы примитивов при помощи ObjectARX Автор: Александр Ривилис
Следующий код показывает как можно расчленить группу, заданную её именем:Как подсветить примитив внутри блока или внешней ссылки Автор: Александр Ривилис
Вопрос: Для того чтобы подсветить примитив в текущем пространстве (Модели или Листа) достаточно воспользоваться методом AcDbEntity::highlight(). А как подсветить примитив, который находится в составе блока (возможно вложенного блока) или во внешней ссылке?
Ответ: Для этой цели следует воспользоваться методом AcDbEntity::highlight(AcDbFullSubentPath& subId), предварительно создав правильный AcDbFullSubentPath.
Команда для конвертации 3D-модели AutoCAD в DWFX
Было внутреннее обсуждение возможности использования 3DDWF в скриптах. В настоящий момент команда 3DDWF вызывает диалог выбора имени файла для сохранения экспортируемой модели. Этот диалог препятствует выполнению скриптов, содержащих команду 3DDWF. Хотелось бы иметь команду, которая бы выполняла функцию экспорта без диалога в скрипте. Ниже код который использует технику получения адреса экспортируемой функции (getSymbolAddress ) из динамически линкуемой библиотеки (DLL) и вызывает её с параметром – именем файла для экспорта. Это выгляди так:
Как определить включен ли режим крупных кнопок панелей инструментов? Автор: Александр Ривилис
Как определить включен ли режим крупных кнопок панелей инструментов?
Вопрос: Как определить включен ли режим крупных кнопок панелей инструментов?
Ответ: Для этой цели следует воспользоваться COM/ActiveX моделью AutoCAD. С помощью ObjectARX/C++ это будет выглядеть так:
Как обновить информацию в командной строке AutoCAD? Автор: Александр Ривилис
Вопрос: В процессе длительного выполнения кода необходимо обновлять информацию в командной строке AutoCAD (например, процент выполнения). В старых версиях AutoCAD достаточно было вызвать acedPrompt(L""). Начиная с AutoCAD 2015 это не помогает.
Установка «Показать область печати» с помощью API
Когда вы создаёте новый лист новые Параметры Листа называются *ЛистN*
На листе вы видите область печати, которая отмечена штриховым прямоугольником:
Как задать в всплывающих подсказках жирный шрифт? Автор: Александр Ривилис
Вопрос: Недавно на форуме мне задали вопрос о том как можно управлять шрифтом в окне всплывающих подсказок при наведении курсора на примитив?
При анализе её вскрылись некоторые интересные моменты. AutoCAD использует WPF (а точнее XAML) для показа таких всплывающих подсказок. В тексте подсказок можно использовать встроенные теги: <Bold> (для жирного шрифта), <Italic> (для наклонного шрифта), <Underline> (подчеркнутый шрифт) и <Hyperlink> (гиперссылка). Но не всё так просто. AutoCAD использует конструкцию вида:
Что нового в AutoCAD 2021 и в различных AutoCAD API? Автор: Александр Ривилис
Что нового в AutoCAD 2021 и в различных AutoCAD API?ObjectARX 2021: Ошибки линковки с VS 2019
Вопрос: При линковке приложения, которое нормально компилировалось и линковалось с ObjectARX SDK 2020, мы получаем ошибки линковки.
Ответ: Код примитивов AutoCAD для 3D-моделирования (AcDbSubDMesh, AcDb3dSolid, AcDbRegion, AcDbAsmBody, AcDbShape и т.д.) сейчас перенесён в новую библиотеку AcGeomEnt.lib и соответственно требуется линковка с этой библиотекой, находящейся в каталоге <SDK>\lib-x64\
Где можно найти файл AsdkHlrApi24.dbx
Начиная с AutoCAD 2021 этот модуль удалён из ObjectARX SDK-овской директории Redist и включен как часть в AutoCAD 2021.Как управлять статусом показа диалогового окна размера текста OLE Автор: Александр Ривилис
При вставке OLE объекта в чертеж AutoCAD может появляться или не появляться диалоговое окно установки размера текста OLE. Управляется статус показа этого окна в команде НАСТРОЙКА (_OPTIONS). А как можно управлять этим статусом из программы на ObjectARX? Это можно делать двумя способами – используя COM/ActiveX модель AutoCAD используя свойство Application.Preferences.System.DisplayOLEScale Но это несколько громоздко в случае если arx-приложение вообще не использует COM. Есть и второй способ использующий функцию acedSetEnvКак проверить, что при редактировании XREF он сохранён или отвергнут
Когда пользователь редактирует внешнюю ссылку по месту, то невозможно определить сохранил ли он изменения или отверг их.А что если вашей программе необходимо определиться сохранена ли внешняя ссылка или нет:
Как определить, что lisp-функцию можно вызвать из arx-приложения? Автор: Александр Ривилис
Как определить, что lisp-функцию можно вызвать из arx-приложения?
Основное документированное средство для вызова lisp-функций из arx-приложения – это функция acedInvoke. Для того, чтобы ею воспользоваться необходимо одно из двух условий:
Как можно определить, что хотя бы одно из этих условий выполняется? Ниже приведён подробно документированный код:
Как сделать вставку точки в разрыв кривой? Автор: Александр Ривилис
Как сделать вставку точки в разрыв кривой?
На форуме мне задали вопрос о том, как можно эмулировать команду _BREAK и вставлять в разрыв точку? Ниже код, показывающий как используя метод getSplitCurves можно добиться результата.
Удаление границы штриховки
Класс AcDbHatch предоставляет методы для получения границ и для удаления границ. Каждая граница представляет собой так называемый цикл. С помощью методов класса AcDbHatch вы можете выполнять итерацию всех циклов. Затем вы можете получить все объекты, принадлежащие одному циклу. Все, что вам нужно сделать, это сравнить метки объектов цикла с меткой граничного объекта, который должен быть удален из объекта штриховки. Если у одного из объектов цикла есть дескриптор, который вы ищете, вы можете использовать AcDbHatch :: removeLoopAt (), чтобы удалить петлю из штриховки.
Следующая функция делает именно это. Параметр handleRemove является меткой примитива, принадлежащего к циклу, который следует удалить.
Создание штриховки и установка её масштаба
Вопрос:
Как можно создать штриховку и установить ей масштаб? Я написал функцию, которая создаёт штриховку. Но я обратил внимание, что она не в состоянии назначить масштаб штриховки и мне приходится это делать вручную. Почему это происходит?
Ответ:
Причина может быть в том, что вызов метода setPatternScale() происходит не в тот момент, когда это следует делать. Обратите внимание, что вы должны установить свойства штриховки, такие как угол, масштаб, ассоциативность и имя штриховки сразу же после создания AcDbHatch. После добавления границ штриховки вы можете установить другие свойства, такие как слой, цвет, стиль штриховки и т.д. Затем следует вызвать метод evaluateHatch() чтобы штриховка правильно отобразилась на экране. И после этого штриховку следует добавить к базе чертежа AutoCAD и закрыть. Следующий код показывает как это следует делать. Более детальную информацию можно найти в ObjectARX документации для класса AcDbHatch.
Мастер ObjectARX
В состав пакета ObjectARX входит Мастер ObjectARX —специальная программа, которая после ее установки в среду разработки Visual C предоставляет пользователю дополнительную панель инструментов, облегчающую процесс создания приложений.
Установка программы
Для установки Мастера ObjectARX необходимо выполнить программу WizardSetup.exe, находящуюся в папке utils\ObjARXWiz. Если программы в папке нет, это означает, что вы еще не раскрыли архив, находящийся в самораспаковывающемся файле wizards.exe. Программа установки открывает начальное окно (рис. 1), в котором необходимо нажать кнопку Install (Установить).
Рис. 1. Начальное окно установки Мастера ObjectARX
После установки Мастера ObjectARX на вкладке Projects (Проекты) диалогового окна New (Новый) в списке типов проектов появится новая строка: ObjectARX 2000/2000i/2002 AppWizard.
Установка панели
После установки программы необходимо добавить к оболочке Visual C панель инструментов Мастера ObjectARX. Для этого следует выполнить следующие шаги:
- В меню Tools (Сервис) выбрать пункт Options (Настройки).
- В открывшемся окне Options (Настройки) выбрать вкладку Directories (Пути).
- На вкладке Directories (Пути) в раскрывающемся списке Show directories for (Показать пути для) установить Include files (Включаемые файлы).
- Добавить к списку путь к папке inc (например, d:\ObjectARX2002\inc) и переместить его наверх списка (рис. 2). Закрыть окно.
Рис. 2. Настройка путей для всех проектов
- В меню Tools (Сервис) выбрать пункт Customize (Адаптация).
- В открывшемся окне Customize (Адаптация) выбрать вкладку Add-ins and Macro Files (Файлы надстроек и макросов).
- В разделе Add-ins and macro files (Файлы надстроек и макросов) установить флажок слева от пункта ObjectARX 2000/2000i/2002 Add-In (Надстройка ObjectARX) (рис. 3) и нажать кнопку Close (Закрыть).
Рис. 3. Добавление надстройки ObjectARX
- На экране появится панель с названием по умолчанию (Toolbar1). Еще раз в меню Tools (Сервис) выбрать пункт Customize (Адаптация) и перейти на вкладку Toolbars (Панели).
- В разделе Toolbars (Панели) отметить панель Toolbar1. В расположенном внизу поле Toolbar name (Имя панели) ввести новое имя панели: Мастер ObjectARX. Закрыть окно, после чего на экране панель изменит свое название на новое (рис. 4).
В панель Мастер ObjectARX входят кнопки со следующими функциями:
— добавление заголовочных файлов с помощью диалогового окна ObjectARX Include (Включение ObjectARX);
— регистрация команд с помощью диалогового окна ObjectARX Defined Commands (Команды ObjectARX);
— работа с временными реакторами;
— создание классов пользовательских объектов;
— поддержка классов MFC;
— поддержка API;
— регистрация приложения;
— создание объектов ATL (Active Template Library);
— добавление компонент текста;
— получение справочной информации по ObjectARX;
— поиск кода;
— настройка конфигурации ObjectARX, подключение справочных chm-файлов.
Метод AcDbDatabase::loadLineTypeFile позволяет загрузить типы линий из lin-файла. Если в чертеже имеется одноименный тип линии, то метод loadLineTypeFile вернет код ошибки. Чтобы принудительно перезагрузить типы линий из lin-файла, нужно загрузить их в другую базу, а затем выполнить клонирование в текущую. Вот соответствующий код:
ObjectARX 2016 SDK уже доступен для загрузки
Как вы наверное слышали, уже вышел AutoCAD 2016. Прежде чем мы даже успели рассказать о новых функциях, мы получили вопрос: «Где мы можем получить последнюю версию ObjectARX? Её нет на сайте ADN …»
ObjectARX SDK 2016 выложен на общий сайт (или формально в Центр Разработки):
ObjectARX License & Download
Замечание: OMF (Object Modeling Framework), расширение C++ API SDK для AutoCAD Architecture будет выложено на сайт ADN для его членов в ближайшее время.
Теперь когда вы знаете где взять SDK, вот ссылки на англоязычные анонсы, включающие инструкции по загрузке для подписчиков и членов ADN (это второй общий вопрос, который мы получаем)
Блог "Between the Lines," автора Shaan Hurley:
Блог "Through the Interface" автора Kean Walmsley:
Они содержат отличное введение в новые возможности AutoCAD 2016.
Оставайтесь с нами чтобы не пропустить анонсы о новых возможностях API от экспертов AutoCAD API!
Создание прозрачного растра при помощи ATIL
Вот пример кода, который реализует собственный фильтр растра ATIL для создания прозрачного растра. Реализация устанавливает Альфа-канал для пикселей красного цвета в растре. Вы можете изменить код для использования любого другого значения RGB цвета.Программное добавление поля к тексту
Мы хотим знать как можно при помощи поля добавить к одному примитиву AcDbText содержимое другого примитива AcDbText.Доступ к AcGsView ассоциированному с видом
В версиях до AutoCAD 2015, функция acgsGetGsView давала доступ к AcGsView вида. В AutoCAD 2015 этой функции нет и она заменена двумя другими новыми: acgsGetCurrentAcGsView и acgsGetCurrent3dAcGsView. Следующий пример кода показывает в чем разница и как их использовать:
Получение информации обо всех системных переменных
В AutoCAD 2015 появилось новое API - AcEdSysVarIterator.
Класс “AcEdSysVarIterator” обеспечивает возможность пройтись по всем доступным системным переменным и получить их имена, типы данных, диапазоны (если доступны), значение «только для чтения» и где они хранятся.
Внимание: системные переменные, которые имеют флаг скрытости (т.е. "*" в качестве первого символа в имени) пропускаются этим итератором. В настоящее время мы можем получить всю информацию при помощи утилиты "SYSVDLG", включая скрытые системные переменные. Это API может пригодиться тем, кто хочет автоматизировать работу с системными переменными в клиентском приложении.
Получение упорядоченного набора ребер граней с использованием BRep
При перемещении по ребрам граней с использованием BRep API, ребра могут быть не упорядочены так, чтобы конечная точка предыдущего ребра совпадала с начальной точкой следующего ребра. Это происходит потому, что ребра разделяются между несколькими гранями, и это же ребро возвращается, когда мы снова проходим по другой грани. Так как начальные и конечные точки ребра остаются неизменными, то это будет признаком ориентации одной из граней.
Получение значений свойств из COM-обертки примитива
Когда создаём AutoCAD-приложение, достаточно просто получить свойства примитива без использования COM-обертки примитива. Но когда создается приложение RealDWG, может быть необходимым получить свойства примитива именно из COM-обертки.
Если вы используете C++ вы можете таким образом изменить пример DumpDwg из RealDWG SDK. В этом примере мы получаем свойства примитива, используя интерфейс IDispatch его COM-обертки. Например, если чертеж содержит примитив "AsdkPoly" из примера "ObjectARX 2015\samples\entity\polysampPolySamp".
Используем геолокацию с помощью ObjectARX
Чтобы попробовать этот код, вы должны быть подписаны на использование Autodesk 360 внутри AutoCAD.
Ассоциация гиперссылки с BlockTableRecord
Просмотр нормалей к граням сети
Недавно я получил чертеж от одного из программистов, который содержал сеть (SubDMesh), созданную при помощи кода, использующего информацию о вершинах и гранях. В таких сетях нормали к граням зависят от порядка вершин, определяющих грани, так что нужно было убедиться, что с нормалями всё в порядке.В этом случае желательно было увидеть нормали к сети. Следующий код показывает как это сделать:
Прозрачность слоев в ObjectARX
Следующий код показывает процедуру изменения «прозрачности» слоя при помощи ObjectARX. Он устанавливает слою 0 прозрачность 60%. Чтобы на экране отобразились изменения требуется регенерация.
Разработка CRX приложений
Мы получили несколько общих вопросов от разработчиков использующих AcCoreConsole. Это два вопроса (и ответы любезно предоставленные членом нашей команды разработчиков AutoCAD) …Вопрос 1: Какие библиотеки ObjectARX я могу прилинковать к моей DLL для загрузки в AcCoreConsole (или другого AcCore-продукта, который Autodeskможет выпустить в будущем)?
Уведомление в элементе статусной строки
В ObjectARX 2004 SDK был прекрасный пример на C++, который добавлял элементы в статусную строку и показывал уведомления для одного из этих элементов. Я выполнил миграцию этого примера для работы с AutoCAD 2015 и полный проект можно скачать здесь:Создание 3DSolid из набора SubDMesh
Если у вас имеется коллекция subDMesh и вы хотите создать из неё 3DSolid, сначала нужно сконвертировать каждую из сетей в поверхность. Если поверхности вместе образуют замкнутый объём, тогда из них можно создать твердое тело. Ниже пример кода:
Совет по миграции: ACAD2011\12 в 13\14\15
Этот совет связан не только с ACAD, но и с перспективами Visual Studio и будет полезен всем, кто использует шаблон CMap, где ключом является AcDbHandle&CMap<AcDbHandle, AcDbHandle&, CString, CString> handleMap;
Сохранение порядка отрисовки примитивов при операции клонирования блоков
WblockClone API не гарантирует сохранение порядка отрисовки примитивов (DrawOrder) при клонировании блоков, т.к. операция WblockClone – это очень низкоуровневая операция, которая только копирует примитивы. Так что программисту придется самому позаботится о сохранении порядка отрисовки примитивов в блоке при его клонировании.Разрешение конфликта имён при связывании внешней ссылки
Недавно разработчик сообщил о странном поведении, при котором несколько примитивов исчезли после связывания внешней ссылки при помощи API. При анализе чертежа и внешних ссылок было установлено, что это странное поведение связано с тем, что блок с точно таким же именем присутствовал и в основном чертеже и в одной из внешних ссылок.Хотя определения блоков находились в разных файлах, но у них одно и тоже имя. Когда такая внешняя ссылка связывается с основным чертежом в качестве определения блока используется блок из основного чертежа.
Координаты точек в примитиве Облако точек
Для примитива PointCloud, созданного с использованием PCG файла, простейший способ для получения координат точек будет вставка пространственного фильтра при помощи метода acdbModifyPointCloudDataView. Для примитива PointCloud созданного из RCP файла, нужно вставить пространственный фильтр при помощи методаAcDbPointCloudEx::addSpatialFilter. Когда пространственный фильтр создан можно получить доступ ко всем координатам. Другой метод – использовать AcDbPointCloudEx::traverseAllPointData.Импортирование Палитры инструментов/Группы палитр из XTP/XPG файлов
Импортирование Палитры инструментов или Группы палитр инструментов из xtp и xpg файлов требует в AutoCAD взаимодействия с пользователем. Вот пример кода на ObjectARX для автоматизации этого. Часть кода получает информацию из xtp / xtg файлов при помощи чтения чистого XML документа. Этот код работает для простых файлов xtp и xpg, которые я использовал для тестов. Возможно потребуется дополнительная проверка и обработка ошибок в вашем конкретном случае.
Читайте также: