|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Autocad 2008 Autolisp Открытие чертежа
Регистрация: 01.07.2010
Сообщений: 521
|
||
Просмотров: 13007
|
|
||||
Программист-энтузиаст Регистрация: 17.07.2009
Воронеж
Сообщений: 575
|
Zaghim, посмотри тут
http://autolisp.ru/2010/04/08/procee...tive-document/
__________________
cadtools |
|||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Документ открыл таким способом
(vla-open (vla-get-Documents (vlax-get-acad-object)) "путь и имя" :vlax-true " ") т.е. чертеж стал активным, в нем можно сделать то, что я хочу. Как его теперь закрыть и что самое главное, как сделать что бы сохранилось то значение, которое мне нужно? |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Подробнее - Работа с неактивным документом Там же есть примеры
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Смотрите, мне нужна координата. Я передаю туда координату и получить назад тоже должен ее. Я думаю это можно сделать, если я сохраню координату в файл, в новом чертеже ее прочитаю и сохраню опять в этот файл уже другую. Вопрос в том как закрыть активный документ. Через close закрывает все окна кроме активного(((( А вот с неактивным вообще хз, ничего не понял и примеры какие-то непонятные(((
|
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Почитай Последовательное применение lisp-функции к множеству файлов DWG
Ты пытаешься реализовать вариант №1 из #4. Тогда не нужно делать файл активным, а работать через указатель на документ (открытый файл)
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Я просто удивлен! Все время пользуюсь vla-Open и vla-Close и не знал, что открыть и закрыть файл вообще проблема.
vla-Close закрывает документ как с сохранением, так и без, как с прежним именем, так и с новым, типа Save As. vla-Open применяю к указателю на Documents, а когда открыл - сохраняю указатель на открывшийся документ и применяю к нему vla-Close. Сколько не напрягал мозг, а так и не понял почему такие ассы как VVA и Kpblc открывают документ по другому? Ну мелькнет в окне и что? |
||||
![]() |
|
||||
Да без проблем. Только про значение поясни. Ты в файле что-то меняешь и далее save делаешь?
А код - Код:
Я заметил, что ты открываешь файл с аргументом :vlax-true - это только для чтения, а :vlax-falce - с возможностью редактирования. Может поэтому у тебя не сохранялись данные? Последний раз редактировалось Supermax, 06.10.2010 в 23:12. |
||||
![]() |
|
||||
Регистрация: 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. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 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, создай два лип-файла. 1-й - макрос активного окна, в котором пользователя просят ткнуть в точку. Макрос создает переменную с заранее тобой придуманным именем. Запускает второй лисп-файл, где координаты точки берутся из переменной и расчитывается число, которое записывается во вторую переменную с заранее придуманным тобой именем (переменные надо определять, как правильно напоминает тебе Do$). Затем первый лисп создает набор файлов для обработки (все переменные автоматом там пропишутся) и через vla-SendCommand запускаешь в неактивном документе второй лисп, считываешь вторую переменную, запускаешь в следующем документе второй лисп и т.д.
Все происходит из первого, активного документа. Ты опять открываешь файл "только для чтения" Код:
Последний раз редактировалось Supermax, 07.10.2010 в 10:49. |
||||
![]() |
|
||||
Регистрация: 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 ) Вот так вот...значение есть, теперь можем делать, что ходим, единственное экран теперь будет мелькать туда сюда...но это уже ерунда! Файл мне и нужно открывать только для чтения, я в нем ничего не меняю, только получаю свое и сваливаю) Еще ерунда в том, что физически файл не закрывается, т.е. я возвращаюсь к первому чертежу, а тот остается... вот это большая беда! |
|||
![]() |
|
||||
Блин! Куда ты возвращаешся? Ты из какого файла запускаешь коды? Из какого документа ты делаешь vla-Open? И как ты замеряешь расстояние, если ты функцию polar запускаешь не в открытом тобою документе, а в том, в котором сидишь?
надо делать Цитата:
|
||||
![]() |
|
||||
Как он у тебя становится активным?!!! Ты ему что vla-Activate делаешь?
Ты хоть на монитор смотришь? Ты что перед сабой видишь? Твоя Цитата:
|
||||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
))) Спокойствие, сейчас разберемся)
Активным окно становится после его открытия, в монитор я вижу новый чертеж, все значения, которые были на предыдущем чертеже стали нил, кроме новых двух. Я выполняю действие в новом чертеже, а после закрытия возвращаюсь назад. Все я понял свой косяк. Попробовал нарисовать линию и она нарисовалась есессено на 1 чертеже. А если мне нужно выполнить 200 команд на втором чертеже, все писать через vla-SendCommand??? Как этот файл потом физически закрыть? Он все равно остается висеть во вкладках((( Последний раз редактировалось Zaghim, 07.10.2010 в 11:34. |
|||
![]() |
|
||||
Цитата:
Код:
Цитата:
|
||||
![]() |
|
||||
Делай все аккуратно.
Убедись, для начала, что кроме твоего рабочего документа там никого нет. Запусти в рабочем документе Код:
Запусти в рабочем документе Код:
Посмоти вкладки, файла там больше нет У меня все именно так. Если хочешь чтобы запускаемый код выполнялся сразу в процессе загрузки файла, то в функцию его не объединяй, а если хочешь чтобы он выполнился только после полной загрузки - весь код объедини в функцию и последней строкой ее запусти. Последний раз редактировалось Supermax, 07.10.2010 в 12:41. |
||||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
vlax-false - значит, что сохранять не нужно, так и делаю.
С этим все понятно и вроде файл закрылся. Вопрос в том как должен выглядить второй лисп файл, можешь дать пример файла, который запустится точно и выполнит там ну скажем полар и потом вернет назад полученную координату. Вот это непонятно если хочешь чтобы он выполнился только после полной загрузки - весь код объедини в функцию и последней строкой ее запусти. |
|||
![]() |
|
||||
Кода файл загружается, то буквально выполняеются все его директивы. Если в коде в середине ошибка, то до ошибки все выполнится, а на ней загрузка прервется. Если код объединен через (defun бла-бла-бла ..., то сначала загружается в память вся функция с твоим кодом и только потом, второй директивой, коей является последняя строка лиспа (бла-бла-бла) запускается эта вся хрень. Если в коде есть ошибки - прервется и сама загрузка в память функции и сама загрузка файла.
Вот создай файл с такой строчкой и все (setq bp2 (polar bp2 0 10000)) |
||||
![]() |
|
||||
Гы-гы-гы
![]() Разберем по косточкам: Код:
В таком виде она nil далее: Код:
Код:
Код:
|
||||
![]() |
|
||||
Код:
Осталось вернуться назад. Хотя это нужно в самом последнем файле. Сделай глобальную переменную доступную всем для указателя на самый первый активный документ и сделай в конце его (vla-Activate... . |
||||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Я в шоке... все равно не работает)))) ужа зла не хватает
это первый лисп и 1 чертеж в коде Код:
Код:
Команда застревает после (vla-SendCommand doc1 "(load \"D:\\\\Программирование\\\\mip1.lsp\") ") [FONT=monospace]т.е. если я вручную переключусь на 1 окно, а потом обратно, то тогда она выполняет то что нужно((( брееед([/FONT] Последний раз редактировалось Zaghim, 07.10.2010 в 16:33. |
|||
![]() |
|
||||
Верю.
Только перед впадением в полную истерику скажи: А почему у тебя вместо Код:
Код:
Это что за ...? Код:
Код:
Для начала присвой им всем хоть что-то, а только потом vl-propagate После того, как ты запустил файл и обработку в нем, сделай прокрутку с ожиданием исполнения второго файла. Для этого сделай еще одну глобальную переменную доступную всем типа Код:
обратно в первый документ запустив во втором файле Код:
|
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,426
|
Ох, мудрите на ровном месте...
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
В общем вчера психанул и сделал, как говорил VVA. Так работает без проблем, НО ОЧЕНЬ ДОЛГО... так как рисунки большие (10-12мб) и нужно все заморозить, потом ждать пока чертеж подгрузится, потом пробиндится, потом его взорвать нужно (не спрашивайте почему, но нужно), потом определить точку и сохранить ее, а потом все это дело вернуть назад))))) и только после всех этих махинаций можно вставить блок со всем чем нужно)))
|
|||
![]() |
|
||||
Не знаю, что там у тебя биндится, но на sendCommand для других открытых файлов все гуру себе чую зубы-то пообломали.
Для меня тут дело принципа. Я в одном документе, рядом открыт другой, как там запустить лисп? И не просто запустить, а чтобы еще и результат вернул в первый документ. И я эту задачу решу ![]() Закон 1. Любые лиспы работают только в активном документе. Если в процессе выполнения программы идет переключение активности с текущего документа на другой, то дальнейшее выполнение программы приостанавливается до возврата активности данному документу. Закон 2. Метод sendCommand переключает активность на другой документ раньше, чем успевает передать в командную строку данные. Поэтому этот метод надо запускать только из другого потока, не зависящего от активности документов. Последний раз редактировалось Supermax, 08.10.2010 в 11:01. |
||||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Не понял зачем делать бесконечный цикл и где его делать в 1 или вызываемом лиспе?
Учел все твои замечания. В общем результат практически такой же. Т.е. файл открыл, переменные вначале забил потом объявил их глобальными, затем sendCommand и застреваю на четреже, но уже без ошибки, переменные внутри второго лиспа по-прежнему не заполняются и вернуться назад могу только руками((( Последний раз редактировалось Zaghim, 08.10.2010 в 11:58. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
2. Если уж без взрыва невозможно, то вставляй другой рисунок сразу как блок, командой Insert, а перед именем файла укажи * - будет вставляться сразу расчлененным. Только используй команду _-Insert (с минусом в начале) Из справки Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Zaghim, Думаю что да. Хотя рассудить может только научный метод - метод тыка.
Предлагаю тебе еще раз подробно описать твою задачу (т.е. что есть и что нужно получить). Для удобства подготовить парочку небольших примеров ввиде dwg файлов. Обращаю внимание: подробно описать твою задачу, а не алгоритм ее решения, который ты себе сам придумал.
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 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") (путь к файлу прописан) Последний раз редактировалось Zaghim, 08.10.2010 в 15:02. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Вот пример. Файлы 1.dwg и 2.dwg должны быть в одной папке. Открыть 1.dwg и выполнить команду TEST Код:
Цитата:
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Точку второй раз не нужно запрашивать, она же уже введена первый раз. Немного не то в общем(
Есть еще сообщение о том что бы включать или не включать прокси графику, такое как можно отключить? Это сделал ремуваллпрокси, но чертеж всеравно не вставляется программно, так да, а из программы нет, бред( Последний раз редактировалось Zaghim, 08.10.2010 в 15:58. |
|||
![]() |
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,996
|
Цитата:
Цитата:
Но лучше использовать это: ObjectARX. Расчленение и удаление proxy-объектов
__________________
Как использовать код на Лиспе читаем здесь |
|||
![]() |
|
||||
Я прерву ваши думы на пару минут
![]() Есть много способов решения данной проблемы. Один, с моей точки зрения самый простой, я сейчас вам покажу. Я пользуюсь файлом acaddoc.lsp пусть все хоть взорвутся от критики, но без него я не могу. Он определяет мне одноименные с файлом dwg лиспы. Так вот, туда я вставил всего одну, строчку в самый конец: Код:
Файл первый, запускаемый из первого документа ручками Код:
Код:
Файлы открываются, лиспы в них выполняются и все возвращается в первый документ! Теперь можно и код наращивать. В переменную lispSendCommand можно писать прямой код (правда не знаю какой длинны можно). Последний раз редактировалось Supermax, 08.10.2010 в 16:19. |
||||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Вот в такой форме как ты написал все круто. А попробуй теперь, когда приходишь во второй документ сделать не так (setq bp1cc 123), а так
(setq bp1 bp1cc) И вот в этом вся проблема, что она нихрена не присваеват значение на новую переменную. Мне то и нужно эту координату, которая будет в bp1cc перекинуть в переменную bp1 и с ней отработать. Проставил алерты и такое ощущение, что вообще вначале выполняется второй лисп, потом только первый) Последний раз редактировалось Zaghim, 08.10.2010 в 17:02. |
|||
![]() |
|
||||
Дело в том, что переменные, определенные функцией vl-propagate загружаются в пространство документа после выполнения загрудки файла. Там все на приоритетах построено. Что первым загружается, что вторым, что третьим. Паралельно там ничего не делается. А как только файл загрузился Open возвращает назад активность документа и переменные так и не прописываются.
Так получилось, что vl-propagate тут не катит. Нужно использовать не setq в паре с vl-propagate, а vl-bb-set и vl-bb-ref. Они специально созданы для обработки многодокументных случаев. В твоем случае все будет выглядеть так: Первый файл Код:
Код:
Последний раз редактировалось Supermax, 08.10.2010 в 19:34. |
||||
![]() |
|
||||
Регистрация: 01.07.2010
Сообщений: 521
|
Уже теплее, но значение назад как-то криво идет или вообще не идет, не пойму! Пришел я со своей координатой, ее принял с ней отработал. Получил новое значение в другой переменной. Как мне теперь назад отправить это значение?
В общем отдельно второй файл работает, точку пересечения находит, а вот если вызывать, то точку не находит... похоже просто не определяет то, что есть на чертеже((( Еще бывает такое, что она значение определяет, но оно неправильное почему то((( И при продолжении тыкания точек это значение дальше не меняется, остается таким как и было... это ужас((( Первая часть кода Код:
Код:
Последний раз редактировалось Zaghim, 12.10.2010 в 12:46. |
|||
![]() |
|
|||||
Цитата:
Цитата:
Цитата:
Цитата:
Последний раз редактировалось Supermax, 13.10.2010 в 19:04. |
|||||
![]() |
|
||||
Ты знаешь, какая разница между надеждой и уверенностью? Между упрямством и упорством? Между бюрократизмом и методичностью?
Ты убрал (хтя-бы временно) строчку с закрытием файла? Ты перешел на vl-bb-set и vl-bb-ref? |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Видеоуроки 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 |