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..
si qqun peut m'aider
merci!
exemple en fichier joint.
Résolu ! Accéder à la solution.
Résolu par jamesemouche. Accéder à la solution.
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) )
@+
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
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 !!
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)
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é ^^ ..
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.
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) )
@+
Oui enfin déjà connaitre toute la 2D.. c'est pas mal!
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é 🙂
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"))
@+
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 🙂
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..?
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...
@+
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
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.
@+
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.
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))
@+
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
problème résolu, voici le lisp magic (encore fait par un Patrick, mais pas le même cette fois )
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.