RUGGIUNO
Guest
ingoenius
06-10-2006, 09.30.13
salve ho un grosso problema nel recuperare delle informazioni tramite lisp su dei blocchi selezionati,
l'obbiettivo é
selezionare dei blocchi di un disegno e recuperare un file .txt
formattato in modo che ogni linea sia cosi'
nomeblocco posx posy posz rotx roty roz sizex sizey sizez
adesso tramite altri aiuti dal forum francese sono arrivato ad avere quasi tutto, manca solo il modo di trascrivere le rotazioni x y z del blocco ,
lo ro suggeriscono delle cosa da cui io non ho capito molto , se voi ne sapete un po' di piu' e volete aiutarmi , alla fine vi daro' il lisp completo piu' un file python per blender , che serve appunto insieme a questo
vi intaressa??
ecco le linee che consigliano i francesi e che io non ho capito
come usare e come mettere nello script
possiamo recuperare il vettore normale del piano xy du sco du bloc :
(setq norm (cdr (assoc 210 (entget ent)))) ou (vlax-get (vlax-ename->vla-object ent) 'normal)
et la rotation globale in rapporto a l'asse des x du scg :
(setq norm (cdr (assoc 50 (entget ent)))) ou (vla-get-rotation (vlax-ename->vla-object ent))
questi dati con il punto di inserzione sono sufficenti per riposizionare un blocco nella stessa posizione
rpor66
06-10-2006, 13.06.04
ti spiego quello che ho capito:
- il codice 50 restituisce l'angolo di rotazione del blocco, rispetto all'asse z del piano ucs corrente.
- il codice 210 da la direzione di estrusione del blocco, come coordinata relativa ad un punto di origine 0,0,0.
puoi calcolarti le rotazioni sugli assi x e y.
il punto di estrusione lo chiamo pt1:
(setq pt1 (cdr (assoc 210 (entget ent))))
angolo rispetto ad asse y:
(setq angy (angle (list 0 0) (list (car pt1) (caddr pt1))))
praticamente valore x e z di pt1
angolo rispetto ad asse x:
(setq angx (angle (list 0 0) (list (cadr pt1) (caddr pt1))))
praticamente valore y e z di pt1
a questo punto spero di non aver detto troppe boiate, perdonami altrimenti.
ingoenius
06-10-2006, 13.42.00
scusa la mia ignoranza, ma il punto pt1 dove lo prendi?
é il punto di inserzione del blocco?
sto provando in tutti i modi ma non riesco a trovare la soluzione
qualche anima buona sa come convertire queste informazioni ??
joseph
06-10-2006, 15.28.14
pt1 non è il punto di inserimento del blocco, le cui coordinate ricavi dal codice 10.
pt1 è l'estremo di un vettore unitario (più esattamente versore) il cui primo estremo è posto nel punto 0,0,0 del sistema wcs e il secondo estremo (pt1) ha coordinate, misurate rispetto all'wcs, indicate al codice 210; dà perciò un'indicazione di quanto si è spostato un asse z, perpendicolare al piano di costruzione dell'oggetto e ad esso vincolato, rispetto all'asse z del sistema generale wcs.
avrei invece ritenuto più utile calcolare gli angoli che il versore forma con i piani xy, xz e yz rispettivamente.
joseph
shape3d
06-10-2006, 17.05.31
io posso passarti una macro in vba che fa quello che chiedi, l'unica cosa è che riesco a rilevare solola rotazione del blocco rispetto al piano x e non gli altri due, proprietà che non sembra supportata dall'oggetto.
ti può essere utile
esempio di output
b8_bul 2951.30809795133 1389.09771122033 0 0 5 5 5
b8_bul 2934.33048331957 881.86783654291 0 0 5 5 5
b8_bul 2899.79716463915 375.446428864027 0 0 5 5 5
b8_bul 1167.77729042529 1897.82314609118 0 0 5 5 5
uguale 2151.39373139713 2873.86710126779 0 3.14159265358979 5 5 5
uguale 2151.39373139713 2837.90857169245 0 3.14159265358979 5 5 5
uguale 2151.39373139713 2619.19578420389 0 3.14159265358979 5 5 5
uguale 2151.39373139713 2518.41146068467 0 3.14159265358979 5 5 5
uguale 2151.39373139713 2183.04014469941 0 3.14159265358979 5 5 5
uguale 2151.39373139713 2127.57512580539 0 3.14159265358979 5 5 5
ingoenius
09-10-2006, 11.03.50
allora grazie alla collaborazione vostra e del forum francese cadxp e del forum cad italiano e del formi kino3d siamo arrivato penso ad una conclusione
per quento riguarda lo scrip autolisp
questo é quello che viene fuori
attenzione pero' da quello che ho visto per funzionare perfattamente
bisogna settare nelle unità del disegno che si analizza
un valore alto di precisione per il calcolo dei gradiio ho messo 0.000000
e ottengo una precisione accettabile per la rotazione dei blocchi
ho aggiunto le linee per settare le variabili di precisione degli archi
;;; asin retourne l'arc sinus du nombre, en radians
(defun asin (num)
(if (<= -1 num 1)
(atan num (sqrt (- 1 (expt num 2))))
)
)
;;; apply a transformation matrix to a vector by vladimir nesterovsky
(defun mxv (m v)
(mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
)
;(defun c:blend ()
(defun c:blend (/ ss n index str obj nome ins rot norm rotvec rotx roty rotz rotvec file)
(setq ss (ssget (list (cons 0 "insert")))) ;zero é il codice del nome
(setq n (sslength ss))
(setq index 0)
(setq old-arcunits (getvar "aunits"))
(setq old-arcprec (getvar "auprec"))
(setvar "aunits" 0) ;set des unité pour le degres
(setvar "auprec" 6) ;set des precision pour le degres
(setq str "") ; chaine de caractère vide
;inizio del repeat ------------------------------------
(repeat n ; répéter pour chaque bloc
(setq obj (vlax-ename->vla-object (ssname ss index)))
(setq nome (if (vlax-property-available-p obj "effectivename")
(setq nome (vla-get-effectivename obj))
(setq nome (vla-get-name obj))
)
)
(setq ins (vlax-get obj 'insertionpoint))
(setq rot (vla-get-rotation obj))
(setq norm (vlax-get obj 'normal))
;; calcul de la rotation du vecteur x dans le sco du bloc
(setq rotvec (trans (polar '(0 0 0) rot 1.0) norm 0))
;; calcul des rotations subie par le bloc sur y puis sur z
(setq roty (- (asin (caddr rotvec)))) ; rotation sur y
(setq rotz (atan (cadr rotvec) (car rotvec))) ; rotation sur z
;; calcul de la rotation inverse subie par le vecteur normal sur z
(setq zvec (mxv (list
(list (cos (- rotz)) (- (sin (- rotz))) 0)
(list (sin (- rotz)) (cos (- rotz)) 0)
'(0 0 1)
)
norm
)
)
;; calcul de la rotation inverse subie par le vecteur normal sur y
(setq zvec (mxv (list
(list (cos (- roty)) 0 (sin (- roty)))
'(0 1 0)
(list (- (sin (- roty))) 0 (cos (- roty)))
)
zvec
)
)
;; calcul de la rotation subie par le bloc sur x
(setq rotx (- (atan (cadr zvec) (caddr zvec))))
(setq str (strcat str ; ajout à la chaine précédente
nome
" "
(rtos (car ins))
" "
(rtos (cadr ins))
" "
(rtos (caddr ins))
" "
(angtos rotx)
" "
(angtos roty)
" "
(angtos rotz)
" "
(rtos (vla-get-xscalefactor obj))
" "
(rtos (vla-get-yscalefactor obj))
" "
(rtos (vla-get-zscalefactor obj))
"\n" ; saut de ligne
)
)
(setq index (1+ index)) ;pour passer au bloc suivant
) ; fin de repeat
(setvar "aunits" old-arcunits)
(setvar "auprec" old-arcprec)
(if
(setq file (getfiled "seletionner un fichier" "" "txt" 1))
;choisir ou créer un fichier
(progn
(setq file (open file "a")) ; ouvrir lr fichier
(princ str file) ; écrire dans le fichier
(close file) ; fermer le fichier
)
)
(princ)
)
ancora grazie per la partecipazione di tutti
06-10-2006, 09.30.13
salve ho un grosso problema nel recuperare delle informazioni tramite lisp su dei blocchi selezionati,
l'obbiettivo é
selezionare dei blocchi di un disegno e recuperare un file .txt
formattato in modo che ogni linea sia cosi'
nomeblocco posx posy posz rotx roty roz sizex sizey sizez
adesso tramite altri aiuti dal forum francese sono arrivato ad avere quasi tutto, manca solo il modo di trascrivere le rotazioni x y z del blocco ,
lo ro suggeriscono delle cosa da cui io non ho capito molto , se voi ne sapete un po' di piu' e volete aiutarmi , alla fine vi daro' il lisp completo piu' un file python per blender , che serve appunto insieme a questo
vi intaressa??
ecco le linee che consigliano i francesi e che io non ho capito
come usare e come mettere nello script
possiamo recuperare il vettore normale del piano xy du sco du bloc :
(setq norm (cdr (assoc 210 (entget ent)))) ou (vlax-get (vlax-ename->vla-object ent) 'normal)
et la rotation globale in rapporto a l'asse des x du scg :
(setq norm (cdr (assoc 50 (entget ent)))) ou (vla-get-rotation (vlax-ename->vla-object ent))
questi dati con il punto di inserzione sono sufficenti per riposizionare un blocco nella stessa posizione
rpor66
06-10-2006, 13.06.04
ti spiego quello che ho capito:
- il codice 50 restituisce l'angolo di rotazione del blocco, rispetto all'asse z del piano ucs corrente.
- il codice 210 da la direzione di estrusione del blocco, come coordinata relativa ad un punto di origine 0,0,0.
puoi calcolarti le rotazioni sugli assi x e y.
il punto di estrusione lo chiamo pt1:
(setq pt1 (cdr (assoc 210 (entget ent))))
angolo rispetto ad asse y:
(setq angy (angle (list 0 0) (list (car pt1) (caddr pt1))))
praticamente valore x e z di pt1
angolo rispetto ad asse x:
(setq angx (angle (list 0 0) (list (cadr pt1) (caddr pt1))))
praticamente valore y e z di pt1
a questo punto spero di non aver detto troppe boiate, perdonami altrimenti.
ingoenius
06-10-2006, 13.42.00
scusa la mia ignoranza, ma il punto pt1 dove lo prendi?
é il punto di inserzione del blocco?
sto provando in tutti i modi ma non riesco a trovare la soluzione
qualche anima buona sa come convertire queste informazioni ??
joseph
06-10-2006, 15.28.14
scusa la mia ignoranza, ma il punto pt1 dove lo prendi?
é il punto di inserzione del blocco?
sto provando in tutti i modi ma non riesco a trovare la soluzione
qualche anima buona sa come convertire queste informazioni ??
pt1 non è il punto di inserimento del blocco, le cui coordinate ricavi dal codice 10.
pt1 è l'estremo di un vettore unitario (più esattamente versore) il cui primo estremo è posto nel punto 0,0,0 del sistema wcs e il secondo estremo (pt1) ha coordinate, misurate rispetto all'wcs, indicate al codice 210; dà perciò un'indicazione di quanto si è spostato un asse z, perpendicolare al piano di costruzione dell'oggetto e ad esso vincolato, rispetto all'asse z del sistema generale wcs.
avrei invece ritenuto più utile calcolare gli angoli che il versore forma con i piani xy, xz e yz rispettivamente.
joseph
shape3d
06-10-2006, 17.05.31
io posso passarti una macro in vba che fa quello che chiedi, l'unica cosa è che riesco a rilevare solola rotazione del blocco rispetto al piano x e non gli altri due, proprietà che non sembra supportata dall'oggetto.
ti può essere utile
esempio di output
b8_bul 2951.30809795133 1389.09771122033 0 0 5 5 5
b8_bul 2934.33048331957 881.86783654291 0 0 5 5 5
b8_bul 2899.79716463915 375.446428864027 0 0 5 5 5
b8_bul 1167.77729042529 1897.82314609118 0 0 5 5 5
uguale 2151.39373139713 2873.86710126779 0 3.14159265358979 5 5 5
uguale 2151.39373139713 2837.90857169245 0 3.14159265358979 5 5 5
uguale 2151.39373139713 2619.19578420389 0 3.14159265358979 5 5 5
uguale 2151.39373139713 2518.41146068467 0 3.14159265358979 5 5 5
uguale 2151.39373139713 2183.04014469941 0 3.14159265358979 5 5 5
uguale 2151.39373139713 2127.57512580539 0 3.14159265358979 5 5 5
ingoenius
09-10-2006, 11.03.50
allora grazie alla collaborazione vostra e del forum francese cadxp e del forum cad italiano e del formi kino3d siamo arrivato penso ad una conclusione
per quento riguarda lo scrip autolisp
questo é quello che viene fuori
attenzione pero' da quello che ho visto per funzionare perfattamente
bisogna settare nelle unità del disegno che si analizza
un valore alto di precisione per il calcolo dei gradiio ho messo 0.000000
e ottengo una precisione accettabile per la rotazione dei blocchi
ho aggiunto le linee per settare le variabili di precisione degli archi
;;; asin retourne l'arc sinus du nombre, en radians
(defun asin (num)
(if (<= -1 num 1)
(atan num (sqrt (- 1 (expt num 2))))
)
)
;;; apply a transformation matrix to a vector by vladimir nesterovsky
(defun mxv (m v)
(mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
)
;(defun c:blend ()
(defun c:blend (/ ss n index str obj nome ins rot norm rotvec rotx roty rotz rotvec file)
(setq ss (ssget (list (cons 0 "insert")))) ;zero é il codice del nome
(setq n (sslength ss))
(setq index 0)
(setq old-arcunits (getvar "aunits"))
(setq old-arcprec (getvar "auprec"))
(setvar "aunits" 0) ;set des unité pour le degres
(setvar "auprec" 6) ;set des precision pour le degres
(setq str "") ; chaine de caractère vide
;inizio del repeat ------------------------------------
(repeat n ; répéter pour chaque bloc
(setq obj (vlax-ename->vla-object (ssname ss index)))
(setq nome (if (vlax-property-available-p obj "effectivename")
(setq nome (vla-get-effectivename obj))
(setq nome (vla-get-name obj))
)
)
(setq ins (vlax-get obj 'insertionpoint))
(setq rot (vla-get-rotation obj))
(setq norm (vlax-get obj 'normal))
;; calcul de la rotation du vecteur x dans le sco du bloc
(setq rotvec (trans (polar '(0 0 0) rot 1.0) norm 0))
;; calcul des rotations subie par le bloc sur y puis sur z
(setq roty (- (asin (caddr rotvec)))) ; rotation sur y
(setq rotz (atan (cadr rotvec) (car rotvec))) ; rotation sur z
;; calcul de la rotation inverse subie par le vecteur normal sur z
(setq zvec (mxv (list
(list (cos (- rotz)) (- (sin (- rotz))) 0)
(list (sin (- rotz)) (cos (- rotz)) 0)
'(0 0 1)
)
norm
)
)
;; calcul de la rotation inverse subie par le vecteur normal sur y
(setq zvec (mxv (list
(list (cos (- roty)) 0 (sin (- roty)))
'(0 1 0)
(list (- (sin (- roty))) 0 (cos (- roty)))
)
zvec
)
)
;; calcul de la rotation subie par le bloc sur x
(setq rotx (- (atan (cadr zvec) (caddr zvec))))
(setq str (strcat str ; ajout à la chaine précédente
nome
" "
(rtos (car ins))
" "
(rtos (cadr ins))
" "
(rtos (caddr ins))
" "
(angtos rotx)
" "
(angtos roty)
" "
(angtos rotz)
" "
(rtos (vla-get-xscalefactor obj))
" "
(rtos (vla-get-yscalefactor obj))
" "
(rtos (vla-get-zscalefactor obj))
"\n" ; saut de ligne
)
)
(setq index (1+ index)) ;pour passer au bloc suivant
) ; fin de repeat
(setvar "aunits" old-arcunits)
(setvar "auprec" old-arcprec)
(if
(setq file (getfiled "seletionner un fichier" "" "txt" 1))
;choisir ou créer un fichier
(progn
(setq file (open file "a")) ; ouvrir lr fichier
(princ str file) ; écrire dans le fichier
(close file) ; fermer le fichier
)
)
(princ)
)
ancora grazie per la partecipazione di tutti
Last edited by a moderator: