Lisp. Установка символа "*" в верхний индекс в размерах.
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Установка символа "*" в верхний индекс в размерах.

Lisp. Установка символа "*" в верхний индекс в размерах.

Ответ
Поиск в этой теме
Непрочитано 29.04.2014, 11:47 #1
Lisp. Установка символа "*" в верхний индекс в размерах.
Fedorino
 
автоматизация и организация черчения
 
Sterlitamak
Регистрация: 17.11.2009
Сообщений: 135

Добрый день! С языками программирования не дружу, но с помощью справочника Полещука пытаюсь как то облегчить труд коллег.
Задача: искать в размерах "*" и выставлять этот символ в верхний индекс.
Вроде все получилось, но увы только если "*" в одном эксземпляре.
Подскажите, пожалуйста, как можно преобразовать код, чтобы сколь угодное количество "*" выставлялось в верхний индекс?
Код:
[Выделить все]
;|
варианты размеров
"<>*"				40*	[д][*][д]
""			  		40 [д]
"<>{\\H1x;\\S*^;}"	40^*[д][HS*][д]
"<>\\S*^;"
"200*"
"200{\\H0.7x;\\S*/;}"
"200{\\H0.7x;\\S*^;}"
"2ghj\\S*^;" 			[д][S`**][д]
"2ghj{\\H0.7x;\\S^*;}"	[д][S*`*][д]
"2ghj\\S*^;ghgh"
"<>*hghg"				[д][*][д]
"2ghj\\S/*;ghgh"
|;						

;--------------------ОБРАБОТКА РАЗМЕРОВ-----------------------

; обрабатываем размеры удовлетворяющие условию "*\\S`**"
(setq dimens_star (ssget "_X" '((0 . "DIMENSION") (-4 . "<AND") (1 . "*\\S*`**") (-4 . "<NOT") (1 . "*\\H*x;\\S`**") (-4 . "NOT>") (-4 . "<NOT") (1 . "*\\H*x;\\S*`**") (-4 . "NOT>") (-4 . "AND>"))))
		(if (/= nil dimens_star)			
			(progn
			(setq i -1)
				(while (< i (1- (sslength dimens_star)))
					(setq i (1+ i))
					(setq dims (entget (ssname dimens_star i)))
					(setq right1 (cdr (assoc 1 dims)))
					(setq H (vl-string-search "\\S" right1))
					(if
						(/= H nil)
						(progn
							(setq H1 (substr (cdr (assoc 1 dims)) (1+ H) 5))
							;(setq H_ost (substr (cdr (assoc 1 dims)) (+ H 6)))
							(setq H2 (cons 1 (vl-string-subst "\\S*^;" H1 right1)))
							(setq dims (subst H2 (assoc 1 dims) dims))
							(entmod dims)				
						)  ; конец progn
					)	; конец if
				)	; while конец
			)  ; конец progn
		)	; конец if	"200{\\H0.7x;\\S*^;}" "2ghj\\S^*;"

; обрабатываем размеры удовлетворяющие условию (1 . "*\\H0.*x;\\S`**") и (1 . "*\\H0.*x;\\S*`*")
(setq dimens_star (ssget "_X" '((0 . "DIMENSION") (-4 . "<OR") (1 . "*\\H0.*x;\\S`**") (1 . "*\\H0.*x;\\S*`**") (-4 . "OR>"))))
		(if (/= nil dimens_star)			
			(progn
			(setq i -1)
				(while (< i (1- (sslength dimens_star)))
					(setq i (1+ i))
					(setq dims (entget (ssname dimens_star i)))
					(setq right1 (cdr (assoc 1 dims)))
					(setq H (vl-string-search "\\H0." right1))
					(if
						(/= H nil)
						(progn
							(setq H1 (substr (cdr (assoc 1 dims)) (1+ H) 13))
							(setq H2 (cons 1 (vl-string-subst "\\H1x;\\S*^;" H1 right1)))
							(setq dims (subst H2 (assoc 1 dims) dims))
							(entmod dims)				
						)  ; конец progn
					)	; конец if
				)	; while конец
			)  ; конец progn
		)	; конец if	
		
; обрабатываем размеры удовлетворяющие условию "*`*" и "*`**"
(setq dimens_star (ssget "_X" '((0 . "DIMENSION") (-4 . "<AND") (-4 . "<OR") (1 . "*`**") (-4 . "OR>") (-4 . "<NOT") (1 . "*\\H*x;\\S*") (-4 . "NOT>") (-4 . "<NOT") (1 . "*\\S*") (-4 . "NOT>") (-4 . "AND>"))))
(if (/= nil dimens_star)			
			(progn
			(setq i -1)
				(while (< i (1- (sslength dimens_star)))
					(setq i (1+ i))
					(setq dims (entget (ssname dimens_star i)))
					(setq right1 (cdr (assoc 1 dims)))
					(setq H (vl-string-search "*" right1))
					(if
						(/= H nil)
						(progn
							(setq H1 (substr (cdr (assoc 1 dims)) (1+ H) 1))
							(setq H2 (cons 1 (vl-string-subst "\\H1x;\\S*^;}" H1 right1)))
							(setq dims (subst H2 (assoc 1 dims) dims))
							(entmod dims)				
						)  ; конец progn
					)	; конец if
				)	; while конец
			)  ; конец progn
		)	; конец if	

; обнуляем переменные
				
		(setq 	dimens_star nil
				i nil
				dims nil
				mleader_star nil
				mlead nil
				right304 nil
				right1 nil
				H nil
				H1 nil
				H2 nil)
__________________
слесарь САПР
Просмотров: 2132
 
Непрочитано 29.04.2014, 12:06
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Совет: приучайте себя подробно комментировать код. Пройдет месяц-другой, сами не разберетесь в нем. Я бы может и помог чем, но без комментариев даже не хочется пробовать.
Вторая сверху гифка: http://howto.memcrab.com/2013/03/2.html
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 29.04.2014, 12:40
#3
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Хорошо постараюсь прокомментировать. А я то думал, что комментарии нужны только новичкам, у профи все уже в голове .
Прокомментирую первое условие, дальше все по аналогии.
Повторю вопрос, как заставить неограниченное число "*************" помещаться в верхний индекс?
У меня получилось только в ед. экземляре.
Код:
[Выделить все]
;|
варианты размеров по dxf коду 1, "*" в одном экземпляре
"<>*"				
""			  		
"<>{\\H1x;\\S*^;}"	
"<>\\S*^;"
"200*"
"200{\\H0.7x;\\S*/;}"
"200{\\H0.7x;\\S*^;}"
"2ghj\\S*^;" 			
"2ghj{\\H0.7x;\\S^*;}"	
"2ghj\\S*^;ghgh"
"<>*hghg"				
"2ghj\\S/*;ghgh"
|;						

;--------------------ОБРАБОТКА РАЗМЕРОВ-----------------------

; создаем набор размеров удовлетворяющим только условию "*\\S*`**", например "2ghj\\S/*;ghgh", остальные виды отсекаем, такие как например "2ghj{\\H0.7x;\\S^*;}"
(setq dimens_star (ssget "_X" '((0 . "DIMENSION") (-4 . "<AND") (1 . "*\\S*`**") (-4 . "<NOT") (1 . "*\\H*x;\\S`**") (-4 . "NOT>") (-4 . "<NOT") (1 . "*\\H*x;\\S*`**") (-4 . "NOT>") (-4 . "AND>"))))
		(if (/= nil dimens_star)			
			(progn
			(setq i -1)
				; извлекаем поочередно каждый размер из набора, 
				(while (< i (1- (sslength dimens_star))) ; условие цикла, где sslength dimens_star - длина набора
					(setq i (1+ i))
					(setq dims (entget (ssname dimens_star i))) ; получаем характеристики размера по dxf кодам
					(setq right1 (cdr (assoc 1 dims))) ; сохраняем правую часть dxf кода 1, где содержится вся инфа, например "2ghj\\S/*;ghgh"
					(setq H (vl-string-search "\\S" right1)) ; ищем "\\S" в только что сохраненной строке, т.е. в например "2ghj\\S/*;ghgh", получаем № символа, т.е. №"j"
					(if
						(/= H nil)
						(progn
							(setq H1 (substr (cdr (assoc 1 dims)) (1+ H) 5)); запоминаем первые 5 символов в строке, т.е. например "\\S/*"
							(setq H2 (cons 1 (vl-string-subst "\\S*^;" H1 right1))) ; меняем "\\S/*" на образец "\\S*^;"
							(setq dims (subst H2 (assoc 1 dims) dims)) ; помещаем вновь сформированную точечную пару в обрабатываемый размер, например (1 . "2ghj\\S*^;ghgh")
							(entmod dims) ; преобразуем размер
						)  ; конец progn
					)	; конец if
				)	; while конец
			)  ; конец progn
		)	; конец if	

; обрабатываем размеры удовлетворяющие условию (1 . "*\\H0.*x;\\S`**") и (1 . "*\\H0.*x;\\S*`*"), например "200{\\H0.7x;\\S*^;}"
(setq dimens_star (ssget "_X" '((0 . "DIMENSION") (-4 . "<OR") (1 . "*\\H0.*x;\\S`**") (1 . "*\\H0.*x;\\S*`**") (-4 . "OR>"))))
		(if (/= nil dimens_star)			
			(progn
			(setq i -1)
				(while (< i (1- (sslength dimens_star)))
					(setq i (1+ i))
					(setq dims (entget (ssname dimens_star i)))
					(setq right1 (cdr (assoc 1 dims)))
					(setq H (vl-string-search "\\H0." right1))
					(if
						(/= H nil)
						(progn
							(setq H1 (substr (cdr (assoc 1 dims)) (1+ H) 13))
							(setq H2 (cons 1 (vl-string-subst "\\H1x;\\S*^;" H1 right1)))
							(setq dims (subst H2 (assoc 1 dims) dims))
							(entmod dims)				
						)  ; конец progn
					)	; конец if
				)	; while конец
			)  ; конец progn
		)	; конец if	
		
; обрабатываем размеры удовлетворяющие условию "*`*" и "*`**", например "200*"
(setq dimens_star (ssget "_X" '((0 . "DIMENSION") (-4 . "<AND") (-4 . "<OR") (1 . "*`**") (-4 . "OR>") (-4 . "<NOT") (1 . "*\\H*x;\\S*") (-4 . "NOT>") (-4 . "<NOT") (1 . "*\\S*") (-4 . "NOT>") (-4 . "AND>"))))
(if (/= nil dimens_star)			
			(progn
			(setq i -1)
				(while (< i (1- (sslength dimens_star)))
					(setq i (1+ i))
					(setq dims (entget (ssname dimens_star i)))
					(setq right1 (cdr (assoc 1 dims)))
					(setq H (vl-string-search "*" right1))
					(if
						(/= H nil)
						(progn
							(setq H1 (substr (cdr (assoc 1 dims)) (1+ H) 1))
							(setq H2 (cons 1 (vl-string-subst "\\H1x;\\S*^;}" H1 right1)))
							(setq dims (subst H2 (assoc 1 dims) dims))
							(entmod dims)				
						)  ; конец progn
					)	; конец if
				)	; while конец
			)  ; конец progn
		)	; конец if	

; обнуляем переменные
				
		(setq 	dimens_star nil
				i nil
				dims nil
				right1 nil
				H nil
				H1 nil
				H2 nil)
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 29.04.2014, 13:27
#4
kacugu

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


Offtop: Извиняюсь за оффтоп, но почему нельзя сразу добавить в настройках стиля размера суффикс {\H0.7x;\S*^;}?
kacugu вне форума  
 
Непрочитано 29.04.2014, 13:27
#5
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Уже лучше
Еще нужен пример файла с размерами, на которых можно потестировать.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 29.04.2014, 14:09
#6
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Не тестируя, не на чем после (setq right1 (cdr (assoc 1 dims))) и вместо if
Код:
[Выделить все]
 (setq H1 "")
(while (setq H (vl-string-search "\\S" rigth1))
  (setq H1     (strcat H1 (substr rigth1 1 H) "\\S*^") ;сохраняем все символы до первого вхождения в строке
        rigth1 (substr rigth1 (+ 6 H)))) ; запоминаем остаток строки
(entmod (subst (cons 1 (strcat H1 rigth1)) (assoc 1 dims) dims)) ; помещаем вновь сформированную точечную пару в обрабатываемый размер
ciril вне форума  
 
Автор темы   Непрочитано 29.04.2014, 14:11
#7
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Уж слишком большое разнообразие получается кодов. Охватить все на моем уровне не представляется возможным.
kacugu,
так ведь все размеры будут иметь этот суффикс, нужно делать 2 разм. стиля, один с суффиксом, один без, люди будут путаться.
А так нажал кнопку и все снежинки в чертеже приобрели верхний индекс. Если получится в размерах, "*" хочу менять и в выносках и в тексте.
Пример сохранен в 2007й версии.

----- добавлено через ~15 мин. -----
ciril, спасибо за помощь, правда не работает, но я понял смысл, ты обрабатывашь выражение "*\\S*`**" столько раз сколько оно встречается, да этой частный случай.
А еще могут быть случаи когда в строке имеется и "*\\S*`**" и "*`**" и "*\\H0.*x;\\S`**" и еще много чего.
Например размер в котором имеется и просто "*" и она же и в дробной части и как допуск, т.е. в размере много разных "*".
Вложения
Тип файла: dwg
DWG 2007
для форума.dwg (186.2 Кб, 897 просмотров)
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 29.04.2014, 14:32
#8
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


да не за что, я там в имени переменной ошибся
Код:
[Выделить все]
 (and (ssget "_X"
              '((0 . "DIMENSION")
                (-4 . "<AND")
                (1 . "*\\S*`**")
                (-4 . "<NOT")
                (1 . "*\\H*x;\\S`**")
                (-4 . "NOT>")
                (-4 . "<NOT")
                (1 . "*\\H*x;\\S*`**")
                (-4 . "NOT>")
                (-4 . "AND>")))
       (repeat (setq i (sslength dimens_star)) ;повторить раз = длине набора 
         (setq right1 (cdr (assoc 1 (setq dims (entget (ssname dimens_star (setq i (1- i))))))) ; извлекаем примитив, пару, сохраняем правую часть dxf кода 1, где содержится вся инфа, например "2ghj\\S/*;ghgh"
               H1     "")
         (and (while (setq H (vl-string-search "\\S/*;" right1))
                (setq H1     (strcat H1 (substr right1 1 H) "\\S*^;") ;сохраняем все символы до первого вхождения в строке
                      right1 (substr right1 (+ 6 H)))) ; запоминаем остаток строки
              (entmod (subst (cons 1 (strcat H1 right1)) (assoc 1 dims) dims)))))
ciril вне форума  
 
Автор темы   Непрочитано 29.04.2014, 14:52
#9
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


ciril, к сожалению ничего не происходит, но смысл я уловил.
твой код меняет размер изображенный на рисунке "Размер.2",
а мне нужно чтобы еще он работал и с рисунком "Размер.1"
Изображения
Тип файла: jpg Размер1.jpg (24.4 Кб, 171 просмотров)
Тип файла: jpg Размер2.jpg (18.4 Кб, 184 просмотров)
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 29.04.2014, 15:01
#10
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Он меняет все * с надчеркиванием на * в верхнем индексе. А надо что, менять вообще все * на * в верхнем индексе?
ciril вне форума  
 
Автор темы   Непрочитано 29.04.2014, 15:06
#11
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


ciril,
да, чтобы все абсолютно * приобрели верхний индекс.
Других снежинок не должно быть в чертеже.
Т.е. на примере, верхний размер должен превратиться в нижний при срабатывании лиспа.
Возможно такое?
Изображения
Тип файла: jpg Размер3.jpg (49.6 Кб, 182 просмотров)
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 29.04.2014, 15:52
#12
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


Код:
[Выделить все]
 (and (setq dimens_star (ssget "_X" '((0 . "DIMENSION"))))
       (repeat (setq i (sslength dimens_star)) ; извлекаем поочередно каждый размер из набора
         (setq right1 (cdr (assoc 1 (setq dims (entget (ssname dimens_star (setq i (1- i)))))))
               H1     "")
         (foreach auxi  '("\\S/*;" "\\S*^;" "\\S*/;" "\\S^*;" "*")
           (and (while (setq H (vl-string-search auxi right1))
                  (setq H1     (strcat H1 (substr right1 1 H) "{EQ}") ;сохраняем все символы до первого вхождения в строке
                        right1 (substr right1 (+ 1 (strlen auxi) H)))) ; запоминаем остаток строки
                (setq right1 (strcat H1 right1)
                      H1     "")))
         (and (while (setq H (vl-string-search "{EQ}" right1))
                (setq H1     (strcat H1 (substr right1 1 H) "\\S*^;")
                      right1 (substr right1 (+ 5 H))))
              (entmod (subst (cons 1 (strcat H1 right1)) (assoc 1 dims) dims)))))
посмотри, все комбинации, что были в примере - меняет, если будут другие - добавляй в список значений foreach.

Последний раз редактировалось ciril, 29.04.2014 в 16:20.
ciril вне форума  
 
Автор темы   Непрочитано 05.05.2014, 14:36
#13
Fedorino

автоматизация и организация черчения
 
Регистрация: 17.11.2009
Sterlitamak
Сообщений: 135


Добрый день! Пишу запоздалый ответ, но все же возможно для кого-то тема имеет актуальность.
Спасибо ciril, за подсказанные идеи.
Снова долго сидел над лиспом, родил некий полуфабрикат, который в большинстве случаев удовлетворяет моим потребностям.
Особо экзотические случаи расположения символа "*" пропустил, запретив работу лиспа, а в большинстве стандартных случаев - работает.
Так и не смог добиться работы лиспа когда код dxf допустим такой (1 . "gfgfg<>\\S*****,\\/\\/ffy*^*f\\/*22;")
Выкладываю сие творение, не судите строго, не программист, но думаю ведь приятно нажатием одной кнопки помещать во всех размерах символ "*" в верхний индекс.
Возможно, кто-то найдет ошибки и(или) оптимизирует код.
Код:
[Выделить все]
(defun dim_star_lvr (/ dimens_star i dims all_old auxi auxi2 auxi3 le H1 H3 prt all_old_lst)
			;вариант наличия в dxf коде 1 ("\\S*#*;" "\\S*^*;" "\\S*/*;" "\\S/*;" "\\S*/;" "\\S^*;" "\\S#*;" "\\S*#;" "\\S*~;" "\\S~*;")
(setq dimens_star (ssget "_X" '((0 . "DIMENSION") (1 . "*`**"))))
	(if (/= nil dimens_star)			
		(progn
			(setq i -1)
				; извлекаем поочередно каждый размер из набора
				(repeat (sslength dimens_star)
					(setq i (1+ i))
					(setq dims (entget (ssname dimens_star i))) ;получаем характеристики размера по dxf кодам
					(setq all_old (cdr (assoc 1 dims))) ; сохраняем правую часть dxf кода 1, где содержится вся инфа, например "2ghj\\S/*;ghgh"
					; поочередно подставляем в выражение ниже элементы списка
					(foreach auxi '("\\S*#*;" "\\S*^*;" "\\S*/*;" "\\S/*;" "\\S*/;" "\\S^*;" "\\S#*;" "\\S*#;" "\\S*~;" "\\S~*;")
					;ищем поочереди каждый из элем. списка auxi в только что сохраненной строке "<>*{\\H0.7x;\\S/*;\\S*/;\\H1.4286x;вв}", получаем результат не nil \\S/*; = 11
						(while (/= nil (vl-string-search auxi all_old))
							(setq all_old (vl-string-subst "\\S*^;" auxi all_old)) ; меняем "\\S/*" на образец "\\S*^;"					
						)  ; end while
					) ; end foreach
					(setq all_old_lst (cons 1 all_old)) ; образуем точечную пару
					(setq dims (subst all_old_lst (assoc 1 dims) dims)) ; помещаем вновь сформированную точечную пару в обрабатываемый размер, например (1 . "2ghj\\S*^;ghgh")
					(entmod dims) ; преобразуем размер
				) ; end repeat
		) ; end progn
	) ; end if
	
			;вариант наличия в dxf коде 1 ("\\H0." "\\H1." "\\H1" "\\H2" "\\H3")
(setq dimens_star (ssget "_X" '((0 . "DIMENSION") (1 . "*`**"))))
	(if (/= nil dimens_star)			
		(progn
			(setq i -1)	
					; извлекаем поочередно каждый размер из набора
				(repeat (sslength dimens_star)
					(setq i (1+ i))
					(setq dims (entget (ssname dimens_star i))) ;получаем характеристики размера по dxf кодам
					(setq all_old (cdr (assoc 1 dims))) ; сохраняем правую часть dxf кода 1, где содержится вся инфа, например "2ghj\\S/*;ghgh"
					(foreach auxi2 '("\\H0." "\\H1." "\\H1" "\\H2" "\\H3")
					;ищем поочереди каждый из элем. списка auxi в только что сохраненной строке "<>*{\\H0.7x;\\S/*;\\S*/;\\H1.4286x;вв}", получаем результат не nil \\S/*; = 11
						(while (/= nil (setq H1 (vl-string-search auxi2 all_old)))
							(setq le (strlen auxi2)); вычисляем длину текущего элемента списка
							(setq H3 (vl-string-search "x;" all_old (+ H1 le))) ; ищем "x;" в только что сохраненной строке, т.е. в например "<>*{\\H0.7x;\\S/*;\\S*/;\\H1.4286x;вв}", получаем № символа, т.е. №";"
							(if (< H1 H3); добавить если H1<H3 то
								(progn
									(setq prt (substr all_old (1+ H1) (- (+ 2 H3) H1))) ; выделяем подстроку начинающуюся с "\\H" до "x;", (- H3 H1) кол-во выделяемых символов, где 2- кол-во символов "x;"
									(setq all_old (vl-string-subst "" prt all_old)); замена "\\H" до "x;" на "" в строке all_old
									(setq all_old_lst (cons 1 all_old)) ; образуем точечную пару
									(setq dims (subst all_old_lst (assoc 1 dims) dims)) ; помещаем вновь сформированную точечную пару в обрабатываемый размер, например (1 . "2ghj\\S*^;ghgh")
									(entmod dims) ; преобразуем размер
								) ; end progn
							) ; end if				
						) ; end while
					) ; end foreach					
				) ; end repeat
		) ; end progn
	) ; end if				
				
			;вариант наличия в dxf коде 1  "{" "}"
			(setq dimens_star (ssget "_X" '((0 . "DIMENSION") (1 . "*{*`**}*"))))
	(if (/= nil dimens_star)			
		(progn
			(setq i -1)	
					; извлекаем поочередно каждый размер из набора
				(repeat (sslength dimens_star)
					(setq i (1+ i))
					(setq dims (entget (ssname dimens_star i))) ;получаем характеристики размера по dxf кодам
					(setq all_old (cdr (assoc 1 dims))) ; сохраняем правую часть dxf кода 1, где содержится вся инфа, например "2ghj\\S/*;ghgh"
					; поочередно подставляем в выражение ниже элементы списка
					(foreach auxi3 '("{" "}")
					;ищем поочереди каждый из элем. списка auxi в только что сохраненной строке "<>*{\\H0.7x;\\S/*;\\S*/;\\H1.4286x;вв}", получаем результат не nil \\S/*; = 11
						(while (/= nil (vl-string-search auxi3 all_old))
							(setq all_old (vl-string-subst "" auxi3 all_old)) ; меняем скобки на ""					
						)  ; запоминаем остаток строки, (strlen auxi) - длина элемента auxi
					) ; end foreach
					(setq all_old_lst (cons 1 all_old)) ; образуем точечную пару
					(setq dims (subst all_old_lst (assoc 1 dims) dims)) ; помещаем вновь сформированную точечную пару в обрабатываемый размер, например (1 . "2ghj\\S*^;ghgh")
					(entmod dims) ; преобразуем размер
				) ; end repeat
		) ; end progn
	) ; end if
	
			;вариант наличия в dxf коде 1 "*"
			(setq dimens_star (ssget "_X" '((0 . "DIMENSION") (-4 . "<AND") (1 . "*`**") (-4 . "<NOT") (1 . "*\\S`*`**") (-4 . "NOT>") (-4 . "<NOT") (1 . "*\\S^`*`**") (-4 . "NOT>") (-4 . "AND>"))))
	(if (/= nil dimens_star)			
		(progn
			(setq i -1)	
					; извлекаем поочередно каждый размер из набора
				(repeat (sslength dimens_star)
					(setq i (1+ i))
					(setq dims (entget (ssname dimens_star i))) ;получаем характеристики размера по dxf кодам
					(setq all_old (cdr (assoc 1 dims))) ; сохраняем правую часть dxf кода 1, где содержится вся инфа, например "2ghj\\S/*;ghgh"
					(while (/= nil (vl-string-search "\\S*^;" all_old)) ; ищем заданную последовательность символов, получаем число
							(setq all_old (vl-string-subst "{EQ}" "\\S*^;" all_old)) ; меняем "\\S*^;" на "{EQ}"
					) ; end while
					(while (/= nil (vl-string-search "*" all_old)) ; ищем заданную последовательность символов, получаем число
							(setq all_old (vl-string-subst "{EQ}" "*" all_old)) ; меняем "*" на "{EQ}"
					) ; end while		
					(while (/= nil (vl-string-search "{EQ}" all_old)) ; ищем заданную последовательность символов, получаем число
							(setq all_old (vl-string-subst "\\S*^;" "{EQ}" all_old)) ; меняем "*" на "{EQ}"
					) ; end while
					(setq all_old_lst (cons 1 all_old)) ; образуем точечную пару
					(setq dims (subst all_old_lst (assoc 1 dims) dims)) ; помещаем вновь сформированную точечную пару в обрабатываемый размер, например (1 . "2ghj\\S*^;ghgh")
					(entmod dims) ; преобразуем размер				
				) ; end repeat
		) ; end progn
	) ; end if	
	(terpri)	
) ; end defun
__________________
слесарь САПР
Fedorino вне форума  
 
Непрочитано 05.05.2014, 15:29
#14
ciril

САПР
 
Регистрация: 29.09.2011
СПб
Сообщений: 283


По поводу оптимизации тяжело что-то с уверенностью сказать, так как неизвестно какой последовательностью машинных команд интерпретируется каждая функция лиспа, а все остальное - дело вкуса и стиля программирования.
Лично я бы убрал присвоение счетчику значение -1 (setq i -1) и включил его в repeat, типа
Код:
[Выделить все]
 
					; извлекаем поочередно каждый размер из набора
				(repeat (setq i (sslength dimens_star))
					(setq dims (entget (ssname dimens_star (setq i (1- i))))) ...)
не использовал бы конструкции типа (while (/= nil (выражение))), а вместо них (while (not (выражение))) и пообъединял бы setq Offtop: и вообще написал бы все по-другому но это дело вкуса
ciril вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Lisp. Установка символа "*" в верхний индекс в размерах.

Опции темы Поиск в этой теме
Поиск в этой теме:

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