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

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

Тормозит команда расчленения набора блоков

Ответ
Поиск в этой теме
Непрочитано 29.08.2010, 21:17 #1
Тормозит команда расчленения набора блоков
batmax
 
Регистрация: 28.08.2010
Сообщений: 10

Такое впечатление, что конструкция (command "_.EXPLODE" ss), где ss - набор примтивов-блоков, расчленяет по одному блоку за раз (запускал её в цикле с отладочной печатью, см. ниже).
Вообще-то задача - расчленить все блоки чертежа (включая все вложенные), кроме тех, чьи имена хранятся в списке "list_of_blocks_to_remain".
Понятно, что часть блоков останутся нерасчленёнными (например, "анизотропные"), поэтому критерием продолжения процесса расчленения будет превышение числа блоков, которые необходимо расчленить, над числом блоков, расчленённых на предыдущем шаге.
Вот что я написал:

Код:
[Выделить все]
(defun c:explode_unwanted_blocks ( / oldss1len ss1 ss1len n ent ss2)
  (setvar "CMDECHO" 0)
  (if
    (setq ss1 (ssget "x" '((0 . "INSERT"))))
    (progn
      (setq oldss1len (1+ (sslength ss1)))
      (while (and
           (setq ss1 (ssget "x" '((0 . "INSERT"))))
           (setq ss1len (sslength ss1))
           (<= ss1len oldss1len)
           )
        (setq oldss1len ss1len)
        (princ (strcat "\nБлоков: " (rtos ss1len 2 0)))
        (setq ss2 nil)
        (setq n (if (> ss1len 32767) 0.0 0))
        (while (< n ss1len)
          (setq ent (ssname ss1 n))
          (if (null (member (cdr (assoc 2 (entget ent))) list_of_blocks_to_remain))
            (setq ss2 (if (null ss2) (ssadd ent) (ssadd ent ss2)))
          )
          (setq n (1+ n))
        )
        (if ss2
          (progn
            (princ (strcat "\nРазбито " (rtos (sslength ss2) 2 0) " блоков."))
            ;(setq n (if (> (sslength ss2) 32767) 0.0 0))
            ;(while (< n (sslength ss2))
            ;  (command "_.EXPLODE" (ssname ss2 n))
            ;  (setq n (1+ n))
            ;)
            (command "_.EXPLODE" ss2)
          )
        )
      )
    )
  )
  (princ)
)
При запуске на "диком" чертеже имеем в командной строке что-то вроде:

Код:
[Выделить все]
Команда: EXPLODE_UNWANTED_BLOCKS

Блоков: 301
Разбито 301 блоков.
Блоков: 300
Разбито 300 блоков.
Блоков: 299
Разбито 299 блоков.
Блоков: 298
Разбито 298 блоков.
Блоков: 297
Разбито 297 блоков.
Блоков: 296
Разбито 296 блоков.
Блоков: 295
Разбито 295 блоков.
...ну и так далее.
Если разкомментировать закомментированный фрагмент и убрать строку (command "_.EXPLODE" ss2), то будет просто тормозить именно этот разкомментированный фрагмент: 100% загрузка процессора.
Как же быть с программным расчленением набора блоков ?
Просмотров: 7158
 
Непрочитано 29.08.2010, 22:14
#2
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Уважаемый Batmax Вы попробуйте решать задачи на лиспе "по лисповски", а именно переведите набор в список, вычте из списка неустраивающие по соответствующим критериям и взорвите что осталось и так пока не останеться невзорванных блоков (это по простому - можно и сразу после врзрыва блока рекурсивно взрывать вложенные). Лисп язык функиональный и не надо пытаться (а особенно изначально "неверно" учиться) писать на нем в "классическом" императивном стиле, чем меньше у вас переменных (те имена которые используються в setq) тем лучше и в итоге понятней.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 30.08.2010, 11:22
1 | #3
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от batmax Посмотреть сообщение
Такое впечатление, что конструкция (command "_.EXPLODE" ss), где ss - набор примтивов-блоков, расчленяет по одному блоку за раз (запускал её в цикле с отладочной печатью, см. ниже).
В справке про explode все написано.
Посмотри так же
Тройной Explode??? особенно пост #21
и Как разбить все объекты автокада (СПДСа и VetCADа) одним действием при помощи лиспа
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 31.08.2010, 17:33
#4
batmax


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


Спасибо, VVA.
Я так понял, что это непреодолимый недостаток команды EXPLODE. Значит, выдам юзеру сообщение "Ваш компьютер не завис, ожидайте."
batmax вне форума  
 
Непрочитано 31.08.2010, 17:37
#5
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Пробуй ActiveX! Обещали что оно быстрее...
gomer вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Тормозит команда расчленения набора блоков

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Печать из модели по выбору объекта zenon Программирование 192 04.05.2017 09:41
Преобразование полей в текст YuraVel AutoCAD 17 14.04.2015 14:30
Подсчет и сортировка блоков на текущем слое. Помогите отредактировать. Kortes Программирование 17 26.03.2010 18:46
Модифицированная команда Explode для блоков Red Nova Программирование 8 10.02.2009 08:47