Jump to content

Разница между API NanoCAD и API AutoCAD


Recommended Posts

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

 

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

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


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

static LayerTable lt;

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

 

NanoCAD:

image.png.2784524491cd9f6947554cba0ef32abb.png

 

AutoCAD:

image.png.275bb75c55d21ac954d5770f15f252e8.png


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

Link to comment
Share on other sites

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 попал в точку :)

Link to comment
Share on other sites

Взял пример 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

 

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

Link to comment
Share on other sites

2 часа назад, ISL сказал:

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

 

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

 

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

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

Link to comment
Share on other sites

49 минут назад, Robink сказал:

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

 

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

 

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

Document adoc = App.DocumentManager.MdiActiveDocument;

Editor ed = adoc.Editor;

try

{

PromptNestedEntityResult rs;

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

}

 

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

981947755_.png.91c444a28243fbe15ff77d854ddb9ebc.png

 

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

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

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

 

 

Edited by XaraMathers
Link to comment
Share on other sites

1 час назад, ISL сказал:

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

Версия 20.1 СПДС

Link to comment
Share on other sites

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

Link to comment
Share on other sites

В 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...

Edited by XaraMathers
Link to comment
Share on other sites

В 14.09.2020 в 17:55, ISL сказал:

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

 

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Tell a friend

    Love Официальный форум компании Нанософт? Tell a friend!
×
×
  • Create New...