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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > как закрыть файл из лиспа

как закрыть файл из лиспа

Ответ
Поиск в этой теме
Непрочитано 16.03.2004, 14:18 #1
как закрыть файл из лиспа
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,186

подскажите, как програмно в лиспе можно закрыть открытый в акаде файл (без сохранения).
Просмотров: 9211
 
Непрочитано 16.03.2004, 15:29
#2
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


А про какой файл идет речь, про чертеж или про текстовый. Если текстовый то сначала открываем файл:

(setq fileTag (open "название файла" "режим"))

Потом закрываем (close fileTag)

Если это чертеж, то вот пример с www.afralisp.com
Код:
[Выделить все]
;AUTOLISP CODING STARTS HERE
(defun C:CLOSE_DWG (/ ACADOBJ DOCOBJ DOCSOBJ FULL NAME PATH)
(vl-load-com)
(get_docs_list)
(ddcloser)
(if DWGLST
(progn
(setq CNT (- (length DWGLST) 1))
(repeat (length DWGLST)
(setq DOCOBJ (vlax-invoke-method DOCSOBJ "item" (nth CNT DWGLST))
CNT (1- CNT)
PATH (vlax-get-property DOCOBJ "path")
NAME (vlax-get-property DOCOBJ "name")
FULL (strcat PATH "\\" NAME)
)
(if (= (vlax-get-property DOCOBJ "active") :vlax-false)
(vla-close DOCOBJ :vlax-true FULL)
(princ (strcat "\nDrawing " FULL " is still active: "))
)
(vlax-release-object DOCOBJ)
)
(vlax-release-object DOCSOBJ)
(vlax-release-object ACADOBJ)
)
)
(princ)
)
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 16.03.2004, 17:33
#3
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,186
<phrase 1=


Спасибо, Fantomas, я имел ввиду dwg файл.
Все так сложно? Я мало чего понимаю в ActiveX, но мне кажется странным что простая замена акадовской комманды _close порождает такие сложности.
Apelsinov вне форума  
 
Непрочитано 16.03.2004, 18:43
#4
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Я пытался один раз сделать (command "_.close" "_Y"). Но любимая софта не хочет принимать это самое "_Y" и упорно спрашивает в командной строке не надо ли сохранить изменения. Тогда я тоже ничего не соображал в ActiveX и плюнул на это дело.

На самом деле все не так уж сложно. Сам недавно пользуюсь, но мне нравится. Сразу обращаешься к чему то конкретному и управляешь не абстрактными цифрами а вполне конкретными свойствами и применяешь конкретные методы. Правда примитивы надо преобразовывать в VLA-объекты командой

(setq vla_Entity (vlax-ename->vla-object "примитив"))

Зато потом если хотим получить например цвет

(setq color (vla-get-color vla_Entity))

С примитивами это ерунда, этот принцип сохраняеться для всех объектов, включая листы, стили печати, системные установки и т. д. Это веселее чем рытся в словарях, таблицах и DXF кодах. Хотя надо сказать что некоторые вещи "по простому" делаються легче. Еще в ActiveX функциях не редки глюки, которые относяться скорее к разделу "багов".

Думаю что без ActiveX, возможно как нибудь закрыть активный документ, для неактивного без этого я думаю не обойтись.
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 16.03.2004, 19:32
#5
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,186
<phrase 1=


no function definition: GET_DOCS_LIST
no function definition: DDCLOSER
Это что за функции? Если есть у Вас, дайте, плиз.
Apelsinov вне форума  
 
Непрочитано 17.03.2004, 08:41
#6
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Прошу прощения, вот полностью ссылка http://www.afralisp.com/newsletter/2002/2002-06.htm.

Вообще примеров куча (я просто взял первый попавшийся на английском). Надо зайти на GOOGLE и прямо в окне поиска написать имя функции. В вашем случае vla-close и получите 3 страницы примеров. Как кстати и к любым ActiveX функциям...
{Smirnoff} вне форума  
 
Непрочитано 17.03.2004, 09:25
#7
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от Apelsinov
Все так сложно? ... мне кажется странным что простая замена акадовской комманды _close порождает такие сложности.
Функция
Код:
[Выделить все]
(command "_.CLOSE")
тоже работает. Но вам нужно рассмотреть варианты, когда в рисунке не было изменений (тут проблем никаких, рисунок тихо закроется) и когда изменения были (в этом случае необходимо ответить на вопрос AutoCAD'а, что мол изменений сохранять не нужно). Т.е. функция должна выглядеть так:
Код:
[Выделить все]
(command "_.CLOSE" "_Yes")
Честно говоря, сразу и не вспомню как это проверить...
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Автор темы   Непрочитано 17.03.2004, 09:57
#8
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,186
<phrase 1=


Fantomas, да, хорошая программка, понравилась.
Но невозможно закрыть активный файл, а нужно мне было именно это.

kos, да, работает (command "_.CLOSE") если в файле нет изменений, но если были (command "_.CLOSE" "_Yes") не работает!
Код:
[Выделить все]
Command: (command "_.close" "_Yes")
_.close
Command: _Yes Unknown command "YES".  Press F1 for help.
Command: nil
Command: Really want to discard all changes to drawing? <N>
А возможно ли отменить программно все изменения сделанные со времени последнего сохранения?

И еще, интересно, после манипуляций с (command "_.close" "_Yes") акад не выдает окно Yes/No при попытке закрыть файл крестиком сверху.
Apelsinov вне форума  
 
Непрочитано 17.03.2004, 10:56
#9
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>kos У меня с (command "_.close" та же ерунда.

>Apelsinov Думаю что можно сделать документ неактивным с помощью метода vla-Activate. Т.е. сделать на время активным другой документ. Но это мои догадки, собираюсь на днях поэксперементировать. В много документном режиме как я понял много тонкостей. В частности необходимость передачи функций и переменных через внедокументное пространство. Ведь надо сделать документ в котором работала функция неактивным, а она должна продолжать работать. Не знаю относиться ли это к VLA-объектам? Пока это вопрос к ActiveX-Profi типа Kos.

Мне тоже до этого надо добраться, у меня задачка сгенерить один чертеж на основании другого его сохранить и вернуться в исходный. Планировал заняться эти чуть позже, через две три недели.
{Smirnoff} вне форума  
 
Непрочитано 17.03.2004, 14:44
#10
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


А нельзя ли сгенерить Лиспом небольшой скрипт с командой CLOSE и выполнить его? Если конечно после этого закрытия программно ничего делать не надо. :?
vk вне форума  
 
Непрочитано 17.03.2004, 14:46
#11
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Прошу прощений за неточность. Должно быть так (в случае, если в рисунке были изменения):
Код:
[Выделить все]
(command "_.CLOSE")
(command "_Yes")
Цитата:
Сообщение от Fantomas
Думаю что можно сделать документ неактивным с помощью метода vla-Activate. Т.е. сделать на время активным другой документ.
А если открыт только один документ? Что будем делать активным? Нет, с ActiveX здесь все не так просто, как кажется на первый взгляд. Я как-то интересовался этим вопросом, но, честно говоря, уже не помню на чем остановился. Гляну дома, завтра доложу.
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 17.03.2004, 15:27
#12
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Да, совсем забыл. Нашел переменную, которая хранит информацию о изменениях в рисунке. Ее имя DBMOD (целое). Если она равна 0, то изменений не было.
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 17.03.2004, 15:47
#13
Mikhail

инженер-технолог (ГИП)
 
Регистрация: 11.09.2003
Санкт-Петербург
Сообщений: 1,116


Я в лиспе ничего почти не понимаю, но если работает команда CLOSE когда небыло изменений, то может перед выполнением этой команды выполнить что то типа UNDO All. Может поможет.
удачи.
Mikhail вне форума  
 
Непрочитано 17.03.2004, 16:56
#14
kos

LISP-программист
 
Регистрация: 25.08.2003
Тутэйшы
Сообщений: 238


Цитата:
Сообщение от Mikhail
... может перед выполнением этой команды выполнить что то типа UNDO All. Может поможет.
удачи.
Не поможет. Ведь изменения базы данных рисунка в этом случае были. И отмена этих изменений тоже есть изменение базы данных рисунка. И LISP здесь ни при чем. Это модель объектов и событий AutoCAD'а.
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 17.03.2004, 17:10
#15
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>kos
Код:
[Выделить все]
Command: (command "_.close")(command "_yes")
_.close
Command: _yes Unknown command "YES".  Press F1 for help.

Command: nil

Command: Really want to discard all changes to drawing? <N>
Насчет того что документ один, можно держать и открывать для этого специальный чистый файл, который можно закрыть уже известным нам способом, т. к. он не имеет изменений. Это конечно коряво, но только такие пока рассуждения. Вернусь к этому позже, сейчас пишу установки для приложения с большущим диалогом и чтением-записью в регистр, отвлекаться не хочется.
{Smirnoff} вне форума  
 
Непрочитано 17.03.2004, 18:16
#16
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


Если сделать переменную EXPERT=2, то даже измененный рисунок закроется без лишних вопросов по команде:

(command "_close")

http://www.caduser.ru/acad/index.php?var_name=EXPERT
Pilot вне форума  
 
Непрочитано 17.03.2004, 18:46
#17
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>Pilot
Увы и ах...
Код:
[Выделить все]
Command: expert

Enter new value for EXPERT <2>:

Command: (command "_.close")
_.close
Command: nil

Command: Really want to discard all changes to drawing? <N>
Расмотрю любые предложения. Интим не предлагать
{Smirnoff} вне форума  
 
Непрочитано 17.03.2004, 21:17
#18
leha

ACAD, UG, CATIA - программирование
 
Регистрация: 17.09.2003
Таганрог
Сообщений: 9


Самое простое:
(command "_.vbastmt" "ThisDrawing.Close False")

При желании, для последнего документа можно даже:
(command "_.vbastmt" "ThisDrawing.Close False : AcadApplication.Quit")
Но с выходом из самого ACAD таким образом иногда бывают какие-то глюки. Сейчас точно не помню, но в некоторых случаях бывало, что ACAD закрывался, но с предсмертным воплем об ошибке инициализации VBA.
leha вне форума  
 
Непрочитано 17.03.2004, 22:37
#19
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


[sm1007] Не знал я что так запросто, можно "воткнуть" в ЛИСП кусочек процедуры на VBA! Смайлика с награждением медалью не нашел. Впрочем это Апельсинова тема.
{Smirnoff} вне форума  
 
Непрочитано 18.03.2004, 09:46
#20
Pilot

Проектировщик свиноводство
 
Регистрация: 21.08.2003
Сообщений: 2,260


А если сперва создать новый слой с каким-нибудь неудобоваримым именем, которого наверняка нет в чертеже - этим мы гарантируем что чертеж изменился:
Код:
[Выделить все]
(command
      "_layer" "_m" "qwerty123456" ""
      "_close" "_yes"
)
Pilot вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > как закрыть файл из лиспа

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

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