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

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

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

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

Со школы не ладится у меня с программированием. Все предметы щелкал, а на экзамене по информатике (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.
Просмотров: 1699021
 
Непрочитано 10.02.2021, 00:57
#3981
kacugu

начинающий инженер-гидротехник
 
Регистрация: 18.04.2010
Санкт-Петербург
Сообщений: 787


Offtop:
Цитата:
Сообщение от skkkk Посмотреть сообщение
Почему 3381?
В римские футы, судя по всему...
kacugu на форуме  
 
Непрочитано 10.02.2021, 06:28
#3982
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 459
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от rusv Посмотреть сообщение
Принимайте в свои ряды.
Только познаю азы LISPa

А может разбирали похожий пример.
Нужно выбрать объекты (текст) в чертеже, в тексте найти цифры, а далее выполнить конвертацию этих цифр с округлением. Например, имею текст "Высота 1000м", а хочу результат "Высота 1000м/3381' ". Таких объектов может быть несколько в чертеже с разными словами. Думал сделать чтобы сразу с группой можно было работать, т.е в начале эти объекты "натыкать". Заранее спасибо всем откликнувшимся.
Задача поставлена эпическая.
поделюсь опытом:
Код:
[Выделить все]
 (defun c:round-i-len ( / )
	(defun round-in-str (s) (rtos (atof (vl-string-subst "." "," s)) 2 0 )) ;;return string
	(vla-startUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
	(vlax-for txt (sad-get-ss '((0 "TEXT") ))
		(if (wcmatch (vla-get-TextString txt) "*+*")
			(vla-put-TextString 
				txt 
				((lambda (str)
					(setq str (_dwgru-string-to-list str "+")
					str (strcat (car str) "+" (round-in-str (cadr str)))	)
				) (vla-get-TextString txt))
			)
			(vla-put-TextString 
				txt
				(round-in-str (vla-get-TextString txt))
			)
		)
	)	
	(vla-endUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
	(princ)	
)
(defun c:round-i-len2 ( / )
	(defun round-in-str (s) (vl-princ-to-string (atof (vl-string-subst "." "," s)))) ;;return string
	(vla-startUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
	(vlax-for txt (sad-get-ss '((0 "TEXT") ))
		(if (wcmatch (vla-get-TextString txt) "*+*")
			(vla-put-TextString 
				txt 
				((lambda (str)
					(setq str (_dwgru-string-to-list str "+")
					str (strcat (car str) "+" (round-in-str (cadr str)))	)
				) (vla-get-TextString txt))
			)
			(vla-put-TextString 
				txt
				(round-in-str (vla-get-TextString txt))
			)
		)
	)	
	(vla-endUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
	(princ)	
)
(princ) ;;silent load

Программы совсем одинаковые, хочу только обратить внимание что в этих двух программках есть локальная функция round-in-str которая реализуется по разному: в первом случае rtos, во втором vl-princ-to-string - поведение у них различное.

Поясню по эпичности: надо будет продумать алгоритм расчленения строк на куски, определение какие из этих кусков числа и их обрабатывать, склейку обратно всего этого добра в строку и при этом предусмотреть все возможные варианты обрабатываемых строк.
з.ы. Проблем добавляет тот факт, что atof всеяден и ошибки не выдаст... но может просто потерять часть символов в строке если их предварительно не срезать:
Команда: (atof "123.21")
123.21
Команда: (atof "asd123.21")
0.0
Команда: (atof "123.21asd")
123.21
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 10.02.2021 в 06:38.
Vladimir_Sergeevich вне форума  
 
Непрочитано 10.02.2021, 08:48
#3983
rusv


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
rusv, я ничего не понял. Почему 3381? Что значит "конвертацию цифр с округлением"? Как понять это "сразу с группой работать" и " в начале "натыкать"?
Нужно бы файл с примером приложить, где будет видно, что есть и как надо.
Извиняюсь - обсчитался. 1000м - это 3281 фут (значок футов '). Например, имею несколько текстовых объектов, в них есть числа, вот их надо найти и перевести из метров в футы. Их довольно много на чертеже, поэтому думал для начала сделать набор нужных мне объектов в группу ("натыкать"), а далее, чтобы код работал с каждым объектом по очереди, пока объекты не закончатся в группе (while).
Вложения
Тип файла: dwg
DWG 2013
Drawing1.dwg (41.2 Кб, 9 просмотров)
rusv вне форума  
 
Непрочитано 11.02.2021, 18:39
1 | #3984
skkkk


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


Vladimir_Sergeevich, можно же проще сделать, если сравнивать коды символов (те, что возвращает функция ascii). Вспоминая одну из тем, где Сергей812 открыл мне глаза на то, что функции < и > могут сравнивать помимо чисел и строки (что было для меня откровением), а также подглядев в справке коды цифр, можем заключить, что цифрами являются символы с кодами от 48 до 57 включительно (от 0 до 9), можем сделать как-то так:
Код:
[Выделить все]
 (setq vl_txtobj (vlax-ename->vla-object (car (entsel))))
(setq str (vla-get-TextString vl_txtobj))
(setq digits
	(vl-list->string
		(vl-remove-if-not
		   '(lambda (x) (and (> x 47) (< x 58)))
			(vl-string->list str)
		)
	)
)
(setq ft (* (atof digits) 3.28084))
(vla-put-TextString vl_txtobj (strcat str "\/" (rtos ft 2 0) "'"))
Чтобы в футах не было нулей после запятой, переменная DIMZIN должна быть равна нулю.

Правда, с текстами в файле-образце выходит, что добавочный текст с футами не влезает в одну строку и переносится. Чтобы было в одну строку, нужно назначить тексту ширину, равную нулю. Почему-то с мтекстами из файла у меня программно не выходит назначить им ширину 0. Создал прям там в файле свои мтексты, установил им ширину в 0 - в них все сработало хорошо. Файл с результатом прилагаю. Однако, очень любопытно, почему код
Код:
[Выделить все]
 (vla-put-Width (vlax-ename->vla-object (car (entsel))) 0)
не меняет ширину мтекста в ноль, при этом, даже вручную его нельзя сделать нулевым. Сверял дампы этих текстов - всё совпадает, кроме совсем уж индивидуальных параметров (см. вложение-скрин). Хотелось бы понять: почему так?

Нужно также добавить, что данный код, конечно, сработает корректно только для случая, где есть лишь одно число (как в файле-примере). Возможно, для более правильной работы в каком-то случае было бы правильным делать анализ текста на символ "м", и все цифры, что перед ним забирать в качестве числа и обрабатывать их.
Миниатюры
Нажмите на изображение для увеличения
Название: сверка дампов.PNG
Просмотров: 17
Размер:	57.2 Кб
ID:	234426  
Вложения
Тип файла: dwg
DWG 2010
Drawing1.dwg (85.3 Кб, 4 просмотров)
skkkk на форуме  
 
Непрочитано 11.02.2021, 20:44
#3985
koMon


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


skkkk, сравни палитровые свойства текстов
koMon вне форума  
 
Непрочитано 11.02.2021, 21:06
#3986
skkkk


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


koMon, ага, спасибо за наводочку, похоже, это - столбцы. Ну ОК, а как их программно убрать?

P.S.: Сравнил дампы entget - тоже разницы не нашел.
Миниатюры
Нажмите на изображение для увеличения
Название: сверка дампов entget.PNG
Просмотров: 12
Размер:	31.3 Кб
ID:	234434  

Последний раз редактировалось skkkk, 11.02.2021 в 21:12.
skkkk на форуме  
 
Непрочитано 11.02.2021, 21:41
#3987
koMon


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


Очередное волшебство автокада!?
(cvunit) имхо сподручнее будет для конвертации метров в футы.
koMon вне форума  
 
Непрочитано 12.02.2021, 06:39
#3988
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 459
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


skkkk, информация о кодах интересна, но простоты не добавляет. Как быть если надо не дописать, а преобразовать число?
В моей практике были случаи когда надо было на чертеже все отметки поднять (из местной системы высот в балтику, например), а в строках бывали не просто числа, а подписи вида "в.оп. 123,12"
И счастьем было, если везде в этих строках был пробел по которому это добро можно поделить, обработать число, и склеить обратно.
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 12.02.2021, 09:51
#3989
koMon


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


вист

выбираем у *текста то что находится/или не находится между пробелом и "м" (строковое число) и ковертируем его из метров в футы. зачем это нужно отечественному проектировщику?

skkkk, копание дало следующее. если у мтекста есть колонки, то назначить ему ширину ноль не получается. колонки нужно удалить костылями. кстати в руководстве по dxf у мтекста есть групповой код 75, который якобы отвечает за колонки и который не документируется в этом руководстве и не показывается в dxf дампе, но… см. костыли частного случая в коде после (vla-put-textstring…), которые позволяют сначала назначить ширине ноль, а затем переназначить её под текущую длину строки.

Код:
[Выделить все]
 
(defun c:meter_foot (/ text_index ignore_empty_sset text_sset text_object text_entity text_string space_position m_position meter_string)
	(repeat (sslength (setq text_index 0 
							ignore_empty_sset (while (null (setq text_sset (vl-catch-all-apply 'ssget (list '((0 . "*text")))))))
							text_sset (cond
											(
												(vl-catch-all-error-p text_sset)
													(princ "\nОтмена команды")
													(ssadd)
											)
											(
												t
													text_sset
											)
									  )
					  )
			)
		(setq text_object (vlax-ename->vla-object (setq text_entity (ssname text_sset text_index)))
			  text_string (vla-get-textstring text_object)
			  space_position (if (null (setq space_position (vl-string-position (ascii " ") text_string))) 0 space_position)
			  m_position (vl-string-position (ascii "ì") text_string)
		)
		(if (and 
				 m_position
				 (> m_position space_position) 
			)
				(progn
					(setq meter_string (substr text_string
			  								   (1+ space_position)
											   (-
												  m_position
												  space_position
											   )
							   		   )
					)     
				  	(vla-put-textstring text_object
				  			  			(strcat (substr text_string 1 (1+ m_position))
				  								"/"
				  								(rtos (cvunit (atof meter_string) "m" "ft") 2 0)
				  								"'"
				  						)
				  	)
					(entmod (append (entget text_entity) '((75 . 0))))
					(vl-catch-all-apply 'vla-put-width (list text_object 0.0))
					(entmod (append (entget text_entity) '((75 . 0))))
					(vl-catch-all-apply 'vla-put-width 
										(list text_object 
											  (vl-catch-all-apply '* 
													   			   (list 1.01 
																		 (cdr (assoc 42 (entget text_entity)))
																   )
											  )
										)
					)
				)
		)
		(setq text_index (1+ text_index))
	)
	(princ)
)

Последний раз редактировалось koMon, 15.02.2021 в 10:09. Причина: от пробела до "м" + от начала строки до "м"
koMon вне форума  
 
Непрочитано 12.02.2021, 10:08
#3990
Сергей812


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


Цитата:
Сообщение от koMon Посмотреть сообщение
колонки нужно удалить костылями
костыль)
Сергей812 вне форума  
 
Непрочитано 12.02.2021, 10:19
#3991
koMon


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


LISP vs .NET

LISP rules!
koMon вне форума  
 
Непрочитано 12.02.2021, 10:28
#3992
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 459
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от koMon Посмотреть сообщение
LISP vs .NET

LISP rules!
Завораживающая идея...
написать на шарпе кучу собственных лисп функций, которые разработчики изначально забыли сделать, и продолжать писать костыли на лиспе
хмм... а может обернуть лиспом какой-нибудь System.Xml.Linq?
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 12.02.2021, 10:29
#3993
rusv


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Vladimir_Sergeevich, можно же проще сделать, если сравнивать коды символов (те, что возвращает функция ascii). Вспоминая одну из тем, где Сергей812 открыл мне глаза на то, что функции < и > могут сравнивать помимо чисел и строки (что было для меня откровением), а также подглядев в справке коды цифр, можем заключить, что цифрами являются символы с кодами от 48 до 57 включительно (от 0 до 9), можем сделать как-то так:
Код:
[Выделить все]
 (setq vl_txtobj (vlax-ename->vla-object (car (entsel))))
(setq str (vla-get-TextString vl_txtobj))
(setq digits
	(vl-list->string
		(vl-remove-if-not
		   '(lambda (x) (and (> x 47) (< x 58)))
			(vl-string->list str)
		)
	)
)
(setq ft (* (atof digits) 3.28084))
(vla-put-TextString vl_txtobj (strcat str "\/" (rtos ft 2 0) "'"))
Чтобы в футах не было нулей после запятой, переменная DIMZIN должна быть равна нулю.

Правда, с текстами в файле-образце выходит, что добавочный текст с футами не влезает в одну строку и переносится. Чтобы было в одну строку, нужно назначить тексту ширину, равную нулю. Почему-то с мтекстами из файла у меня программно не выходит назначить им ширину 0. Создал прям там в файле свои мтексты, установил им ширину в 0 - в них все сработало хорошо. Файл с результатом прилагаю. Однако, очень любопытно, почему код
Код:
[Выделить все]
 (vla-put-Width (vlax-ename->vla-object (car (entsel))) 0)
не меняет ширину мтекста в ноль, при этом, даже вручную его нельзя сделать нулевым. Сверял дампы этих текстов - всё совпадает, кроме совсем уж индивидуальных параметров (см. вложение-скрин). Хотелось бы понять: почему так?

Нужно также добавить, что данный код, конечно, сработает корректно только для случая, где есть лишь одно число (как в файле-примере). Возможно, для более правильной работы в каком-то случае было бы правильным делать анализ текста на символ "м", и все цифры, что перед ним забирать в качестве числа и обрабатывать их.
Большое спасибо - это практически, то что мне нужно. Программа находит в тексте цифры и их конвертирует. А можно ли сделать, чтобы находились только те цифры рядом с которыми указан символ "м" ? Т.к зачастую Мtext содержит еще числа, которые трогать не нужно.
rusv вне форума  
 
Непрочитано 12.02.2021, 10:37
| 1 #3994
Сергей812


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


Offtop:
Цитата:
Сообщение от koMon Посмотреть сообщение
LISP vs .NET

LISP rules!
рулит, если к нему приделывать костыли Единственно неоспоримый плюс лиспа, имхо - что он является родным и встроенным, как VBA в офисе - т.е. на него всегда можно рассчитывать при необходимости что-то написать... Если не выпилят лисп в следующих версиях, конечно)



Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
Завораживающая идея...
написать на шарпе кучу собственных лисп функций, которые разработчики изначально забыли сделать, и продолжать писать костыли на лиспе
хмм... а может обернуть лиспом какой-нибудь System.Xml.Linq?
а потом, написав кучу функций и набив руку в .NetApi - подумать: если все равно придется перекомпилировать .Net сборки под другие версии акада, то зачем эти вставки из лиспа..?!
Сергей812 вне форума  
 
Непрочитано 12.02.2021, 10:43
#3995
koMon


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


Offtop:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Если не выпилят лисп в следующих версиях, конечно)

типун…
koMon вне форума  
 
Непрочитано 12.02.2021, 12:02
| 1 #3996
Кулик Алексей aka kpblc
Moderator

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


VLIDE уже обозвана "устаревшей" А учитывая ACAD2021, LISPSYS, VS Code & Co - становится немного уныло.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.02.2021, 13:11
#3997
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 459
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Offtop: Ага, а во FreeCAD вообще командная строка сразу на питоне. Туда все и идем. Хотя в 2021 акаде все лиспы продолжают исправно работать. А VLIDE я открывал только для того, что бы чего нибудь откомпилировать в VLX
Цитата:
Сообщение от rusv Посмотреть сообщение
А можно ли сделать, чтобы находились только те цифры рядом с которыми указан символ "м" ?
rusv, по моему эту тему проработал koMon в #3989
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Непрочитано 12.02.2021, 16:11
#3998
rusv


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


Цитата:
Сообщение от Vladimir_Sergeevich Посмотреть сообщение
Offtop: Ага, а во FreeCAD вообще командная строка сразу на питоне. Туда все и идем. Хотя в 2021 акаде все лиспы продолжают исправно работать. А VLIDE я открывал только для того, что бы чего нибудь откомпилировать в VLX

rusv, по моему эту тему проработал koMon в #3989
Ага, заметил, спасибо. Тут получается число находится между пробелом и символом "м". А как бы можно было сделать, чтобы условие по пробелу исключить, иногда это просто значение "1000м". Получается из-за того что пробела нет - команда не отрабатывает.
rusv вне форума  
 
Непрочитано 16.02.2021, 06:37
#3999
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 459
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Цитата:
Сообщение от rusv Посмотреть сообщение
Получается из-за того что пробела нет - команда не отрабатывает.
Кажется я упоминал, что задача "обработать все варианты строк" выглядит достаточно эпичной?
У меня такие задачи встречаются редко и разово, по мере надобности коды допиливаются под конкретную задачу. Вам уже накидали пару рабочих вариантов, которые осталось слегка подточить, читай про обработку строк и вперед.

з.ы. тема уже поднималась и есть достаточно универсальный инструмент

з.з.ы.
Код:
[Выделить все]
 
(defun c:transform-txt ( / t_lst ft_dim)
	(vla-startUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
	(vlax-for txt (sad-get-ss '((0 "*TEXT") ))
		(if (wcmatch (vla-get-TextString txt) "*'*") nil
			(progn
				(setq t_lst (_dwgru-str->list (vla-get-TextString txt))
					ft_dim nil)
				(foreach it t_lst
					(if (numberp it)
						;;(strcat (vl-princ-to-string it) "\/" (rtos (cvunit it "m" "ft") 2 0) "'")
						(setq t_lst (subst (vl-princ-to-string it) it t_lst)
							ft_dim (rtos (cvunit it "m" "ft") 2 0)
						)
					) 
				)
				(if ft_dim 
					(vla-put-TextString 
						txt
						((lambda (lst add / rez)
							(setq rez "")
							(repeat (length lst)
								(setq rez (strcat rez (car lst))
								lst (cdr lst)
								)
							)
							(strcat rez "\/" add "'"))
						t_lst ft_dim)
					)
				)			
			)
		) 
	)	
	(vla-endUndoMark (vla-get-ActiveDocument (vlax-get-acad-object)))
	(princ)	
)

 (defun _dwgru-str->list (s)
                 ;|
***************************************************************************************
*
* Программа разделяет строку на список текстовых и цифровых составляющих.
* Запятая между цифрами, зменяется на точечный разделитель дробной части.
* 
**************************************************************************************
*
* Написал Елпанов Евгений       (ElpanovEvgeniy)
*
* дата создания (13/10/2007 a 11:42)
* написано во время конкурса на форуме:
* http://www.cadxp.com/XForum+viewthread-fid-101-tid-16943-page-2.html
***************************************************************************************
* Пример использования и результатов работы:
* (_dwgru-str->list "point.25.4cm.")           => ("point." 25.4 "cm.")
* (_dwgru-str->list "point.25,4cm.")           => ("point." 25.4 "cm.")
* (_dwgru-str->list "point.3/8cm.")            => ("point." 0.375 "cm.")
* (_dwgru-str->list "qvf12qsdf125 5sf 56dfv2") => ("qvf" 12 "qsdf" 125 " " 5 "sf " 56 "dfv" 2)
***************************************************************************************
 |;
 (defun str->list1 (a b f)
  (cond
   ((null b)
    (list (if f
           (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           ) ;_ cond
           (vl-list->string (reverse a))
          ) ;_ if
    ) ;_ list
   )
   (f
    (if (or (= (car b) 44) (< 45 (car b) 58))
     (str->list1 (cons (car b) a) (cdr b) f)
     (cons (cond ((vl-position 46 a) (atof (vl-list->string (reverse a))))
                 ((vl-position 47 a) (distof (vl-list->string (reverse a))))
                 ((vl-position 44 a) (atof (vl-list->string (subst 46 44 (reverse a)))))
                 (t (atoi (vl-list->string (reverse a))))
           ) ;_ cond
           (str->list1 (list (car b)) (cdr b) nil)
     ) ;_ cons
    ) ;_ if
   )
   (t
    (if (< 47 (car b) 58)
     (cons (vl-list->string (reverse a)) (str->list1 (list (car b)) (cdr b) t))
     (str->list1 (cons (car b) a) (cdr b) nil)
    ) ;_ if
   )
  ) ;_ cond
 ) ;_ defun
 (setq s (vl-string->list s))
 (str->list1 (list (car s))
             (cdr s)
             (if (or (= (car s) 44) (< 45 (car s) 58))
              t
             ) ;_ if
 )
) 


(defun sad-get-ss (filter_lst / temp ss code_lst filter_value_lst) ;|получение набора, возвращает объект IAcadSelectionSet
	(sad-get-ss nil)
	Фильтр вида '((0 "TEXT") (8 "0"))
	возвращает IAcadSelectionSet
	пустой выбор недопустим
	|;
(setq temp t
	ss (vla-get-PickfirstSelectionSet (vla-get-activeDocument (vlax-get-acad-object))) 
	code_lst '()
	filter_value_lst '()
);;#<VLA-OBJECT IAcadSelectionSet 136be084>
(if filter_lst
	(progn
		(foreach f filter_lst ;;sorting
			(setq code_lst (cons (car f) code_lst)
			filter_value_lst (cons (cadr f) filter_value_lst)
			)
		)
		(setq ;;convert to safearray
			code_lst
			(vlax-safearray-fill
				(vlax-make-safearray 
					vlax-vbInteger
					(cons 0 (1- (length filter_lst)))
				)
				code_lst
			)
			filter_value_lst
			(vlax-safearray-fill
				(vlax-make-safearray
					vlax-vbVariant
					(cons 0 (1- (length filter_lst)))
				)
				filter_value_lst
			)
		) 
	)
)
;;(while temp
  (if (= (vla-get-Count ss) 0)
	(vla-SelectOnScreen ss
		code_lst ;;kodes of filters (variant) (list of DXF codes)
		filter_value_lst ;;filters (list of values DXF codes)
	)
	;;(setq temp nil)
  )
;;)
ss
)

__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...

Последний раз редактировалось Vladimir_Sergeevich, 16.02.2021 в 13:50. Причина: утомила работа, решил отвлечься
Vladimir_Sergeevich вне форума  
 
Непрочитано 16.02.2021, 11:16
#4000
koMon


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


эпичная/не эпичная, но решить её универсальным инструментом вряд ли получится. в общем виде алгоритм видится имхо таким.
1. ищем в тексте "м". если литера встречается однажды по условию, то оно и к лучшему)
2. идём "налево" от найденной литеры в поиске цифр до первой не цифры. найденные цифры читаем в число метров. запоминаем индекс начала метров.
3. теперь идём "направо" через "/", через цифры до "'". запоминаем индекс "'", если нашёлся или индекс "м", если не нашёлся.
4. режем строку по найденным индексам и вставляем новую подстроку метры/футы вместо вырезанной.
5. обновляем текст.
koMon вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Научите лиспу на примере (или как kpblc, VVA и компания пытаются обучить чайника лиспу)

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

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


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