Как приостановить lisp-макрос, выделить вставленные им блоки, и продолжить его..

Автор Тема: Как приостановить lisp-макрос, выделить вставленные им блоки, и продолжить его..  (Прочитано 6082 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Peacemaker_kissАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
  • Воспитываю из него программиста
Небольшая преамбула:
Пользователь расставляет определенным образом динамические блоки, затем вызывает макрос, тот, в свою очередь находит блоки, расставленные пользователем (они представляет собой прямоугольник с ручкой растягивания), вычисляет длину блока и расставляет уже иные блоки (светильники) вдоль первого.
А вот теперь вопрос? Мне нужно, чтобы по завершению заполнения линейного блока светильниками, макрос приостанавливался, и выделял на чертеже блоки светильники которыми он был заполнен, далее после манипуляций пользователя (он в перечне блоков выберет массово группу атрибутов) вернуть продолжение макроса, который буде искать новый линейный блок и заполнять блоками светильниками.
Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:sv_lamps (/ nabor _len1 _eff_name _block _conduit quantity point counter poinsert _cond )
  2.   (vl-load-com)
  3.   (setq acadd (vlax-get-acad-object))
  4.   (setq active_doc (vla-get-ActiveDocument acadd))
  5.   (setq mspace (vla-get-ModelSpace active_doc))
  6.   (setq L900 9.1)
  7.   (setq L1200 13)
  8.   (setq L600 6)
  9.   (setq xscale 1)
  10.   (setq yscale 1)
  11.   (setq zscale 1)
  12.   (setq rot (/ (getint "Введите угол поворота светильников на карнизах: 0; 180 ") (/ 180 pi)))
  13.   (setq rot1 (/ (getint "Введите угол поворота светильников в дверных проемах: 0; 180 ") (/ 180 pi)))
  14.   (setq nabor (ssget "_X" (list (cons 8 "_АХП_Вспомогательный_слой_не_печать" ) (cons 0 "insert"))))
  15.       (if nabor
  16.                  (progn
  17.                  (princ (strcat "Найдено блоков:" (rtos (sslength nabor) 2 0) "шт."))
  18.                  (terpri)
  19.                    (setq name "L (900 mm)")
  20.                    (setq counter 0)
  21.         (while (< counter (sslength nabor))
  22.                   (setq _block (vlax-ename->vla-object (ssname nabor counter)))
  23.                   (setq point (cdr (assoc 10 (entget (ssname nabor counter)))))
  24.                   (setq x_coord (nth 0 point))
  25.                   (setq y_coord (nth 1 point))
  26.                   (setq z_coord (nth 2 point))
  27.                   (setq _eff_name (vla-get-effectivename _block))
  28.                   (princ _eff_name)
  29.                   (terpri)
  30.         (if
  31.           (wcmatch _eff_name "!Карниз")
  32.           (progn
  33.                   (setq drop (vlax-invoke _block 'getdynamicblockproperties ))
  34.           (nth 0 drop)
  35.             (setq _len1 (vlax-variant-value  (vla-get-value (nth 0 drop) )))
  36.             (setq quantity (fix (/ _len1 L900)))
  37.             (setq counter1 0)
  38.             (while (< counter1 quantity)
  39.               (setq x_coord` (+ x_coord (/ L900 2) (* 1 counter1 L900)))
  40.                                       (setq poinsert (vlax-3d-point x_coord` y_coord z_coord))
  41.              (vla-InsertBlock mspace poinsert  name xscale yscale zscale rot)
  42.                                (setq counter1 (+ 1 counter1)))(princ "ok !Карниз")(terpri))
  43.                              
  44.                   (progn (setq _cond (getint "\n Выберите вариант: 1 - Один блок; 2 - Заполнить проем"))
  45.           (if (= _cond 1) (progn
  46.            (setq drop (vlax-invoke _block 'getdynamicblockproperties ))
  47.            (nth 0 drop)
  48.            (setq _len1 (vlax-variant-value  (vla-get-value (nth 0 drop) )))
  49.                         (setq x_half (+ x_coord (/ _len1 2)))
  50.                          (setq poinsert (vlax-3d-point  x_half y_coord z_coord))
  51.                 (vla-InsertBlock mspace poinsert  name xscale yscale zscale rot1)
  52.            (princ "ok !Дверной проем")(terpri))
  53.            (progn
  54.              (setq drop (vlax-invoke _block 'getdynamicblockproperties ))
  55.            (nth 0 drop)
  56.              (setq _len1 (vlax-variant-value  (vla-get-value (nth 0 drop) )))
  57.             (setq quantity (fix (/ _len1 L900)))
  58.             (setq counter1 0)
  59.             (while (< counter1 quantity)
  60.               (setq x_coord` (+ x_coord (/ L900 2) (* 1 counter1 L900)))
  61.                                       (setq poinsert (vlax-3d-point x_coord` y_coord z_coord))
  62.              (vla-InsertBlock mspace poinsert  name xscale yscale zscale rot1)
  63.                                (setq counter1 (+ 1 counter1))(princ "ok !Дверной проем")(terpri))
  64.             )
  65.                      
  66.      )))
  67.     (princ counter)
  68.                    (setq counter (+ 1 counter))))
  69.                    (progn
  70.                      (alert (princ "\nНет блоков, расположите блоки на фасаде здания"))
  71. (terpri))
  72.         ))
  73.  
Вставляю кусочек своего кода, вот как раз после того как завершается внутренний цикл, необходимо приостановка и подключение пользователя
« Последнее редактирование: 27-10-2014, 19:26:35 от Peacemaker_kiss »

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Вариант 1 - все что должен сделать пользователь, прописать в коде в виде функций пользовательского ввода или с использованием COMMAND.
Вариант 2 (попроще) - разбить код на 2 команды(sv_lamps1, sv_lamps2). Сперва выполняется одна команда, затем - действия пользователя, затем запускается вторая команда.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Вариант 3: создать свой собственный dcl-диалог, в котором и запросить устанавливаемое значение? Потом установить для указанных блоков значения атрибутов
Вариант 4: использовать cmdnames и попробовать с этим играться.
P.S. Кода совсем кусочек: его даже "погонять" невозможно...
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Peacemaker_kissАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
  • Воспитываю из него программиста
P.S. Кода совсем кусочек: его даже "погонять" невозможно...
Всяким Алексеям всезнайкам :D выложи код "погонять" они возьмут потом решат задачу, а хочется чтобы подсказали! и если я уже сам совсем не смогу....тогда явить миру! Код выложил рабочий!

Оффлайн Peacemaker_kissАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
  • Воспитываю из него программиста
Если не понятно что-то куда паузы вставлять, я отпишу

Оффлайн Peacemaker_kissАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 76
  • Карма: 0
  • Воспитываю из него программиста
Сей Код версии 1.0, будет однозначно расширяться по запросам пользователей, но для "прогонки" хватит

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1097
  • Карма: 172
Подкол засчитан :)
К сожалению, сейчас могу только "нарисовать" алгоритм, как бы его делал я (по имеющемуся описанию):
  • Запросить у пользователя указание блока, внутри которого надо вставлять "пояснения"
  • Определить ориентацию основного блока, количество и ориентацию вставляемых блоков
  • Через vla-insertblock вставить блоки, забив на атрибуты
  • Вывести запрос на значение атрибута - либо в ком.строке, либо в диалоге
  • Назначить новое значение соответствующему атрибуту
  • ...и начинай сначала, пока пользователь не откажется от выбора
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!