Communauté
AutoCAD – tous produits - Français
Bienvenue sur les forums AutoCAD d’Autodesk. Partagez vos connaissances, posez des questions, et explorez les sujets AutoCAD populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

Concaténation de bloc

18 RÉPONSES 18
RÉSOLU
Répondre
Message 1 sur 19
jamesemouche
683 Visites, 18 Réponses

Concaténation de bloc

Bonjour,

 

Sur autocad 2012, j'ai un plan avec 2000 blocs (1400 blocs A et 600 blocs B).

Les 600 blocs B sont positionnés respectivement à 600 blocs A par le point d'insertion.

par ex: X bloc A-1 = X bloc B-1, Y bloc A-1 = Y bloc B-1, X bloc A-2 = X bloc B-2, Y bloc A-2 = Y bloc B-2, etc..

J'essaye de trouver un moyen de copier la coordonnée en Z du bloc B-x dans le Z du bloc A-x. (sauf pour le cas où le bloc A n'a pas de bloc B correspondant.)

J'imagine qu'il faut passer par du lisp, mais je sais pas du tout par quel bout attaquer, sachant que je ne sais pas programmer.. Smiley indifférent

si qqun peut m'aider Smiley heureux

 

merci!

 

exemple en fichier joint.

18 RÉPONSES 18
Message 2 sur 19
patrick_35
en réponse à: jamesemouche

Salut

Un truc vite fait, mais sans tri, car non demandé, ni comment

 

(defun c:cor( / doc ent lst1 lst2 sel)
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark doc)
  (and (ssget "x" (list (cons 0 "insert") (cons 2 "PTC,PIEZO")))
    (progn
      (vlax-for ent (setq sel (vla-get-activeselectionset doc))
	(if (eq (vla-get-name ent) "PTC")
	  (setq lst1 (cons ent lst1))
	  (setq lst2 (cons ent lst2))
	)
      )
      (vla-delete sel)
      (mapcar '(lambda(a b)(vlax-put a 'insertionpoint (vlax-get b 'insertionpoint))) (reverse lst1) (reverse lst2))
    )
  )
  (vla-endundomark doc)
  (princ)
)

 @+

Message 3 sur 19
Olivier.R
en réponse à: jamesemouche

Bonjour,

 

 Patrick_35,

 

Il doit manquer une ligne (vl-load-com) au cas où jamesemouche n'a pas d'autres lisp chargés.

 

Jamesemouche

Ajoute la ligne (vl-load-com) en début ou fin du lisp.

 

Olivier

Message 4 sur 19
jamesemouche
en réponse à: jamesemouche

Patrick, est-ce qu'il y a ne serai-ce qu'une chose que tu ne connais pas sur autocrad..? ^^

Merci très beaucoup!

Olivier, merci aussi pour cette précision 🙂 

 

bonne soirée !!

Message 5 sur 19
jamesemouche
en réponse à: jamesemouche

mmh, je dois pas faire ce qu'il faut, car en enregistrant le lisp, avec ou sans correction (vl-load-com) je n'arrive pas à le lancer. (je tape "COR" après le chargement du lisp, mais ce n'est peut être pas ce qu'il faut faire)

Message 6 sur 19
jamesemouche
en réponse à: jamesemouche

Rectification, mea culpa le lisp marche, mais pas dans le bon sens.

La coordonnée en Z du bloc Piezo se copie effectivement dans le Z du bloc PTC.

En fait c'est l'inverse que je cherche à faire, et voir mieux (si possible) c'est à dire récupérer la valeur de l'attribut Z du bloc PTC pour la copier dans le Z du bloc Piezo.

Je préfere prendre la valeur de l'attribut car le Z du bloc PTC est parfois égale à 0. Ou alors récupérer dans un premier temps les valeurs de l'attribut "Z" pour les copier dans le Z du PTC, pour ensuite basculer le Z PTC à la place du Z PIEZO.

Dsl si je me suis mal expliqué ^^ ..

Message 7 sur 19
jamesemouche
en réponse à: jamesemouche

en modifiant PTC par PIEZO ça fait l'opération inverse (oui bon c'est tout simple pour vous mais pour moi c'est un exploit ^^)

 

(defun c:cor(/ doc ent lst1 lst2 sel)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark doc)
(and (ssget "x" (list (cons 0 "insert") (cons 2 "PTC,PIEZO")))
(progn
(vlax-for ent (setq sel (vla-get-activeselectionset doc))
(if (eq (vla-get-name ent) "PIEZO")
(setq lst1 (cons ent lst1))
(setq lst2 (cons ent lst2))
)
)
(vla-delete sel)
(mapcar '(lambda(a b)(vlax-put a 'insertionpoint (vlax-get b 'insertionpoint))) (reverse lst1) (reverse lst2))
)
)
(vla-endundomark doc)
(princ)
)

 

mais pour prendre la valeur de l'attribut je ne m'en sors pas, le lisp plante car je ne dois pas avoir la bonne syntaxe.

Message 8 sur 19
patrick_35
en réponse à: jamesemouche

Salut

 

> Il doit manquer une ligne (vl-load-com) au cas où jamesemouche n'a pas d'autres lisp chargés.

 Merci de me corriger.

 

> Patrick, est-ce qu'il y a ne serai-ce qu'une chose que tu ne connais pas sur autocrad..? ^^

Ben, toute la 3D par exemple.

 

> mais pour prendre la valeur de l'attribut je ne m'en sors pas, le lisp plante car je ne dois pas avoir la bonne syntaxe

Regarde si le lisp te convient

(defun c:cor( / doc ent lst1 lst2 sel)
  (vl-load-com)
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (vla-startundomark doc)
  (and (ssget "x" (list (cons 0 "insert") (cons 2 "PTC,PIEZO")))
    (progn
      (vlax-for ent (setq sel (vla-get-activeselectionset doc))
	(if (eq (vla-get-name ent) "PIEZO")
	  (setq lst1 (cons ent lst1))
	  (setq lst2 (cons ent lst2))
	)
      )
      (vla-delete sel)
      (mapcar '(lambda(a b / c)
		(setq c (vlax-get b 'insertionpoint))
		(vlax-put a 'insertionpoint
			    (list (car  c)
				  (cadr c)
				  (atof (vla-get-textstring (car (vlax-invoke b 'getattributes))))
			    )
		)
	      )
	      (reverse lst1)
	      (reverse lst2)
      )
    )
  )
  (vla-endundomark doc)
  (princ)
)

 @+

 

 

Message 9 sur 19
jamesemouche
en réponse à: patrick_35

Oui enfin déjà connaitre toute la 2D.. c'est pas mal! Smiley MDR

Je viens de tester le lisp, j'ai des résultats bizarres.. il m'envoi à perpette différents blocs, je pense qu'il vaudrait mieux dans un premier temps copier les attributs Z des PTC dans la valeur Z (position), puis dans un 2eme temps, copier la valeurs Z (position) des PTC dans les blocs PIEZO aux X et Y correspondant (comme le faisait correctement le lisp précédent)

Ensuite, comme j'ai des blocs PIEZO et SONDAGE, je remplace dans le lisp le nom du bloc. Ce serait un luxe, mais il est possible de traiter les 2 en même temps?

 

Merci beaucoup en tout cas ! Même si le dernier lisp ne fonctionne pas correctement ça m'a déjà bien aidé 🙂

Message 10 sur 19
patrick_35
en réponse à: jamesemouche

Tu me surprends pour que le lisp ne répond pas à tes besoins.
J'ai juste changé la valeur du Z par celle écrite dans l'attibut du bloc PTC
Sinon, pour répondre à ta question.
Pour ajouter SONDAGE, Tu remplaces
(cons 2 "PTC,PIEZO") par (cons 2 "PTC,PIEZO,SONDAGE")
Et pour gérer la liste, tu remplaces
(eq (vla-get-name ent) "PIEZO") par (member (vla-get-name ent) '("PIEZO" "SONDAGE"))

@+

Message 11 sur 19
jamesemouche
en réponse à: jamesemouche

Je t'envoie un nouveau fichier exemple, quand je lance le lisp j'ai plusieurs blocs qui sont déplacés en X,Y (le F226 par exemple).

J'ai remplacé dans le lisp ce que tu m'as indiqué, je pige le fonctionnement, merci 🙂

 

Message 12 sur 19
jamesemouche
en réponse à: jamesemouche

J'ai essayé de modifier, en vain.. 

les blocs partent à perpette, comme si le lisp arrondissait les coordonnées en X et Y pour finalement confondre des Piezo entre eux. je sais pas si c'est très clair..?

Message 13 sur 19
patrick_35
en réponse à: jamesemouche

Salut

Je ne comprends pas. J'ai testé avec ton exemple et cela me semble bon, mais comme ce n'est pas mon dessin, mon métier, ni même ma conception, je peux me tromper.
Le lisp récupere les coordonnées d'un bloc pour les injecter dans un autre, sans transformation aucune.
Les accrochobj qui posent problème ?
Les unités qui ne sont pas assez précises ?
On ne se trouve pas sur le bon SCU ?
etc...

@+

Message 14 sur 19
jamesemouche
en réponse à: patrick_35

voici le avant/apres en utilisant le lisp, j'ai essayé d'activer, désactiver l'accroche objet, modifier les unités, changer le SCU.. rien ne change

Message 15 sur 19
patrick_35
en réponse à: jamesemouche

Une chose m'échappe.
D'après les images, le lisp a bien mis aux mêmes coordonnées le bloc PIEZO aux coordonnées du bloc PTC.
J'avais précisé qu'il n'y avait pas de tri, car impossible dans une sélection total de dire qui appartient à qui.
Le seul moyen est de faire une sélection par binôme.

@+

Message 16 sur 19
jamesemouche
en réponse à: patrick_35

Mais normalement on ne devrait pas voir de différence avant/après puisque c'est uniquement les coordonnées en Z qui doivent être modifiées. Sachant qu'on est en vue de dessus.

 

Message 17 sur 19
patrick_35
en réponse à: jamesemouche

Alors, si ce n'est que le Z qui doit être changé, remplace

(setq c (vlax-get b 'insertionpoint))

 par

(setq c (vlax-get a 'insertionpoint))

 @+

Message 18 sur 19
jamesemouche
en réponse à: patrick_35

ok là j'ai plus le problème des blocs qui partent n'importe où !

Par contre les Z remplacés dans les PIEZO et SONDAGE ne correspondent pas aux bons PTC, sûrement à cause du fameux tri.

Je vais essayer de m'en sortir autrement, merci beaucoup en tout cas d'avoir pris du temps pour ça Smiley clignant de l'œil

Message 19 sur 19
jamesemouche
en réponse à: jamesemouche

problème résolu, voici le lisp magic (encore fait par un Patrick, mais pas le même cette fois Smiley MDR )

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report