Así que estoy haciendo una función simple en autolisp para contar el número de un bloque específico en un dibujo, y se ve así:

(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)))
)

Ahora, lo que realmente quiero es contar la cantidad de bloques en un área específica, definida por el usuario. Es decir, el usuario llamará a la función, y luego la función pedirá un área específica, donde buscará el bloque específico y los contará, sin contar los bloques de fuera del área seleccionada.

0
Gevezo 25 jul. 2020 a las 16:45

1 respuesta

La mejor respuesta

En lugar de utilizar la cadena de modo x de la función ssget ( que busca en toda la base de datos de dibujos todas las entidades que cumplen los criterios del argumento de la lista de filtros), simplemente omita este argumento para permitir al usuario hacer una selección utilizando cualquier método de selección válido, por ejemplo:

(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)
)

Hay algunos otros problemas con su código actual:

  • Siempre declare las variables cuyo alcance es local a su función: en mi ejemplo anterior, notará que el símbolo sel se declara en la lista de variables dentro de la expresión defun. Para obtener más información sobre por qué esto es importante, puede consultar mi tutorial aquí.

  • Debe probar si ssget devuelve un conjunto de selección válido antes de llamar a la función sslength para obtener el número de elementos del conjunto, ya que (sslength nil) generará un error. Verá que utilizo una instrucción if en mi código para lograr esto.

  • El argumento de la lista de filtros ssget debe ser una lista de asociación de pares de puntos y, como tal, debe haber un espacio entre key y value en cada elemento de la lista, de ahí esto:

    (0. "INSERT")
    

    Debe convertirse en:

    (0 . "INSERT")
    
  • Debe incluir una expresión (princ) o (prin1) final dentro de la expresión defun para que la función devuelva un símbolo nulo a la línea de comando, en lugar de devolver el valor devuelto por la última expresión evaluada ( es decir, la expresión alert, que devolverá nil). Incluir una expresión (princ) según mi ejemplo asegurará que la función salga 'limpiamente'.

3
Lee Mac 26 jul. 2020 a las 11:07