Schöck
dwg.ru forum rss xml
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму |

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

Файл acaddoc.lsp : Процедура загрузки функций.

Версия для печати
 
Ответ
Опции темы Поиск в этой теме
Непрочитано 08.12.2008, 19:53 #1
Файл acaddoc.lsp : Процедура загрузки функций.
Supermax
 
Руководитель фирмы
 
Москва
Регистрация: 28.03.2007
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™

Supermax вне форума Вставить имя

Добавляестя в файл acaddoc.lsp с целью загрузки функций, предназначенных для текущего проекта. Если такого файла еще нет - создайте.

Очень часто надо загружать функции и процедуры, предназначенные только для конкретного файла *.DWG. Имея в своем компьютере файл acaddoc.lsp, лежащий в любом месте, путь к которому прописан в настройках Автокада, вы можете просто создав файл *.lsp под тем же именем, что и файл *.dwg и расположив их в одной папке, автоматически подгружать при открытии рисунка необходимые функции и выполнять требуемые процедуры.

Получается что-то типа проекта. Два файла под одним именем, но разного содержимого. Очень удобно при работе с реакторами.



Код:
[Выделить все]
(vl-load-com)
(setq actdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq win-tit (vla-get-WindowTitle actdoc))
(setq win-tit
 (strcat
  (vla-get-Path actdoc)
  "\\"
  (vl-list->string
   (reverse
    (append
     '(112 115 108)
      (cdddr
       (reverse (vl-string->list (vla-get-Name actdoc)))
      )
    )
   )
  )
 )
)
(if (findfile win-tit) (progn (load win-tit) 
                              (Alert (strcat "В рисунок загружен файл " 
                                             (vl-filename-base win-tit) 
                                             ".lsp"
                                     )
                              ) 
                        )
)
(setq win-tit nil)

Последний раз редактировалось Supermax, 12.12.2008 в 22:03.
Просмотров: 4547
 
Непрочитано 08.12.2008, 22:08
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 35,428


А посмотреть http://www.caduser.ru/cgi-bin/f1/board.cgi?t=19612AN ?
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 09.12.2008, 12:26
#3
Supermax

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


Ну посмотрел, и?

Приведу пример.
Вот у вас есть, кпримеру несколько файлов dwg, лежащих в одной папке. У меня, кпримеру - библиотека блоков.
Файлы
Блок1.dwg
Блок2.dwg
БлокN.dwg

Мне надо, чтобы при открытии файла Блок1.dwg в него подгрузились функции из файла Блок1.lsp, но чтобы они не подгружались при открытии других файлов. В то же время, для файла БЛОК2.dwg есть свой файл с функциями Блок2.lsp и т.д.

Кладем в эту же папку одноименные файлы с расширением *.lsp

Блок1.lsp
Блок2.lsp

При открытии файла, если в этой же папке есть с таким же именем lsp он загрузится в этот рисунок. К другим файлам dwg и lsp это не имеет никакого отношения.

Кроме функций, в файлах *.lsp еще и процедуры. Ни в коем случае их нельзя запускать в чужих файлах!

При этом в Автокаде не нужно прописывать пути к каждой папке, где лежат dwg файлы. Достаточно одноименности.

Я вообще удивляюсь, почему это не встроено в Автокад изначально.

Последний раз редактировалось Кулик Алексей aka kpblc, 09.12.2008 в 18:05.
Supermax вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 09.12.2008, 13:18
#4
Profan

Чужой
 
Регистрация: 25.12.2005
Москва
Сообщений: 13,666


А потому что вот это утверждение
Цитата:
Очень часто надо загружать функции и процедуры, предназначенные только для конкретного файла *.DWG.
спорно.
Profan вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 09.12.2008, 18:05
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 35,428


Profan, абсолютно согласен. На 1000%.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 11.12.2008, 16:53
#6
Supermax

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


Это потому, что вы с реакторами слабо работаете.
Supermax вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 11.12.2008, 19:46
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 35,428


"Слабо работаете" - достаточно сильное заявление. У меня командные реакторы в полный рост используются. На DoubleClick-реакторе я качественно обжегся. Объектные реакторы мне не понадобились. Реакторы изменения базы чертежа трогать не рискнул. Реактор на системную переменную начал было использовать, да потом как-то плюнул - без этого обошелся.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 11.12.2008, 21:16
#8
Supermax

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


И ты хочешь сказать, что функции действия и обработки данных в одном чертеже такие же как и в другом?
Ладно. Зайдем с другого боку.
Зачем я бился над реактором объекта - затем, чтобы сделать такой блок, в котором есть свойство "Блок настроен"\"Настроить". Lookup-ом сделанное. Всего два значения. Когда переключаешь любые параметры блока, то срабатывает реактор. Но функция действия этого объекта смотрит на это свойство и если его значение стало "Настроить", запускается функция редактирования этого блока. Точнее, выпадает окно, в котором пользователь устанавливает нужные значения и по нажатии кнопки "Настроить" данные прописываются в блок.

Напомню, что все операции с блоком происходят при выключенном реакторе.

Получается, что сколько блоков, столько и функций действия. Они и функции обработки блоков уникальны. Для одного блока - одно, для другого - другое. Я такую прогу пишу для библиотеки блоков по заказу. Поскольку штатными средствами всего, что хочет заказчик в блок не впихнуть никак. А если выбор параметров вынести за пределы динамизма блока и блок реформировать программно - другой базар.

Вот и родилась идея связанных одним именем файла dwg и lsp. Не надо тебе грузить в данный проект функции, или процедуры при запуске выполнять, только для этого чертежа предназначенные - не клади файл *.lsp с таким же именем в одну папку с dwg файлом.

Никому никто не мешает. Подумаешь процедуру добавил. Проверяет есть такой файл в папке или нет. Что вы так странно к этому отнеслись? - не понимаю. Вполне очевидная вещь. Практически все программы такой фишкой пользуются.
Supermax вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 12.12.2008, 00:06
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 35,428


Все это можно сделать совсем по-другому, не прибегая к достаточно опасным действиям типа применения объектных реакторов.
Моя методика, может, более трудоемка по количеству проработки, и требует кое-какой мозговой деятельности, но работать будет более устойчиво, как мне кажется. И программа будет универсальна, и таскать безумное количество дополнительных lsp не понадобится.
Суть примерно такова: при вызове конт.меню на вхождении такого "супер-блока" в это меню добавляется строка вызова формы с данными. Отфильтровать "супер-блоки" от "нормальных" не проблема (это я тебе гарантирую, поскольку такими вещами в свое время я занимался). Меню можно модифицировать как глобально, так и динамически (во втором случае будет, скорее всего, не обойтись без реактора vlr-mouse-reactor с действием :vlr-beginRightClick).
И вообще, у меня полное ощущение, что ты пытаешься сделать нечто типа MEP, но средствами только лиспа. Одумайся и посмотри вертикальные решения!
---
Добавлено: у тебя в коде идет "привязка" к WindowTitle. Так вот, при несохраненном файле все хорошо: WindowTitle вернет Drawing1.dwg (или Рисунок1.dwg, или Чертеж1.dwg) независимо ни от чего.
Но! Устанавливаем флажок _.options -> Open and Save -> Display full path in tile и
Код:
[Выделить все]
_$ (vla-get-WindowTitle (vla-get-ActiveDocument (vlax-get-acad-object)))
"D:\\1\\dwgru\\DXF\\Лист_16.dwg"
Снимаем флажок:
Код:
[Выделить все]
_$ (vla-get-WindowTitle (vla-get-ActiveDocument (vlax-get-acad-object)))
"Лист_16.dwg"
Чего во втором случае вернет (vl-filename-directory)? Праально, пустую строку. Так что код перерабатывай "Не то" он у тебя, "не то".
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 12.12.2008 в 00:13.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 12.12.2008, 10:01
#10
Supermax

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


Во! Вот за это, спасибо. Я с самого начала колебался. Думал, раз у Drawing1.dwg путь все равно есть, только из другого свойства берется. На МОИ ДОКУМЕНТЫ указывает, думаю, наверное путь надо отдельно от имени брать, а в WindowTitle всегда пытаться выделить имя из общего значения. Потом склеивать и дальше двигаться. Так и для Drawing1.dwg можно тоже процедуры выполнять. Но что-то мне влом было.
Обязательно исправлю.
Supermax вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 12.12.2008, 10:49
#11
Makswell

Инженер-строитель
 
Регистрация: 15.08.2007
Киров
Сообщений: 2,252


Вот так ИМХО надо:
Код:
[Выделить все]
(strcat
  (vla-get-Path actdoc)
  (vl-list->string
    (reverse
      (append
	'(112 115 108)
	(cdddr
	  (reverse
	    (vl-string->list
	      (vla-get-Name actdoc)
	    )
	  )
	)
      )
    )
  )
)
Makswell вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 12.12.2008, 11:07
#12
Supermax

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


Вот так, еще правильнее.
Код:
[Выделить все]
(strcat
  (vla-get-Path actdoc)
  "\\"
  (vl-list->string
    (reverse
      (append
	'(112 115 108)
	(cdddr
	  (reverse
	    (vl-string->list
	      (vla-get-Name actdoc)
	    )
	  )
	)
      )
    )
  )
)
Supermax вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 12.12.2008, 22:06
#13
Supermax

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


Изменил в первом посте код, добавил сообщение о загруженном файле,
себе в компе поменял тоже.
Supermax вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 12.12.2008, 23:18
#14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 35,428


Ну как же ты любишь все усложнять!
Код:
[Выделить все]
(defun start-autoload-code (/ adoc name err)
  (vl-load-com)
  (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  (if (equal (vla-get-saved adoc) :vlax-true)
    (foreach ext '("lsp" "fas" "vlx")
      (if
        (vl-catch-all-error-p
          (setq
            err (vl-catch-all-apply
                  (function
                    (lambda ()
                      (load
                        (findfile
                          (setq name (strcat
                                       (vla-get-path adoc)
                                       "\\"
                                       (vl-filename-base (vla-get-name adoc))
                                       "."
                                       ext
                                       ) ;_ end of strcat
                                ) ;_ end of setq
                          ) ;_ end of findfile
                        ) ;_ end of load
                      ) ;_ end of lambda
                    ) ;_ end of function
                  ) ;_ end of vl-catch-all-apply
            ) ;_ end of setq
          ) ;_ end of vl-catch-all-error-p
         (princ (strcat "\nОшибка загрузки файла "
                        name
                        " : "
                        (vl-catch-all-error-message err)
                        ) ;_ end of strcat
                ) ;_ end of princ
         ) ;_ end of if
      ) ;_ end of foreach
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
Это тебе для твоего варианта. Хотя я продолжаю настаивать, что этот путь порочен априори и делать надо по-другому.
---
Добавлено: код написан в перерывах между беготней за ребенком, мытьем посуды и помощи жене. Поэтому на красивость не претендует
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 13.12.2008 в 00:12.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Автор темы   Непрочитано 13.12.2008, 14:54
#15
Supermax

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


Первое, с чем я не согласен, это с оболочкой - функцией. Нужна не функция, а процедура проверки наличия одноименного файла.
Эта процедура выполняется один раз, при открытии файла рисунка и незачем ей висеть в памяти.

"fas" "vlx" я намеренно не вставлял, поскольку это закрытые форматы и могут содержать все, что угодно. Напомню, из Автокада есть доступ к реестуру! Такие форматы пусть пользователь ручками загружает, на свой страх и риск.

Из-за того, что ты это функцией сделал, применение ее равносильно загрузке файла вручную. Зачем? Вместо того, чтобы тупо поискать в известной директории конкретный файл lsp ты пытаешся определять загружен\не загружен,зачем? Два файла, с одинаковым именем, но с разными расширениями лежат рядом. Что это значит?

Будь добр, опиши словами концепцию.
Supermax вне форума вставить имя Обратить внимание модератора на это сообщение  
 
Непрочитано 13.12.2008, 21:13
#16
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 35,428


Ага, а то, что этот код можно засунуть в автозагрузку (хоть руками, хоть программно) - не рассматривается? А то, что исключить / добавить какие-то расширения, тоже выкидывается?
Концепция, кстати, твоя - загружать программный код из файла, имеющего такое же расширение, что и открываемый. Я ж тебе показал гарантированно работающий код - а ты еще и недоволен.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума вставить имя Обратить внимание модератора на это сообщение  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > Файл acaddoc.lsp : Процедура загрузки функций.

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

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

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
файл в нанокаде и в автокаде, путаница E.D. AutoCAD 2 24.10.2008 09:56
Выполнение acaddoc.lsp - частичное отображение опций команды Автокада Makswell LISP 18 26.03.2008 18:35
ACAD-2002. Глюк начальной загрузки ЛИСП? ===AAA=== LISP 27 31.08.2005 07:58
AutoCAD ищет старый файл загрузки Cnapmak AutoCAD 2 27.07.2005 19:13

|| Главная || Каталог САПР || Тендеры || Публикации || Объявления || Биржа труда || Download || Галерея ||
|| Библиотека || Кунсткамера || Каталог предприятий || Контакты || Файлообменник || Блоги ||