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

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

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

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

подскажите, как програмно в лиспе можно закрыть открытый в акаде файл (без сохранения).
Просмотров: 6617
 
Непрочитано 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,117
<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,117
<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,117
<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,134


Я в лиспе ничего почти не понимаю, но если работает команда 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,210


Если сделать переменную 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,210


А если сперва создать новый слой с каким-нибудь неудобоваримым именем, которого наверняка нет в чертеже - этим мы гарантируем что чертеж изменился:
Код:
[Выделить все]
(command
      "_layer" "_m" "qwerty123456" ""
      "_close" "_yes"
)
Pilot вне форума  
 
Автор темы   Непрочитано 18.03.2004, 09:48
#21
Apelsinov

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


>leha, Вот оно! то что доктор прописал!
Огромное человеческое спасибо!
Apelsinov вне форума  
 
Непрочитано 18.03.2004, 17:02
#22
kos

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


Как и обещал, отчитываюсь.

1. С использованием ActiveX и LISP можно закрыть все рисунки, кроме текущего.
2. То, что предложил leha, работает. Это из той же оперы, что и открытие рисунка. (command "_.OPEN") не работает, а при помощи VBA работает.

Пункты 1 и 2 связаны с тем, что LISP'ы грузятся в пространства имен рисунка. Именно поэтому объектная модель не поддерживается LISP'ом на 100%. А вот VBA поддерживается.

3. Конструкция (command "_.CLOSE") (command "_Yes") у меня работает из командной строки. А если из функции (программы), то ругается теми же самыми словами: "_yes Unknown command "YES". Press F1 for help."
__________________
Там все есть для счастья - меня там только нет.
Так это значит, что я там - буду!
kos вне форума  
 
Непрочитано 18.04.2010, 12:28
#23
ViktorM

инженер-проектировщик
 
Регистрация: 07.04.2010
Сообщений: 4
<phrase 1=


У меня английская версия Акад 2007. Использовал для закрытия активного документа без сохранения изменений (изменения всегда есть"МАСШТАБ И Т.П.")
(command "_close" "Y")
Всё работает.
ViktorM вне форума  
 
Непрочитано 13.08.2019, 13:34
#24
allar8


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


Нужен лиспик для закрытия сразу всех чертежей без сохранения и без "общения" с диалоговым окном подтверждения.
В лиспе пока не очень силен, по ентому и спрашиваю.
Т.е. например закрытие всех чертежей с сохранением всех чертежей просто - ^C^Csaveall ^C^C_closeall
А вот закрытие без сохранения на подобии ^C^C(command "_closeall" "Д") (у меня 2017 русский акад) - "заcтавляет общаться" с диалоговым окном подтверждения.
нужно я так понимаю цикл организовать с щетчиком равным кол-ву открытых чертежей
А может все и проще - но я пока не знаю)

Последний раз редактировалось allar8, 13.08.2019 в 13:42.
allar8 вне форума  
 
Непрочитано 13.08.2019, 13:47
1 | #25
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 5,873


allar8,
Код:
[Выделить все]
 (defun c:close-all-no-save (/ acapp curdoc);close without saving changes
  (vl-load-com)
  (setvar "sdi" 0)
  (setq acapp (vlax-get-acad-object))
  (setq cnt (vla-get-count
      (vla-get-documents acapp))
  num cnt
  )
  
  (repeat num
    (setq curdoc (vla-item (vla-get-documents acapp) (1- cnt)))
    (vl-catch-all-apply
      (function (lambda()
      (vla-close curdoc :vlax-false fname))))
    (vlax-release-object curdoc)
    (setq cnt (1- cnt))
  )
(vla-put-windowstate (vla-get-activedocument acapp) acmax)
  (vla-put-windowstate (vlax-get-acad-object) acmin)
    (command "_.vbastmt" "activedocument.close false")
  (command "_.vbastmt" "application.quit ")

  (princ)
)
Nike вне форума  
 
Непрочитано 13.08.2019, 15:06
#26
allar8


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


Цитата:
Сообщение от Nike Посмотреть сообщение
Код:

[Выделить все]
view sourceprint?01(defun c:close-all-no-save (/ acapp curdoc);close without saving changes02 (vl-load-com)03 (setvar "sdi" 0)04 (setq acapp (vlax-get-acad-object))05 (setq cnt (vla-get-count06 (vla-get-documents acapp))07 num cnt08 )09 10 (repeat num11 (setq curdoc (vla-item (vla-get-documents acapp) (1- cnt)))12 (vl-catch-all-apply13 (function (lambda()14 (vla-close curdoc :vlax-false fname))))15 (vlax-release-object curdoc)16 (setq cnt (1- cnt))17 )18(vla-put-windowstate (vla-get-activedocument acapp) acmax)19 (vla-put-windowstate (vlax-get-acad-object) acmin)20 (command "_.vbastmt" "activedocument.close false")21 (command "_.vbastmt" "application.quit ")22 23 (princ)24)
Большое спасибо!

----- добавлено через ~9 ч. -----
Цитата:
Сообщение от Nike Посмотреть сообщение
01
(defun c:close-all-no-save (/ acapp curdoc);close without saving changes
02
**(vl-load-com)
03
**(setvar "sdi" 0)
04
**(setq acapp (vlax-get-acad-object))
05
**(setq cnt (vla-get-count
06
******(vla-get-documents acapp))
07
**num cnt
08
**)
09
***
10
**(repeat num
11
****(setq curdoc (vla-item (vla-get-documents acapp) (1- cnt)))
12
****(vl-catch-all-apply
13
******(function (lambda()
14
******(vla-close curdoc :vlax-false fname))))
15
****(vlax-release-object curdoc)
16
****(setq cnt (1- cnt))
17
**)
18
(vla-put-windowstate (vla-get-activedocument acapp) acmax)
19
**(vla-put-windowstate (vlax-get-acad-object) acmin)
20
****(command "_.vbastmt" "activedocument.close false")
21
**(command "_.vbastmt" "application.quit ")
22
*
23
**(princ)
24
)
Все гуд но заметил, что вкладки файла после этой команды появляются. Я их не люблю. Можно это как нить исправить?

----- добавлено через ~9 ч. -----
закоментировал
Цитата:
Сообщение от Nike Посмотреть сообщение
(setvar "sdi" 0)
вроде получилось
allar8 вне форума  
 
Непрочитано 14.08.2019, 10:35
#27
allar8


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


Цитата:
Сообщение от Nike Посмотреть сообщение
Код:

[Выделить все]
view sourceprint?01(defun c:close-all-no-save (/ acapp curdoc);close without saving changes02 (vl-load-com)03 (setvar "sdi" 0)04 (setq acapp (vlax-get-acad-object))05 (setq cnt (vla-get-count06 (vla-get-documents acapp))07 num cnt08 )09 10 (repeat num11 (setq curdoc (vla-item (vla-get-documents acapp) (1- cnt)))12 (vl-catch-all-apply13 (function (lambda()14 (vla-close curdoc :vlax-false fname))))15 (vlax-release-object curdoc)16 (setq cnt (1- cnt))17 )18(vla-put-windowstate (vla-get-activedocument acapp) acmax)19 (vla-put-windowstate (vlax-get-acad-object) acmin)20 (command "_.vbastmt" "activedocument.close false")21 (command "_.vbastmt" "application.quit ")22 23 (princ)24)
еще чуть чуть закоментировал в Вашей версии - чтоб не сворачивалось
и еще одну версию приложил чтоб докучи и с закрытием автокада см. вложения
Вложения
Тип файла: lsp Quit_all_no_save.lsp (632 байт, 2 просмотров)
Тип файла: lsp close_all_no_save.lsp (707 байт, 3 просмотров)
allar8 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > как закрыть файл из лиспа

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

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