Добро пожаловать!

Войдите или зарегистрируйтесь сейчас!

Войти

Программирование АутоКАД из внешней СИ-программы

Тема в разделе "Autocad", создана пользователем sklimkim, 8 июн 2016.

  1. sklimkim

    Форумчанин

    Регистрация:
    13 июл 2010
    Сообщения:
    218
    Симпатии:
    43
    Адрес:
    Moscow Russia
    Доступ к объектной модели AutoCAD из внешней программы
    Вопрос о том, как "достучаться" до АутоКАДа "снаружи" и из языков программирования иных, чем ВижуалБэйсик, периодически возникает уже не менее 15-ти лет на разных наших и не наших форумах.
    Реальные успехи имели поклонники Дельфи-Паскаль.
    А вот СИ-шникам все эти годы внушалось, что без "гравицапы" по имени ObjectARX от АутоДеск никак нельзя.
    Но такая "гравицапа" живет только 3 года, а потом надо покупать новую - еще более ... и т.д.
    Но и она "летает только в своей кентурии", то есть внутри АутоКАДа (также как АутоЛИСП, как VBA).

    Единственным исключением был ВижуалБэйсик (последнее обновление от 1998 года).
    Он и сейчас вполне пригоден для означенной задачи, но ведь MS в любое время может выкинуть его главную библиотеку из системы и заплачут "пацаки".

    Интерес к означенной теме можно обнаружить даже у корефанов Питона (Python).
    У них "всё получилось", но даже с 'экзешником' полученным из Питона через их утилиту 'Py2Exe' надо носить с машины на машину 2-4 МБ поддерживающих библиотек.
    А наличие/отсутствие некоторых MS библиотек (конкретной версии компилятора VC) в системе, может помешать успешной дружбе этих двух разных цивилизаций.

    Все что надо для программирования АутоКАДа это:
    CLSID_AcadApplication
    CLSID_AcadDocument
    CLSID_AcadModelSpace
    Препятствием является отсутствие в Windows-Registry 'CLSID' для AutiCAD.Docunent и AutiCAD.ModelSpace, там есть только для AutiCAD.Application.
    И зто не позволяет программисту получить в свое распоряжение эти ключевые объекты (после главного AutiCAD.Application).
    И это при том, что вся (почти вся) объектная модель АутоКАДа находится в файле acax[NN]enu.tlb (где [NN] - цифры, зависящие от версии АутоКАДа).
    Такого препятствия нет при обращении к изделиям MS, например MS-Office, а также к изделиям многих других производителей программ.
    Особенно, если они заинтересованы в создании на стороне пользователей различных дополнений/улучшений их программ.
    Вот когда у AD и MS "была любоф", тогда от MS появился 'VBA-AutoCAD'.
    Но как и многое другое у них он был "немного недоношенный". А потом "любоф" закончилась и VBA-AutoCad стал опцией по требованию со стороны пользователя.

    Все дело в том, что использование TLB и некоторых DLL библиотек происходит по 'COM-OLE-Automation' протоколам.
    Над 'COM-OLE' и над повсемесным их внедрением немало потрудились в MS.
    Но для хитро===== программистов в этих протоколах и прежде всего в самой ОС-Виндовс есть известные им и MS способы "не пущать". Для этого есть вполне прагматические мотивы.

    После серии проб и ошибок, получен (не без помощи "наших немецких EURO-товарищей") вполне себе рабочий пример (так называемый "simple-example").
    Написан он на "ПРОСТО-СИ", даже не "СИ-Пляс-Пляс" - для компиляции использован Pelles-C, он понятный и бесплатный.
    Создание в чертеже объекта 'AutoCAD.Line', доказывает что программа "достучалась" до объектной модели АутоКАДа.
    Дальше можно ее наращивать в нужном направлении, создавая вызовы необходимых функций АутоКАДа (а также Windows-системы).

    Поклонники MS-VS-C++ вероятно знают для чего бывают нужны строки типа:
    Код:
    EXTERN_C const CLSID CLSID_ErrObject;
    и они таки вставят их в нужном месте, если не хотят переделывать код из СИ в СИ++ для компиляции в MS-VS.

    Поскольку СИ (не СИ++) компиляторы не работают с TLB-библиотеками напрамую, как в C++:
    Код:
    #import "C:\\Program Files\\Common Files\\Autodesk Shared\\acax17enu.tlb"
    постольку для них из TLB-файла (бинарного) компилируеся H-файл (он текстовый и из него много чего можно вычитать).
    Для этого умные люди сделали утилиту 'FtypeLib.exe', чем я и воспользовался.
    И получил и положил в папку проекта файл acax[XX]enu.h который заставляет работать acax[XX]enu.tlb нужным для программы образом, игнорируя отсутствие прописанных в Windows-Registry столь необходимых классов/объектов АутоКАДа.

    Попутно надо отметить, что в менее известном (у нас), но не менее функциональном IntelliCAD (он же ProgeCAD) таких проблем для программистов нет.
    Все необходимые для программиста классы/объекты доступны в его программе сразу и без "камлания".
    При этом объектная модель, "начинка" и даже "морда" у них, как у близнецов.

    Ребята из "АвтоматическогоСтола" как и из "МелкогоМягкого" постоянно работают над улучшением и в связи с этим также постоянно что-то выбрасывают и что-то вставляют в своих творениях.
    Но компетентные люди неспроста говорят что у них: "на хитрую '====' есть '+++' с винтом".
    И несмотря на то, что не все их слова мне понятны, я все-таки им верю.

    (для тех кто не понял - кое-где использованы слоганы из к/ф "Кин-Дза=Дза").

    Ссылки на разные полезные для использования и даже развития вещи:
    https://support.microsoft.com/en-us/kb/181473
    https://en.wikipedia.org/wiki/IDispatch
    http://disphelper.sourceforge.net/

    https://github.com/reclosedev/pyautocad
    http://readthedocs.org/docs/pyautocad
    https://github.com/enthought/comtypes/releases
    https://github.com/enthought/comtypes
    https://pypi.python.org/pypi/comtypes
     

    Вложения:

    • AutoCadTest_1.zip
      Размер файла:
      337,3 КБ
      Просмотров:
      9
    • FtypeLib.zip
      Размер файла:
      30 КБ
      Просмотров:
      10
    • acad_console_4.zip
      Размер файла:
      335 КБ
      Просмотров:
      8
    • IcadOLE_2.zip
      Размер файла:
      20,6 КБ
      Просмотров:
      9
    #1
  2. sklimkim

    Форумчанин

    Регистрация:
    13 июл 2010
    Сообщения:
    218
    Симпатии:
    43
    Адрес:
    Moscow Russia
    #2
  3. sklimkim

    Форумчанин

    Регистрация:
    13 июл 2010
    Сообщения:
    218
    Симпатии:
    43
    Адрес:
    Moscow Russia
    Для практической работы программы нужно бы подключиться к уже загруженной копии АутоКАДа с реальным для работы чертежем.
    Но я не нашел такой возможности.
    Поэтому выбрал такой способ:
    после загрузки программой новой копии АутоКАДа с пустым чертежом вызывается АутоКАД-овский диалог <FileOpen> и так далее.

    Самое надежное для этого: команда AutoCAd'а через 'Command Prompt'
    _open
    выдает на экран диалог "Выбор файла" для загрузки чертежа.
    Хорошо бы вставит еще и проверку не доступность этого:
    Код:
    if (FILEDIA==0) // variable has value 'disable'
       FILEDIA=1; // set FileDialog to 'enable'
    Из СИ-кода реально работает макрос (команда) IAcadDocument_ но только сдвоенная:
    Код:
       if (pACadDoc) {
    	  IAcadDocument_SendCommand(pACadDoc, L"_open ");
    	  IAcadDocument_SendCommand(pACadDoc, L"_OPEN");
       }
    Макрос (команда) из 'IAcadUtility_Prompt' не работает никак:
    Код:
       /*
       if (pUtility) {
    	  IAcadUtility_Prompt(pUtility, L"_open ");
    	  IAcadUtility_Prompt(pUtility, L"_OPEN ");
    	  // variants of:
    	  //(pUtility)->lpVtbl->Prompt(pUtility, L"_open ");
    	  //IAcadUtility_Prompt(pUtility, L"_open \\n");
       }
       */
    Вот первостепенные команды из файла acax17enu.tlb --> acax17enu.h:
    EXTERN_C const IID IID_IAcadUtility;
    В программе подключены Acad-макросы, поэтому вот так COBJMACROS:
    Код:
    IAcadUtility_Prompt(This, Message);
    (This)->lpVtbl->Prompt(This, Message);
    IAcadUtility_GetInput(This, pResult);
    (This)->lpVtbl->GetInput(This, pResult);
    IAcadUtility_GetKeyword(This, Prompt, pResult);
    (This)->lpVtbl->GetKeyword(This, Prompt, pResult;
    IAcadUtility_InitializeUserInput(This, Bits, KeyWordList);
    (This)->lpVtbl->InitializeUserInput(This, Bits, KeyWordList);
    IAcadUtility_CreateTypedArray(This, varArr, Type, inArgs);
    (This)->lpVtbl->CreateTypedArray(This, varArr, Type, inArgs);
    #define IAcadUtility_GetInteger(This, Prompt, pResult);
    (This)->lpVtbl->GetInteger(This, Prompt, pResult);
    IAcadUtility_GetReal(This, Prompt, pResult);
    (This)->lpVtbl->GetReal(This, Prompt, pResult);
    IAcadUtility_GetString(This, HasSpaces, Prompt, pResult);
    (This)->lpVtbl->GetString(This, HasSpaces, Prompt, pResult);
    IAcadUtility_GetPoint(This, Point, Prompt, pResult);
    (This)->lpVtbl->GetPoint(This, Point, Prompt, pResult);
    IAcadUtility_GetEntity(This, Object, PickedPoint, Prompt);
    (This)->lpVtbl->GetEntity(This, Object, PickedPoint, Prompt);
    А вот они же в "сыром" виде:
    Код:
    /!< Posts a prompt to the command line
    hr = Prompt(IAcadUtility *This, BSTR Message);
    hr = GetInput(IAcadUtility *This, BSTR *pResult);
    hr = GetKeyword(IAcadUtility *This, VARIANT Prompt, BSTR *pResult);
    //!< Creates a variant that contains an array of typed arguments
    hr = CreateTypedArray(IAcadUtility *This, VARIANT* varArr, INT Type, SAFEARRAY * inArgs);
    //!< Gets a ... value from the user:
    hr = GetInteger(IAcadUtility *This, VARIANT Prompt, INT *pResult);
    hr = GetReal(IAcadUtility *This, VARIANT Prompt, DOUBLE *pResult);
    hr = GetString(IAcadUtility *This, INT HasSpaces, VARIANT Prompt, BSTR *pResult);
    hr = GetPoint(IAcadUtility *This, VARIANT Point, VARIANT Prompt, VARIANT *pResult);
    //!< Gets an object interactively
    hr = GetEntity(IAcadUtility *This, IDispatch** Object, VARIANT* PickedPoint, VARIANT Prompt);
    Работающий пример:
     

    Вложения:

    • acadtest2.zip
      Размер файла:
      337,8 КБ
      Просмотров:
      10
    #3
  4. sklimkim

    Форумчанин

    Регистрация:
    13 июл 2010
    Сообщения:
    218
    Симпатии:
    43
    Адрес:
    Moscow Russia
    Теперь программа на старте подключается к уже загруженному экземпляру АутоКАДа, а если такого не, то загружает АутоКАД и подключается к нему.
    Создает новый чертеж и немного рисует в нем (или в ранее загруженном АутоКАДе).

    Для иллюстрации исполнения из программы команд АутоКАДа добавил функции с:
    SendCommand()
    "_CIRCLE 90.0,57.0,0.0 30.0 "
    "_3DPOLY"
    "_POINT "
    Легко отрабатывают такие библиотечные функции как:
    GetInteger
    GetString
    AddPoint
    AddLine
    но возникли "непонятки" с реализацией:
    GetPoint
    GetEntity
    а это основополагающие функции, где данные идут от АутоКАДа к программе.

    В основном сложности с безумным Майкрософтовским типом данных 'VARIANT'
    Нормальные типы данных надо "засовывать" в 'VARIANT' и затем посылать в АутоКАД.
    И наоборот - получив из АутоКАДа 'VARIANT' надо из него "выковыривать" (преобразовывать в):
    integer
    long
    double
    string
    ...
    При этом некоторые данные возвращаются не как 'VARIANT' а например как 'BSTR' (строка).
    Я выкладываю исходник на СИ для тех кто программист.
    Выкладывать exe-шник вряд-ли надо: у меня версия АвтоматическогоПомощника 2007.
     

    Вложения:

    • acadtest2_c.zip
      Размер файла:
      2,9 КБ
      Просмотров:
      8
    #4
    Qvinto нравится это.
  5. sklimkim

    Форумчанин

    Регистрация:
    13 июл 2010
    Сообщения:
    218
    Симпатии:
    43
    Адрес:
    Moscow Russia
    Работающий пример.
    Воспользоваться могут обладатели "реликта" 2007.
    Программисты могут переписать для своих версий.

    Программно рисует:
    точки,
    линии,
    3д-полилинию,
    окружность.
    Программно получает:
    координаты точки,
    координаты (например конечной точки линии),
    целое число (вводимое пользователем по запросу),
    строку текста (также, но пока криво декодирует ее).

    То есть основы программирования извне есть.
     

    Вложения:

    #5
    Qvinto нравится это.
  6. sklimkim

    Форумчанин

    Регистрация:
    13 июл 2010
    Сообщения:
    218
    Симпатии:
    43
    Адрес:
    Moscow Russia
    В архиве исходник и скомпилированный для версии 2007 пример.
    По базовой линии (или двум точкам - например это некая строительная ось) и далее в цикле выбираемым парам точек (например это проектное положение свай и их фактическое положение после исполнительной съемки) создаются полилинии-стрелки и надписи вычисленных ординатных отклонений.
    На выбор пользователя 7 размеров стрелок и 3 вида отображения величин отклонений.
    Для обозначенной в начале темы задачи этого пожалуй достаточно.
    И скриншот - как это может выгляде 2016-06-30_Arrows+Text.jpg ть:
     

    Вложения:

    #6
    Qvinto нравится это.
  7. sklimkim

    Форумчанин

    Регистрация:
    13 июл 2010
    Сообщения:
    218
    Симпатии:
    43
    Адрес:
    Moscow Russia
    Программа 'Arrows' ('Стрелка' в девичестве).
    Практическое применение программирования АутоКАД'а извне.
    1.
    Небольшое окно для пользовательских настроек:
    выбор единиц чертежа (в некотором смысле его масштаб - 3 типа),
    выбор размера стрелок (7 размеров),
    выбор допустимых отклонений проект--факт (7 ступеней),
    запись сессии в текстовый файл.
    2.
    Создание слоев (Arrows и OrtoDiff)
    Задание цвета на отображение (всё зеленым, что выше допуска - красным).
    Завершение сессии - дважды ESC.
    Перед закрытием окна (кнопка EXIT) еще раз нажать кнопку LogFile (дописывает в файл время окончания работы).

    Для СИ-программистов (если такие еще не перевелись):
    В программе реализованы некоторые наиболее востребованные функции, описания которых для СИ 2016-07-02_Arrows+ToleranceDiff.jpg -программирования похоже нигде нет.

    Вот пожалуй и всё.
     

    Вложения:

    #7
    Qvinto нравится это.
  8. Qvinto

    Форумчанин

    Регистрация:
    10 дек 2008
    Сообщения:
    5.681
    Симпатии:
    4.223
    Адрес:
    Украина, г.Калуш
    Нет-нет. Продолжайте пожалуйста. С интересом читаю, что вы рассказываете. Такой себе блог получается. Правда, абсолютно ничего не понимаю, но так познавательно. Чувствую себя землянином при встрече с инопланетянином. Есть к чему стремится в познаниях.
     
    #8
    MaxKal и flareon нравится это.
  9. Steinar

    Форумчанин

    Регистрация:
    30 авг 2012
    Сообщения:
    699
    Симпатии:
    496
    Адрес:
    Асгардия
    Ничего не понял.
     
    #9
  10. trir

    Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.253
    Симпатии:
    931
    Адрес:
    gnomtrir@mail.ru
    Достучался до AutoCAD COM из C
    Ну и нафиг так мучатся?
     
    #10
    igor kruchkovskiy и Steinar нравится это.
  11. sklimkim

    Форумчанин

    Регистрация:
    13 июл 2010
    Сообщения:
    218
    Симпатии:
    43
    Адрес:
    Moscow Russia
    <p>&lt;p&gt;&lt;i&gt;Acad_Surface (6) 22.08.2016&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Штриховка (&amp;#039;Hatch&amp;#039;) в AutoCAD&lt;/b&gt; для программирования вещь непростая.&lt;/p&gt;&lt;p&gt;В СИ (в отличии от AutoLISP и VBA) функция штриховки (AddHatch) не работает.&lt;/p&gt;&lt;p&gt;Вот как это прописано в acax17enu.h (acax17enu.tlb):&lt;/p&gt;&lt;p&gt;hr = AddHatch(IAcadModelSpace *This, INT PatternType, BSTR PatternName, VARIANT_BOOL Associativity, VARIANT HatchObjectType, IAcadHatch* *pResult);&lt;/p&gt;&lt;p&gt;или через макрос:&lt;/p&gt;&lt;p&gt;IAcadModelSpace_AddHatch(This, PatternType, PatternName, Associativity, HatchObjectType, pResult);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Аргумент &amp;#039;VARIANT HatchObjectType&amp;#039; совсем не &amp;#039;typedef enum acHatchObjectType&amp;#039;.&lt;/p&gt;&lt;p&gt;И если в AutoLISP и VBA этот агрумент необязательный (то есть может быть пропущен), то в СИ без него функция не работает.&lt;/p&gt;&lt;p&gt;Нигде кроме функции AddHatch аргумент &amp;#039;HatchObjectType&amp;#039; не встречается.&lt;/p&gt;&lt;p&gt;И поэтому его &amp;quot;облик&amp;quot; в структуре VARIANT неизвестен.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Поэтому, после многих безуспешных проб (и ошибок), после чтения форумов на тему &amp;#039;AutoCAD HATCH&amp;#039;, пришлось воспользоваться функцией &amp;#039;command&amp;#039; из AutoLISP.&lt;/p&gt;&lt;p&gt;При этом AutoLISP &amp;#039;command&amp;#039; успешно штрихует 3dFace (если верить Help&amp;#039;у то это невозможно).&lt;/p&gt;&lt;p&gt;Также в командную строку можно сразу вставить различные свойства штриховки.&lt;/p&gt;&lt;p&gt;Одним словом старина AutoLISP выручил.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;В приложенном архиве пример создания поверхности (Surface as TIN) из &amp;#039;3dFace&amp;#039; по нерегулярно расположенным точкам:&lt;/p&gt;&lt;p&gt;1. из точек существующих в текущем чертеже Drawing - кнопка &lt;b&gt;&amp;#039;SURFACE&amp;#039;&lt;/b&gt;,&lt;/p&gt;&lt;p&gt;2. из точек X,Y,Z в файле &amp;#039;points.txt&amp;#039; - кнопка &lt;b&gt;&amp;#039;Read File&amp;#039;&lt;/b&gt;,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;То же самое (1 и 2) можно выполнить используя внешнюю LISP программу (&lt;b&gt;DTM.lsp + DTM.dsl&lt;/b&gt;) румынского программиста &lt;b&gt;Nikolae Manda&lt;/b&gt; - кнопка &lt;b&gt;&amp;#039;DTM LISP&amp;#039;&lt;/b&gt;.&lt;/p&gt;&lt;p&gt;Эти два файла должны находиться в системной папке AutoCAD, например в C:\Program Files\AutoCAD 20xx\Support\&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Радиокнопка &amp;#039;Hatch 3dFaces&amp;#039; для выполнения штриховки всех построенных треугольников.&lt;/p&gt;&lt;p&gt;Это поможет увидеть пропущенные программой островки поверхности и заполнить их вручную.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Программный код, выполняющий триангуляцию:&lt;/p&gt;&lt;p&gt;vdefs.h&lt;/p&gt;&lt;p&gt;voron_main.c (main.c)&lt;/p&gt;&lt;p&gt;voronoi.c&lt;/p&gt;&lt;p&gt;geometry.c&lt;/p&gt;&lt;p&gt;heap.c&lt;/p&gt;&lt;p&gt;memory.c&lt;/p&gt;&lt;p&gt;edgelist.c&lt;/p&gt;&lt;p&gt;output.c&lt;/p&gt;&lt;p&gt;его автор &lt;b&gt;Steve J. Fortune&lt;/b&gt; ( ©1987-1992 года).&lt;/p&gt;&lt;p&gt;Не смотря на возраст кода, потребовалось совсем немного исправлений для включения в данный проект.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Есть и другие свободные исходники, например &lt;b&gt;Clarkson-Delaunay - Ken Clarkson&lt;/b&gt; © 1995&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Почти все то, что есть в свободном доступе триангулирует так называемую &amp;#039;выпуклую оболочку&amp;#039; (&amp;#039;Convex Hull&amp;#039;).&lt;/p&gt;&lt;p&gt;Для серьезной работы требуется реализация &amp;quot;Триангуляция Делоне с условиями&amp;quot;, и как все серьезное в открытом доступе отсутствует.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Это для общего развития:&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://algolist.manual.ru/maths/geom/&quot; target=&quot;_blank&quot; class=&quot;externalLink ProxyLink&quot; data-proxy-href=&quot;http://algolist.manual.ru/maths/geom/&quot; rel=&quot;nofollow&quot;&gt;http://algolist.manual.ru/maths/geom/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://gts.sourceforge.net&quot; target=&quot;_blank&quot; class=&quot;externalLink ProxyLink&quot; data-proxy-href=&quot;http://gts.sourceforge.net&quot; rel=&quot;nofollow&quot;&gt;http://gts.sourceforge.net&lt;/a&gt;&lt;/p&gt;</p>
    --- Сообщения объединены, 22 авг 2016, Оригинальное время сообщения: 22 авг 2016 ---
    Acad_Surface (6) 22.08.2016
    Идя навстречу пожеланиям трудящихся: special for Qvinto

    Штриховка ('Hatch') в AutoCAD для программирования вещь непростая.
    В СИ (в отличии от AutoLISP и VBA) функция штриховки (AddHatch) не работает.
    Вот как это прописано в acax17enu.h (acax17enu.tlb):
    hr = AddHatch(IAcadModelSpace *This, INT PatternType, BSTR PatternName, VARIANT_BOOL Associativity, VARIANT HatchObjectType, IAcadHatch* *pResult);
    или через макрос:
    IAcadModelSpace_AddHatch(This, PatternType, PatternName, Associativity, HatchObjectType, pResult);

    Аргумент 'VARIANT HatchObjectType' совсем не 'typedef enum acHatchObjectType'.
    И если в AutoLISP и VBA этот агрумент необязательный (то есть может быть пропущен), то в СИ без него функция не работает.
    Нигде кроме функции AddHatch аргумент 'HatchObjectType' не встречается.
    И поэтому его "облик" в структуре VARIANT неизвестен.

    Поэтому, после многих безуспешных проб (и ошибок), после чтения форумов на тему 'AutoCAD HATCH', пришлось воспользоваться функцией 'command' из AutoLISP.
    При этом AutoLISP 'command' успешно штрихует 3dFace (если верить Help'у то это невозможно).
    Также в командную строку можно сразу вставить различные свойства штриховки.
    Одним словом старина AutoLISP выручил.

    В приложенном архиве пример создания поверхности (Surface as TIN) из '3dFace' по нерегулярно расположенным точкам:
    1. из точек существующих в текущем чертеже Drawing - кнопка 'SURFACE',
    2. из точек X,Y,Z в файле 'points.txt' - кнопка 'Read File',

    То же самое (1 и 2) можно выполнить используя внешнюю LISP программу (DTM.lsp + DTM.dsl) румынского программиста Nikolae Manda - кнопка 'DTM LISP'.
    Эти два файла должны находиться в системной папке AutoCAD, например в C:\Program Files\AutoCAD 20xx\Support\

    Радиокнопка 'Hatch 3dFaces' для выполнения штриховки всех построенных треугольников.
    Это поможет увидеть пропущенные программой островки поверхности и заполнить их вручную.

    Программный код, выполняющий триангуляцию:
    vdefs.h
    voron_main.c (main.c)
    voronoi.c
    geometry.c
    heap.c
    memory.c
    edgelist.c
    output.c
    его автор Steve J. Fortune ( ©1987-1992 года).
    Не смотря на возраст кода, потребовалось совсем немного исправлений для включения в данный проект.

    Есть и другие свободные исходники, например Clarkson-Delaunay - Ken Clarkson © 1995

    Почти все то, что есть в свободном доступе триангулирует так называемую 'выпуклую оболочку' ('Convex Hull').
    Для серьезной работы требуется реализация "Триангуляция Делоне с условиями", и как все серьезное в открытом доступе отсутствует.

    Это для общего развития:
    http://algolist.manual.ru/maths/geom/
    http://gts.sourceforge.net
     

    Вложения:

    #11
    flareon и Qvinto нравится это.
  12. sklimkim

    Форумчанин

    Регистрация:
    13 июл 2010
    Сообщения:
    218
    Симпатии:
    43
    Адрес:
    Moscow Russia
    Проект скомпилирован для AutoCAD 2012
    Внутри архива исходники, acax18enu.h (from acax18enu.tlb), EXE-файл (65 КБайт), DTM.lsp + DTM.dcl
    То есть можно "щупать" в версии 2010--2012.
     

    Вложения:

    #12
  13. trir

    Форумчанин

    Регистрация:
    25 ноя 2014
    Сообщения:
    3.253
    Симпатии:
    931
    Адрес:
    gnomtrir@mail.ru
  14. sklimkim

    Форумчанин

    Регистрация:
    13 июл 2010
    Сообщения:
    218
    Симпатии:
    43
    Адрес:
    Moscow Russia
    To: trir
    О вкусах не спорят -есть тысячи мнений,
    Я это давно на себе испытал.
    Ведь даже Эйнштейн - физический гений,
    Весьма относительно всё понимал.
    (В.С. Высоцкий)
     
    #14
    flareon нравится это.
  15. sklimkim

    Форумчанин

    Регистрация:
    13 июл 2010
    Сообщения:
    218
    Симпатии:
    43
    Адрес:
    Moscow Russia
    Hatch_ac2012-DTM-LISP_2016-08-25.png Hatch_ac-2012-acax_2016-08-25.png Два варианта программы acad_surface для АутоКАД'а 2010-2012:
    1. треугольники строит ЛИСП-программа DTM.lsp+DTM.dcl (эти файлы надо положить в \AutoCAD xxxx\Support\)
    2. треугольники строит библиотека acax18enu.tlb

    Внутри архива есть FtypeLib.exe - это конвертер XXXX.TLB-->XXXX.H для проектов на голом СИ (не С++).
    Там же DWG-файл пример на 399 точек (специально сделан в "постороннем КАДе" и сохранен как AC-2004).

    Повторю специально для:
    - тех кто в танке,
    - тех кто "Ничего не понял",
    - проповедников их иных "миров, сект и конфессий" -------->>>
    это всего-лишь пример созданий программы, которая:
    - получает доступ к "объектной модели АутоКАД" не изнутри (как VBA, ObjectARX, AutoLISP), а извне,
    - использует для своего функционирования только системные функции ОС Windows-32 и ОДНУ библиотеку АутоКАД acaxXXenu.tlb,
    - скомпилированная в EXE-файл имеет размер 65 КилоБайт,
    - может посылать команды в командную строку АутоКАДа, а может запускать на исполнение LISP-программы,
    - читает из и пишет в внешние для АутоКАД файлы,
    - работает с уже открытым чертежем, или создает новый чертеж АутоКАДа,
    - показывает никак не документированные возможности программирования АутоКАДа ИЗ ЧИСТОГО/ГОЛОГО СИ.

    То есть это для тех кто сам делает (или намеревается делать) программы.
    Для просто пользователей АутоКАДа это игрушка, которая построит поверхность из треугольников '3dFace'.

    Мое скромное мнение (""ИМХО""):
    самый легкий инструмент для программирования в АутоКАД - VBA, который АутоДеск "кинул" вместе с VB-программистами,
    а самый надежный инструмент для программирования в АутоКАД - AutoLISP - его никто "не обидит" - он там изначальный.

    Мне пока нечего добавить, свой интерес я удовлетворил.
    Спорить ни с кем не намерен - пустое это занятие.
     

    Вложения:

    #15
    flareon и Qvinto нравится это.
  16. igor kruchkovskiy

    Форумчанин

    Регистрация:
    10 июн 2012
    Сообщения:
    3.423
    Симпатии:
    1.825
    Адрес:
    Астрахань
    Не совсем понимаю, для чего нужно получать доступ к AutoCad из вне, да ещё и на C, полагаю, что скорее всего со сменой версии пример может перестать работать.Зачем в этом случае вообще AutoCad и чем Вам net API не угодил с его обьектно ориентированным подходом?
     
    #16
  17. stout

    Форумчанин

    Регистрация:
    5 янв 2008
    Сообщения:
    4.172
    Симпатии:
    11.936
    Адрес:
    Златоглавая и Белокаменная
    igor kruchkovskiy, загляните автору топика в профиль.
     
    #17
    igor kruchkovskiy нравится это.
  18. igor kruchkovskiy

    Форумчанин

    Регистрация:
    10 июн 2012
    Сообщения:
    3.423
    Симпатии:
    1.825
    Адрес:
    Астрахань
    sklimkim,
    Да, спасибо все понял. Удивительно конечно, что только не придумают из-за лени.
     
    #18
  19. MaxKal

    Форумчанин

    Регистрация:
    17 окт 2014
    Сообщения:
    172
    Симпатии:
    206
    Адрес:
    Краснодар
    Вот это поток сознания
     
    #19

Поделиться этой страницей

  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление