Форум программистов, компьютерный форум, киберфорум
AutoCAD
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/26: Рейтинг темы: голосов - 26, средняя оценка - 4.62
14 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 6
1

Доступ к объектной модели AutoCAD из внешней СИ-программы

02.07.2016, 22:11. Показов 4867. Ответов 5
Метки нет (Все метки)

Доступ к объектной модели 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 bla-bla-bla;

и они таки вставят их в нужном месте, если не хотят переделывать код из СИ в СИ++ для компиляции в MS-VS.

Поскольку СИ (не СИ++) компиляторы не работают с TLB-библиотеками напрамую, как в C++:
Код
#import "C:\\Program Files\\Common Files\\Autodesk Shared\\acaxNNenu.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

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

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

Вот пожалуй и всё.
Миниатюры
Доступ к объектной модели AutoCAD из внешней СИ-программы  
Вложения
Тип файла: zip acad_arrows_9.zip (374.8 Кб, 22 просмотров)
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2016, 22:11
Ответы с готовыми решениями:

Доступ к компонентам внешней программы
Всем привет, мне надо обратиться к внешней программе(это я умею) и добраться в нем к компоненту...

Проектирование объектной модели
Здравствуйте! Есть задание спроектировать объектную модель определённый предметной области....

Использование объектной модели
Вопрос такой - Есть программа, к которой будут писаться 'плагины'. Плагины - это обычные DLL-ки...

Свойства объектной модели
Всем добрый день. Для работы программы мне нужно знать размеры вставляемой jpg картинки. Читаю...

5
14 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 6
02.07.2016, 22:23  [ТС] 2
У меня нет возможности показать всё это на более современных версиях АутоКАДа
В наличии только 2007, а для иных версий вот:
Программа для трансляции TLB-->H
Вложения
Тип файла: zip FtypeLib.zip (30.0 Кб, 11 просмотров)
0
14 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 6
22.08.2016, 23:05  [ТС] 3
Acad_Surface (6) 22.08.2016

Штриховка ('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 (c 1987-1992 года).
Не смотря на возраст кода, потребовалось совсем немного исправлений для включения в данный проект.

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

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

Это для общего развития:
http://algolist.manual.ru/maths/geom/
http://gts.sourceforge.net
Миниатюры
Доступ к объектной модели AutoCAD из внешней СИ-программы   Доступ к объектной модели AutoCAD из внешней СИ-программы   Доступ к объектной модели AutoCAD из внешней СИ-программы  

Вложения
Тип файла: zip acad_surface_6.zip (287.4 Кб, 10 просмотров)
Тип файла: zip TEST_3dFaces_3_DWG.zip (78.3 Кб, 10 просмотров)
0
14 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 6
22.08.2016, 23:42  [ТС] 4
DTM.lsp + DTM.dcl
Вложения
Тип файла: zip DTM_LISP.ZIP (12.2 Кб, 8 просмотров)
0
14 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 6
23.08.2016, 17:42  [ТС] 5
AutoCAD-Surface скомпилированный для версии 2012
Внутри архива исходники (проект) EXE-файл и файлы DTM-LISP
Вложения
Тип файла: zip for_acad_2012.zip (452.7 Кб, 9 просмотров)
0
14 / 0 / 0
Регистрация: 02.07.2016
Сообщений: 6
25.08.2016, 16:03  [ТС] 6
Два варианта программы 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 - его никто "не обидит" - он там изначальный.

Мне пока нечего добавить, свой интерес я удовлетворил.
Спорить ни с кем не намерен - пустое это занятие.
Миниатюры
Доступ к объектной модели AutoCAD из внешней СИ-программы   Доступ к объектной модели AutoCAD из внешней СИ-программы  
Вложения
Тип файла: zip acad-surface_ac-2012.zip (1,008.1 Кб, 16 просмотров)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2016, 16:03

Word: Цикл по элементам объектной модели
Добрый день! Второй год изучаю программирование VBA в Wорде. В основном изучал его по книгам, так...

Использование объектной модели html-документа
Здравствуйте, у меня есть необходимость парсить html-документа получаемый с помощью классов...

Справочник по объектной модели VBA Excel
Всем привет. Прошу знающих подсказать, есть ли какой то справочник по иерархии объектов VBA Excel...

Нумерация страниц посредством объектной модели Ворда
Приветствую ! Подскажите, как с помощью объектной модели ворда можно пронумеровать страницы ? Также...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.