Как да маркирам САМО конкретни видимости?

AutoCAD Формула II AutoCAD

Чудесна е възможността, която дават динамичните блокове - да имаме десетина блока в един. Но какво става ако искам да маркирам/селектирам САМО блоковете от определена видимост. Ще използвам за пример файла към урока. Да кажем, че съм маркирал с Quick Select всички блокове с име "A-vrata-Interior" - Снимка 1

този блок има ТРИ видимости (Visibility states): Гладка врата, Единично остъкление и Тройно остъкление - Снимка 2

Някой знае ли лесен начин, чрез който да селектирам всички врати, които са с Тройно остъкление? Очакваният резултат - Снимка 3

Здравей, VAiOS! Решението според мен е следното: За всяка видимост си създаваш слой. 1. Слой за Гладка врата 2.Слой за Единично остъкление 3. Слой за Тройно остъкление Слагаш си конкретните врати в съответния слой и тогава вече със Select Similar всичко ще си е наред... Дано това да е от помощ. Приятен ден!

Живка, благодаря за бързия отговор. За съжаление това решение не е приложимо за мен. Не виждам как може да стане това с помощта на слоеве. Може би така съм си задал въпроса, че не е станало ясно каква ми е идеята. Примерно съм използвал въпросния блок "A-vrata-Interior" в един чертеж N на брой пъти. Искам да разбера колко от вратите са, примерно, с тройно остъкление. Data extraction не ме устройва напълно, защото освен, че искам да разбера каква е бройката, искам и да ги маркирам,т.е. да имам селекция, за да мога с едно движение в палета Properties да ги сменя на гладки врати примерно.

Здравейте, Живка и VAiOS

и от мен!

(defun c:SVIS (/ LM:getvisibilityparametername _curvis curvis e en ess ssvis)

  ;; Get Visibility Parameter Name  -  Lee Mac
  ;; Returns the name of the Visibility Parameter of a Dynamic Block (if present)
  ;; blk - [vla] VLA Dynamic Block Reference object
  ;; Returns: [str] Name of Visibility Parameter, else nil

  (defun LM:getvisibilityparametername (blk / vis)
    (if
      (and
    (vlax-property-available-p blk 'effectivename)
    (setq blk
           (vla-item
         (vla-get-blocks (vla-get-document blk))
         (vla-get-effectivename blk)
           )
    )
    (= :vlax-true (vla-get-isdynamicblock blk))
    (= :vlax-true (vla-get-hasextensiondictionary blk))
    (setq vis
           (vl-some
         '(lambda (pair)
            (if
              (and
            (= 360 (car pair))
            (= "BLOCKVISIBILITYPARAMETER"
               (cdr (assoc 0 (entget (cdr pair))))
            )
              )
               (cdr pair)
            )
          )
         (dictsearch
           (vlax-vla-object->ename (vla-getextensiondictionary blk))
           "ACAD_ENHANCEDBLOCK"
         )
           )
    )
      )
       (cdr (assoc 301 (entget vis)))
    )
  )
  (defun _curvis (_e _vn)
    (vlax-get
      (vl-some '(lambda (l)
          (if (eq _vn (vla-get-propertyname l))
            l
          )
        )
           (vlax-invoke _e 'GetDynamicBlockProperties)
      )
      'Value
    )
  )
  (if
    (and (setq e (ssget "_:S:E" '((0 . "INSERT"))))
     (setq
       en (vla-item (vla-get-blocks
              (vla-get-ActiveDocument (vlax-get-acad-object))
            )
            (setq effname
                   (vla-get-EffectiveName
                 (setq e (vlax-ename->vla-object (ssname e 0)))
                   )
            )
          )
     )
     (minusp (vlax-get en 'IsDynamicBlock))
     (setq visname (LM:getvisibilityparametername e))
     (setq curvis (_curvis e visname))
     (setq ssvis (ssadd)
           ssx   (ssget "X" (list (cons 2 (strcat effname ",`*U*"))))
     )
    )

     (repeat (setq i (sslength ssx))
       (if (and (eq (vla-get-EffectiveName
              (setq es (vlax-ename->vla-object
                 (setq ess (ssname ssx (setq i (1- i))))
                   )
              )
            )
            effname
        )
        (eq (_curvis es visname) curvis)
       )
     (ssadd ess ssvis)
       )
     )
  )
  (if curvis
    (sssetfirst nil ssvis)
  )
  (princ)
)

Ето един lisp който ще свърши работа.

Зарежда се като стандартен lisp, стартира се с командата SVIS , действа на следния принцип - стартира се избира се един от блоковете в дадения Visibility state и съответно селдва автоматична селекция на всички блокове с това isibility.

Лека и спокойна вечер :)

Благодаря, Краси. Наистина полезен lisp. Аз до сега си използвах тактиката със слоевете.

Краси, благодаря. Изглежда обещаващо, но при мен не се получава :( Стартирам lisp-а; маркирам блока и нищо не се случава. С F2 вадя следната информация "; error: bad argument type: VLA-OBJECT nil"

На какво може да се дължи?

Здравей, VAiOS.

Пробвай да изтеглиш lisp - а от тук:

SVIS.lsp

и го зареди и виж какво ше стане.

При мен работи, когато се копира лисп така както съм го поставил по - горе понякога се допускат грешка по копирането ... случвало ми се е така че така като е във файл, този пропуск може да се елеминира... така че тествай с файла :)

Благодаря за съдействието, Краси. Изтеглих lisp-a, но няма промяна. Пак същото съобщение вади. Може ли проблема да са системни променливи или нещо подобно?

Лисп-а е много полезен!

Това, че "не тръгва" при мен се оказа супер частен случай, тоест, проблем има само този файл, този блок, на този компютър. На други машини или с други файлове си работи, при това чудесно!

Искам да обърна внимание на една особеност в начина на работа на лисп-а.

Търси НАВСЯКЪДЕ!

което значи и в моделното пространсто, и във всички лейаут-и.

Това за мен се оказа много важна особеност, защото го използвам и за преброяване на количества. Когато имаш един блок на няколко места(model + layout), а искаш да брои само тези в model-а, съответно стават грешки. След като разбрах това, и то по трудния начин :) , за мен решението е да вкарвам в блок тези блокове, които не искам да бъдат броени.

Здравей, VAOS.

Препоръката ми е, и то не само в този случай, е да не слагаш нищо в Layout -a, което да е извън viewport -a.

Имам предвид че ако в Layout-a имаш само vieport - ти, те реално гледат в моделното пространство и съответно елементите дали са погледнати през viewport или през моделното пространство ... те реално са само и единствено в областа на моделното пространство и няма как да се преброят повторно.

АКО обаче дадения блок е поставен в Layout - a, като обект сам по себе си, то той вече е част от Layout - a, и тогава вече си е отделен обект, който следва да влезне в бройката при преброяването.

в моя случай в Layout-a освен viewport имам рамка с антетка по шаблон. Като част от него е и Легенда, съдържаща блокове, които подлежат на броене.

Принципно сe стремя да няма други елементи в Layout-a, но в случая в рамката стоят неща, които са еднакви за всички чертежи от типа.

Рамка и антетка са определено добра практика да са на блок, най-вече антетка. Това вече определено е малък проблем ако имаш 20-тина Layout - a .

SVIS и кирилица НЕ са добра комбинация!

Забелязах, че когато името на параметъра на видимостта (Visibility Parameter) и на самата видимост (Visibility state) е на кирилица - НЕ работи коректно. Или изписва грешка, или селектрира всички видимости, вместо само маркираната. Преименуването на латиница оправя нещата.

От доста време се чудех защо, тази иначе супер полезна лисп програмка, прави проблеми и случайно установих, че точно кирилицата е проблема.


Вашият отговор

Научи компютърните програми онлайн от топ експертите на България
Регистрацията в АУЛА ви дава:
  • 20 безплатни урока
  • Трикове и тънкости за софтуера
  • Отговори на вашите въпроси
  • Регистрация