Тема: Пожалуйста, помогите автоматизировать вставку блока.

Имеется блок с атрибутами и макрос на кнопку вставки блока *^C^C(command "_insert" "Извещатель_дымовой"pause 1 1 0.0)
В блоке имеется атрибут по умолчанию BTH 1.1 Нужно, чтобы при вставке следующего блока буквы и первая цифра оставались, а менялась последняя цифра на 1 ед., т.е BTH 1.2, BTH 1.3 и т.д. И еще, чтобы при первом вызове блока и установке вместо BTH 1.1 - BTH 2.1, также менялась последняя цифра.

Re: Пожалуйста, помогите автоматизировать вставку блока.

А поиск чем не устраивает?

Re: Пожалуйста, помогите автоматизировать вставку блока.

подобного не нашел

Re: Пожалуйста, помогите автоматизировать вставку блока.

> Сергей
А подумать и пощелкать по ссылкам?
https://www.caduser.ru/forum/topic12615.html
https://www.caduser.ru/forum/topic11861.html
https://www.caduser.ru/forum/topic11928.html
https://www.caduser.ru/forum/topic3746.html

Re: Пожалуйста, помогите автоматизировать вставку блока.

Много ссылок. Но нужно другое. Там нумерация производиться после расстановки блоков, а мне надо одновременно с простановкой блоков.

Re: Пожалуйста, помогите автоматизировать вставку блока.

> Сергей
Но образцам показанных по ссылкам текстов Вы можете написать текст на ЛИСПе, или Вы хотите чтобы это сделали другие?
Или Вы вообще хотите БКК (большую красную кнопку)?

Re: Пожалуйста, помогите автоматизировать вставку блока.

> Сергей
Если блок с одним атрибутом

;;Originally Posted by ASMI
;;http://www.cadtutor.net/forum/showthread.php?t=11114&page=2
;;https://www.caduser.ru/forum/topic33485.html
(defun c:apnum (/ oldStart oldPref oldSuf oldEcho
        oldSize oldBlock temBl *error* att)
  (defun *error* (msg)
    (setvar "CMDECHO" oldEcho)
    (setvar "ATTDIA" att)
    (princ)
    ); end *error*
  (if(not apnum:Size)(setq apnum:Size 1.0))
  (if(not apnum:Num)(setq apnum:Num 1))
  (if(not apnum:Pref)(setq apnum:Pref ""))
  (if(not apnum:Suf)(setq apnum:Suf ""))
  (setq  oldStart apnum:Num
   oldSize apnum:Size
   oldPref apnum:Pref
   oldSuf apnum:Suf
   oldEcho(getvar "CMDECHO")
   att (getvar "ATTDIA")
   ); end setq
  (setvar "ATTDIA" 0)(setvar "ATTREQ" 1)
  (setvar "CMDECHO" 0)
    (setq apnum:Pref
    (getstring T
      (strcat "\nType prefix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"apnum:Pref"> :")))
  (if(= "" apnum:Pref)(setq apnum:Pref oldPref))
  (if(= " " apnum:Pref)(setq apnum:Pref ""))
  (setq apnum:Suf
    (getstring T
       (strcat "\nType suffix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"apnum:Suf"> :")))
  (if(= "" apnum:Suf)(setq apnum:Suf oldSuf))
  (if(= " " apnum:Suf)(setq apnum:Suf ""))
  (setq apnum:Num
    (getint
      (strcat "\nSpecify start number <"(itoa apnum:Num)">: ")))
  (if(null apnum:Num)(setq apnum:Num oldStart))
  (setq apnum:Size
    (getreal
      (strcat "\nSpecify block scale <"(rtos apnum:Size)">: ")))
  (if(null apnum:Size)(setq apnum:Size oldSize))
  (if apnum:Block(setq oldBlock apnum:Block))
  (setq temBl
     (entsel(strcat "\nSelect block <"
         (if apnum:Block apnum:Block "not difined") "> > "))); end setq
  (cond
    ((and apnum:Block(not temBl)(tblsearch "BLOCK" apnum:Block))
    (setq apnum:Block oldBlock)
     ); end condition #1
    ((= 1 (cdr(assoc 66(entget(car temBl)))))
    (setq apnum:Block(cdr(assoc 2(entget(car temBl)))))
    ); end condition #2
    (t
     (princ "\nBlock not contains attribute! ")
     (setq apnum:Block nil)
     ); end condition #3
    ); end cond
  (if apnum:Block
    (progn
      (princ "\n>>> Pick insertion point or press Esc to quit <<<\n ")
(while T
  (command "_-insert" apnum:Block "_s" apnum:Size pause "0"
       (strcat apnum:Pref(itoa apnum:Num)apnum:Suf)); end command
    (setq apnum:Num (1+ apnum:Num))
  ); end while
); end progn
    ); end if
  (setvar "ATTDIA" att)
  (princ)
  ); end of c:apnum

Номер-целое число. В твоем случае BTH 1. и BTH 2. нужно задавать как префикс

Re: Пожалуйста, помогите автоматизировать вставку блока.

А вот еще примерчик от Fatty
http://cadtutor.net/forum/showthread.php?t=12880

Re: Пожалуйста, помогите автоматизировать вставку блока.


Нумерация блоков
VBA проект позволяет нумеровать блоки по возрастанию
начиная с произвольного числа вводимого пользователем
Подразумевается, что в блоке есть атрибут
с именем "NUM", который принимает значения
нумерации
Код открытый, без пароля, поэтому можно
изменить имя тага на конкретное
Чуствуйте себя свободными для любых изменений

Re: Пожалуйста, помогите автоматизировать вставку блока.

> VVA
У меня блоки имею шесть атрибутов:
1.N (по умолчанию BTH 1.1) в котором необходимо менять последнюю цифру;
2.ПОЗ
3.ТИП
4.МАРКА
5.ПРОИЗВОДИТЕЛЬ
6.ПОТРЕБЛЕНИЕ
Как быть в этом случаи?
И еще вопрос.
Можно ли сделать, чтобы при вызове apnum он не запрашивал блок, а всегда вставлял определенный блок?
И последнюю программка BlockNum у меня запускается!!!

Re: Пожалуйста, помогите автоматизировать вставку блока.

> VVA
У меня блоки имею шесть атрибутов:
1.N (по умолчанию BTH 1.1) в котором необходимо менять последнюю цифру;
2.ПОЗ
3.ТИП
4.МАРКА
5.ПРОИЗВОДИТЕЛЬ
6.ПОТРЕБЛЕНИЕ
Как быть в этом случаи?
И еще вопрос.
Можно ли сделать, чтобы при вызове apnum он не запрашивал блок, а всегда вставлял определенный блок?
И последняя программка BlockNum у меня не запускается!!!

Re: Пожалуйста, помогите автоматизировать вставку блока.

> Сергей
Модернизированный apnum. Теперь binc

(defun c:binc (/ oldStart oldPref oldSuf oldEcho
        oldSize oldBlock temBl *error* att attr apnum:tag pt)
;==== Local functions ============
  (defun *error* (msg)(setvar "CMDECHO" oldEcho)(setvar "ATTDIA" att)(setvar "ATTREQ" attr)(princ)); end *error*
  (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)))))
;; obj - Ename or Vla object of block
;; att_list - list ((Tag_Name1 . Value1)(Tag_Name2 . Value2) ...)
;;                 Tag_Name - string
;;                    Value - string
(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))
            )
            )
          )
        )
      )
    )
  )
;==== Local functions END ============
  ;====================================================================
  (setq apnum:Block "BlockName") ;_Впиши имя блока здесь
  (setq apnum:tag "Nomer")       ;_Впиши имя тага атрибута
  ;===================================================================
  (if(not apnum:Size)(setq apnum:Size 1.0))
  (if(not apnum:Num)(setq apnum:Num 1))
  (if(not apnum:Pref)(setq apnum:Pref ""))
  (if(not apnum:Suf)(setq apnum:Suf ""))
  (setq  oldStart apnum:Num oldSize apnum:Size
         oldPref apnum:Pref oldSuf apnum:Suf
         apnum:Block (mip-conv-to-str apnum:Block)
         apnum:tag (mip-conv-to-str apnum:tag)
         oldEcho (getvar "CMDECHO")
         att (getvar "ATTDIA") attr (getvar "ATTREQ")); end setq
  (setvar "ATTDIA" 0)(setvar "ATTREQ" 0)
  (setvar "CMDECHO" 0)
    (setq apnum:Pref
    (getstring T
      (strcat "\nType prefix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"apnum:Pref"> :")))
  (if(= "" apnum:Pref)(setq apnum:Pref oldPref))
  (if(= " " apnum:Pref)(setq apnum:Pref ""))
  (setq apnum:Suf
    (getstring T
       (strcat "\nType suffix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"apnum:Suf"> :")))
  (if(= "" apnum:Suf)(setq apnum:Suf oldSuf))
  (if(= " " apnum:Suf)(setq apnum:Suf ""))
  (setq apnum:Num
    (getint
      (strcat "\nSpecify start number <"(itoa apnum:Num)">: ")))
  (if(null apnum:Num)(setq apnum:Num oldStart))
  (setq apnum:Size
    (getreal
      (strcat "\nSpecify block scale <"(rtos apnum:Size)">: ")))
  (if(null apnum:Size)(setq apnum:Size oldSize))
  (if apnum:Block(setq oldBlock apnum:Block))
;;;  (setq temBl
;;;     (entsel(strcat "\nSelect block <"
;;;         (if apnum:Block apnum:Block "not difined") "> > "))); end setq
  (cond
    ((null (tblsearch "BLOCK" apnum:Block))
     (alert (strcat "Block " apnum:Block " not found"))
     (setq apnum:Block nil)
     ); end condition #0
    ((and apnum:Block(not temBl)(tblsearch "BLOCK" apnum:Block))
    (setq apnum:Block oldBlock)
     ); end condition #1
    ((and tembl (= 1 (cdr(assoc 66(entget(car temBl))))))
    (setq apnum:Block(cdr(assoc 2(entget(car temBl)))))
    ); end condition #2
    (t
     (princ "\nBlock not contains attribute! ")
     (setq apnum:Block nil)
     ); end condition #3
    ); end cond
  (if apnum:Block
    (progn
(while T
  (princ "\n>>> Pick insertion point or press Esc to quit <<<\n")
  (command "_-insert" apnum:Block "_s" apnum:Size pause "0")
   (mip-block-setattr-bylist (entlast)
     (list(cons (strcase (mip-conv-to-str apnum:tag))
                (strcat apnum:Pref(itoa apnum:Num)apnum:Suf))))
    (setq apnum:Num (1+ apnum:Num))
  ); end while
); end progn
    ); end if
  (setvar "ATTDIA" att)(setvar "ATTREQ" attr)
  (princ)
  )
(princ "\nType BINC to run")

В этих строчках

  ;====================================================================
  (setq apnum:Block "BlockName") ;_Впиши имя блока здесь
  (setq apnum:tag "Nomer")       ;_Впиши имя тага атрибута
  ;===================================================================

вместо BlockName впиши имя блока, вместо Nomer - свое имя тага атрибута
И по прежнему номер-целое число. В твоем случае BTH 1. и BTH 2. нужно задавать как префикс

Re: Пожалуйста, помогите автоматизировать вставку блока.

А подскажите макрос или  как на лиспе вставить блок с заданным visibility? свойством взрывать (или не взрывать) и поворотом, как  из toolpalette,  палетка удобна но долго вставляет, а макрос *^C^C(command "_insert" "Извещатель_дымовой"pause 1 1 0.0) вставляет очень быстро, только свойства добавить

Re: Пожалуйста, помогите автоматизировать вставку блока.

> Светлана
Для поворота :
*^C^C(command "_insert" "Извещатель_дымовой" pause 1 1 pause)
Со взрывом (Без проверок и без запроса взрывать или нет):
*^C^C(defun Izves(/)(command "_insert" "Извещатель_дымовой" pause 1 1 pause)(command "_explode" "_l" ""))(Izves)

Re: Пожалуйста, помогите автоматизировать вставку блока.

> Vitalij
с поворотом получается, а со взрывом нет, он вставляет блок, но не поворачивает и не взрывает, а вставляет с градусо поворота 1 (я сама не поворачиваю)

Re: Пожалуйста, помогите автоматизировать вставку блока.

И еще совсем про слой забыла и (вставка с нужным слоем, (он уже существует в файле) и visibility  блока нужно указать, вроде как градус поворота или как scale. Вообщем нужно вставить блок с параметрами 5 видов:
name :дерево
layer :11
вставляя не поворачивать (без запроса)
name :дерево
layer :11
вставляя повернуть (без запроса),
name :дерево
layer :11
вставляя не поворачивать (без запроса)
взорвать (без запроса)
name :дерево
layer :11
visibility : елка
вставляя не поворачивать (без запроса)
name :дерево
layer :11
visibility : елка
вставляя повернуть(без запроса)

Re: Пожалуйста, помогите автоматизировать вставку блока.

Ехто по поводу взрыва без запроса (исправил):
^C^C(defun Izves(/)(command "_insert" "Извещатель_дымовой" pause 1 1 pause)(command "_explode" "l" ))(Izves)
[rus] So sloem vsjo ponjatno:
[/rus] (command "-layer" "m" "11" "") [rus]
Dal'she, mne ne sovsem ponjatno,[/rus] visibility  ехто атрибут блока или что? Если ехто атрибут, тут надо больше информации, да и код побольше будет, прямо на кнопку вписать наверно не получится, надо будет в отдельный файл записывать и подгружать, я с такими блоками не работаю, по ехтому пасс. Теперь разберём повороты с запросом и без
command "_insert" "Извещатель_дымовой" pause 1 1 pause)
Последний pause перед закрываюшхеи скобкой отвечает за поворот, если его оставить блок будет разворачиваться, но надо будет указывать направление мышкой или другим, автокадовским способом, если вместо pause вписать число, блок будет развернут, на тот угол, какое число вы впишете. 0 значит угол поворота 0 градусов (зависит от  вами выбранных единиц измерения). Если взрывать после ехтого блоки не надо, пример с поворотм на произвольный угол в слое 11, может быть таким:
^C^C(command "-layer" "m" "11" "")(command "_insert" "дерево" pause 1 1 pause)
Надеюсь, что пролил свет на интересуюшхий Вас вопрос

Re: Пожалуйста, помогите автоматизировать вставку блока.

> Светлана
С атрибутами, смотрите посты выше  VVA там целую программулину выложил, дополните слоем и пользуйтесь, а то я тут распинаюсь...:)

> VVA

Re: Пожалуйста, помогите автоматизировать вставку блока.

VVA Огромное спасибо!!! Все работает. Только один недостаток… если блока нет в чертеже, то пишет, что он не найден. Можно как-то это исправить? Еще раз спасибо!!!

Re: Пожалуйста, помогите автоматизировать вставку блока.

> Vitalij
Я думаю, что visibility - это динамический блок.

> Светлана
Посмотри еще здесь http://www.arcada.com.ua/forum/viewtopi … 2e11637b95
Здесь недостающие ф-ции http://www.arcada.com.ua/forum/viewtopi … 2e11637b95

Re: Пожалуйста, помогите автоматизировать вставку блока.

> Сергей
Если уверен, что блок есть в пути и он с атрибутами, то это cond

(cond
    ((null (tblsearch "BLOCK" apnum:Block))
     (alert (strcat "Block " apnum:Block " not found"))
     (setq apnum:Block nil)
     ); end condition #0
    ((and apnum:Block(not temBl)(tblsearch "BLOCK" apnum:Block))
    (setq apnum:Block oldBlock)
     ); end condition #1
    ((and tembl (= 1 (cdr(assoc 66(entget(car temBl))))))
    (setq apnum:Block(cdr(assoc 2(entget(car temBl)))))
    ); end condition #2
    (t
     (princ "\nBlock not contains attribute! ")
     (setq apnum:Block nil)
     ); end condition #3
    ); end cond

удали или закоментируй

Re: Пожалуйста, помогите автоматизировать вставку блока.

Все получилось. Еще раз огромное спасибо!!!

Re: Пожалуйста, помогите автоматизировать вставку блока.

visibility это своыство динамического блока, слои внутри блока, то есть в одном блоке несколько изображений, например дерево (вышлю по почте) Выдели блок и увидишь внизу  широколиственное, елка, и т.д.

Re: Пожалуйста, помогите автоматизировать вставку блока.

> Светлана

;;Возвращает список всех свойст динамического блока в виде списка
;((Имя_свойства Текущее_значение Vla_объект_свойства)...)
;; obj - Vla-указатель дин блока (vla-object)
;;Пример
;;(GetDynamicBlockPropertyList (car(entsel "\nВыбeри дин блок:")))
;;(("Видимость" "Канализация" #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 15246fe4>)
;;   ("Угол" 0.115395 #<VLA-OBJECT IAcadDynamicBlockReferenceProperty 15240fe4>) ...)
(defun GetDynamicBlockPropertyList (obj / lstProperties)
 (if (and (vlax-property-available-p obj "IsDynamicBlock")
          (= (vla-get-IsDynamicBlock obj) :vlax-true)
          (setq lstProperties (vlax-safearray->list
                                           (variant-value
                                            (vla-GetDynamicBlockProperties obj)))))
  (progn
   (mapcar '(lambda (x)(list (vla-get-propertyname X)
                             (variant-value (vla-get-value X))
                             x
                             ))
           lstProperties))))
;; obj - Vla-указатель дин блока (vla-object)
;; PropertyName - имя свойства (string)
(defun GetDynamicBlockPropertyNameValue ( obj PropertyName / Plist)
  (setq PropertyName (strcase PropertyName))
  (setq Plist (GetDynamicBlockPropertyList obj))
  (setq Plist (car(vl-remove-if-not '(lambda (x)
                                   (= (strcase (car x)) PropertyName))
                Plist
                ))
        )
   (cadr Plist)
  )
;;Устанавливает у динамического блока obj свойство PropertyName
;; в значение Value
;; obj - Vla-указатель дин блока (vla-object)
;; PropertyName - имя свойства (string)
;; Value - значение свойства (string)
(defun SetDynamicBlockPropertyNameValue ( obj PropertyName Value / Plist Pobj AllValueList)
  (setq PropertyName (strcase PropertyName))
  (setq Plist (GetDynamicBlockPropertyList obj))
  (setq Plist (car(vl-remove-if-not '(lambda (x)
                                   (= (strcase (car x)) PropertyName))
                Plist
                ))
        )
  (if Plist
    (progn
      (setq Pobj (caddr Plist))
      (setq AllValueList (mapcar 'vlax-variant-value (vlax-safearray->list(vlax-variant-value(vlax-get-property Pobj 'AllowedValues)))))
      (setq dynCount (vlax-Make-Variant (strcase(vl-princ-to-string Value)) vlax-vbString))
      (vla-Put-Value Pobj dynCount)
      )
    )
  )
;blkname - эффективное имя блока (string)
;PropertyName - имя свойства (string)
;Value - новое значение (string)
;ang - угол поворота (градусы) или nil - запрос
;Пример (insDynblock "MIP_KolodciObsledovanie" "Видимость" "Газ" 0)
; с запросом угла поворота
; (insDynblock "MIP_KolodciObsledovanie" "Видимость" "Телефон" nil)
(defun insDynblock ( blkname PropertyName Value ang / obj )
  (defun *error* (error)(princ error)(setvar "attdia" oat)
    (setvar "attreq" oaq)(setvar "cmdecho" 1)(princ))
(vl-load-com)
(setq oat (getvar "attdia") oaq (getvar "attreq"))
  (if (tblsearch "block" blkname)
   (progn
  (setvar "attdia" 0)(setvar "attreq" 0)
  ;(setvar "CLAYER" "11") ;_Установит слой текущим
  (if ang
    (command "_-Insert" blkname "_Rotate" ang pause 1 1)
    (command "_-Insert" blkname pause 1 1 pause)
    )
  (setq obj (vlax-ename->vla-object(entlast)))
  (setvar "attdia" oat)(setvar "attreq" oaq)
  (SetDynamicBlockPropertyNameValue obj PropertyName Value)
    )
  )
  )

В твоем варианте будет что-то
(insDynblock "дерево" "visibility" "елка" 45) с углом 45
(insDynblock "дерево" "visibility" "широколиственное" nil) с запросом угла

Re: Пожалуйста, помогите автоматизировать вставку блока.

вникаю в написаное попутно если можно спрошу о реализации такой вещи
есть линия (отрезок, дуга) нужно разбить ее на равные отрезки и вставить блок с атрибутом
разбить по типу программы _measure, но только в места разбивки вставлять блок, состоящий из отрезка (точка вставки будет его середина, чтоб вставлялся перпендикулярно разбиваемому элементу) и атрибута где в поле "по умолчанию" будет забиваться значение расстояния от начала (к примеру первая точка вставки значение 0, следущая точка вставки значение 10, и так далее, разбиваем по 10 например) а в имене будет писаться значение рассотяние только в виде подписи пикета (тоесть расстояние 200, имя атрибута 2+00.00)....
blush