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

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

Сквозная нумерация динамических блоков

Ответ
Поиск в этой теме
Непрочитано 18.09.2007, 17:45
Сквозная нумерация динамических блоков
zenon
 
Остекляем!!! Алюминим!!!
 
Москва
Регистрация: 21.02.2005
Сообщений: 3,824

Назрело!
В связи с введением динамических блоков начиная с AutoCAD2006, по роду моей деятельности появилась возможность рисовать монтажную схему стоек с указание ее длины в аттрибуте, с автоматическим изменением аттрибута в зависимости от удлинения стойки.
Поэтому назрел вопрос о сквозной нумерации, то бищь присвоении 2му аттрибуту номера стойки в зависимости от ее длины.
см. чертеж
[ATTACH]1190123036.dwg[/ATTACH]
Можно ли расстановку позиций реализовать программно?
ps предварительно расставив стойки.
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
Просмотров: 88197
 
Непрочитано 19.09.2007, 18:21
#21
VVA

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


В первом выложенном файле не нашел атрибута для позиции. Добавил в блок артибут POZ. Ну и соответственно лисп

Код:
[Выделить все]
;_ Numbering of Dynamic Blocks 
(defun c:NDB ( / adoc ss res name bname atname lst lstLen att poz attTo 
               mip-block-setattr-bylist 
              mip-put-hyperlink 
              mip_MakeUniqueMembersOfList 
              member-i 
              get-all-atts 
              mip-conv-to-str
              *error*
              )
;;;================================================
;;;======== НАСТРОЙКИ ПРОГРАММЫ ===================
;;;================================================
 (vl-load-com)   
  (setq bname "Stoyka") ;_Имя блока 
  (setq atname "Dlina") ;_Имя аттрибута откуда брать 
  (setq attTo "Poz") ;_Имя аттрибута куда вбивать

  (setq adoc (vla-get-activedocument (vlax-get-acad-object))) 
  ;; obj - Ename or Vla object of block 
;; att_list - list ((Tag_Name1 . Value1)(Tag_Name2 . Value2) ...) 
;;                 Tag_Name - string 
;;                    Value - string 
(defun *error* (msg)(princ msg)(vla-EndUndoMark adoc))
(defun mip-block-setattr-bylist (obj att_list / txt lst) 
(if (= (type obj) 'ENAME)(setq obj (vlax-ename->vla-object obj))) 
(setq att_list (mapcar '(lambda(x)(cons (strcase (mip-conv-to-str(car x)))(mip-conv-to-str(cdr x)))) att_list)) 
  (if (and obj 
           (not(vlax-erased-p obj)) 
           (= (vla-get-ObjectName obj) "AcDbBlockReference") 
      (eq :vlax-true (vla-get-HasAttributes obj)) 
      (vlax-property-available-p obj 'Hasattributes) 
      (vlax-write-enabled-p obj) 
      ) 
    (vl-catch-all-apply 
      (function 
   (lambda   () 
          (foreach at (vlax-invoke obj 'Getattributes) 
            (if (setq lst (assoc(strcase(vla-get-TagString at)) att_list)) 
              (vla-put-TextString at (cdr lst)) 
            ) 
            ) 
          ) 
        ) 
      ) 
    ) 
  ) 
(defun mip-conv-to-str (dat) 
  (cond ((= (type dat) 'INT)(setq dat (itoa dat))) 
         ((= (type dat) 'REAL)(setq dat (rtos dat 2 12))) 
        ((null dat)(setq dat "")) 
        (t (setq dat (vl-princ-to-string dat))))) 
(defun mip-put-hyperlink (ENAME URLDescription) 
  (if (eq (type ENAME) 'ENAME) 
    (setq ENAME (vlax-ename->vla-object ENAME)) 
  ) ;_ end of if 
  (vlax-for hyp (vla-get-hyperlinks ENAME) (vla-delete hyp)) 
  (vla-add (vla-get-hyperlinks ENAME) 
           "about:blank" 
           URLDescription 
  ) ;_ end of vla-add 
) ;_ end of DEFUN 

;;;Удаляет одинаковые (дубликаты) элементы из списка 
;;;(defun mip_MakeUniqueMembersOfList  ( lst / OutList head) 
;;;  (while lst 
;;;    (setq head (car lst) 
;;;          lst (vl-remove head lst) 
;;;          OutList (append OutList (list head)))) 
;;;  OutList 
;;;  ) 
(defun mip_MakeUniqueMembersOfList  ( lst / OutList head) 
  (while lst 
    (setq head (car lst) 
          lst (vl-remove-if '(lambda(pt)(equal pt head 1e-6)) lst) 
          OutList (append OutList (list head)))) 
  OutList 
  ) 
(defun member-i ( lst num / i) 
 (setq i 0)(while (and lst (not(equal (car lst) num 1e-6))) 
    (setq i (1+ i) lst(cdr lst))) 
  (if (equal (car lst) num 1e-6) i nil)) 
  (defun get-all-atts (obj) 

  (if (and obj 
      (eq :vlax-true (vla-get-HasAttributes obj)) 
      (vlax-property-available-p obj 'Hasattributes) 
       
      ) 
    (vl-catch-all-apply 
      (function 
   (lambda   () 
     (mapcar (function (lambda (x) 
               (cons (vla-get-TagString x) 
                (vla-get-TextString x) 
               ) 
             ) 
        ) 
        (append (vlax-invoke obj 'Getattributes) 
           (vlax-invoke obj 'Getconstantattributes) 
        ) 
     ) 
   ) 
      ) 
    ) 
  ) 
) 
;;;============================================================= 
;;;====================== MAIN PART ============================ 
;;;============================================================= 
  (vla-StartUndoMark adoc)
  (setq *PREF* (mip-conv-to-str *PREF*))
  (setq *SUFF* (mip-conv-to-str *SUFF*))
  (princ "\nВведите префикс или Пробел - нет <")(princ *PREF*)(princ ">: ")
  (setq *PREF* (getstring t))
  (princ "\nВведите суффикс или Пробел - нет :")(princ *SUFF*)(princ ">: ")
  (setq *SUFF* (getstring t))
  (if (= *PREF* " ")(setq *PREF* "") t)(if (= *SUFF* " ")(setq *SUFF* "") t)         
  (if (and (setq ss (ssget  '((0 . "INSERT")(66 . 1))))
           (setq lstLen (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
           )
    (progn
      (vla-regen adoc acactiveviewport)    
;;;      (setq ss nil)
;;;      (vl-cmdf "_.UPDATEFIELD")
;;;      (foreach blk lstlen (vl-cmdf blk))(vl-cmdf "")
      (foreach blk 
               (mapcar 'vlax-ename->vla-object lstlen) ;_ end of mapcar 
        (setq name (cond 
                     ((and (vlax-property-available-p blk 'isdynamicblock) 
                           (= (vla-get-isdynamicblock blk) :vlax-true) 
                           ) ;_ end of and 
                      (vla-get-effectivename blk) 
                      ) 
                     (t (vla-get-name blk)) 
                     ) ;_ end of cond 
              ) ;_ end of setq 
        (if (= (strcase name)(strcase bname)) 
          (setq lst (cons blk lst))) 
         ;_ end of if 
        ) ;_ end of foreach 
      (setq lstLen (mapcar '(lambda(x)(cdr(assoc (strcase atname)(get-all-atts x)))) lst)) 
      (setq lstLen (vl-remove-if 'null lstLen)) 
      (setq lstLen (mapcar 'atof lstLen)) 
      (setq lstLen (mip_MakeUniqueMembersOfList lstLen)) 
      (setq lstLen (vl-sort lstLen '(lambda(a b)(< a b)))) 
      (princ "\n Позиция  Длинна")(setq poz 1) 
      (foreach blk lstlen 
        (princ "\n")(princ poz)(princ "  -  ")(princ blk) 
        (setq poz (1+ poz)) 
        ) 
      (foreach blk lst 
        (if (and 
              (setq att(cdr(assoc (strcase atname)(get-all-atts blk)))) 
              (setq att (atof att)) 
              (setq poz (member-i lstlen att)) 
              ) 
          (progn 
            ;_Маркиреум 
            (mip-put-hyperlink blk (itoa(1+ poz))) 
            (mip-block-setattr-bylist blk
              (list (cons (strcase attTo)(strcat *PREF* (itoa(1+ poz)) *SUFF*)))) 
            ) 
          ) 
        ) 
      ) ;_ end of progn 
    ) ;_ end of if
  (vla-EndUndoMark adoc)
  (princ) 
  )
*** ИЗМЕНЕНО 20.09.2007
1. Добавлены пропущенные ф-ции
2. Добавлен выбор объектов
3. Предварительно обновляются поля блоков

*** ИЗМЕНЕНО 21.09.2007
1. Добавлена регенерация, суффикс, префикс
[ATTACH]1190211834.dwg[/ATTACH]
VVA вне форума  
 
Непрочитано 19.09.2007, 18:27
#22
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Вот если выноски так сделать как я сделал, то тогда действительно, пошевелил выноску и U поменялось. Два одинаковых блока с разностоящими выносками называются по разному.
Supermax вне форума  
 
Непрочитано 19.09.2007, 18:28
#23
Кулик Алексей aka kpblc
Moderator

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


Ага, а GetDynamicProperties сделано для красоты? Мой код проанализируй построчно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.09.2007, 18:35
#24
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Нет округления длин. Если длинна оличается от другой на пол миллиметра, то что и номер у нее должен быть другой?
Supermax вне форума  
 
Автор темы   Непрочитано 19.09.2007, 18:38
#25
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,824
<phrase 1=


2 VVA
чейто у меня вот
Код:
[Выделить все]
Command: NDB
; error: no function definition: GET-ALL-ATTS
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 19.09.2007, 18:39
#26
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Чего-то не фурычит твой лисп. Говори как пользоваться.
Supermax вне форума  
 
Непрочитано 19.09.2007, 18:43
#27
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


И у меня аналогично
Supermax вне форума  
 
Автор темы   Непрочитано 19.09.2007, 18:44
#28
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,824
<phrase 1=


2 Кулик Алексей aka kpblc
а здесь
Код:
[Выделить все]
Command:
Command: (try-to-renum)
; error: too few arguments
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 19.09.2007, 18:47
#29
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Гениально Kpblc!
С начала мы все элементы сделанные дин. блоками и имеющие атрибут для номера прочесываем и маркируем редактируя значение этого атрибута. Затем пишем малюсенькую прогу, которая ставит выноски, а значение в них слизывает из значения атрибута того элемента к которому выноска ставиться.
ГЕНИАЛЬНО!
Supermax вне форума  
 
Автор темы   Непрочитано 19.09.2007, 18:55
#30
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,824
<phrase 1=


2 Supermax идею насчет привязки позиции к длине элемента, я понял. Получается
длина L1 - позиция N1
длина L2 - позиция N2
длина L3 - позиция N3
.
.
.
длина Ln - позиция Nn
плюс - понятно как!
минус - скажем при градации длин 1мм от 100 до 8000 позиций будет мммммммм вообщем много будет, если на чертеже всего 10-15 типоразмеров и длины весьма отличаются будет что-то так
1586 - поз.1586
2222 - поз. 2222
250 - поз. 250
...

както не катит :?
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 19.09.2007, 18:56
#31
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


В макросе не задана функция get-all-atts.
Supermax вне форума  
 
Автор темы   Непрочитано 19.09.2007, 18:59
#32
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,824
<phrase 1=


2 пост 30
ps
хотя идея мне нравится
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Автор темы   Непрочитано 19.09.2007, 19:13
#33
zenon

Остекляем!!! Алюминим!!!
 
Регистрация: 21.02.2005
Москва
Сообщений: 3,824
<phrase 1=


Объясню для чего мне это надо.
Монтажную схему стоек (ригелей) сейчас приходится делать вручную, проставлять позиции, считать длины, заносить в таблицу. Отсюда велика вероятность ошибки, что неправильно замаркируешь или длину укажешь, или в таблице значения перепутаешь. Приходится долго нудно и кропотливо проверять. А проект как всегда нужен вчера.
Поэтому большое спасибо тем кто откликнулся. [sm140]
Думаю полученная в итоге программа пригодится не только мне.
__________________
Мы можем делать быстро, качественно и недорого, выбирайте любые 2 условия.:search:
zenon вне форума  
 
Непрочитано 19.09.2007, 19:14
#34
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Нет, градации длин должны округляться самим пользователем. Хочешь 1мм а хочешь 10мм, а хочешь и 50мм. С начала задать размер округления, а затем маркируешь. Тоько маркировка начинается всегда с 1, а вот первая длинна может быть какая угодно, но естественно самая маленькая из выбранных для маркировки элементов. К цифре надо и текстик автоматически добавлять. Типа буквочек или целых слов типа "Стойка-1". Текстик этот надо тоже пользователю давать для определения.
Supermax вне форума  
 
Непрочитано 19.09.2007, 19:18
#35
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Да я, дык, теплотрассы динамическими блоками труб развожу и хотя у меня там и есть атрибут "номер позиции" я его пока вообще не заполняю. А тут такая удача. Жаль что Kpblc в Питере, а то бы расцеловал.
Supermax вне форума  
 
Непрочитано 19.09.2007, 19:26
#36
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Kpblc, скажи, что тебе надо? Хочешь объемами проектных работ поделюсь, или увековечу твое имя на всех чертежах что выпускаю?
(денег не дам, и не проси! Самому нужны)
Supermax вне форума  
 
Непрочитано 19.09.2007, 19:56
#37
Кулик Алексей aka kpblc
Moderator

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


Я ж в комментах написал, как пользоваться.
Код:
[Выделить все]
(try-to-renum "dlina" "pos")
- посмотрите внимательнее.
> Supermax : Не очень догнал, чего, получилось?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.09.2007, 20:21
#38
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Я хоть и не видел как работает твой макрос по причине его временной нетрудоспособности, но чисто интуитивно предположил, что ты длины читаешь, сортируешь, нумеруешь и атрибуты блокам правишь.
Может ты чего не так задумал?
И где скажи ты определил функцию get-all-atts? Она в нескольких местах встречается и кад ее хочет! Ты понимаешь, КАД ЕЕ ХОЧЕТ!!!
Supermax вне форума  
 
Непрочитано 19.09.2007, 20:24
#39
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


TRY-TO-RENUM запустил, но он ничего с блоками не сделал. Ни длины не изменил, ни номера не поставил.
Supermax вне форума  
 
Непрочитано 19.09.2007, 20:37
#40
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Что касаемо ригелей, то длинну там вручную ставить нельзя! Это изделие штатное и на заказ его делают только если ОЧЕНЬ припечет.
Поэтому смотрите мой DWG и не длинну тогда надо считывать, а марку изделия. Собственно Kpblc ты не отвлекайся, длинну делай, длинну. Марку потом вставишь. Мне в данный момент длинна важнее.
Считываешь длинну, делишь ее на число, что тебе юзер дал как округление, полученное значение округляешь до целого и полученное значение после умножения на число пользователя, заносишь как настоящее значение длинны этого элемента.
Я бы так делал.
Supermax вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Сквозная нумерация динамических блоков

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

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