Najibad Posté(e) le 12 août 2009 Posté(e) le 12 août 2009 Bonjour à tous, J'ai besoin de votre aide pour une routine permettant de créer un tableau Excel, contenant une colonne ""numéro de parcelle" et une autre "surface" (exprimée en are), à partir d'un fichier autocad contenant plusieurs parcelles (polylignes fermées). Les numéros de parcelles sont sous formes de texte à l'intérieur de la parcelle. J'ai des milliers de parcelles à traiter et je compte sur votre aide pour m'en sortir ! Merci d'avance.
vincentp010 Posté(e) le 12 août 2009 Posté(e) le 12 août 2009 Salut, Je ne sais pas ce que tu as comme fichier de départ et ce que tu attend comme surfaces.Mais si ton fichier est un DXF du cadastre et que tu veux les surfaces cadastrales et non graphiques (defun c:SURFACES () (setvar "cmdecho" 0) (command "annuler" "m") (setq input "c:/parcelles.csv") (setq file (open input "w")) (write-line "INSEE;SECTION;PARCELLE;SURFACE" file) (setq sl (ssget "x" (list (cons 8 "1PARCELLE")))) (setq nb1 0) (setq nb (sslength sl)) (while (< nb1 nb) (setq ent (ssname sl nb1)) (setq ent1 (entget ent '("IDU"))) (setq exlist1 (cadadr (assoc -3 ent1))) (setq num (cdr exlist1)) (setq insee (substr num 1 3)) (setq section (substr num 7 2)) (setq parc (substr num 9)) (setq ent2 (entget ent '("SUPF"))) (setq exlist2 (cadadr (assoc -3 ent2))) (setq surf (cdr exlist2)) (setq line (strcat insee ";" section ";" parc ";" surf ";")) (write-line line file) (setq nb1 (+ nb1 1)) ) (close file) ) Aide au téléchargement du cadastre dgfip-download-helper Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0 Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js
(gile) Posté(e) le 12 août 2009 Posté(e) le 12 août 2009 Salut, Un peu plus de précisions faciliteraient la tâche de ceux qui voudraient t'aider :- les polylignes sont elles sur un calque spécifique ? si oui, lequel ?- les textes sont ils sur un calque spécifique ? si oui, lequel ?- les numéros de parcelle sont-ils les seuls textes à l'intérieur des polylignes ?- quel est le format de ces textes ? uniquement le numéro ou un préfixe ou un suffixe ?- à quoi correspond une unité de dessin ? 1 mètre ? 1 centimètre ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Najibad Posté(e) le 12 août 2009 Auteur Posté(e) le 12 août 2009 salut -les polylines sont dans le calque parcelle -les textes sont dans le calque numero_parcelle -il y a d'autres textes à l'intérieur des polylines -uniquement le numéro -l'unité de dessin est 1 mètre. merci
(gile) Posté(e) le 12 août 2009 Posté(e) le 12 août 2009 Tu peux essayer ça (pas testé) (defun c:AiresParcelles (/ *error* acdoc filename ss n file pa plst num lay) (defun *error* (msg) (or (= msg "Fonction annulée") (princ (strcat "Erreur: " msg)) ) (and file (close file)) (princ) ) (vl-load-com) (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)) layers (vla-get-Layers acdoc) ) (if (setq lay (gc:GetItem layers "nonconforme")) (if (setq ss (ssget "_X" '((8 . "nonconforme")))) (alert "Il reste des objets sur le calque\"nonconforme\"") (vla-delete lay) ) (if (and (setq filename (getfiled "AiresParcelles" (getvar "DWGPREFIX") "xls" 1)) (princ "\nSélectionnez les polylignes (ou valider pour toutes).") (or (ssget '((0 . "LWPOLYLINE") (8 . "PARCELLE"))) (ssget "_X" '((0 . "LWPOLYLINE") (8 . "PARCELLE"))) ) ) (progn (setq file (open filename "w")) (write-line "Numéro de parcelle\tSurface" file) (vlax-for pl (setq ss (vla-get-ActiveSelectionSet acdoc)) (setq pa (fix (vlax-curve-getendParam pl)) plst nil ) (while (setq pt (vlax-curve-getPointAtParam pl pa)) (setq pa (1- pa) plst (cons (trans pt 0 1) plst) ) ) (setq num (ssget "_WP" plst '((0 . "TEXT") (8 . "NUMERO_PARCELLE")))) (if (or (not num) ( (progn (or lay (setq lay (vla-add layers "nonconforme"))) (vla-put-Color lay 30) (vla-put-layer pl "nonconforme") ) (write-line (strcat (vla-get-TextString (vlax-ename->vla-object (ssname num 0))) "\t" (rtos (/ (vla-get-Area pl) 100) 2 0) ) file ) ) ) (close file) (vla-delete ss) (and lay (alert "Parcelle(s) non conforme(s)")) ) ) ) (princ) ) ;;; gc:GetItem (gile) ;;; Retourne le vla-object de l'item s'il est présent dans la collection ;;; ;;; Arguments ;;; col : la collection (vla-object) ;;; name : le nom de l'objet (string) ou son indice (entier) ;;; ;;; Retour : le vla-object ou nil (defun gc:GetItem (col name / obj) (vl-catch-all-apply (function (lambda () (setq obj (vla-item col name)))) ) obj ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Najibad Posté(e) le 12 août 2009 Auteur Posté(e) le 12 août 2009 salut gile je viens de tester le prog ça a l'aire de bien foctionner je ferais d'autres tests et je te tiendrais au courant. Juste une petite remarque est ce qu'on peut conserver les décimales aussi ? merci beaucoup
(gile) Posté(e) le 12 août 2009 Posté(e) le 12 août 2009 Comme tu disais "exprimée en are" j'ai pensé que tu ne voulais pas de décimales. pour le nombre de décimales, tu remplace le 0 par le nombre (entier) que tu veux dans l'expression : (rtos (vla-get-Area pl) 2 [surligneur]0[/surligneur]) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
yusukens82 Posté(e) le 13 août 2009 Posté(e) le 13 août 2009 Bravo !! [Edité le 13/8/2009 par yusukens82]
Najibad Posté(e) le 13 août 2009 Auteur Posté(e) le 13 août 2009 Bonjour, Dans certains cas il peut y avoir, par erreur, une parcelle sans numéro ou avec plus d'un numéro. Est ce que tu peux intégrer une vérification sur le nombre de texte "numero_parcelle" à l'intérier d'une polyline? s'il est différent de 1 est ce qu'il est possible de changer le calque de la parcelle concernée en "nonconforme" par exemple et d'afficher une alerte sous autocad indiquant q'il y a des anomalies à corriger? et au lancement du prog verifer qu'il n'y ait plus de calque nonconforme (pour s'assurer d'avoir remis le noncoforme corrigé dans le calque parcelle) en affichant une alerte et en stoppant le prog si ce dernier existe ? Pour la surface je voudrais l'exprimer en are comme suit : une surface de 1578m² devient 15a78ca si le 3ème numéro (7 dans l'exemple) est qupérieure ou égale à 6 la surface doit être 16 a (15 +1) et dans le cas contraire la surface doit être 15 a. Est ce que ce calcul peut être intégré dans le prog ? Merci pour tout GILE .
(gile) Posté(e) le 13 août 2009 Posté(e) le 13 août 2009 Voilà, j'ai modifié le code, j'espère que ça correspond à ton besoin maintenant.J'ai mis le calque "nonconforme" en orange (30), si ça ne te convient pas, tu peux supprimer la ligne surlignée ou changer l'index de la couleur. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
chris_mtp Posté(e) le 13 août 2009 Posté(e) le 13 août 2009 Bonjour à tous, Cette routine peut être très utile dans le cas d'un contrôle par exemple entre les données du cadastre et les données graphiques mais petite question (adressé à gile) ; Si les numéros contiennent un préfixe, comment modifié le code pour avoir le même listing ? Merci par avance.John.
(gile) Posté(e) le 13 août 2009 Posté(e) le 13 août 2009 Salut, En l'état, c'est le calque qui sert de filtre pour les numéros de parcelle. Le texte sur la calque "NUMERO_PARCELLE" à l'intérieur de chaque parcelle est extrait tel quel. Si tu veux supprimer un suffixe pour l'extraction, regarde les fonctions substr ou vl-string-left-trim pour modifier l'expression qui retourne la valeur du texte :(vla-get-TextString (vlax-ename->vla-object (ssname num 0)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Najibad Posté(e) le 13 août 2009 Auteur Posté(e) le 13 août 2009 salut, Je viens de tester le nouveau prog et j'ai remarqué que la parcelle sans numéro n'est pas mise dans le plan nonconforme par contre quand j'ai plus d'un numéro c'est bon. Quand je remet le nonconforme détecté dans le calque parcelle le programme affiche toujours l'alerte "présence de non conforme" cela est dû a la présence du nom du calque dans la liste des calques, est ce qu'il est possible de purger les calques avant le test ou sinon voir s'il y a des entités dans ce calque ? J'ai remarqué aussi que le prog ne prends en compte que les "lwpolyline" est ce qu'il est possible d'intégrer les "polyline" aussi ? Pour la surface je vais être plus précis : pour passer du m² au are on doit multiplier par 0.01 (1m² = 0.01a) et c'est au niveau de la 1ère décimale que doit être fait le test. Exemple : 26853m² = 268.53 a,donc la surface finale est de 268 a, car 5 (la 1ére décimale) est inférieure à 6. Merci pour ton aide GILE
chris_mtp Posté(e) le 13 août 2009 Posté(e) le 13 août 2009 Merci Gile pour ces infos.Ca marche nickel comme çà et bravo encore pour cette routine qui va en aider plus d'un à mon avis. John.
(gile) Posté(e) le 13 août 2009 Posté(e) le 13 août 2009 Najibad, Tu approches dangereusement de la limite que je me suis fixé concernant ce que je veux bien donner gracieusement et des programmes plus spécifiques que je fais pour gagner ma vie... J'ai modifié le code (réponse 4) : contrôle si aucun texte n'est contenu dans la polyligne et purge automatique du calque "nonconforme". Par contre, c'est bien la première fois que j'entends parler d'arrondir au seuil 0.6 ! Tu peux remplacer l'expression : (rtos (/ (vla-get-Area pl) 100) 2 0) par : (itoa ((lambda (num) (if ( (fix num) (1+ (fix num)) ) ) (/ (vla-get-Area pl) 100) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Najibad Posté(e) le 13 août 2009 Auteur Posté(e) le 13 août 2009 salut je te remercie GILE , j'ai bien compris ton message je voulais juste te communiquer que j'ai toujours le problème avec les parcelles sans numéro je crois que tu l'as intégré dans la ligne " (if (or (not num) (< 1 (sslength num))) "mais ça ne le détecte pas. Merci encore une fois pour tout je suis très reconnaissant pour l'aide que tu m'as apporté .
(gile) Posté(e) le 13 août 2009 Posté(e) le 13 août 2009 Recopie le code, j'ai réparé ça. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Najibad Posté(e) le 13 août 2009 Auteur Posté(e) le 13 août 2009 Merci infiniment GILE ça marche bien.
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