Бързи справки по критерии в атрибутите на блоковете

Безплатни 20 урока
регистрирай се и научи

Ако сте вече потребител - Регистриран съм
Видео
Назад Алтернативен видео плеър
¿ Напред

Тест за преминаване към следващия урок

 
Можем ли да търсим по стойности на атрибут в AutoCAD?
Не, това е невъзможно с AutoCAD и никъде не е документирано
Да, първо избираме блоковете за този атрибут и после с FIND търсим по атрибута
Да, само с външна autolisp програмка

Въпроси и отговори

  • Find не търси в атрибути с invisible=Yes

    Иван Цукев:

    Трябва да се отбележи, че find не търси в скрити атрибути.

    Гергана Касърова:

    Това уточнение е важно!

    VAiOS:

    Току що пробвах това на версия 2018 и всъщност ТЪРСИ. Може би, защото е по-нова версия, но като махна отметката на "Ignore hidden items" (снимка) си търси и в атрибути с invisible=Yes. Използвал съм файла към упражнението.

  • Краси Кръстев:

    Здравей, предполгам че болтовете гайките и т.н. са с различни големини, ако им за всеки различен вид от даден елемент имаш различен блок с различно име, няма проблем да направиш една бърза справка по име ( с QP ) за дадения блок - слектирай ми блоковете с име M12 ( т.е. болтове M12 ) и съответно в properties да видиш тяхната бройка. АКо искаш да ги извадиш за количествена сметка с dataextraction тогава просто като информация при dataextraction извади блоковете с тяхното име като сложиш и колона count и съответно кажеш тази колона count да ти събира блоковете с едно и също име и така срещу всяко име на блок ще си изкараш бройката.

    Все пак ако искаш повече информация и имаш доста различния в блковете може с наученото от курса да ги направиш по - хитри с атрибути на различни visibility - та и т.н. да не навлизам в много подробности в курса относно ваденето на количества има доста показани неща, във форума ако поразтърсите има и доста теми и коментари на тази тема за вадене на количества бързи справки, както и други алетрнативни методи за вадене на количества.
    Надявам се да съм бил полезен с отговора и да съм ви насочил, ако срещнете затрунения пишете тук за допълнителни разяснения.
  • Защо не се променя?

    Албена Стойкова:

    Здравейте, влизам в block edit и задавам на последните 3 невидими атрибута - invisible-yes, за да мога да ги използвам за филтриране , но не се променят,остават си невидими.

    Краси Кръстев:

    ATTSYNC, за вече въведениете блокове направили ?

    Албена Стойкова:

    Не съм. Благодаря!

  • Как може да се търси ако имаме дублаж в стойностите?

    VAiOS:

    Трика от видеото е много полезен. Ползвам го често. В общия случай върши страхотна работа.

    За съжаление съм се сблъсквал и със следния проблем - дублиращите се стойности в различните атрибути.

    пример: излолзвам блока за врата от урока. Имам атрибут ВИСОЧИНА със стойност 210

    и атрибут ЦЕНА, в която също имам стойност 210.

    Как лесно и бързо да накарам да търси само във ВИСОЧИНА ?

    Ако някой знае някакъв трик - моля да сподели.

    Краси Кръстев:

    Здравей,

    Ето този LISP ще свърши работата, която искаш -

    (defun C:SelBlksByAttTag ( / msg dcl des dch dcf r )
    
     (vl-some (function (lambda (x / msg) (and (vl-catch-all-error-p (setq msg (vl-catch-all-apply (eval x)))) (prompt (strcat "\nError: " (vl-catch-all-error-message msg))))))
       '(
         (function 
           (lambda nil 
             (and (setq dcl (vl-filename-mktemp nil nil ".dcl")) (setq des (open dcl "w"))
               (mapcar (function (lambda (x) (princ (strcat "\n" x) des))) 
                 '("SelBlksByAttTag : dialog"
                   "{ label = \"Select by Attribute\"; spacer_1;"
                   "  : boxed_column"
                   "  { label = \"Attribute options\";"
                   "    : toggle { label = \"Tag\"; key = \"at\"; value = 1; }"
                   "    : toggle { label = \"Value\"; key = \"av\"; value = 1; }"
                   "  }"
                   "  spacer;"
                   "  : boxed_radio_column"
                   "  { label = \"Block Selection\";"
                   "    : radio_button { label = \"All\"; key = \"sx\"; value = 1; }"
                   "    : radio_button { label = \"Manual\"; key = \"ss\"; }"
                   "  }"
                   "  spacer;"
                   "  : column"
                   "  {"
                   "    : toggle { label = \"Same Name Blocks\"; key = \"b\"; alignment = centered; }"
                   "  }"
                   "  spacer_1; ok_cancel; : text { key = \"error\"; }"
                   "}"
                 ); list
               ); mapcar
               (not (setq des (close des))) (< 0 (setq dch (load_dialog dcl))) (new_dialog "SelBlksByAttTag" dch)
               (progn 
                 (action_tile "accept"
                   (vl-prin1-to-string
                     (quote
                       (
                         (lambda ( / tmp )
                           (cond 
                             ( (not (setq tmp (apply &#039;append (mapcar &#039;(lambda (x) (if (= "1" (get_tile x)) (list x))) &#039;("at" "av")))))
                               (set_tile "error" "Specify Attribute Option!")
                             )
                             ( (setq r (append (list (= "1" (get_tile "b"))) (vl-some &#039;(lambda (x) (if (= "1" (get_tile x)) (list x))) &#039;("sx" "ss")) tmp))
                               (done_dialog 1) 
                             )
                           ); cond
                         ); lambda
                       )
                     ); quote
                   ); vl-prin1-to-string
                 ); action_tile
                 (/= 1 (setq dcf (start_dialog)))
               ); progn
               (setq r nil)
             ); and
           ); lambda
         ); function 
         (function 
           (lambda ( / nfo SS L )
             (cond
               ( (not r) )
               ( 
                 (not
                   (setq nfo
                     (&#039;((f)(setvar &#039;errno 0) (f))
                       &#039;(( / e enx o )
                         (cond
                           ( (= 52 (getvar &#039;errno)) nil)
                           (
                             (or
                               (not (setq e (car (nentsel "\nPick Attribute <exit>: ")))) 
                               (not (member &#039;(0 . "ATTRIB") (setq enx (entget e)))) 
                               (and (= 7 (getvar &#039;errno)) (princ "\nMissed, try again.") (setvar &#039;errno 0))
                             )
                             (f)
                           )
                           ( (setvar &#039;errno 52) (setq o (vlax-ename->vla-object e))
                             (cons (vla-get-EffectiveName (vlax-ename->vla-object (cdr (assoc 330 enx)))) (mapcar &#039;(lambda (x) (vlax-get o x)) &#039;(TagString TextString)))
                           )
                         )
                       )
                     )
                   ); setq nfo
                 ); not
               )
               (
                 (not
                   (setq SS 
                     (ssget (cdr (assoc (cadr r) &#039;(("ss" . "_:L-I")("sx" . "_X")))) 
                       (append 
                         &#039;((0 . "INSERT") (66 . 1))
                         (if (car r) (list (cons 2 (strcat "`**," (car nfo)))))
                         (list (if (= 1 (getvar &#039;cvport)) (cons 410 (getvar &#039;ctab)) &#039;(410 . "Model")))
                       ); append
                     ); ssget
                   ); setq SS
                 ); not
               )
               (
                 (
                   &#039;(( b / bnm i o ) 
                     (setq i (sslength SS))
                     (cond 
                       (b
                         (setq bnm (car nfo))
                         (repeat i (and (eq bnm (vla-get-EffectiveName (setq o (vlax-ename->vla-object (ssname SS (setq i (1- i))))))) (setq L (cons o L))))
                       ); b
                       ( (repeat i (setq L (cons (vlax-ename->vla-object (ssname SS (setq i (1- i)))) L))) )
                     ); cond
                     (not L)
                   ); list
                   (car r)
                 )
               )
               (
                 (
                   &#039;(( m v / nSS ) 
                     (setq nSS (ssadd))
                     (vl-some (function (lambda (a b) (if (equal a m) (eval b))))
                       &#039;(("at" "av")("at")("av"))
                       &#039;(
                         (foreach x L (and (vl-some &#039;(lambda (att) (equal v (mapcar &#039;(lambda (xx) (vlax-get att xx)) &#039;(TagString TextString)))) (vlax-invoke x &#039;GetAttributes)) (ssadd (vlax-vla-object->ename x) nSS)))
                         (progn (setq v (car v)) (foreach x L (and (vl-some &#039;(lambda (att) (eq (vlax-get att &#039;TagString) v)) (vlax-invoke x &#039;GetAttributes)) (ssadd (vlax-vla-object->ename x) nSS))))
                         (progn (setq v (cadr v)) (foreach x L (and (vl-some &#039;(lambda (att) (eq (vlax-get att &#039;TextString) v)) (vlax-invoke x &#039;GetAttributes)) (ssadd (vlax-vla-object->ename x) nSS))))
                       ); list
                     ); vl-some
                     (sssetfirst nil nSS)
                   ); list
                   (cddr r)
                   (cdr nfo)
                 )
               )
             ); cond
           ); lambda
         ); function
       ); list
     ); vl-some
    
     &#039;(((87 114 105 116 116 101 110 32 98 121) (71 114 114 114) (67 114 101 100 105 116 115 32 116 111) (76 101 101 32 77 97 99))
       (104 116  116  112 58 47 47 119  119 119 46 99 97 100 116  117 116  111 114 46 110   101  116  47 102 111 114 117 109 47 115 104 111  119    116 104 114 101 97 100 
         46 112 104 112 63 49 48    50 55 56 54 45 83 101 108 101 99 116  45 98 108  111 99 107 115 45 98 121 45 97 116 116 114 105 98 117 116 101 45 84 65 71
       )
     )
    
     (vl-catch-all-apply &#039;eval
       &#039;(
         (progn
           (and (< 0 dch) (unload_dialog dch))
           (and (eq &#039;FILE (type des)) (close des))
           (and (eq &#039;STR (type dcl)) (findfile dcl) (vl-file-delete dcl))
         ); progn
       ); list
     ); vl-catch-all-apply
     (princ)
    ); defun
    (vl-load-com) (princ)
    

    Зарежда се като нормален Лисп ... селектира на база TAG или Value на точно определен атрибут, като избора на този тончо определен атрбут е с цъкане, т.е. ако искаш да селелктираш блоковете с атрибутна информация Височина и стоиност на височината 200, трябва да кликнеш върху такъв атрибут и ще ти селектира всички блокове с дадения атрибут с дадената стойност.

    VAiOS:

    Тоя лисп е страхотен, Краси!

    Не знам от къде ги вадиш, но ти Благодаря!

    Краси Кръстев:

    Моля!

    Супер е че ти върши работа.

    VAiOS:

    Дори успешно търси в атрибути с invisible=Yes...стига преди това да съм ги направил видими на екрана като сменя временно състоянието на ATTDISP от "Normal" на "ON"

    Николай Николов:

    Здравейте, много интересен LISP. Веднаго му намерих приложение. Но до сега съм инсталирал LISP програмки които не са зададени в този формат, като текст. Може ли по подробно да ми обясните как да го направя. Благодаря предварително. Поздрави!

    Краси Кръстев:

    Здравей, Николай.

    По-горе LISP - а е записан под формата на код ... всеки един лисп и най-семплия изглежда именно по този начин... текст.

    Както казваш обикновено си свикнал даден лисп да го получаш под формата на файл, който файл го зареждаш в AutoCAD посредством комадндата APPLOAD.

    В случая когато обаче имаш само текст, може да направиш две неща:

    1. Да селектираш текста (кода на лиспа), да го копираш и да го поставиш в командния ред на AutoCAD и да натиснеш Space. Лиспа ще бъде зареден в рамките на текущата сесия на AutoCAD. Не препоръчвам този вариант т.к. шанса да се загуби лиспа след време или нещо да се обърка не е никак малък.

    2. Да направиш лиспа във файл, така както си свикнал да го виждаш. Как може да стане това? Пак селектираш текста, след което копираш и поставяш текста в програмка като Notepad например, съответно запазваш след това файл, които файл вместо да запазиш с разширение .txt, трябва да го запазиш като файл с разширение .lsp .

    Тук препоръката ми е да не се използва Notepad - a който е инсталиран заедно с Windowс, ами да се сложи една много лека и много полезна програмка която е Notepad ++ (снимка 1 позиция 1).Тя е напълно безплатна и е направена именно с такава цел за кодове, къдеот бързо да видиш структурата на кода и най-удобното е че подържа разширенията директно, така че можеш директно да избереш запазване в .lsp файлов формат, както е показано на снимка 1.

    Снимка_1

    След като вече имаш вече лиспа под формата на файл ... нещата се свеждат до познатия ти начин за зареждане и ползване на лисп програмката.

    В общи линии е това :)

    Ако има нещо допълнително, което искаш да попиташ пиши тук е мястото!

    Николай Николов:

    Здравей, станаха нещата и заработиха. Сега ако трябва да променя атрибут в група блокове няма да ги маркирам един по един.Проблема беше при направа на .lsp формата. Знаците станаха на ченгелчета и кутийки, но после копирах текста на тяхното място и всичко заработи. Дали ще може да селектира и при два атрибута?! Или при атрибут и слой? Ще пробвам.Много съм нахален към програмата. Благодаря за съдействието и вниманието! Лека вечер!

    Николай Николов:

    Здравейте, проблема с текста който стана на кутийки и намерих как да го подменя ми даде следната идея. Вземаш работещ LISP, сменяш му текста и наименованието и няма да търсиш програми за модифициране. Лесно, бързо и практично. И не иска много знания!!!