Problema cifre decimali

joe

Utente Standard
Professione: Disegnatore strutture reticolari spaziali
Software: autocad 2015
Regione: campania
#1
Buongiorno a tutti, di seguito una domanda relativa alle cifre decimali:
in un disegno vi sono una grossa quantità di linee con lunghezze variabili e tutte con cifre decimali; impostando a "0" la precisione, ogni lunghezza verrà arrotondata per eccesso o per difetto e mediante una ricerca, dovrei riuscire a fare una lista di lunghezze intere, .
E' quello che serve a me per il lavoro che devo fare; l'errore in autocad, che mi porta fuori strada è il seguente: durante il conteggio con "qselect" di una determinata lunghezza mi viene riportato un numero totale di linee, con quella lunghezza, che io prendo per vera; nella ricerca della seconda lunghezza la differenza è di 1 mm e quella stessa linea, che era stata conteggiata precedentemente, viene ricalcolata;
es.: se nel disegno vi sono linee di lunghezza 2150.90 e 2150.40, dopo aver impostato la precisione a "0", con "qselect" il risultato è il seguente
ricerca la lunghezza 2150 mi seleziona tutte le linee tra 2150.40 e 2150.90
ricerca la lunghezza 2151 l'identica seleziona

Con questo, alcune stesse linee mi verranno conteggiate due volte e io sbaglio i conti
Come mai?
Grazie, Gianni
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
#2
Codice:
;variabili pubbliche
(setq slL1 0.0)
(setq slL2 0.0)

;lunghezza da selezione linea
(defun c:SelLinedaLine(/ n p10 p11)
    (command "_regen")
    (setq n (car (Sing "\Seleziona linea: ")))
    (setq p10 (cdr (assoc 10 (entget n))))
    (setq p11 (cdr (assoc 11 (entget n))))
    (setq slL1 (distance p10 p11))   
    (c:SelLineL)
)

;imposta range lunghezze
(defun c:SelLineL()
    (command "_regen")
    (setq slL1 (default slL1 "\nLunghezza linea: "))
    (setq slL2 (default slL1 "\nLunghezza linea: "))
    (SelLineL)
)

(defun SelLineL(/ delta L ssel c p10 p11 d s)
    (setq ssel (ssget "X" (list (cons 0 "LINE"))))
    (setq c 0)
    (setq s (ssadd))
    (setq delta (abs (- slL1 slL2)))
    (repeat (sslength ssel)
        (setq n (ssname ssel c))
        (setq p10 (cdr (assoc 10 (entget n))))
        (setq p11 (cdr (assoc 11 (entget n))))
        (setq d (distance p10 p11))
        (if (and (>= d slL1) (< d (+ slL1 delta 0.99)))
            (progn
                (setq s (ssadd n s))
                (redraw n 3)
            )
        )
        (setq c (1+ c))
    )   
    (princ (strcat "\nLinee selezionate " (rtos (sslength s) 2 0) " di " (rtos c 2 0)))
    (princ)
)
    
; Funzione. Input da prompt command. Ripropone il valore precedente o quello passato alla chiamata della funzione.
; Var: variabile o valore di tipo real o string
; Prompt: variabile di tipo string
; esempio: (default 10.0 "Immetti valore ") -> Immetti valore <10.0>:
; con invio si conferma 10.0 altrimenti la funzione ritorna il nuovo valore
(defun Default (Var Prompt / i)
  (if (= (type Var) (type ""))
    (progn
      (if (= Var nil)
                (setq Var "")
      )
      (setq i (getstring t (strcat Prompt "<" Var ">: ")))
      (if (= i "")
                (setq i nil)
      )
    )
    (progn
      (if (= Var nil)
                (setq Var 0.0)
      )
      (setq i (getreal (strcat Prompt "<" (rtos Var) ">: ")))
    )
  )
  (if (= i nil) Var i) 
)
SelLinedaLine: imposti lunghezza linea da cercare tramite selezione linea
SelLineL: imposti il range di lunghezza tramite 2 valori
 

joe

Utente Standard
Professione: Disegnatore strutture reticolari spaziali
Software: autocad 2015
Regione: campania
#4
Buongiorno, ho visto che con questo codice le linee interessate vengono evidenziate ma non selezionate; se venissero selezionate io potrei mandarle tutte su un nuovo layer o nasconderle.
Potresti cortesemente modificare in questo senso il lisp?
Grazie
 

rpor66

Utente Standard
Professione: Programmatore
Software: AutoCad, GstarCAD, CadWorx, Excel, Lisp, VBA
Regione: Sicilia
#5
Codice:
;variabili pubbliche
(setq slL1 0.0)
(setq slL2 0.0)

;lunghezza da selezione linea
(defun c:SelLinedaLine(/ n p10 p11)
    (command "_regen")
    (setq n (car (Sing "\Seleziona linea: ")))
    (setq p10 (cdr (assoc 10 (entget n))))
    (setq p11 (cdr (assoc 11 (entget n))))
    (setq slL1 (distance p10 p11))
    (c:SelLineL)
)

;imposta range lunghezze
(defun c:SelLineL(/ lSel)
    (command "_regen")
    (setq slL1 (default slL1 "\nLunghezza linea: "))
    (setq slL2 (default slL1 "\nLunghezza linea: "))
    (setq lSel (SelLineL))
    (command "_select" (car lSel) "")
    (princ (strcat "\nLinee selezionate " (rtos (sslength (car lSel)) 2 0) " di " (rtos (cadr lSel) 2 0)))
    (princ)
)

(defun SelLineL(/ delta L ssel c p10 p11 d s)
    (setq ssel (ssget "X" (list (cons 0 "LINE"))))
    (setq c 0)
    (setq s (ssadd))
    (setq delta (abs (- slL1 slL2)))
    (repeat (sslength ssel)
        (setq n (ssname ssel c))
        (setq p10 (cdr (assoc 10 (entget n))))
        (setq p11 (cdr (assoc 11 (entget n))))
        (setq d (distance p10 p11))
        (if (and (>= d slL1) (< d (+ slL1 delta 0.99)))
            (setq s (ssadd n s))           
        )
        (setq c (1+ c))
    )       
    (list s c)
)
    
; Funzione. Input da prompt command. Ripropone il valore precedente o quello passato alla chiamata della funzione.
; Var: variabile o valore di tipo real o string
; Prompt: variabile di tipo string
; esempio: (default 10.0 "Immetti valore ") -> Immetti valore <10.0>:
; con invio si conferma 10.0 altrimenti la funzione ritorna il nuovo valore
(defun Default (Var Prompt / i)
  (if (= (type Var) (type ""))
    (progn
      (if (= Var nil)
                (setq Var "")
      )
      (setq i (getstring t (strcat Prompt "<" Var ">: ")))
      (if (= i "")
                (setq i nil)
      )
    )
    (progn
      (if (= Var nil)
                (setq Var 0.0)
      )
      (setq i (getreal (strcat Prompt "<" (rtos Var) ">: ")))
    )
  )
  (if (= i nil) Var i) 
)

; Funzione che obbliga a selezionare l'entità. utilizza la funzione entsel.
(defun Sing (Prompt / A)
    (while (not (setq A (entsel Prompt))))   
  A
)
Selezioni le linee selezionate tramite _Previous