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

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

Помогите переработать Нумератор /Ренумератор атрибутов блоко

Ответ
Поиск в этой теме
Непрочитано 20.07.2007, 16:25 #1
Помогите переработать Нумератор /Ренумератор атрибутов блоко
gizmo_zx
 
Проектировщик ЭО,ЭМ, ЭОС
 
Нижний Новгород
Регистрация: 18.07.2007
Сообщений: 257

Есть известная программа для нумерации блоков, все вней класс, но приоритеты нумерации мне нужны другие: она нумерует 1слева- напрвво, 2сверху-вниз, а мне надо чтоб сначала сверху-вниз, а уж потом слева на право. Думаю там только в циклах надо переменные местами поменять, но в программировании не силен...

программа:

Код:
[Выделить все]
(defun c:xblocknum (/ testf name tag pref suff num ss el lstins ssd eld index)

  ;; функция вернет T, если координата X первого аргумента меньше координаты X второго
  (defun testf (a b /)
    (< (cadr (assoc 10 (entget a))) (cadr (assoc 10 (entget b))))
  ) ;_  defun
; ***
(setq name0 (getstring "\nИмя блока:[Автомат1] "))
(if (= name0 "")(progn (setq name1 "Автомат1") (setq pref "")(setq suff "") )
			  (progn (setq name1 name0)(setq pref (getstring "\nПрефикс: ")) (setq suff (getstring "\nСуффикс: ")) )
)

(setq tag0 "num")
; ***

  (while (= (setq name name1) ""))
  (while (= (setq tag tag0) ""))
  (setq tag (strcase tag))

  (if (null (setq num (getint "\nСтартовый номер <1>: ")))
    (setq num 1)
  ) ;_  if

  (princ "\nБлоки > ")
  (if (setq ss (ssget (list '(0 . "INSERT") '(410 . "Model") (cons 2 name)))) ;_ набор от пользователя
    (progn

      ;; преобразование набора в список и удаление дубликатов блоков
      (while (> (sslength ss) 0)
        (setq ss (ssdel (setq el (ssname ss 0)) ss))
        (setq lstins (cons el lstins)) ;_ список INSERT'ов
        ;; поиск дубликатов в Модели
        (setq ssd (ssget "_X" (list '(0 . "INSERT") '(410 . "Model") (cons 2 name) (assoc 10 (entget el))))) ;_ только идеально совпадающие
        (if (> (sslength (ssdel el ssd)) 0) ;_ из набора дубликатов удаляем рабочий INSERT
          (while (> (sslength ssd) 0)
            (setq ssd (ssdel (setq eld (entdel (ssname ssd 0))) ssd)) ;_ удаление из чертежа и из набора найденных дубликатов
            (ssdel eld ss) ;_ удаление из набора пользователя
          ) ;_  while
        ) ;_  if
      ) ;_  while

      (setq index (vl-sort-i lstins 'testf)) ;_ индекс, упорядоченный тест-функциией

      (while index
        (setq el (nth (car index) lstins))
        ;; поиск нужного атрибута
        (while (and (/= (cdr (assoc 0 (entget el))) "SEQEND") (/= (cdr (assoc 2 (entget el))) tag))
          (setq el (entnext el))
        ) ;_  while

        ;;  если атрибут найден
        (if (= (cdr (assoc 2 (entget el))) tag)
          (progn
            (vla-put-textstring (vlax-ename->vla-object el) (strcat pref (rtos num 2 0) suff))
            (setq num (1+ num)) ;_ приращение номера
          ) ;_  progn
        ) ;_  if
        (setq index (cdr index))
      ) ;_  while

    ) ;_  progn
  ) ;_  if
  (princ)
) ;_  defun
(vl-load-com)
Просмотров: 3659
 
Непрочитано 29.07.2007, 20:52
#2
sasha_lif

Дизайнер-конструктор
 
Регистрация: 29.05.2004
Kiev
Сообщений: 1,179
<phrase 1=


подскажите как работает , что должно быть в блоке (атрибуты?)
__________________
Kiev, Ukraine
sasha_lif вне форума  
 
Непрочитано 30.07.2007, 09:05 Re: Помогите переработать Нумератор /Ренумератор атрибутов б
#3
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от gizmo_zx
...мне надо чтоб сначала сверху-вниз, а уж потом слева на право...
Так?
Код:
[Выделить все]
(defun c:xblocknum1 (/ testf name tag pref suff num ss el lstins ssd eld index)
  (defun testf (a b / ea eb)
    (setq ea (assoc 10 (entget a))
          eb (assoc 10 (entget b))
    )
    (or (> (caddr ea) (caddr eb))
        (and (= (caddr ea) (caddr eb)) (< (cadr ea) (cadr eb)))
    )
  )
  (if (= (setq name0 (getstring "\nИмя блока:[Автомат1] ")) "")
    (setq name1 "Автомат1"
          pref  ""
          suff  ""
    )
    (setq name1 name0
          pref  (getstring "\nПрефикс: ")
          suff  (getstring "\nСуффикс: ")
    )
  )
  (setq tag0 "num"
        name name1
        tag  (strcase tag0)
  )
  (if (null (setq num (getint "\nСтартовый номер <1>: ")))
    (setq num 1)
  )
  (princ "\nБлоки > ")
  (if (setq ss (ssget (list '(0 . "INSERT") '(410 . "Model") (cons 2 name))))
    (progn
      (while (> (sslength ss) 0)
        (setq ss (ssdel (setq el (ssname ss 0)) ss))
        (setq lstins (cons el lstins))
        (setq ssd
               (ssget "_X"
                      (list '(0 . "INSERT") '(410 . "Model") (cons 2 name) (assoc 10 (entget el)))
               )
        )
        (if (> (sslength (ssdel el ssd)) 0)
          (while (> (sslength ssd) 0)
            (setq ssd (ssdel (setq eld (entdel (ssname ssd 0))) ssd))
            (ssdel eld ss)
          )
        )
      )
      (setq index (vl-sort-i lstins 'testf))
      (while index
        (setq el (nth (car index) lstins))
        (while (and (/= (cdr (assoc 0 (entget el))) "SEQEND")
                    (/= (cdr (assoc 2 (entget el))) tag)
               )
          (setq el (entnext el))
        )
        (if (= (cdr (assoc 2 (entget el))) tag)
          (progn
            (vla-put-textstring (vlax-ename->vla-object el) (strcat pref (rtos num 2 0) suff))
            (setq num (1+ num))
          )
        )
        (setq index (cdr index))
      )
    )
  )
  (princ)
)
(vl-load-com)
Не вдавался в детали, только поменял алгоритм сортировки и исправил откровенный косяк. Имя функции изменил, воизбежание конфликта имён.
Alaspher вне форума  
 
Непрочитано 04.08.2007, 23:57
#4
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Можно поподробней как эта програмка считает блоки, я открыл новый файл создал там блок из двух примитивов,
назвал его 1 , потом вставил его здесь же пять раз и запустил xblocknum1 резултат:
Select objects: 0 found

Select objects: Specify opposite corner: 0 found
Select objects: 0 found, 0 total

Select objects: 0 found, 0 total

Select objects: 0 found, 0 total

Select objects: 0 found, 0 total

Select objects: 0 found, 0 total

Select objects: Specify opposite corner: 0 found, 0 total

Select objects: Specify opposite corner: 0 found, 0 total
Holon вне форума  
 
Непрочитано 05.08.2007, 00:06
#5
Holon

CNC
 
Регистрация: 07.07.2007
Israel
Сообщений: 302


Попробовал взял рамку с атрибутами тоже ничего несщитает

Command: _.eattedit
Select a block: 204.076019,15.729530,-3.471080
Command: Specify opposite corner:
Command: 'VLIDE
Command:
Holon вне форума  
 
Непрочитано 05.08.2007, 12:41
#6
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Holon
Блок (по умолчанию, с именем "Автомат1") должен иметь трибут с тэгом - "num".
Alaspher вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Помогите переработать Нумератор /Ренумератор атрибутов блоко