Практически со времени выхода первой «дееспособной» версии NanoCAD, среди сообщества пользователей остро встал вопрос о необходимости реализации данной САПР под Linux.
Наверное, вы подумали, что эта статья родилась, потому что разработчики наконец-то «сделали это!». Спешу вас успокоить — все осталось на своих местах. О версии NanoCAD под Linux лично мне по-прежнему ничего не известно. Поэтому мы будем пытаться использовать Wine.
Так что эта короткая заметка будет не об использовании NanoCAD в Linux, а о том, как я вооружился Linux Mint, MonoDevelop и попытался собрать библиотеку для бесплатной версии NanoCAD с применением MultiCAD.NET API.
Если вам интересно, что же из этого получилось, милости прошу под кат!
Часть I: …рукам покоя не дает
Кажется, мое новое хобби, тоже в итоге выльется в мини-цикл статей и поскольку мы будем ссылаться на прошлые наработки, приведу под спойлером ссылки на все предыдущие статьи.
В самом начале на всякий случай уточню, что я не программист, что меня при всем желании нельзя назвать «уверенным пользователем Linux», а также что с ЗАО «Нанософт» (разработчик NanoCAD) я никак не связан, так что все, что будет ниже это мое частное и местами наивно-непрофессиональное мнение.
Наверное, будет уместно поделиться исходными данными, с которыми я подошел к решению задачи:
- ОС – Linux Mint 18.3 «Sylvia» – Cinnamon (64-bit)
- Wine — PlayOnLinux (Wine 2.2)
- IDE – MonoDevelp 7.1 (Mono 5.2.0)
- Руки – «из попы» (и большое любопытство)
Поскольку людей, программирующих под NanoCAD и так немного, а среди них настолько экстремальных и неудержимых людей – готовых программировать для NC под Linix явно еще меньше, то всё что будет ниже думаю не имеет практической ценности и можно рассматривать только в целях удовлетворения технического любопытства.
Если после предыдущего абзаца вы еще продолжили это читать, значит у вас выдержка как у Чака Норриса, а это достойно уважения.
Пришло наконец время узнать, что нас ждет в этой статье.
Содержание:
- Часть I: …рукам покоя не дает
- Часть II: пытаемся запустить с помощью Wine
- Часть III: собираем проект в MonoDevelop
- Часть IV: рождение пингвина
Часть II: пытаемся запустить с помощью Wine
Надо отметить, что разработчики хоть напрямую и не тратят свои ресурсы на адаптацию под Linux, все же иногда переживают за нас. Толчком, к созданию этой статьи послужил их пост на Хабре на который я случайно наткнулся — «Репост совета: запуск nanoCAD free 3.5/3.7 под Linux с помощью Wine».
Конечно, версия 3.7 уже совсем устарела, и я решил попробовать, близкую к ней более свежую версию NanoCAD 5.1.
Если вдруг вы совсем не знакомы, с Нанокадом, то можно почитать самую первую статью цикла. Если кратко, то NanoCAD 5.1 хоть и не программа с открытым исходным кодом, но всё же он абсолютно бесплатен для коммерческого использования, лично я думаю, что если бы разработчики сделали вменяемую адаптацию для Linux, хотя бы с помощью Wine, то благодаря привычному интерфейсу и схожести с AutoCAD, в функциональности двухмерного «электронного кульмана» он мог бы вполне составить конкуренцию, тем же FreeCAD и QCAD (LibreCAD).
Но пока, мы будем довольствоваться тем, что есть, а есть у нас советы с форума как запустить NanoCAD 5.1 под Wine 1.4.
К сожалению, я наткнулся на этот материал уже после того, как окончательно потерял энтузиазм, так что, если у кого-то нормально запустится после выполнения этой инструкции, поделитесь в комментариях.
А я расскажу, вам, что получилось у меня.
- Начал я с установки Wine из дистрибутива Mint, а там была версия 1.6, в итоге получилось, то о чем говорилось в двух вышеописанных советах из статей. Некорректные цвета иконок и проблемы с некоторыми кнопками. Собственно, как оказалось на этом можно было и остановится, ибо сильно лучшего результата я не добился, но я в итоге решил поставить PlayOnLinux и продолжить «оживлять Франкенштейна».
- Для начала я попробовал версию 1.4.1, в которой всё должно было бы работать, и я подозреваю, что оно действительно бы работало нормально, но есть одна проблемы – я никак не смог установить .NET Framework 3.5 (да и .NET Framework 3 тоже). Перепробовал кучу всего, но как правило в процессе установки в разных местах всегда вылетала какая-нибудь ошибка.
NET Framework 2 это крайняя версия, которую удалось поставить (4-я версия не в счет), с этой версией фреймворка NanoCAD, даже начинает загружаться и если повезет загрузит большую, часть. Не будут работать только библиотеки, в первую очередь связанные с API (что нам не подходит).
На снимке экрана видно, что можно чертить и что все цвета отображаются корректно, но к сожалению команда Netload – не работает, а значит нашу библиотеку в будущем не загрузить, поэтому идем дальше.
- Дальше я перепробовал кучу версий Wine под PlayOnLinux: 1.3.Х, 1.5.Х, 2.1, везде были проблемы с установкой. NET Framework 3.5.
- В итоге я остановился на с последней доступной мне в PlayOnLinux версии Wine — 2.2, под неё, каким-то чудом. NET Framework встал, NanoCAD запустился полностью, правда с цветами все же проблемы. Скриншоты того, как оно выглядит будут чуть позже.
- Другой требуемый пререквизит Microsoft Visual C++ 2008 SP1 Redistributable Package (x86), почти всегда устанавливается без проблем (можно прямо тот, что идет вместе с программой). Также не забудьте в процессе установки NanoCAD установить пакет разработчика (SDK)
Иногда при установке барахлит мастер регистрации. У меня бывали случаи, когда напрямую on-line регистрация сбоила, тогда можно взять файл лицензии с уже установленной версии например под полноценной Windows (лежит в папке ProgramDataNanosoftRegWizardLicenses) и скормить его мастеру лицензий.
Ещё я пытался поставить NanoCAD 8.5 под Wine, он в отличии от NC 5.1, требует уже NET Framework 4, а с ним проблем меньше, но зато там я застрял на установке пререквизита LocalDB (видимо серверные компоненты от MS). Если кто-то сможет запустить, поделитесь в комментариях пожалуйста.
Часть III: собираем проект в MonoDevelop
Получив, худо-бедно работоспособную версию NanoCAD для тестирования, сразу же попробуем проверить, удастся ли нам пересобрать и запустить ранее созданную библиотеку с псевдотрёхмерной дверью в Linux.
Для сборки проекта я выбрал MonoDevelop (для пользователей Windows она может быть знакома под названием Xamarin Studio).
Я раньше с ней в чистом виде не сталкивался (только в составе Unity) и был приятно удивлен, тому, что похоже, все что нам нужно в MonoDevelop есть.
Открываем уже созданный ранее в MS Visual Studio проект и пробуем пересобрать.
Как видите сборка выполнена успешно. Открываем NanoCAD, открываем ранее созданный .dwg файл с дверью и овцами (выложен на GitHub).
Как видите всё открывается. И даже намеренно включённое в код предупреждение об ошибке сделанное на базе Windows Forms открывается корректно (хоть и выглядит криво).
Раз всё работает, давайте попробуем, собрать, что-то новенькое и совсем уж примитивное, чисто в учебных целях. Но для начала подготовим себе инструменты.
В одной из статей я кратко описывал, процесс создания проекта для NanoCAD 5.1, в этой я предлагаю вам такую же краткую инструкцию, только для MonoDevelop под Linux:
- Открываем IDE и в меню File выбираем пункт создать новое решение (проект).
- В новом окне выбираем тип — библиотека классов C#
- Даем ему какое-нибудь название.
- Подключим библиотеки MultiCAD.NET, искать их надо в папке Mint, в которой организован виртуальный диск нашей системы Wine. SDK как правило ставится в одну папку с NanoCAD, подключаемые библиотеки лежат в папке include. Для этого проекта нам хватит только mapimgd.dll.
- Обязательно снимите галочку с опции «копировать локально».
- Затем кликнув ПКМ по названию проекта в инспекторе объектов выберете пункт options и установите в качестве итоговой платформы .NET Framework 3.5, как на картинке.
- После чего можно писать код и собирать код командой Build (F8), после чего найдем нашу библиотеку в папке debug проекта и копируем на виртуальный диск «C» или в любое другое место куда имеет доступ Wine, важно чтобы NanoCAD смог вашу .dll увидеть через свой диалог открытия файлов.
Часть IV: рождение пингвина
Рас уж мы с Вами так удачно все настроили, давайте уже что-нибудь напишем. Я решил предложить вам совсем уж простенький код, чтобы точно запустился без проблем.
Под спойлером прячется код, который рисует нам мое «высокохудожественное видение» пингвина. Класс содержит только команду «Dping», которая чертит простые геометрические объекты и выводит текст.
using System.Collections.Generic;
using Multicad.Runtime;
using Multicad.DatabaseServices;
using Multicad.Geometry;
using Multicad.DatabaseServices.StandardObjects;
namespace nano
{
class penguin
{
[CommandMethod("DPing", CommandFlags.NoCheck | CommandFlags.NoPrefix)]
public void DrawFace()
{
DbCircle body = new DbCircle();
body.Center = new Point3d(200, 200, 0);
body.Radius = 105;
body.DbEntity.AddToCurrentDocument();
DbCircle eye1 = new DbCircle();
eye1.Center = new Point3d(150, 255, 0);
eye1.Radius = 8;
eye1.DbEntity.AddToCurrentDocument();
DbCircle pupil1 = new DbCircle();
pupil1.Center = new Point3d(148, 254, 0);
pupil1.Radius = 2;
pupil1.DbEntity.AddToCurrentDocument();
DbCircle eye2 = new DbCircle();
eye2.Center = new Point3d(250, 260, 0);
eye2.Radius = 8;
eye2.DbEntity.AddToCurrentDocument();
DbCircle pupil2 = new DbCircle();
pupil2.Center = new Point3d(252, 258, 0);
pupil2.Radius = 2;
pupil2.DbEntity.AddToCurrentDocument();
DbLine hand1 = new DbLine();
hand1.StartPoint = new Point3d(102, 239, 0);
hand1.EndPoint = new Point3d(72, 183, 0);
hand1.DbEntity.AddToCurrentDocument();
DbLine hand2 = new DbLine();
hand2.StartPoint = new Point3d(298, 236, 0);
hand2.EndPoint = new Point3d(325, 192, 0);
hand2.DbEntity.AddToCurrentDocument();
DbPolyline nose = new DbPolyline();
List<Point3d> nosePoints = new List<Point3d>() {
new Point3d(171, 222, 0), new Point3d(198, 177, 0), new Point3d(231, 222, 0) };
nose.Polyline = new Polyline3d(nosePoints);
nose.Polyline.SetClosed(false);
nose.DbEntity.Transform(McDocumentsManager.GetActiveDoc().UCS); //change coordinates from UCS to WCS for BD
nose.DbEntity.AddToCurrentDocument();
DbText spech = new DbText();
spech.Text = new TextGeom("Hello Habr!", new Point3d(310, 55, 0), Vector3d.XAxis, "Standard", 25);
spech.DbEntity.AddToCurrentDocument();
}
}
}
Думаю, что код без особых проблем (ну может с небольшими корректировками подключаемых пространств имен) также скомпилируется и для NC 8.5 если вы подключите библиотеки от его SDK, но протестировать в Linux мы его не сможем, потому, что как я говорил раньше NC 8.5 у меня совсем «не взлетел» под Wine.
Кстати наша скомпилированная библиотека, потом без проблем откроется и в версии NC 5.1 работающей непосредственно под управлением Windows (что в принципе очевидно).
Итак, перекидываем нашу библиотеку на «диск Ц» открываем NanoCAD, вводим команду Netload выбираем нашу библиотеку (у меня ping.dll) и наслаждаемся зрелищем.
Как видите под Wine 2.2, по неизвестным причинам, в настройках NanoCAD барахлят опции связанные с назначением цвета (вместо значения цвета – крестик), решить эту задачу я не смог. Но в остальном файлы вроде открывается, диалог печати работает, простые объекты чертятся, а больше я и не тестировал.
Ну и чтобы убедится, что все у нас с Вами всё совсем «кроссплатформенно», запустим нашу библиотеку с пингвином в NC 5.1 под Windows.
Подведем итоги: похоже, что на первый взгляд непосредственно программировать для NC 5.1 с помощью MultiCAD.NET API в Linux – вполне возможно, а вот тестировать свой код уже не так комфортно.
Я во всех вопросах связанных с Linux почти ничего не понимаю, но мне кажется, что технически возможно создать контейнер, упаковать в него правильную версию Wine, установить туда неактивированный NC 5.1, предоставить каким-то образом контейнеру с Wine доступ к внешним дискам, и будет всем счастье.
К сожалению, самостоятельно я это в обозримом будущем точно не смогу провернуть, так что придется ждать и надеется на опытных неравнодушных пользователей или разработчиков NanoCad.
Автор: Роман