Н.Н.Полещук. "Программирование для AutoCAD 2013-2015". ДМК Пресс, 2015

Автор Тема: Н.Н.Полещук. "Программирование для AutoCAD 2013-2015". ДМК Пресс, 2015  (Прочитано 91532 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Можно использовать __declspec(dllexport):
Возьму на вооружение, спасибо!

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
По поводу DEF файла: неплохо было бы упомянуть и третий вариант - подключение к проекту уже имеющегося в составе SDK файла AcRxDefault.def, в составе которого уже прописаны экспортируемые функции. Подключение можно выполнить при помощи указания обозначенного файла следующему свойству проекта: Configuration Properties -> Linker -> Input -> Module Definition File.
« Последнее редактирование: 16-06-2015, 14:01:26 от Андрей Бушман »

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13067
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Это не всегда удобно, хотя и имеет право на жизнь. В этом случае остальные экспортируемые функции (если таковые есть) придётся указывать другим способом.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение


Оффлайн Николай Полещук

  • ADN
  • *
  • Сообщений: 33
  • Карма: 9
Применимы любые языки, поддерживающие ActiveX или .NET. Технология .NET описана в 4 главе данной книги, а ActiveX - в книге "САПР на базе AutoCAD" (разделы о Delphi). Впрочем, в каждом языке могут быть свои дополнительные плюсы или минусы.

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Цитата: Н.Н.Полещук, Глава 2. C++ и ObjectARX, стр. 33
Здесь используются стандартные переменные платформы MSBuild, работающие в Visual Studio (переменные заключаются в круглые скобки и предваряются символом $).
Не только стандартные (раз, два, три), но и системные переменные Windows ($(AppData) и т.п.), а так же все пользовательские переменные Windows, определённые в диалоговом окне Переменные среды. Дополнительно существует возможность хранить набор переменных во внешних XML файлах и импортировать их (удобно при коллективной работе).

Пример:
Код - XML [Выбрать]
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- sdk.props
  3. UTF-8 encoding.
  4. © Andrey Bushman, 2015
  5. This file describes SDK locations of CAD systems. You are free to change its
  6. content according your SDK locations.
  7.  
  8. Three last versions of ObjectARX SDK you can download from the Autodesk official
  9. site: http://usa.autodesk.com/adsk/servlet/item?siteID=123112&id=785550
  10. Older ObjectARX versions you can download from here: http://adn-cis.org/forum/index.php?topic=61.0 -->
  11. <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  12.   <!-- SDK locations. -->
  13.   <PropertyGroup>
  14.     <!-- Parent directory for all SDKs (any software) -->
  15.     <SDK>\\hyprostr\dfs\groups\developers\sdk</SDK>
  16.     <!-- Parent directory for all ObjectARX SDKs -->
  17.     <ObjectARX>$(SDK)\Autodesk\AutoCAD</ObjectARX>
  18.     <!-- The ObjectARX SDK locations list -->
  19.     <ObjectARX_2009>$(ObjectARX)\ObjectARX 2009</ObjectARX_2009>
  20.     <ObjectARX_2010>$(ObjectARX)\ObjectARX 2010</ObjectARX_2010>
  21.     <ObjectARX_2011>$(ObjectARX)\ObjectARX 2011</ObjectARX_2011>
  22.     <ObjectARX_2012>$(ObjectARX)\ObjectARX 2012</ObjectARX_2012>
  23.     <ObjectARX_2013>$(ObjectARX)\ObjectARX 2013</ObjectARX_2013>
  24.     <ObjectARX_2014>$(ObjectARX)\ObjectARX 2014</ObjectARX_2014>
  25.     <ObjectARX_2015>$(ObjectARX)\ObjectARX 2015</ObjectARX_2015>
  26.     <ObjectARX_2016>$(ObjectARX)\ObjectARX 2016</ObjectARX_2016>
  27.     <!-- Add here new locations for ObjectARX of newer AutoCAD versions when
  28.    they appear. -->
  29.   </PropertyGroup>  
  30. </Project>

Импорт в *PROJ-файле должен быть прописан до первого обращения к любому из свойств, определённых в импортируемом файле (свойства можно переопределять):

Код - XML [Выбрать]
  1. <Import Project="..\sdk.props" />
« Последнее редактирование: 29-09-2015, 15:01:34 от Андрей Бушман »

Оффлайн Балиев

  • ADN Club
  • ***
  • Сообщений: 141
  • Карма: 1
Здравствуйте,
Я пытаюсь изучать программирование на C# для AutoCAD'а по этой книге. У меня возник вопрос по примеру кода (начало на стр.181) рисования смайлика. Там есть строка:
Код - C# [Выбрать]
  1. if (!Db.TileMode)
  2.   cad.SetSystemVariable("TILEMODE", 1);
  3.  
При ее вводе появляется сообщение об ошибке:
Цитировать
The type or namespace name 'TileMode' does not exist in the namespace 'Autodesk.AutoCAD.DatabaseServices' (are you missing an assembly reference?)
Вручную я тоже такого метода не нашел в Db. Я что-то не так делаю, или это, действительно, ошибка?
« Последнее редактирование: 15-03-2016, 21:49:23 от Александр Ривилис »

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2462
  • Карма: 692
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Должна быть примерно такая строчка где-то выше:
Код - C# [Выбрать]
  1. Database Db = Application.DocumentManager.MdiActiveDocument.Database;
А у Вас, скорее всего, есть только такая:
Код - C# [Выбрать]
  1. using Db = Autodesk.AutoCAD.DatabaseServices;

Оффлайн Николай Полещук

  • ADN
  • *
  • Сообщений: 33
  • Карма: 9
Такое свойство есть. Но, возможно, не во всех версиях AutoCAD

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13067
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
Балиев
1. Прочитай у меня в подписи как следует форматировать код на форуме.
2. Не:
Код - C# [Выбрать]
  1. if (!Db.TileMode)
  2.   cad.SetSystemVariable("TILEMODE", 1);
а
Код - C# [Выбрать]
  1. if (!db.TileMode)
  2.   cad.SetSystemVariable("TILEMODE", 1);
Всего лишь ошибка в регистре...
P.S.: В книге правильно.
P.S.S.: Приводи сразу номер страницы, с которой берёшь пример. В данном случае это страница 185.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Балиев

  • ADN Club
  • ***
  • Сообщений: 141
  • Карма: 1
Всего лишь ошибка в регистре...
Точно! А ведь чувствовал, что "сам дурак", но так и не догадался в чем...

Оффлайн Балиев

  • ADN Club
  • ***
  • Сообщений: 141
  • Карма: 1
День добрый,

Сначала о грустном. Обнаружил опечатку (возможно, вы уже о ней знаете) на стр. 154 внизу напечатано:
  • 2011 - 3.5,4.0,4.5,4.5.1 (VS2005 и выше);
а должно быть:
  • 2011 - 3.5 (VS2005 и выше);
Я сначала не обратил внимания и промучился с .NET 4.0, пытаясь использовать его для AutoCAD 2011.

Теперь о главном. По некоторым причинам мне нужно писать плагины под AutoCAD 2011. Я попробовал воспроизвести под AutoCAD 2011 пример со смайликом, который удачно заработал под AutoCAD 2015. Не получается. Попытки понять почему? привели к следующим выводам.

1. На работоспособность под AutoCAD 2011 влияют 2 строки.

Первая строка на стр.182:
Код - C# [Выбрать]
  1. [assembly: Rt.ExtensionApplication(typeof(Bushman.CAD.Samples.Extention))]
  2.  
и вторая строка на стр.184:
Код - C# [Выбрать]
  1. [Rt.CommandMethod(cmdGr, "hello", "hello_ID", Rt.CommandFlags.Modal)]

При этом, если эти строки не комментировать или закомментировать только первую из этих двух строк, то при попытке исполнить команду "netload" появляется сообщение:

Цитировать
Не удалось найти ресурсы, соответствующие указанной культуре или нейтральной
культуре. Проверьте правильность внедрения или связывания
"Bushman.CAD.Samples.Commands.resources" со сборкой "ACAD11_test" во время
компиляции, или убедитесь, что все необходимые сопутствующие сборки полностью
подписаны и могут быть загружены.
Не удалось загрузить сборку. Сведения об ошибке:
System.Resources.MissingManifestResourceException: Не удалось найти ресурсы,
соответствующие указанной культуре или нейтральной культуре. Проверьте
правильность внедрения или связывания "Bushman.CAD.Samples.Commands.resources"
со сборкой "ACAD11_test" во время компиляции, или убедитесь, что все
необходимые сопутствующие сборки полностью подписаны и могут быть загружены.
   в System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo
culture, Boolean createIfNotExists, Boolean tryParents)
   в System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo
culture, Boolean createIfNotExists, Boolean tryParents)
   в System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo
culture, Boolean createIfNotExists, Boolean tryParents)
   в System.Resources.ResourceManager.GetString(String name, CultureInfo
culture)
   в Autodesk.AutoCAD.Runtime.CommandClass.AddCommand(ICommandLineCallable ca,
MethodInfo mi)
   в
Autodesk.AutoCAD.ApplicationServices.AutoCADApplicationHolder.Initialize(Assembl
y assembly)
   в
Autodesk.AutoCAD.ApplicationServices.ExtensionLoader.ProcessAssembly(Assembly
assembly)

Если же закомментировать обе строки или вторую из двух, то появляется более короткое сообщение:
Цитировать
Не удалось найти ресурсы, соответствующие указанной культуре или нейтральной
культуре. Проверьте правильность внедрения или связывания
"Bushman.CAD.Samples.Commands.resources" со сборкой "ACAD11_test" во время
компиляции, или убедитесь, что все необходимые сопутствующие сборки полностью
подписаны и могут быть загружены.

Это как-то лечится?
Заранее благодарен.

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13067
  • Карма: 1685
  • Рыцарь ObjectARX
  • Skype: rivilis
а должно быть:

    2011 - 3.5 (VS2005 и выше);

Я сначала не обратил внимания и промучился с .NET 4.0, пытаясь использовать его для AutoCAD 2011.
Если разкоментировать в C:\Program Files\Autodesk\AutoCAD 2011\acad.exe.config строку <supportedRuntime version="v4.0"/>,
т.е. получить в результате:
Код - XML [Выбрать]
  1. <configuration>
  2.   <startup useLegacyV2RuntimeActivationPolicy="true">
  3.     <supportedRuntime version="v4.0"/>
  4.   </startup>
  5.  
  6. <!--All assemblies in AutoCAD are fully trusted so there's no point generating publisher evidence-->
  7.    <runtime>        
  8.         <generatePublisherEvidence enabled="false"/>    
  9.    </runtime>
  10. </configuration>
  11.  
то будет работать и с .NET 4.0:
http://adndevblog.typepad.com/autocad/2012/07/using-net-framework-40-in-various-autocad-versions.html
http://bushman-andrey.blogspot.com/2014/04/net-autocad-net-framework-ms-visual.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Балиев

  • ADN Club
  • ***
  • Сообщений: 141
  • Карма: 1
Если разкоментировать в C:\Program Files\Autodesk\AutoCAD 2011\acad.exe.config строку <supportedRuntime version="v4.0"/>,... то будет работать и с .NET 4.0:
Хм... А зачем ее вообще в закомментированом виде поставляют, не знаешь?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Чтобы результат компиляции мог работать в AutoCAD 2011, тебе необходимо подключать соответствующие библиотеки AutoCAD 2011 (или более ранних версий). Кроме того, по обозначенной выше ссылке на мой блог дана некоторая информация об изменениях, которые произошли в API AutoCAD 2013.