Всем желаю здравия!
В этом посте будет рассмотрен пример работы кода AUTOLISP с СУБД MSSQL.
В данном примере автокад построит нам квадрат по координатам взятым из БД MSSQL.
Для этого мы создадим тестовую базу данных, затем в ней создадим таблицу и заполним ее данными.
После этого напишем код на языке AUTOLISP, который будет соединятся с базой данных MSSQL, считывать из нее координаты точек и по ним вычерчивать квадрат. Дамп базы данных и код выложены в конце поста отдельными файлами.
Итак, для начала мы создадим тестовую базу данных с именем afp:
USE [master] GO /****** Создаем базу afp ******/ CREATE DATABASE [afp] CONTAINMENT = NONE ON PRIMARY ( NAME = N'afp', FILENAME = N'c:\afp.mdf' , SIZE = 5120KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB ) LOG ON ( NAME = N'afp_log', FILENAME = N'c:\afp_log.ldf' , SIZE = 1024KB , MAXSIZE = 2048GB , FILEGROWTH = 10%) GO
В данном примере файлы БД и журнала создаются в корне диска C. Если у вас есть желание — можете указать любую папку. Если при выполнении запроса появляется ошибка «Операция CREATE FILE вызвала ошибку операционной системы 5(Отказано в доступе.) при попытке открыть либо создать физический файл…» необходимо сделать следующее:
Запустить оснастку Services, найти службу SQL Server и посмотреть под какой учетной записью она запускается.
Далее установить права на создание, чтение, изменение для папки в которой будут создаваться файлы БД для этой учетной записи.
Теперь когда база данных существует, создаем в ней таблицу coordinates из трех столбцов: coordinatesId, x, y. В столбцах x, y будут храниться координаты точек по которым автокад в дальнейшем построит квадрат.
/****** Создаем таблицу ******/ USE [afp] GO CREATE TABLE [dbo].[coordinates]( [coordinatesId] [INT] NOT NULL, [x] [INT] NOT NULL, [y] [INT] NOT NULL ) ON [PRIMARY] GO
Заполняем таблицу координатами.
/****** добавляем в таблицу координаты квадрата ******/ USE [afp] GO INSERT INTO [dbo].[coordinates] ([coordinatesId] ,[x] ,[y]) VALUES (1,0,0) ,(2,10,0) ,(3,10,10) ,(4,0,10) ,(5,0,0) GO
Вот и все что касается базы данных, теперь напишем небольшой код на lisp.
(vl-load-com) ; загружает функции, входящие в расширение AutoLISP, позволяющее работать с объектами, свойствами, методами и событиями ActiveX. (setq acad_application (vlax-get-acad-object)) ;Читает указатель корневого объекта иерархии AutoCAD (setq active_document (vla-get-ActiveDocument acad_application)) ; Читает указатель открытого документа (setq model_space (vla-get-ModelSpace active_document)) ; Читает указатель объекта ModelSpace (пространства модели рисунка). (setq paper_space (vla-get-PaperSpace active_document)) ; Читает указатель объекта PaperSpace (пространства листа документа). (setq Server "укажите имя сервера" Database "укажите имя базы данных" UID "укажите имя пользователя" PWD "укажите пароль" ) (load "укажите путь до библиотеки ADOLISP_Library") ; подгружаем библиотеку ADOLISP_Library (setq ConnectString (strcat "Provider=SQLOLEDB;Data Source="Server";Initial Catalog="Database";User ID="UID";Password="PWD) ) (if (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString UID PWD)) (progn ;true (princ "\n Connection to " Database " succeeded!") ; вывод в командную строку );true (progn ;false (princ "\n Connection to " Database " failed!") ; вывод в командную строку );false );if (setq query "SELECT x, y FROM coordinates") ;создаем строку запроса (setq result (ADOLISP_DoSQL ConnectionObject query)); выполняем запрос к базе данных (if (null result) ; если запрос не вернул строк (progn ; true (if (null ADOLISP_ErrorList) (progn ;true (princ "\nЗапрос не вернул ни одной строки.") ) (progn ;false (princ "\n Запрос выполнен с ошибками.") ) ) ); true ; если запрос вернул строки (progn ; false (setq coordinates_list_length (1- (length result))) ; узнаем количество строк (princ (strcat "\n Запрос вернул [" (itoa coordinates_list_length)"] строк.")) (setq n 1) ; запускаем цикл в котором чертим в пространстве модели ; отрезки от одной точки до другой (while (< n coordinates_list_length) ; cond (vla-AddLine model_space (vlax-3D-point (nth n result)) (vlax-3D-point (nth (1+ n) result))) (setq n (1+ n)) ;iteration ) ;(while (< n coordinates_list_length) ); false ); if (null result) (princ)
Для работоспособности кода на вашей машине необходимо в тех местах где написано «Укажите…» указать ваши пути, пароли и т.д.
Если необходимо записать видео по этой теме или есть какие-то вопросы и сложности — пишите в комментариях, будем решать по мере возможностей.
Файл AUTOLISP, устанавливает соединение с тестовой БД afp, считывает координаты из таблицы, строит с помощью отрезков квадрат по координатам.
Дамп тестовой базы данных afp. Можно поднять с помощью SQL server management Studio, или кто как умеет…
Привет!
Ребята, давайте что-нибудь залиспем вместе ! Упорно (когда есть свободное время) тружусь над трассировкой и параллельно еще несколько разработок смежных делаю.
1. как подключиться к MySQL?. Идея такая: установить Denwer (сайт в ЛВС офиса/ов ), на сайте через php дать работать с БД коллегам, и из этой же БД как в ваших примерах выкорчевывать информацию.
2. не нашел контакты — надеюсь мои увидите.
3. о себе см. сайт. Там же интересными могут быть некоторые наработки.