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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите доработать lisp

Помогите доработать lisp

Ответ
Поиск в этой теме
Непрочитано 01.02.2023, 10:17 #1
Помогите доработать lisp
syrovbiu2018
 
Регистрация: 07.12.2022
Сообщений: 10

Здравствуйте. Есть код, который прибавляет к выбранному числу в виде текста на чертеже заданное число "1"(к примеру). И выводит область печати на принтер.
Мне нужно чтобы к выделенному числу на чертеже прибавлялась "1" и выводилась на печать до тех пор пока число не станет 2900000323230 (начальное 2900000323200).
Желательно записать в переменную конечное число (до которого будет плюсоваться "1" и выводиться на печать. Пробовал подставить команду while (цикл), но автокад до бесконечности плюсовал единички и зависал.
Не знаю как while прописать условие остановки и правильно вставить в код.
За блок печати прошу не ругать.
Памагитииии


Код:
[Выделить все]
(defun c:nj () sel num qsel ent aa tt t1 n nn t2 t3  

;pick an object

(setq sel (ssget '((0 . "text"))))    ;picks text objects
(if (/= sel nil)
 (progn
 (setq num (getint "enter the number of increase or decrease : "))       ; gets number from user
 (setq qsel (sslength sel))            ;counts the number of text objects 
 (setq qsel (- qsel 1))                ;
  (repeat (+ qsel 1)                   ;starts loop of objects
  (setq ent (ssname sel qsel))         ;gets name of first object   
  (setq aa (entget ent))               ;gets info on the object


  (setq tt (assoc 1 aa))                ;gets text info
     (setq t1 (cdr tt))                 ;gets clear text
     (setq n (atoi t1))                 ;translates text into an integer
     
   
 
      (setq nn (+ n num))             ;sets nn as the new number
      (setq t3 (itoa nn))             ;translates number into text
  
  ;makes the switch

  (setq aa                              ;switches the original text (t1) with modified (t3) 
    (subst (cons 1 t3)
     (assoc 1 aa)    
      aa
      )
  )
  (entmod aa)                           ;updates entity
  (entupd ent)
 (setq qsel (- qsel 1))                ;countdown to the next entity
  )


(princ)
(command 
"-Plot 
Н

Предыдущая печать
Canon LBP3010/LBP3018/LBP3050
Н
Нет
Да" "Н" "" "Предыдущая печать" "Canon LBP3010/LBP3018/LBP3050" "Н" "Нет" "Да"     ; make everything movable ; return previous Layer settings
      ))
))
Просмотров: 904
 
Непрочитано 01.02.2023, 12:40
#2
name02


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


Очень сумбурно-эмоционально написал ты как-то...
Цитата:
записать в переменную конечное число (до которого будет плюсоваться "1"
- это в твоем коде переменная nn
Цитата:
и выводиться на печать
- не увидел что в части кода по печати связано с пересчетом текстовых значений
Объясни понятнее
name02 вне форума  
 
Непрочитано 01.02.2023, 13:56
#3
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 470


>>> Не знаю как while прописать условие остановки и правильно вставить в код.

(while (< a b)

….

)

Но целые числа в Лиспе имеют ограничения по верхнему пределу - используй действительные.
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 01.02.2023, 14:54 Замена номера и вывод на печать
#4
syrovbiu2018


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


Доработал код.

Цель: Есть число в текстовом виде "100", условный номер детали. Нужно распечатать деталь с номерами от 100 до 9999999.
Решение ниже.

Принцип работы:
1). Печатает уже выбранную облась;
2). Просит Вас ввести "конечный номер" (до какого числа он будет плюсовать "1" к тому числу, которое выбирете);
3). Просит выбрать объект (нужно выбрать число в текстовом виде на чертеже)
4). Попросит ввести число, которое нужно прибавить к выбранному числу на чертеже (я выбирал "1", т.к. мне нужно приплюсовать именно "1" каждый раз перед печатью)
5). Напечатает все оставшие листы, прибавляя "1" на каждом новом листе .


Обязательно! Выбирайте область печати до запуска лиспа!!!!!

Код:
[Выделить все]
(defun c:nj () sel num qsel ent aa tt t1 n nn t2 t3  
(setq numk (getint "введите конечный номер : "))
;pick an object
(command 
"-Plot 
Н

Предыдущая печать
Canon LBP3010/LBP3018/LBP3050
Н
Нет
Да" "Н" "" "Предыдущая печать" "Canon LBP3010/LBP3018/LBP3050" "Н" "Нет" "Да" )    ; make everything movable ; return previous Layer settings


(setq sel (ssget '((0 . "text"))))    ;picks text objects
(if (/= sel nil)
 (progn
 (setq num (getint "enter the number of increase or decrease : "))
 (while (> numk nn)
 (setq qsel (sslength sel))            ;counts the number of text objects 
 (setq qsel (- qsel 1))                ;
  (repeat (+ qsel 1)                   ;starts loop of objects
  (setq ent (ssname sel qsel))         ;gets name of first object   
  (setq aa (entget ent))               ;gets info on the object


  (setq tt (assoc 1 aa))                ;gets text info
     (setq t1 (cdr tt))                 ;gets clear text
     (setq n (atoi t1))                 ;translates text into an integer
     
   
 
      (setq nn (+ n num))             ;sets nn as the new number
      (setq t3 (itoa nn))             ;translates number into text
  
  ;makes the switch

  (setq aa                              ;switches the original text (t1) with modified (t3) 
    (subst (cons 1 t3)
     (assoc 1 aa)    
      aa
      )
  )
  (entmod aa)                           ;updates entity
  (entupd ent)
 (setq qsel (- qsel 1))                ;countdown to the next entity
  )


(princ)
(command 
"-Plot 
Н

Предыдущая печать
Canon LBP3010/LBP3018/LBP3050
Н
Нет
Да" "Н" "" "Предыдущая печать" "Canon LBP3010/LBP3018/LBP3050" "Н" "Нет" "Да" )    ; make everything movable ; return previous Layer settings
))))

Код сырой и может быть переписан.
#syrovbiu2018
syrovbiu2018 вне форума  
 
Автор темы   Непрочитано 01.02.2023, 14:56
#5
syrovbiu2018


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
>>> Не знаю как while прописать условие остановки и правильно вставить в код.

(while (< a b)

….

)

Но целые числа в Лиспе имеют ограничения по верхнему пределу - используй действительные.
Спасибо. Я сначала нашел в интернете и доработал код.
(while (= a b)
(сделать)
(что-то еще сделать))

остановится когда a будет равно b
syrovbiu2018 вне форума  
 
Непрочитано 01.02.2023, 16:51
#6
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 470


>>> (while (= a b)
>>>
>>> остановится когда a будет равно b

Ну да. Только с точностью "до наоборот".
__________________
Счастливо, Алексей!
===AAA=== вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Помогите доработать lisp

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Знатоки Lisp, помогите найти середину сегмента сплайна. iskatel111 Программирование 32 14.12.2018 13:02
Пожалуйста помогите создать LISP для изменения (масштабирования) площади замкнутой полилинии (контура) Karloson1 LISP 6 26.10.2018 07:54
LISP. Помогите с лиспом по переименованию нескольких вхождений динамического блока в значение его атрибута. kirillwu LISP 43 09.07.2018 13:29
пытаюсь написать фильтр на LISP (помогите понять в чем ошибка) Pontelimon LISP 67 10.02.2011 11:11
Помогите отладить lisp программу Мишаня LISP 7 31.07.2006 12:54