Пример работы кода AUTOLISP с СУБД MSSQL

Всем желаю здравия!
В этом посте будет рассмотрен пример работы кода 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)

Для работоспособности кода на вашей машине необходимо в тех местах где написано «Укажите…» указать ваши пути, пароли и т.д.
Если необходимо записать видео по этой теме или есть какие-то вопросы и сложности — пишите в комментариях, будем решать по мере возможностей.

drawSquare.lsp

Файл AUTOLISP, устанавливает соединение с тестовой БД afp, считывает координаты из таблицы, строит с помощью отрезков квадрат по координатам.

Size: 2 kB

Дамп базы AFP

Дамп тестовой базы данных afp. Можно поднять с помощью SQL server management Studio, или кто как умеет…

Size: 303 kB

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *