Перейти к содержанию

Рекомендуемые сообщения

Уважаемые друзья, всем доброго дня!

 

Столкнулся с неприятной проблемой при попытке адаптировать написанное для AutoCAD ранее .NET-приложение под NanoCAD.

По всей видимости, есть определенная разница в API (как бы могло быть иначе) между этими САПР. А именно, проблема с тем, что многие классы и методы не реализованы, а вместо этого стоят «заглушки» - так, что ли? Кто-нибудь сталкивался с чем-то подобным? Нормальной документации по Nano20.1 SDK не нашел, и как будто в темноте черную кошку ищу, получается.


В частности, вот пример:
обычное объявление

static LayerTable lt;

В Нано дает одно, а в акаде другое (см. скриншоты).
Как говорится, то ли лыжи не едут... :wacko:

 

NanoCAD:

image.png.2784524491cd9f6947554cba0ef32abb.png

 

AutoCAD:

image.png.275bb75c55d21ac954d5770f15f252e8.png


Заранее всем спасибо!
 

Ссылка на сообщение
Поделиться на другие сайты

Приведите, пожалуйста, код, в котором получено значение lt.

Ссылка на сообщение
Поделиться на другие сайты

using (Transaction tr = db.TransactionManager.StartTransaction())
{
    var lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;

}

Ссылка на сообщение
Поделиться на другие сайты
8 минут назад, Robink сказал:

    var lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;

Почти :)

 

14 минут назад, ISL сказал:

Приведите, пожалуйста, код, в котором получено значение lt.

lt = tr.GetObject(dbSource.LayerTableId, OpenMode.ForRead) as LayerTable;

Собственно, Robink попал в точку :)

Ссылка на сообщение
Поделиться на другие сайты

Взял пример SDK HelloHost, добавил в команду HelloHost_Example1 строки:
 

Database db = HostApplicationServices.WorkingDatabase;

using (Transaction tr = db.TransactionManager.StartTransaction())
{
  var lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
}

 

Собрал в VS2012, загрузил в 20.1 x64:

 

LayerTableWatch.png

 

Что я делаю не так?

Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, ISL сказал:

Что я делаю не так?

 

Вы знаете, мне кажется, что это я что-то делаю не так...

Один и тот же (со своими библиотеками, само собой) код в автокаде отрабатывает, а в нанокаде - нет...

В момент закрытия транзакции в акаде значение lt остается в неизменном виде, а в нано - сразу после tr.Commit(); слетает, и выглядит, как у меня на скриншоте выше.

Ссылка на сообщение
Поделиться на другие сайты

Ну так это давно известно, что AutoCAD не соответствует своей собственной документации и рекомендациям по времени жизни объектов, которые живут дольше, чем должны. Но практика работы с большими приложениями, работающими под обеими платформами, показывает, что отказ от обращений к закрытым объектам повышает надёжность приложений. У нас всё просто: закрыли — значит закрыли, проблема видна сразу. В АвтоКАДе же такой код почти всегда работает, но иногда сборщик мусора приходит чуть раньше и начинаются блуждающие проблемы. Справедливо и для C++, где нет сборщика мусора, но эффект есть.

Ссылка на сообщение
Поделиться на другие сайты
14 минут назад, ISL сказал:

закрыли — значит закрыли

 

А Вы не могли бы дать совет, как вынести значение за пределы транзакции? :rolleyes:

Иначе переделывать код уж ооочень долго придётся... :stena:

Ссылка на сообщение
Поделиться на другие сайты
49 минут назад, Robink сказал:

Лучше переделывайте

 

Спасибо, последую совету, я поместил все в одну транзакцию.

Вопрос мой касаемо выноса значения за пределы tr наверное так, спортивного интереса ради :)

Ссылка на сообщение
Поделиться на другие сайты

Чисто из спортивного интереса, вынести данные из транзакции (именно данные, а не объект) можно при помощи Clone(), но это получится уже другой объект, не добавленный в базу чертежа.

Ссылка на сообщение
Поделиться на другие сайты

Дорогие друзья!

 

Случилась несколько иная проблема, но симптомы похожи:
 

Document adoc = App.DocumentManager.MdiActiveDocument;

Editor ed = adoc.Editor;

try

{

PromptNestedEntityResult rs;

rs = ed.GetNestedEntity("\nВыберите объект внешней ссылки: ");

}

 

Выбрасывает Exception при выборе любой внешней ссылки:

981947755_.png.91c444a28243fbe15ff77d854ddb9ebc.png

 

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

В этот транзакции ни при чем. Не понимаю, что я делаю не так... Опять же, в акаде все работало нормально...

Подскажите пожалуйста, "куда копать?" :rolleyes:

 

 

Изменено пользователем XaraMathers
Ссылка на сообщение
Поделиться на другие сайты

В 20.1 описанного эффекта не наблюдаю. В какой версии смотрите?

Ссылка на сообщение
Поделиться на другие сайты
1 час назад, ISL сказал:

В 20.1 описанного эффекта не наблюдаю. В какой версии смотрите?

Версия 20.1 СПДС

Ссылка на сообщение
Поделиться на другие сайты

Может, от файлов зависит? Я попробовал пару — не повторяется. Опять же, добавлял код в пример HelloHost.

Ссылка на сообщение
Поделиться на другие сайты
В 14.09.2020 в 17:55, ISL сказал:

Может, от файлов зависит? Я попробовал пару — не повторяется. Опять же, добавлял код в пример HelloHost.

Сделал тестовую процедуру:

        public void TestCommand()
        {
            Document adoc = HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
            if (adoc == null) return;

            Editor ed = adoc.Editor;

            try
            {
                PromptNestedEntityResult rss;
                rss = ed.GetNestedEntity("\nВыберите объект внешней ссылки: ");
                
                if (rss.Status != PromptStatus.OK)
                    return;

                ObjectId idSel = rss.ObjectId;
                ObjectId[] objIds = rss.GetContainers();//список id контейнеров
            }
            catch (System.Exception ex)
            {
                App.ShowModalDialog(new ErrorForm("Ошибка при выгрузке вложенной внешней ссылки", ex));
            }
        }

В момент rss = ed.GetNestedEntity сразу сваливается с ошибкой "Error during command executing: 'Параметр задан неверно'."

 

Что тут не так-то?... :stena:

 

АП: И да, пробовал на разных файлах с разными xref...

Изменено пользователем XaraMathers
Ссылка на сообщение
Поделиться на другие сайты
В 14.09.2020 в 17:55, ISL сказал:

Может, от файлов зависит? Я попробовал пару — не повторяется. Опять же, добавлял код в пример HelloHost.

 

А можете добавить вышеприведенный код? Отработает?

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...