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

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

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

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

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


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


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

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


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 Кб, 752 просмотров)

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

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


Цитата:
Чертежи. Точка одна, расстояния до линий разные, соответственно координаты пересечения у них тоже разные. Отсюда и два значения для атрибутов блока
Чтобы взять координаты не нужно биндить и взрывать внешнюю ссылку
Вот пример. Файлы 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,991
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от 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