ClemAuto Posté(e) le 21 juillet 2022 Posté(e) le 21 juillet 2022 Bonjour, Je suis à la recherche d'une commande ou d'un lisp sur AutoCAD me permettant de détecter des conflits / superpositions de ligne. L'idéal serai de détecter ce conflit sur des calques et/ou objet distinct ou même si possible entre un claque/objet avec un Xréf. Par exemple avec l'image ci-dessous de détecter sur tout le dessin quand le cercle en pointillé vert touche le rectangle noir. Cette Commande ou Lisp est-t-il possible ? Merci d'avance J'ai trouver ce GIF sur internet, c'est exactement ce que je souhaite faire si cela peut aider à la compréhension de ma demande ^^
lecrabe Posté(e) le 21 juillet 2022 Posté(e) le 21 juillet 2022 Hello As tu une Licence MAP ou CIVIL ou AutoCAD 2019-202X ToolSet (qui inclut MAP) ? Car la commande MAPCLEAN (de AutoCAD MAP ou AutoCAD CIVIL) pourrait t aider !? Bye, lecrabe Autodesk Expert Elite Team
didier Posté(e) le 21 juillet 2022 Posté(e) le 21 juillet 2022 Bonjour @ClemAuto C'est tout à fait possible en LSP. Toutefois, il faut savoir si la détection doit se faire sur la totalité du dessin avec ou sans filtrage de calques ou si on fait une sélection classique AutoCAD. La différence de temps de traitement sera énorme suivant le nombre d'entités. Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
didier Posté(e) le 21 juillet 2022 Posté(e) le 21 juillet 2022 Bonjour @ClemAuto Je vois que le sujet est dans le forum VBA c'est négociable ou faut-il répondre en VBA uniquement ? Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
ClemAuto Posté(e) le 22 juillet 2022 Auteur Posté(e) le 22 juillet 2022 Bonjour @lecrabe J'utilise une licence pour Autodesk AutoCAD 2023, mais je n'ai pas la commande MAPCLEAN Bien cordialement
ClemAuto Posté(e) le 22 juillet 2022 Auteur Posté(e) le 22 juillet 2022 Bonjour @didier L'idéal serai de sélectionner les calques (par ex : trouver les conflits entre le calque 1 et le calque 2) Non pas forcément en VBA, mais je suis preneur de toute solution. Bien cordialement
Curlygoth Posté(e) le 25 juillet 2022 Posté(e) le 25 juillet 2022 Pour ça je le ferais en 2 etapes : Première étape récuperer tous les objets de tes 2 calques et pour chaque objet du calque 1 on va "verifier" s'il y a des "erreurs" avec les objet du calque 2 et quels sont tes conditions pour les erreurs ? pour ton exemple si dessus : cette ligne permet d'avoir les points d'intersection entre 2 objet par exemple : Points = OBJ1.IntersectWith(OBJ2, acExtendNone) va me donner les 2 points les Objets ont se "touche" et donc si 2 point c'est qu'il sont comme dans ton exemple : Points(X1,Y1,Z1,X2,Y2,Z2) X1 , Y1 , Z1 point du point 1 X2 , Y2 , Z2 point du point 2 hésite pas Mon site Web (en cours de construction) : Site DA-CODE de @didier
Steven Posté(e) le 25 juillet 2022 Posté(e) le 25 juillet 2022 Le 22/07/2022 à 09:03, ClemAuto a dit : Bonjour @lecrabe J'utilise une licence pour Autodesk AutoCAD 2023, mais je n'ai pas la commande MAPCLEAN Bien cordialement Salut, La commande MAPCLEAN n'existe pas dans AutoCAD mais existe dans AutoCAD Map 3D Le fait que tu aies une licence AutoCAD 2023, tu as accès aux AutoCAD Méttiers tel qu'AutoCAD Architecure, AutoCAD MEP ou AutoCAD MAP 3D, pour ne citer qu'eux. Tu peux donc télécharger et installer AutoCAD MAP 3D si tu souhaites avoir accès à la commande MAPCLEAN; Steven________________________________________ Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD. Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD. En rêve; AutoCAD sous Linux.
ClemAuto Posté(e) le 25 juillet 2022 Auteur Posté(e) le 25 juillet 2022 Bonjour @Curlygoth J'ai bien compris votre démarche mais si mes calques sont composés de plusieurs objet différent, puis-je le faire en sélectionnant directement tout le calque ? Et avoir les points d'intersection des 2 calques directement ? Cette fonction n'est-elle pas disponible en lisp ? bien cordialement
ClemAuto Posté(e) le 25 juillet 2022 Auteur Posté(e) le 25 juillet 2022 Bonjour @Steven Après avoir télécharger AutoCAD MAP 3D et utilisé la commande MAPCLEAN je n'arrive à avoir le résultat que je souhaite Y a t'il des particularités pour cette commande ? Je n'arrive pas avoir mes points d'intersection entre mes 2 calques... Bien cordialement
Curlygoth Posté(e) le 25 juillet 2022 Posté(e) le 25 juillet 2022 Citation J'ai bien compris votre démarche mais si mes calques sont composés de plusieurs objet différent, puis-je le faire en sélectionnant directement tout le calque ? OUI, OBJ1 et OBJ2 sont des objets : cercle polyligne etc... Citation Et avoir les points d'intersection des 2 calques directement ? oui via la liste des points que j'ai expliqué plus haut 😉 Citation Cette fonction n'est-elle pas disponible en lisp ? Je pense que c'est possible en lisp, mais je ne pourrais t'aider efficacement sur ce langage XD Le 21/07/2022 à 19:06, didier a dit : Bonjour @ClemAuto C'est tout à fait possible en LSP. Toutefois, il faut savoir si la détection doit se faire sur la totalité du dessin avec ou sans filtrage de calques ou si on fait une sélection classique AutoCAD. La différence de temps de traitement sera énorme suivant le nombre d'entités. Amicalement Mon site Web (en cours de construction) : Site DA-CODE de @didier
Steven Posté(e) le 25 juillet 2022 Posté(e) le 25 juillet 2022 Il y a 1 heure, ClemAuto a dit : Bonjour @Steven Après avoir télécharger AutoCAD MAP 3D et utilisé la commande MAPCLEAN je n'arrive à avoir le résultat que je souhaite Y a t'il des particularités pour cette commande ? Je n'arrive pas avoir mes points d'intersection entre mes 2 calques... Bien cordialement Je n'utilise pas AutoCAD Map. Les pros d'AutoCAD Map sauront te répondre. Je ne faisais que référence à la réponse de @lecrabe ; Le 21/07/2022 à 18:38, lecrabe a dit : Hello As tu une Licence MAP ou CIVIL ou AutoCAD 2019-202X ToolSet (qui inclut MAP) ? Car la commande MAPCLEAN (de AutoCAD MAP ou AutoCAD CIVIL) pourrait t aider !? Bye, lecrabe et à ta réponse ; Le 22/07/2022 à 09:03, ClemAuto a dit : Bonjour @lecrabe J'utilise une licence pour Autodesk AutoCAD 2023, mais je n'ai pas la commande MAPCLEAN Bien cordialement Steven________________________________________ Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD. Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD. En rêve; AutoCAD sous Linux.
ClemAuto Posté(e) le 25 juillet 2022 Auteur Posté(e) le 25 juillet 2022 J'ai cherché longuement sur plusieurs site et forum de lisp et je suis tombé sur ça : http://lee-mac.com/intersectionfunctions.html#intersectionsbetweensets Sur ce site j'ai trouvé un lisp qui pourrait me convenir parfaitement (voir gif) Mais je n'arrive pas à l'utiliser, je n'ai rien qui se passe ou j'ai cette erreur sur AutoCAD ; erreur: no function definition: CONTRE Voici ce que j'ai mis (ce qui est sur le site) : ;; Intersections - Lee Mac ;; Returns a list of all points of intersection between two objects ;; for the given intersection mode. ;; ob1,ob2 - [vla] VLA-Objects ;; mod - [int] acextendoption enum of intersectwith method (defun LM:intersections ( ob1 ob2 mod / lst rtn ) (if (and (vlax-method-applicable-p ob1 'intersectwith) (vlax-method-applicable-p ob2 'intersectwith) (setq lst (vlax-invoke ob1 'intersectwith ob2 mod)) ) (repeat (/ (length lst) 3) (setq rtn (cons (list (car lst) (cadr lst) (caddr lst)) rtn) lst (cdddr lst) ) ) ) (reverse rtn) ) (defun c:inter ( / obj1 obj2 ) (if (and (setq obj1 (car (entsel "\nSelect 1st Object: "))) (setq obj2 (car (entsel "\nSelect 2nd Object: "))) ) (foreach pnt (LM:intersections (vlax-ename->vla-object obj1) (vlax-ename->vla-object obj2) acextendnone) (entmake (list '(0 . "POINT") (cons 10 pnt))) ) ) (princ) ) (vl-load-com) (princ) ;; Intersections Between Sets - Lee Mac ;; Returns a list of all points of intersection between objects in two selection sets. ;; ss1,ss2 - [sel] Selection sets (defun LM:intersectionsbetweensets ( ss1 ss2 / id1 id2 ob1 ob2 rtn ) (repeat (setq id1 (sslength ss1)) (setq ob1 (vlax-ename->vla-object (ssname ss1 (setq id1 (1- id1))))) (repeat (setq id2 (sslength ss2)) (setq ob2 (vlax-ename->vla-object (ssname ss2 (setq id2 (1- id2)))) rtn (cons (LM:intersections ob1 ob2 acextendnone) rtn) ) ) ) (apply 'append (reverse rtn)) ) (defun c:intersets ( / ss1 ss2 ) (if (and (setq ss1 (ssget)) (setq ss2 (ssget)) ) (foreach pnt (LM:intersectionsbetweensets ss1 ss2) (entmake (list '(0 . "POINT") (cons 10 pnt))) ) ) (princ) ) (vl-load-com) (princ) Si quelqu'un pourrait m'orienter sur ce LISP je suis preneur… Bien cordialement
Luna Posté(e) le 25 juillet 2022 Posté(e) le 25 juillet 2022 Coucou, J'allais justement te proposer un programme basé sur l'exemple de LeeMac ^^" Essaye avec ceci pour voir si cela correspond à ton besoin : (defun c:Inter2Layers (/ LM:intersectionbetweensets LM:intersections Object2Layer layer1 layer2 ss ss1 ss2 lst tmp) (defun LM:intersectionsbetweensets ( ss1 ss2 / id1 id2 ob1 ob2 rtn ) (repeat (setq id1 (sslength ss1)) (setq ob1 (vlax-ename->vla-object (ssname ss1 (setq id1 (1- id1))))) (repeat (setq id2 (sslength ss2)) (setq ob2 (vlax-ename->vla-object (ssname ss2 (setq id2 (1- id2)))) rtn (cons (LM:intersections ob1 ob2 acextendnone) rtn) ) ) ) (apply 'append (reverse rtn)) ) (defun LM:intersections ( ob1 ob2 mod / lst rtn ) (if (and (vlax-method-applicable-p ob1 'intersectwith) (vlax-method-applicable-p ob2 'intersectwith) (setq lst (vlax-invoke ob1 'intersectwith ob2 mod)) ) (repeat (/ (length lst) 3) (setq rtn (cons (list (car lst) (cadr lst) (caddr lst)) rtn) lst (cdddr lst) ) ) ) (reverse rtn) ) (defun Object2Layer (msg / ent) (while (not (setq ent (entsel msg))) ) ) (setq param (list "Calque1" "Calque2")) ; Remplacer le nom des calques par défaut ici ! (setq mode 1) ; Définir la valeur de mode sur 0 (= entrer le nom des calques à la main) ou 1 (= sélectionner une entité pour récupérer son calque) (and (cond ( (= 0 mode) (and (or (not (= "" (setq layer1 (getstring T (strcat "\nSpécifier le nom du 1er calque <" (car param) "> : "))))) (setq layer1 (car param)) ) (or (not (= "" (setq layer2 (getstring T (strcat "\nSpécifier le nom du 2nd calque <" (cadr param) "> : "))))) (setq layer2 (cadr param)) ) ) ) ( (= 1 mode) (and (or (and (setq layer1 (entsel (strcat "\nSélectionner une entité du 1er calque <" (car param) "> : "))) (setq layer1 (cdr (assoc 8 (entget (car layer1))))) ) (setq layer1 (car param)) ) (or (and (setq layer2 (entsel (strcat "\nSélectionner une entité du 2nd calque <" (cadr param) "> : "))) (setq layer2 (cdr (assoc 8 (entget (car layer2))))) ) (setq layer2 (cadr param)) ) ) ) ) (null (sssetfirst)) (setq ss (ssadd)) (setq ss1 (ssget "_X" (list (cons 8 layer1) (cons 410 (getvar "CTAB"))))) (setq ss2 (ssget "_X" (list (cons 8 layer2) (cons 410 (getvar "CTAB"))))) (setq lst (LM:IntersectionsBetweenSets ss1 ss2)) (setq tmp (vl-remove nil (mapcar '(lambda (p) (entmakex (list '(0 . "POINT") (cons 10 p) '(62 . 1)))) lst))) (mapcar '(lambda (e) (ssadd e ss)) tmp) (sssetfirst nil ss) (princ (strcat "\nUn total de " (itoa (length tmp)) " / " (itoa (length lst)) " points d'intersections ont été créé avec succès, avec les calques :" "\n " layer1 " : " (itoa (sslength ss1)) " objets" "\n " layer2 " : " (itoa (sslength ss2)) " objets" ) ) ) (princ) ) Il y a seulement 2 lignes modifiables : (setq param (list "Calque1" "Calque2")) ; Remplacer le nom des calques par défaut ici ! (setq mode 1) ; Définir la valeur de mode sur 0 (= entrer le nom des calques à la main) ou 1 (= sélectionner une entité pour récupérer son calque) La première permet de définir le nom des calques 1 et 2 par défaut (donc ici les valeurs par défaut seront "Calque1" et "Calque2" mais tu peux modifier les noms si besoin). La seconde ligne permet de choisir le mode pour spécifier le nom des calques. Donc tu as 2 valeurs autorisées : Citation 0 -> Tu dois entrer le nom des calques à la mano (non sensible à la casse) 1 -> Tu sélectionnes une entité appartenant à chacun des calques pour récupérer le nom du calque dans ses propriétés Le programme te renvoie normalement le nombre de point créés avec succès ainsi que le nombre d'objets pris en compte pour chaque calque. S'il ne renvoie rien, c'est qu'il n'a pas pu créer de points. Les points créés sont sélectionnés à la fin du programme pour pouvoir les vérifier plus facilement, modifier leurs propriétés, etc... Bisous, Luna
ClemAuto Posté(e) le 25 juillet 2022 Auteur Posté(e) le 25 juillet 2022 Bonjour @Luna Merci beaucoup pour ta réponse, c'est exactement ce que je cherchais ! 🙂 Par contre petite question, cela fonctionne très bien quand je dessine moi même les cercles, polyligne etc... mais cela ne fonctionne pas avec des éléments (cercle polyligne... aussi) que j'ai copier d'un autre dessin et je ne comprend pas pourquoi Car même quand je copie les propriétés des éléments que j'ai dessiné, la commande ne prend pas en compte les éléments copiés d'un autre dessin (alors qu'ils sont identiques aux autres) Avez-vous une solution à ce problème ? Ci-joint le dwg pour comprendre le problème Sur le screen ci-dessous on peut voir les points donnés grâce à la commande mais on voit que ceux que j'ai copié ne sont pas pris en compte, j'espère être clair ^^ Dessin1.dwg
Luna Posté(e) le 25 juillet 2022 Posté(e) le 25 juillet 2022 Coucou, Je remarque que tes cercles verts ont des valeurs différentes de 0 pour le Z (ou du moins différentes de l'élévation de tes polylignes) donc forcément le programme n'est pas en mesure de détecter des points d'intersections avec des objets qui ne sont pas sur le même plan. Essaye de repasser tes objets avec un Z=0 et le problème est résolu (idem pour l'élévation de tes polylignes) 😉 Si la propriété en Z doit être conservée, c'est un peu plus... "délicat" comme programme malheureusement (car il faut temporairement affecter des coordonnées Z=0 pour l'ensemble des objets, lancer le programme, puis ré-affecter les Z initiaux). Bisous, Luna
Curlygoth Posté(e) le 25 juillet 2022 Posté(e) le 25 juillet 2022 Les Z des cercle n'est pas la meme que tes cadres 😉 donc le programme a raison il se touche pas 🙂 Citation Si la propriété en Z doit être conservée, c'est un peu plus... "délicat" (délichat elle voulait dire) Faut "juste" créer un base pour récupere la bonne propriété du Z de l'objet Obj.Elevation pour les AcadLWPolyline OBJ.Center(2) pour AcadCircle moi je ferais : Z_init = Obj.Elevation Obj.Elevation = 0 'le code qui verifie Obj.Elevation = Z_init Mon site Web (en cours de construction) : Site DA-CODE de @didier
ClemAuto Posté(e) le 25 juillet 2022 Auteur Posté(e) le 25 juillet 2022 @Luna & @Curlygoth Merci beaucoup pour vos réponses tout est plus clair pour moi maintenant 👍 Amicalement 🙂
ClemAuto Posté(e) le 26 juillet 2022 Auteur Posté(e) le 26 juillet 2022 Bonjour @Luna @Curlygoth Je reviens demander de l'aide... J'ai un dessin où j'ai une multitude d'objet, de calque etc et je souhaiterais l'aplatir pour que le z de TOUT le dessin soit égal à 0 Les plans archi que j'ai ont du être réalisé en 3D et les objets intégrés dans le dessin ne sont pas sur une altimétrie de 0 En cherchant sur le forum plusieurs solution sont proposés mais aucune ne fonctionne pour mon cas Quelques objets se mettent sur un Z=0 mais quand je suis de vue de côté ils sont pas alignés car dans ses objets en questions l'altimétrie n'est pas de 0 J'aimerai savoir si c'est possible de TOUT mettre à un z=0 Bien cordialement
didier Posté(e) le 26 juillet 2022 Posté(e) le 26 juillet 2022 Bonjour @ClemAuto Merci de commencer un autre sujet quand la nouvelle question est sans rapport avec le message en cours, ceci pour la clarté des forums. Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
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