Concaténation de bloc

Concaténation de bloc

Anonymous
Non applicable
2 054 Visites
18 Réponses
Message 1 sur 19

Concaténation de bloc

Anonymous
Non applicable

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.

0 J'aime
Solutions acceptées (1)
2 055 Visites
18 Réponses
Replies (18)
Message 2 sur 19

patrick_35
Collaborator
Collaborator

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

Anonymous
Non applicable

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

Anonymous
Non applicable

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

0 J'aime
Message 5 sur 19

Anonymous
Non applicable

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)

0 J'aime
Message 6 sur 19

Anonymous
Non applicable

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

0 J'aime
Message 7 sur 19

Anonymous
Non applicable

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.

0 J'aime
Message 8 sur 19

patrick_35
Collaborator
Collaborator

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

Anonymous
Non applicable

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é 🙂

0 J'aime
Message 10 sur 19

patrick_35
Collaborator
Collaborator

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"))

@+

0 J'aime
Message 11 sur 19

Anonymous
Non applicable

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 🙂

 

0 J'aime
Message 12 sur 19

Anonymous
Non applicable

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

0 J'aime
Message 13 sur 19

patrick_35
Collaborator
Collaborator

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

@+

0 J'aime
Message 14 sur 19

Anonymous
Non applicable

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

0 J'aime
Message 15 sur 19

patrick_35
Collaborator
Collaborator

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.

@+

0 J'aime
Message 16 sur 19

Anonymous
Non applicable

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.

 

0 J'aime
Message 17 sur 19

patrick_35
Collaborator
Collaborator

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

 @+

0 J'aime
Message 18 sur 19

Anonymous
Non applicable

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

0 J'aime
Message 19 sur 19

Anonymous
Non applicable
Solution acceptée

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

0 J'aime