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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1965761
 
Непрочитано 23.06.2010, 09:25
#941
alex8888

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


Кулик Алексей aka kpblc,
Цитата:
Хотя я бы на твоем месте серьезно задумался о том, чтобы делать полноценную программную реализацию алгоритма оптимизации кроя листовых материалов, потом изучение DXF R12 и прямая запись нужных данных в файл. Голову, конечно, сломаешь (и не раз).
Могу ответить только словами Софико Чиаурелли (кажется так) из фильма "Ищите женщину" :"Лили, ты сейчас сказал что то такое сложное - я не поняла".
Так вот не совсем въезжаю что ты имеешь ввиду.
Мой алгоритм такой:
1. Составление разверток компонентов изделия.
2. Поиск подходящего по формату листового материала.
3. Оптимальное размещение по листу разверток деталей.
4. Подготовка и печать сопроводительной документации.
5. Подготовка и пересылка DXF файла фирме, осуществляющей нарезку лазером.

по 1 пункту имею как собственные наработки, так и сторонние программы.
по 2-му все ясно, там кад почти не требуется, но программу составления формата листа я накатал - худо-бедно- работает.
по 3-му - чисто художественное соображение - интуиция, расчет и тп. Так как все развертки индивидуальны и единичны в большинстве своем, то программным путем решить для меня пока не представляется вообразимым.
Далее п.4 и 5. Здесь мне нужно как раз то о чем весь сыр-бор. Из вышеизложенного тобой делаю заключение, что без промежуточного файла не обойтись. Получается по-старому: файл *.dwg -> файл *-1.dwg (с выбранными примитивами и сопроводительным текстом к ним - только самое необходимое) с помощью vla-wblock -> файл DXF R12 для отправки. Здесь, наверное файл *-1.dwg надо преобразовывать в тип DXF R12 с помощью vla-open -> vla-SaveAs, но пока не получилось. Попытки преобразования описаны в посте 937.
Если есть какие соображения - буду очень признателен
alex8888 вне форума  
 
Непрочитано 23.06.2010, 11:37
#942
ShaggyDoc

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


Цитата:
5. Подготовка и пересылка DXF файла фирме, осуществляющей нарезку лазером
По этому пункту проще записать непосредственно DXF как текстовый файл из LISP, а не мучиться с отбором, преобразованиями и прочим. Вклчая сопроводительный текст. "Подумаешь, бином Ньютона"(С)
ShaggyDoc вне форума  
 
Непрочитано 23.06.2010, 14:00
#943
alex8888

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


ShaggyDoc, ты "ето" к чему?
Таков существующий расклад, ты просто не представляешь, насколько немцы любят все усложнять
Что же по существу, то я тоже не представляю пока твою мысль
Цитата:
записать непосредственно DXF как текстовый файл из LISP
Прошу пояснить как?
alex8888 вне форума  
 
Непрочитано 23.06.2010, 14:34
#944
ShaggyDoc

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


Цитата:
Прошу пояснить как?
Дык элементарно
Например, такой функцией
Цитата:
(defun ru-list-write-to-file (filename stringlist / f result)
(if (setq f (open filename "w"))
(progn
(foreach x stringlist
(princ (strcat x "\n") f)
) ;_ end of foreach
(close f)
(setq result filename)
) ;_ end of progn
(princ (strcat "\nНе могу создать файл \n" filename))
) ;_ end of if
result
)
А предварительно создать список строк stringlist, в котором будет находиться, что именно писать. Лиспом его и сформировать. Лисп работает внутри AutoCAD, AutoCAD знает, что внутри него нарисовано, Лисп знает, как получить DXF-коды и их значения. Остается найти программиста, который отдаст соответсвующие команды. Путем написания текста функции, формирующей список строк. Можно и сопроводительный текст. Даже на немецком языке.
ShaggyDoc вне форума  
 
Непрочитано 23.06.2010, 15:36
#945
alex8888

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


Технически записать в файл строку за строкой понятно как, а вот:
Цитата:
А предварительно создать список строк stringlist, в котором будет находиться, что именно писать.
как узнать, что же мне именно писать Вручную все задолбаешься прописывать.
В качестве примера подброшу какой-нибудь из dxf и на нем посмотреть механизм обработки хотя бы приближенно?
Во вложении все 3 файла - основной для разработки, промежуточный для перезаписи в dxf и сам dxf.
Вложения
Тип файла: zip 4499.zip (199.3 Кб, 120 просмотров)
alex8888 вне форума  
 
Непрочитано 23.06.2010, 17:01
#946
Дмитрий_Leo


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


Добрый день. Столкнулся с проблемой и уже длительное время не могу ее решить. Суть в том что написал програмку на lisp. Алгоритм программы построен на функции "grread" (было необходимо отслеживание координат курсора "в реальном времени" плюс возврат ключей в зависимости от нажатой кнопки на клавиатуре и мыши). И программа работает, но только при открытом Visual Lisp Editor. Если Visual Lisp Editor не открыт, то grread не отслеживает нажатие кнопок на клавиатуре и мыши (хотя координаты возвращает). Кто-нибудь сталкивался с подобной ситуацией?
Дмитрий_Leo вне форума  
 
Непрочитано 24.06.2010, 10:57
#947
alex8888

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


Кулик Алексей aka kpblc,помучаю дальше
Изменил твою программу записи блока в файл в надежде решить свою задачу "тупым" методом, т.е. как вручную, без намеков уважаемого ShaggyDoc, потому как пока не представляю способа решения по его совету.
Код:
[Выделить все]
(vl-load-com)

(defun kbplc_save_new_dxf
       
       (/ adoc selsets selsetname vla_selset dwg_file wb_file wb-file1)	;перечень локальных переменных

(begin_activex)							;функция получения ссылки на активный документ (текущий чертеж)
  
  (setq
    	selsets	   (vla-get-selectionsets active_document)	;создание пустой выборки в текущем документе
	selsetname "wb"						;присвоение имени выборке
  ) ;_ end of setq

  (if (/=
	(setq dwg_file (vla-get-fullname active_document))	;Получение пути и имени файла и сохранение его в dwg_file
	""							;имя файла пустое
      )								;Если имя файла есть

    (progn							;выполнение если
      (vl-catch-all-apply					;защита от ошибки
	(function
	  (lambda ()
	    (vla-delete (vla-item selsets selsetname))		;очистка выборки (от хвостов и мусора)
	  ) ;_ end of lambda
	) ;_ end of function
      ) ;_ end of vl-catch-all-apply

      (setq vla_selset (vla-add selsets selsetname))		;создание пустого выбора

      (if (and (not (vl-catch-all-error-p			;если не было ошибки и см. vla-get-count
		      (vl-catch-all-apply
			(function				;создание бм - безопасных массивов
			  (lambda (/ group data) 		;Выборка по условию
			    (setq group	(vlax-make-variant	;создание варианта
					  (vlax-safearray-fill	;заполнение бм
					    (vlax-make-safearray;создание бм
					      vlax-vbinteger	;тип данных бм - целые числа
					      '(0 . 0)		;размерность массива (не определенный)
					    ) ;_ end of vlax-make-safearray
					    '(8)		;заполнение бм (8- dxf код слоя (Layer))
					  ) ;_ end of vlax-safearray-fill
					) ;_ end of vlax-make-variant
				  data	(vlax-make-variant	;создание варианта
					  (vlax-safearray-fill	;заполнение бм
					    (vlax-make-safearray;созлание бм
					      vlax-vbvariant	;тип данных бм - неопределенные значения
					      '(0 . 0)		;размерность массива (не определенный)	
					    ) ;_ end of vlax-make-safearray
					    '("0,SF-TEXT,LASER-TEXT");заполнение бм (перечисление названий уровней(слоев))
								;'("ИменаСлоев,ЧерезЗапятую")
					  ) ;_ end of vlax-safearray-fill
					) ;_ end of vlax-make-variant
			    ) ;_ end of setq
			    (vla-selectonscreen			;интерактивный выбор графических объектов (без group и data выберет всё)
			      vla_selset 			;объект документа
			      group				;бм цел.чисел в виде варианта (фильтр по типу)
			      data				;бм с данными типа "вариант" (данные фильтра)
			    ) ;_end of vla-selectOnScreen		
			  ) ;_ end of lambda
			) ;_ end of function
		      ) ;_ end of vl-catch-all-apply
		    ) ;_ end of vl-catch-all-error-p
	       ) ;_ end of not
	       (> (vla-get-count vla_selset) 0)			;число выбранных объектов не равно 0 (что то выбрано)
	  ) ;_ end of and

	(progn
	  (setq wb_file (strcat				;куда пишем -> создание имени файла:
			    (vl-filename-directory dwg_file)	;путь текущего файла без "\" на конце
			    "\\"				;вставка "\" в конец пути тек.файла
			    (vl-filename-base dwg_file)		;имя текущего файла без расширения
			  ) ;_ end of strcat
	    ) ;_ end of setq
	  (vla-wblock						;Запись в файл:
	    active_document					;что берем за основу -> текуший документ
	    (setq wb_file1 (strcat				;куда пишем -> создание имени файла:
			    (vl-filename-directory dwg_file)	;путь текущего файла без "\" на конце
			    "\\"				;вставка "\" в конец пути тек.файла
			    (vl-filename-base dwg_file)		;имя текущего файла без расширения
			    "-1.dwg"				;добавка окончания "-1" к имени файла
			  ) ;_ end of strcat
	    ) ;_ end of setq
	    vla_selset						;что будем записывать -> выборку
	  ) ;_ end of vla-Wblock
	  


	  (princ (strcat "\nНабор был сохранен в файл " wb_file1));Отметка о выполнении

	  
		(at_save_dwg-dxf)
	  (princ "\nСоздание dxf завершено")
	) ;_ end of progn
      ) ;_ end of if
      
      (vl-catch-all-apply					;защита от ошибки
	(function
	  (lambda ()
	    (vla-delete (vla-item selsets selsetname))		;очистка выборки
	  ) ;_ end of lambda
	) ;_ end of function
      ) ;_ end of vl-catch-all-apply
    ) ;_ end of progn
    
    (alert							;выполнение иначе
     "Файл не сохранялся еще ни разу! Выполнение невозможно!")	;Действие, если еще не было сохранение файла изначально
) ;_ end of if

  (princ)							;очистка строки статуса от отчета о выполнении функции (nil)
  
) ;_ end of defun
Изменения выделены красным.
Но вызываемая программа at_save_dwg-dxf
Код:
[Выделить все]
(defun at_save_dwg-dxf (wb_file / doc)

  (vla-open
    (setq doc
	   (vla-get-Documents (vlax-get-acad-object)))
    wb_file)

(vla-saveas
  	(vla-get-documents (vlax-get-acad-object))	;vla-get-documents
  	wb_file						;filename
  	acr12_dxf					;als R12.dxf
) ;_ end of vla-SaveAs

  (vla-close doc)

) ;_ end of defun
вощвращает :
ActiveX-Server gab folgenden Fehler zuruck: unbekannter Name: SaveAs
то есть неизвестное имя SaveAs
Что и где я накосячил

Код не оптимизирован (пока он еще не работоспособный), отлова ошибок тоже еще не вставлял

Последний раз редактировалось alex8888, 24.06.2010 в 11:05.
alex8888 вне форума  
 
Непрочитано 24.06.2010, 11:12
1 | #948
Кулик Алексей aka kpblc
Moderator

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


Код:
[Выделить все]
(vla-saveas
  (vla-item (vla-get-documents (vlax-get-acad-object)) "DWGName")
  "FileNameToSave"
  acr12_dxf
  ) ;_ end of vla-saveas
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.06.2010, 11:43
#949
alex8888

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


Кулик Алексей aka kpblc,
здесь "DWGName" - какое имя (чего)? Или так и оставить?
А "FileNameToSave" что?
Имя сохраняемого документа у меня в переменной wb_file. Куда его подставить и нужны ли кавычки?
alex8888 вне форума  
 
Непрочитано 24.06.2010, 12:10
#950
Кулик Алексей aka kpblc
Moderator

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


Первый аргумент - vla-указатель на открытый документ.
Второй аргумент - имя файла, под которым надо выполнять сохранения
Третий - формат сохранения.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.06.2010, 12:28
#951
alex8888

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


vla-указатель на открытый документ - это (vla-get-documents (vlax-get-acad-object)),
а (vla-item (vla-get-documents (vlax-get-acad-object)) "DWGName") - это получение свойства у открытого документа, в частности имя? Или нет?
Со вторым и третьим аргументом вроде бы ясно. Но вот первый вызывает сомнение и не только у меня - кад пишет ошибку автоматизации именно на этом месте.
Вот здесь:
Код:
[Выделить все]
(vla-open
      (vla-get-Documents (vlax-get-acad-object))
    wb_file1)
  
(vla-saveas
  (vla-item (vla-get-documents (vlax-get-acad-object)) "DWGName")
  wb_file
  acr12_dxf
  ) ;_ end of vla-saveas


  (vla-close wb_file)
сохраненный файл открывается и потом ничего не происходит. Надо наверное переключится в него, чтобы был активным, чтобы его потом записать в dxf? Иначе ошибка

Последний раз редактировалось alex8888, 24.06.2010 в 12:47.
alex8888 вне форума  
 
Непрочитано 24.06.2010, 13:02
#952
Кулик Алексей aka kpblc
Moderator

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


(vla-get-documents (vlax-get-acad-object)) - это коллекция (или массив) открытых документов AutoCAD. Через vla-item ты получаешь указатель на конкретный элемент этой коллекции / массива. Ты же оперируешь с каким-то конкретным документом, верно?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.06.2010, 13:40
#953
alex8888

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


То есть это не один документ, а несколько? А я то думал, что тот, с которым оперируем в данный момент, но не активным.
А почему тогда вылетает в ошибку? Чем же каду не нравится "DWGName"?
Через (vlax-dump-object (vla-get-documents (vlax-get-acad-object)) T) увидел, что
Код:
[Выделить все]
; IAcadDocuments: Die Gruppierung aller in der aktuellen Sitzung geoffneten AutoCAD-Zeichnungen
; Eigenschaftswerte:
;   Application (RO) = #<VLA-OBJECT IAcadApplication 0000000140a62e28>
;   Count (RO) = 1
; Unterstutzte Methoden:
;   Add (1)
;   Close ()
;   Item (1)
;   Open (3)
Item присутствует в списке. Можно как-то посмотреть, где отображается то, что называется "DWGName"?

Как получить указатель на открываемый объект (файл) в этой коллекции документов? Мне нужно знать имя открываемого файла (теоретически то верно). Только чей-то недоеду никак
alex8888 вне форума  
 
Непрочитано 24.06.2010, 13:48
#954
Кулик Алексей aka kpblc
Moderator

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


DWGNAme - ну я так обозвал имя файла, который ты собираешься сохранять под другим именем и в другом формате.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.06.2010, 14:05
#955
alex8888

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


В моем случае это wb_file?
Так а кавычки нужны, если это переменная, в которой лежит имя файла?
alex8888 вне форума  
 
Непрочитано 24.06.2010, 15:39
#956
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от alex8888 Посмотреть сообщение
В моем случае это wb_file?
Да
Цитата:
Сообщение от alex8888 Посмотреть сообщение
Так а кавычки нужны, если это переменная, в которой лежит имя файла?
А сам как думаешь?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.06.2010, 15:44
#957
alex8888

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


Думаю что не надо и получаю в ответ многозначащее:
Automatisierungsfehler. Keine Beschreibung verfugbar.
(ошибка автоматизации. описание отсутствует)

Как понять где?
Затыка как писал выше в: (vla-item (vla-get-documents (vlax-get-acad-object)) wb_file1)
Уже методом "тыка" все пререпробывал - не пускает дальше этой строки и все тут.
alex8888 вне форума  
 
Непрочитано 24.06.2010, 15:50
#958
Кулик Алексей aka kpblc
Moderator

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


wb_file1 на момент вызова чему равна? А файл с таким именем открыт?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.06.2010, 16:29
#959
alex8888

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


1. На момент открытия wb_file1 равна названию файла, полученному при сохранении выборки примитивов с помощью vla-wblock. Проверил в окне наблюдения - там правильно.
2. Файл открывается в фоне, затем затыкается выполнение программы в этом месте и соответственно файл обратно не закрывается.

Посмотри, может у тебя возникнет получше идея как из одного файла dwg получить dxf с выбранными элементами минуя промежуточный файл-1dwg. Пример файлов в посте:
http://forum.dwg.ru/showpost.php?p=587269&postcount=945

Вот получившийся код, проблемное место выделено красным.
Код:
[Выделить все]
(vl-load-com)

(defun kbplc_save_new_dxf
       
       (/ adoc selsets selsetname vla_selset dwg_file wb_file wb-file1)	;перечень локальных переменных

(begin_activex)							;функция получения ссылки на активный документ (текущий чертеж)
  
  (setq
    	selsets	   (vla-get-selectionsets active_document)	;создание пустой выборки в текущем документе
	selsetname "wb"						;присвоение имени выборке
  ) ;_ end of setq

  (if (/=
	(setq dwg_file (vla-get-fullname active_document))	;Получение пути и имени файла и сохранение его в dwg_file
	""							;имя файла пустое
      )								;Если имя файла есть

    (progn							;выполнение если
      (vl-catch-all-apply					;защита от ошибки
	(function
	  (lambda ()
	    (vla-delete (vla-item selsets selsetname))		;очистка выборки (от хвостов и мусора)
	  ) ;_ end of lambda
	) ;_ end of function
      ) ;_ end of vl-catch-all-apply

      (setq vla_selset (vla-add selsets selsetname))		;создание пустого выбора

      (if (and (not (vl-catch-all-error-p			;если не было ошибки и см. vla-get-count
		      (vl-catch-all-apply
			(function				;создание бм - безопасных массивов
			  (lambda (/ group data) 		;Выборка по условию
			    (setq group	(vlax-make-variant	;создание варианта
					  (vlax-safearray-fill	;заполнение бм
					    (vlax-make-safearray;создание бм
					      vlax-vbinteger	;тип данных бм - целые числа
					      '(0 . 0)		;размерность массива (не определенный)
					    ) ;_ end of vlax-make-safearray
					    '(8)		;заполнение бм (8- dxf код слоя (Layer))
					  ) ;_ end of vlax-safearray-fill
					) ;_ end of vlax-make-variant
				  data	(vlax-make-variant	;создание варианта
					  (vlax-safearray-fill	;заполнение бм
					    (vlax-make-safearray;создание бм
					      vlax-vbvariant	;тип данных бм - неопределенные значения
					      '(0 . 0)		;размерность массива (не определенный)	
					    ) ;_ end of vlax-make-safearray
					    '("0,SF-TEXT,LASER-TEXT");заполнение бм (перечисление названий уровней(слоев))
								;'("ИменаСлоев,ЧерезЗапятую")
					  ) ;_ end of vlax-safearray-fill
					) ;_ end of vlax-make-variant
			    ) ;_ end of setq
			    (vla-selectonscreen			;интерактивный выбор графических объектов (без group и data выберет всё)
			      vla_selset 			;объект документа
			      group				;бм цел.чисел в виде варианта (фильтр по типу)
			      data				;бм с данными типа "вариант" (данные фильтра)
			    ) ;_end of vla-selectOnScreen		
			  ) ;_ end of lambda
			) ;_ end of function
		      ) ;_ end of vl-catch-all-apply
		    ) ;_ end of vl-catch-all-error-p
	       ) ;_ end of not
	       (> (vla-get-count vla_selset) 0)			;число выбранных объектов не равно 0 (что то выбрано)
	  ) ;_ end of and

	(progn
	  (setq wb_file (strcat				;куда пишем -> создание имени файла:
			    (vl-filename-directory dwg_file)	;путь текущего файла без "\" на конце
			    "\\"				;вставка "\" в конец пути тек.файла
			    (vl-filename-base dwg_file)		;имя текущего файла без расширения
			  ) ;_ end of strcat
	    ) ;_ end of setq
	  (vla-wblock						;Запись в файл:
	    active_document					;что берем за основу -> текуший документ
	    (setq wb_file1 (strcat				;куда пишем -> создание имени файла:
			     wb_file
;;;			    (vl-filename-directory dwg_file)	;путь текущего файла без "\" на конце
;;;			    "\\"				;вставка "\" в конец пути тек.файла
;;;			    (vl-filename-base dwg_file)		;имя текущего файла без расширения
			    "-1.dwg"				;добавка окончания "-1" к имени файла
			  ) ;_ end of strcat
	    ) ;_ end of setq
	    vla_selset						;что будем записывать -> выборку
	  ) ;_ end of vla-Wblock
	  


	  (princ (strcat "\nНабор был сохранен в файл " wb_file1));Отметка о выполнении

	  
;;;		(at_save_dwg-dxf)
;------------------------------------------------------------------------
(vla-open						;Открываем документ
      (vla-get-Documents (vlax-get-acad-object))	;из коллекции документов Автокада
    wb_file1)						;с именем из переменной wb_file1
  
(vla-saveas						;Сохраняем как
  (vla-item (vla-get-documents (vlax-get-acad-object)) wb_file1);указатель на конкретный элемент коллекции / массива
  wb_file						;Имя сохраняемого файла
  acr12_dxf						;Формат файла DXF версии 12
  ) ;_ end of vla-saveas


  (vla-close wb_file1)					;Закрываем файл wb_file1
;-----------------------------------------------------------------------	  
	  (princ "\nСоздание dxf завершено")
	  
	) ;_ end of progn
      ) ;_ end of if
      
      (vl-catch-all-apply					;защита от ошибки
	(function
	  (lambda ()
	    (vla-delete (vla-item selsets selsetname))		;очистка выборки
	  ) ;_ end of lambda
	) ;_ end of function
      ) ;_ end of vl-catch-all-apply
    ) ;_ end of progn
    
    (alert							;выполнение иначе
     "Файл не сохранялся еще ни разу! Выполнение невозможно!")	;Действие, если еще не было сохранение файла изначально
) ;_ end of if

  (princ)							;очистка строки статуса от отчета о выполнении функции (nil)
  
) ;_ end of defun
alex8888 вне форума  
 
Непрочитано 24.06.2010, 22:53
#960
Кулик Алексей aka kpblc
Moderator

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


Проверяй работу
Код:
[Выделить все]
(vl-load-com)

(defun copy-selset-to-dxf (/ adoc selsets selset ss_name vla_selset doc_to_save)

  (setq adoc    (vla-get-activedocument (vlax-get-acad-object))
        selsets (vla-get-selectionsets adoc)
        ss_name "wb"
        ) ;_ end of setq

  (if (/= (setq dwg_name (vla-get-fullname adoc)) "")
    (progn
      (vl-catch-all-apply
        (function
          (lambda ()
            (vla-delete (vla-item selsets ss_name))
            ) ;_ end of lambda
          ) ;_ end of function
        ) ;_ end of vl-catch-all-apply
      (setq vla_selset (vla-add selsets ss_name))
      (if (and (not (vl-catch-all-error-p ;если не было ошибки и см. vla-get-count
                      (vl-catch-all-apply
                        (function ;создание бм - безопасных массивов
                          (lambda (/ group data) ;Выборка по условию
                            (setq group (vlax-make-variant ;создание варианта
                                          (vlax-safearray-fill ;заполнение бм
                                            (vlax-make-safearray ;создание бм
                                              vlax-vbinteger ;тип данных бм - целые числа
                                              '(0 . 0) ;размерность массива (не определенный)
                                              ) ;_ end of vlax-make-safearray
                                            '(8) ;заполнение бм (8- dxf код слоя (Layer))
                                            ) ;_ end of vlax-safearray-fill
                                          ) ;_ end of vlax-make-variant
                                  data  (vlax-make-variant ;создание варианта
                                          (vlax-safearray-fill ;заполнение бм
                                            (vlax-make-safearray ;создание бм
                                              vlax-vbvariant ;тип данных бм - неопределенные значения
                                              '(0 . 0) ;размерность массива (не определенный)	
                                              ) ;_ end of vlax-make-safearray
                                            '("0,SF-TEXT,LASER-TEXT")
          ;заполнение бм (перечисление названий уровней(слоев))
          ;'("ИменаСлоев,ЧерезЗапятую")
                                            ) ;_ end of vlax-safearray-fill
                                          ) ;_ end of vlax-make-variant
                                  ) ;_ end of setq
                            (vla-selectonscreen
          ;интерактивный выбор графических объектов (без group и data выберет всё)
                              vla_selset ;объект документа
                              group ;бм цел.чисел в виде варианта (фильтр по типу)
                              data ;бм с данными типа "вариант" (данные фильтра)
                              ) ;_end of vla-selectOnScreen		
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                      ) ;_ end of vl-catch-all-error-p
                    ) ;_ end of not
               (> (vla-get-count vla_selset) 0) ;число выбранных объектов не равно 0 (что то выбрано)
               ) ;_ end of and
        (progn
          (setq doc_to_save (vla-add (vla-get-documents (vlax-get-acad-object))))
          (vla-copyobjects
            adoc
            (vlax-safearray-fill
              (vlax-make-safearray
                vlax-vbobject
                (cons 0 (1- (vla-get-count vla_selset)))
                ) ;_ end of vlax-make-safearray
              ((lambda (/ lst)
                 (vlax-for ent vla_selset
                   (setq lst (cons ent lst))
                   ) ;_ end of vlax-for
                 ) ;_ end of lambda
               )
              ) ;_ end of vlax-safearray-fill
            (vla-get-modelspace doc_to_save)
            ) ;_ end of vla-CopyObjects
          (vla-saveas doc_to_save (strcat dwg_name "-1") acr12_dxf)
          ) ;_ end of progn
        ) ;_ end of if
      ) ;_ end of progn
    (alert "Active file doesn't saved!")
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека 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