Вызов PInvoke ObjectARX AcArray для Hatch.AppendLoop in C#

Автор Тема: Вызов PInvoke ObjectARX AcArray для Hatch.AppendLoop in C#  (Прочитано 3269 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Цитировать
Код - C# [Выбрать]
  1. // Для AutoCAD 2013 и 2014 - "acdb19.dll", для AutoCAD 2015 - "acdb20.dll"
  2. [DllImport("acdb18.dll", CallingConvention = CallingConvention.ThisCall,
  3. CharSet = CharSet.Unicode,
  4. EntryPoint = "?appendLoop@AcDbHatch@@QAE?AW4ErrorStatus@Acad" +
  5. "@@JABV?$AcArray@VAcGePoint2d@@V?$AcArrayMemCopyReallocator@" +
  6. "VAcGePoint2d@@@@@@ABV?$AcArray@NV?$AcArrayMemCopyReallocator@N@@@@@Z")]
  7. ...
  8. // Для AutoCAD 2013 и 2014 - "acdb19.dll", для AutoCAD 2015 - "acdb20.dll"
  9. [DllImport("acdb18.dll", CallingConvention = CallingConvention.ThisCall,
  10. CharSet = CharSet.Unicode,
  11. EntryPoint = "?appendLoop@AcDbHatch@@QEAA?AW4ErrorStatus@Acad" +
  12. "@@JAEBV?$AcArray@VAcGePoint2d@@V?$AcArrayMemCopyReallocator@" +
  13. "VAcGePoint2d@@@@@@AEBV?$AcArray@NV?$AcArrayMemCopyReallocator@N@@@@@Z")]
  14.  
Что-то мне подсказывает, что одной лишь заменой первого аргумента в конструкторе атрибута DllImport (как пишется в комментах) тут не отделаешься, но под каждую версию AutoCAD будет так же и свой уникальный набор "иероглифов", назначаемых свойству EntryPoint... Соответственно код, обозначенный в заметке, следовало бы оформлять так, чтобы его можно было применить легко, без геморроя, а именно:

1. первый аргумент в конструкторе DllImport лучше делать именованной константой, инициализирующейся в блоке #if / #else if / #else (в зависимости от версии акада).

2. В тех же самых блоках неплохо было бы инициализировать и др. именованную константу, значение которой подставлялось бы аргументу EntryPoint.

Надеюсь, что код будет подправлен, дабы его можно было легко применить к любой версии AutoCAD, более новой чем R18. Про R17.2 даже и не заикаюсь, дабы не было причин кричать "мы же не поддерживаем старые!": R18 - тоже не вчерашняя и тем не менее заметка о ней... Однако, ежели вдруг добавите и для R17.2 (мало ли) - я не обижусь :).
« Последнее редактирование: 21-04-2014, 22:23:59 от Андрей Бушман »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Это переводная статья - от себя я добавил лишь различия для новых версий AutoCAD.
2. Это не готовый модуль, который можно использовать в своём коде один в один, а пример более сложного использования P/Invoke и доводить его до идеала я смысла не вижу. Примеры универсального кода (даже без #define) я уже приводил на сайте. Пример.
3. "Иероглифы" в новых версиях остались теми же. Это не сложно было проверить.
4. В новых версиях (как минимум с 2013-ой версии) этот метод уже реализован в классе Hatch:
Код - C# [Выбрать]
  1. public void AppendLoop(
  2.     HatchLoopTypes loopType,
  3.     Point2dCollection vertexCollection,
  4.     DoubleCollection bulgeCollection
  5. );
Так что код остается только как пример.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение