Aller au contenu

calcul de surface sous autocad et création d\'un tableau sous Excel


Najibad

Messages recommandés

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 .

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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é