Aller au contenu

Détecter conflit dans AutoCAD


ClemAuto

Messages recommandés

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

image.png.d9d30af2da2b7bd597b710e223964a20.png

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 ^^

image.gif.2a688fddfadc0a7a144545f2f77bfa22.gif

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

 

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

intersets.gif

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 ^^

image.png.ce02c3a0299cb77da18c08d86bb07062.png

image.thumb.png.8e60b62b5c202cd3161e804823fc46e7.png

Dessin1.dwg

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

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é