LISP. Операции над множеством чисел в тексте сразу
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Операции над множеством чисел в тексте сразу

LISP. Операции над множеством чисел в тексте сразу

Ответ
Поиск в этой теме
Непрочитано 26.08.2013, 20:39 #1
LISP. Операции над множеством чисел в тексте сразу
Marney
 
Регистрация: 21.05.2010
Сообщений: 46

Здравствуйте.
Есть ли такой код, чтобы взять с десяток чисел из одной строчки (забитых в отдельные текстовые объекты), взять десяток из другой строчки, выбрать операцию, допустим вычитания, и в результате получить третью строчку чисел с разностью каждого числа?
Операции производятся отдельно для каждой пары чисел. Пара чисел выбирается по совпадению координаты x.
Или попроще, чтобы можно было к множеству чисел в тексте применить определенную формулу. Есть INC.lsp. Может он может помочь?
Код:
[Выделить все]
; Increments the first postive number in a TEXT string by the given increment
;;; ==========================================================================
;;;  Program: INC.LSP  ver 1.22
;;;                                                                         
;;;  Purpose: Increments the first postive number in a TEXT string by the given increment
;;;
;;;  Syntax:  INC
;;;
;;;           Resolutions                                                   
;;;           P.O. Box 1265                                                 
;;;           Sumner WA 98390-0250                                          
;;;           206-845-2200                                                  
;;;
;;;  Date:             5/10/95
;;;
;;;  Revisions:  ver 1.1  8/7/95    Added support for REALs
;;;
;;;  Revisions:  ver 1.2  12/12/95  Added support for Stations
;;;
;;;  Revisions:  ver 1.21 12/14/95  Fixed problem with decimal places
;;;
;;;  Revisions:  ver 1.22 1/16/96   Fixed problem with decimal places when
;;;                                 number is preceeded by alpha characters.
;;; ==========================================================================
(defun C:INC (/ ; Functions & Variables
    ; Functions
            val put r_fill getdp at
    ; Variables
            ss inc i l e j k ascii_nr string newstring nr count dp1 dp
            OldStation dp_pos end_pos
    )
;=============================
; Entity assoc list utilities
;-----------------------------
(defun val (nr e) (cdr (assoc nr e)))
(defun put (x nr e)(subst (cons nr x) (assoc nr e) e))
;;; ==========================================================================
;;; Function: AT
;;; Purpose : Returns the position of the first occurance of a string
;;;           or NIL if not found
;;; Params  : string        String to search
;;;               char            String to locate
;;;
;;; Uses    : 
;;; --------------------------------------------------------------------------
    (defun at (string char / i len clen)
        (if string
            (progn
                (setq i 1 len (strlen string) clen (strlen char))
                (while (and (<= i len) (/= (substr string i clen) char))
                    (setq i (1+ i))
                )
                (if (> i len)
                    (setq i nil)
                )
                (eval i)
            )
        )
    )
;;; ==========================================================================
;;; Function: R_FILL <string> <len>
;;; Purpose : Returns a string filled with spaces on the right
;;;
;;; Params  : string        String to fill
;;;           len             String length
;;;
;;; --------------------------------------------------------------------------
(defun r_fill (s len / space i)
   (setq space "" i (- len (strlen s)))
   (if (> i 0)
       (substr (strcat s (repeat i (setq space (strcat space " ")))) 1 len)
       s
   )
)
;; Return number of decimal places of a REAL
(defun getdp (nr / n)
    (setq n 0 nr (abs nr))
    (while (null (equal (fix (+ nr 0.5)) nr 0.000001))
        (setq n (1+ n))
        (setq nr (* nr 10))
    )
    n
)
;;; ==========================================================================
    ;-- Start C:TEXTINC
    (setvar "CMDECHO" 0)
    (princ "\nSelect TEXT containing NUMBERS to increment.")
    (if (and
            (setq ss (ssget '((0 . "*TEXT"))))
            (setq inc (getreal "\nIncrement: "))
            (/= inc 0)
        )
        (progn
            (setq i 0 l (sslength ss) count 0)
            (while (< i l)
                (setq e (entget (ssname ss i)))
                (setq string (val 1 e))
                ;; --- Check for an number ---
                (if (and 
                        (wcmatch string "*[0-9]*")       ; Find an INT
;                        (wcmatch string "~*#.#*")        ; No REALs
                        (wcmatch string "~*%%d*")        ; No BEARINGS
                    )
                    (progn
                        (setq count (1+ count))
                        (setq j 1 k (strlen string))
                        (if (wcmatch string "*#+##*")  ; Check for Station
                            (setq
                                OldStation string
                                j (at string "+")
                                string (strcat
                                        (substr string 1 (1- j))
                                        (substr string (1+ j))
                                    )
                                j 1
                                k (strlen string)
                            )
                        )
                        ;; --- Step though the string looking
                        ;; --- for the first int ---
                        (while (<= j k)
                            (setq ascii_nr (ascii (substr string j 1)))
                            (if (and (>= ascii_nr 48)(<= ascii_nr 57))
                                (progn
                                    (setq end_pos j)
                                    (while (or (= ascii_nr 46)(and (>= ascii_nr 48)(<= ascii_nr 57)))
                                        (setq
                                            end_pos (1+ end_pos)
                                            ascii_nr (ascii (substr string end_pos 1))
                                        )
                                    )
                                    (setq
                                        dp_pos (at (substr string j) ".")
                                        nr    (atof (substr string j))
                                        dp1 (if dp_pos (- end_pos dp_pos j) 0)
                                        dp (max dp1 (getdp inc))
                                        nr (+ nr inc)
                                        newstring (strcat 
                                            (substr string 1 (1- j))
                                            (rtos nr 2 dp)
                                            (substr string end_pos)
                                        )
                                        j k     ;; Now exit
                                    )
                                )
                            )
                            (setq j (1+ j))
                        )
                        ;; If station then insert the "+"
                        (if OldStation
                            (progn
                                (setq string Oldstation)
                                (if (setq j (at newstring "."))
                                    (setq j (- j 3))
                                    (setq j (- (strlen newstring) 2))
                                )
                                (setq newstring
                                    (strcat (substr newstring 1 j) "+"
                                            (substr newstring (1+ j))
                                    )
                                )
                            )
                        )
                        ;; --- Echo changes to screen ---
                        (princ (strcat "\n" (r_fill string 12) "-->  " newstring))
                        ;; --- Update the TEXT entity ---
                        (entmod (put newstring 1 e))
                    )
                    (princ (strcat "\nNo Numeric value: " string))
                )
                (setq i (1+ i))
            )
            (princ (strcat "\n" (itoa count) " TEXT number\(s\) incremented."))
        )
        (princ "\nTEXTINC cancelled.")
    )
    (princ)
)
(princ "\nTEXTINC.LSP v1.22")
(princ)
Просмотров: 2009
 
Непрочитано 27.08.2013, 08:23
2 | #2
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


Marodorg, может подойдет это
__________________
cadtools
TararykovDG вне форума  
 
Автор темы   Непрочитано 28.08.2013, 18:58
#3
Marney


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


Огромное спасибо. То, что нужно!
Marney вне форума  
 
Непрочитано 03.10.2013, 10:46
#4
moonalien23


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


хорошая вещь, спасибо большое
один вопрос (в справке ответа не нашел), возможно ли расположение результирущих данных непосредственно под/над операторами/напротив операторов?
см.вложенный файл (извиняюсь за качество скрина):

результаты белым отображены, операторы голубым и желтым (вычетание из верхней строки нижней), результаты располагаются по умолчанию - с расстоянием между собой 20. как сделать, чтобы результаты располагались непосредственно под операторами, возможно ли это?
в любом случае спасибо, сам недавно задумывался о чем то подобном, но лиспом, к сожалению, не владею
moonalien23 вне форума  
 
Непрочитано 03.10.2013, 13:27
#5
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 575


moonalien23, расположить результат непосредственно под исходными данными нельзя, но можно задать другое расстояние отличное от 20, также можно задать угол поворота текста, в справке это описано. При запросе “Укажите верхний левый угол ячейки таблицы, с которой начать заполнение или [0 - параметры таблицы/1 - параметры текста]: ” можно с помощью контекстного меню или, введя в ком. строке с клавиатуры 0 или 1, выбрать пункт "параметры таблицы" - для настройки расстояний между текстом или "параметры текста" для настройки текста.
__________________
cadtools
TararykovDG вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP. Операции над множеством чисел в тексте сразу



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Произведение нескольких чисел на чертеже? Нужен Lisp по типу sum.lsp UnAtom LISP 2 24.11.2010 20:18
Точность чисел возращаемых LISP ActiveX [N.S] LISP 20 28.03.2008 13:59
Lisp для редактирования нескольких мтекстов сразу Red Nova LISP 5 17.03.2008 21:28
Генератор случайных чисел на Lisp Cleper Прочее. Программное обеспечение 22 13.08.2006 19:03