AutoCAD 2026.1.1: IAcSmEvents.OnChanged запускает код события 30 вместо ACSM_DATABASE_OPENED (16).C#

Место общения программистов C#
Ответить
Anonymous
 AutoCAD 2026.1.1: IAcSmEvents.OnChanged запускает код события 30 вместо ACSM_DATABASE_OPENED (16).

Сообщение Anonymous »

У меня есть расширение AutoCAD, которое подписывается на IAcSmEvents, поэтому оно знает, когда пользователь открывает набор листов .dst. В AutoCAD 2026.0 все работало нормально: обработчик получил ACSM_DATABASE_OPENED (значение перечисления 16) вместе с IAcSmPersist, GetDatabase() которого вернул открытую базу данных IAcSmDatabase.
После установки AutoCAD 2026.1.1 (обновление Диспетчера подключенных листов) тот же обработчик теперь получает событие с целым числом код 30. Этого значения нет в перечислении AcSmEvent, которое tlbimp генерирует из acsmcomComponents25.tlb в SDK ObjectARX 2026, а вызов GetDatabase() в IAcSmPersist вызывает исключение NullReferenceException. ACSM_DATABASE_OPENED никогда не срабатывает.
Поэтому мой вопрос ниже, после деталей воспроизведения.
Среда



Компонент
Работает
Не работает




Версия AutoCAD
2026.0
2026.1.1


Реализация SSM
Традиционная (на основе файлов)
Диспетчер подключенных подшивок (облако)


Целевая платформа
.NET 8 (

Код: Выделить всё

net8.0-windows
)
.NET 8 (

Код: Выделить всё

net8.0-windows
)


Платформа
x64
x64


Взаимодействие в acsmcomComponents25.tlb
то же самое



Обработчик
Вот полное тело моего переопределения OnChanged. Все, что он делает, это регистрирует событие и пытается получить базу данных. (

Код: Выделить всё

Log(...)
просто записывает строку в локальный файл, пропускается для краткости.)

Код: Выделить всё

public void OnChanged(AcSmEvent eventcode, IAcSmPersist comp)
{
int code = (int)eventcode;
string name = Enum.IsDefined(typeof(AcSmEvent), eventcode)
? eventcode.ToString()
: $"UNKNOWN({code})";

string dbInfo = "comp=null";
if (comp != null)
{
try
{
var db = comp.GetDatabase();
dbInfo = (db != null)
? $"db OK, class={db.GetClassID()}"
: "db=NULL";
}
catch (Exception ex)
{
dbInfo = $"db threw: {ex.GetType().Name}: {ex.Message}";
}
}

Log($"Event: {name} (code={code}), {dbInfo}");
}
Регистрация — это обычный вызов IAcSmSheetSetMgr.Register(handler) в IExtensionApplication.Initialize. Он возвращает ненулевой файл cookie, поэтому сама подписка явно работает — события приходят, но это не те события, которые я получал раньше.
Что я вижу
AutoCAD 2026.0 после запуска OPENSHEETSET на действительном .dst:

Код: Выделить всё

Event: ACSM_DATABASE_OPENED (code=16), db OK, class=106b0fb7-a9a0-47bf-8f47-a4d875feb079
AutoCAD 2026.1.1, та же операция с тем же .dst:

Код: Выделить всё

Event: UNKNOWN(30) (code=30), db threw: NullReferenceException: Object reference not set to an instance of an object.

Код: Выделить всё

ACSM_DATABASE_OPENED
и ACSM_DATABASE_LOAD_COMPLETE никогда не отправляются в 2026.1.1.
Что я пробовал
  • Проверил перечисление AcSmEvent, которое tlbimp создает из acsmcomComponents25.tlb в SDK ObjectARX 2026. Нет элемента со значением 30.
  • Пытался зарегистрировать обработчик как до, так и после того, как пользователь запускает OPENSHEETSET, а также с предварительным созданием экземпляра AcSmSheetSetMgrClass и без него. Результат всегда один и тот же.
  • Я думал, что ACSM_DATABASE_LOAD_COMPLETE может отображаться асинхронно после кода 30. Это не так.
  • Воспроизведено 24 апреля 2026 г. на двух разных установках 2026.1.1, так что это не только моя машина.
  • Прочитайте документацию ObjectARX и примечания AutoCAD 2026.1.1 «Что нового» для поиска любых упоминаний о миграции IAcSmEvents или новом контракте событий для Диспетчера подключенных подшивок. Ничего не нашел.
  • Искал на форумах сообщества Autodesk. Видимые пользователю регрессии в поведении SSM 2026.1.1 подтверждены (например, ветка C3D 2026.2 (ACAD 2026.1.1) и SSM на ACC, а также связанная с ней тема под названием «Диспетчер подшивок с Civil 3D 2026 против AutoCAD 2026.1.1» на том же форуме), но я ничего не нашел, говорящего о IAcSmEvents COM конкретно поверхность.
  • Я не ковырялся в самом comp, когда приходит код 30 (например, GetTypeName(), GetClassID()). Если эта информация поможет, я добавлю ее.
Полное автономное воспроизведение (.csproj в стиле SDK, сценарий сборки, журналы и снимки экрана из обеих версий) находится здесь: https://github.com/kaizenman/autocad-ss ... -reгрессия
Вопрос
По AutoCAD 2026.1.1 (с диспетчером подключенных подшивок), какой правильный API для получения уведомления об открытии файла .dst и получения результирующей базы данных IAcSmDatabase? IAcSmEvents.OnChanged теперь запускает код события 30 (нет в AcSmEvent), IAcSmPersist.GetDatabase() выдает NullReferenceException, а ACSM_DATABASE_OPENED больше не срабатывает.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»