Aller au contenu

sort sur file txt


Messages recommandés

Invité ingoenius
Posté(e)

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

Posté(e)

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 obtient

le_bloc_truc_200_120

le_bloc_truc_180_120

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

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

Posté(e)

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 100

TK-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...

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité