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

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

Назначить разделители в лиспе

Ответ
Поиск в этой теме
Непрочитано 18.04.2023, 19:44 #1
Назначить разделители в лиспе
Ingpro
 
Регистрация: 11.07.2022
Сообщений: 495

Лисп заменяет результатом 187,2 строку в чертеже типа 10*2+20/2+157.2.
Причем результат выдает с разделителем "," (запятая), а считает только выражения с разделителем "." (точка).
Выражения с разделителями "," (запятая) игнорит. Пишет в КС "; ошибка: неверный тип аргумента: numberp: nil".
Помогите, пожалуйста, сделать вывод результата не заменой вычисляемого выражения, а отдельным текстом с
указанием точки вставки на экране, и чтобы результат тоже был с разделителем "точка".
И, если не сложно, добавить возможность вычисления выражений и с "," (запятой) тоже. Спасибо.
Код:
[Выделить все]
 (defun c:МАВ (/ e)
  (setq e (car (entsel "\Select text or mtext: ")))
  (setq e (vlax-ename->vla-object e))
  (vlax-property-available-p e 'textstring)
  (vla-put-textstring e (atof (rtos(cal (vla-get-textstring e)) 2 2)))
  (princ)
)
Просмотров: 2240
 
Непрочитано 18.04.2023, 23:46
#2
Кулик Алексей aka kpblc
Moderator

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


В процессе обработки всегда меняй "," на "."
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 19.04.2023, 09:47
#3
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
В процессе обработки всегда меняй "," на "."
А как это сделать?
Ingpro вне форума  
 
Непрочитано 19.04.2023, 11:02
#4
===AAA===


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


Да хоть через vl-string-subst
__________________
Счастливо, Алексей!
===AAA=== на форуме  
 
Автор темы   Непрочитано 19.04.2023, 11:26
#5
Ingpro


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Да хоть через vl-string-subst
А можно поподробней, плз...
Ingpro вне форума  
 
Непрочитано 19.04.2023, 12:00
#6
IgorTr2


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
А можно поподробней, плз...
Читаем Полищука:
1.8.18. Ôóíêöèÿ vl-string-subst
Заменяет в строке одну последовательность буквенно-цифровых символов на
другую, начиная с определенного номера позиции.
(vl-string-subst <новые> <старые> <строка> [<начало>])
Аргументы: <новые>, <старые> и <строка> — текстовые строки; <начало> — номер
позиции в аргументе <строка>, с которого начинается поиск нужной последова-
тельности символов для замены (по умолчанию — 0). Первый символ в строке
имеет номер 0.
Возвращаемое значение — строка, являющаяся результатом выполнения замены
последовательности символов в аргументе <строка>. Если последовательность
символов <старые> встречается в аргументе <строка> несколько раз, то произво-
дится только первая замена.
Примеры:
 (vl-string-subst "цып" "ва" "валенок") возвращает "цыпленок"
 (vl-string-subst "12" "a" "a para" 0) возвращает "12 para"
 (vl-string-subst "12" "a" "a para" 2) возвращает "a p12ra"
 (vl-string-subst "12" "a" "a para" 5) возвращает "a par12"
 (vl-string-subst "12" "b" "a para" 0) возвращает "a para"
IgorTr2 вне форума  
 
Автор темы   Непрочитано 19.04.2023, 12:22
#7
Ingpro


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


Цитата:
Сообщение от IgorTr2 Посмотреть сообщение
Читаем Полищука:
А как эти правила прикрутить к лиспу из поста #1, подскажите, пожалуйста, я совсем не программист...
Ingpro вне форума  
 
Непрочитано 19.04.2023, 14:55
#8
Сергей812


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


Цитата:
Сообщение от Ingpro Посмотреть сообщение
А как эти правила прикрутить к лиспу из поста #1, подскажите, пожалуйста, я совсем не программист...
ручками) получаете функцией vla-get-textstring текст и перед отправкой в качестве значения в cal функцией vl-string-subst заменить символ разделителя.
Сергей812 вне форума  
 
Автор темы   Непрочитано 21.04.2023, 10:43
#9
Ingpro


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


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Да хоть через vl-string-subst
Добавляю строку по замене запятой на точку
Код:
[Выделить все]
 (vl-string-subst
            "."
            ","
            (cdr (assoc 1 (entget a)))
Пишет в КС: Неизвестная команда
Значит как-то не так это делается, подскажите, пожалуйста, как правильно.
Код:
[Выделить все]
 (defun c:МВТ (/ e)
  (setq e (car (entsel "\Select text or mtext: ")))
  (setq e (vlax-ename->vla-object e))
  (vlax-property-available-p e 'textstring)
  (vla-put-textstring e (atof (rtos(cal (vla-get-textstring e)) 2 2)))
(vl-string-subst
            "."
            ","
            (cdr (assoc 1 (entget a)))
  (princ)
)
Ingpro вне форума  
 
Непрочитано 21.04.2023, 10:54
#10
IgorTr2


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


ИМХО надо так:
(vl-string-subst "." "," (rtos (cdr (assoc 1 (entget a))) 2 2))
IgorTr2 вне форума  
 
Непрочитано 21.04.2023, 11:29
#11
Кулик Алексей aka kpblc
Moderator

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


Че-т вы куда-то не туда...
Код:
[Выделить все]
 (vl-load-com)
(defun c:kpblc-round (/ ent prec text)
  (setq prec 2)
  (if (and (= (type
                (setq ent (vl-catch-all-apply (function (lambda () (car (entsel "\nSelect TEXT or MTEXT <Cancel> : "))))))
                ) ;_ end of type
              'ename
              ) ;_ end of =
           (wcmatch (cdr (assoc 0 (entget ent))) "*TEXT")
           (setq ent (vlax-ename->vla-object ent))

           ) ;_ end of and
    (if (vl-catch-all-error-p
          (vl-catch-all-apply
            (function (lambda ()
                        (setq text (atof (vl-string-subst "." "," (vla-get-textstring ent))))
                        ) ;_ end of lambda
                      ) ;_ end of function
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of vl-catch-all-error-p
      (princ "\nError rtos")
      (vla-put-textstring ent (vl-string-subst "," "." (rtos text 2 prec)))
      ) ;_ end of if
    ) ;_ end of if
  (princ)
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.04.2023, 11:33
#12
Ingpro


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


Цитата:
Сообщение от IgorTr2 Посмотреть сообщение
ИМХО надо так:
(vl-string-subst "." "," (rtos (cdr (assoc 1 (entget a))) 2 2))
Не получается
Код:
[Выделить все]
  (defun c:МВТ (/ e)
  (setq e (car (entsel "\Select text or mtext: ")))
  (setq e (vlax-ename->vla-object e))
  (vlax-property-available-p e 'textstring)
  (vl-string-subst "." "," (rtos (cdr (assoc 1 (entget a))) 2 2))
  (princ)
)
Команда: МВТ
Select text or mtext: ; ошибка: неверный тип аргумента: lentityp nil

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Че-т вы куда-то не туда...
Алексей, а ваш код можно добавить к коду в посте#1?
Ingpro вне форума  
 
Непрочитано 21.04.2023, 11:38
#13
IgorTr2


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


Переменная "a" откуда берётся?
IgorTr2 вне форума  
 
Автор темы   Непрочитано 21.04.2023, 11:43
#14
Ingpro


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


Код:
[Выделить все]
  (vla-put-textstring ent (vl-string-subst "," "." (rtos text 2 prec)))
Код из поста #11 просто меняет точку на запятую, а мне надо вывод результата строки с математическим выражением
осуществить с разделителем точка (в коде из поста #1).
Ingpro вне форума  
 
Непрочитано 21.04.2023, 11:47
#15
Кулик Алексей aka kpblc
Moderator

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


Ну поставь вместо vla-put-textstring обычный princ, делов-то
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.04.2023, 11:53
#16
Ingpro


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Ну поставь вместо vla-put-textstring обычный princ, делов-то
Лиспы по замене запятых на точки и наоборот у меня есть, как эту замену добавить в код из поста #1? В этом затык...
Даже не добавить замену, а просто по умолчанию результат выводить с разделителем ".".
Ingpro вне форума  
 
Непрочитано 21.04.2023, 11:56
1 | #17
koMon


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


Ingpro,

Код:
[Выделить все]
 
(defun c:МАВ (/ m_text_object result)
  (setq m_text_object (vlax-ename->vla-object (car (entsel "\Select text or mtext: "))))
  (vla-addtext (vla-get-block (vla-get-activelayout (vla-get-activedocument (vlax-get-acad-object))))
			   (setq result (rtos (cal (vl-string-translate "," "." (vla-get-textstring m_text_object))) 2 2))
			   (vlax-3d-point (getpoint (strcat "\nУкажите точку для вставки результата (" result "): ")))
			   20
  )
  (princ)
)
__________________
K Lisp

Последний раз редактировалось koMon, 21.04.2023 в 17:31.
koMon вне форума  
 
Непрочитано 21.04.2023, 11:57
#18
Кулик Алексей aka kpblc
Moderator

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


У тебя rtos и atof стоят в странных местах. Почитай про эти функции - что и куда они преобразовывают. И помни, что в TEXT/MTEXT - у тебя только строки, как бы они ни выглядели.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.04.2023, 11:59
#19
koMon


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


у меня нет atof)
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 21.04.2023, 12:07
#20
Ingpro


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


koMon, спасибо, правда ваш код из поста #17, заменяет вычисляемое выражение на результат с разделителем ".", и ещё вставляет тот же результат, но уже с разделителем ",". Как бы убрать замену выражения и оставить только вставку результата с
с разделителем ".", если не сложно... Просто, хотелось бы, чтобы строка с выражением осталась...
Ingpro вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Назначить разделители в лиспе

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в лиспе прописать двойное условие? Jek30 LISP 6 06.12.2022 10:07
Как назначить абсолютно жесткий элемент-стержень в Лире-САПР (некоммерческая) 2013 R5? Юрий_Нд Лира / Лира-САПР 13 13.11.2018 10:46
Как назначить один набор параметров листа сразу нескольким листам? Shturman121 AutoCAD 7 05.02.2018 12:49
Как назначить жёсткость пружинных опор если C=1000? МишаИнженер Лира / Лира-САПР 10 25.10.2013 11:58
Можно ли назначить форму элемента и его армирование, а потом импортировать жёсткости этого элемента в ЛИР-ВИЗОР? МишаИнженер Лира / Лира-САПР 9 15.01.2013 12:06