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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите изменить макрос, чтобы он проставлял знак "+" на положительных значениях

Помогите изменить макрос, чтобы он проставлял знак "+" на положительных значениях

Ответ
Поиск в этой теме
Непрочитано 02.11.2009, 11:06 #1
Помогите изменить макрос, чтобы он проставлял знак "+" на положительных значениях
Малявка
 
Егорьевск Моск.обл.
Регистрация: 28.02.2007
Сообщений: 206

Здравствуйте!
Пользуюсь макросом, меняющем в случайном порядке тексты - числа в указанных допусках. Обычно применяю его к числу "0" (ноль). Помогите изменить макрос, чтобы он не только ставил знак "-" при отрицательных значениях, но и знак "+" при положительных.
Спасибо. Работаю в AutoCAD 2008 Rus.

Код:
[Выделить все]
;Редактирует числа случайным образом. Спрашивает разброс относительно существующего числа
;и редактирует на плюс или минус. С последующим "озеленением", дабы не перепутать.
(defun vk_RandNum (/ modulus multiplier increment random)
(if (not *seed*)
(setq *seed* (getvar "DATE"))
)
(setq modulus 65536
multiplier 25173
increment 13849
*seed* (rem (+ (* multiplier *seed*) increment) modulus)
random (/ *seed* modulus)
)
)
(defun c:tr2 (/ From To Diff SS Ent +Sign Num lst i)
(initget 5)
(setq To (getint "Max величина разброса значений: "))
(setq From (- 0 To))
(setq +Sign (if (< From 0)
"+"
""
)
)
(setq Diff (- To From))
(while (setq SS (ssget "_:S:L" (list (cons 0 "TEXT"))))
(setq Num (- To (atoi (rtos (* Diff (vk_RandNum)) 2 0))))
(setq i '-1)
(while (< (setq i (1+ i))(sslength SS))
  (setq Ent (entget (ssname SS i)))
  (setq Ent
(if (assoc 62 Ent)
  (subst
    (cons 62 3) ;_ 3 — зеленый цвет
    (assoc 62 Ent)
    Ent
    )
    (append Ent
    (list
      (cons 62 3) ;_ 3 — зеленый цвет
      )
    )

  )
      )
(entmod
(subst
(cons 1
      (itoa (+ (atoi(cdr(assoc 1 Ent))) Num))
)
(assoc 1 Ent)
Ent
)
)
  )
)
(princ)
)

Последний раз редактировалось Кулик Алексей aka kpblc, 02.11.2009 в 11:39.
Просмотров: 5341
 
Непрочитано 02.11.2009, 12:07
#2
Do$

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


Код:
[Выделить все]
;_ Редактирует числа случайным образом. Спрашивает разброс относительно существующего числа
;_ и редактирует на плюс или минус. С последующим "озеленением", дабы не перепутать.
(defun vk_RandNum (/ modulus multiplier increment random)
  (if (not *seed*)
    (setq *seed* (getvar "DATE"))
  ) ;_ end of if
  (setq	modulus	   65536
	multiplier 25173
	increment  13849
	*seed*	   (rem (+ (* multiplier *seed*) increment) modulus)
	random	   (/ *seed* modulus)
  ) ;_ end of setq
) ;_ end of defun

(defun c:tr2 (/ From To Diff SS Ent +Sign Num lst i con)
  (initget 5)
  (setq To (getint "Max величина разброса значений: "))
  (setq From (- 0 To))
  (setq	+Sign (if (< From 0)
		"+"
		""
	      ) ;_ end of if
  ) ;_ end of setq
  (setq Diff (- To From))
  (while (setq SS (ssget "_:S:L" (list (cons 0 "TEXT"))))
    (setq Num (- To (atoi (rtos (* Diff (vk_RandNum)) 2 0))))
    (setq i '-1)
    (while (< (setq i (1+ i)) (sslength SS))
      (setq Ent (entget (ssname SS i)))
      (setq Ent
	     (if (assoc 62 Ent)
	       (subst
		 (cons 62 3) ;_ 3 — зеленый цвет
		 (assoc 62 Ent)
		 Ent
	       ) ;_ end of subst
	       (append Ent
		       (list
			 (cons 62 3) ;_ 3 — зеленый цвет
		       ) ;_ end of list
	       ) ;_ end of append
	     ) ;_ end of if
      ) ;_ end of setq
      (entmod
	(subst
	  (cons	1
		(if (> (setq con (+ (atoi (cdr (assoc 1 Ent))) Num)) 0)
		  (strcat "+" (itoa con))
		  (itoa con)
		) ;_ end of if	  
           ) ;_ end of cons
	  (assoc 1 Ent)
	  Ent
	) ;_ end of subst
      ) ;_ end of entmod
    ) ;_ end of while
  ) ;_ end of while
  (princ)
) ;_ end of defun
Do$ вне форума  
 
Автор темы   Непрочитано 02.11.2009, 13:05
#3
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


Какая прелесть! Работает! Спасибо огромное.
А еще (но я без этого проживу) если можно, хорошо бы устранить такую ботву: приходится нажимать поочередно на каждую цифру. Если выбрать все числа стадом, то они изменятся на одну величину, а мне хотелось бы, чтобы были разные числа.
Малявка вне форума  
 
Непрочитано 02.11.2009, 13:21
1 | #4
Do$

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


Как то так:
Код:
[Выделить все]
 ;_ Редактирует числа случайным образом. Спрашивает разброс относительно существующего числа
 ;_ и редактирует на плюс или минус. С последующим "озеленением", дабы не перепутать.


(defun c:tr2 (/ SS To Ent i con vk_RandNum)

  (defun vk_RandNum (/ modulus multiplier increment random)
    (if	(not *seed*)
      (setq *seed* (getvar "DATE"))
    ) ;_ end of if
    (setq modulus    65536
	  multiplier 25173
	  increment  13849
	  *seed*     (rem (+ (* multiplier *seed*) increment) modulus)
	  random     (/ *seed* modulus)
    ) ;_ end of setq
  ) ;_ end of defun



  (vl-load-com)
  (vla-StartUndoMark
    (vla-get-ActiveDocument (vlax-get-acad-object))
  ) ;_ end of vla-StartUndoMark
  (vl-catch-all-apply
    '(lambda ()
       (initget 5)
       (setq To (getint "Max величина разброса значений: "))
       (while (setq SS (ssget "_:S:L" (list (cons 0 "TEXT"))))
	 (setq i '-1)
	 (while	(< (setq i (1+ i)) (sslength SS))
	   (setq Ent (entget (ssname SS i)))
	   (setq Ent
		  (if (assoc 62 Ent)
		    (subst
		      (cons 62 3) ;_ 3 — зеленый цвет
		      (assoc 62 Ent)
		      Ent
		    ) ;_ end of subst
		    (append Ent
			    (list
			      (cons 62 3) ;_ 3 — зеленый цвет
			    ) ;_ end of list
		    ) ;_ end of append
		  ) ;_ end of if
	   ) ;_ end of setq
	   (entmod
	     (subst
	       (cons 1
		     (if (> (setq con
				   (+ (atoi (cdr (assoc 1 Ent)))
				      (- To
					 (atoi
					   (rtos (* (- To (- 0 To)) (vk_RandNum)) 2 0)
					 ) ;_ end of atoi
				      ) ;_ end of -
				   ) ;_ end of +
			    ) ;_ end of setq
			    0
			 ) ;_ end of >
		       (strcat "+" (itoa con))
		       (itoa con)
		     ) ;_ end of if	  
	       ) ;_ end of cons
	       (assoc 1 Ent)
	       Ent
	     ) ;_ end of subst
	   ) ;_ end of entmod
	 ) ;_ end of while
       ) ;_ end of while
     ) ;_ end of lambda
  ) ;_ end of vl-catch-all-apply
  (vla-EndUndoMark
    (vla-get-ActiveDocument (vlax-get-acad-object))
  ) ;_ end of vla-EndUndoMark
  (princ)
) ;_ end of defun
Do$ вне форума  
 
Автор темы   Непрочитано 02.11.2009, 13:28
#5
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


Огромное спасибо! Работает. Чмоки в разные приятные места :-)
Малявка вне форума  
 
Автор темы   Непрочитано 15.06.2010, 19:06
#6
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


Здравствуйте! Хочу продолжить тему и попросить мастеров ЛИСПа точно так же переделать другой макрос. Хотелось бы, чтобы знаки "+" реально проставлялись бы (как написано в комментариях), потому что у меня они не проставляются. И чтобы можно было выделять примитивы "стадом", а не только по одному. Макрос ниже.



Код:
[Выделить все]
;Расставляешь текст в тех местах где он тебе нужен... 
;Например я ставлю все нули. Запускаешь лисп. Он спрашивает сначала минимальное число,
; потом максимальное. И щелкаешь на свой текст — он волшебным образом
; превращается в случайное число.
;Если вводишь диапазон чисел со знаками, то программа автоматом подставляет
; знаки + и -. Если без знаков, то результат тоже будет без знаков.
;плюс ко всему, макрос "озеленяет" отредактированные числа, дабы не перепутать.
(defun vk_RandNum (/ modulus multiplier increment random)
(if (not *seed*)
(setq *seed* (getvar "DATE"))
)
(setq modulus 65536
multiplier 25173
increment 13849
*seed* (rem (+ (* multiplier *seed*) increment) modulus)
random (/ *seed* modulus)
)
)
(defun c:tr (/ From To Diff SS Ent +Sign Num)
(initget 0)
(setq From (getint "From: "))
(while (progn (initget 0) (not (> (setq To (getint "To: ")) From)))
)
(setq +Sign (if (< From 0)
"+"
""
)
)
(setq Diff (- To From))
(while (setq SS (ssget "_:S:E:L" (list (cons 0 "TEXT"))))
(setq Num (- To (atoi (rtos (* Diff (vk_RandNum)) 2 0))))
(setq Ent (entget (ssname SS 0)) SS nil)
(setq Ent
(if (assoc 62 Ent)
  (subst
    (cons 62 3) ;_ 3 — зеленый цвет
    (assoc 62 Ent)
    Ent
    )
    (append Ent
    (list
      (cons 62 3) ;_ 3 — зеленый цвет
      )
    )

  )
      )
(entmod
(subst
(cons 1
(if (<= Num 0)
(itoa Num)
(strcat +Sign (itoa Num))
)
)
(assoc 1 Ent)
Ent
)
)
)
(princ)
)
Большое спасибо.
p.s. работаю в AutoCAD 2008 RUS/
Малявка вне форума  
 
Непрочитано 16.06.2010, 08:53
1 | #7
Do$

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


Пробуйте:
Код:
[Выделить все]
;;;Расставляешь текст в тех местах где он тебе нужен... 
;;;Например я ставлю все нули. Запускаешь лисп. Он спрашивает сначала минимальное число,
;;; потом максимальное. И щелкаешь на свой текст — он волшебным образом
;;; превращается в случайное число.
;;; Если вводишь диапазон чисел со знаками, то программа автоматом подставляет
;;; знаки + и -. Если без знаков, то результат тоже будет без знаков.
;;;плюс ко всему, макрос "озеленяет" отредактированные числа, дабы не перепутать.
(defun c:tr (/ from to diff ss ent +sign num vk_randnum do$-ss-to-list)

  (defun do$-ss-to-list (ss / i lst)
    ;;Преобразует набор в ename-список объектов
    (setq i (sslength ss))
    (while (not (minusp (setq i (1- i))))
      (setq lst (cons (ssname ss i) lst))
    ) ;_ end of while
    lst
  ) ;_ end of defun

  (defun vk_randnum (/ modulus multiplier increment random)
    (if (not *seed*)
      (setq *seed* (getvar "date"))
    ) ;_ end of if
    (setq modulus    65536
   multiplier 25173
   increment  13849
   *seed*     (rem (+ (* multiplier *seed*) increment) modulus)
   random     (/ *seed* modulus)
    ) ;_ end of setq
  ) ;_ end of defun

  (vl-load-com)
  (vla-StartUndoMark
    (vla-get-ActiveDocument (vlax-get-acad-object))
  ) ;_ end of vla-StartUndoMark
  (vl-catch-all-apply
    '(lambda ()
       (while
  (not (<
  (setq from
         (progn
    (initget 1)
    (getint (if (= (getvar "syscodepage") "ANSI_1251")
       "\nНаименьшее значение (целое число):"
       "\nFrom (integer only): "
     ) ;_ end of if
    ) ;_ end of getint
         ) ;_ end of progn
  ) ;_ end of setq
  (setq to
         (progn
    (initget 1)
    (getint (if (= (getvar "syscodepage") "ANSI_1251")
       "\nНаибольшее значение (целое число):"
       "\nTo: (integer only)"
     ) ;_ end of if
    ) ;_ end of getint
         ) ;_ end of progn
  ) ;_ end of setq
       ) ;_ end of <
  ) ;_ end of not
   (prompt
     (if (= (getvar "syscodepage") "ANSI_1251")
       (strcat
  "Наименьшее="
  (itoa from)
  "; Наибольшее="
  (itoa to)
  ". Неправильно указан диапазон чисел! Наибольшее значение меньше наименьшего."
       ) ;_ end of strcat
       (strcat "From="
        (itoa from)
        "; To="
        (itoa to)
        ". To < From!"
       ) ;_ end of strcat
     ) ;_ end of if
   ) ;_ end of prompt
       ) ;_ end of while
       (setq +sign (if (< from 0)
       "+"
       ""
     ) ;_ end of if
       ) ;_ end of setq
       (setq diff (- to from)
      ss   (progn (prompt (if (= (getvar "syscodepage") "ANSI_1251")
       "\nВыберите тексты:"
       "\nSelect text:"
     ) ;_ end of if
    ) ;_ end of prompt
    (ssget "_:L" (list (cons 0 "TEXT")))
    ) ;_ end of progn
       ) ;_ end of setq
       (foreach ent (do$-ss-to-list ss)
  (setq num (- to (atoi (rtos (* diff (vk_randnum)) 2 0)))
        ent (entget ent)
  ) ;_ end of setq
  (setq ent
  (if (assoc 62 ent)
    (subst
      (cons 62 3) ;_ 3 — зеленый цвет
      (assoc 62 ent)
      ent
    ) ;_ end of subst
    (append ent
     (list
       (cons 62 3) ;_ 3 — зеленый цвет
     ) ;_ end of list
    ) ;_ end of append
  ) ;_ end of if
  ) ;_ end of setq
  (entmod
    (subst
      (cons 1
     (if (<= num 0)
       (itoa num)
       (strcat +sign (itoa num))
     ) ;_ end of if
      ) ;_ end of cons
      (assoc 1 ent)
      ent
    ) ;_ end of subst
  ) ;_ end of entmod
       ) ;_ end of foreach
     ) ;_ end of lambda
  ) ;_ end of vl-catch-all-apply
  (vla-EndUndoMark
    (vla-get-ActiveDocument (vlax-get-acad-object))
  ) ;_ end of vla-StartUndoMark
  (princ)
) ;_ end of defun
Насчет знаков перед числами. Логика исходной программы такая: если наименьшее значение диапазона отрицательное, тогда проставляются знаки, если оба значения положительные - знаки не ставятся. Если же надо, чтобы знаки ставились всегда, тогда нужно заменить вот это:
Код:
[Выделить все]
(setq +sign (if (< from 0)
             "+"
             ""
           ) ;_ end of if
       ) ;_ end of setq
на такое:
Код:
[Выделить все]
(setq +sign "+")

Последний раз редактировалось Do$, 16.06.2010 в 09:01. Причина: Малость подправил
Do$ вне форума  
 
Автор темы   Непрочитано 16.06.2010, 10:35
#8
Малявка


 
Регистрация: 28.02.2007
Егорьевск Моск.обл.
Сообщений: 206


Спасибо, работает!
Чмоки!
Малявка вне форума  
 
Непрочитано 09.01.2011, 13:29
#9
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Искал random чтоб написать программку для составления фиктивных исполнительных схем, наткнулся на эту тему.
Некоторое время пользовался кодами Do$, а недавно для удобства добавил диалог, ну и немного расширил возможности

[IMG]http://i016.***********/1101/d0/5a927fe8e67b.jpg[/IMG]
  1. Программа на выбор изменяет или заменяет, так же на выбор либо значение(объекты: Текст, Мтекст, Размер) либо координаты(объекты: Точка, Круг, Полилиния).
  2. При работе со значениями, доступны такие опции как:
    • проставлять знак "+" у положительных чисел
    • работать только с текстами содержащими числовое значение.
  3. После завершения программы, объекты которые были изменены будут выделены, чтобы у пользователя была возможность пометить изменённые объекты, например другим цветом или перенести на др. слой
  4. При работе со значением, точность(количество знаков после запятой) конечного, устанавливается равная максимальной точности из значений введённых пользователем при указании диапазона

Пример применения:
Increase Size Decrease Size ?????????????????µ?‚?????? (Misrepresent)
http://www.youtube.com/watch?v=hxyQN7qeQ24&hd=1
макрос на кнопку
Код:
[Выделить все]
^C^C^P(if (not C:podgonometriya)(load "Podgon_v1_1"));^Ppodgonometriya;
Вложения
Тип файла: rar Podgon_v1_1.rar (5.1 Кб, 103 просмотров)
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите изменить макрос, чтобы он проставлял знак "+" на положительных значениях



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите изменить вычисления в макросе Малявка Программирование 4 09.10.2009 11:56
Помогите сделать макрос для автокада Sky_cool Программирование 8 17.01.2009 03:04