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

31/10/2021

Как обеспечить синхронизацию AcDbMLeader с его стилем AcDbMLeaderStyleАвтор: Александр Ривилис

Вопрос: Если создавать мультивыноску (класс AcDbMLeader) при помощи команды _MLEADER, то эта мультивыноска будет следовать изменениям в её стиле мультивыноски (класс AcDbMLeaderStyle). А если создавать при помощи кода, то мультивыноска не следует за изменениями в стиле мултивыноски. Почему? И как сделать, чтобы поведение созданной программно мультивыноски было такой же, что и у созданной в команде _MLEADER?

Ответ: Для того, чтобы сделать такое поведение необходимо выполнить два условия:

1) Необходимо вызвать метод AcDbMLeader::setOverride с параметром isOverride == false (это значит, что параметр не переопределён в мултивыноске и используется тот, который в стиле мультивыноски) и параметром propertyType соответствующим тому свойству, которое должно браться из стиля мультивыноски. Вызывать этот метод можно несколько раз с разными значениями propertyType.

2) Необходимо вызвать метод AcDbMLeaderStyle::addPersistentReactor для того, чтобы добавить AcDbMLeader::objectId() к стилю мультивыноски, чтобы стиль был в курсе какие мультивыноски следует обновлять.

Опубликовано 31.10.2021     Читать далее >>>
11/07/2021

Удаление выбранных примитивов из групп, в которых они содержатсяАвтор: Александр Ривилис

Вопрос: Как средствами ObjectARX можно удалить выбранные примитивы из групп, в которых они содержатся?

Ответ: Для этого в первую очередь необходимо отключить групповой выбор (PICKSTYLE должно быть равно 0 или 2), чтобы можно было выбирать отдельные примитивы из групп. Ниже приведен код, позволяющий удалять выбранные примитивы из групп:

Опубликовано 11.07.2021     Читать далее >>>
06/07/2021

Как выполнить расчленение группы примитивов при помощи ObjectARXАвтор: Александр Ривилис

Следующий код показывает как можно расчленить группу, заданную её именем:
Опубликовано 06.07.2021     Читать далее >>>
11/04/2021

Как подсветить примитив внутри блока или внешней ссылкиАвтор: Александр Ривилис

Вопрос: Для того чтобы подсветить примитив в текущем пространстве (Модели или Листа) достаточно воспользоваться методом AcDbEntity::highlight(). А как подсветить примитив, который находится в составе блока (возможно вложенного блока) или во внешней ссылке?

Ответ: Для этой цели следует воспользоваться методом AcDbEntity::highlight(AcDbFullSubentPath& subId), предварительно создав правильный AcDbFullSubentPath.

Опубликовано 11.04.2021     Читать далее >>>
28/01/2021

Команда для конвертации 3D-модели AutoCAD в DWFX

Было внутреннее обсуждение возможности использования 3DDWF в скриптах. В настоящий момент команда 3DDWF вызывает диалог выбора имени файла для сохранения экспортируемой модели. Этот диалог препятствует выполнению скриптов, содержащих команду 3DDWF. Хотелось бы иметь команду, которая бы выполняла функцию экспорта без диалога в скрипте. Ниже код который использует технику получения адреса экспортируемой функции (getSymbolAddress ) из динамически линкуемой библиотеки (DLL) и вызывает её с параметром – именем файла для экспорта. Это выгляди так:

Опубликовано 28.01.2021     Читать далее >>>
28/01/2021

Как определить включен ли режим крупных кнопок панелей инструментов?Автор: Александр Ривилис

Как определить включен ли режим крупных кнопок панелей инструментов?

Вопрос: Как определить включен ли режим крупных кнопок панелей инструментов?

Ответ: Для этой цели следует воспользоваться COM/ActiveX моделью AutoCAD. С помощью ObjectARX/C++ это будет выглядеть так:

Опубликовано 28.01.2021     Читать далее >>>
26/10/2020

Как обновить информацию в командной строке AutoCAD?Автор: Александр Ривилис

Вопрос: В процессе длительного выполнения кода необходимо обновлять информацию в командной строке AutoCAD (например, процент выполнения). В старых версиях AutoCAD достаточно было вызвать acedPrompt(L""). Начиная с AutoCAD 2015 это не помогает.

Ответ: По-прежнему в последних версиях AutoCAD lisp-выражение (princ) позволяет обновить содержимое командной строки. В ObjectARX для этой цели приходится использовать недокументированную функцию adsi_flushcommandline(). При этом следует учитывать, что для обновления интерфейса AutoCAD ему необходимо дать возможность обработать свои сообщения. Для этой цели можно воспользоваться такой функцией:

Опубликовано 26.10.2020     Читать далее >>>
14/09/2020

Установка «Показать область печати» с помощью API

Когда вы создаёте новый лист новые Параметры Листа называются *ЛистN*

На листе вы видите область печати, которая отмечена штриховым прямоугольником:

Опубликовано 14.09.2020     Читать далее >>>
20/05/2020

Как задать в всплывающих подсказках жирный шрифт?Автор: Александр Ривилис

Вопрос: Недавно на форуме мне задали вопрос о том как можно управлять шрифтом в окне всплывающих подсказок при наведении курсора на примитив?

Ответ: Я начал исследование с этой статьи: https://adndevblog.typepad.com/autocad/2013/03/formatting-in-rollover-tip.html

При анализе её вскрылись некоторые интересные моменты. AutoCAD использует WPF (а точнее XAML) для показа таких всплывающих подсказок. В тексте подсказок можно использовать встроенные теги: <Bold> (для жирного шрифта), <Italic> (для наклонного шрифта), <Underline> (подчеркнутый шрифт) и <Hyperlink> (гиперссылка). Но не всё так просто. AutoCAD использует конструкцию вида:

Опубликовано 20.05.2020     Читать далее >>>
16/04/2020

Что нового в AutoCAD 2021 и в различных AutoCAD API?Автор: Александр Ривилис

Что нового в AutoCAD 2021 и в различных AutoCAD API?
Опубликовано 16.04.2020     Читать далее >>>
03/04/2020

ObjectARX 2021: Ошибки линковки с VS 2019

Вопрос: При линковке приложения, которое нормально компилировалось и линковалось с ObjectARX SDK 2020, мы получаем ошибки линковки.

Ответ: Код примитивов AutoCAD для 3D-моделирования (AcDbSubDMesh, AcDb3dSolid, AcDbRegion, AcDbAsmBody, AcDbShape и т.д.) сейчас перенесён в новую библиотеку AcGeomEnt.lib и соответственно требуется линковка с этой библиотекой, находящейся в каталоге <SDK>\lib-x64\

Опубликовано 03.04.2020     Читать далее >>>
31/03/2020

Где можно найти файл AsdkHlrApi24.dbx

Начиная с AutoCAD 2021 этот модуль удалён из ObjectARX SDK-овской директории Redist и включен как часть в AutoCAD 2021.
Опубликовано 31.03.2020     Читать далее >>>
15/03/2019

Как управлять статусом показа диалогового окна размера текста OLEАвтор: Александр Ривилис

При вставке OLE объекта в чертеж AutoCAD может появляться или не появляться диалоговое окно установки размера текста OLE. Управляется статус показа этого окна в команде НАСТРОЙКА (_OPTIONS). А как можно управлять этим статусом из программы на ObjectARX? Это можно делать двумя способами – используя COM/ActiveX модель AutoCAD используя свойство Application.Preferences.System.DisplayOLEScale Но это несколько громоздко в случае если arx-приложение вообще не использует COM. Есть и второй способ использующий функцию acedSetEnv
Опубликовано 15.03.2019     Читать далее >>>
27/02/2019

Как проверить, что при редактировании XREF он сохранён или отвергнут

Когда пользователь редактирует внешнюю ссылку по месту, то невозможно определить сохранил ли он изменения или отверг их.

А что если вашей программе необходимо определиться сохранена ли внешняя ссылка или нет:

Опубликовано 27.02.2019     Читать далее >>>
19/01/2019

Как из arx-приложения получить все загруженные в AutoCAD .NET-сборкиАвтор: Александр Ривилис

Как из arx-приложения получить все загруженные в AutoCAD .NET-сборки

Arx-приложение может быть native и mixed. В любом случае, чтобы получить все .NET-сборки нужно воспользоваться методом AppDomain:: GetAssemblies. Для mixed-кода это совсем просто:

Опубликовано 19.01.2019     Читать далее >>>
12/11/2018

Как определить, что lisp-функцию можно вызвать из arx-приложения?Автор: Александр Ривилис

Как определить, что lisp-функцию можно вызвать из arx-приложения?

Основное документированное средство для вызова lisp-функций из arx-приложения – это функция acedInvoke. Для того, чтобы ею воспользоваться необходимо одно из двух условий:

  1. Функция имеет имя вида C:XXX, т.е. имя аналогичное тому, как используется в AutoLisp для определения команды AutoCAD.
  2. Функция зарегистрирована при помощи lisp-функции (vl-acad-defun ‘имя_функции)

Как можно определить, что хотя бы одно из этих условий выполняется? Ниже приведён подробно документированный код:

Опубликовано 12.11.2018     Читать далее >>>
01/08/2018

Как сделать вставку точки в разрыв кривой?Автор: Александр Ривилис

Как сделать вставку точки в разрыв кривой?

На форуме мне задали вопрос о том, как можно эмулировать команду _BREAK и вставлять в разрыв точку? Ниже код, показывающий как используя метод getSplitCurves можно добиться результата.

Опубликовано 01.08.2018     Читать далее >>>
29/07/2018

Удаление границы штриховки

Класс AcDbHatch предоставляет методы для получения границ и для удаления границ. Каждая граница представляет собой так называемый цикл. С помощью методов класса AcDbHatch вы можете выполнять итерацию всех циклов. Затем вы можете получить все объекты, принадлежащие одному циклу. Все, что вам нужно сделать, это сравнить метки объектов цикла с меткой граничного объекта, который должен быть удален из объекта штриховки. Если у одного из объектов цикла есть дескриптор, который вы ищете, вы можете использовать AcDbHatch :: removeLoopAt (), чтобы удалить петлю из штриховки.

Следующая функция делает именно это. Параметр handleRemove является меткой примитива, принадлежащего к циклу, который следует удалить.

Опубликовано 29.07.2018     Читать далее >>>
27/07/2018

Создание штриховки и установка её масштаба

Вопрос:

Как можно создать штриховку и установить ей масштаб? Я написал функцию, которая создаёт штриховку. Но я обратил внимание, что она не в состоянии назначить масштаб штриховки и мне приходится это делать вручную. Почему это происходит?

Ответ:

Причина может быть в том, что вызов метода setPatternScale() происходит не в тот момент, когда это следует делать. Обратите внимание, что вы должны установить свойства штриховки, такие как угол, масштаб, ассоциативность и имя штриховки сразу же после создания AcDbHatch. После добавления границ штриховки вы можете установить другие свойства, такие как слой, цвет, стиль штриховки и т.д. Затем следует вызвать метод evaluateHatch() чтобы штриховка правильно отобразилась на экране. И после этого штриховку следует добавить к базе чертежа AutoCAD и закрыть. Следующий код показывает как это следует делать. Более детальную информацию можно найти в ObjectARX документации для класса AcDbHatch.

Опубликовано 27.07.2018     Читать далее >>>
27/07/2018

Ассоциативность AcDbHatch

После того как я создал объект штриховки, добавил его в базу, установил стиль и т.д. у неё нет ассоциативности к объектам границы. Чтобы сделать её ассоциативной нужно сделать объект штриховки постоянным реактором для примитивов, которые штрихуются. Следующий пример кода демонстрирует как создать штриховку и сделать её ассоциативной к примитивам её границы (прямоугольник и круг).
Опубликовано 27.07.2018     Читать далее >>>