Aller au contenu

[Résolu] Effacer une polyligne si son contenu est vide


DenisHen

Messages recommandés

Bonjour à tous, Voilà, j'ai un fichier dans lequel il y a 2777 polylignes représentant des contours de communes (elles sont dans le calque "LimCommune"). Après plusieurs manipulations (notamment des VBA depuis Excel) il y a quelques entités à l'intérieur de certaines communes (admettons dix) donc, à l'intérieur de dix polylignes. J'aimerai supprimer les 2767 autres polylignes restantes qui n'ont rien dans leur "contenu géographique"... Si quelqu'un a une astuce ou un conseil, je suis preneur... Et bonne année à tous... Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Hello

 

Si j'ai bien compris ta demande !?

 

Le CDC/CCTP du programme Lisp/VLisp serait :

- Selection classique de N Polylignes (fines/epaisses) 2D Closes

- Sur CES N Polylignes , ne RETENIR (en fait garder dans la selection)

que celles qui n'ont AUCUN objet graphique a l'interieur !

 

Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Merci messieurs pour vos réponses,

 

En gros, je peux avoir juste deux ou trois petits icônes dans une commune.

 

Mais jouer avec le zoom sur l'intérieur de toutes les communes (2777) me prendrait des heures, sans compter sur d'éventuelles erreurs humaines...

 

J'aimerai donc supprimer toutes les polylignes "vides"...

 

Désolé lecrabe, mais c'est juste l'inverse, ne garder QUE les polylignes contenant des entités.

 

Merci encore pour votre aide...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Pour ma part, j'essayerais de monter un lisp pour l'ocassion.

Pour cela je ferais une boucle sur ces polylignes sélectionnées avec le filtre approprié.

Pour chaque polyligne je ferais une selection en m'aidant, par exemple, de (SelByObj) de (gile)

Si le selection retournée est vide, j'efface la polyligne

 

Voilà en gros pour l'idée générale à mettre en oeuvre...

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

Hello Bruno / DenisH

 

1) En effet j'ai compris a l'envers !?

 

2) Pour Bruno : Mais si tu developpes la routine, SVP je pense qu'il serait bien que tu poses une question au debut :

- Ne garder que les Polylignes 2D "remplies" (Oui/Non) ? Valeur par defaut = Oui (pour DenisH)

 

Car je pense que suivant les besoins, on peut avoir les 2 cas a traiter !

L'autre cas m'interesse ...

 

Bye, lecrabe

 

PS: LA SANTE & Meilleurs Voeux !

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous,

 

Lilian : exact, je fais un traitement, depuis des "points topographiques" levé par un collègue, depuis Excel en VBA. Cette routine place des blocs et les oriente selon un fichier de levé ".cod". Je ne maitrise pas l'endroit des insertions de blocs. Cette routine travaille sur l'ensemble des communes mais quelques unes sont concernées.

 

BonusCad : un grand merci pour ton futur développement. Il serait peut-être judicieux de demander aussi à l'utilisateur dans quel calque travailler. D'autre personnes pourraient en avoir besoin...

 

LeCrabe : c'est exactement ça...

 

Encore merci à tous...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Hello DenisH

 

SVP pour le cas ou tu desires ne "garder" dans ta selection que les Polylignes 2D "fines/epaisses" remplies ...

Est ce que cela signifie que la routine Lisp/VLisp doit selectionner les Polylignes remplies

- et TOUT ce qui est A L'INTERIEUR ??

- OU bien SEULEMENT les Polylignes ??

Pour faire APRES un Effacer / Deplacer / etc ...

 

A mon avis, il serait interessant d'avoir au debut de la routine une question a CE sujet !

 

Bye, lecrabe

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

BonusCad : un grand merci pour ton futur développement

 

Vous interpretez mes propos! je disais "pour ma part, j'essayerais de monter un lisp pour l'ocassion."

 

Ce genre de développement qui ne servent généralement qu'une fois, donc faire un truc tip-top est pour moi une hérésie et une perte de temps.

 

Je travaille beaucoup comme ça , constitution d'un lisp à la volée, mais comme je connais bien l'environnement dans lequel je travaille (je travaille avec une base importante, donc j'essayes d'automatiser le maximum d'opérations qui sont répétitives), je vise directement les données qu'il me faut et je ne m'attache pas à monter un code générique qui pourrait fonctionner dans d'autre cas.

Donc il en résulte un code relativement court que je lance une fois puis, part généralement à la poubelle.

 

Néanmoins pour illuster mon propos précédent, voici ce que j'aurais fais (ceci reste succint)

 

;;; SelByObj -Gilles Chanteau- 06/10/06
;;; Crée un jeu de sélection avec tous les objets contenus ou 
;;; capturés, dans la vue courante, par l'objet sélectionné
;;; (cercle, ellipse, polyligne fermée).
;;; Arguments :
;;; - un nom d'entité (ename) 
;;; - un mode de sélection (Cp ou Wp)
;;; - un filtre de sélection ou nil
;;;
;;; modifié le 19/07/07 : fonctionne avec les objets hors fenêtre

(vl-load-com)
(defun SelByObj (ent opt fltr / obj dist n lst prec dist p_lst ss)
 (if (= (type ent) 'ENAME)
   (setq obj (vlax-ename->vla-object ent))
   (setq obj ent
   ent (vlax-vla-object->ename ent)
   )
 )
 (cond
   ((member (vla-get-ObjectName obj) '("AcDbCircle" "AcDbEllipse"))
    (setq dist (/ (vlax-curve-getDistAtParam
        obj
        (vlax-curve-getEndParam obj)
      )
      50
   )
    n  0
    )
    (repeat 50
      (setq
  lst
   (cons
     (trans
       (vlax-curve-getPointAtDist obj (* dist (setq n (1+ n))))
       0
       1
     )
     lst
   )
      )
    )
   )
   ((and (= (vla-get-ObjectName obj) "AcDbPolyline")
   (= (vla-get-Closed obj) :vlax-true)
   )
    (setq p_lst (vl-remove-if-not
      '(lambda (x)
         (or (= (car x) 10)
       (= (car x) 42)
         )
       )
      (entget ent)
    )
    )
    (while p_lst
      (setq
  lst
   (cons
     (trans (append (cdr (assoc 10 p_lst))
        (list (cdr (assoc 38 (entget ent))))
      )
      ent
      1
     )
     lst
   )
      )
      (if (/= 0 (cdadr p_lst))
  (progn
    (setq prec (1+ (fix (* 25 (sqrt (abs (cdadr p_lst))))))
    dist (/ (- (if (cdaddr p_lst)
           (vlax-curve-getDistAtPoint
       obj
       (trans (cdaddr p_lst) ent 0)
           )
           (vlax-curve-getDistAtParam
       obj
       (vlax-curve-getEndParam obj)
           )
         )
         (vlax-curve-getDistAtPoint
           obj
           (trans (cdar p_lst) ent 0)
         )
      )
      prec
         )
    n    0
    )
    (repeat (1- prec)
      (setq
        lst (cons
        (trans
      (vlax-curve-getPointAtDist
        obj
        (+ (vlax-curve-getDistAtPoint
       obj
       (trans (cdar p_lst) ent 0)
           )
           (* dist (setq n (1+ n)))
        )
      )
      0
      1
          )
        lst
      )
      )
    )
  )
      )
      (setq p_lst (cddr p_lst))
    )
   )
 )
 (cond
   (lst
    (vla-ZoomExtents (vlax-get-acad-object))
    (setq ss (ssget (strcat "_" opt) lst fltr))
    (vla-ZoomPrevious (vlax-get-acad-object))
    ss
   )
 )
)

;; ma partie qui se révèle assez courte
((lambda ( / )
 (princ "\nSélectionnez un objet model fermé")
 (while
   (not
     (setq js
       (ssget "_+.:E:S"
         '(
           (0 . "*POLYLINE")
           (-4 . "<AND")
             (-4 . "<NOT") (-4 . "&") (70 . 120) (-4 . "NOT>")
             (-4 . "&") (70 . 1)
           (-4 . "AND>")
         )
       )
     )
   )
 )
 (setq dxfl_cod (entget (ssname js 0)) lremov nil)
 (foreach m (foreach n dxfl_cod (if (not (member (car n) '(0 67 410 8 6 62 48 420 70))) (setq lremov (cons (car n) lremov))))
   (setq dxfl_cod (vl-remove (assoc m dxfl_cod) dxfl_cod))
 )
 (setq js (ssget "_X" dxfl_cod))
 (cond
   (js
     (repeat (setq n (sslength js))
       (setq ent (ssname js (setq n (1- n))))
       (if (not (SelByObj ent "WP" nil)) (entdel ent))
     )
   )
 )
))

 

J'ai fais un test rapide qui a fonctionné pour moi

ATTENTION pendant le traitement, vous pouvez avoir l'impression qu'Autocad a planté (pas de réponse), laissez faire quand même (ne tuez pas la tache) il bosse quand même.

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

Bonjour à tous,

 

Effectivement BonusCad, j'avais mal compris...

 

Peux-tu toutefois me dire, s'il te plait, ce qu'il y a dans

;;; - un nom d'entité (ename)

;;; - un mode de sélection (Cp ou Wp)

;;; - un filtre de sélection ou nil

ent = "PWLINE" ?

Cp ou Wp ?

Filtre ?

J'ai l'impression que ce code "fouille" toutes les entités du dessin... Me trompe-je ?

(Waouw : "Me trompe-je"... Comme au XIX siècle... :mellow: )

 

 

Pour ma part, j'ai récupéré ce qu'avait fait mon prédécesseur, mais je n’arrive pas à comprendre cette routine...

 

(defun c:SupCommuneVide ()
 (setq prefDAOTSS (ade_prefgetval "DontAddObjectsToSaveSet"))
 (ade_prefsetval "DontAddObjectsToSaveSet" T)
 (setq dwg_id (last (ade_dslist)))
 (setq extdwg (ade_dwgproplist dwg_id "extents"))
 (setq pBG (car extdwg))
 (setq pHD (cadr extdwg))
 (while (not (setq ssCommuneInExtents
	     (ssget "_C"
		    pBG
		    pHD
		    '((0 . "LWPOLYLINE")
		      (8 . "Limite des communes")
		     )
	     )
      )
 )
   (setq pBG (list (- (car pBG) 10000) (- (cadr pBG) 10000)))
   (setq pHD (list (+ 10000 (car pHD)) (+ 10000 (cadr pHD))))
 )
 (setq stNomCommuneTraite "Commune-Traite")
 (if (not (tblsearch "layer" stNomCommuneTraite))
   (command "-calque" "n" stNomCommuneTraite "")
 )

 (setq i 0)				
 (princ "\n")
 (setq ade_cmddia_before_qry (getvar "cmddia"))
 (setvar "cmddia" 0)
 (setq lstcommuneTraite nil)
 (repeat (sslength ssCommuneInExtents)
   (setq ename (ssname ssCommuneInExtents i))
   (setq stNomCommune (ade_odgetfield ename "comm6" "CHAINE" 0))

   (setq nbrObj 0)
   (ade_qryclear)
   (ade_qrysettype "preview")
   (ade_qrydefine
     (list ""
    ""
    ""
    "Location"
    (list "polyline" "polygon" "crossing" ename)
    ""
     )
   )
   (ade_qrydefine
     '("AND"
""
"NOT"
"Property"
("layer" "=" "Limite des communes")
""
      )
   )
   (setq nbrObj (ade_qryexecute))

   (if	(> nbrObj 0)
     (progn
(princ (strcat "\n##Nom commune: "
	       stNomCommune
	       " nombre d'objets requeté: "
	       (rtos nbrObj)
       )
)
(setq lstcommuneTraite
       (append lstcommuneTraite
	       (list (list stNomCommune nbrObj))
       )
)
(command "chprop" ename "" "ca" stNomCommuneTraite "")
     )
   )
   (setq i (1+ i))
 )
 (setvar "cmddia" ade_cmddia_before_qry)
 (setvar "clayer" "0")
 (setq ss2del (ssget "x" '((8 . "Commune-lim-Topo3"))))
 (command "_erase" ss2del "")
 (setq ss2del (ssget "x" '((8 . "POINT"))))
 (command "_erase" ss2del "")
 (setq ss2del (ssget "x" '((8 . "POINT-ALTITUDE"))))
 (command "_erase" ss2del "")
 (setq ss2del (ssget "x" '((8 . "POINT-NUMERO"))))
 (command "_erase" ss2del "")
 (command "zoom" "et")
 (ade_prefsetval "DontAddObjectsToSaveSet" prefDAOTSS)
 (setq	stFileTxt (strcat (setq stFileDir (getvar "dwgprefix"))
		  (setq	stNetFileBaseName
			 (vl-filename-base
			   (getvar "dwgname")
			 )
		  )
		  ".txt"
	  )
 )
 (princ "\nGénération du fichier texte")
 (setq fDesc (open stFileTxt "w"))
 (progn
   (mapcar '(lambda (stNomCom)
       (princ stNomCom fDesc)
       (princ "\n" fDesc)
     )
    lstcommuneTraite
   )
   (princ)
 )
 (close fDesc)
 (mapcar 'car lstcommuneTraite)
)

 

Si quelqu'un pouvait me dire ce qui ne va pas dans ce code... Cette routine me répond :

Premier argument: l'ID du dessin est incorrect ou n'est pas fourni.

 

Peut-être cherche-t-elle un fichier attaché ? Mais ces polylignes sont maintenant dans mon DWG...

 

Je sais, c'est super difficile de lire le code d'un autre, surtout s'il n'est pas commenté...

 

Merci en tous cas pour vos réponses...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Cette routine (celle de mon prédécesseur) travaille effectivement sur un fichier attaché...

 

Mais quand je la lance, je n'ai plus de message d'erreur, mais ça plante AutoCAD...

 

GRRR, je ne sais pas trop comment je vais faire pour m'en sortir...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

;;; - un nom d'entité (ename)

;;; - un mode de sélection (Cp ou Wp)

;;; - un filtre de sélection ou nil

 

Cela fait partie de la routine (gile), là il a fait un code générique qui peut fonctionné avec plusieurs type d'entité.

 

(ename) est le nom de l'entité retourné par exemple par (car (entsel)) ou (ssname (ssget) ind) ind etant l'indice dans le jeu de selection; compris entre 0 et (sslength (ssget))

 

Le mode de sélection Cp est Crossing Polygon (en anglais) -> Capture Polygone (en français)

Le mode de sélection Wp est Window Polygon -> Fenêtre Polygone

 

le filtre de sélection pour ne récupérer que la selection incluse dans le mode choisi par ex: '((0 . "INSERT") (8 . "Calque d'insertion")) pour ne recuperer que des bloc insérés dans le calque "Calque d'insertion".

 

J'aurais dut d'ailleurs utilisé (SelByObj ent "CP" nil) dans le code proposé.

 

 

Pour ton code il est censé fonctionner (ne peux tester) avec un dessin attaché, sur lequel il sera effectué une requête sur les données d'objets (OD) pour rapatrier les objets correspondants à la requête dans le dessin en cours.

Ce code n'a rien de générique, il est bien spécifique au dessin à traiter (c'est un peu le genre de truc que je pratique, partager ce genre de code avec d'autre n'apporte rien à moins de savoir exactement ce qu'on veut en faire et être capable de le modifié dans l'optique voulue)

Donc difficile pour le néophyte mais très avantageux pour celui qu'il l'a écrit, un gain de temps certain pour traiter une base importante sans faire des action répétitives avec les commandes de base d'AutocadMap.

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 pour cette réponse...

 

Effectivement, je n'arrive à rien. Je n'ai pas trouvé l'OD qui est traité dans ce code...

 

Merci encore pour cette réponse...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

J'ai fini pas réussir à comprendre le programme de mon prédécesseur par..."approximations successives"...

 

Et j'ai réussi à faire ce que je voulais.

 

BonusCad avait, une fois de plus, raison... Cette routine est bien trop spécifique pour justifier une demande à la communauté et qu'il serait inutile de la poster ici, car elle est pour un cas de figure tellement particulier que personne ne serait à même de rencontrer...

 

Merci pour vos réponses...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

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é