Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу) - Страница 47
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

Ответ
Поиск в этой теме
Старый 20.07.2008, 20:12 1 |
Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)
Red Nova
 
ՃԱՐՏԱՐԱԳԵՏ, տ.գ.թ.
 
Торонто
Регистрация: 23.10.2007
Сообщений: 1,990

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (Visual foxpro) программку типа суммирования столбцов списал у соседа (это уже в университете).
Не смотря на эте намерен научится писать программы для Автокада на лиспе, скачал книгу Хювенена, несколько примеров создания программ, но после получасового “смотрения” таких книг мое мышление явно притормаживает.
Решил пойти другим путем.
Нашел самый короткий лисп из моей коллекции, и прошу программистов с этого форума пошагово объяснить какой символ что означает. Надеюсь на вашу помощь.


Код:
[Выделить все]
(defun c:make-blocks-explodeable (/ adoc)
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (equal (vla-get-islayout blk_def) :vlax-false)
             ) ;_ end of and
      (vl-catch-all-apply '(lambda () (vla-put-explodable blk_def :vlax-true)))
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
_____________________________________________________________________________________________________________

Прошло много лет и топик теперь представляет из себя площадку для обучения азов программирования для многих начинающих.
Так что начинающие лиспогрызы приветствуются .
__________________
Блог

Последний раз редактировалось Red Nova, 12.07.2017 в 05:43.
Просмотров: 2054546
 
Старый 15.06.2010, 16:54
#921
Кулик Алексей aka kpblc
Moderator

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


Почему? После вызова (fun2) проверь значение value. Просто она внутри функции fun2 "перекрывается" локальной переменной. Это же базовые понятия - область видимости функций и переменных! Как делается локальный обработчик ошибок в лиспе? Да точно по такому же принципу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 15.06.2010, 17:30
#922
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Ну и непутевый же этот Лисп, совсем не понимает, что я от него хочу

Кулик Алексей aka kpblc, совсем за-пу-та-л
Пойду еще раз почитаю "базовые понятия" - видать плохо усвоил.
alex8888 вне форума  
 
Старый 15.06.2010, 21:22
#923
Кулик Алексей aka kpblc
Moderator

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


Ну, к примеру: http://www.sernam.ru/c_24.php и http://msdn.microsoft.com/ru-ru/library/1t0wsc67.aspx
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 18.06.2010, 19:13
#924
saa


 
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218


Вопрос знатокам VisualLisp по поводу команды begin_activex из поста #918.

Как правильнее: получать указатели на объекты (приложения, документа, пространств листа и модели) в каждом случае или хранить их в глобальных переменных?

И второй вопрос по поводу загрузки lisp-функций. Насколько я понимаю основных вариантов два: загружать нужные файлы лисп непосредственно перед выполнением функции и загружать весь набор файлов с функциями при загрузке чертежа *.dwg.
Кто как делает и почему?
__________________
www.saa-blogs.blogspot.com
saa вне форума  
 
Старый 19.06.2010, 00:56
#925
Кулик Алексей aka kpblc
Moderator

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


Тут ответ (по идее) не завязан на какой-то язык...
Указатели на документ, пространство модели, а также коллекции (например, коллекция слоев, или коллекция блоков), я думаю, лучше всего делать глобальными. Инициализировать при самом начале работы.
По загрузке (если рассматривать некомпилированные коды) я вижу несколько вариантов:
1. Хранить все коды по принципу "один файл lsp = одно определение функции".
2. Все коды засовывать в один lsp-файл, который и подгружать
3. Каждый раз по новой прописывать определение нужных функций.
У каждого из подходов есть свои плюсы и свои минусы...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 19.06.2010, 16:09
#926
saa


 
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218


Алексей, дилетантский вопрос: если в начале работы получить указатели на коллекции слоев, блоков, пространства модели, то будут ли они корректно восприниматься при добавлении новых слоев и т.д. или нужно будет заново их определять?
По поводу загрузки: прочитал твое эссе и не знаю, то ли оставить загрузку lisp-функций как она есть у меня сейчас (т.е. в каждом файле одна функция, при загрузке чертежа загружается функция, которая определяет все файлы с расширением lsp в указанном каталоге загружает их все подряд) или строить более сложную конструкцию на основе твоих функций. На данный момент все работает с моим топорным подходом, хотя там есть вложенные функции (например обработчик ошибок из "САПР на базе AutoCAD...", а там два или три уровня вложенности)
__________________
www.saa-blogs.blogspot.com
saa вне форума  
 
Старый 20.06.2010, 00:30
#927
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от saa Посмотреть сообщение
если в начале работы получить указатели на коллекции слоев, блоков, пространства модели, то будут ли они корректно восприниматься при добавлении новых слоев и т.д. или нужно будет заново их определять?
Ну так давай проверим
Создаем новый файл, в нем сразу (vl-load-com) и следом:
Код:
[Выделить все]
_$ (setq layers (vla-get-layers (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object)))))
#<VLA-OBJECT IAcadLayers 00000000269d42a8>
На всякий случай:
Код:
[Выделить все]
_$ (vla-get-count layers)
1
Добавим несколько слоев, используя обычный _.layer и проверяем:
Код:
[Выделить все]
_$ (equal layers (vla-get-layers adoc))
T
_$ (vla-get-count layers)
5
Т.е. указатель на коллекцию не меняется.
Теперь насчет загрузки. Если (подчеркиваю - если!) у тебя AutoCAD до 2006 включительно (на 2007 не проверял); если у тебя в каждом lsp-файле только одна функция, которая не обращается к другим; или у тебя каждый lsp вручную засунут в автозагрузку,- то все, что я писал, становится неактуальным. Если же хотя бы одно из условий не соблюдается, то приходится изворачиваться.
P.S. Что такое "вложенность" функций в твоем понимании? В моей интертрепации интерпретации - это определения локальных функций внутри основного кода. А у тебя?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 20.06.2010, 08:18
#928
saa


 
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218


AutoCAD 2009.

В каждом файле одна функция.

Загрузка организована посредством такой функции
Код:
[Выделить все]
;|
Функция поиска файла или файлов в указанной папке и всех вложенных папках
файл задается именем или маской
Аргументы:
P - начальный путь поиска,
например "C:" или "C:\\Program Files"
F - название файла,
возможно использование подстановочных символов.
например
"*.dwg" - найдет все dwg-файлы
или "acad*.lsp"
Вызывать
(getfile "acad*.lsp" "C:\\Program Files")
Возвращает список файлов с полным путем до них и названием без маски.
'("C:\\Program Files\\AutoCAD 2004\\Express\\acadinfo.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acad2004doc.lsp"
    "C:\\Program Files\\AutoCAD 2004\\Support\\acadinfo.lsp"
  )
|;
(defun GetFile (f p)
;; By ElpanovEvgeniy
;; (getfile "acad*.lsp" "C:\\Program Files")
(apply (function append)
        (cons (if (vl-directory-files p f)
               (mapcar (function (lambda (x) (strcat p "\\" x))) (vl-directory-files p f))
              ) ;_ if
              (mapcar (function (lambda (x) (GetFile f (strcat p "\\" x))))
                      (vl-remove ".." (vl-remove "." (vl-directory-files p nil -1)))
              ) ;_ mapcar
        ) ;_ cons
) ;_ apply
)
С ее помощью получаем список с именами файлов. Далее добавляем такую функцию
Код:
[Выделить все]
(defun START (file_name folder / file_list)
  (setq file_list (GetFile file_name folder))
  (if (foreach file file_list
        (load file (strcat "\nФайл " file " не найден"))
      ) ;_ end of foreach
    (princ (strcat "\nБиблиотека " folder " загружена"))
  ) ;_ end of if
) ;_ end of defun

(START "*.lsp" "Z:\\Настройки\\LISP\\Sourse")
Про вложенность наверно я не так выразился. Я имел ввиду, что в какой-либо функции используется другая функция, определенная в другом файле.
__________________
www.saa-blogs.blogspot.com
saa вне форума  
 
Старый 20.06.2010, 10:14
#929
Кулик Алексей aka kpblc
Moderator

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


Наверное, дело в том, что у меня используется около 700 функций, при этом глубина "вложенности" запросто может превысить 10 уровней. К примеру:
Функция _kpblc-ent-create-scheduletable вызывает около 200 служебных функций. Есть там одна _kpblc-xml-nodes-get-child-by-tag - вызывает _kpblc-conv-value-to-string, _kpblc-property-get и _kpblc-xml-nodes-get-child. Последняя обращается к _kpblc-xml-conv-nodes-to-list. Эта, в свою очередь,- к _kpblc-error-catch, _kpblc-property-get, _kpblc-error-print. При этом для того, чтобы вызвать эту функцию (точнее, передать корректные параметры), приходится еще десяток функций вызывать с такими же "хвостами". В таких случаях мне приходится отслеживать приоритет загрузки функций, чтобы потом при вызове _kpblc-ent-create-scheduletable не получить сообщение вида "_kpblc-xml-conv-nodes-to-list не определена".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 20.06.2010, 12:32
#930
saa


 
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218


Если не секрет, что делает _kpblc-ent-create-scheduletable?

В целом ясно. Пока проблем с загрузкой не возникает оставлю все как есть.
И с функциями для работы с объектной моделью не буду велосипед изобретать, а возьму из ruCAD.

Спасибо за разъяснения.
__________________
www.saa-blogs.blogspot.com
saa вне форума  
 
Старый 20.06.2010, 14:34
#931
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
а возьму из ruCAD
В ruCAD сделано так:

1. Исходные библиотечные функции находятся в отдельных LSP-файлах. Иногда в одном файле несколько родственных, хотя это отступление от концепции из-за лени автора. Всего таких функций около 2000. Все они записаны в файл проекта.

2. Из них компилируется один FAS. Размер примерно 600 кб. Этот файл автоматически загружается в каждый чертеж. Все библиотечные функции всегда доступны. Они обращаются друг друг к другу, но проблем не возникает, так как они всегда загружены в память одновременно.

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

4. Вызов "программ" осуществляется из меню AutoCAD, XML, с кнопок и т.п. При этом всегда в макрос вызова включается загрузка соответствующего FAS, или макрос вызывает библиотечную функцию.
ShaggyDoc вне форума  
 
Старый 20.06.2010, 19:08
#932
saa


 
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218


ShaggyDoc, такой вопрос: компиляция функций происходит непосредственно перед загрузкой в файл чертежа или отдельно (т.е. все написали, собрали в один проект, скомпилировали и пользуемся, а если нужно что-то изменить, то компилировать заново).

У меня то тоже вроде все сразу загружается (хотя может я что-то не так понимаю), но Алексей говорит, что критичен порядок загрузки и сложность в этом.

И еще: есть вот такой файл
Код:
[Выделить все]
(setq *ru_acad-object* nil)
(defun ru-obj-get-acad-object ()
  (cond	(*ru_acad-object*)
	(t
	 (setq *ru_acad-object*
		(vlax-get-acad-object)
	 ) ;_ end of setq
	)
  ) ;_ end of cond
) ;_ end of defun
Поясните пожалуйста зачем нужна строка
Код:
[Выделить все]
(setq *ru_acad-object* nil)
и в каких случаях может понадобиться уничтожение глобальной переменной *ru_acad-object*?
__________________
www.saa-blogs.blogspot.com
saa вне форума  
 
Старый 20.06.2010, 20:59
#933
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
компиляция функций происходит непосредственно перед загрузкой в файл чертежа или отдельно (т.е. все написали, собрали в один проект, скомпилировали и пользуемся, а если нужно что-то изменить, то компилировать заново)
Библиотека функций компилируется разом из проекта, после изменения каких-то функций. В период разработки - часто, хотя во время непосредственной работы функции просто загружаю из VL. А потом уже компилирую. Но последний раз компилировал год назад.

Цитата:
Алексей говорит, что критичен порядок загрузки и сложность в этом
Порядок загрузки важен в том случае, если вызовы функций выполняются вне самих функций. А если в библиотеке только определения, функции загрузятся в том порядке, как записаны в PRJ-файле. У меня - в алфавитном, просто для удобства ориентирования в тексте проекта.

(setq *ru_acad-object* nil) - это как раз вызов функции вне тела. Сделал такой вызов для сброса указателя на объект во время процесса загрузки библиотеки. Затем, во время выполнения функции ru-obj-get-acad-object этот указатель восстановится.

Такое "обниление" можно и не выполнять. Но тогда в памяти остаётся глобальная переменная, инициализированная при предыдущей загрузке библиотеки. Мало ли что я мог сделать потом - например присвоить глобальной *ru_acad-object* указатель на что-то другое, хотя бы ошибочно. Вот и страхуюсь. Чтобы после перегрузки указатель был правильный.
ShaggyDoc вне форума  
 
Старый 20.06.2010, 21:18
#934
saa


 
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218


Для особо непонятливых (для меня то бишь): если мы загружаем файл А с определением функции 1 (в которой содержится обращение к фун.2) и вызовом фун.1 до загрузки файла В с определением функции 2, то будут проблемы, а если в файле А нет вызова функции 1, только ее определение, то загружать файлы А и В можно в любом порядке, лишь бы загрузить оба. Правильно я понимаю?
__________________
www.saa-blogs.blogspot.com
saa вне форума  
 
Старый 21.06.2010, 06:24
#935
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от saa Посмотреть сообщение
Для особо непонятливых (для меня то бишь): если мы загружаем файл А с определением функции 1 (в которой содержится обращение к фун.2) и вызовом фун.1 до загрузки файла В с определением функции 2, то будут проблемы, а если в файле А нет вызова функции 1, только ее определение, то загружать файлы А и В можно в любом порядке, лишь бы загрузить оба. Правильно я понимаю?
Вот даже с таким простым случаем особо непонятливым (то бишь мне) в понедельник с утреца трудно сообразить, чего хочется. А если функций будет хотя бы десяток, да с вложенными вызовами? Поэтому надо делать просто и надежно:

1. Отделять загрузку от использования. То есть формировать библиотеку функций. В файлах библиотечных функций не должно быть никаких вызовов других функций. Кроме "штатных", например setq. В этом случае загрузка может выполняться в любом порядке, но до использования.

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

2. Вызовы функций должны быть только после полной загрузки библиотеки.

3. Загрузку библиотеки надо делать автоматически, например в acaddoc.lsp. Вот пример такого файла из ruCAD - он сгенерирован программой-стартером из шаблона, в момент загрузки выглядит так (дополнил комментариями):

Код:
[Выделить все]
;;Загружаем COM - единственный раз
(vl-load-com)
;; Штатной функцией присваиваем значения глобальным переменным
;; которые постоянно используются
;; Здесь именно глобальные, так как ещё не загруженная библиотека 
;; не знает расположения файлов, но зато это известно стартеру,
;; который и сгенерировал acaddoc.lsp
(setq 
 *ru_root_dir* "c:\\ruCAD\\Install\\PF\\ru\\CAD-2008\\"
 *ru_acad_version* "17"
 *ru_acad_version_r* "R17.1"
 *ru_acad_menu* "ruCAD"
 *ru_profile_name* "ruCAD"
 *ru_common_dir*  "c:\\ruCAD\\Install\\LocalAppData\\ru\\CAD-2008\\"
 *ru_app_data_dir*  "c:\\ruCAD\\Install\\LocalAppData\\ru\\CAD-2008\\AppData\\"
 *ru_help_dir*  "c:\\ruCAD\\Install\\PF\\ru\\CAD-2008\\Help\\"

 *ru_archives_dir*  "c:\\ruCAD\\Install\\LocalAppData\\ru\\CAD-2008\\Archives\\"
 *ru_docs_dir*  "c:\\ruCAD\\Install\\LocalAppData\\ru\\CAD-2008\\Docs\\"
 *ru_layers_dir*  "c:\\ruCAD\\Install\\LocalAppData\\ru\\CAD-2008\\Layers\\Слои\\"
 *ru_libs_dir*  "c:\\ruCAD\\Install\\LocalAppData\\ru\\CAD-2008\\Libs\\"
 *ru_add_dir*  "c:\\ruCAD\\Install\\LocalAppData\\ru\\CAD-2008\\Add\\"
 *ru_xml_menu_dir*  "c:\\ruCAD\\Install\\LocalAppData\\ru\\CAD-2008\\XML\\Menu\\"
 *ru_xml_images_dir*  "c:\\ruCAD\\Install\\LocalAppData\\ru\\CAD-2008\\XML\\Images\\"
 *ru_topo_dir*  "c:\\ruCAD\\Install\\LocalAppData\\ru\\CAD-2008\\Archives\\Topo\\"

 *ru_main_ini*  "c:\\ruCAD\\Install\\PF\\ru\\CAD-2008\\Bin\\rucad.ini"
 *is_win_nt*  NIL
 *ru_user_login* "AdminRU"
 *ru_user_title* "Уважаемый"
 *ru_user_long_name* "пользователь ruCAD"
 *ru_user_department* "ruCAD Community"
 *ru_user_work_dir* "C:\\ruCAD"
 *ru_user_workspace* "ru-Профи"
 )
;; Загружается главная библиотека функций
 (if (equal (load (strcat *ru_common_dir* "Libs\\App\\common\\ru-lib-main.fas") "Failed") "Failed")
;; Если по каким-то причинам не загружена, сообщаем штатной функцией
	(alert "Не загружена библиотека ruCAD. Работа в ruCAD невозможна.") 
;; если загружена, проверяется допустимость версии Автокад (не ниже 2008)
;; Далее уже могут использоваться только что назначенные глобальные переменные
;; Здесь уже используются функции из загруженной библиотеки
	(if (ru-acad-2008-test)
		(progn
;; Загружаются дополнительные библиотеки
			(ru-express-load)
			(ru-app-load-3d-lib)
;; Инициализируется система - тут могут быть любые вызовы функций.
			(ru-init-start-rucad)
		)	
	)	
 )
(princ)
Вот теперь могут в любом порядке загружаться и выполняться любые LISP, использующие библиотечные функции.
ShaggyDoc вне форума  
 
Старый 21.06.2010, 13:33
#936
saa


 
Регистрация: 25.09.2008
Новосибирск
Сообщений: 218


ShaggyDoc, спасибо, теперь разобрался и уяснил.
__________________
www.saa-blogs.blogspot.com
saa вне форума  
 
Старый 21.06.2010, 16:19
#937
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Кулик Алексей aka kpblc, с помощью vla-wblock можно также изменить тип записываемого файла (например, Dxf) , или он будет всегда Dwg текущей настройки?
2. Код:
Код:
[Выделить все]
(defun at_save_dwg-dxf (/ filename doc)

;;;  (vla-open (vla-get-Documents (vlax-get-acad-object)) "-filename-")

  (setq	filename
	 (strcat
	   (getvar "dwgprefix")
	   (getvar "dwgname")
	 )				;strcat

;;;	doc	 (vla-add
;;;		   (vla-get-documents
;;;		     (vlax-get-acad-object)
;;;		   )				;vla-get-documents
;;;		   filename
;;;		 )				;vla-add documents
  ) ;_ end of setq

  (vla-saveas
    (vla-get-documents
      (vlax-get-acad-object)
    )					;vla-get-documents
;;;    doc
    filename
;;;    	(strcat
;;;	  (vl-filename-directory filename)
;;;	  "\\"
;;;	  (vl-filename-base filename)
;;;    	)					;strcat
    acr12_dxf				;als R12.dxf
  ) ;_ end of vla-SaveAs

;;;  (vla-close doc)

) ;_ end of defun
сохраняет пустой файл как dxf R12 (то есть создает новый чертеж и ищменяет его тип) . Где изменить, чтобы сохранялся готовый чертеж под другим типом? Копаю в сторону vla-open, но тут загвоздка (для меня ) - наверное, надо как-то активизировать текущим этот файл?
alex8888 вне форума  
 
Старый 22.06.2010, 22:28
#938
Кулик Алексей aka kpblc
Moderator

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


alex8888, я несколько раз перечитал вопрос, но так и не понял - ты про что спрашиваешь? Про vla-wblock или про vla-saveas?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Старый 22.06.2010, 23:14
#939
alex8888

Инженер
 
Регистрация: 27.04.2009
Deutschland
Сообщений: 208


Кулик Алексей aka kpblc,
прошу прощения за туманность.
Ищу способ сохранить выбранные примитивы в файле Dwg и сохранить из в виде Dxf, причем самой ранней версии. Встал вопрос - или vla-wblock или vla-saveas. Первым пока не понял - возможно ли в принципе? А второй правильно создает файл, но тот почему то пустой, то есть я ничего не сохраняю кроме как просто пустой файл с нужным его типом.

Offtop: Предыстория такая. Фирма, в которой мне доводится батрачить по устоявшимся здесь традициям делает все через "мягкое место". Пытаюсь немного привести все в порядок и оптимизировать. Одной из моих задач является подготовка разверток деталей из листового металла для нарезки лазером. Как идет сам процесс: все развертки скидываются в кучу (хорошо еще что сортируясь по толщине материала), затем я их компоную по формату листа, чтобы был как можно лучший коэффициент расхода материала. После этого идет зоопарк Сначала выбранные примитивы на выбранных слоях сохраняются в файле *-1.dwg (это уже ты проходил, когда мне программу для записи файла давал), потом этот файл переводится в dxf самой ранней версии, потом ее читает лазерный станок, ну и вообщем все. Хочу избавиться от промжуточного шага с лишними файлами *-1.dwg
Но желательно бы до этого доковылять своими мозгами , правда без подсказок не получается, вот и третирую по сотни раз одно и тоже.
alex8888 вне форума  
 
Старый 22.06.2010, 23:21
#940
Кулик Алексей aka kpblc
Moderator

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


vla-wblock сохраняет файл только в текущей версии. Не лечится.
vla-saveas по идее позволяет сохранить файл в формате R12. Что бы попытался сделать я: выбрать примитивы в текущем документе; создать новый документ (скорее всего, добавлением в коллекцию документов; ObjectDBX тут поможет как мертвому припарки) и через vla-CopyObjects выполняется копирование в сторонний файл. Потом этот файл и попытаться сохранить.
P.S. Хотя я бы на твоем месте серьезно задумался о том, чтобы делать полноценную программную реализацию алгоритма оптимизации кроя листовых материалов, потом изучение DXF R12 и прямая запись нужных данных в файл. Голову, конечно, сломаешь (и не раз).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Вставка в таблицу поля, соотвествующего площади примитива Profan Готовые программы 272 06.06.2021 23:12
Сейсмозащита и сейсмоизоляция существующих, построенных зд. IANationalInformAgentstvo Прочее. Архитектура и строительство 216 20.01.2015 16:51
Мониторы LCD CRT Разное 94 17.06.2008 10:51
ЮМОР 2006 =) Perezz!! Разное 1122 04.01.2007 00:46