Пояснительная записка (1230040), страница 9
Текст из файла (страница 9)
Рисунок 2.7 - Представление точек в плоских DXF-файлах
Для расширения стандартных возможностей AutoCAD используются небольшие программы-приложения, написанные на языке AutoLISP. В AutoLISP реализовано тесное взаимодействие с командной строкой, что способствовало его популяризации среди инженеров, работающих в AutoCAD. Для автоматического назначения точкам Z-отметки из ее надписи используется специальная команда ztxt:
Код: (defun C:Ztxt ( / objSet Point ptLst tmp1 tmp2 pat txtZList dst *error*)
(vl-load-com)
(defun *error*(msg)(princ msg)
(vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))(princ)) (vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object)))
(if (and (setq objSet(ssget "_:L" '((0 . "POINT"))))
(setq Point (vl-remove-if 'listp(mapcar 'cadr(ssnamex objSet))))
(setq ptLst(mapcar 'cdr (mapcar '(lambda(x)(assoc 10 x))(mapcar 'entget Point)))) (setq objSet nil objSet(ssget "_X" (list '(0 . "*TEXT")
(cons 410 (getvar "CTAB"))))) )
(progn (setq tmp1 (vl-remove-if 'listp(mapcar 'cadr(ssnamex objSet))))
(setq tmp1 (mapcar '(lambda(x)(setq x (entget x))
(list (cdr(assoc 10 x))(cdr(assoc 1 x)))) tmp1))
(foreach pt ptlst (setq tmp2 (mapcar '(lambda(x)(list (distance pt (car x))(cadr x))) tmp1))
(setq pat (car tmp2)) (foreach dst tmp2 (if (< (car dst) (car pat))(setq pat dst))) (setq txtZList (cons (cadr pat) txtZList)) )
(setq txtZList (reverse txtZList))
(setq txtZList (mapcar '(lambda(x) (vl-string-translate "," "." (vl-string-trim "%UuoOcC \t" x)) )
txtZList)) (mapcar '(lambda(ptObj pt Z) (vla-put-coordinates (vlax-ename->vla-object ptObj)
(vlax-3d-point (list (car pt)(cadr pt) Z)) ) ) Point ptLst (mapcar 'atof txtZList) ) ) )
(vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object))) (princ) )
(princ "\nType Ztxt in command line")
При этом нужно учесть некоторые нюансы. Отметка точки должна быть представлена однострочным текстом. В случае если текст отметки многострочный, необходимо преобразовать его в однострочный с помощью команды «расчленить».
Точка может быть представлена блоком, состоящим из заштрихованной окружности (рисунок 2.8), – происходит после экспорта в формат DXF из чертежной модели. В этом случае необходимо использовать команду frto, которая также написана на языке AutoLISP. Программа поменяет набор примитивов на выбранный примитив. Команда frto применяется для замены: одних блоков другими; точек – блоками или окружностями и наоборот; одних надписей – другими.
Рисунок 2.8 - Представление точек после экспорта
Вначале нужно выбрать заменяемые объекты, в командной строке набрать команду frto и затем указать заменяющий объект, в нашем случае примитив точка. Если на чертеже такого примитива нет, то его необходимо предварительно создать. Программа также спросит, оставлять ли исходные примитивы — это уже на усмотрение пользователя. Вставка производится в центр прямоугольника, ограничивающего (габаритного) старые объекты. Новые объекты вставляются в слои, к которым принадлежали старые объекты
-
Работа Команды Ztxt.Lsp
План данного объекта был выполнен в программном продукте AutoCAD. Это самый распространенный метод работы и причины этого были описаны ранее. В данном случае о 3D-координаты точек не учитываются. Для построения 3D-модели виртуального мира такой файл нужно дорабатывать – поднимать Z-отметки и только потом можно полноценно работать в системах трехмерного моделирования.
Для использования программ-приложений, которые написаны на языке AutoLISP, необходимо иметь файл, содержащий код программы и названный для удобства использования именем программы, сохраненный с расширением LSP.
Важно знать, что AutoLISP-программы могут быть запущены только для полной версии AutoCAD, они не работают под AutoCAD LT. Для того чтобы загрузить lisp-файл, запускаем AutoCAD и выбираем Сервис>>AutoLISP>> Приложения (Tools>>AutoLISP>>Load) или вводим в командной строке: _appload. Открывается диалоговое окно загрузки/выгрузки приложений (рисунок. 2.9).
Рисунок 2.9 - Диалоговое окно загрузки/выгрузки приложений.
Чтобы загрузить ztxt.lsp, выполняем действия в следующем порядке:
1. Указываем папку, в которой находится lisp-файл.
2. Выбираем файл, который необходимо загрузить.
3. Нажимаем кнопку Загрузить. Если все прошло удачно, появится надпись: «ztxt.lsp успешно загружено».
4. Для добавления lisp-файлов в автозагрузку нажмите кнопку Приложения. При каждом запуске системы всегда будут автоматически загружаться выбранные команды.
5. Нажимаем кнопку Закрыть для закрытия диалогового окна загрузки/выгрузки приложений. Lisp-файл также можно загрузить перетащив (drag-and-drop) иконку файла в графическое окно AutoCAD.
Как только lisp-файл будет загружен, можно вызвать команду из командной строки. В нашем примере необходимо набрать в командной строке: ztxt. Команда предложит выбрать точки, которым будет присвоена Z-отметка.
Затем некоторое время будет происходить сам процесс присвоения отметки точкам. Данная команда не помогает решать все задачи. Следует помнить, что Z-отметка присваивается от ближайшей точки вставки текста подписи высоты (левый нижний край объекта «однострочный текст»). Если рядом с надписью находится несколько точек, то всем точкам будет присвоена одна Z-отметка. Если в ближайшей подписи содержится не отметка, а текст семантических свойств объекта, Z-отметка присвоена не будет. В целом качество работы программы зависит от загруженности плана.
По окончании работы команды необходимо в местах загрузки вручную исправить отметки. Я не использовал команду frto в моем примере, так как при экспорте из программных продуктов AutoCAD второго поколения точки представлены примитивами: точка, сплайн, линия и дуга . Эта команда будет полезна для восстановления Z-отметок плоских DXF-чертежей, которые были экспортированы из чертежной модели систем САПР либо других геоинформационных систем. В результате проделанной работы получил точки, имеющие свои отметки, по которым возможно построить поверхность земли и, применяя автоматизированные технологии, использовать эту поверхность для размещения различных инженерных сооружений.
-
Процесс экспорта свойств примитивов из Excel в базу данных
Загрузку данных осуществляется с помощью программы написанной в Delphi, т.к это существенно сократит время на заполнение базы данных.
Были помещены на форму следующие компоненты:
-
pFIBDatabase1: TpFIBDatabase;
-
pFIBTransaction1: TpFIBTransaction;
-
ExcelApplication1: TExcelApplication;
-
ExcelWorkbook1: TExcelWorkbook;
-
ExcelQueryTable1: TExcelQueryTable;
-
ExcelWorksheet1: TExcelWorksheet;
-
Button1: TButton;
-
OpenDialog1: TOpenDialog;
-
pFIBDataSet1: TpFIBDataSet;
-
DBGrid1: TDBGrid;
-
DataSource1: TDataSource;
-
Button2: TButton;
-
procedure Button1Click(Sender: TObject);
-
procedure Button2Click(Sender: TObject);
Получился следующий вид представленный на рисунке 2.10
Рисунок 2.10 - Компоненты
Для компонента базы данных TpFIBDatabase устанавливаем в свойстве параметры соединения путь к ранее созданной базе данных и подключаемся изменеием параметра Connected на true , остальные значения оставляем по умолчанию.
В DBGrid нужно установить значение размеров, в пункте DataSource установить DataSource1 для того чтобы связаться с нашей базой данных. TpFIBDataset и TpFIBDatatransaction делаем активным.
Для компонента TpFIBDataset в свойствах SQL нужно прописать запрос на добавление в базу данных координат и свойств извлеченных из таблицы Excel. Форма для добавления SQL запроса представлена на рисунке 2.11
Рисунок 2.11 – форма для добавления SQL запроса
NAMELINE, DELX, DELY и пр.– имена полей для заполнения. PUTI- название таблицы.SQL запрос прописывается для добавления данных в базу- insert, обновления данных в базе данных- update, удаления данных в базе- delete и обновления информации на форме-refresh.
SQL запрос добавления данных в базу- insert:
INSERT INTO PUTII(ID_P, NAMELINE, DELX, DELY, DLINA, ENDX, ENDY, MASHTAB, SLOY, TIP, TOLSHINA, COLOR)
VALUES( :ID_P, :NAMELINE, :DELX, :DELY, :DLINA, :ENDX, :ENDY, :MASHTAB, :SLOY, :TIP, :TOLSHINA, :COLOR)
SQL запрос для обновления данных в базе данных- update:
UPDATE PUTII SET ID_P = :ID_P, NAMELINE = :NAMELINE, DELX = :DELX, DELY = :DELY, DLINA = :DLINA, ENDX = :ENDX, ENDY = :ENDY, MASHTAB = :MASHTAB, SLOY = :SLOY, TIP = :TIP, TOLSHINA = :TOLSHINA, COLOR = :COLOR
WHERE
ID_P = :OLD_ID_P and NAMELINE = :OLD_NAMELINE and DELX = :OLD_DELX and DELY = :OLD_DELY and DLINA = :OLD_DLINA and ENDX = :OLD_ENDX and ENDY = :OLD_ENDY and MASHTAB = :OLD_MASHTAB and SLOY = :OLD_SLOY and TIP = :OLD_TIP and TOLSHINA = :OLD_TOLSHINA and COLOR = :OLD_COLOR
SQL запрос для удаления данных в базе- delete:
DELETE FROM PUTII
WHERE
ID_P = :OLD_ID_P and NAMELINE = :OLD_NAMELINE and DELX = :OLD_DELX and DELY = :OLD_DELY and DLINA = :OLD_DLINA and ENDX = :OLD_ENDX and ENDY = :OLD_ENDY and MASHTAB = :OLD_MASHTAB and SLOY = :OLD_SLOY and TIP = :OLD_TIP and TOLSHINA = :OLD_TOLSHINA and COLOR = :OLD_COLOR
SQL запрос для обновления информации на форме-refresh:
SELECT ID_P, NAMELINE, DELX, DELY, DLINA, ENDX, ENDY, MASHTAB, SLOY, TIP, TOLSHINA, COLOR
FROM PUTII WHERE
PUTII.ID_P = :OLD_ID_P and PUTII.NAMELINE = :OLD_NAMELINE and PUTII.DELX = :OLD_DELX and PUTII.DELY = :OLD_DELY and PUTII.DLINA = :OLD_DLINA and PUTII.ENDX = :OLD_ENDX and PUTII.ENDY = :OLD_ENDY and PUTII.MASHTAB = :OLD_MASHTAB and PUTII.SLOY = :OLD_SLOY and PUTII.TIP = :OLD_TIP and PUTII.TOLSHINA = :OLD_TOLSHINA and PUTII.COLOR = :OLD_COLOR
Для компонента компонента Button1 прописываем процедуру которая будет отвечать за выбор пути до файла с интересующими нас координатами и свойствами объектов извлеченных из чертежа AutoCAD и отображения их на форме в компоненте DBGrid с последующим импорта из в базу данных:
begin
excel :=CreateOleObject('Excel.Application');
excel.DisplayAlerts :=False;//отключение запросов Excel
if not OpenDialog1.Execute then Exit;
try
Excel.WorkBooks.Open(opendialog1.FileName); //открываем файл Excel
i :=2; //начинаем считывать со 2ой строки
j := excel.ActiveCell.SpecialCells(xlCellTypeLast).Row;// до последней не пустой строки
// процедура загрузки
while i<>j+1 do begin
{id :=excel.cells[i,1].value;}
idauto :=excel.cells[i,1].value;
god:=excel.cells[i,2].value;
a:=excel.cells[i,3].value;
b:=excel.cells[i,4].value;
c:=excel.cells[i,5].value;
d:=excel.cells[i,6].value;
e:=excel.cells[i,7].value;
f:=excel.cells[i,8].value;
g:=excel.cells[i,9].value;
h:=excel.cells[i,10].value;
k:=excel.cells[i,11].value;
l:=excel.cells[i,12].value;
with pFIBDataset1 do
begin
Insert;
pFIBDataset1.insert;
// FieldByName('ID_P').AsInteger :=id;
FieldByName('NAMELINE').AsString :=idauto;















