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

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

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

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

Подскажите, каким образом программно открыть чертеж. Путь его я знаю.
В общем полная идея такая: нужно получить некоторую информацию с одного чертежа, сохранить ее в переменной, потом открыть другой чертеж вытащить нужное значение, закрыть чертеж (вернуться к первому) и сохранить это значение в другую переменную. Такое возможно?!
Просмотров: 13007
 
Непрочитано 06.10.2010, 16:43
#2
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Zaghim, посмотри тут
http://autolisp.ru/2010/04/08/procee...tive-document/
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 06.10.2010, 16:56
#3
Zaghim


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


Как все дико сложно, ппц(((
Zaghim вне форума  
 
Непрочитано 06.10.2010, 17:02
#4
Do$

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


Это только на первый взгляд...
Do$ вне форума  
 
Автор темы   Непрочитано 06.10.2010, 17:04
#5
Zaghim


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


Документ открыл таким способом
(vla-open (vla-get-Documents (vlax-get-acad-object)) "путь и имя" :vlax-true " ")
т.е. чертеж стал активным, в нем можно сделать то, что я хочу.
Как его теперь закрыть и что самое главное, как сделать что бы сохранилось то значение, которое мне нужно?
Zaghim вне форума  
 
Непрочитано 06.10.2010, 17:42
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Как его теперь закрыть и что самое главное, как сделать что бы сохранилось то значение, которое мне нужно?
Никак. Нужно использовать ObjectDBX
Подробнее - Работа с неактивным документом Там же есть примеры
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 06.10.2010, 17:49
#7
Zaghim


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


Смотрите, мне нужна координата. Я передаю туда координату и получить назад тоже должен ее. Я думаю это можно сделать, если я сохраню координату в файл, в новом чертеже ее прочитаю и сохраню опять в этот файл уже другую. Вопрос в том как закрыть активный документ. Через close закрывает все окна кроме активного(((( А вот с неактивным вообще хз, ничего не понял и примеры какие-то непонятные(((
Zaghim вне форума  
 
Непрочитано 06.10.2010, 18:51
#8
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Почитай Последовательное применение lisp-функции к множеству файлов DWG
Ты пытаешься реализовать вариант №1 из #4. Тогда не нужно делать файл активным, а работать через указатель на документ (открытый файл)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 06.10.2010, 21:47
#9
Supermax

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


Я просто удивлен! Все время пользуюсь vla-Open и vla-Close и не знал, что открыть и закрыть файл вообще проблема.
vla-Close закрывает документ как с сохранением, так и без, как с прежним именем, так и с новым, типа Save As.
vla-Open применяю к указателю на Documents, а когда открыл - сохраняю указатель на открывшийся документ и применяю к нему vla-Close.
Сколько не напрягал мозг, а так и не понял почему такие ассы как VVA и Kpblc открывают документ по другому?

Ну мелькнет в окне и что?
Supermax вне форума  
 
Автор темы   Непрочитано 06.10.2010, 22:23
#10
Zaghim


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


А можно код в студию? А значение, которое я получу со второго чертежа сохранится, когда я закрою его и вернусь к 1 чертежу?
Zaghim вне форума  
 
Непрочитано 06.10.2010, 23:02
#11
Supermax

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


Да без проблем. Только про значение поясни. Ты в файле что-то меняешь и далее save делаешь?

А код -
Код:
[Выделить все]
(setq doc1 (vla-Open (vla-get-Documents (vlax-get-acad-object)) "путь и имя" :vlax-falce " "));не понимаю, почему у тебя true стоит
;открыли
;...
;...
;...
;чего-то там наваяли
(vla-Save doc1);сохранили, хотя и не обязательно, следующий метод и так сохраняет.
(vla-Close doc1 :vlax-true );если надо сохранять с новым именем, то еще "путь и имя" надо третьим аргументом добавлять
Вообще-то это все я делаю не покидая своего пространства прямо в неактивном (но открытом) документе. Я не совсем понимаю что и где ты хочешь сохранить.

Я заметил, что ты открываешь файл с аргументом :vlax-true - это только для чтения, а :vlax-falce - с возможностью редактирования. Может поэтому у тебя не сохранялись данные?

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


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


Так постараюсь еще раз более подробно. У меня открыт один чертеж, на нем есть всяческие линии. Есть такой же второй чертеж, тоже с линиями, но отличающийся своим расстоянием друг от друга. Я тыкаю точку - получаю координату - расстояние до соседней линии по оси Y. Затем запоминаю ее и заношу в атрибуты динамического блока. Ок, все круто. А теперь мне нужно получить вторую точку из другого чертежа и занести ее в этот же блок! Т.е. я открываю второй чертеж, причем точка куда я тыкнул 1 раз должна быть уже не нил на новом чертеже. Нахожу там координату до соседней линии, сохраняю ее, закрываю чертеж без сохранения и возвращаюсь к начальному чертежу, далее вношу второе значение во второй атрибут динамического блока. Во так думаю понятнее)
Про сохранение. Когда мы работаем на одном чертеже и выполняем там свой лисп, то все значения, сохраненные в переменных, будут доступны только на этом чертеже, т.е. если я открою новый чертеж и посмотрю, что у меня лежит в переменной допустим а1, там будет нил, хотя на первом оно равно 20, к примеру.

Вот о чем я и говорил. Такая структура не работает...
(setq doc1 (vla-open (vla-get-Documents (vlax-get-acad-object)) "путь и имя" :vlax-true " "))
(setq bp2 bp1)
(setq bp2 (polar bp2 0 10000))
(vla-Close doc1 :vlax-true )
т.е. при открытие нового чертежа все значения ставятся нил

Последний раз редактировалось Zaghim, 07.10.2010 в 10:18.
Zaghim вне форума  
 
Непрочитано 07.10.2010, 10:09
#13
Do$

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


Для передачи переменной в другой чертеж есть функция vl-propagate.
Do$ вне форума  
 
Непрочитано 07.10.2010, 10:09
#14
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Supermax Посмотреть сообщение
Я просто удивлен! Все время пользуюсь vla-Open и vla-Close и не знал, что открыть и закрыть файл вообще проблема.
Это не проблема. Главное не делать его активным, а работать
Цитата:
Сообщение от Supermax Посмотреть сообщение
не покидая своего пространства прямо в неактивном (но открытом) документе
Цитата:
Сообщение от Zaghim Посмотреть сообщение
Т.е. я открываю второй чертеж, причем точка куда я тыкнул 1 раз должна быть уже не нил на новом чертеже. Нахожу там координату до соседней линии, сохраняю ее, закрываю чертеж без сохранения и возвращаюсь к начальному чертежу
Интерактивно так не выйдет. Почему бы тебе не рассмотреть варинт подгрузки нужных чертежей как внешней ссылки или вставки как блока?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 07.10.2010, 10:21
#15
Zaghim


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


Вот о чем я и говорил. Такая структура не работает...
(setq doc1 (vla-open (vla-get-Documents (vlax-get-acad-object)) "путь и имя" :vlax-true " "))
(setq bp2 bp1)
(setq bp2 (polar bp2 0 10000))
(vla-Close doc1 :vlax-true )
т.е. при открытие нового чертежа все значения ставятся нил.

Хм,хм ... т.е. подгрузить чертеж х-рефом, заморозив предварительно все что есть на чертеже, выполнить мои махинации и потом х-реф удалить?

А вот с vl-propagate сейчас попробую, есть еще две функции vl-bb-set and vl-bb-ref щас и их изучим
Zaghim вне форума  
 
Непрочитано 07.10.2010, 10:34
#16
Supermax

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


Zaghim, создай два лип-файла. 1-й - макрос активного окна, в котором пользователя просят ткнуть в точку. Макрос создает переменную с заранее тобой придуманным именем. Запускает второй лисп-файл, где координаты точки берутся из переменной и расчитывается число, которое записывается во вторую переменную с заранее придуманным тобой именем (переменные надо определять, как правильно напоминает тебе Do$). Затем первый лисп создает набор файлов для обработки (все переменные автоматом там пропишутся) и через vla-SendCommand запускаешь в неактивном документе второй лисп, считываешь вторую переменную, запускаешь в следующем документе второй лисп и т.д.
Все происходит из первого, активного документа.

Ты опять открываешь файл "только для чтения"
Код:
[Выделить все]
setq doc1 (vla-open (vla-get-Documents (vlax-get-acad-object)) "путь и имя" :vlax-true " "))
Маленькая поправка. Обе переменные должны быть созданы первым лиспом сразу и определены через функцию vl-propagate

Последний раз редактировалось Supermax, 07.10.2010 в 10:49.
Supermax вне форума  
 
Автор темы   Непрочитано 07.10.2010, 10:47
#17
Zaghim


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


Не не не))
DO$ правду сказал! Получилось все дело вот каким простым способом вез всяких там наворотов с ObjectDBX!!!

(vl-propagate 'bp1)
(vl-propagate 'bp2)
(setq doc1 (vla-open (vla-get-Documents (vlax-get-acad-object)) "путь и имя" :vlax-true " "))
(setq bp2 bp1)
(setq bp2 (polar bp2 0 10000))
(vla-Close doc1 :vlax-false )

Вот так вот...значение есть, теперь можем делать, что ходим, единственное экран теперь будет мелькать туда сюда...но это уже ерунда!

Файл мне и нужно открывать только для чтения, я в нем ничего не меняю, только получаю свое и сваливаю)

Еще ерунда в том, что физически файл не закрывается, т.е. я возвращаюсь к первому чертежу, а тот остается... вот это большая беда!
Zaghim вне форума  
 
Непрочитано 07.10.2010, 11:00
#18
Supermax

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


Блин! Куда ты возвращаешся? Ты из какого файла запускаешь коды? Из какого документа ты делаешь vla-Open? И как ты замеряешь расстояние, если ты функцию polar запускаешь не в открытом тобою документе, а в том, в котором сидишь?
надо делать
Цитата:
(vla-SendCommand doc1 "(setq bp2 (polar bp2 0 10000))")
Supermax вне форума  
 
Автор темы   Непрочитано 07.10.2010, 11:16
#19
Zaghim


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


Когда я открываю новый чертеж он ведь становится активным! Получается что там и ищу точку, а после его закрытия возвращаюсь опять к первому, лисп один, из него все запускаю
Zaghim вне форума  
 
Непрочитано 07.10.2010, 11:20
#20
Supermax

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


Как он у тебя становится активным?!!! Ты ему что vla-Activate делаешь?
Ты хоть на монитор смотришь? Ты что перед сабой видишь?

Твоя
Цитата:
(setq doc1 (vla-open (vla-get-Documents (vlax-get-acad-object)) "путь и имя" :vlax-true " "))
открывает файл, он на мгновение появляется в окне и пропадает, опять активным становится то окно из которого лисп запущен и все остальные коды ты из него запускаешь.
Supermax вне форума  
 
Автор темы   Непрочитано 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
С.-Петербург
Сообщений: 40,426


Ох, мудрите на ровном месте...
__________________
Моя библиотека 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,996


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


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


А по времени, думаешь, это будет быстрее?
Zaghim вне форума  
 
Непрочитано 08.10.2010, 13:35
#42
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Zaghim, Думаю что да. Хотя рассудить может только научный метод - метод тыка.
Предлагаю тебе еще раз подробно описать твою задачу (т.е. что есть и что нужно получить). Для удобства подготовить парочку небольших примеров ввиде dwg файлов. Обращаю внимание: подробно описать твою задачу, а не алгоритм ее решения, который ты себе сам придумал.
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 08.10.2010, 14:12
1 | #43
Zaghim


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


Задача такая.
Исходные данные: Есть два чертежа. Есть динамический блок с атрибутами, который я должен поставить на чертеж1, используя некоторые данные с чертежа1 и чертежа2. Есть базовая точка.
Задача: Тыкнуть на чертеже1, после этого должно некоторыми мат. функциями находится значение1 (это реализовано), далее - автоматическое открытие второго чертежа, получение значения2 с исходными данными - базовая точка. Возврат в чертеж1. Вставка блока с значением1 с чертежа1 и значением2 с чертежа2.

Чертежи. Точка одна, расстояния до линий разные, соответственно координаты пересечения у них тоже разные. Отсюда и два значения для атрибутов блока.

Со вставкой чертежа конечно круто, но опять таки не работает, потому что, когда открываешь чертеж просто она не находит некоторые .shx файлы (бывает такое и мы тыкаем на esc и чертеж загружается) и то ли из-за этого то ли из-за хз чего он не вставляется((( Делаю так

(command "-insert" "*gp1.dwg" "0,0" "1" "0")

(путь к файлу прописан)
Вложения
Тип файла: dwg
DWG 2004
1.dwg (34.8 Кб, 751 просмотров)
Тип файла: dwg
DWG 2004
2.dwg (35.1 Кб, 753 просмотров)

Последний раз редактировалось Zaghim, 08.10.2010 в 15:02.
Zaghim вне форума  
 
Непрочитано 08.10.2010, 15:24
#44
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Чертежи. Точка одна, расстояния до линий разные, соответственно координаты пересечения у них тоже разные. Отсюда и два значения для атрибутов блока
Чтобы взять координаты не нужно биндить и взрывать внешнюю ссылку
Вот пример. Файлы 1.dwg и 2.dwg должны быть в одной папке. Открыть 1.dwg и выполнить команду TEST
Код:
[Выделить все]
(defun C:TEST ( / *error* *LOC* *HIDDEN*)
  (defun *error* (msg)
    (princ msg)
    (mapcar '(lambda (x) (vla-put-visible x :vlax-true)) *HIDDEN*)
    (mapcar '(lambda (x) (vla-put-lock x :vlax-true)) *LOC*)
  ) ;_ end of defun
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object))
        blks (vla-get-blocks adoc)
        lays (vla-get-layers adoc)
  ) ;_ end of setq
  (if (/= (strcase (getvar "dwgname") t) "1.dwg")
    (progn
      (alert "Открой файл 1.dwg")
      (exit)
      )
    )
  (setq file2 (strcat (getvar "dwgprefix") "2.dwg"))
  (if (not (findfile file2))
    (progn
      (alert (strcat "не найден файл\n" file2))
      (exit)
      )
    )
  (initget 7)
  (setq PT (getpoint "\nУкажи точку: "))
  (setq *LOC* nil *HIDDEN* nil)
  ;; create a list of locked layer names
  ;; and unlock the locked layer
  (vlax-for lay lays
    (and (= (vla-get-lock lay) :vlax-true)
         (setq loc (cons lay *LOC*))
         (vla-put-lock lay :vlax-false) 
    )
  )
  (vlax-for item (vla-get-ModelSpace adoc)
    (setq *HIDDEN* (cons item *HIDDEN*))
    )
  ;;Скраваем примитивы чертежа 1
  (mapcar '(lambda (x) (vla-put-visible x :vlax-false)) *HIDDEN*)
  (alert "Сейчас будет загружен рисунок\n2.dwg")
  (setq xref
         (vla-attachexternalreference
                         (vla-get-modelspace adoc)
                         file2
                         (vl-filename-base file2)
                         (vlax-3d-point '(0 0 0))
                         1
                         1
                         1
                         0
                         :vlax-true
                       )
        )
  (initget 1)
  (setq PT2 (getpoint PT "\nУкажи 2-ю точку пересечения"))
  (setq xref (vla-Detach (vla-item blks (vla-get-name xref))))
  (mapcar '(lambda (x) (vla-put-visible x :vlax-true)) *HIDDEN*)
  (setq pt2 (strcat "Координаты: "(VL-PRINC-TO-STRING pt2)))
  (princ "\nУкажите точку вставки текста")
  (setvar "cmdecho" 0)
  (setq tstyle (getvar "TEXTSTYLE")) ;_Стиль текста Стиль должен существовать
  (if (= (cdr (assoc 40 (tblsearch "STYLE" tstyle))) 0.0)
     ;; нулевая высота текста
   (vl-cmdf "_.-TEXT" "_S" tstyle "_none" '(0 0 0) (getvar "TEXTSIZE") 0 pt2)
   (vl-cmdf "_.-TEXT" "_S" tstyle "_none" '(0 0 0) 0 pt2)
   ) ;_ end of if
   (command "_.copybase" "_none" "0,0" (entlast)"" "_.erase" (entlast)"")
   (command "_pasteclip" pause)
  )
Цитата:
потому что, когда открываешь чертеж просто она не находит некоторые .shx файлы
Отключения запроса на выбор несуществующего файла форм
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 08.10.2010, 15:47
#45
Zaghim


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


Точку второй раз не нужно запрашивать, она же уже введена первый раз. Немного не то в общем(
Есть еще сообщение о том что бы включать или не включать прокси графику, такое как можно отключить? Это сделал ремуваллпрокси, но чертеж всеравно не вставляется программно, так да, а из программы нет, бред(

Последний раз редактировалось Zaghim, 08.10.2010 в 15:58.
Zaghim вне форума  
 
Непрочитано 08.10.2010, 16:01
#46
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,996


Цитата:
Сообщение от Zaghim Посмотреть сообщение
Точку второй раз не нужно запрашивать, она же уже введена первый раз. Немного не то в общем(
Посмотри внимательно, от первой введенной точки тянется резиновая линия, а запрашивается точка пересечения (т.е. расстояние до линии из 2.dwg). И чертеж 2.dwg подгружен как ссылка.
Цитата:
Есть еще сообщение о том что бы включать или не включать прокси графику, такое как можно отключить?
PROXYNOTICE
Но лучше использовать это: ObjectARX. Расчленение и удаление proxy-объектов
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 08.10.2010, 16:13
#47
Supermax

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


Я прерву ваши думы на пару минут

Есть много способов решения данной проблемы. Один, с моей точки зрения самый простой, я сейчас вам покажу.

Я пользуюсь файлом acaddoc.lsp пусть все хоть взорвутся от критики, но без него я не могу. Он определяет мне одноименные с файлом dwg лиспы.
Так вот, туда я вставил всего одну, строчку в самый конец:
Код:
[Выделить все]
(eval (vl-bb-ref  'lispSendCommand))
Если там есть код - он выполняется, а если что-то другое - так и бог с ним.

Файл первый, запускаемый из первого документа ручками

Код:
[Выделить все]
(setq doc1 (vla-get-ActiveDocument (vlax-get-acad-object)))
;Делаем указатель доступным во всех открываемых документах
(vl-propagate 'doc1)

;Записываем начальное число в переменную bp1cc
(setq bp1cc 4)
;делаем переменную доступной во всех открываемых документах
(vl-propagate 'bp1cc)

;Записываем в внедокументную переменную исполняемый код
  (vl-bb-set 'lispSendCommand '(load "D:\\Программирование\\mip1.lsp"))

;Открываем новый документ
  (setq doc2 (vla-open (vla-get-Documents (vlax-get-acad-object)) "d:\\gp1.dwg" :vlax-false " "))
Файл второй, запускаемый автоматически как следствие выполнения записанного в переменную lispSendCommand указания.

Код:
[Выделить все]
;Даем новое определение переменной bp1cc
(setq bp1cc 123)
;Делаем ее доступной всем. Без этого она не изменится везде
(vl-propagate 'bp1cc)
Проверено, мин нет.
Файлы открываются, лиспы в них выполняются и все возвращается в первый документ!
Теперь можно и код наращивать.
В переменную lispSendCommand можно писать прямой код (правда не знаю какой длинны можно).

Последний раз редактировалось Supermax, 08.10.2010 в 16:19.
Supermax вне форума  
 
Автор темы   Непрочитано 08.10.2010, 16:57
#48
Zaghim


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


Вот в такой форме как ты написал все круто. А попробуй теперь, когда приходишь во второй документ сделать не так (setq bp1cc 123), а так
(setq bp1 bp1cc)
И вот в этом вся проблема, что она нихрена не присваеват значение на новую переменную. Мне то и нужно эту координату, которая будет в bp1cc перекинуть в переменную bp1 и с ней отработать.

Проставил алерты и такое ощущение, что вообще вначале выполняется второй лисп, потом только первый)

Последний раз редактировалось Zaghim, 08.10.2010 в 17:02.
Zaghim вне форума  
 
Непрочитано 08.10.2010, 19:20
#49
Supermax

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


Дело в том, что переменные, определенные функцией vl-propagate загружаются в пространство документа после выполнения загрудки файла. Там все на приоритетах построено. Что первым загружается, что вторым, что третьим. Паралельно там ничего не делается. А как только файл загрузился Open возвращает назад активность документа и переменные так и не прописываются.
Так получилось, что vl-propagate тут не катит. Нужно использовать не setq в паре с vl-propagate, а vl-bb-set и vl-bb-ref. Они специально созданы для обработки многодокументных случаев.

В твоем случае все будет выглядеть так:

Первый файл
Код:
[Выделить все]
;Записываем начальное число во внедокументную переменную bp1cc
(vl-bb-set 'bp1cc 4)

;Записываем во внедокументную переменную исполняемый код
  (vl-bb-set 'lispSendCommand '(load "D:\\Программирование\\mip1.lsp"))

;Открываем новый документ
  (setq doc2 (vla-open (vla-get-Documents (vlax-get-acad-object)) "d:\\gp1.dwg" :vlax-false " "))
Второй файл
Код:
[Выделить все]
(setq bp1cc (vl-bb-ref 'bp1cc));Причем, заметь, что имена глобальной и внедокументной функций одинаковые. Теперь и в первом документе появится bp1cc
(vl-propagate 'bp1cc)

Последний раз редактировалось Supermax, 08.10.2010 в 19:34.
Supermax вне форума  
 
Автор темы   Непрочитано 11.10.2010, 15:17
#50
Zaghim


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


Уже теплее, но значение назад как-то криво идет или вообще не идет, не пойму! Пришел я со своей координатой, ее принял с ней отработал. Получил новое значение в другой переменной. Как мне теперь назад отправить это значение?

В общем отдельно второй файл работает, точку пересечения находит, а вот если вызывать, то точку не находит... похоже просто не определяет то, что есть на чертеже(((

Еще бывает такое, что она значение определяет, но оно неправильное почему то((( И при продолжении тыкания точек это значение дальше не меняется, остается таким как и было... это ужас(((

Первая часть кода

Код:
[Выделить все]
(defun c:ip ()
  (vl-load-com)
  (setq nambl "D:\\Программирование\\Рисование профиля\\d1.dwg")
  (command "INSERT" nambl)
  (command)
  (setq cl 1)
  (command "-layer" "n" "_K1" "c" "24" "_K1" "lw" "0.70" "_K1" "s" "_K1" "" "")
  (if (= num nil)
    (setq num 1)
    (progn
      (INITGET 33 "S Y N   ")
      (setq answ (getkword "Начать нумерацию с начала (N), задать свое значение (S) или продолжить (P)? <P> "))
      (if (or (= answ "") (= answ "P"))
        (setq num num)
      )
      (if (= answ "S")
        (setq num (getint "Введите число: ")) 
      )
      (if (= answ "N")
    (setq num 1)
      )    
    )  
  ) 
  (while cl
    (setq bp1 (getpoint "\nТыкай точку или <Enter>:"))
      (setq bp1vp nil)
      (setq bp3 bp1)

          (vl-bb-set 'bp1vp bp1)

      (vl-bb-set 'lispSendCommand '(load "D:\\Программирование\\mip1.lsp"))
          (setq doc2 (vla-open (vla-get-Documents (vlax-get-acad-object)) "d:\\gp1.dwg" :vlax-false " "))
      (vla-close doc2 :vlax-false)

      (exit)
Вторая:
Код:
[Выделить все]
(defun pppp ()
          (setq bp1vp (vl-bb-ref 'bp1vp))
        (setq XYZ1 2)
            (setq bp1vp XYZ1)
            (vl-propagate 'bp1vp)
)
По отдельности второй файл работает и сохраняет значение... если запускаю из 1 части назад значение не позвращается...что за бред?

Последний раз редактировалось Zaghim, 12.10.2010 в 12:46.
Zaghim вне форума  
 
Непрочитано 13.10.2010, 10:20
#51
Supermax

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


Цитата:
Понимаешь, все дело в vl-propagate. vl-propagate - это процедура, которая вызывается последней при активации файла.
Вот не совсем. Если идет открытие с загрузкой файла, то да, а если файл уже открыт, то срабатывает сразу при открытии.
Цитата:
У тебя в первом документе запущен лисп. Активация этого документа приводит к продолжению работы этого лиспа, а vl-propagate сработает только когда лисп будет выполнен.
Опять вру. Если лисп уже запущен в активируемом документе, который уже открыт был ранее, то срабатывает.
Цитата:
НО! последней строчкой лиспа стоит закрытие файла из которого vl-propagate должна взять данные. Вот именно поэтому ты ничего получить не можешь.
Ну, это меня понесло. Видать в туалет хотел, да терпел, терпел, пока в голову не ударило.
Цитата:
Совет. Замени vl-propagate на vl-bb-set и vl-bb-ref.
правильный совет.

Последний раз редактировалось Supermax, 13.10.2010 в 19:04.
Supermax вне форума  
 
Автор темы   Непрочитано 13.10.2010, 11:40
#52
Zaghim


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


В общем не пашет...оставил надежду)
Zaghim вне форума  
 
Непрочитано 13.10.2010, 11:53
#53
Supermax

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


Ты знаешь, какая разница между надеждой и уверенностью? Между упрямством и упорством? Между бюрократизмом и методичностью?

Ты убрал (хтя-бы временно) строчку с закрытием файла?
Ты перешел на vl-bb-set и vl-bb-ref?
Supermax вне форума  
 
Автор темы   Непрочитано 13.10.2010, 11:55
#54
Zaghim


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


Да. все сделал как написал!
Zaghim вне форума  
 
Непрочитано 13.10.2010, 12:01
#55
Supermax

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


И что? Что ты тянешь резину. Нас сейчас забанять за топик-ар!

Первый файл
Код:
[Выделить все]
(vl-bb-set 'bp1vp "7890")
(vl-bb-set 'lispSendCommand '(load "D:\\Программирование\\mip1.lsp"))
(setq doc2 (vla-open (vla-get-Documents (vlax-get-acad-object)) "d:\\gp1.dwg" :vlax-false " "))
(alert bp1cc)
(vla-close doc2 :vlax-false)
Файл mip1.lsp
Код:
[Выделить все]
(setq bp1cc (vl-bb-ref 'bp1vp))
(vl-propagate 'bp1cc)
Все работает

А ты в acaddoc.lsp строчку дописал?

Последний раз редактировалось Supermax, 13.10.2010 в 12:20.
Supermax вне форума  
 
Автор темы   Непрочитано 13.10.2010, 12:50
#56
Zaghim


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


Так все работает, а если начать во втором файле мат вычисление, основанные с данными с чертежа, то уже нифига не получается...тупо не возвращает значение. Если просто сделать полар ну или даже линю нарисовать все ок... это такой бред...
Zaghim вне форума  
 
Непрочитано 13.10.2010, 18:55
#57
Supermax

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


Дай то, что должно быть выполнено. Может у тебя ошибка в коде.
Вот как ты пишешь, что не получается, а что именно не говоришь. Общие фразы только.
Код в студию, тогда и поговорим.
Supermax вне форума  
Ответ
Вернуться   Форум 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