banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Fri 21 October 2016 11:40

Dylan
Participant occasionnel
Date d'inscription: 14 Jan 2013
Messages: 19

[ACAD] Raccorder plusieurs blocs ensemble

Bonjour à tous,

j'ai un plan avec une multitude de poteaux que je dois relier alors je voudrais savoir s'il y a un moyen de raccorder plusieurs blocs les uns aux autres avec une polyligne ... histoire de ne pas avoir à y passer la journée !

Merci d'avance

Hors ligne

 

#2 Fri 21 October 2016 12:07

Patrice
JeSuisCharlie
Date d'inscription: 16 Sep 2005
Messages: 4794

Re: [ACAD] Raccorder plusieurs blocs ensemble

Hello

SVP par quel "MIRACLE" le programme doit savoir qu'il faut relier le poteau X au poteau Y et non pas au poteau Z !?

GeoBye, Pat


(Autodesk Expert Elite Team)

Hors ligne

 

#3 Fri 21 October 2016 13:34

Dylan
Participant occasionnel
Date d'inscription: 14 Jan 2013
Messages: 19

Re: [ACAD] Raccorder plusieurs blocs ensemble

je ne sais pas trop, on peut peut-être faire en sorte qu'il prenne le poteau le plus proche a chaque fois ou lui dire le poteau x est le premier et le z le denier pour qu'il raccorde tous les poteaux intermédiaire  ? même s'il y a de la vérification a faire ensuite. je ne suis pas suffisamment calé en programmation pour savoir si c'est réalisable ou pas

Hors ligne

 

#4 Tue 25 October 2016 16:09

bruno v.
Participant actif
Date d'inscription: 22 Mar 2010
Messages: 89

Re: [ACAD] Raccorder plusieurs blocs ensemble

Bonjour,

On peut essayer quelque chose, cela fonctionnera relativement bien si les blocs sont disposés de façon linaire (selon un cheminement), par contre si l'implantation est de style quadrillage, le résultat sera plutôt aléatoire.
Le programme demandera la distance maxi entre blocs (poteaux) à respecter...

Enfin je te laisse essayer, cela te conviendra peut être...

NB: Veiller à ce que tous les blocs à traiter soient visibles à l'écran, le code reste succinct


Code:

(defun c:join_blok ( / js_mdbl js_wsel ename dxf_cod pt_ins lst_pt_ins d_max corner_dl corner_ul js_bl lremov n e_remov lst_pt ent_sel lst_d index)
  (princ "\nSélectionnez le modèle de bloc qui sera le départ de la polyligne")
  (while
    (null
      (setq js_mdbl
        (ssget "_+.:E:S"
          (list
            '(0 . "INSERT")
            (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
            (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
          )
        )
      )
    )
  )
  (setq
    js_wsel (ssadd)
    ename (ssname js_mdbl 0)
    dxf_cod (entget ename)
    pt_ins (cdr (assoc 10 dxf_cod))
    lst_pt_ins (list pt_ins)
  )
  (ssadd ename js_wsel)
  (initget 1)
  (setq d_max (getdist pt_ins "\nDistance maxi de recherche: "))
  (while pt_ins
    (setq
      corner_dl (mapcar '(lambda (x) (- x d_max)) pt_ins)
      corner_ur (mapcar '(lambda (x) (+ x d_max)) pt_ins)
      corner_dl (list (car corner_dl) (cadr corner_dl))
      corner_ur (list (car corner_ur) (cadr corner_ur))
      js_bl
      (ssget "_C"
        corner_dl
        corner_ur
        (foreach m
          (foreach n dxf_cod
            (if (not (member (car n) '(0 67 410 8 6 62 2 41 42 43 70 71 44 45 210)))
              (setq lremov (cons (car n) lremov))
            )
          )
          (setq dxf_cod (vl-remove (assoc m dxf_cod) dxf_cod))
        )
      )
    )
    (repeat (setq n (sslength js_wsel))
      (if (setq e_remov (ssmemb (ssname js_wsel (setq n (1- n))) js_bl))
        (ssdel e_remov js_bl)
      )
    )
    (cond
      ((not (zerop (sslength js_bl)))
        (setq lst_pt nil)
        (repeat (setq n (sslength js_bl))
          (setq ent_sel (ssname js_bl (setq n (1- n))))
          (setq lst_pt (cons (cdr (assoc 10 (entget ent_sel))) lst_pt))
        )
        (setq lst_d (mapcar '(lambda (x) (distance x (list (car pt_ins) (cadr pt_ins)))) lst_pt))
        (setq index (- (length lst_d) (length (member (apply 'min (mapcar '(lambda (x) (min x d_max)) lst_d)) lst_d))))
        (setq pt_ins (nth index lst_pt))
        (if pt_ins (progn (setq lst_pt_ins (cons pt_ins lst_pt_ins)) (ssadd (ssname js_bl index) js_wsel)))
      )
      (T (setq pt_ins nil))
    )
  )
  (cond
    (lst_pt_ins
      (entmakex
        (vl-list*
          (cons 0 "LWPOLYLINE")
          (cons 100 "AcDbEntity")
          (cons 100 "AcDbPolyline")
          (cons 90 (length lst_pt_ins))
          (mapcar '(lambda (p) (cons 10 p)) lst_pt_ins)
        )
      )
    )
  )
  (prin1)
)

Dernière modification par bruno v. (Tue 25 October 2016 16:12)

Hors ligne

 

#5 Wed 26 October 2016 16:39

Patrice
JeSuisCharlie
Date d'inscription: 16 Sep 2005
Messages: 4794

Re: [ACAD] Raccorder plusieurs blocs ensemble

Hello Bruno

SVP serait il possible d'avoir une version qui utilise la selection AutoCAD CLASSIQUE
et donc qui pourrait aussi recuperer une Selection Precedente !?

Merci d'avance, GeoBye, Pat


(Autodesk Expert Elite Team)

Hors ligne

 

#6 Thu 27 October 2016 10:00

bruno v.
Participant actif
Date d'inscription: 22 Mar 2010
Messages: 89

Re: [ACAD] Raccorder plusieurs blocs ensemble

Salut Patrice,

Ouille! Je redoute toujours tes demandes de micro-améliorations wink

Bon j'ai tenté quelque chose, mais jongler avec les jeux de sélections... pas évident, il y a parfois des réactions étranges; J'ai du trouver une autre voie que l'utilisation de (ssget "_+.:E:S")  comme au premier post.

Quitte à faire j'ai étendu aux entités "POINT" (ça mangeait pas de pain, le codage reste le même)

Code:

(defun c:join_block ( / lst_flt js e_sel js_wsel ename dxf_cod pt_ins lst_pt_ins d_max corner_dl corner_ul js_bl lremov n e_remov lst_pt ent_sel lst_d index)
  (setq lst_flt
    (list
      '(0 . "INSERT,POINT")
      (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
      (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
    )
  )
  (or
    (setq js (ssget "_I" lst_flt))
    (setq js (ssget "_P" lst_flt))
  )
  (cond
    (js
      (sssetfirst nil js)
      (initget "Existant Nouveau _Current New")
      (if (eq (getkword "\nTraiter jeu de sélection [Existant/Nouveau] <Existant>: ") "New")
        (progn
          (sssetfirst nil nil)
          (setq
            js (ssadd)
            js (ssget lst_flt)
          )
          (sssetfirst nil js)
        )
      )
    )
    (T (setq js (ssget lst_flt)) (sssetfirst nil js))
  )
  (while
    (or
      (null (setq e_sel (entsel "\nSélectionnez le modèle de bloc ou le point qui sera le départ de la polyligne")))
      (not (member (cdr (assoc 0 (entget (car e_sel)))) '("INSERT" "POINT")))
    )
  ) 
  (setq
    js_wsel (ssadd)
    ename (car e_sel)
    dxf_cod (entget ename)
    pt_ins (cdr (assoc 10 dxf_cod))
    lst_pt_ins (list pt_ins)
  )
  (ssadd ename js_wsel)
  (initget 1)
  (setq d_max (getdist pt_ins "\nDistance maxi de recherche: "))
  (sssetfirst nil nil)
  (while pt_ins
    (setq
      corner_dl (mapcar '(lambda (x) (- x d_max)) pt_ins)
      corner_ur (mapcar '(lambda (x) (+ x d_max)) pt_ins)
      corner_dl (list (car corner_dl) (cadr corner_dl))
      corner_ur (list (car corner_ur) (cadr corner_ur))
      js_bl
      (ssget "_C"
        corner_dl
        corner_ur
        (foreach m
          (foreach n dxf_cod
            (if (not (member (car n) '(0 67 410 8 6 62 2 41 42 43 70 71 44 45 210)))
              (setq lremov (cons (car n) lremov))
            )
          )
          (setq dxf_cod (vl-remove (assoc m dxf_cod) dxf_cod))
        )
      )
    )
    (repeat (setq n (sslength js_wsel))
      (if (setq e_remov (ssmemb (ssname js_wsel (setq n (1- n))) js_bl))
        (ssdel e_remov js_bl)
      )
    )
    (repeat (setq n (sslength js_bl))
      (if (not (ssmemb (setq e_remov (ssname js_bl (setq n (1- n)))) js))
        (ssdel e_remov js_bl)
      )
    )
    (cond
      ((not (zerop (sslength js_bl)))
        (setq lst_pt nil)
        (repeat (setq n (sslength js_bl))
          (setq
            ent_sel (ssname js_bl (setq n (1- n)))
            lst_pt (cons (cdr (assoc 10 (entget ent_sel))) lst_pt)
          )
        )
        (setq
          lst_d (mapcar '(lambda (x) (distance x (list (car pt_ins) (cadr pt_ins)))) lst_pt)
          index (- (length lst_d) (length (member (apply 'min (mapcar '(lambda (x) (min x d_max)) lst_d)) lst_d)))
          pt_ins (nth index lst_pt)
        )
        (if pt_ins (progn (setq lst_pt_ins (cons pt_ins lst_pt_ins)) (ssadd (ssname js_bl index) js_wsel)))
      )
      (T (setq pt_ins nil))
    )
  )
  (cond
    (lst_pt_ins
      (entmakex
        (vl-list*
          (cons 0 "LWPOLYLINE")
          (cons 100 "AcDbEntity")
          (cons 100 "AcDbPolyline")
          (cons 90 (length lst_pt_ins))
          (mapcar '(lambda (p) (cons 10 p)) lst_pt_ins)
        )
      )
    )
  )
  (prin1)
)

Hors ligne

 

#7 Fri 28 October 2016 10:05

Dylan
Participant occasionnel
Date d'inscription: 14 Jan 2013
Messages: 19

Re: [ACAD] Raccorder plusieurs blocs ensemble

Merci bruno c'est exactement ce que je cherchais, ça va me changer la vie

Hors ligne

 

Pied de page des forums

Powered by FluxBB