Invité ingoenius Posté(e) le 25 octobre 2007 Posté(e) le 25 octobre 2007 Salut , grace a vos precieux aides, j'ai ce lisp qui genere un fichier txt avec la liste des blocs selectionnes et leur info le tout dans la bonne formattation des lignes, (je l'utilise avec blender) pour optimiser son utilisation il faudrait ordonner le fichier txt avant de l'enregistrer il me faudrait un ordre alfabetique par rapport au noms des blocs de facons a avoir d'abord tous le blocs chaises ensuite les blocs tables etc , j'ai la moindre idee de comment mi prendre ;-( merci pour vos aides ;-) ;;; 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)2 6);6 é la quantità di decimali da calcolare " " (rtos (cadr ins)2 6) " " (rtos (caddr ins)2 6) " " (angtos rotX 0 8);8 é la quantità di decimali da calcolare " " (angtos rotY 0 8) " " (angtos rotZ 0 8) " " (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) )
bseb67 Posté(e) le 25 octobre 2007 Posté(e) le 25 octobre 2007 Salut ingoenius! Est-ce que t'es blocs ont des noms spécifiques?chez nous les blocs réprésentant un objet commenceent par le_bloc_truc,puis on met les dimensions si c'est du tube ou autre, donc on obtientle_bloc_truc_200_120le_bloc_truc_180_120le_bloc_truc_20_120 Mais là, si tu trie par le nom (avec un AutoCAD-strlsort cela n'ira pas, car 180 < 20 en alphabétique.Donc l'astuce je trouvé, c'est de créer une liste du genre:(200 . le_bloc_truc_200_120)(180 . le_bloc_truc_180_120)(20 . le_bloc_truc_20_120) Puis de trier sur le diamètre. Cela pour un type de blocs, ensuite si tu veux l'appliquer sur plusieurs types, tu lance d'abord sur blocs de types chaises, et ainsi de suite. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Invité ingoenius Posté(e) le 25 octobre 2007 Posté(e) le 25 octobre 2007 effectivement, il peut avoir 500 fois le bloc chaise , mais a des coordonnees differentes ou aussi divers nom de bloc type H30V-C003-3D H30V-L100-3D etc pour moi 'important serait d'avoir les blocs commencent par le meme nom regroupes ensemble, masi effectivement peut etre plus difficile de ce qui semble ;-(
bseb67 Posté(e) le 25 octobre 2007 Posté(e) le 25 octobre 2007 Re, Le lisp que j'ai fait faisait en gros ceci:(setq l_bloc (cherche_liste_bloc "TK-HY-TUB")) => cherche tous les bloc de types tubes(setq l_bloc (trier l_bloc 15 "DN")) => trie la liste des noms en cherchant le diamètre (après les caractères DN et ce à partir du 15 caractères pour le nom du bloc ex: TK-HY-TUB-STD-DN100-114.3x3.6 le diamètre est après "DN" et il est de 100TK-HY-TUB-STD-DN10-17.2x2.0 ici de 10 seulement Ensuite:(setq l_bloc (cherche_liste_bloc "TK-HY-C45")) => cherche tous les bloc de types coudes à 45°(setq l_bloc (trier l_bloc 15 "DN")) => trie sur le diamètre Voici le lisp de recherche ;------------------------------------; ; nom: cherche_liste_bloc ; ; role: retourne la liste des noms ; ; de blocs commencant par mask ; ; param: mask => chaine de caractères; ; retour: liste de noms ; ; date: 16/10/2007 ; ; BLAES Sébastien ; ;------------------------------------; (defun cherche_liste_bloc( mask / param res bloctmp) (setq res '() param t) ; on boucle sur le nom des blocs (while (/= (setq bloctmp (tblnext "BLOCK" param)) nil) (setq param nil) ; on test le nom (if (= (substr (cdr (assoc 2 bloctmp)) 1 (strlen mask)) mask) (setq res (cons (cdr (assoc 2 bloctmp)) res)) ) ; if ) ; while res ) ; cherche_liste_bloc Et le trie ;------------------------------------------; ; nom: trier ; ; role: retourne la liste triée en fonction; ; du DN qui se trouve après pos dans ; ; les noms de la liste ; ; param: liste => liste de noms ; ; pos => entier ; ; dn => chaine de caractères repré- ; ; sentant le début du dn ; ; retour: liste de noms triée ; ; date: 17/10/2007 ; ; BLAES Sébastien ; ;------------------------------------------; (defun trier (liste pos dn / cpt lg new_liste pos_dn posenddn dn changement) (setq cpt 0 lg (length liste)) (if (> lg 1) (progn (setq new_liste '()) ; on construit new_liste de la forme suivante: ; '((dn1 . nom1) (dn2 . nom2)...) (while (< cpt lg) (setq pos_dn (+ (vl-string-search dn (substr (nth cpt liste) pos)) pos (strlen dn))) (setq pos_enddn (+ (vl-string-search "-" (substr (nth cpt liste) pos)) pos)) (setq valdn (atoi (substr (nth cpt liste) pos_dn (- pos_enddn pos_dn)))) (setq new_liste (cons (cons valdn (nth cpt liste)) new_liste)) ; on incrémente cpt (setq cpt (1+ cpt)) ) ; while ; on trie (setq new_liste (vl-sort new_liste (function (lambda (e1 e2) (< (car e1) (car e2)) ) ) )) ; il faut reconstruire new_liste en ne gardant que les noms (setq changement '() cpt 0) (while (< cpt lg) (setq changement (cons (cdr (nth cpt new_liste)) changement)) ; on incrémente cpt (setq cpt (1+ cpt)) ) ; while (setq new_liste (reverse changement)) ) ; progn (setq new_liste liste) ) ; if new_liste ) ; trier Après à toi d'adapter , après lorsque tu aura ta liste triée, il suffit de la parcourir, de chercher tous les blocs ayant le nom du i-ième élément de la liste et faire ta sauvegarde de donnes pour ce bloc. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant