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

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

LISP Непослушные мультивыноски

Ответ
Поиск в этой теме
Непрочитано 11.03.2025, 17:24 #1
LISP Непослушные мультивыноски
Jahell
 
Регистрация: 04.11.2012
Сообщений: 23

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

Код:
[Выделить все]
 (defun c:mymultileader (/ p1 p2 mtext votm notm decr layername i value next_value)
  (progn
    ;; Получаем начальные данные VOTM
    (setq votm (getreal "\nВведите верхнюю отметку: "))

    ;; Получаем конечные данные NOTM
    (setq notm (getreal "\nВведите нижнюю отметку: "))

    ;; Получаем декремент DECR
    (setq decr (getreal "\nВведите толщину слоя: "))

    ;; Начинаем итерацию по каждому значению в диапазоне
    (setq i 1)                                    ; Начнем нумерацию слоев с 1

    ;; Рассчитываем значения от VOTM до NOTM с шагом DECR
    (setq value votm)                            ; Инициализируем текущее значение

    (setq p1 (getpoint "\nУкажите начальную точку: ")) ; Запрашиваем начальную точку

    (setq p2 (getpoint "\nУкажите конечную точку выноски: ")) ; Запрашиваем конечную точку первой стрелки

    (while (> value notm)
      
      ;; Формируем имя слоя
      (setq layername (strcat "слой_" (itoa i)))
 
      ;; Проверяем существование слоя
      (if (tblsearch "LAYER" layername)
        (princ (strcat "\nСлой '" layername "' уже существует."))
        (progn
          (command "_.-layer" "_New" layername "") ; Создаем новый слой
          (princ (strcat "\nСлой '" layername "' успешно создан."))
        )
      )

      ;; Меняем активный слой на указанный
      (setvar "CLAYER" layername)

      (setq next_value (- value decr))            ; Следующая отметка = текущая минус DECR

      ;; Условие: если next_value меньше или равна NOTM, то строим выноску value/NOTM
      (if (<= next_value notm)
        (progn
          (setq mtext (strcat (rtos value 2 1) "\\P\\C3;" (rtos notm 2 1))) ; Изменяем текст и устанавливаем зеленый цвет (\C;3;) для NOTM.
          (command "_.mleader" p1 p2 mtext "") ; Создаем выноску с value/NOTM
        )
        (progn
          (setq mtext (strcat (rtos value 2 1) "\\P" (rtos next_value 2 1))) ; Преобразуем значение в строку с точностью до двух знаков
          (command "_.mleader" p1 p2 mtext "") ; Создаем выноску с двумя текстовыми блоками: верхний — текущая отметка, нижний — следующая
        )
      )

      ;; Переходим к следующему номеру слоя
      (setq i (1+ i))
      (setq value (- value decr))                ; Уменьшаем текущее значение на DECR
    )
  )
  (princ)                                        ; Завершаем функцию
)
Просмотров: 565
 
Непрочитано 11.03.2025, 19:00
#2
Кулик Алексей aka kpblc
Moderator

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


Я вообще удивлен, что мультивыноски строятся командными методами. Я б делал чисто программно, особенно учитывая https://autolisp.ru/2015/01/21/mleader_create_order/
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 12.03.2025, 08:28
#3
Jahell


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Я вообще удивлен, что мультивыноски строятся командными методами. Я б делал чисто программно, особенно учитывая https://autolisp.ru/2015/01/21/mleader_create_order/
то что, по ссылке читал раза 3, но так и не понял как это может помочь. Я не программист, это моя первая программка. Программно это как?
Jahell вне форума  
 
Непрочитано 12.03.2025, 11:28
1 | #4
Кулик Алексей aka kpblc
Moderator

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


В общем и целом - запросить начальную точку, конечную точку, создать (чисто программно, без команд!) многострочный текст, создать объект MLEADER, назначить ему аннотацию.
По-моему, на форуме были работающие примеры на лиспе
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.03.2025, 12:46
1 | #5
koMon


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


а если так?
Код:
[Выделить все]
 
(defun c:mymultileader (/ p1 p2 mtext votm notm decr layername i value next_value)
  (progn
    ;; Получаем начальные данные VOTM
    (setq votm (getreal "\nВведите верхнюю отметку: "))
    ;; Получаем конечные данные NOTM
    (setq notm (getreal "\nВведите нижнюю отметку: "))
    ;; Получаем декремент DECR
    (setq decr (getreal "\nВведите толщину слоя: "))
    ;; Начинаем итерацию по каждому значению в диапазоне
    (setq i 1)                                    ; Начнем нумерацию слоев с 1
    ;; Рассчитываем значения от VOTM до NOTM с шагом DECR
    (setq value votm)                            ; Инициализируем текущее значение
    (setq p1 (getpoint "\nУкажите начальную точку: ")) ; Запрашиваем начальную точку
    (setq p2 (getpoint "\nУкажите конечную точку выноски: ")) ; Запрашиваем конечную точку первой стрелки
    (while (> value notm)
      ;; Формируем имя слоя
      (setq layername (strcat "слой_" (itoa i)))
      ;; Проверяем существование слоя
      (if (tblsearch "LAYER" layername)
        (princ (strcat "\nСлой '" layername "' уже существует."))
        (progn
          (command "_.-layer" "_New" layername "") ; Создаем новый слой
          (princ (strcat "\nСлой '" layername "' успешно создан."))
        )
      )
      ;; Меняем активный слой на указанный
      (setvar "CLAYER" layername)
      (setq next_value (- value decr))            ; Следующая отметка = текущая минус DECR
      ;; Условие: если next_value меньше или равна NOTM, то строим выноску value/NOTM
      (if (<= next_value notm)
        (progn
          (setq mtext (strcat (rtos value 2 1) "\\P\\C3;" (rtos notm 2 1))) ; Изменяем текст и устанавливаем зеленый цвет (\C;3;) для NOTM.
          (command "_.mleader" "_non" p1 "_non" p2 mtext "") ; Создаем выноску с value/NOTM
        )
        (progn
          (setq mtext (strcat (rtos value 2 1) "\\P" (rtos next_value 2 1))) ; Преобразуем значение в строку с точностью до двух знаков
          (command "_.mleader" "_non" p1 "_non" p2 mtext "") ; Создаем выноску с двумя текстовыми блоками: верхний — текущая отметка, нижний — следующая
        )
      )
      ;; Переходим к следующему номеру слоя
      (setq i (1+ i))
      (setq value (- value decr))                ; Уменьшаем текущее значение на DECR
	  (setq p1 (mapcar '- p1 (list 0 decr)))
	  (setq p2 (mapcar '- p2 (list 0 decr)))
    )
  )
  (princ)                                        ; Завершаем функцию
)
__________________
K Lisp
koMon вне форума  
 
Автор темы   Непрочитано 12.03.2025, 15:37
#6
Jahell


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


Цитата:
Сообщение от koMon Посмотреть сообщение
а если так?
Так работает. Здорово! Можно ли их все в одну точку загнать? Они потом будут на разных видовых экранах, так что то, что они будут накладываться друг на друга - это норм

----- добавлено через ~32 мин. -----
Ну хотя, вместо decr вписал 0 и стало ок.
Но все таки - что это было и за счет чего исправилось? Я, конечно, справочники почитаю, но все же..

----- добавлено через ~55 мин. -----
Я разобрался! Спасибо! Рад как слон!
Дело было в объектной привязке!
"_non" в AutoCAD Lisp означает “NONE” или “НИЧЕГО”. Это модификатор объектной привязки, который используется в командах для отключения текущей объектной привязки.
Т.о., в моем случае, строки 43 и 44 вообще не нужны!

Где можно узнать про синтаксис команд?
Jahell вне форума  
 
Автор темы   Непрочитано 12.03.2025, 16:44
#7
Jahell


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


Вот так теперь работает, нормально. Можно, конечно, еще сделать чтобы верхнюю и нижнюю отметку брал с поверхностей, но боюсь не осилю.

Код:
[Выделить все]
  
(defun c:mymultileader (/ p1 p2 mtext votm notm decr layername i value next_value)
  (progn
    ;; Получаем начальные данные VOTM
    (setq votm (getreal "\nВведите верхнюю отметку: "))
    ;; Получаем конечные данные NOTM
    (setq notm (getreal "\nВведите нижнюю отметку: "))
    ;; Получаем декремент DECR
    (setq decr (getreal "\nВведите толщину слоя: "))
    ;; Начинаем итерацию по каждому значению в диапазоне
    (setq i 1)                                    ; Начнем нумерацию слоев с 1
    ;; Рассчитываем значения от VOTM до NOTM с шагом DECR
    (setq value votm)                            ; Инициализируем текущее значение
    (setq p1 (getpoint "\nУкажите начальную точку: ")) ; Запрашиваем начальную точку
    (setq p2 (getpoint "\nУкажите конечную точку выноски: ")) ; Запрашиваем конечную точку первой стрелки
    (while (> value notm)
      ;; Формируем имя слоя
      (setq layername (strcat "слой_" (itoa i)))
      ;; Проверяем существование слоя
      (if (tblsearch "LAYER" layername)
        (princ (strcat "\nСлой '" layername "' уже существует."))
        (progn
          (command "_.-layer" "_New" layername "") ; Создаем новый слой
          (princ (strcat "\nСлой '" layername "' успешно создан."))
        )
      )
      ;; Меняем активный слой на указанный
      (setvar "CLAYER" layername)
      (setq next_value (- value decr))            ; Следующая отметка = текущая минус DECR
      ;; Условие: если next_value меньше или равна NOTM, то строим выноску value/NOTM
      (if (<= next_value notm)
        (progn
          (setq mtext (strcat (rtos value 2 1) "\\P\\C3;" (rtos notm 2 1))) ; Изменяем текст и устанавливаем зеленый цвет (\C;3;) для NOTM.
          (command "_.mleader" "_non" p1 "_non" p2 mtext "") ; Создаем выноску с value/NOTM
        )
        (progn
          (setq mtext (strcat (rtos value 2 1) "\\P" (rtos next_value 2 1))) ; Преобразуем значение в строку с точностью до двух знаков
          (command "_.mleader" "_non" p1 "_non" p2 mtext "") ; Создаем выноску с двумя текстовыми блоками: верхний — текущая отметка, нижний — следующая
        )
      )
      ;; Переходим к следующему номеру слоя
      (setq i (1+ i))
      (setq value (- value decr))                ; Уменьшаем текущее значение на DECR
    )
  )
  (princ)                                        ; Завершаем функцию
)
Jahell вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > LISP Непослушные мультивыноски



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Текст мультивыноски не меняет цвет вместе с выноской. Dinoxromniy AutoCAD 0 08.12.2022 13:58
LISP. Префикс, суффикс , замена текста мультивыноски gizmo_zx LISP 2 30.12.2021 15:36
LISP. Не отображается часть полки мультивыноски kacugu LISP 2 16.05.2016 08:52
Lisp. Не вставляет значения в базу access. Zaghim LISP 2 11.07.2012 14:29
{Конкурс} Lisp. Задачки для студентов gomer LISP 10 05.01.2011 16:33