jessayaneo Posté(e) le 9 février 2015 Posté(e) le 9 février 2015 Bonjour, Je farfouille dans le forum déjà depuis quelques temps pour trouver une astuce pour régler mon problème mais sans résultat pour le moment. Je vous expose mon problème et si quelque chose vous viens à l'esprit sachez que je vous en remercie déjà d'avance mille milliard de fois :) Le problème:J'ai une série de calques en "PHASE A" de mon projet. Chaque objets dessiné sur mes calques sont des blocs dynamique et chaque calque spécifiquement nommé (*quelque chose*PHASE A) pour mieux pour les filtrer. J'ai transmis mon plan pour validation au client et j'ai continué à travailler dessus. (Gros problème en perspective..)Le client m'a renvoyé mon fichier en rajoutant des centaines de blocs dynamiques mais en laissant mes anciens blocs à leur place (et il à réutilisé mes claques)... Je me retrouve avec des + et des - sans savoir ce qui à été changé... donc j'ai fais un méga bloc de tous les calques (pré alablement renommé PHASE B ) et j'ai superposé le bloc PHASE B sur mon plan PHASE A.. mais c'est un bordel incroyable et ça me prend des jours pour trier 1 fichier .. et j'en ai 5 comme ça... et ça risque de recommencer. Donc je me demandais s'il était possible de créer un VBA ou un LISP ou autre pour localiser les blocs superposé en doublon (sachant qu'ils ont les mêmes coordonées en PHASE A ou B ) et pouvoir éliminer uniquement les doublons dans les calques PHASE B Désolé pour le pavé et si vous avez tenu jusque la merci de m'avoir lu ^^
didier Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 Coucou sans lisp et sans VBA, tu peux déjà faire une extraction des données avec les points d'insertiondans Excel tu tries suivant ces coordonnées et tu verras les doublons facilementensuite tu fais un script rapide qui te dessines un cercle (par exemple) au point d'insertion d'un doublon. si vraiment tu veux du lisp on va s'y coller, mais il faut toujours penser natif avec de programmer. Cordialement Éternel débutant... Mon site perso : Programmer dans AutoCAD
bonuscad Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 Bonjour, Logiquement; tout ce qui a été créé après par le client sera accessible en premier dans la base du dessin.Par exemple une répétition de "EFFACER" "Dernier" prendra forcément les entités créé par le client. J'avais fais un lisp (il date un peu et je ne l'ai jamais révisé...) qui pourra peut être t'aider? (defun c:back_trace ( / e_first dxf_ent name_ent hd_ent lst_hd lght_lst n ent dxf_67 dxf_0 dxf_8 dxf_410 key) (if (setq e_first (entnext)) (setq dxf_ent (entget e_first) name_ent (cdar dxf_ent) hd_ent (cdr (assoc 5 dxf_ent)) lst_hd (list hd_ent) ) ) (while name_ent (if (setq e_next (entnext name_ent)) (setq dxf_ent (entget e_next) name_ent (cdar dxf_ent) hd_ent (cdr (assoc 5 dxf_ent)) lst_hd (cons hd_ent lst_hd) ) (setq name_ent nil) ) ) (cond (lst_hd (setvar "cmdecho" 0) (if (eq (getvar "ctab") "Model") (command "_.shademode" "_2d") ) (foreach n lst_hd (redraw (handent n) 2)) (setq lght_lst (length lst_hd) n 0) (princ "\n<+/-> pour remonter ou redescendre la base du dessin; <Entrée>/[Espace] pour finir!.") (while (and (>= n 0) (< n lght_lst)) (setq ent (handent (nth n lst_hd)) dxf_ent (entget ent) dxf_67 (assoc 67 dxf_ent) dxf_0 (cdr (assoc 0 dxf_ent)) dxf_8 (cdr (assoc 8 dxf_ent)) dxf_410 (cdr (assoc 410 dxf_ent)) ) (if (/= (getvar "ctab") dxf_410) (progn (setvar "ctab" dxf_410) (if (eq (getvar "ctab") "Model") (command "_.shademode" "_2d") ) (foreach n lst_hd (redraw (handent n) 2)) ) ) (cond ((and (= (getvar "ctab") dxf_410) (member dxf_0 (list "3DFACE" "3DSOLID" "ACAD_PROXY_ENTITY" "ARC" "ARCALIGNEDTEX" "ATTDEF" "BODY" "CIRCLE" "DIMENSION" "ELLIPSE" "HATCH" "IMAGE" "INSERT" "LEADER" "LINE" "LWPOLYLINE" "MLINE" "MTEXT" "OLEFRAME" "OLE2FRAME" "POINT" "POLYLINE" "RAY" "REGION" "RTEXT" "SHAPE" "SOLID" "SPLINE" "TEXT" "TOLERANCE" "TRACE" "VIEWPORT" "WIPEOUT" "XLINE" ) ) ) (setq key (grread nil 2 1)) (cond ((member key '((2 13) (2 32))) (setq n -1) ) ((eq (cadr key) 43) (setq n (1- n)) (redraw ent 2) (if (< n 0) (progn (setq n 0) (alert "Dernière entité du dessin atteinte!") ) ) ) ((eq (cadr key) 45) (setq n (1+ n)) (redraw ent 1) (if (= n lght_lst) (progn (setq n (1- n)) (alert "Première entité du dessin atteinte!") ) ) ) ) (grtext -1 (strcat "Entité: " dxf_0 " - Calque: " dxf_8)) ) (T (cond ((eq (cadr key) 43) (setq n (1- n)) (if (< n 0) (setq n 0) ) ) ((eq (cadr key) 45) (setq n (1+ n)) (if (= n lght_lst) (setq n (1- n)) ) ) (T (setq n (1+ n)) ) ) ) ) ) (grtext) (command "_.regenall") (setvar "cmdecho" 1) ) (T (alert "Le dessin est vide!")) ) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
jessayaneo Posté(e) le 10 février 2015 Auteur Posté(e) le 10 février 2015 Le client à ajouté / supprimé les blocs en partant du dessin original donc je suis pas certain que ton lisp fonctionne.. et mon plus gros soucis et la j'ai honte... jy connais rien en VBA et en LISP sinon j'aurai pu créer le fichier adéquate direcement.. Disons que si je me tourne vers vous c'est pour le conseil après j'ai pas envie de vous faire perdre votre temps c'est déjà super sympa de me proposer des solutions. Concernant le message de Didier, cette solution pourrais être pas mal mais je n'ai pas les connaissances pour le faire.. mon utilisation d'autocad n'a jamais nécéssité d'en savoir autant.. jusqu'à maintenant ^^ EDIT: Désolé le lisp ne fonctionne pas pour l'application que je recherche
bonuscad Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 jy connais rien en VBA et en LISP Déjà pour te rassurer le lisp ne détruit rien dans ton dessin, donc tu peux l'essayer sans risque. Pour l'utiliser, une démarche simple:Tu copie-colle de la 1ere à la dernière paranthèse le code mis dans la balise sur le forum directement dans la ligne de commande d'Autocad. (valider éventuellement après la dernière parenthèse collée)Après ceci tu devrais avoir dans l'affichage de la barre de commande C:BACK_TRACE Et bien tu tapes au clavier tout simplement BACK_TRACE (sans le C:) et le code devrait s'exécuter. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
jessayaneo Posté(e) le 10 février 2015 Auteur Posté(e) le 10 février 2015 Déjà pour te rassurer le lisp ne détruit rien dans ton dessin, donc tu peux l'essayer sans risque. Pour l'utiliser, une démarche simple:Tu copie-colle de la 1ere à la dernière paranthèse le code mis dans la balise sur le forum directement dans la ligne de commande d'Autocad. (valider éventuellement après la dernière parenthèse collée)Après ceci tu devrais avoir dans l'affichage de la barre de commande C:BACK_TRACE Et bien tu tapes au clavier tout simplement BACK_TRACE (sans le C:) et le code devrait s'exécuter. Merci j'ai essayé ton LISP, il est très pratique c'est sur,.. sur certaines applications ça peu me sauver la vie mais la en l'occurance ça ne répond pas à mon besoin malheureusement.
Demixav Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 B'jour... Y'a un LISP qui compare 2 plans en en créant un troisième... je ne sais pas si ca peut t'aider, ms logiquement, oui!(Désolé pour les pros, mais je ne sais pas comment créé une "fenetre" dans le message pour y insérer le lisp.) (vl-load-com) (defun c:cdwg (/ app cdoc fichier old name sp1sp2 lst2 e obj lstmodif lstajoutlstsuppr lst obj sup) (setq app (vlax-get-acad-object)cdoc (vla-get-activedocument app)fichier (getfiled"Sélection de l'ancien plan"(strcat (vl-filename-directory (vla-get-fullname cdoc))"/")"dwg"4)old (vla-open (vla-get-documents app) fichier)name (vla-get-fullname cdoc)s (getvar "date")t1 (* 86400.0 (- s (fix s)))) (vla-saveascdoc(strcat (substr name 1 (- (strlen name) 4))" Modications depuis "(vla-get-name old))) (setq sp1 (vla-get-modelspace cdoc)sp2 (vla-get-modelspace old)) (vlax-for lay (setq layers (vla-get-layers cdoc))(vlax-put lay 'color 253)(vla-put-lock lay :vlax-false)) (vlax-for lay (vla-get-layers old)(vla-put-lock lay :vlax-false)) (vlax-for ent sp2(setq lst2 (cons (cons (vla-get-handle ent) ent) lst2))) (defun equal-objects (obj1 obj2)(vl-every(function(lambda (p)(or (not (vlax-property-available-p obj1 p))(equal (vlax-get obj1 p)(vlax-get obj2 p)1e-9))))'(ObjectName Center Radius CoordinatesStartPoint EndPoint StartAngle EndAngleMajorAxis RadiusRatio TextString InsertionPointWidth Height))) (vlax-put (vla-add layers "0.Ajouts") 'color 172)(vlax-put (vla-add layers "0.Modications") 'color 10)(vlax-put (vla-add layers "0.Suppressions") 'color 92) (vlax-for ent sp1(vla-put-color ent 256) (if (setq e (assoc (vlax-get ent 'handle) lst2));;vérifie si le handle existe sur les 2 plans(progn(cond ((not (equal-objects ent (cdr e)))(vla-put-layer ent "0.Modications")))(setq lst2 (vl-remove e lst2)))(vla-put-layer ent "0.Ajouts"))) (if lst2(foreach n lst2(vla-put-layer(car (vlax-invoke old 'CopyObjects (list (cdr n)) sp1))"0.Suppressions"))) (vla-close old)(vla-purgeall cdoc)(vla-save cdoc)(setq s (getvar "date")t2 (* 86400.0 (- s (fix s)))tt (- t2 t1)) (if (> tt 60)(progn(setq sec (rem tt 60)mn (strcat (rtos (/ (- tt sec) 60) 2 0) " mn ")sec (strcat (rtos sec 2 0) " s")))(progn(setq sec (strcat (rtos tt 2 0) " s")mn "0 mn "))) (alert(strcat"Plan de repérages des modifications\n\nLes ajouts sont en vert\nLes modifications en rouge\nLes suppressions en bleu\n\nTemps d'éxecution : "mnsec))) ;defun AutoCad Map 3D 2011 - Covadis v16.0dWindows 7 - 64b
Patrick_35 Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 Salut Regarde avec ce lisp, pour voir.Fait une sauvegarde auparavant et regarde bien avant de valider(defun c:dou(/ deb doc ele lst sel) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (and (ssget "x" (list (cons 0 "insert"))) (progn (vlax-for ele (setq sel (vla-get-activeselectionset doc)) (setq lst (cons (cons (vlax-get ele 'insertionpoint) ele) lst)) ) (vla-delete sel) (while lst (setq deb (car lst) lst (cdr lst) ) (while (setq ele (assoc (car deb) lst)) (if (< (vlax-get (cdr deb) 'objectid) (vlax-get (cdr ele) 'objectid)) (vla-delete (cdr ele)) (vla-delete (cdr deb)) ) (setq lst (vl-remove ele lst)) ) ) ) ) (vla-endundomark doc) (princ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 ça ne répond pas à mon besoin malheureusement Autrement tu as OVERKILL (en ligne de commande) des expresstools, paramétré correctement ça pourrait peut être le faire.Attention ce programme est destructif, essayes sur une copie du dessin. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Patrick_35 Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 Une version qui place les blocs superposés sur le calque Patrick_35(defun c:dou(/ deb doc ele lst sel) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (or (tblsearch "layer" "Patrick_35") (vla-add (vla-get-layers doc) "Patrick_35") ) (and (ssget "x" (list (cons 0 "insert"))) (progn (vlax-for ele (setq sel (vla-get-activeselectionset doc)) (setq lst (cons (cons (vlax-get ele 'insertionpoint) ele) lst)) ) (vla-delete sel) (while lst (setq deb (car lst) lst (cdr lst) ) (while (setq ele (assoc (car deb) lst)) (if (< (vlax-get (cdr deb) 'objectid) (vlax-get (cdr ele) 'objectid)) (vla-put-layer (cdr ele) "Patrick_35") (vla-put-layer (cdr deb) "Patrick_35") ) (setq lst (vl-remove ele lst)) ) ) ) ) (vla-endundomark doc) (princ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jessayaneo Posté(e) le 10 février 2015 Auteur Posté(e) le 10 février 2015 Vous avez des idées sympa, mais ça fonctionne pas. Est-il possible de fabriquer un LISP qui cible les objets superposé sur les mêmes coordonnées, en prenant en compte les noms de blocs identiques superposés et qui suprimerai que les blocs en doublon se trouvant dans des calques dont le suffixe du nom se finisse par "PHASE B" ? Je pense que ça règlerai mon problème.
bonuscad Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 Peut être que si tu joignais en zip un extrait de ton plan (un WBLOCK d'une partie sélectionnée significative)?Les bonnes âmes pouraient ainsi mieux cibler le code lisp. A moins que dessin soit TOP confidentiel... Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Demixav Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 Tu devrais tenter le LISP que j'ai proposé plus haut...Tes deux plans seront comparés! un autre plan sera créé ou apparaitra les ajouts ET les suppressions de différentes couleurs... tu n'auras plus qu'à faire une sélection suivant la couleur... AutoCad Map 3D 2011 - Covadis v16.0dWindows 7 - 64b
jessayaneo Posté(e) le 10 février 2015 Auteur Posté(e) le 10 février 2015 Demixav, j'ai testé ton lisp et ça marche pas, il met tout le plan en bleu, il ne détecte pas de différence. bonuscad, je suis embêté justement parce que je n'ai pas le droit de divulguer mon plan.. il s'agit du plan d'un grand aeroport et j'aimerai éviter de me faire virer pour avoir transmis un plan qui pourrai servir pour un attentat^^ Y a un lisp que j'ai pas testé c'est le dernier de Patrick, je vais essayer desuite. Edit: Bien essayé Patrick_35 mais ça n'a pas marché, il détecte pas la superposition, je pense que par endroit la superposition n'est pas parfaite car ça a fonctionné sur une partie des équipements mais pas la totalité. Je viens de voir que ça pioche aléatoirement dans mes calques PHASE A ou PHASE B ce qui rend inutilisable ce lisp :/
Patrick_35 Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 je pense que par endroit la superposition n'est pas parfaiteUne version avec une tolérance de 1e-7, soit 0.0000001(defun c:dou(/ deb doc ele lst sel) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (or (tblsearch "layer" "Patrick_35") (vla-add (vla-get-layers doc) "Patrick_35") ) (and (ssget "x" (list (cons 0 "insert"))) (progn (vlax-for ele (setq sel (vla-get-activeselectionset doc)) (setq lst (cons (cons (vlax-get ele 'insertionpoint) ele) lst)) ) (vla-delete sel) (while lst (setq deb (car lst) lst (cdr lst) ) (foreach ele (vl-remove-if-not '(lambda(x) (equal (car x) (car deb) 1e-7)) lst) (if (< (vlax-get (cdr deb) 'handle) (vlax-get (cdr ele) 'handle)) (vla-put-layer (cdr ele) "Patrick_35") (vla-put-layer (cdr deb) "Patrick_35") ) (setq lst (vl-remove ele lst)) ) ) ) ) (vla-endundomark doc) (princ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jessayaneo Posté(e) le 10 février 2015 Auteur Posté(e) le 10 février 2015 Merci à tous pour votre aide, même si j'y suis pas arrivé, je vais arrêter de vous faire perdre votre temps, je vais continuer à trier au bloc par bloc. Peut être qu'une prochaine fois j'aurai LA bonne idée permettant de simplifier ce genre de problème ^^ (Patrick, le probmème de ton lisp c'est qu'il pioche le bloc dans le mauvais calque, il les prend dans (*NOM DU CALQUE*PHASE A) alors qu'il devrait les prendre en (*NOM DU CALQUE* PHASE B )
Patrick_35 Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 Tu as pris la dernière version ? Sinon, il n'est plus question d'ordre de création. Il faut alors remplacer. (if (< (vlax-get (cdr deb) 'handle) (vlax-get (cdr ele) 'handle)) (vla-put-layer (cdr ele) "Patrick_35") (vla-put-layer (cdr deb) "Patrick_35") )Par (cond ((eq (vlax-get (cdr ele) 'layer) "*NOM DU CALQUE* PHASE B") (vla-put-layer (cdr ele) "Patrick_35") ) ((eq (vlax-get (cdr deb) 'layer) "*NOM DU CALQUE* PHASE B") (vla-put-layer (cdr deb) "Patrick_35") ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jessayaneo Posté(e) le 10 février 2015 Auteur Posté(e) le 10 février 2015 Merci patrick Question con, j'ai pas essayé bien sur mais comme des claques PHASE B j'en ai des centaines est-ce que ça peu fonctionner si je fais ça: (cond ((eq (vlax-get (cdr ele) 'layer) "* PHASE B") (vla-put-layer (cdr ele) "Patrick_35") ) ((eq (vlax-get (cdr deb) 'layer) "* PHASE B") (vla-put-layer (cdr deb) "Patrick_35") ) ) C'est un peu le principe du triage de calque non ?
Patrick_35 Posté(e) le 10 février 2015 Posté(e) le 10 février 2015 Oui, mais de cette manière(wcmatch (vlax-get (cdr ele) 'layer) "* PHASE B")et(wcmatch (vlax-get (cdr deb) 'layer) "* PHASE B") @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jessayaneo Posté(e) le 10 février 2015 Auteur Posté(e) le 10 février 2015 Merci Patrick, le résultat est sympa mais inexploitable (rires forts) j'abandonne ^^On me tanne pour que j'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