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

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

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

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

Добрый день. Подскажите, пожалуйста. Есть база данных SQL-сервера, в которой находятся координаты X и Y в таблице (название базы - basa, название таблицы - bur, название столбца X - XX, название столбца Y - YY). Как мне при помощи AutoLisp взять эти данные из таблицы и по этим двум координатам построить в AutoCad-е 2007 линию, а точнее перпендикуляр, начиная с этой точки с координатами (X,Y).
Просмотров: 14978
 
Непрочитано 10.12.2008, 09:51
#2
Holon

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


Вопрос очень расплывчат, неуказан тип сервера, неизвестно в каком виде хранятся данные в таблицах,
хотя проблема вполне решаема, к примеру представим, что сервер MySQL, находится на локальной машине,
на ней установлен ODBC 3.51 Driver имя пользователя root без пароля, посмотри в каком виде вернется результат
и дальше строй и ресуй все, что тебе нравится обязательно поблагодари создателей библиотеки ADOLISP_Library,
для начала вроде все.
Твой код примерно будет выглядеть так:
Код:
[Выделить все]
;;;********************************************* MySQL *********************************************************

(if (not ADOLISP_ConnectToDB)
  (load "ADOLISP_Library.lsp")
)


(defun C:MYSQL (/ ConnectionObject Result ConnectString SQLStatement SQLStatement1	      
                  TablesList ColumnsList)

  (setq ConnectString
"DATABASE=basa;DRIVER={MySQL ODBC 3.51 Driver};OPTION=0;PORT=0;SERVER=localhost;UID=root"
        )

       
  (prompt (strcat "\n\nConnecting to the database using \n\""  ConnectString "\"" ))
  (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString "root" " ")))
  (progn (prompt "\nConnection failed!")(ADOLISP_ErrorPrinter))
  (prompt "\nResult: succeeded!")) ;; If we got a connection ...
  (if ConnectionObject
  (progn (setq
	   SQLStatement
"SELECT X FROM bur;"
	   SQLStatement1
"SELECT y FROM bur;"	    

		
)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement  SQLStatement1 "\""))
  (if (and(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)
    

    )
  )
  (prin1)
)
(prin1)
Holon вне форума  
 
Непрочитано 10.12.2008, 09:57
#3
DonJad


 
Регистрация: 20.12.2005
Murmansk
Сообщений: 107


в голову приходит только вариант писать сторонее приложение, в котором связываться с базой, и из ниго в акаде уже отрисовывать... просто не представляю как лиспом таблицу из бд получить....
DonJad вне форума  
 
Автор темы   Непрочитано 10.12.2008, 11:04 Ответ Holon-у
#4
Макс_Кунгур


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


Holon, отвечаю тебе на вопрос.
Тип сервера - sql server 2000 (MSDE). В таблице 1-й столбец BUR (data type - nvarchar(6)) - номер, 2-й столбец - YY (data type - float) - координата по Y, 3-й столбец - XX (data type - float) - координата по X, 4-й нам не нужен, и 5-й столбец - GL (data type - float) - глубина (т.е. расстояние от точки (X,Y) до второй точки в линии)
Примерно выглядит вот так -
BUR YY XX ZZ GL
00001 8014 16761 145
....... ...... ....... ......

Сервер находится на локальной машине (MAXIM - название сервера)
Макс_Кунгур вне форума  
 
Непрочитано 10.12.2008, 11:23
#5
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 10,931


В общем случае:

1. Надо иметь OLEDB Provider для соответствующего SQL-сервера. Для MS SQL это штатная msado15.dll (или более свежая версия).

2. Иметь набор библиотечных функций для работы из VisualLISP с SQL-сервером, путем отправки SQL-запросов. За основу можно взять ADOLisp вот здеся http://acad.fleming-group.com/index.html

3. Написать собственные функции для преобразования данных, полученных из БД в стребуемый вид, например в списки координат для рисования отрезков, полилиний и чего угодно.

4. Здесь не надо делать никакого стороннего приложения - именно из LISP и внутри AutoCAD. А вот редактирование самой БД, с визуальными средствами, может быть сделано и сторонним приложением. Еще лучше - COM-сервером, с которым тот же LISP будет работать. Заодно и координаты в таблицу БД будет легче отправлять.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 10.12.2008, 11:48
#6
Макс_Кунгур


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


ShaggyDoc, OLEDB Provider есть, в AutoCad 2007 встроен DbConnect Manager, а вот с третьим проблематично, написать собственные функции для преобразования я не смогу, вот и прошу вас о помощи. В общем то я понимаю как это должно выглядеть, а вот если в частном - не знаю как написать, подскажи хотя бы одну функцию для преобразования, буду благодарен.
Макс_Кунгур вне форума  
 
Непрочитано 10.12.2008, 12:10
#7
Holon

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


90% всей работы это подключится к серверу попробуй подключится следующим образом:
Код:
[Выделить все]
;;;********************************************* MS SQL *********************************************************
  (if ConnectionObject(if (not ADOLISP_ConnectToDB)
  (load "ADOLISP_Library.lsp")
)


(defun C:qqq (/ ConnectionObject Result ConnectString SQLStatement	      
                  TablesList ColumnsList lst)                 
  (setq ConnectString
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=server_name\\basa;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
		
"SELECT YY
FROM Table_name
WHERE ((([BUR]) = 00001));"
)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement  "\""))
  (if (setq Result (ADOLISP_DoSQL ConnectionObject SQLStatement))
  (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
  (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)
 (print Result)
    
    )
  )
  (prin1)
)
(prin1)
Holon вне форума  
 
Автор темы   Непрочитано 10.12.2008, 13:51
#8
Макс_Кунгур


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


при компиляции пишет error: malformed list on input
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 10.12.2008, 14:06
#9
Макс_Кунгур


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


В строке (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString "User" "Password"))) у меня "для входа в сервер использовать учетные сведения windows"
Макс_Кунгур вне форума  
 
Непрочитано 10.12.2008, 15:11
#10
Holon

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


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


(defun C:qqq (/ ConnectionObject Result ConnectString SQLStatement	      
                  TablesList ColumnsList lst)                 
  (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
		
"SELECT YY
FROM Table_name
WHERE ((([BUR]) = 00001));"
)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement  "\""))
  (if (setq Result (ADOLISP_DoSQL ConnectionObject SQLStatement))
  (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
  (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)
 (print Result)
    
    )
  )
  (prin1)
)
(prin1)
_$
; 21 forms loaded from #<file "U:/LISP/TEST_PRG/ADOLISP_Library.lsp">
; 3 forms loaded from #<editor "U:/LISP/TEST_PRG/wwp_forum.LSP">
_$

Последний раз редактировалось Holon, 10.12.2008 в 15:22.
Holon вне форума  
 
Автор темы   Непрочитано 10.12.2008, 15:38
#11
Макс_Кунгур


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


программа вывела мне то что у тебя в последних двух строчках, а значение YY где должно отобразиться? И что дальше делать?
Макс_Кунгур вне форума  
 
Непрочитано 10.12.2008, 15:49
#12
Holon

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


В командной строке набери qqq
В моделе чертежа ACada нажми F2 и посмотри,что пишет.
Holon вне форума  
 
Автор темы   Непрочитано 11.12.2008, 07:38
#13
Макс_Кунгур


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


Connecting to the database using
"Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=MAXIM\basa;Initial Catalog=bur31"
Connection failed!
Visual LISP message Automation Error. Недопустимый атрибут строки
подключения
Description Недопустимый атрибут строки подключения
HelpContext 0
HelpFile
NativeError 0
Number -2147467259
SQLState 01S00
Source Microsoft OLE DB Provider for SQL Server

Description [DBNETLIB][ConnectionOpen (Connect()).]SQL-сервер не
существует, или отсутствует доступ.
HelpContext 0
HelpFile
NativeError 17
Number -2147467259
SQLState 08001
Source Microsoft OLE DB Provider for SQL Server

Description Не удается инициализировать поставщика данных.
HelpContext 0
HelpFile
NativeError 31
Number -2147467259
SQLState 08001
Source MSDataShape
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 11.12.2008, 07:55
#14
Макс_Кунгур


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


я переделал строку "Provider=MSDataShape;Data Provider=SQLOLEDB;Data Source=MAXIM\\basa;Initial Catalog=bur31" в "Provider=SQLOLEDB.1;Data Source=MAXIM;Initial Catalog=basa". подключение вроде как идет, только не пускает на сервер.
Connecting to the database using
"Provider=SQLOLEDB.1;Data Source=MAXIM;Initial Catalog=basa"
Connection failed!
Visual LISP message Automation Error. Недопустимая спецификация
авторизации

Description Недопустимая спецификация авторизации
HelpContext 0
HelpFile
NativeError 0
Number -2147467259
SQLState 28000
Source Microsoft OLE DB Provider for SQL Server
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 11.12.2008, 08:25
#15
Макс_Кунгур


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


создаю нового пользователя, прописываю, программа пишет
Connecting to the database using
"Provider=SQLOLEDB.1;Data Source=MAXIM;Initial Catalog=baza_pgu"
Connection failed!
Visual LISP message Automation Error. Login failed for user 'GILS'.
Reason: Not associated with a trusted SQL Server connection.

Description Login failed for user 'GILS'. Reason: Not associated with a
trusted SQL Server connection.
HelpContext 0
HelpFile
NativeError 18452
Number -2147467259
SQLState 42000
Source Microsoft OLE DB Provider for SQL Server
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 11.12.2008, 08:37
#16
Макс_Кунгур


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


все разобрался, выдает
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]) = 00001));"
Result:
Succeeded!

Disconnecting from the database

(("YY") (8014.5))

что дальше делать?
Макс_Кунгур вне форума  
 
Непрочитано 11.12.2008, 08:41
#17
Holon

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


тебе надо поиграться, с учетными записями, и для проверки я надеюсь,что ты
незабываешь вносить в эту строку пользователя и пароль:

Код:
[Выделить все]
(if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString  "User" "Password")))
еще попробуй подключится с этой учетной записью без лиспа, может твой новый пользователь
не имеет права доступа к этой таблице, видишь вот здесь он ругается:
Visual LISP message Automation Error. Login failed for user 'GILS'.
Reason: Not associated with a trusted SQL Server connection.
Holon вне форума  
 
Непрочитано 11.12.2008, 09:04
#18
Holon

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


А вот и отличненько, теперь по аналогии получаем вторую точку

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


(defun C:qqq (/ ConnectionObject Result Result1 ConnectString SQLStatement SQLStatement1	      
                  TablesList ColumnsList lst)                 
  (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
"SELECT YY
FROM Table_name
WHERE ((([BUR]) = 00001));"
	       
SQLStatement1	       
"SELECT XX
FROM Table_name
WHERE ((([BUR]) = 00001));"
)
  (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)
Holon вне форума  
 
Автор темы   Непрочитано 11.12.2008, 09:16
#19
Макс_Кунгур


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


вывела обе точки:

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]) = 00001));SELECT XX
FROM bur31
WHERE ((([BUR]) = 00001));"
Result:
Succeeded!

Disconnecting from the database

(("YY") (8014.5))
(("XX") (16761.0))
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 11.12.2008, 09:42
#20
Макс_Кунгур


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


Сейчас нужно построить прямую (перпендикуляр) от точки (XX,YY) до точки (например, T1). Расстояние между точками находится в таблице БД - GL (5-й столбец в БД).
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 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
Просмотров: 112
Размер:	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 вне форума  
 
Автор темы   Непрочитано 12.12.2008, 13:21
#41
Макс_Кунгур


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


пишет
Enter a number bur: 427

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]) = 427));SELECT XX
FROM bur31
WHERE ((([BUR]) = 427));SELECT GL
FROM bur31
WHERE ((([BUR]) = 427));"
Result:
Succeeded!

Disconnecting from the database
; error: no function definition: RESULT->POINT
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 12.12.2008, 13:27
#42
Макс_Кунгур


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


я поменял Result->Point на result_SQL->Point. он пишет Select point by BUR <Quit> : что тут нужно написать, конкретный пример, какую точку для направления?
Макс_Кунгур вне форума  
 
Непрочитано 12.12.2008, 13:29
#43
Holon

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


Кликни мышкой в моделе чертежа
Holon вне форума  
 
Автор темы   Непрочитано 12.12.2008, 13:58
#44
Макс_Кунгур


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


кликнул, ничего не нарисовал, я в скрипте опять не увидел чтобы GL где-то встречалась. там только вывод значения из базы, а Result2 нигде больше не применяется как я понял
Макс_Кунгур вне форума  
 
Непрочитано 12.12.2008, 14:07
#45
Holon

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


Да замени строку,
Код:
[Выделить все]
last_pt(polar(LIST(Result->Point Result1) (Result->Point Result)) ang (Result->Point Result2)))
И всегда присылай мне, что пишет АКад, помни я немогу тестировать код на своей мачине
Holon вне форума  
 
Автор темы   Непрочитано 12.12.2008, 14:21
#46
Макс_Кунгур


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


опять ничего не нарисовал, пишет
Select point by BUR <Quit> :
_LINE Укажите первую точку:
Укажите следующую точку или [Undo]:
Укажите следующую точку или [Undo]:
Макс_Кунгур вне форума  
 
Непрочитано 12.12.2008, 14:58
#47
Holon

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


Почему не ресует все ресует:
Код:
[Выделить все]
(defun c:test (/ Result Result1 Result2 ang last_pt)

                     (setq Result (list(list "YY")(list 8014.5)))
                     (setq Result1 (list(list "xx")(list 16761.0)))
                     (setq Result2 (list(list "GL")(list 15.0)))

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

)

(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 вне форума  
 
Автор темы   Непрочитано 15.12.2008, 07:39
#48
Макс_Кунгур


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


при вызове test пишет
Команда: test

Select point by BUR <Quit> :
'VLIDE _LINE Укажите первую точку:
Укажите следующую точку или [Undo]:
Укажите следующую точку или [Undo]:

Команда: T
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 15.12.2008, 07:40
#49
Макс_Кунгур


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


так ничего не нарисовав
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 15.12.2008, 07:50
#50
Макс_Кунгур


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


я поменял значения YY на 1014.5 и XX на 1761.0 теперь нарисовал, как то нужно к координатам AutoCad привязать, а то программа не видит линию на выходе при больших значениях X и Y. При открытии Autocad у меня max значение по X - 2900, а по Y - 1100
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 15.12.2008, 07:55
#51
Макс_Кунгур


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


а в базе данных по Y min начение 4000 max 13000, по X min значение 9000 max 22000, по GL min 3 max 110
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 15.12.2008, 08:34
#52
Макс_Кунгур


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


все работает, пишет
Команда: (if(setq bur (getint "Enter a number bur: "))(qqq bur))
Enter a number bur: 763


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]) = 763));SELECT XX
FROM bur31
WHERE ((([BUR]) = 763));SELECT GL
FROM bur31
WHERE ((([BUR]) = 763));"
Result:
Succeeded!

Disconnecting from the database

Select point by BUR <Quit> :
_LINE Укажите первую точку:
Укажите следующую точку или [Undo]:
Укажите следующую точку или [Undo]:
после этого я нашел на чертеже эту линию, сейчас главное чтобы она была видна сразу на чертеже, и скажи, пожалуйста, можно сделать так, чтобы программа сразу рисовала линию, не ставив точку на чертеже, т.е. опускала перпендикуляр от точки (XX,YY) на расстояние GL
Макс_Кунгур вне форума  
 
Непрочитано 15.12.2008, 09:09
#53
Holon

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


Добавь _ZOOM
Код:
[Выделить все]
(defun c:test (/ Result Result1 Result2 ang last_pt)

                     (setq Result (list(list "YY")(list 8014.5)))
                     (setq Result1 (list(list "xx")(list 16761.0)))
                     (setq Result2 (list(list "GL")(list 15.0)))

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

(command
		"ZOOM"
		"_w"
		(list (- (car (LIST(result_SQL->Point Result1) (result_SQL->Point Result)0)) 50) (- (cadr (LIST(result_SQL->Point Result1) (result_SQL->Point Result)0)) 50))
		(list (+ (car last_pt) 50) (+ (cadr last_pt) 50))
	      )

)

(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 вне форума  
 
Автор темы   Непрочитано 15.12.2008, 09:42
#54
Макс_Кунгур


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


zoom работает, линию нарисовал прямо на чертеже, пишет
Команда: test

Select point by BUR <Quit> :
_LINE Укажите первую точку:
Укажите следующую точку или [Undo]:
Укажите следующую точку или [Undo]:
Команда: ZOOM
Specify corner of window, enter a scale factor (nX or nXP), or
[All/Center/Dynamic/Extents/Previous/Scale/Window/Object] <real time>: _w
Укажите первый угол: Укажите противоположный угол: Regenerating model.

Команда: nil

теперь как обойтись без перехода на чертеж, чтобы линия была нарисована как перпендикуляр от точки (XX,YY) на расстоянии GL
Макс_Кунгур вне форума  
 
Непрочитано 15.12.2008, 10:13
#55
Holon

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


Имея базу данных можно начертить тысячу линий за один раз,
к примеру указав параметры "ОТ" строки в базе "ДО" строки в базе.............
Вот тебе твой перпендикуляр :-(
Код:
[Выделить все]
(defun c:test (/ Result Result1 Result2  last_pt)

                     (setq Result (list(list "YY")(list 8014.5)))
                     (setq Result1 (list(list "xx")(list 16761.0)))
                     (setq Result2 (list(list "GL")(list 15.0)))
(setq last_pt(polar(LIST(result_SQL->Point Result1) (result_SQL->Point Result)) (/ PI 2) (result_SQL->Point Result2)))
(VL-CMDF "_LINE" (LIST(result_SQL->Point Result1) (result_SQL->Point Result)0) last_pt "")

(command
		"ZOOM"
		"_w"
		(list (- (car (LIST(result_SQL->Point Result1) (result_SQL->Point Result)0)) 50) (- (cadr (LIST(result_SQL->Point Result1) (result_SQL->Point Result)0)) 50))
		(list (+ (car last_pt) 50) (+ (cadr last_pt) 50))
	      )

)

(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 вне форума  
 
Автор темы   Непрочитано 15.12.2008, 10:32
#56
Макс_Кунгур


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


перпендикуляр нарисовался. теперь задача усложняется. в БД есть координата по Z (4-й столбец - "ZZ"). нужно нарисовать в координатной плоскости (X,Y) окружность с центром в точке (XX,YY) - рисунок ris1.jpg, а при переходе в координатную плоскость (X,Z) цилиндр с двумя окружностями, соединенными линиями, на расстоянии GL - рисунок ris2.jpg.
Миниатюры
Нажмите на изображение для увеличения
Название: ris1.JPG
Просмотров: 87
Размер:	20.6 Кб
ID:	13536  Нажмите на изображение для увеличения
Название: ris2.JPG
Просмотров: 92
Размер:	23.0 Кб
ID:	13537  
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 16.12.2008, 11:14
#57
Макс_Кунгур


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


или (даже лучше будет) прямоугольник, изображенный на рисунке ris5.jpg (это при переходе в координатную плоскость (X,Z))
Миниатюры
Нажмите на изображение для увеличения
Название: ris5.JPG
Просмотров: 78
Размер:	19.0 Кб
ID:	13585  
Макс_Кунгур вне форума  
 
Автор темы   Непрочитано 18.12.2008, 14:22 Функция рисования линий c координатами, взятыми из БД SQL-сервера, в AutoLisp
#58
Макс_Кунгур


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


Добрый день. Есть приложение на AutoLisp, которое рисует линию с координатами, взятыми из БД 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 SQLStatement2 SQLStatement3	      
                  TablesList ColumnsList ang last_pt last_pt1 last_pt2)
  (setq ConnectString "Provider=SQLOLEDB.1;Data Source=server_name;Initial Catalog=base_name")
  (prompt (strcat "\n\nConnecting to the database using \n\""  ConnectString "\"" ))
  (if (not (setq ConnectionObject (ADOLISP_ConnectToDB ConnectString  "" "")))
  (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)"));")

SQLStatement3	       
(strcat"SELECT ZZ
FROM table_name
WHERE ((([BUR]) = "(itoa bur)"));")

)
  (prompt (strcat "\n\nInserting a row:\n\""  SQLStatement SQLStatement1 SQLStatement2 SQLStatement3 "\""))
  (if (setq
	Result  (ADOLISP_DoSQL ConnectionObject SQLStatement)
	Result1 (ADOLISP_DoSQL ConnectionObject SQLStatement1 )
	Result2 (ADOLISP_DoSQL ConnectionObject SQLStatement2 )
	Result3 (ADOLISP_DoSQL ConnectionObject SQLStatement3 )
      )
      (prompt "\nResult:\nSucceeded!")(progn(prompt "\nFailed!")(ADOLISP_ErrorPrinter)))
      (prompt "\n\nDisconnecting from the database\n")
      (ADOLISP_DisconnectFromDB ConnectionObject)
      (setq ConnectionObject nil)
      (setq last_pt (polar (LIST (result_SQL->Point Result1) (result_SQL->Point Result) (result_SQL->Point Result3)) (/ PI 2) (result_SQL->Point Result2)))
      (VL-CMDF "_LINE" (LIST(result_SQL->Point Result1) (result_SQL->Point Result) (result_SQL->Point Result3)) last_pt "")
      
      (command
                "ZOOM"
                "_w"
                (list (- (car (LIST(result_SQL->Point Result1) (result_SQL->Point Result) (result_SQL->Point Result3))) 50) (- (cadr (LIST(result_SQL->Point Result1) (result_SQL->Point Result) (result_SQL->Point Result3))) 50))
                (list (+ (car last_pt) 50) (+ (cadr last_pt) 50))
      )
   )
  )
  (prin1)
)
(prin1)

(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)))))))) 
)
Макс_Кунгур вне форума  
 
Непрочитано 18.12.2008, 14:26
#59
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 36,605


Макс_Кунгур, во-первых, теги не забывай проставлять
Во-вторых, нефиг плодить темы. Я их объединил.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 17.07.2017, 18:59
#60
valrond


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


Тут http://allforproject.ru/primer-raboty-koda-lisp-s-subd/ можно посмотреть
valrond вне форума  
 
Непрочитано 14.11.2018, 09:52
#61
tujn08


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


Привет!
Где найти ADOLISP_Library? не могу найти. Ссылки битые.
tujn08 вне форума  
 
Непрочитано 14.11.2018, 10:02
1 | #62
trir


 
Регистрация: 18.12.2010
Сообщений: 3,381


https://www.cadforum.cz/cadforum_en/...sp?fileID=2908
trir вне форума  
 
Непрочитано 14.11.2018, 13:35
#63
tujn08


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


Цитата:
Сообщение от trir Посмотреть сообщение
огромное спасибо.
Осталось научиться подключаться и работать с БД.
tujn08 вне форума  
 
Непрочитано 14.11.2018, 13:43
#64
trir


 
Регистрация: 18.12.2010
Сообщений: 3,381


Через dotNET это гораздо веселее
trir вне форума  
 
Непрочитано 19.06.2019, 17:29
#65
tujn08


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


Подскажите. Насколько реально узнать сервер логин и пароль к БД при использовании ADOlisp через vlx?
Касаемо защиты самой БД и доступа к ней.

Скажем в БД будет список пользователей и "уровень" использования программы и информации из БД.
Перехватить доступ к БД насколько легко?
tujn08 вне форума  
 
Непрочитано 19.06.2019, 17:41
#66
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,011


tujn08, не хватает данных. База локальная или в сети, если в сети, то как Вы собираетесь подключаться к БД, какой протокол, какой туннель, какое шифрование?
Ответ на Ваш вопрос зависит от мелочей... а их Вы не обозначили.
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 19.06.2019, 21:52
#67
tujn08


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
не хватает данных
Код:
[Выделить все]
 (setq ConnectString
		"
		DATABASE=db;
		DRIVER={MySQL ODBC 8.0 ANSI Driver};
		OPTION=0;
		PORT=0;
		SERVER=11.141.192.180;
		UID=qwe;
		Password=123
		"
   )
далее sql запросы. Конечно переменная локальная.
IP логин/пароль разумеется другие.
Подключение есть (в глобальной сети) - проверил.
Ну а дальше как раз и спрашиваю как все сделать более защищенным т.к. первый раз сталкиваюсь.
tujn08 вне форума  
 
Непрочитано 20.06.2019, 09:51
#68
trir


 
Регистрация: 18.12.2010
Сообщений: 3,381


Цитата:
как все сделать более защищенным
зачем?
trir вне форума  
 
Непрочитано 20.06.2019, 09:56
1 | #69
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,011


Я понимаю, что изложенное ниже простой пользователь вряд ли будет делать и сомневаюсь, что Ваша программа настолько ценна, что это все будет оправдано, но:
1. Тут посмотрите про хранение настроек к ODBC подключению, вроде в реестре и в открытом виде...
2. Любой фаерволл покажет к какому адресу Ваше программа хочет подключиться, соответственно никто не помешает перенаправить ее на "свой" MySQL сервер, который даст доступ при любом логине и пароле подключения и который запишет все запросы, т.е. будет понятно что ваша программа хочет получить от сервера и вероятно всего и логин с хешом пароля будет известен (логины и хеши паролей то же внутри базы лежат, в отдельной таблице и соответственно вполне вероятно попадают в лог при запросах, тут посмотрите )

Все что выше - ИМХО и специалисты меня поправят и дополнят
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 20.06.2019, 09:58
1 | #70
trir


 
Регистрация: 18.12.2010
Сообщений: 3,381


https://toster.ru/q/490655
trir вне форума  
 
Непрочитано 20.06.2019, 11:09
#71
tujn08


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


trir, да... В этом направлении и думал.
Boxa, ценность конечно под сомнением, но все же.
Цитата:
Сообщение от trir Посмотреть сообщение
зачем?
Ну скажем коммерческое использование программы.
А в БД хранится список тех кто может ей пользоваться и в какими функциями и/или информацией из БД. Как-то так. Конечно куча проблем появляется: отсутствие инета и работа приложения в этом случае самые главные.

Спасибо! Как и думал - особо не защититься.
tujn08 вне форума  
 
Непрочитано 20.06.2019, 11:17
1 | #72
trir


 
Регистрация: 18.12.2010
Сообщений: 3,381


Спроси BearDyugin'а
trir вне форума  
 
Непрочитано 20.06.2019, 16:10
#73
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 169


Цитата:
Сообщение от trir Посмотреть сообщение
Спроси BearDyugin'а
хороший пример того "как не нужно делать"
я загрузил и попробовал утилиту для отрисовки откосов
на простейшем же контуре получил краш, нарисовал по другому - получил какую то фигню вместо откосов
а все потому, что автор слишком много времени уделил защите, вместо тестирования

пс
защита тоже вроде не совсем ОК
два часа убил, но все-таки разобрался как получить валидный код
Vov.Ka вне форума  
 
Непрочитано 20.06.2019, 18:06
#74
tujn08


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


Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
автор слишком много времени уделил защите, вместо тестирования

защита... но все-таки разобрался как получить валидный код
Тестирование занимает больше времени чем разработка ПО (явный пример - это "микрософт".) И всегда настаиваю на сообщении всех проблем разработчикам.

Про защиту спросил, там нет БД.

Активация должна быть быстрой и программах того автора.
tujn08 вне форума  
 
Непрочитано 20.06.2019, 18:56
#75
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 169


Цитата:
Сообщение от tujn08 Посмотреть сообщение
Активация должна быть быстрой и программах того автора.
сколько уходит времени собственно на саму активацию я не знаю
у меня ушло два часа на то что бы получить ключ даром/нелегально путем анализа работы процедуры проверки

а по поводу защиты своих безценных твоений неоднократно и весьма убедительно высказывался ShaggyDoc

так что, да, не нужно заморачиваться особо с защитой
Vov.Ka вне форума  
 
Непрочитано 20.06.2019, 19:54
#76
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,011


Цитата:
Сообщение от tujn08 Посмотреть сообщение
Про защиту спросил
Как показывает мировой опыт, единственная хорошая защита, это когда вы свой код никому не даёте. Если посмотреть, то все больше компаний идут именно в этом направлении (облака там всякие...) Толку взламывать клиент, если вся обработка и все вычисления, ведутся у Вас не сервере и все данные хранятся там же и код тоже на сервере.
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 24.06.2019, 12:18
#77
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,683
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Boxa Посмотреть сообщение
Как показывает мировой опыт, единственная хорошая защита, это когда вы свой код никому не даёте. Если посмотреть, то все больше компаний идут именно в этом направлении (облака там всякие...) Толку взламывать клиент, если вся обработка и все вычисления, ведутся у Вас не сервере и все данные хранятся там же и код тоже на сервере.
Я думаю, что и удалённый ("облачный") сервер тоже взламывается. Вопрос только во времени и трудозатратах.
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
пс
защита тоже вроде не совсем ОК
два часа убил, но все-таки разобрался как получить валидный код
Чисто из солидарности разработчиков приложений - жииирнющий антиреспект! Взлом, так-то - противозаконное действие, не говоря об его этической стороне. Нашли чем хвастаться!
Вы уж определитесь - то пишете, что не надо много времени защите уделять, то тут же - что защита слабая. Что за шатания туда-сюда? Чисто потроллить?
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
а все потому, что автор слишком много времени уделил защите, вместо тестирования
Откуда такая информация? Вы знакомы с разработчиком и с секундомером сидели замеряли сколько на что он тратит времени?
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
хороший пример того "как не нужно делать"
Да и вообще, что за пренебрежительно-снисходительное отношение? "Эксперд детектед"? Человек занимается профессионально геодезией. А в свободное от работы время пишет приложения полезные, которые очень многие его коллеги довольно высоко оценивают. Так что, не надо, не зная фактов, нести чушь!
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
я загрузил и попробовал утилиту для отрисовки откосов
на простейшем же контуре получил краш, нарисовал по другому - получил какую то фигню вместо откосов
Сделайте доброе дело - напишите автору приложений, приложите файл, опишите обстоятельства возникновения ошибки. Он будет очень благодарен.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 24.06.2019, 13:02
#78
tujn08


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


Цитата:
Сообщение от Do$ Посмотреть сообщение
Чисто из солидарности разработчиков приложений - жииирнющий антиреспект! Взлом, так-то - противозаконное действие
я все же думаю, что ключ лицензионный долго получали.

Цитата:
Сообщение от Do$ Посмотреть сообщение
Сделайте доброе дело - напишите автору приложений, приложите файл, опишите обстоятельства возникновения ошибки. Он будет очень благодарен.
тут полностью и всегда согласен. Нашли ошибку - сообщите. Если ошибка существенная, то можно и "плюшку" получить.
Невозможно предусмотреть методы работы/оформления всех проектировщиков.
tujn08 вне форума  
 
Непрочитано 24.06.2019, 13:49
#79
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 169


Offtop:
Цитата:
Сообщение от Do$ Посмотреть сообщение
не говоря об его этической стороне.
в программе Откос имеются функции со знакомыми названиями_LISPRU-PROGRESS-START, _LISPRU-PROGESS-CONTINUE, _LISPRU-PROGRESS-CMD
надеюсь автор из прибылей немного отстегивает kpblc-у?

Цитата:
Сообщение от Do$ Посмотреть сообщение
А в свободное от работы время пишет приложения полезные, которые очень многие его коллеги довольно высоко оценивают.
это все очень хорошо
хорошо, что пишет
хорошо, что высоко оценивают

Do$, у нас тут разговор как бы о другом
заводи отдельную тему, если интересно
Vov.Ka вне форума  
 
Непрочитано 24.06.2019, 15:45
#80
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,683
Отправить сообщение для Do$ с помощью Skype™


Ну надо же! Вспомнили про оффтоп! Похвально!
Так-то, если внимательно посмотреть на название темы, то оффтоп тут - последние сообщений 10, в том числе и Ваши "удалые" посты о взломе чужого ПО. Поздновато спохватились.
По поводу использования сторонних функций в ПО "Откос" - обратитесь к разработчику и/или автору функций. Я не в курсе кто кому "отстёгивает" и "отстёгивает" ли. Также, у меня нет информации о том, как разрешает использовать свои функции их автор. В любом случае, это никак не оправдывает взлом чужих приложений и распространение информации о качестве их защиты и о времени, которое требуется на её обход.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 24.06.2019, 21:19
#81
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 169


Offtop:
Цитата:
Сообщение от Do$ Посмотреть сообщение
Я не в курсе кто кому
это хорошо
просто ты так разволновался, я подумал уж не родственник ли он твой
о каком-то взломе все время упоминаешь, ты о чем вообще?

кстати, может кто знает, какая политика у автодеска по поводу использования ворованного кода в своих программах?
если, например, жалобу настрочить (чисто гипотетически) в Autodesk App Store, то они выпилят такое приложение из магазина?
Vov.Ka вне форума  
 
Непрочитано 24.06.2019, 22:40
1 | #82
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,011


Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
какая политика у автодеска по поводу использования ворованного кода в своих программах
я думаю, что если автодеск и использует в своих программах ворованный код, то вряд ли в этом сознается, так что получается политика полного отрицания. Или Вы что то другое имели ввиду?

Кстати, обвинения в воровстве, неплохо бы подтверждать доказательствами, что код именно украден и его использование нарушает какую бы то ни было лицензию, а не взят из публичного источника с BSD или подобной лицензией.
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 25.06.2019, 06:45
#83
trir


 
Регистрация: 18.12.2010
Сообщений: 3,381


AutoDESK последнее время очень сильно использует open source в своих продуктах
trir вне форума  
 
Непрочитано 25.06.2019, 12:00
#84
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,683
Отправить сообщение для Do$ с помощью Skype™


Вопрос от Vov.Ka:
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
о каком-то взломе все время упоминаешь, ты о чем вообще?
Отвечает Vov.Ka:
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
пс
защита тоже вроде не совсем ОК
два часа убил, но все-таки разобрался как получить валидный код
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
у меня ушло два часа на то что бы получить ключ даром/нелегально путем анализа работы процедуры проверки
Взлом, реверс-инжиниринг, анализ системы защиты с целью выяснения механизма её обхода и дальнейшее распространение информации о результатах в открытых источниках. И всё это - без согласия автора.
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
просто ты так разволновался, я подумал уж не родственник ли он твой
Меня, как разработчика, очень возмущает тот факт, что кто-то считает совершенно нормальным явлением поковыряться в системе защиты чужих приложений, найти способ обойти её и вынести на общее обозрение свои умозаключения.
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
кстати, может кто знает, какая политика у автодеска по поводу использования ворованного кода в своих программах?
Ворованное? Это по поводу функций, которые выложил Алексей Кулик на своём ресурсе для общего пользования? Сперва у него спросите, что он думает по этому поводу. Контакты подсказать?
Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
если, например, жалобу настрочить (чисто гипотетически) в Autodesk App Store, то они выпилят такое приложение из магазина?
Строчите. Скорее всего, приостановят публикацию приложения до выяснения всех обстоятельств. Если есть такое пакостное желание - можете подгадить разработчику.
P.S. Приостановят, если сочтут предоставленные данные достаточно убедительными. Так что, вы уж постарайтесь (чисто гипотетически)!
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)

Последний раз редактировалось Do$, 25.06.2019 в 12:24.
Do$ вне форума  
Ответ
Вернуться   Форум 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