Aller au contenu

Relier Blocs entre eux


Topheur

Messages recommandés

Bonjour les lispeurs et les lispeuses :)

 

J'ai besoin de votre aide pour comprendre ce lisp

 

;;;Taper GAGB pour utiliser


(defun c:gagb (/ ss n lst)

 (if (setq ss (ssget '((0 . "INSERT"))))

   (progn

     (setq n -1)

     (while (setq pt (ssname ss (setq n (1+ n))))

       (setq lst (cons (cdr (assoc 10 (entget pt))) lst))

     )

     (command "_.pline")

     (mapcar '(lambda (x) (command "_non" x)) lst)

     (command)

   )

 )

 (princ)

)

 

Il permet de relier les blocs sélectionnés par leur point de base entre eux.

 

J'aimerais adapter ce code en choisissant mon PREMIER BLOC OU mon PREMIER POINT (si c'est plus simple).

Puis relier de ce PREMIER bloc (ou point) les autres blocs que je sélectionnerais.

 

Un petit dessin...

 

kyo9.png

 

Sur le dessin j'ai mis de la couleur car je ne veux pas comme le lisp actuel une seule polyligne, je voudrais une ligne par bloc mais la couleur serais toujours la même.

 

En bref je clique pour avoir mon premier point puis je sélectionne TOUS les blocs que je veux ramener à ce premier point, j'appuie sur entrée et mes lignes sont tracées automatiquement.

 

Dans l'idée, je voulais définir un premier point via

;point de départ
(setq pdep (getpoint "\nSpécifiez le premier point: ")) ;; point de départ

Puis faire une boucle while qui ferait

avec une(command "_.line" qui aurait pour point pdep => point base bloc 1

puis pdep => point base bloc 2

etc...

Si on ne peut pas tracer dans l'ordre de sélection, se n'ai pas grave, c'est juste la solution qui me parais la plus simple... ou pas :D

 

Merci de votre aide :)

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Tu peux essayer ça :

 

(defun c:XXX (/ br elst pt ss i)
 (and
   (setq br (car (entsel "\nSelectionnez le bloc de départ: ")))
   (setq elst (entget br))
   (setq pt (trans (cdr (assoc 10 elst)) br 0))
   (= (cdr (assoc 0 elst)) "INSERT")
   (princ "\nSélectionnez les blocs à relier.")
   (setq ss (ssget '((0 . "INSERT"))))
   (or (ssdel br ss) T)
   (repeat (setq i (sslength ss))
     (setq elst (entget (ssname ss (setq i (1- i)))))
     (entmakex
       (list
         (cons 0 "LINE")
         (cons 10 pt)
         (cons 11 (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 0))
       )
     )
   )
 )
 (princ)
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Tu peux essayer ça :

 

(defun c:XXX (/ br elst pt ss i)
 (and
   (setq br (car (entsel "\nSelectionnez le bloc de départ: ")))
   (setq elst (entget br))
   (setq pt (trans (cdr (assoc 10 elst)) br 0))
   (= (cdr (assoc 0 elst)) "INSERT")
   (princ "\nSélectionnez les blocs à relier.")
   (setq ss (ssget '((0 . "INSERT"))))
   (or (ssdel br ss) T)
   (repeat (setq i (sslength ss))
     (setq elst (entget (ssname ss (setq i (1- i)))))
     (entmakex
       (list
         (cons 0 "LINE")
         (cons 10 pt)
         (cons 11 (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 0))
       )
     )
   )
 )
 (princ)
)

 

Bonjour Gile,

 

C'est ce que je cherche mais j'aimerais connaitre le nom de la variable enregistrant les points de base car lorsque le lisp trace le trait, j'aimerais insérer un bloc dynamique au point d'insertion du bloc.

J'ai compris que pt est le point de départ mais pour le reste...

Moi, pour tracer un trait j'utilise command ...

 

Merci de ton aide.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Il n'y a pas de variable pour ce point dans le code proposé.

J'en ai rajouté une dans le code ci-dessous.

 

(defun c:XXX (/ br elst p0 ss i pt)
 (and
   (setq br (car (entsel "\nSelectionnez le bloc de départ: ")))
   (setq elst (entget br))
   (= (cdr (assoc 0 elst)) "INSERT")
   (setq p0 (trans (cdr (assoc 10 elst)) br 1)) ; point d'insertion du bloc de départ
   (princ "\nSélectionnez les blocs à relier.")
   (setq ss (ssget '((0 . "INSERT"))))
   (or (ssdel br ss) T)		; supprimer le bloc de départ du jeu de sélection
   ;; parcourir le jeu de sélection
   (repeat (setq i (sslength ss))
     (setq elst (entget (ssname ss (setq i (1- i)))) ; données DXF du bloc
    pt	 (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 1) ; point d'insertion du bloc
     )
     ;; construction de la ligne
     (command "_.line" p0 pt "")
   )
 )
 (princ)
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Il n'y a pas de variable pour ce point dans le code proposé.

J'en ai rajouté une dans le code ci-dessous.

 

(defun c:XXX (/ br elst p0 ss i pt)
 (and
   (setq br (car (entsel "\nSelectionnez le bloc de départ: ")))
   (setq elst (entget br))
   (= (cdr (assoc 0 elst)) "INSERT")
   (setq p0 (trans (cdr (assoc 10 elst)) br 1)) ; point d'insertion du bloc de départ
   (princ "\nSélectionnez les blocs à relier.")
   (setq ss (ssget '((0 . "INSERT"))))
   (or (ssdel br ss) T)		; supprimer le bloc de départ du jeu de sélection
   ;; parcourir le jeu de sélection
   (repeat (setq i (sslength ss))
     (setq elst (entget (ssname ss (setq i (1- i)))) ; données DXF du bloc
    pt	 (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 1) ; point d'insertion du bloc
     )
     ;; construction de la ligne
     (command "_.line" p0 pt "")
   )
 )
 (princ)
)

 

Bonjour Gile,

 

Comme c'est la fête des mamans aujourd'hui, je n'ai pas le temps de regarder le code aujourd'hui.

Je te ferais un retour après avoir regardé.

 

Merci

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Il n'y a pas de variable pour ce point dans le code proposé.

J'en ai rajouté une dans le code ci-dessous.

 

(defun c:XXX (/ br elst p0 ss i pt)
 (and
   (setq br (car (entsel "\nSelectionnez le bloc de départ: ")))
   (setq elst (entget br))
   (= (cdr (assoc 0 elst)) "INSERT")
   (setq p0 (trans (cdr (assoc 10 elst)) br 1)) ; point d'insertion du bloc de départ
   (princ "\nSélectionnez les blocs à relier.")
   (setq ss (ssget '((0 . "INSERT"))))
   (or (ssdel br ss) T)		; supprimer le bloc de départ du jeu de sélection
   ;; parcourir le jeu de sélection
   (repeat (setq i (sslength ss))
     (setq elst (entget (ssname ss (setq i (1- i)))) ; données DXF du bloc
    pt	 (trans (cdr (assoc 10 elst)) (cdr (assoc 210 elst)) 1) ; point d'insertion du bloc
     )
     ;; construction de la ligne
     (command "_.line" p0 pt "")
   )
 )
 (princ)
)

 

Bonjour Gile,

 

Comme promis, je reviens donner mes impressions.

Ce lisp fonctionne parfaitement.

 

Pendant que l'on y est "Où il y a de la gêne, il n'y a pas de plaisir" :D

 

Peut-on inscrire dans une variable, le nombres de blocs sélectionné ?

 

Idem pour un nombre de clic ?

J'ai un code similaire que j'utilise avec un clic sur le premier bloc(sans sélection) puis clic (2e point) sur le bloc suivant et ainsi de suite.

Je l'utilise dans le cas ou je n'ai que du dessin.

J'aimerais avoir le nombre de clic dans ma variable.

 

Merci :)

Lien vers le commentaire
Partager sur d’autres sites

Pour le nombre d'objets sélectionnés, tu peux utiliser la fonction sslength.

Le nombre de clics, je ne comprends pas. En tous cas ce n'est pas significatif parce qu'on peut faire une sélection de multiples manières (fenêtre, polygone, clic).

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Pour le nombre d'objets sélectionnés, tu peux utiliser la fonction sslength.

Le nombre de clics, je ne comprends pas. En tous cas ce n'est pas significatif parce qu'on peut faire une sélection de multiples manières (fenêtre, polygone, clic).

 

J'ai réussi avec la fonction sslength !!! :(rires forts):

Je n'y arrivais pas car dans le code suivant :

(setpropertyvalue bloc "ATTRIBUT_NBRS_BLOCS" (itoa nbs_blocs)) je n'avais pas mis itoa... :rolleyes:

 

Pour en revenir au clic, j'étais un peu pressé.

En fait je n'ai pas besoin de savoir combien de clic l'utilisateur à fait.

 

Sujet résolu, mais je pense avoir encore besoin de tes lumières dans de futur lisp.

 

@ bientôt :)

Lien vers le commentaire
Partager sur d’autres sites

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é