| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLisp и база данных SQL-сервера

AutoLisp и база данных SQL-сервера

Ответ
Поиск в этой теме
Непрочитано 10.12.2008, 08:37
AutoLisp и база данных SQL-сервера
Макс_Кунгур
 
Регистрация: 10.12.2008
Сообщений: 122

Добрый день. Подскажите, пожалуйста. Есть база данных SQL-сервера, в которой находятся координаты X и Y в таблице (название базы - basa, название таблицы - bur, название столбца X - XX, название столбца Y - YY). Как мне при помощи AutoLisp взять эти данные из таблицы и по этим двум координатам построить в AutoCad-е 2007 линию, а точнее перпендикуляр, начиная с этой точки с координатами (X,Y).
Просмотров: 21284
 
Автор темы   Непрочитано 11.12.2008, 09:44
#21
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


Как связать то, что мы получили из БД с рисованием линии?
Макс_Кунгур вне форума  
 
Непрочитано 11.12.2008, 10:08
#22
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


По аналогии

Код:
[Выделить все]
SELECT YY
FROM Table_name
WHERE ((([BUR]) = 00005));

SELECT ХХ
FROM Table_name
WHERE ((([BUR]) = 00005));

Потом данные нужно привести к нормальномы виду!
вот на своей машине я попробовал работу функции, присвоил результату твои значения и привел их к нужному виду

Код:
[Выделить все]
 (setq Result (list(list "YY")(list 8014.5)))

(setq lst(mapcar(function (lambda (a) (substr a 2 (- (strlen a) 2)))) (mapcar (function VL-PRINC-TO-STRING)(cdr Result))))
(setq pt(atoi(vl-string-trim " " (apply 'strcat (mapcar '(LAMBDA(a) (strcat a " ")) lst))))) 
(("YY") (8014.5))
("8014.5")
8014
ну и последнее, линия строится очень просто

Код:
[Выделить все]
(VL-CMDF "LINE" pt1 pt2 "")
Holon вне форума  
 
Автор темы   Непрочитано 11.12.2008, 10:37
#23
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


Holon, можешь мне полностью код получившегося написать, а то я разобраться не могу куда что вставить.
Макс_Кунгур вне форума  
 
Непрочитано 11.12.2008, 11:23
#24
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Я могу написать , что это тебе даст, лисп который берет координату одной точки из строки в таблице базы
"00001" и "00005" и построит между ними линию, я думаю задача не заключается в этом, она намного шире,
здесь только пример работы с базой, опиши конкретную задачу с окончательным результатом
Holon вне форума  
 
Автор темы   Непрочитано 11.12.2008, 11:45
#25
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


Дано - БД с таблицей, в которой 5 столбцов: 1 - BUR (номер), 2 - YY (координата по оси Y), 3 - XX (координата по оси X), 4 - дата (этот столбец нам не нужен), 5 - GL (глубина, т.е. расстояние от (XX,YY) до любой произвольной точки T1).
Результат - нужно связаться с БД, взять информацию о 1,2,3,5 , исходя из этой информации построить линию (перпендикуляр) от точки (XX,YY) до точки T1. Но перед построением лисп должен спросить номер (BUR), по которому нужно сделать линию (или несколько номеров). Или - есть карта, на которой отмечены эти все номера. Выбираем на карте эти номера, нажимаем какую-нибудь кнопку, и в другом окне строится эта линия. Вроде бы все.
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 11.12.2008, 11:54
#26
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


номеров в базе больше 4000, главное сделать по выбору номера
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 11.12.2008, 11:56
#27
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


есть приложение, которое заносит в БД эти данные, количество номеров с каждым днем растет
Макс_Кунгур вне форума  
 
Непрочитано 11.12.2008, 12:57
#28
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Сложность заключается в том, что на моей машине не установлен сервер MS SQL,
и мне придется все делать вслепую, конечно можно попробовать, тогда тебе придется
присылать мне разультаты тестов, для начала изменим вызов функции, добавим в нее
аргумент теперь вызов функции в командной строке будет выглядеть так:

Код:
[Выделить все]
(if(setq bur (getint "Enter a number bur: "))(qqq bur))
И изменим немного сам код:
Код:
[Выделить все]
(if (not ADOLISP_ConnectToDB)
  (load "ADOLISP_Library.lsp")
)

;;;                 (if(setq bur (getint "Enter a number bur: "))(qqq bur))
(defun qqq (bur / ConnectionObject Result Result1 ConnectString SQLStatement SQLStatement1	      
                  TablesList ColumnsList lst pt lst1 pt1)                 
  (setq ConnectString
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=server_name\\base_name;Initial  Catalog=table_name")
  (prompt (strcat "\n\nConnecting to the database using \n\""  ConnectString "\"" ))
  (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString  "User" "Password")))
  (progn (prompt "\nConnection failed!")(ADOLISP_ErrorPrinter))
  (prompt "\nResult: succeeded!"))
  ;; If we got a connection ...
  (if ConnectionObject
  (progn (setq
	   
SQLStatement
(strcat "SELECT YY
FROM Table_name
WHERE ((([BUR]) = "bur"));")
	       
SQLStatement1	       
(strcat"SELECT XX
FROM Table_name
WHERE ((([BUR]) = "bur"));")
)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement SQLStatement1  "\""))
  (if (setq
	Result  (ADOLISP_DoSQL ConnectionObject SQLStatement)
	Result1 (ADOLISP_DoSQL ConnectionObject SQLStatement1 )
	)
  (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
  (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)
 (print Result)
     (print Result1)





    )
  )
  (prin1)
)
(prin1)
Теперь по заданной точке в BUR нам будут возвращаться значения, сразу выстави результат, чтобы
можно было продолжить.
Holon вне форума  
 
Автор темы   Непрочитано 11.12.2008, 13:45
#29
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


когда ввожу qqq программа пишет Unknown command "QQQ". Press F1 for help.
Макс_Кунгур вне форума  
 
Непрочитано 11.12.2008, 13:57
#30
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Я же написал вызывается
(if(setq bur (getint "Enter a number bur: "))(qqq bur))
т.е эту строку нужно скопировать в коммандную потом ENTER и
введи номер BUR и ENTER
Holon вне форума  
 
Непрочитано 11.12.2008, 14:04
#31
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


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

Код:
[Выделить все]
;;;********************************************* MS SQL *********************************************************
(if (not ADOLISP_ConnectToDB)
  (load "ADOLISP_Library.lsp")
)

;;;                 (if(setq bur (getint "Enter a number bur: "))(qqq bur))
(defun qqq (bur / ConnectionObject Result Result1 ConnectString SQLStatement SQLStatement1	      
                  TablesList ColumnsList lst pt lst1 pt1)
  (setq ConnectString
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=server_name\\base_name;Initial  Catalog=table_name")
  (prompt (strcat "\n\nConnecting to the database using \n\""  ConnectString "\"" ))
  (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString  "User" "Password")))
  (progn (prompt "\nConnection failed!")(ADOLISP_ErrorPrinter))
  (prompt "\nResult: succeeded!"))
  ;; If we got a connection ...
  (if ConnectionObject
  (progn (setq
	   
SQLStatement
(strcat "SELECT YY
FROM Table_name
WHERE ((([BUR]) = "bur"));")
	       
SQLStatement1	       
(strcat"SELECT XX
FROM Table_name
WHERE ((([BUR]) = "bur"));")
)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement SQLStatement1  "\""))
  (if (setq
	Result  (ADOLISP_DoSQL ConnectionObject SQLStatement)
	Result1 (ADOLISP_DoSQL ConnectionObject SQLStatement1 )
	)
  (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
  (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)
 (print Result)
     (print Result1)

    
(VL-CMDF "LINE" (Result->Point Result) (Result->Point Result1) "")




    )
  )
  (prin1)
)
(prin1)


;;;(setq Result (list(list "YY")(list 8014.5))) (Result->Point Result)
(defun Result->Point (Result / pt lst nch point)
(setq lst(mapcar(function (lambda (a) (substr a 2 (- (strlen a) 2)))) (mapcar (function VL-PRINC-TO-STRING)(cdr Result))))
(setq pt(vl-string-trim " " (apply 'strcat (mapcar '(LAMBDA(a) (strcat a " ")) lst))))		      
(setq nch (strlen pt) x1(atoi pt)
      x2(substr pt (+(strlen(itoa x1))2)(- nch (strlen(itoa x1))))
      point(list x1 (atoi x2)))
  )
Holon вне форума  
 
Автор темы   Непрочитано 11.12.2008, 14:10
#32
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


Пишет Connecting to the database using
"Provider=SQLOLEDB.1;Data Source=MAXIM;Initial Catalog=baza_pgu"
Result: succeeded!; error: bad argument type: stringp 1
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 11.12.2008, 14:25
#33
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


И еще, ты меня наверно не допонял чуть-чуть. В базе кроме номера, координаты по X и координаты по Y, есть очень важный аргумент GL - 5-й столбец. В нем хранится длина линии, которую нужно нарисовать. От точки с координатами (XX,YY) до точки, которую можно определить, как я понимаю, через функцию POLAR - определение точки путем перемещения от точки (XX,YY) на расстояние GL (это обязательный аргумент). А в скрипте я не вижу его.
Макс_Кунгур вне форума  
 
Непрочитано 11.12.2008, 15:17
#34
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Что возвращается вот так:
Код:
[Выделить все]
(if (not ADOLISP_ConnectToDB)
  (load "ADOLISP_Library.lsp")
)

;;;                 (if(setq bur (getint "Enter a number bur: "))(qqq bur))
(defun qqq (bur / ConnectionObject Result Result1 ConnectString SQLStatement SQLStatement1	      
                  TablesList ColumnsList lst pt lst1 pt1)
  (setq ConnectString
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=server_name\\base_name;Initial  Catalog=table_name")
  (prompt (strcat "\n\nConnecting to the database using \n\""  ConnectString "\"" ))
  (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString  "User" "Password")))
  (progn (prompt "\nConnection failed!")(ADOLISP_ErrorPrinter))
  (prompt "\nResult: succeeded!"))
  ;; If we got a connection ...
  (if ConnectionObject
  (progn (setq
	   
SQLStatement
(strcat "SELECT YY
FROM Table_name
WHERE ((([BUR]) = "(itoa bur)"));")
	       
SQLStatement1	       
(strcat"SELECT XX
FROM Table_name
WHERE ((([BUR]) = "(itoa bur)"));")
)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement SQLStatement1  "\""))
  (if (setq
	Result  (ADOLISP_DoSQL ConnectionObject SQLStatement)
	Result1 (ADOLISP_DoSQL ConnectionObject SQLStatement1 )
	)
  (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
  (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)
 (print Result)
     (print Result1)

    
;;;(VL-CMDF "LINE" (Result->Point Result) (Result->Point Result1) "")




    )
  )
  (prin1)
)
(prin1)
Holon вне форума  
 
Автор темы   Непрочитано 11.12.2008, 15:36
#35
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


Заработало, только ты прочитай мое предыдущее сообщение по поводу GL.
Команда: (if(setq bur (getint "Enter a number bur: "))(qqq bur))
Enter a number bur: 1


Connecting to the database using
"Provider=SQLOLEDB.1;Data Source=MAXIM;Initial Catalog=basa"
Result: succeeded!

Inserting a row:
"SELECT YY
FROM bur31
WHERE ((([BUR]) = 1));SELECT XX
FROM bur31
WHERE ((([BUR]) = 1));"
Result:
Succeeded!

Disconnecting from the database

(("YY") (8014.5))
(("XX") (16761.0))
Макс_Кунгур вне форума  
 
Непрочитано 11.12.2008, 16:10
#36
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Ты мне ответь на вопрос базисную линию отрисовывает правильно или нет
и второе давай посмотрим, что возвращает запрос по GL.

Код:
[Выделить все]
(if (not ADOLISP_ConnectToDB)
  (load "ADOLISP_Library.lsp")
)

;;;                 (if(setq bur (getint "Enter a number bur: "))(qqq bur))
(defun qqq (bur / ConnectionObject Result Result1 ConnectString SQLStatement SQLStatement1 SQLStatement2	      
                  TablesList ColumnsList lst pt lst1 pt1)
  (setq ConnectString
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=server_name\\base_name;Initial  Catalog=table_name")
  (prompt (strcat "\n\nConnecting to the database using \n\""  ConnectString "\"" ))
  (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString  "User" "Password")))
  (progn (prompt "\nConnection failed!")(ADOLISP_ErrorPrinter))
  (prompt "\nResult: succeeded!"))
  ;; If we got a connection ...
  (if ConnectionObject
  (progn (setq
	   
SQLStatement
(strcat "SELECT YY
FROM Table_name
WHERE ((([BUR]) = "(itoa bur)"));")
	       
SQLStatement1	       
(strcat"SELECT XX
FROM Table_name
WHERE ((([BUR]) = "(itoa bur)"));")

SQLStatement2	       
(strcat"SELECT GL
FROM Table_name
WHERE ((([BUR]) = "(itoa bur)"));")

)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement SQLStatement1 SQLStatement2 "\""))
  (if (setq
	Result  (ADOLISP_DoSQL ConnectionObject SQLStatement)
	Result1 (ADOLISP_DoSQL ConnectionObject SQLStatement1 )
	Result2 (ADOLISP_DoSQL ConnectionObject SQLStatement2 )
	)
  (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
  (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)
(VL-CMDF "LINE" (Result->Point Result) (Result->Point Result1) "")
(print Result2)

    
   )
  )
  (prin1)
)
(prin1)


(defun Result->Point (Result / pt lst nch point)
(setq lst(mapcar(function (lambda (a) (substr a 2 (- (strlen a) 2)))) (mapcar (function VL-PRINC-TO-STRING)(cdr Result))))
(setq pt(vl-string-trim " " (apply 'strcat (mapcar '(LAMBDA(a) (strcat a " ")) lst))))		      
(setq nch (strlen pt) x1(atoi pt)
      x2(substr pt (+(strlen(itoa x1))2)(- nch (strlen(itoa x1))))
      point(list x1 (atoi x2)))
  )
Holon вне форума  
 
Автор темы   Непрочитано 12.12.2008, 07:21
#37
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


Запрос по GL возвращает:
Connecting to the database using
"Provider=SQLOLEDB.1;Data Source=MAXIM;Initial Catalog=basa"
Result: succeeded!

Inserting a row:
"SELECT YY
FROM bur31
WHERE ((([BUR]) = 5));SELECT XX
FROM bur31
WHERE ((([BUR]) = 5));SELECT GL
FROM bur31
WHERE ((([BUR]) = 5));"
Result:
Succeeded!

Disconnecting from the database
LINE Укажите первую точку:
Укажите следующую точку или [Undo]:
Укажите следующую точку или [Undo]:
Команда:
(("GL") (15.0))

главное чтобы координаты совпадали, и размер на чертеже. а можно будет вывести систему координат x и y вместе с этой линией?
Макс_Кунгур вне форума  
 
Непрочитано 12.12.2008, 09:24
#38
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Ну так линию рисует правильно или нет, и куда нужно дорисовать (("GL") (15.0)),
или уже все нормально, только надо вывести на экран текст с координатами точек,
тогда сообщи имя стиля, или можно стиль тоже создать програмно, тогда
скажи имя используемого "фонта" его высоту, или может быть блок
с атрибутами и заполнить его програмно, кстати все можно вынести в отдельные слои и т.д.?
Holon вне форума  
 
Автор темы   Непрочитано 12.12.2008, 09:56
#39
Макс_Кунгур


 
Регистрация: 10.12.2008
Сообщений: 122


линию вообще не рисует, в том то и дело. точки XX и YY это одно целое, линия должна идти не от XX до YY, а от точки (XX,YY) до произвольной точки на плоскости на расстоянии GL. Выкладываю рисунок, в котором показано что должно быть на выходе. Стиль можно взять любой, на твое желание, пока это не важно, главное чтобы рисунок выходил, как я понимаю, потом можно будет поменять, на такой какой нужен. (по умолчанию у меня acadiso.dwt)
Миниатюры
Нажмите на изображение для увеличения
Название: ris.JPG
Просмотров: 122
Размер:	20.6 Кб
ID:	13414  
Макс_Кунгур вне форума  
 
Непрочитано 12.12.2008, 13:13
#40
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


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

Код:
[Выделить все]
(if (not ADOLISP_ConnectToDB)
  (load "ADOLISP_Library.lsp")
)

;;;                 (if(setq bur (getint "Enter a number bur: "))(qqq bur))
(defun qqq (bur / ConnectionObject Result Result1 ConnectString SQLStatement SQLStatement1 SQLStatement2	      
                  TablesList ColumnsList ang last_pt)
  (setq ConnectString
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=server_name\\base_name;Initial  Catalog=table_name")
  (prompt (strcat "\n\nConnecting to the database using \n\""  ConnectString "\"" ))
  (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString  "User" "Password")))
  (progn (prompt "\nConnection failed!")(ADOLISP_ErrorPrinter))
  (prompt "\nResult: succeeded!"))
  ;; If we got a connection ...
  (if ConnectionObject
  (progn (setq
	   
SQLStatement
(strcat "SELECT YY
FROM Table_name
WHERE ((([BUR]) = "(itoa bur)"));")
	       
SQLStatement1	       
(strcat"SELECT XX
FROM Table_name
WHERE ((([BUR]) = "(itoa bur)"));")

SQLStatement2	       
(strcat"SELECT GL
FROM Table_name
WHERE ((([BUR]) = "(itoa bur)"));")

)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement SQLStatement1 SQLStatement2 "\""))
  (if (setq
	Result  (ADOLISP_DoSQL ConnectionObject SQLStatement)
	Result1 (ADOLISP_DoSQL ConnectionObject SQLStatement1 )
	Result2 (ADOLISP_DoSQL ConnectionObject SQLStatement2 )
	)
  (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
  (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)

(setq ang (angle (LIST(Result->Point Result1) (Result->Point Result))(cdr (getpoint "\nSelect point by BUR <Quit> : \n")))
    last_pt(polar(LIST(Result->Point Result1) (Result->Point Result)) ang (Result->Point Result)))
 
(VL-CMDF "_LINE" (LIST(Result->Point Result1) (Result->Point Result)) last_pt "")
   )
  )
  (prin1)
)
(prin1)

;;;                        (setq Result (list(list "YY")(list 8014.5)))(result_SQL->Point  Result )
(defun result_SQL->Point( Result / pt)
(setq pt(atoi(vl-string-trim " " (apply 'strcat (mapcar '(LAMBDA(a) (strcat a " "))
(mapcar(function (lambda (a) (substr a 2 (- (strlen a) 2)))) (mapcar (function VL-PRINC-TO-STRING)(cdr Result)))))))) 
)
Holon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > AutoLisp и база данных SQL-сервера

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
База данных Лира Koker Лира / Лира-САПР 4 28.08.2006 15:47
База данных площадей помещений с привязкой к замкн. контуру. elena_din AutoCAD 19 19.08.2005 13:40
база данных программы Autodesk Building Systems 2005 Angel80 Прочее. Программное обеспечение 3 06.10.2004 06:28