DenisHen Posté(e) le 13 janvier 2016 Posté(e) le 13 janvier 2016 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)
lili2006 Posté(e) le 13 janvier 2016 Posté(e) le 13 janvier 2016 Bonne Année à toutes et tous, Control + A et shcift pour désélectionner les 10 polys, non ? Civil 3D 2025 - COVADIS_18.3c https://www.linkedin...3%ABt-95313341/
lecrabe Posté(e) le 13 janvier 2016 Posté(e) le 13 janvier 2016 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
DenisHen Posté(e) le 13 janvier 2016 Auteur Posté(e) le 13 janvier 2016 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)
lili2006 Posté(e) le 13 janvier 2016 Posté(e) le 13 janvier 2016 Re, Tu veux dire que tu ne sais pas ou sont ces polys vides ? Civil 3D 2025 - COVADIS_18.3c https://www.linkedin...3%ABt-95313341/
bonuscad Posté(e) le 13 janvier 2016 Posté(e) le 13 janvier 2016 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
lecrabe Posté(e) le 13 janvier 2016 Posté(e) le 13 janvier 2016 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
DenisHen Posté(e) le 14 janvier 2016 Auteur Posté(e) le 14 janvier 2016 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)
lecrabe Posté(e) le 14 janvier 2016 Posté(e) le 14 janvier 2016 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
bonuscad Posté(e) le 14 janvier 2016 Posté(e) le 14 janvier 2016 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 moiATTENTION 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
DenisHen Posté(e) le 14 janvier 2016 Auteur Posté(e) le 14 janvier 2016 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 nilent = "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)
DenisHen Posté(e) le 14 janvier 2016 Auteur Posté(e) le 14 janvier 2016 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)
bonuscad Posté(e) le 14 janvier 2016 Posté(e) le 14 janvier 2016 ;;; - 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
DenisHen Posté(e) le 14 janvier 2016 Auteur Posté(e) le 14 janvier 2016 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)
DenisHen Posté(e) le 15 janvier 2016 Auteur Posté(e) le 15 janvier 2016 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)
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