Więc robię prostą funkcję w Autolisp, aby policzyć liczbę określonej bloku na rysunku, a wygląda tak:

(defun c:contarblocos()
    (setq ss (ssget "x" ' ((0. "INSERT") (2. "Nome do bloco"))))
    (setq count (sslength ss))
    (alert(strcat "Total de blocos no desenho: " (itoa count)))
)

Teraz, co naprawdę chcę liczyć liczbę bloków w określonym obszarze, zdefiniowanym przez użytkownika. Innymi słowy, użytkownik zadzwoni do funkcji, a następnie funkcja poprosi o określony obszar, gdzie będzie szukać konkretnego bloku i policz ich, nie licząc żadnych bloków spoza wybranego obszaru.

0
Gevezo 25 lipiec 2020, 16:45

1 odpowiedź

Najlepsza odpowiedź

Zamiast używać ciągów trybu x ssget ( który przeszukuje całą bazę danych rysunkową dla wszystkich podmiotów, które spełniają kryteria argumentu listy filtrów), po prostu pomijać ten argument, aby umożliwić użytkownikowi dokonanie wyboru przy użyciu dowolnej prawidłowej metody wyboru, np.:

(defun c:contarblocos ( / sel )
    (if (setq sel (ssget '((0 . "INSERT") (2 . "Nome do bloco"))))
        (alert (strcat "Total de blocos no desenho: " (itoa (sslength sel))))
    )
    (princ)
)

Istnieje kilka innych problemów z bieżącym kodem:

  • Zawsze deklaruj zmienne, których zakres jest lokalny do Twojej funkcji: W moim powyższym przykładzie zauważysz, że symbol sel jest zadeklarowany na liście zmiennej w wyrażeniu {x1}}. Aby uzyskać więcej informacji na temat tego, dlaczego jest to ważne, możesz odnieść się do mojego samouczka tutaj.

  • Powinieneś przetestować, czy ssget zwraca prawidłowy zestaw wyboru przed wywołaniem funkcji sslength, aby uzyskać liczbę elementów w zestawie, ponieważ {x2}} błąd. Zobaczysz, że używam oświadczenia if w moim kodzie, aby to osiągnąć.

  • Argument listy filtrów ssget powinien być listą stowarzyszenia pary kropkowanych, a jako taką, powinno być przestrzeń między key i value w każdej pozycji listy, stąd:

    (0. "INSERT")
    

    Powinno stać się:

    (0 . "INSERT")
    
  • Powinieneś zawierać final (prin1) lub (prin1) wyrażenie w wyrażeniu defun, dzięki czemu funkcja zwróci symbol zerowy do wiersza poleceń, zamiast zwrócić wartość zwracaną przez ostatnie ocenione wyrażenie ( tj. Wyrażenie alert, co powróci nil). W tym wyrażenie (princ) na mój przykład zapewni, że funkcja wyjść "czysto".

3
Lee Mac 26 lipiec 2020, 11:07