Aller au contenu

Redéfinir un contour (polyligne) avec des intersections (lignes).


DenisHen

Messages recommandés

Bonjour à la communauté.
Un ami m'a demandé si je pourrais faire un truc, après explications, je pensais que non, mais après réflexions, pourquoi pas...
Voilà le visuel :
CoupurePourPlis.png.d2db1669dc42c7a14163171b727ab750.png
Et les explications : 
Cet ami travaille dans une métallurgie, il découpe des tôles (en aluminium généralement) et les pli après. Après la découpe, ce n'est pas évidant de savoir où plier ces tôles.
Mais il existe une astuce, une petite encoche (1.5mm suffit) sur le bord de la tôle pour vite localiser ce pli (les petits cercles rouges)...
Cette encoche ce fait lors de la découpe, qui elle-même est "programmée" via une fonction développée (par une société qui n'existe plus) dans AutoCAD...
Avant de lancer cette application, il aimerait que les petites encoches soient faites "automatiquement", car il y en a parfois des centaines ! ! !
J'avais une solution : dessiner des cercles à chaque extrémité des lignes, mais il m'explique que ce n'est pas tellement mieux que "rien".
Donc, j'aimerais lui faire une petit Lisp, mais je tombe sur plusieurs petits problèmes...
Je sais pertinemment que personne n'a ce truc dans un tiroir, mais si vous pouviez me donner quelques directions pour le faire...
J'avais pensé à : 
  Opérateur :
   - cliquer sur le contour (en noir),
   - cliquer sur les plis (en vert),
  Lisp :
    - je cherche encore...

Je suis ouvert à toutes propositions de développement, mais n'oubliez pas que je débute (oui, depuis des années, et alors ! ! 😄 ).
Une excellente année à toi, la communauté, et surtout, la force et l'amour...
Denis...

CoupurePourPlis.dwg

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

Coucou @DenisHen,
A mon humble avis, je dirais que les encoches rectangulaires peuvent être plus délicates à gérer que les encoches arrondies. Car d'un point de vue programmation, l'encoche arrondie possède 2 sommets et une valeur de bulge (arbitraire) tandis que les encoches rectangulaires possèdent 4 sommets et à minima 3 angles droits. Donc cela nécessite plus de calculs avec les encoches rectangulaires.

Ensuite, ce que j'ai un peu de mal à comprendre c'est en terme d'intersection et notamment sur ton intersection sur segment oblique : Il semblerait que le trait vert coupe la moitié de l'encoche sur le haut et non le bas (donc la ligne noire initiale), est-ce normal ? Et concernant les intersections sur extrémités : ces intersections seront-elles toujours précisément sur l'extrémité ou bien cela peu être décalée d'un demi-millimètre ?

Autrement, tu peux éventuellement regarder ces fonctions proposées par LeeMac pour trouver ton sommet d'intersection entre 2 objets : http://www.lee-mac.com/intersectionfunctions.html
Puis il te suffira de calculer les points sur ta polyligne noire avec une distance de +0,75mm et -0,75mm par rapport à ton point d'intersection (donc tu auras tes 2 nouveaux sommets) afin de les ajouter au bon index. Il suffira ensuite de modifier le bulge entre ces 2 points pour obtenir une encoche (sens de la polyligne important car un bulge peut être négatif ou positif).

Si tu as besoin d'un exemple plus concret, je peux voir ce qu'il est possible de faire (mais j'ai peur de tout coder et donc de t'empêcher de t'amuser ^^")

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour @DenisHen

J'ai bien une idée, mais je me pose des questions sur ton exemple

  1. Tu écris Polyligne toujours fermée, mais elle ne l'est pas dans ton exemple, pourquoi ?
  2. Les lignes vertes n'intersectent pas la polyligne, Est-ce normal ? faut-il travailler COMME ton exemple ?
  3. Faut-il reconstruire la polyligne (calque contour) après traitement, elle ne l'est pas dans ton exemple.
  4. Les notas "pourquoi pas", que signifient-ils ?

J'ai peu de temps, c'est pressé ?

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à vous, et merci de votre intérêt.
@Luna : merci de me répondre. Mais je savais que j'aurais un peu de mal à me faire comprendre : En fait, les encoches peuvent être de n'importent quelles formes, elle ne servent qu'à localiser les plis de la matière. Si tu préfère dessiner un petit cœur, pas de problème 😁 !
Effectivement, mon plus gros problème viendra de la perpendicularité entre le segment de la polyligne et la ligne...
Mais pour faire simple, l'encoche existe pour montrer l'endroit du pli, à l'œil du "plieur"... On est très loin du millimètre, et beaucoup plus proche de : "Hep ! C'est là que ça se passe !". L'encoche est une localisation visuelle, rien de plus... C'est juste un doigt sur une carte...
LeeMac m'a souvent sauvé la vie (comme d'autres, d'ici aussi, encore mercis à eux) mais je ne vois pas encore comment m'en sortir. Bien que j'ai quelques pistes...
Mon plus gros problème réside dans les "TRIM" (ajuster le contour autour du pli), j'ai toujours fuis ce problème en redessinant la totalité des entités plutôt que de retoucher à celles existantes...Ne serait-ce pas une fuite en avant ?
Ensuite, Maître (gile) a développé un "calcul d'intersection" entre deux ligne (ou vecteurs, je ne sais plus), (On ne le remerciera jamais assez) mais je n'ai jamais utiliser de fonction "géométriques"...
Je pense que je vais devoir m'y coller...
Qu'entends-tu par "bulge" ?

@didier : salut l'ami :
Oui, dans mon exemple, ma polyligne n'est pas fermée, car ça fait parti de l'énoncé, et que je ne souhaitais pas faire un dessin de 3 ou 5 mètres sur 30 cm. Raison pour laquelle mon exemple ne représente qu'une partie de mon dessin, mais est exprimé dans l'énoncé. C'est mon "Prolégomène" à moi (un grand merci pour la découverte de ce mot grâce à ton site).
Désolé, le dessin vient d'un collègue, tu as raison (une fois de plus), les lignes vertes auraient du intersecter le contour en noir...
On peut reconstruire les lignes et les polylignes tant qu'on veut (c'était mon choix primaire), elle n'ont aucun intérêt "historique" dans la base du DWG.
Les notas "Pourquoi pas" existent juste pour expliquer que, cette éventualité est envisageable... 
Encore un grand merci à vous, pour votre enthousiasme à mon problème...
Il me semble que Maître Alain Bashung disait : "Je vous souhaite la force et l'amour"...
Je vous souhaite aussi tout ça, voir plus...

 

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

Coucou,
Lorsque je parle de bulge (c'est essentiellement parce que je ne connais pas la traduction en français), je parle de ceci : https://www.afralisp.net/autolisp/tutorials/polyline-bulges-part-1.php
Il s'agit d'une valeur qui permet de décrire l'arc du segment de ta polyligne. Cette valeur correspond entre-autre au code DXF 42.
J'ai commencé à travailler comme ceci (si jamais tu veux essayer de voir, cependant j'ai une approche beaucoup plus... Visual LISP donc peut-être trop complexe pour toi pour le moment) :

(defun makeSpotOnIntersect (poly line e / LM:intersections lwpoly-AddVertex 2D-Point foo obj pti p pt1 pt2 b)
  (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 lwpoly-AddVertex (obj pt i / e n s)
    (setq
      e (vlax-vla-object->ename obj)
      n (cdr (assoc 90 (entget e)))
      pt (2D-Point pt)
      s (vlax-make-safearray vlax-vbDouble '(0 . 1))
      i (cond ((null i) n) ((minusp i) 0) ((< i n) (fix i)) (n))
    )
    (vlax-safearray-fill s pt)
    (vla-AddVertex obj i s)
    (vla-Update obj)
    (if (= (1+ n) (cdr (assoc 90 (entget e)))) (1+ n))
  )
  (defun 2D-Point (pt / lg)
    (cond
      ( (or (not (listp pt)) (not (setq lg (vl-list-length pt)))) nil)
      ( (= 3 lg) (reverse (cdr (reverse pt))))
      ( (= 2 lg) pt)
    )
  )
  (defun foo (pt / i d pt1 pt2)
    (setq
      i (vlax-curve-getParamAtPoint poly pt)
      d (vlax-curve-getDistAtPoint poly pt)
    )
    (cond
      ( (= i (fix i))
        ; Ajout de 2 point + suppression d'un point
      )
      ( (setq i (1+ i))
        (setq
          pt1 (vlax-curve-getPointAtDist poly (- d (/ e 2.)))
          pt2 (vlax-curve-getPointAtDist poly (+ d (/ e 2.)))
        )
        (lwpoly-AddVertex obj pt2 i)
        (lwpoly-AddVertex obj pt1 i)
        (vla-setBulge obj i -0.5)
        i
      )
    )
    
  )
  
  (setq
    obj (vlax-ename->vla-object poly)
    pti (LM:intersections obj (vlax-ename->vla-object line) acextendotherentity)
  )
  (mapcar 'foo pti)
)

C'est partiellement fonctionnel et il y a encore beaucoup de spécificités à prévoir mais c'est une ébauche.

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Dans le même esprit que Luna, j'avais publié ceci dans un forum.

Cela crée des sommets supplémentaires aux intersections avec d'autres objets

NB: Pour cela il faudrait que tes lignes de pliures coupent ou arrivent sur ta polyligne pour que cela fonctionne...

(vl-load-com)
(defun add_vtx (obj add_pt ent_name / bulg)
  (vla-addVertex
    obj
    (1+ (fix add_pt))
    (vlax-make-variant
      (vlax-safearray-fill
        (vlax-make-safearray vlax-vbdouble (cons 0 1))
          (list
            (car (trans (vlax-curve-getpointatparam obj add_pt) 0 ent_name))
            (cadr (trans (vlax-curve-getpointatparam obj add_pt) 0 ent_name))
          )
      )
    )
  )
  (setq bulg (vla-GetBulge obj (fix add_pt)))
  (vla-SetBulge obj
    (fix add_pt)
    (/
      (sin (/ (* 4 (atan bulg) (- add_pt (fix add_pt))) 4))
      (cos (/ (* 4 (atan bulg) (- add_pt (fix add_pt))) 4))
    )
  )
  (vla-SetBulge obj
    (1+ (fix add_pt))
    (/
      (sin (/ (* 4 (atan bulg) (- (1+ (fix add_pt)) add_pt)) 4))
      (cos (/ (* 4 (atan bulg) (- (1+ (fix add_pt)) add_pt)) 4))
    )
  )
  (vla-update obj)
)
(defun c:add_vertexAtInt ( / lst_pt js e_name obj js_b nb tmp_name tmp_obj vrt_pt pt)
  (princ "\nSelect POLYLINE")
  (while (null (setq js (ssget "_+.:E:S" '((0 . "LWPOLYLINE")))))
    (princ "\nIsn't an object available!")
  )
  (setq obj (vlax-ename->vla-object (setq e_name (ssname js 0))))
  (princ "\nSelect cutting objects")
  (setq js_b (ssget))
  (cond
    (js_b
      (repeat (setq nb (sslength js_b))
        (setq tmp_name (ssname js_b (setq nb (1- nb))))
        (cond
          (tmp_name
            (setq
              tmp_obj (vlax-ename->vla-object tmp_name)
              vrt_pt (vlax-variant-value (vla-IntersectWith obj tmp_obj 0))
            )
            (if (>= (vlax-safearray-get-u-bound vrt_pt 1) 0)
              (progn
                (setq pt (vlax-safearray->list vrt_pt))
                (if pt
                  (if (> (length pt) 3)
                    (repeat (/ (length pt) 3)
                      (setq lst_pt (cons (list (car pt) (cadr pt) (caddr pt)) lst_pt) pt (cdddr pt))
                    )
                    (setq lst_pt (cons pt lst_pt))
                  )
                )
              )
            )
          )
        )
      )
      (if (and lst_pt (listp lst_pt))
        (foreach el lst_pt
          (add_vtx obj (vlax-curve-getparamatpoint obj (vlax-curve-getClosestPointTo obj (trans el 1 0))) e_name)
        )
      )
    )
  )
  (prin1)
)

 

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 @DenisHen

 

"et que je ne souhaitais pas faire un dessin de 3 ou 5 mètres sur 30 cm."

Ce n'est pas dur de faire un dessin exemple propre et qui ne pose pas de questions, si les dimensions ne correspondent pas, on s'en fout, c'est le but de l'exemple !
ça signifie que deux intersections existent sur chaque ligne ?
Du coup, il va falloir gérer dans quel sens faire l'encoche.

Je regarderai les "pourquoi pas" peut-être plus tard.

Je ne suis pas certain de faire un truc rapidement

Amicalement

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut Ô l'ami; Maître @didier

Il m'a semblé être claire...
Mais nul n'est parfait... Et je sais que je le suis rarement... Ô combien ! ! !
Le but ultime reste très simple, voir simplissime (en théorie, je l'admet)...

En gros et pour essayer de faire au plus simple : 
 - faires des petites encoches sur une polyligne fermée depuis des intersections de "lignes".
 - Je ne vois pas quoi dire de plus...

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 Super merci à toi BonusCad...
Mais je pensais à autre chose...
Juste couper ce qui ne me plait pas...
Comme dans l'exemple...
Mais je tenais à remercier BonuscCAD pour les centaines d'aides et de soutiens qu'il nous a offert depuis des années...

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

Quand on est face à un problème, il faut le décomposer pour avoir des morceaux plus simple à développer et à tester.

Tu vas commencer par sélectionner la polyligne, puis un point sur la polyligne et tu vas essayer de rajouter 2 points situés à 1/2 largeur d'encoche avant et après le point cliqué. On va commencer simple en cliquant un point au milieu du 2ème segment de ta polyligne exemple.

image.png.a396c0b9d2e96b23007849f6cec6b04d.png

Un peu de théorie. Chaque sommet d'une polyligne possède un indice qui commence à 0 et qui s'appelle un Paramètre (la polyligne est une courbe paramétrique). @didier a parfaitement expliqué cette notion de paramètre sur son site.

Le but de ton programme, consiste à trouver pour le point cliqué :

- l'abscisse de ton point sur la polyligne : c'est la distance depuis le point 0

- le paramètre de ton point cliqué pour connaître l'indice du sommet précédent.

Ensuite tu calcules l'abscisse - 1/2 encoche, l'abscisse + 1/2 encoche et tu recalcules les 2 points à ces abscisses

Enfin tu insères ces 2 points sur le bon segment

Pour travailler sur les polylignes (courbe ou curve en anglais), on dispose des fonctions vlax-curve_... qui font tout le boulot. @didier explique ça très bien aussi.

on dispose de vlax-curve-GetDistAtPoint qui permet de connaître l'abscisse d'un point donné le long d'une courbe et sa réciproque vlax-curve-GetPointAtDist

On a aussi vlax-curve-GetParamAtPoint qui donne ... tu devrais trouver tout seul.

Mais ces fonctions on besoin d'un objet de type vla donc il va falloir "transformer" la polyligne sélectionnée en objet vla. Ca tombe bien il y a une fonction pour ça vlax-ename->vla-object

 

Je t'ai écrit les commentaires avec le rappel des fonctions à utiliser, tu n'as plus qu'à remplir. Je t'ai laissé les fonctions d'insertion de points sur une courbe qui sont un peu plus "velues"

; encoche
(defun C:DH_Encoche ( / oPolyVla oPoly PT dDist PT1 dDist1 PT2 dDist2 dParam)
  ; sélection d'une polyligne
  
  ; conversion en objet vla : vlax-ename->vla-object
  
  ; sélection d'un point
  
  ; calcule de l'abscisse de ce point sur la courbe : vlax-curve-GetDistAtPoint
  
  ; calcule de la distance - 1/2 encoche
  
  ; calcule du point sur la courbe correspondant à cette abscisse : vlax-curve-GetPointAtDist
  
  ; calcule de la distance + 1/2 encoche
  
  ; calcule du point sur la courbe correspondant à cette abscisse : vlax-curve-GetPointAtDist
  
  ; calcule du paramètre du point cliqué : vlax-curve-GetParamAtPoint
  
  ; calcule du paramètre (indice) du sommet précédent
  
  ; insertion du 1er point à l'indice +1
  (vla-addVertex
    oPolyVla
    (+ dParam 1)
    (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble (cons 0 1)) (list (car PT1) (cadr PT1))))
  )
  ; insertion du 2nd point à l'indice +2
  (vla-addVertex
    oPolyVla
    (+ dParam 2)
    (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble (cons 0 1)) (list (car PT2) (cadr PT2))))
  )
  ; mise en place du bulge au 1er point

)

Bon courage

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Le 19/01/2024 à 22:18, Olivier Eckmann a dit :

Mais ces fonctions on besoin d'un objet de type vla donc il va falloir "transformer" la polyligne sélectionnée en objet vla. Ca tombe bien il y a une fonction pour ça vlax-ename->vla-object

Coucou @Olivier Eckmann,
Juste pour la petite précision inutile mais c'est toujours bon à savoir : les fonctions vlax-curve-... font exception à la règle car elles acceptent aussi bien un VLA-Object qu'un ename comme argument. Et pour la petite anecdocte d'ailleurs, si on regarde un Benchmark avec par exemple la fonction (vlax-curve-getDistAtParam), on se rend compte que la fonction est d'ailleurs plus "rapide" en utilisant un ename plutôt qu'un VLA-Object :

Commande: (benchmark '((vlax-curve-getDistAtParam name 7) (vlax-curve-getDistAtParam obj 7)))
Elapsed milliseconds / relative speed for 65536 iteration(s):
    (vlax-curve-getDistAtParam NAME 7).....1640 / 1.26 <fastest>
    (vlax-curve-getDistAtParam OBJ 7)......2063 / 1.00 <slowest>

Avec ici 'name' correspondant à l'ename et 'obj' correspondant au VLA-Object 😉

Bref, parenthèse fermée pour moi :3

Bisous,
Luna

Lien vers le commentaire
Partager sur d’autres sites

Merci @Luna pour la précision. C'est vrai que j'ai toujours passé un vla-object en paramètre. En plus dans la doc, c'est bien marqué vla-objet pour le paramètre.

vlax-curve-getDistAtParam (AutoLISP/ActiveX)

Returns the length of the curve's segment from the curve's beginning to the specified parameter

Supported Platforms: Windows only; not available on Mac OS or Web

Signature

(vlax-curve-getDistAtParam curve-obj param)
curve-obj

Type: VLA-object

The object to be measured.

 

En tout cas, ça va me simplifier la vie et en plus ça tournera plus vite.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à la communauté.
Un très grand merci à vous pour votre aide.
Je vais pouvoir faire quelque chose avec tout ça.
Encore merci à vous !
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é