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

Вернуться   Форум 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.
Просмотров: 2054734
 
Непрочитано 13.06.2024, 09:57
#4601
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ограничение на объем расширенных данных не превышено случайно?
Нет, мои расширенные данные по объему далеки до заявленного предела.

Еще есть сомнение в том, что я регистрирую довольно много приложений для расширенных данных (regapp). Их всего порядка 30-ти разных. При этом часто происходит повторная регистрация одного и того же приложения, я перед этим не проверяю зарегистрировано ли оно уже до того. Как я понял в такой проверке нет особой нужды. Но может все таки это неправильно?

Все же выложу функцию, где происходит добавление расширенных данных. Она на самом деле работает в связке с другими функциями, но может кто-то при беглом просмотре найдет здесь явный косяк из-за чего иногда расширенные данные не присоединяются к объекту. Вообще программа предназначена для добавления строк спецификации. Строка спецификации - это блок с атрибутами, которые я програмно заполняю на основе чтения данных из внешнего файла. А кроме атрибутов добавляю и расширенные данные, где содержится различная техническая информация, которая нужна мне для взаимодействия с внешним exe-приложением, с помощью которого я, собственно, и формирую строку спецификации. Код где-то может выглядить несуразным, но как я и говорил - не являюсь спецом по лиспу, где-то что-то в интернете нарыл из нужных мне функций и применил в своей программе как умел.


Код:
[Выделить все]
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Настройка атрибутов блока и запись расширенных данных ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun cs_make_specification_string (file v_block old_name_offset old_note_offset / attributes attribute name name_width is_product ind element_type le le2 edata)
(setq attributes (vlax-variant-value (vla-GetAttributes v_block)))
(setq is_product (cs_read_ini_value file "Data" "IsProduct"))
(setq element_type (cs_read_ini_value file "Data" "Type"))
(if (= is_product "0") (setq ind 0) (setq ind 1))
; заполнение атрибутов блока, общее для всех типов строки спецификации
(setq name (cs_read_ini_value file "SpecRow" "Name")) 
(setq name_width (atoi (cs_read_ini_value file "Data" "NameWidth")))
(setq attribute (vlax-safearray-get-element attributes (- 2 ind)))
(vla-Move attribute (vlax-3D-point '(0 0 0)) (vlax-3D-point (list 0 (- (atoi (cs_read_ini_value file "Data" "NameOffset")) old_name_offset) 0)))
(cs_compress_text name attribute name_width) 
(if (= is_product "0")
    (progn
	(setq attribute (vlax-safearray-get-element attributes 6))
	(vla-Move attribute (vlax-3D-point '(0 0 0)) (vlax-3D-point (list 0 (- (atoi (cs_read_ini_value file "Data" "NoteOffset")) old_note_offset) 0)))
;;;	(princ (strcat "\nсмещаю примечание на " (itoa (- (atoi (cs_read_ini_value file "Data" "NoteOffset")) old_note_offset))))
    ) ; progn
) ; if
(vla-put-TextString (vlax-safearray-get-element attributes 0) (cs_read_ini_value file "SpecRow" "Pos"))                  ; позиция
(if (= is_product "0") ; обычная строка спецификации
    (progn 
        (vla-put-TextString (vlax-safearray-get-element attributes 1) (cs_read_ini_value file "SpecRow" "Designation"))  ; обозначение
        (vla-put-TextString (vlax-safearray-get-element attributes 6) (cs_read_ini_value file "SpecRow" "Note"))         ; примечание
    ) ; progn
) ; if
(vla-put-TextString (vlax-safearray-get-element attributes (- 3 ind)) (cs_read_ini_value file "SpecRow" "MP"))           ; м.п.
(vla-put-TextString (vlax-safearray-get-element attributes (- 4 ind)) (cs_read_ini_value file "SpecRow" "Quantity"))     ; количество
(vla-put-TextString (vlax-safearray-get-element attributes (- 5 ind)) (cs_read_ini_value file "SpecRow" "Weight"))       ; масса    
(cond
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; строка спецификации Прокат ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	((= element_type "Prokat")
;;;	(princ "\nзаполняю расширенные данные") 
	(regapp "cs_IsProduct") 
        (regapp "cs_Type")
	(regapp "cs_DesignationText")
	(regapp "cs_TypeText")
	(regapp "cs_MarkaText")
	(regapp "cs_SteelMarkaText")
	(regapp "cs_Length")
	(regapp "cs_NameGOST")
	(regapp "cs_Marka")
	(regapp "cs_SteelGOST")
	(regapp "cs_SteelMarka")
	(regapp "cs_SteelCategory")
	(regapp "cs_DesignationMark")
	(regapp "cs_QuantityMark")
	(regapp "cs_WeightMark")
	(regapp "cs_MPMark")
	(regapp "cs_NameOffset") 
	(regapp "cs_NoteOffset") 
	(setq le (entget (vlax-vla-object->ename v_block)))
	(setq edata (list (list -3
		(list "cs_IsProduct" (cons 1000 (cs_read_ini_value file "Data" "IsProduct")))		
		(list "cs_Type" (cons 1000 (cs_read_ini_value file "Data" "Type")))
		(list "cs_DesignationText" (cons 1000 (cs_read_ini_value file "Data" "DesignationText")))
		(list "cs_TypeText" (cons 1000 (cs_read_ini_value file "Data" "TypeText")))
		(list "cs_MarkaText" (cons 1000 (cs_read_ini_value file "Data" "MarkaText")))
		(list "cs_SteelMarkaText" (cons 1000 (cs_read_ini_value file "Data" "SteelMarkaText")))	
		(list "cs_Length" (cons 1000 (cs_read_ini_value file "Data" "Length")))	
		(list "cs_NameGOST" (cons 1000 (cs_read_ini_value file "Data" "NameGOST")))
		(list "cs_Marka" (cons 1000 (cs_read_ini_value file "Data" "Marka")))
		(list "cs_SteelGOST" (cons 1000 (cs_read_ini_value file "Data" "SteelGOST")))
		(list "cs_SteelMarka" (cons 1000 (cs_read_ini_value file "Data" "SteelMarka")))	
		(list "cs_SteelCategory" (cons 1000 (cs_read_ini_value file "Data" "SteelCategory")))
		(list "cs_DesignationMark" (cons 1000 (cs_read_ini_value file "Data" "DesignationMark")))
		(list "cs_QuantityMark" (cons 1000 (cs_read_ini_value file "Data" "QuantityMark")))
		(list "cs_WeightMark" (cons 1000 (cs_read_ini_value file "Data" "WeightMark")))	
		(list "cs_MPMark" (cons 1000 (cs_read_ini_value file "Data" "MPMark")))	
		(list "cs_NameOffset" (cons 1000 (cs_read_ini_value file "Data" "NameOffset")))	
		(list "cs_NoteOffset" (cons 1000 (cs_read_ini_value file "Data" "NoteOffset")))									
	))) ; setq
	(setq le2 (append le edata))
	(entmod le2)
	) ; прокат
	
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; строка спецификации Лист ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	((= element_type "List")
	(regapp "cs_IsProduct") 
        (regapp "cs_Type")
	(regapp "cs_DesignationText")
	(regapp "cs_TypeText")
	(regapp "cs_MarkaText")
	(regapp "cs_SteelMarkaText")
	(regapp "cs_SteelGOST")
	(regapp "cs_SteelMarka")
	(regapp "cs_SteelCategory")
	(regapp "cs_Thickness")
	(regapp "cs_Width")
	(regapp "cs_Length")
	(regapp "cs_DesignationMark")
	(regapp "cs_NameOffset") 
	(regapp "cs_NoteOffset") 
	(setq le (entget (vlax-vla-object->ename v_block)))
	(setq edata (list (list -3
		(list "cs_IsProduct" (cons 1000 (cs_read_ini_value file "Data" "IsProduct")))		
		(list "cs_Type" (cons 1000 (cs_read_ini_value file "Data" "Type")))
		(list "cs_DesignationText" (cons 1000 (cs_read_ini_value file "Data" "DesignationText")))
		(list "cs_TypeText" (cons 1000 (cs_read_ini_value file "Data" "TypeText")))
		(list "cs_MarkaText" (cons 1000 (cs_read_ini_value file "Data" "MarkaText")))
		(list "cs_SteelMarkaText" (cons 1000 (cs_read_ini_value file "Data" "SteelMarkaText")))	
		(list "cs_SteelGOST" (cons 1000 (cs_read_ini_value file "Data" "SteelGOST")))
		(list "cs_SteelMarka" (cons 1000 (cs_read_ini_value file "Data" "SteelMarka")))	
		(list "cs_SteelCategory" (cons 1000 (cs_read_ini_value file "Data" "SteelCategory")))
		(list "cs_Thickness" (cons 1000 (cs_read_ini_value file "Data" "Thickness")))	
		(list "cs_Width" (cons 1000 (cs_read_ini_value file "Data" "Width")))	
		(list "cs_Length" (cons 1000 (cs_read_ini_value file "Data" "Length")))	
		(list "cs_DesignationMark" (cons 1000 (cs_read_ini_value file "Data" "DesignationMark")))
		(list "cs_NameOffset" (cons 1000 (cs_read_ini_value file "Data" "NameOffset")))	
		(list "cs_NoteOffset" (cons 1000 (cs_read_ini_value file "Data" "NoteOffset")))									
	))) ; setq
	(setq le2 (append le edata))
	(entmod le2)
	) ; лист

        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; строка спецификации Дерево ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	((= element_type "Wood")	
	(regapp "cs_IsProduct") 
        (regapp "cs_Type")
	(regapp "cs_DesignationText")
	(regapp "cs_TypeText")
	(regapp "cs_MarkaText")
	(regapp "cs_Length")
	(regapp "cs_WoodSort")
	(regapp "cs_WoodPoroda")
	(regapp "cs_Thickness")
	(regapp "cs_Width")
	(regapp "cs_DesignationMark")
	(regapp "cs_ByGOSTMark")
	(regapp "cs_MPMark")
	(regapp "cs_NameOffset")  
	(regapp "cs_NoteOffset") 
	(setq le (entget (vlax-vla-object->ename v_block)))
	(setq edata (list (list -3
		(list "cs_IsProduct" (cons 1000 (cs_read_ini_value file "Data" "IsProduct")))		
		(list "cs_Type" (cons 1000 (cs_read_ini_value file "Data" "Type")))
		(list "cs_DesignationText" (cons 1000 (cs_read_ini_value file "Data" "DesignationText")))
		(list "cs_TypeText" (cons 1000 (cs_read_ini_value file "Data" "TypeText")))
		(list "cs_MarkaText" (cons 1000 (cs_read_ini_value file "Data" "MarkaText")))
		(list "cs_Length" (cons 1000 (cs_read_ini_value file "Data" "Length")))	
		(list "cs_WoodSort" (cons 1000 (cs_read_ini_value file "Data" "WoodSort")))
		(list "cs_WoodPoroda" (cons 1000 (cs_read_ini_value file "Data" "WoodPoroda")))	
		(list "cs_Thickness" (cons 1000 (cs_read_ini_value file "Data" "Thickness")))	
		(list "cs_Width" (cons 1000 (cs_read_ini_value file "Data" "Width")))	
		(list "cs_DesignationMark" (cons 1000 (cs_read_ini_value file "Data" "DesignationMark")))
		(list "cs_ByGOSTMark" (cons 1000 (cs_read_ini_value file "Data" "ByGOSTMark")))
		(list "cs_MPMark" (cons 1000 (cs_read_ini_value file "Data" "MPMark")))	
		(list "cs_NameOffset" (cons 1000 (cs_read_ini_value file "Data" "NameOffset")))	
		(list "cs_NoteOffset" (cons 1000 (cs_read_ini_value file "Data" "NoteOffset")))									
	))) ; setq
	(setq le2 (append le edata))
	(entmod le2)
	) ; дерево
	
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; строка спецификации Арматура ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	((= element_type "Arm")	
	(regapp "cs_IsProduct") 
        (regapp "cs_Type")
	(regapp "cs_DesignationText")
	(regapp "cs_Length")
	(regapp "cs_SteelMarka")
	(regapp "cs_Diameter")
	(regapp "cs_DesignationMark")
	(regapp "cs_ByGOSTMark")
	(regapp "cs_MPMark")
	(regapp "cs_NameOffset")  
	(regapp "cs_NoteOffset") 
	(setq le (entget (vlax-vla-object->ename v_block)))
	(setq edata (list (list -3
		(list "cs_IsProduct" (cons 1000 (cs_read_ini_value file "Data" "IsProduct")))		
		(list "cs_Type" (cons 1000 (cs_read_ini_value file "Data" "Type")))
		(list "cs_DesignationText" (cons 1000 (cs_read_ini_value file "Data" "DesignationText")))
		(list "cs_Length" (cons 1000 (cs_read_ini_value file "Data" "Length")))	
		(list "cs_SteelMarka" (cons 1000 (cs_read_ini_value file "Data" "SteelMarka")))
		(list "cs_Diameter" (cons 1000 (cs_read_ini_value file "Data" "Diameter")))
		(list "cs_DesignationMark" (cons 1000 (cs_read_ini_value file "Data" "DesignationMark")))
		(list "cs_ByGOSTMark" (cons 1000 (cs_read_ini_value file "Data" "ByGOSTMark")))
		(list "cs_MPMark" (cons 1000 (cs_read_ini_value file "Data" "MPMark")))	
		(list "cs_NameOffset" (cons 1000 (cs_read_ini_value file "Data" "NameOffset")))		
		(list "cs_NoteOffset" (cons 1000 (cs_read_ini_value file "Data" "NoteOffset")))									
	))) ; setq
	(setq le2 (append le edata))
	(entmod le2)
	) ; арматура
	
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; строка спецификации Простой Текст ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	((= element_type "SimpleText")	
	(regapp "cs_IsProduct") 
        (regapp "cs_Type")
	(regapp "cs_NameOffset")  
	(regapp "cs_NoteOffset") 
	(setq le (entget (vlax-vla-object->ename v_block)))
	(setq edata (list (list -3
		(list "cs_IsProduct" (cons 1000 (cs_read_ini_value file "Data" "IsProduct")))		
		(list "cs_Type" (cons 1000 (cs_read_ini_value file "Data" "Type")))
		(list "cs_NameOffset" (cons 1000 (cs_read_ini_value file "Data" "NameOffset")))		
		(list "cs_NoteOffset" (cons 1000 (cs_read_ini_value file "Data" "NoteOffset")))									
	))) ; setq
	(setq le2 (append le edata))
	(entmod le2)
	) ; простой текст
	
        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; строка спецификации Дробный Текст ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	((= element_type "FractionText")
	(princ "\nзаполняю расширенные данные") 	
	(regapp "cs_IsProduct") 
        (regapp "cs_Type")
        (regapp "cs_BeforeText")
        (regapp "cs_UpText")
        (regapp "cs_DownText")
        (regapp "cs_AfterText")
	(regapp "cs_NameOffset")  
	(regapp "cs_NoteOffset") 
	(setq le (entget (vlax-vla-object->ename v_block)))
	(setq edata (list (list -3
		(list "cs_IsProduct" (cons 1000 (cs_read_ini_value file "Data" "IsProduct")))		
		(list "cs_Type" (cons 1000 (cs_read_ini_value file "Data" "Type")))		
		(list "cs_BeforeText" (cons 1000 (cs_read_ini_value file "Data" "BeforeText")))		
		(list "cs_UpText" (cons 1000 (cs_read_ini_value file "Data" "UpText")))		
		(list "cs_DownText" (cons 1000 (cs_read_ini_value file "Data" "DownText")))		
		(list "cs_AfterText" (cons 1000 (cs_read_ini_value file "Data" "AfterText")))
		(list "cs_NameOffset" (cons 1000 (cs_read_ini_value file "Data" "NameOffset")))		
		(list "cs_NoteOffset" (cons 1000 (cs_read_ini_value file "Data" "NoteOffset")))									
	))) ; setq
	(setq le2 (append le edata))
	(entmod le2)
	) ; дробный текст
	
) ; cond
(princ)  
) ; defun
Сет вне форума  
 
Непрочитано 13.06.2024, 10:10
#4602
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сет Посмотреть сообщение
При этом часто происходит повторная регистрация одного и того же приложения, я перед этим не проверяю зарегистрировано ли оно уже до того. Как я понял в такой проверке нет особой нужды. Но может все таки это неправильно?
Я бы делал. А ограничение 16 кб это ж на все приложения, которые ты пытаешься на примитив засунуть. ЕМНИП, там еще и имена приложений участвуют в этом объеме.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.06.2024, 10:17
#4603
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я бы делал.
А для чего? Повторная регистрация ведь не дублирует приложение, там вроде просто возвращается nil и все.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А ограничение 16 кб это ж на все приложения, которые ты пытаешься на примитив засунуть.
У меня не больше 1 кб объем расширенных данных на объект получается.
Сет вне форума  
 
Непрочитано 13.06.2024, 10:23
#4604
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Сет Посмотреть сообщение
регистрирую довольно много приложений для расширенных данных (regapp). Их всего порядка 30-ти разных.
ограничений особых нет на количество зарегистрированных приложений

Цитата:
Миллион приложений команда зарегистрировала без ошибок. Правда, при попытке посмотреть данные по базе, AutoCAD завис намертво. При 10000 приложений удалось посмотреть данные в базе:
Вывод: ограничений на количество зарегистрированных приложений нет. Но большое их количество сильно затормаживает работу с чертежом.
----- добавлено через ~2 мин. -----
регистрация приложений идет в отдельном списке/словаре, а в XData записывается лишь какой-то идентификатор - соответствующий указанному строковому названию зарегистрированного приложения.
Сергей812 вне форума  
 
Непрочитано 13.06.2024, 11:17
#4605
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Когда вставил код функции сюда, то обратил, что среди локальных параметров подсветилась локальная переменная name, как будто это ключевое слово языка. В редакторе оно не подсвечивается. Имя name зарезервировано и его нельзя использовать для именования переменных?
Сет вне форума  
 
Непрочитано 13.06.2024, 11:48
1 | #4606
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,813


Цитата:
Сообщение от Сет Посмотреть сообщение
Как организовать выбор объекта по условию?
ну и до кучи
Код:
[Выделить все]
 
(defun inselect (insert_name / insert_ename it_is)
	(while (not it_is) 
			   	(and (setq insert_ename (vl-catch-all-apply 'entsel (list (strcat "\nВыберите блок с именем \"" insert_name "\": "))))
					 (null (setq it_is (vl-catch-all-error-p insert_ename)))
					 (setq insert_ename (car insert_ename))
			   		 (= "INSERT" (cdr (assoc 0 (entget insert_ename))))
					 (setq it_is (= (strcase insert_name) (strcase (vla-get-effectivename (vlax-ename->vla-object insert_ename)))))
			   	)
	)
	(if (vl-catch-all-error-p insert_ename) nil insert_ename) 
)
__________________
K Lisp
koMon вне форума  
 
Непрочитано 13.06.2024, 12:03
#4607
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Offtop:
Цитата:
Сообщение от koMon Посмотреть сообщение
ну и до кучи
добавьте, пожалуйста, что это относится к предыдущей подтеме выбора блока по имени - а то как-то неожиданно код появляется среди расширенных данных)
Сергей812 вне форума  
 
Непрочитано 13.06.2024, 12:10
#4608
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,813


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Offtop:
добавьте, пожалуйста, что это относится к предыдущей подтеме выбора блока по имени - а то как-то неожиданно код появляется среди расширенных данных)
я же процитировал не расширенные данные.
__________________
K Lisp
koMon вне форума  
 
Непрочитано 14.06.2024, 18:31
#4609
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Цитата:
Сообщение от skkkk Посмотреть сообщение
У меня вот, что вышло

Код:
[Выделить все]
 (defun sel_block_by_name (blcname / blc)
(vl-load-com)
	(while 
		(or 
			(null blc)
			(/= (cdr (assoc 0 (entget blc))) "INSERT")
			(and
				(/= (cdr (assoc 2 (entget blc))) blcname)
				(/= (vla-get-EffectiveName (vlax-ename->vla-object blc)) blcname)
			)
		)
		(setq blc (car (entsel (strcat "\nУкажите блок с именем " blcname " <Отмена>"))))
		(if (= (getvar "ERRNO") 52)
			(progn 
				(setq blc T)
				(princ "\nОтменено")
				(princ)
			)
			(princ)
		)
	)
	blc
)
----- добавлено через 49 сек. -----
Вызывать так:
Код:
[Выделить все]
(SEL_BLOCK_BY_NAME "ABC")
Попробовал применить вашу функцию, немного ее модернизировав. Переменную blcname перевел в локальные и первым делом присваиваю ей имя блока "СпецСтр3". Функция завершается с ошибкой:
Цитата:
Команда: SEL_BLOCK_BY_NAME
Укажите блок с именем СпецСтр3 <Отмена>
Отменено; ошибка: неверный тип аргумента: lentityp T
Сет вне форума  
 
Непрочитано 14.06.2024, 18:38
#4610
Кулик Алексей aka kpblc
Moderator

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


Так надо модифицированный код предоставлять ИМХО
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.06.2024, 19:27
#4611
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Так надо модифицированный код предоставлять ИМХО
Посчитал что ничего существенного не поменял.

Код:
[Выделить все]
 (defun c:sel_block_by_name (/ blcname blc)
    (setq blcname "ÑïåöÑòð3")
	(while 
		(or 
			(null blc)
			(/= (cdr (assoc 0 (entget blc))) "INSERT")
			(and
				(/= (cdr (assoc 2 (entget blc))) blcname)
				(/= (vla-get-EffectiveName (vlax-ename->vla-object blc)) blcname)
			)
		)
		(setq blc (car (entsel (strcat "\nÓêàæèòå áëîê ñ èìåíåì " blcname " <Îòìåíà>"))))
		(if (= (getvar "ERRNO") 52)
			(progn 
				(setq blc T)
				(princ "\nÎòìåíåíî")
				(princ)
			)
			(princ)
		)
	)
	blc
)  
Кракозябры на самом деле у меня в редакторе в виде нормальных букв. Это сюда почему-то так копируются.
Сет вне форума  
 
Непрочитано 14.06.2024, 20:14
#4612
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Сет Посмотреть сообщение
Кракозябры на самом деле у меня в редакторе в виде нормальных букв. Это сюда почему-то так копируются.
просто перед копированием поставьте русскую раскладку и в редакторе лиспа, и в браузере - а потом только копируйте.

----- добавлено через ~24 мин. -----
а так пользуйтесь отладкой - пытаетесь в условии цикла запросить у логического значения T (в переменной blc) информацию через entget - тут даже лисп удивился)

----- добавлено через ~50 мин. -----
а происходит это по причине, написанной в справке
Цитата:
Системная переменная ERRNO не всегда сбрасывается в нуль. Кроме случаев, когда переменная проверяется сразу после сигнала об ошибке из функции AutoLISP, ошибка, о которой свидетельствует значение переменной, может быть неверной. Перед созданием или открытием чертежа данная переменная всегда очищается.
Сергей812 вне форума  
 
Непрочитано 14.06.2024, 21:15
#4613
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Вот так модифицировал, вроде работает. Я здесь перед циклом определяю переменную blc и удалил еще в условии цикла проверку blc на nil, а также присваивание blc=true, если ERRNO=52.

Код:
[Выделить все]
 (defun c:sel_block_by_name (/ blcname blc)
    (setq blcname "СпецСтр3")
    (setq blc (car (entsel (strcat "\nУкажите блок с именем " blcname " <Отмена>"))))
	(while 
		(or 
			(/= (cdr (assoc 0 (entget blc))) "INSERT")
			(and
				(/= (cdr (assoc 2 (entget blc))) blcname)
				(/= (vla-get-EffectiveName (vlax-ename->vla-object blc)) blcname)
			)
		)
		(setq blc (car (entsel (strcat "\nУкажите блок с именем " blcname " <Отмена>"))))
		(if (= (getvar "ERRNO") 52)
			(progn 
				(princ "\nОтменено")
				(princ)
			)
			(princ)
		)
	)
	blc
)
Кстати, не совсем понимаю зачем нужна эта проверка ERRNO? И еще не понимаю, для чего в запросе на выбор объекта писать <Отмена>?
Сет вне форума  
 
Непрочитано 14.06.2024, 21:30
#4614
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Сет Посмотреть сообщение
И еще не понимаю, для чего в запросе на выбор объекта писать <Отмена>?
операция по умолчанию - если пользователь нажмет ввод в ответ на приглашение выбрать блок. А
Код:
[Выделить все]
 (if (= (getvar "ERRNO") 52)
отлавливает эту реакцию пользователя и выводит сообщение об этом. А если при выборе пользователь промахнется мимо объекта, например - то ERRNO вернет значение 7

----- добавлено через ~2 мин. -----
правда это не поможет, если пользователь нажмет Esc - для этого надо использовать функции лиспа vl-catch-all-*, как выше и показывали в примерах.
Сергей812 вне форума  
 
Непрочитано 14.06.2024, 21:57
#4615
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
операция по умолчанию - если пользователь нажмет ввод в ответ на приглашение выбрать блок.
В данном случае по нажатию ввода - ошибка. Но в любом случае <Отмена> - это же просто строка, а не какое-то ключевое слово, переменная или функция. Она же в сущности не работает. Или это просто такой стиль оформления запроса?
Сет вне форума  
 
Непрочитано 14.06.2024, 22:03
#4616
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Сет Посмотреть сообщение
В данном случае по нажатию ввода - ошибка.
так трассировкой пройдите по коду и увидите - почему
Цитата:
Сообщение от Сет Посмотреть сообщение
Или это просто такой стиль оформления запроса?
естественно, предлагать пользователю выбрать ключевое слово для отмены выбора объекта - это уже издевательство над пользователем)
Сергей812 вне форума  
 
Непрочитано 14.06.2024, 22:12
#4617
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
так трассировкой пройдите по коду и увидите - почему
Я плоховато освоился и в лиспе, и в редакторе, толком не знаю как эту трассировку делать. Лисп время от времени нужен для кое-каких мелких программ для себя.
Сет вне форума  
 
Непрочитано 14.06.2024, 22:23
#4618
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Сет Посмотреть сообщение
толком не знаю как эту трассировку делать
как в любом другом языке программирования - поставить точку (точки) остановки, загрузить активный лисп-документ или выделенный фрагмент из него в акад, а когда исполнение кода прервется на точке остановки - пошагово пройтись через F8 (все хоткеи прямо в меню редактора лиспа написаны) - контролируя значения переменных. Без умения трассировать код невозможно научиться писать нормальный код - даже если прочитаешь всю теорию об этом.
Сергей812 вне форума  
 
Непрочитано 15.06.2024, 14:00
#4619
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,606


А можно ли в этой строчке делать сравнение имени блока по маске?
Код:
[Выделить все]
 (/= (cdr (assoc 2 (entget blc))) blcname)
Например если blcname="спецстр*" - чтобы функция возвращала nil для всех блоков, имя которых начинается на "спецстр".
Сет вне форума  
 
Непрочитано 15.06.2024, 16:21
#4620
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


имя блока - это всего лишь строка, поэтому ее можно сравнивать любыми доступными методами. С масками вроде функция wcmatch работает, или как-то похожая по названию
Сергей812 вне форума  
Ответ
Вернуться   Форум 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