Aller au contenu

monter des bloc point en Alti


Messages recommandés

Posté(e)

Bonjour les cadxpistes.

 

J'ai un fichier topo classique avec des blocs point de type point, alt et mat.

C'est à dire un bloc point avec des attribut de type altimétrie et matricule.

Le problème étant que ces points sont tous à Z=0.

 

Ce que j'aimerai c'est un moyen rapide de monter les points en Z à partir de l'attribut Z de chaque point. Ce que covadis fait tres bien mais que je n'ai actuellement pas en ma possession.

 

Je pense qu'un Lisp devrait faire l'affaire, mais voila, je suis une brèle en Lisp...

 

Donc si quelqu'un possède un lisp capable d'accéder a ma demande je suis preneur.

 

Ou une autre solution que le Lisp à laquelle je n'aurai pas pensée.

 

Merci pour vos future réponses...

 

Bon pour info j'ai posté aussi sur "forumsig" (c'est assez urgent) dés que j'ai une réponse je fais suivre.

Posté(e)

Salut

 

Un truc vite fait.

Il faut juste modifier le nom du bloc dans le lisp et éventuellement la position de l'attribut Z (j'ai pris la 3em position --> nth 2)

 

(defun c:altz(/ doc ent pts 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 "Le nom du bloc qui contient les attributs") (cons 66 1)))
   (progn
     (vlax-for ent (setq sel (vla-get-activeselectionset doc))
(setq pts (vlax-get ent 'insertionpoint))
(vlax-put ent 'insertionpoint (list (car pts) (cadr pts) (atof (vla-get-textstring (nth 2 (vlax-invoke ent 'getattributes))))))
     )
     (vla-delete sel)
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

je l'ai chargé mais a priori je n'arrive pas à le lancer, la commande pour le lancer c'est bien altz?

 

Sinon pour info:

 

J'ai trouvé une solution ici, Heureusement que j'avais map sous le coude.

Je reste persuadé qu'un Lisp peut faire l'affaire et de plus est beaucoup plus simple d'utilisation, je vais donc continuer à creuser ton lisp.

Posté(e)

Bonjour,

 

Après test, le lisp fonctionne parfaitement chez moi (bravo à Patrick_35 encore une fois B) )

As tu remplacé le nom de ton bloc dans les guillemets et indiqué la bonne position de l'attribut (1ère ligne -> 0 / 2ème ligne -> 1 ...)

 

A+

Posté(e)

ok j'avais pas bien saisi le coup du 1'ere ligne->0...

Par contre j'ai une erreur que je ne sais pas interpréter:

 

Commande: ALTZ

; erreur: type d'argument incorrect: VLA-OBJECT nil

Posté(e)

Bon, une autre version dans laquelle tu cliques sur l'attribut concerné et le lisp fait le reste.

 

(defun c:altz(/ att bas doc ent lsp pos pts sel nombl)

 (defun nombl(bl)
   (if (vlax-property-available-p bl 'effectivename)
     (vla-get-effectivename bl)
     (vla-get-name bl)
   )
 )

 (vl-load-com)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (and	(setq ent (nentsel))
(setq att (vlax-ename->vla-object (car ent)))
(eq (vla-get-objectname att) "AcDbAttribute")
(setq bas (vla-objectidtoobject (vla-get-database att) (vla-get-ownerid att))
      lst (vlax-invoke bas 'getattributes)
      pos (- (length lst) (length (member att lst)))
)
(ssget "x" (list (cons 0 "insert") (cons 2 (strcat "`**," (nombl bas))) (cons 66 1)))
   (progn
     (vlax-for ent (setq sel (vla-get-activeselectionset doc))
(and (eq (nombl bas) (nombl ent))
  (progn
    (setq pts (vlax-get ent 'insertionpoint))
    (vlax-put ent 'insertionpoint (list (car pts) (cadr pts) (atof (vla-get-textstring (nth pos (vlax-invoke ent 'getattributes))))))
  )
)
     )
     (vla-delete sel)
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

Reste à voir si cela pose problème avec ton bloc, et dans ce cas, donne nous un exemple pour comprendre

 

Désolé, mais ce coup ci il va falloir s'adresser à l'auteur, je suis pas au niveau.

Pas tant que ça ;)

D'après ce que tu as mis sur le forum, ça fonctionne bien et c'est le principal :D

 

Sinon Patrick ton site est tres bien, je me le suis mi en marque-pages^^

Merci, cela permet de rendre service, un juste retour de l'aide que l'on peut recevoir ;)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

 

Pas tant que ça

D'après ce que tu as mis sur le forum, ça fonctionne bien et c'est le principal

 

Pour le moment je ne me suis pas mis aux fonctions vlisp (vla vlax ...).J'utilise seulement les codes dxf et je comprends pas toutes les parties de ton programme. :D

Posté(e)

Bon j'arrive pas a joindre mon bloc au message, a parement j'ai utilisé mes 500Ko...

Bon donc mon bloc avec attribut est- composé de trois objets chacun dans 1 claques différents.

 

Un objet de type point dans le calque 0

Un objet de type Définition d'attribut dans le calque Topo_Mat (le matricule)

Un Objet de type Définition d'attribut dans le calque Topo_Alt (C'est ce qui m'intéresse)

 

Ces trois objets forment donc mon bloc.

Quand ce bloc est inséré dans mon dessin j'ai un un objet de type référence de bloc dans lequel est renseigné le matricule et l'altimétrie.

 

Ce sont les blocs basique que l'on reçoit des géomètres en faites.

Le bloc est enregistré sous le nom "TCPOINT"

 

Quand j'essaie ton lisp, je n'arrive même pas a sélectionner mon bloc.

 

Commande: ALTZ

 

Choix de l'objet:

Commande:

Commande: ALTZ

 

Choix de l'objet: TCPOINT

 

 

*Sélection non valable*

Attend un objet unique.

 

 

J'ai donc essayé de taper le nom du bloc mais ca ne fonctionne pas non plus.

 

En faite ne m'y connaissant pas du tout en Lisp je vais essayer d'expliquer avec mes mots de débutant.

 

Il faudrait donc que le lisp récupère l'attribut Z dans le bloc point et transfert cette donnée numérique dans la propriété "Z" du bloc.

 

 

Voila espérant avoir été clair... ce dont je doute grandement.

 

Bon je dois y aller j'essaierai de passer voir demain mais étant en formation c'est pas sure, sinon je passerai surement après demain.

 

Merci encore

Posté(e)

Alors une Traduction

(defun c:altz(/ att bas doc ent lst pos pts sel nombl)

; Ici, on a une une fonction qui donne le nom du bloc, même ceux qui sont dynamiques.
; car si on regarde juste le nom du bloc dynamique, on a quelque chose dans ce style "*U304"
; Donc, c'est la propriété effectivename qu'il faut regarder si elle existe.
 (defun nombl(bl)
   (if (vlax-property-available-p bl 'effectivename)
     (vla-get-effectivename bl)
     (vla-get-name bl)
   )
 )

; Activation des fonctions activex
 (vl-load-com)

; On définit que l'on travail sur le document actif (le dessin actuel)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))

; On définit le début du undo, même style que (command "_.undo" "_group")
 (vla-startundomark doc)

; on fait un test avec la fonction And.
; Un and à la particularité de tester le 1er argument, si c'est ok on passe au suivant, etc...
; jusqu'à la fonction (ici le progn)
; On sélectionne un sous-objet avec la fonction nentsel
 (and	(setq ent (nentsel))
; On transforme la sélection en objet vla
(setq att (vlax-ename->vla-object (car ent)))
; On regarde si c'est un attribut
(eq (vla-get-objectname att) "AcDbAttribute")
; On détermine le père de l'attribut, c'est à dire le bloc qui contient ledit attribut sélectionné
(setq bas (vla-objectidtoobject (vla-get-database att) (vla-get-ownerid att))
; On recherche les attributs du bloc déterminé avant que l'on ajoute dans une liste
      lst (vlax-invoke bas 'getattributes)
; On calcul la position de l'attribut dans la liste définit auparavant
      pos (- (length lst) (length (member att lst)))
)
; on fait une sélection dans tout le dessin avec comme arguments
; que ce sont des blocs (cons 0 "insert")
; que l'on recherche les blocs anonymes (cons 2 "`**")
; que l'on recherche un bloc spécifique selon son nom (cons 2 (nombl bas))
; et que pour que le filtre fonctionne, on regroupe les différents noms (cons 2 (strcat "`**," (nombl bas)))
; que l'on recherche des blocs avec attributs (cons 66 1)
(ssget "x" (list (cons 0 "insert") (cons 2 (strcat "`**," (nombl bas))) (cons 66 1)))
   (progn
; on fait une boucle de recherche (vlax-for = foreach mais pour du vla)
; et sur la sélection active, donc de ssget (vla-get-activeselectionset doc)
     (vlax-for ent (setq sel (vla-get-activeselectionset doc))
; Je vérifie que le bloc dans la boucle correspond bien au nom du bloc de base
(and (eq (nombl bas) (nombl ent))
  (progn
; Je récupère le point d'insertion
    (setq pts (vlax-get ent 'insertionpoint))
; il faut lire la ligne de code à l'envers, en fonction de ses imbrications
; je regarde les attributs du bloc de ma boucle (vlax-invoke ent 'getattributes)
; je prends l'attribut qui m'intéresse en fonction de sa position dans la liste
; (nth pos (vlax-invoke ent 'getattributes))
; je récupère la valeur de l'attribut que je transforme en réel
; (atof (vla-get-textstring (nth pos (vlax-invoke ent 'getattributes))))
; Je construis une liste de point
; (list (car pts) (cadr pts) (atof (vla-get-textstring (nth pos (vlax-invoke ent 'getattributes)))))
; que j'écris comme position du bloc dans la boucle de recherche
    (vlax-put ent 'insertionpoint (list (car pts) (cadr pts) (atof (vla-get-textstring (nth pos (vlax-invoke ent 'getattributes))))))
  )
)
     )
     (vla-delete sel)
; J'efface le jeu de sélection. A faire systématiquement car sinon, a un moment donné, le lisp plantera à cause de lui
; Pourquoi ? c'est la question à qui veux gagner des millions.
   )
 )
; On définit la fin du undo, même style que (command "_.undo" "_end")
 (vla-endundomark doc)
; Silence
 (princ)
)

 

Maintenant, il n'y a plus qu'à ;)

 

Bon j'arrive pas a joindre mon bloc au message, a parement j'ai utilisé mes 500Ko...

Avec un site comme dl.free.fr par exemple

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Hello

Merci Patrick pour ton message que, j'avoue, je vais devoir prendre une semaine de repos pour arriver a déchiffrer :mellow:

Mais promis je vais me pencher sur le sujet, pour le moment je suis un peu over booker mais dés que ça se calme je me met dessus.

 

Encore merci

Posté(e)

Hello

 

Je viens de re-tester les 2 routines sur AutoCAD 2012, elle fonctionnent parfaitement !

 

Donc Merci a Gilles + P35 !!

 

Qu'on se le dise ...

 

lecrabe

Autodesk Expert Elite Team

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité