Aller au contenu

Importation de surface dans excel (sans extraction attribut)el


dilack

Messages recommandés

Bonjour à tous,

 

Je suis à la recherche d'un Lisp qui permettrait de récupérer la surface de polylignes fermées suivant une partie de la dénomination des calques.

 

Pour être plus clair:

 

J'ai des polylignes dessinées dont le nom comprends les caractères BV_1, BV_2, BV_3 , ... BV_N, etc

Il peut avoir plusieurs polylignes avec le même nom de calque.

La routine récupère toutes les polygnes dont le nom du calque comprends les caractères BV_1 ... et les injectes dans une feuille spécifique d'un classeur excel, sous la forme suivante:

 

Cellule A3: nom du calques

Cellule B3: nombre de polylignes fermées de même calques

Cellule C3: la surface totale des polylignes de même calques

 

Merci d'avance de votre retour

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

J'ai ceci à disposition, tu peux affiné le filtre à ta convenance dans la fonction PolylineByLayer en rajoutant dans (ssget): '(8 . "BV_#") ?

Voici la fonction générique:

;; Retourne un liste de sous-listes des cumuls de longueur de polyligne par calque
;; ((nom_calque nombre_polylignes valeur_cumulée) ...)
(defun PolylineByLayer (key / ss i pline layer value lst sub)
 (if (setq ss (ssget "_X" (append (list '(0 . "LWPOLYLINE") (cons 410 (getvar "CTAB"))) (if (eq key "Area") '((-4 . "&") (70 . 1))))))
(repeat (setq i (sslength ss))
 	(setq pline (ssname ss (setq i (1- i)))
       	layer (getpropertyvalue (getpropertyvalue pline "LayerId") "Name")
       	value  (getpropertyvalue pline key)
 	)
 	(setq lst
    		(if (setq sub (assoc layer lst))
      		(subst (list layer (1+ (cadr sub)) (+ (caddr sub) value)) sub lst)
      		(cons (list layer 1 value) lst)
    		)
 	)
)
 )
)

;; Ecrit les données dans Excel
;;
;; Argument
;; data : une liste contenant un sous liste de données par rangée
(defun WriteExcel (data / xlApp wBook cells i j)
 (setq xlApp (vlax-create-object "Excel.Application")
   	wBook (vlax-invoke-method (vlax-get-property xlapp 'WorkBooks) 'Add)
   	cells (vlax-get-property xlApp 'Cells)
   	i 	0
 )
 (foreach row data
(setq i (1+ i)
     	j 0
)
(foreach val row
 	(setq j	(1+ j)
       	cell (vlax-variant-value (vlax-get-property cells 'Item i j))
 	)
 	(vlax-put-property cell 'Value2 val)
)
 )
 (vlax-invoke-method
(vlax-get-property
 	(vlax-get-property xlApp 'ActiveSheet)
 	'Columns
)
'AutoFit
 )
 (vlax-put-Property xlApp 'Visible :vlax-true)
)

;; Ecrit les longueurs de polyligne par calque
(defun c:metres (/ k_mod data filename)
 (initget "Longueur Aire _Length Area")
 (setq k_mod (getkword "\nMesurer [Longueur/Aire] <Longueur> : "))
 (if (not k_mod) (setq k_mod "Length"))
 (and
(setq data (PolylineByLayer k_mod))
(WriteExcel (cons (list "Calque" "Nombre" (if (eq k_mod "Length") "Longueur" "Surface")) data))
 )
 (princ)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Merci Bonuscad,

 

Effectivement la routine fonctionne très bien, ..... mais comme mes connaissances en Lisp sont assez limitees je me vois pas modifier cette routine :(.

Je comprends certaines lignes mais d'autre beaucoup moins.

 

Ce que je souhaiterais c'est de choisir mon classeur excel ainsi de que la feuille pour l'import des données autocad

Lien vers le commentaire
Partager sur d’autres sites

  • 10 mois aprè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 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é