dilack Posté(e) le 5 février 2020 Posté(e) le 5 février 2020 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, etcIl 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 calquesCellule B3: nombre de polylignes fermées de même calquesCellule C3: la surface totale des polylignes de même calques Merci d'avance de votre retour
bonuscad Posté(e) le 5 février 2020 Posté(e) le 5 février 2020 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
dilack Posté(e) le 5 février 2020 Auteur Posté(e) le 5 février 2020 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
dilack Posté(e) le 22 décembre 2020 Auteur Posté(e) le 22 décembre 2020 Salut a tous,un petit up ....Merci d'avance
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