Как може да се търси ако имаме дублаж в стойностите?
Трика от видеото е много полезен. Ползвам го често. В общия случай върши страхотна работа.
За съжаление съм се сблъсквал и със следния проблем - дублиращите се стойности в различните атрибути.
пример: излолзвам блока за врата от урока. Имам атрибут ВИСОЧИНА със стойност 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 'append (mapcar '(lambda (x) (if (= "1" (get_tile x)) (list x))) '("at" "av")))))
(set_tile "error" "Specify Attribute Option!")
)
( (setq r (append (list (= "1" (get_tile "b"))) (vl-some '(lambda (x) (if (= "1" (get_tile x)) (list x))) '("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
('((f)(setvar 'errno 0) (f))
'(( / e enx o )
(cond
( (= 52 (getvar 'errno)) nil)
(
(or
(not (setq e (car (nentsel "\nPick Attribute <exit>: "))))
(not (member '(0 . "ATTRIB") (setq enx (entget e))))
(and (= 7 (getvar 'errno)) (princ "\nMissed, try again.") (setvar 'errno 0))
)
(f)
)
( (setvar 'errno 52) (setq o (vlax-ename->vla-object e))
(cons (vla-get-EffectiveName (vlax-ename->vla-object (cdr (assoc 330 enx)))) (mapcar '(lambda (x) (vlax-get o x)) '(TagString TextString)))
)
)
)
)
); setq nfo
); not
)
(
(not
(setq SS
(ssget (cdr (assoc (cadr r) '(("ss" . "_:L-I")("sx" . "_X"))))
(append
'((0 . "INSERT") (66 . 1))
(if (car r) (list (cons 2 (strcat "`**," (car nfo)))))
(list (if (= 1 (getvar 'cvport)) (cons 410 (getvar 'ctab)) '(410 . "Model")))
); append
); ssget
); setq SS
); not
)
(
(
'(( 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)
)
)
(
(
'(( m v / nSS )
(setq nSS (ssadd))
(vl-some (function (lambda (a b) (if (equal a m) (eval b))))
'(("at" "av")("at")("av"))
'(
(foreach x L (and (vl-some '(lambda (att) (equal v (mapcar '(lambda (xx) (vlax-get att xx)) '(TagString TextString)))) (vlax-invoke x 'GetAttributes)) (ssadd (vlax-vla-object->ename x) nSS)))
(progn (setq v (car v)) (foreach x L (and (vl-some '(lambda (att) (eq (vlax-get att 'TagString) v)) (vlax-invoke x 'GetAttributes)) (ssadd (vlax-vla-object->ename x) nSS))))
(progn (setq v (cadr v)) (foreach x L (and (vl-some '(lambda (att) (eq (vlax-get att 'TextString) v)) (vlax-invoke x '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
'(((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 'eval
'(
(progn
(and (< 0 dch) (unload_dialog dch))
(and (eq 'FILE (type des)) (close des))
(and (eq 'STR (type dcl)) (findfile dcl) (vl-file-delete dcl))
); progn
); list
); vl-catch-all-apply
(princ)
); defun
(vl-load-com) (princ)
Зарежда се като нормален Лисп ... селектира на база TAG или Value на точно определен атрибут, като избора на този тончо определен атрбут е с цъкане, т.е. ако искаш да селелктираш блоковете с атрибутна информация Височина и стоиност на височината 200, трябва да кликнеш върху такъв атрибут и ще ти селектира всички блокове с дадения атрибут с дадената стойност.
Тоя лисп е страхотен, Краси!
Не знам от къде ги вадиш, но ти Благодаря!
Моля!
Супер е че ти върши работа.
Дори успешно търси в атрибути с invisible=Yes...стига преди това да съм ги направил видими на екрана като сменя временно състоянието на ATTDISP от "Normal" на "ON"
Здравейте, много интересен LISP. Веднаго му намерих приложение. Но до сега съм инсталирал LISP програмки които не са зададени в този формат, като текст. Може ли по подробно да ми обясните как да го направя. Благодаря предварително. Поздрави!
Здравей, Николай.
По-горе LISP - а е записан под формата на код ... всеки един лисп и най-семплия изглежда именно по този начин... текст.
Както казваш обикновено си свикнал даден лисп да го получаш под формата на файл, който файл го зареждаш в AutoCAD посредством комадндата APPLOAD.
В случая когато обаче имаш само текст, може да направиш две неща:
Да селектираш текста (кода на лиспа), да го копираш и да го поставиш в командния ред на AutoCAD и да натиснеш Space. Лиспа ще бъде зареден в рамките на текущата сесия на AutoCAD. Не препоръчвам този вариант т.к. шанса да се загуби лиспа след време или нещо да се обърка не е никак малък.
Да направиш лиспа във файл, така както си свикнал да го виждаш. Как може да стане това? Пак селектираш текста, след което копираш и поставяш текста в програмка като Notepad например, съответно запазваш след това файл, които файл вместо да запазиш с разширение .txt, трябва да го запазиш като файл с разширение .lsp .
Тук препоръката ми е да не се използва Notepad - a който е инсталиран заедно с Windowс, ами да се сложи една много лека и много полезна програмка която е Notepad ++ (снимка 1 позиция 1).Тя е напълно безплатна и е направена именно с такава цел за кодове, къдеот бързо да видиш структурата на кода и най-удобното е че подържа разширенията директно, така че можеш директно да избереш запазване в .lsp файлов формат, както е показано на снимка 1.
След като вече имаш вече лиспа под формата на файл ... нещата се свеждат до познатия ти начин за зареждане и ползване на лисп програмката.
В общи линии е това :)
Ако има нещо допълнително, което искаш да попиташ пиши тук е мястото!
Здравей, станаха нещата и заработиха. Сега ако трябва да променя атрибут в група блокове няма да ги маркирам един по един.Проблема беше при направа на .lsp формата. Знаците станаха на ченгелчета и кутийки, но после копирах текста на тяхното място и всичко заработи. Дали ще може да селектира и при два атрибута?! Или при атрибут и слой? Ще пробвам.Много съм нахален към програмата. Благодаря за съдействието и вниманието! Лека вечер!
Здравейте, проблема с текста който стана на кутийки и намерих как да го подменя ми даде следната идея. Вземаш работещ LISP, сменяш му текста и наименованието и няма да търсиш програми за модифициране. Лесно, бързо и практично. И не иска много знания!!!