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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autocad 2008 Autolisp Открытие чертежа

Autocad 2008 Autolisp Открытие чертежа

Ответ
Поиск в этой теме
Непрочитано 06.10.2010, 16:28
Autocad 2008 Autolisp Открытие чертежа
Zaghim
 
Регистрация: 01.07.2010
Сообщений: 521

Подскажите, каким образом программно открыть чертеж. Путь его я знаю.
В общем полная идея такая: нужно получить некоторую информацию с одного чертежа, сохранить ее в переменной, потом открыть другой чертеж вытащить нужное значение, закрыть чертеж (вернуться к первому) и сохранить это значение в другую переменную. Такое возможно?!
Просмотров: 12537
 
Автор темы   Непрочитано 07.10.2010, 11:23
#21
Zaghim


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


))) Спокойствие, сейчас разберемся)
Активным окно становится после его открытия, в монитор я вижу новый чертеж, все значения, которые были на предыдущем чертеже стали нил, кроме новых двух. Я выполняю действие в новом чертеже, а после закрытия возвращаюсь назад.

Все я понял свой косяк. Попробовал нарисовать линию и она нарисовалась есессено на 1 чертеже. А если мне нужно выполнить 200 команд на втором чертеже, все писать через vla-SendCommand???

Как этот файл потом физически закрыть? Он все равно остается висеть во вкладках(((

Последний раз редактировалось Zaghim, 07.10.2010 в 11:34.
Zaghim вне форума  
 
Непрочитано 07.10.2010, 11:51
#22
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Цитата:
А если мне нужно выполнить 200 команд на втором чертеже, все писать через vla-SendCommand???
Конечно нет. Я ж тебе говорю, сделай лисп файл и запускай его через vla-SendCommand
Код:
[Выделить все]
(vla-SendCommand doc1 "(load \"C:\\... .lsp\")")
Цитата:
Как этот файл потом физически закрыть? Он все равно остается висеть во вкладках(((
vla-Close и файл из вкладок улетел.
Supermax вне форума  
 
Автор темы   Непрочитано 07.10.2010, 12:10
#23
Zaghim


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


(vla-Close doc1 :vlax-false ) и он нифига не улетает сволочь)
А в каком виде должен быть второй лисп, что бы он запускался автоматом?
Zaghim вне форума  
 
Непрочитано 07.10.2010, 12:32
#24
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Делай все аккуратно.
Убедись, для начала, что кроме твоего рабочего документа там никого нет.
Запусти в рабочем документе
Код:
[Выделить все]
(setq doc1 (vla-open (vla-get-Documents (vlax-get-acad-object)) "путь и имя" :vlax-true " "))
Файл должен появиться во вкладках
Запусти в рабочем документе

Код:
[Выделить все]
 (vla-Close doc1 :vlax-false)
:vlax-true там по умолчанию - сохранять
Посмоти вкладки, файла там больше нет

У меня все именно так.
Если хочешь чтобы запускаемый код выполнялся сразу в процессе загрузки файла, то в функцию его не объединяй, а если хочешь чтобы он выполнился только после полной загрузки - весь код объедини в функцию и последней строкой ее запусти.

Последний раз редактировалось Supermax, 07.10.2010 в 12:41.
Supermax вне форума  
 
Автор темы   Непрочитано 07.10.2010, 12:39
#25
Zaghim


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


vlax-false - значит, что сохранять не нужно, так и делаю.
С этим все понятно и вроде файл закрылся.
Вопрос в том как должен выглядить второй лисп файл, можешь дать пример файла, который запустится точно и выполнит там ну скажем полар и потом вернет назад полученную координату.

Вот это непонятно
если хочешь чтобы он выполнился только после полной загрузки - весь код объедини в функцию и последней строкой ее запусти.
Zaghim вне форума  
 
Непрочитано 07.10.2010, 13:05
#26
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Кода файл загружается, то буквально выполняеются все его директивы. Если в коде в середине ошибка, то до ошибки все выполнится, а на ней загрузка прервется. Если код объединен через (defun бла-бла-бла ..., то сначала загружается в память вся функция с твоим кодом и только потом, второй директивой, коей является последняя строка лиспа (бла-бла-бла) запускается эта вся хрень. Если в коде есть ошибки - прервется и сама загрузка в память функции и сама загрузка файла.
Вот создай файл с такой строчкой и все
(setq bp2 (polar bp2 0 10000))
Supermax вне форума  
 
Автор темы   Непрочитано 07.10.2010, 14:27
#27
Zaghim


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


В общем так не работает(((
Когда передаю управление второму лиспу, вот такому:
(setq bp1 bp1cc)
(setq bp1zap bp1)
(setq bp2 (polar bp1 0 10))
(command "line" bp1 bp2 "")
пишет вот что:
error: bad argument type: stringp nil
Zaghim вне форума  
 
Непрочитано 07.10.2010, 15:04
#28
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Гы-гы-гы Ну, так, как ты написал - точно работать не будет.

Разберем по косточкам:
Код:
[Выделить все]
(setq bp1 bp1cc)
что за переменная bp1cc? Где она определена? В каком файле? И сделана ли она доступной всем файлам?
В таком виде она nil
далее:
Код:
[Выделить все]
(setq bp1zap bp1)
Естественно тоже будет nil

Код:
[Выделить все]
(setq bp2 (polar bp1 0 10))
Тоже nil

Код:
[Выделить все]
(command "line" bp1 bp2 "")
nil в обеих аргументах - будет еГор
Supermax вне форума  
 
Автор темы   Непрочитано 07.10.2010, 15:09
#29
Zaghim


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


bp1cc определена (vl-propagate 'bp1cc) в первом лиспе
перед вызовом второго лиспа я в нее запихиваю значение точки bp1.

Почему все остальные естественно будут нил?

Я попробовал оставить только 2 первые команды, все равно та же ошибка
Zaghim вне форума  
 
Непрочитано 07.10.2010, 15:20
#30
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Сделай (alert bp1) и вставь в код, затем двигай вниз и ищи где он не срабатывает. Там твоя ошибка и закопана.
У тебя скорее всего ошибка в строке посыла (vla-SendCommand ...
Всю строку в студию.
Supermax вне форума  
 
Автор темы   Непрочитано 07.10.2010, 15:24
#31
Zaghim


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


пожалста
(vla-SendCommand doc1 "(load \"D:\\Программирование\\mip1.lsp\")")
скопировал у тебя из поста
Zaghim вне форума  
 
Непрочитано 07.10.2010, 15:52
#32
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Код:
[Выделить все]
(vla-SendCommand doc1 "(load \"D:\\\\Программирование\\\\mip1.lsp\") ")
Вот так правильно. Пробел перед последними кавычками не забудь.
Осталось вернуться назад.
Хотя это нужно в самом последнем файле.
Сделай глобальную переменную доступную всем для указателя на самый первый активный документ и сделай в конце его (vla-Activate... .
Supermax вне форума  
 
Автор темы   Непрочитано 07.10.2010, 16:14
#33
Zaghim


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


Я в шоке... все равно не работает)))) ужа зла не хватает

это первый лисп и 1 чертеж в коде

Код:
[Выделить все]
(setq doc1 (vlax-get-acad-object))
  (setq doc2 (vla-open (vla-get-Documents (vlax-get-acad-object)) "d:\\gp1.dwg" :vlax-true " "))
  (setq cl 1)
  (vl-propagate 'bp1cc)
  (vl-propagate 'XYZ1)
  (vl-propagate 'bp1)
  (vl-propagate 'doc1)
  (vla-SendCommand doc2 "(load \"D:\\\\Программирование\\\\mip1.lsp\") ")
  (vla-Close doc2 :vlax-false )
Второй
Код:
[Выделить все]
(vl-load-com)
  (setq bp1 bp1cc)
  (setq bp1zap bp1)
  (setq bp2 (polar bp1 0 10))
  (command "line" bp1 bp2 "")
  (vla-Activate doc1)
Даже если убрать это (vl-load-com) и (vla-Activate doc1), то все равно те же ошибки!

Команда застревает после
(vla-SendCommand doc1 "(load \"D:\\\\Программирование\\\\mip1.lsp\") ")
[FONT=monospace]т.е. если я вручную переключусь на 1 окно, а потом обратно, то тогда она выполняет то что нужно((( брееед([/FONT]

Последний раз редактировалось Zaghim, 07.10.2010 в 16:33.
Zaghim вне форума  
 
Непрочитано 07.10.2010, 18:01
#34
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Верю.
Только перед впадением в полную истерику скажи:
А почему у тебя вместо
Код:
[Выделить все]
(setq doc1 (vla-get-ActiveDocument (vlax-get-acad-object)))
написано
Код:
[Выделить все]
(setq doc1 (vlax-get-acad-object))
???
Это что за ...?
Код:
Почему ты определяешь переменные, которые nil?
Код:
[Выделить все]
(vl-propagate 'bp1cc)
  (vl-propagate 'XYZ1)
  (vl-propagate 'bp1)
ведь если переменная nil, то ее нет. Она так удаляется из памяти.
Для начала присвой им всем хоть что-то, а только потом vl-propagate

После того, как ты запустил файл и обработку в нем, сделай прокрутку
с ожиданием исполнения второго файла. Для этого сделай еще одну глобальную переменную доступную всем типа
Код:
[Выделить все]
(setq kl 0)
(vl-propagate 'kl)
(while (or (= kl 0) (/= kl nil)))
пока переменная kl будет 0 и естественно не nil код будет бесконечно крутиться на этом месте и только потом ты должен перейти
обратно в первый документ запустив во втором файле

Код:
как только kl станет 1 начнет продвигаться далее первый, главный лисп и в конце концов откроет следующий документ.
Supermax вне форума  
 
Непрочитано 07.10.2010, 19:50
#35
Кулик Алексей aka kpblc
Moderator

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


Ох, мудрите на ровном месте...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.10.2010, 21:03
#36
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Не то слово.
уже почти дошли до того, что sendCommand надо запускать из другого потока.
Метод есть, но по отношению к другим документам работает только из других потоков.
Supermax вне форума  
 
Автор темы   Непрочитано 08.10.2010, 09:09
#37
Zaghim


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


В общем вчера психанул и сделал, как говорил VVA. Так работает без проблем, НО ОЧЕНЬ ДОЛГО... так как рисунки большие (10-12мб) и нужно все заморозить, потом ждать пока чертеж подгрузится, потом пробиндится, потом его взорвать нужно (не спрашивайте почему, но нужно), потом определить точку и сохранить ее, а потом все это дело вернуть назад))))) и только после всех этих махинаций можно вставить блок со всем чем нужно)))
Zaghim вне форума  
 
Непрочитано 08.10.2010, 10:27
#38
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Не знаю, что там у тебя биндится, но на sendCommand для других открытых файлов все гуру себе чую зубы-то пообломали.
Для меня тут дело принципа. Я в одном документе, рядом открыт другой, как там запустить лисп? И не просто запустить, а чтобы еще и результат вернул в первый документ.
И я эту задачу решу

Закон 1.
Любые лиспы работают только в активном документе.
Если в процессе выполнения программы идет переключение активности с текущего документа на другой, то дальнейшее выполнение программы приостанавливается до возврата активности данному документу.

Закон 2.
Метод sendCommand переключает активность на другой документ раньше, чем успевает передать в командную строку данные. Поэтому этот метод надо запускать только из другого потока, не зависящего от активности документов.

Последний раз редактировалось Supermax, 08.10.2010 в 11:01.
Supermax вне форума  
 
Автор темы   Непрочитано 08.10.2010, 11:43
#39
Zaghim


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


Не понял зачем делать бесконечный цикл и где его делать в 1 или вызываемом лиспе?

Учел все твои замечания. В общем результат практически такой же. Т.е. файл открыл, переменные вначале забил потом объявил их глобальными, затем sendCommand и застреваю на четреже, но уже без ошибки, переменные внутри второго лиспа по-прежнему не заполняются и вернуться назад могу только руками(((

Последний раз редактировалось Zaghim, 08.10.2010 в 11:58.
Zaghim вне форума  
 
Непрочитано 08.10.2010, 12:54
#40
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Zaghim Посмотреть сообщение
В общем вчера психанул и сделал, как говорил VVA. Так работает без проблем, НО ОЧЕНЬ ДОЛГО... так как рисунки большие (10-12мб) и нужно все заморозить, потом ждать пока чертеж подгрузится, потом пробиндится, потом его взорвать нужно (не спрашивайте почему, но нужно), потом определить точку и сохранить ее, а потом все это дело вернуть назад))))) и только после всех этих махинаций можно вставить блок со всем чем нужно)))
1. Не понятно, зачем чтобы определить точку нужно биндить и взрывать внешнюю ссылку. Есть ф-ция nentsel, есть описание блока (доступное для lisp).
2. Если уж без взрыва невозможно, то вставляй другой рисунок сразу как блок, командой Insert, а перед именем файла укажи * - будет вставляться сразу расчлененным. Только используй команду _-Insert (с минусом в начале)
Из справки
Цитата:
Справочник команд AutoCAD 2008 > Команды > В - Команды > ВСТАВИТЬ > -ВСТАВИТЬ >
....
Расчленение блоков при вставке: Если имени блока предшествует звездочка (*), блок расчленяется, и в чертеж вставляются отдельные объекты, из которых он состоял. Описание блока в чертеж не вставляется.
Вложения
Тип файла: pdf 1.pdf (55.1 Кб, 68 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Autocad 2008 Autolisp Открытие чертежа

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Видеоуроки AutoCAD kosmax AutoCAD 173 17.02.2017 15:08
Проблемма с установкой AutoCAD 2008 Alxndr1697 AutoCAD 27 24.04.2010 21:43
Ищу любое рукодство пользователя AutoCAD Electrical 2008 DAM Поиск литературы, чертежей, моделей и прочих материалов 3 07.10.2009 17:20
Книга Хейфеца А.Л. 3D-технология построения чертежа. AutoCAD. 3-е изд. BM60 Разное 22 16.02.2009 09:55
не удаляется AutoCAD Architecture 2008 ПалычЪ AutoCAD 4 19.12.2007 09:53