• このフォーラムは、www.cad3d.it/forum1 - イタリアのデザインコミュニティの機械翻訳です。いくつかの用語は正しく翻訳されていません。

デシマリ

  • Thread starter Thread starter joe
  • Start date Start date

joe

Guest
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
 
Code:
;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
 
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
 
Code:
;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
 

Forum statistics

Threads
46,674
Messages
380,976
Members
2
Latest member
loop80
このフォーラムは、www.cad3d.it/forum1 - イタリアのデザインコミュニティの機械翻訳です。いくつかの用語は正しく翻訳されていません。

Members online

No members online now.
Back
Top