CADxp: Relier Blocs entre eux - CADxp

Aller au contenu

Page 1 sur 1

Relier Blocs entre eux

#1 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

  Posté 26 mai 2018 - 08:54

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

Image IPB

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 :)
0

#2 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11259
  • Inscrit(e) : 02-septembre 05

Posté 26 mai 2018 - 15:46

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
Image IPB
0

#3 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 26 mai 2018 - 18:56

Voir le message(gile), le 26 mai 2018 - 15:46 , dit :

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.
0

#4 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11259
  • Inscrit(e) : 02-septembre 05

Posté 27 mai 2018 - 07:57

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
Image IPB
0

#5 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 27 mai 2018 - 09:55

Voir le message(gile), le 27 mai 2018 - 07:57 , dit :

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
0

#6 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 28 mai 2018 - 16:06

Voir le message(gile), le 27 mai 2018 - 07:57 , dit :

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 :)
0

#7 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11259
  • Inscrit(e) : 02-septembre 05

Posté 28 mai 2018 - 17:14

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
Image IPB
0

#8 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 28 mai 2018 - 19:46

Voir le message(gile), le 28 mai 2018 - 17:14 , dit :

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 :)
0

Partager ce sujet :


Page 1 sur 1


Réponse rapide

  

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)