ADN Club > AutoLisp / VisualLISP и DCL

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

(1/2) > >>

Peacemaker_kiss:
Небольшая преамбула:
Пользователь расставляет определенным образом динамические блоки, затем вызывает макрос, тот, в свою очередь находит блоки, расставленные пользователем (они представляет собой прямоугольник с ручкой растягивания), вычисляет длину блока и расставляет уже иные блоки (светильники) вдоль первого.
А вот теперь вопрос? Мне нужно, чтобы по завершению заполнения линейного блока светильниками, макрос приостанавливался, и выделял на чертеже блоки светильники которыми он был заполнен, далее после манипуляций пользователя (он в перечне блоков выберет массово группу атрибутов) вернуть продолжение макроса, который буде искать новый линейный блок и заполнять блоками светильниками.

--- Код - Auto/Visual Lisp [Выбрать] ---(defun c:sv_lamps (/ nabor _len1 _eff_name _block _conduit quantity point counter poinsert _cond )  (vl-load-com)  (setq acadd (vlax-get-acad-object))  (setq active_doc (vla-get-ActiveDocument acadd))  (setq mspace (vla-get-ModelSpace active_doc))  (setq L900 9.1)  (setq L1200 13)  (setq L600 6)  (setq xscale 1)  (setq yscale 1)  (setq zscale 1)  (setq rot (/ (getint "Введите угол поворота светильников на карнизах: 0; 180 ") (/ 180 pi)))  (setq rot1 (/ (getint "Введите угол поворота светильников в дверных проемах: 0; 180 ") (/ 180 pi)))  (setq nabor (ssget "_X" (list (cons 8 "_АХП_Вспомогательный_слой_не_печать" ) (cons 0 "insert"))))      (if nabor                 (progn                 (princ (strcat "Найдено блоков:" (rtos (sslength nabor) 2 0) "шт."))                 (terpri)                   (setq name "L (900 mm)")                   (setq counter 0)        (while (< counter (sslength nabor))                  (setq _block (vlax-ename->vla-object (ssname nabor counter)))                  (setq point (cdr (assoc 10 (entget (ssname nabor counter)))))                  (setq x_coord (nth 0 point))                  (setq y_coord (nth 1 point))                  (setq z_coord (nth 2 point))                  (setq _eff_name (vla-get-effectivename _block))                  (princ _eff_name)                  (terpri)        (if          (wcmatch _eff_name "!Карниз")          (progn                   (setq drop (vlax-invoke _block 'getdynamicblockproperties ))          (nth 0 drop)            (setq _len1 (vlax-variant-value  (vla-get-value (nth 0 drop) )))            (setq quantity (fix (/ _len1 L900)))            (setq counter1 0)            (while (< counter1 quantity)              (setq x_coord` (+ x_coord (/ L900 2) (* 1 counter1 L900)))                                      (setq poinsert (vlax-3d-point x_coord` y_coord z_coord))             (vla-InsertBlock mspace poinsert  name xscale yscale zscale rot)                               (setq counter1 (+ 1 counter1)))(princ "ok !Карниз")(terpri))                                               (progn (setq _cond (getint "\n Выберите вариант: 1 - Один блок; 2 - Заполнить проем"))          (if (= _cond 1) (progn           (setq drop (vlax-invoke _block 'getdynamicblockproperties ))           (nth 0 drop)           (setq _len1 (vlax-variant-value  (vla-get-value (nth 0 drop) )))                        (setq x_half (+ x_coord (/ _len1 2)))                         (setq poinsert (vlax-3d-point  x_half y_coord z_coord))                (vla-InsertBlock mspace poinsert  name xscale yscale zscale rot1)           (princ "ok !Дверной проем")(terpri))           (progn             (setq drop (vlax-invoke _block 'getdynamicblockproperties ))           (nth 0 drop)             (setq _len1 (vlax-variant-value  (vla-get-value (nth 0 drop) )))            (setq quantity (fix (/ _len1 L900)))            (setq counter1 0)            (while (< counter1 quantity)              (setq x_coord` (+ x_coord (/ L900 2) (* 1 counter1 L900)))                                      (setq poinsert (vlax-3d-point x_coord` y_coord z_coord))             (vla-InsertBlock mspace poinsert  name xscale yscale zscale rot1)                               (setq counter1 (+ 1 counter1))(princ "ok !Дверной проем")(terpri))            )                          )))    (princ counter)                   (setq counter (+ 1 counter))))                   (progn                     (alert (princ "\nНет блоков, расположите блоки на фасаде здания"))(terpri))        ))  Вставляю кусочек своего кода, вот как раз после того как завершается внутренний цикл, необходимо приостановка и подключение пользователя

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

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

Peacemaker_kiss:

--- Цитата: Алексей Кулик от 27-10-2014, 14:12:21 ---P.S. Кода совсем кусочек: его даже "погонять" невозможно...
--- Конец цитаты ---
Всяким Алексеям всезнайкам :D выложи код "погонять" они возьмут потом решат задачу, а хочется чтобы подсказали! и если я уже сам совсем не смогу....тогда явить миру! Код выложил рабочий!

Peacemaker_kiss:
Если не понятно что-то куда паузы вставлять, я отпишу

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии