Aller au contenu

cherche lisp pour z auto poly 3d


G2.toff

Messages recommandés

je recherche un lisp qui permettrait lorsque l'on crée un polyligne 3d de choisir a chaque création d'un nouveau sommet de la poly3d de rentrer son Z ou de designer un attribut ou un texte qui correspond a son Z.

 

Par exemple on clic pour créer un premier sommet de poly3d le lisp nous demande d'entrer le Z du sommet créé ou de slectionner un attribut ou un texte (par exemple le texte alti d'un bloc point topo) et le sommet créé s'élève en Z selon ce texte. le texte ou attribut ne se trouvant pas forcement avec son point d'insertion au niveau du sommet.

Lien vers le commentaire
Partager sur d’autres sites

coucou

 

il te suffit de taper les filtres de coordonnées, par exemple du point .xy et tu t'accroches là où tu veux et il te sera demandé l'alti

attention à bien taper le point devant les lettre xy

ces filtres te permettent toutes les possibilités par exemple .yz et tu t'accroches et il te sera demandé la valeur de x (accrochage possible)

amicalement

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ta reponse !

 

je vais fouilller par là.

 

pour ce qui est de selectionner un texte ou un attribut qui definirait le Z tu pense que c est realisable?

 

Vers quoi je dois chercher?

 

j ai vu qu avec un lisp on peut extraire un texte d un bloc, le copier et le coller ce doit etre possible ailleurs donc pourquoi pas dans ma case Znon?

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Pourquoi toujours un LISP ?!

 

didier t'a donné une réponse avec les modificateurs de commandes fournis nativement par AutoCAD qui répond exactement à ta demande : les filtres de coordonnées.

 

Commande: POLY3D

Spécifiez le point de départ de la polyligne: .xy

de

(Z nécessaire):

Spécifiez l'extrémité de la ligne ou [annUler]: .xy

de

(Z nécessaire):

etc.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Pourquoi toujours un LISP ?!

 

didier t'a donné une réponse avec les modificateurs de commandes fournis nativement par AutoCAD qui répond exactement à ta demande : les filtres de coordonnées.

 

Commande: POLY3D

Spécifiez le point de départ de la polyligne: .xy

de <cliquer un point XY pour le premier sommet>

(Z nécessaire): <cliquer sur un point pour en récupérer le Z ou entrer la valeur Z>

Spécifiez l'extrémité de la ligne ou [annUler]: .xy

de <cliquer un point XY pour le second sommet>

(Z nécessaire): <cliquer sur un point pour en récupérer le Z ou entrer la valeur Z>

etc.

 

En fait j'ai bien compris, sauf que lorsque tu dois créer une multitudes de poly3d je pense que ce serais plus simple d'avoir la fonction de base pour certains cas (1 ou 2 poly3d avec peu de sommets)et une fonction plus avancée (20 30 sommets) qui prévois le '.xy' à chaque fois sans le retaper, surtout que par la suite si j'arrive à intégrer le fait de remplir le champ Z en cliquant sur un texte égal au Z, cela simplifierait les choses. Maintenant, je me trompe peut être, mais merci de donner ton avis, je changerais peut être ma vision de la solution que je recherche grace à vos retours.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

De retour après une longue absence (je m'étais pété la guibole...) :(

 

Pour G2.toff, pense à faire des recherches sur le forum, je sais ce n'est pas facile, mais beaucoup de sujet ont été traité dans le passé.

 

Si tu regarde celui-ci, je pense qu'il correspond à ton souhait, ou en tout cas tu peux toujours l’améliorer...

  • Upvote 1

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Excellent, merci bien.

 

Je vais essayer de capter le principe de ce lisp car lorsque je clique sur un texte ça marche bien, par contre si je clic sur un texte (attribut) inclus dans un bloc il me prend le premier puis après il veut plus me prendre autre chose que du texte.

 

En plus j'aimerais arriver à faire en sorte que lorsque j'ai plusieurs points consécutifs au même Z je sélectionne ou je rentre le Z du premier point de la série et que si après je ne rentre plus de Z il garde la dernier Z entré.

 

Encore merci...

Lien vers le commentaire
Partager sur d’autres sites

je rebondis sur le sujet...

 

j'aurai souhaiter modifier ppol pour qu'il prenne en compte des textes et pas des attributs...

 

(defun c:ppol ()
 (princ "\nd'abord la sélection des textes : ")
 (setq listpts nil ent T)
 (while ent
   (while(/=(progn(setq ent (nentsel))(if ent(cdr(assoc 0(entget (car ent))))"TEXT"))"TEXT")(setq ent (nentsel)))
   (if ent(progn(setq listpts(append listpts(list(atof(cdr(assoc 1(entget (car ent))))))))(princ listpts)))
   )
 (princ "\nselection d'une poly qui a le même nombre de points que d'attribs selectionnés : ")
 (while(/=(progn(setq ent (nentsel))(if ent(cdr(assoc 0(entget (car ent))))"LWPOLYLINE"))"LWPOLYLINE")(setq ent (nentsel)))
 (if ent
   (progn
     (setq li2(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car ent)))))
     (setq n -1)
     (setq li2(mapcar '(lambda(x)(progn(setq n(1+ n))(append x (list(nth n listpts))))) li2))
     (command "_3dpoly" (foreach p li2 (command p)) (command) )
     )
   )
)

 

je me doute que le pb vient de cette ligne car ma polyligne ne se génère pas.

(setq li2(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car ent)))))

 

mais comment la modifier...

et que signifie ce "(command p)" de la fin?

 

oui je sais, depuis le temps que je traine ici j'aurai gagner à écrire entièrement un lisp plutôt que de modifier des petits bout par ci par la.. mais les journées ne font que 24h...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

De retour après une longue absence (je m'étais pété la guibole...) :(

 

Pour G2.toff, pense à faire des recherches sur le forum, je sais ce n'est pas facile, mais beaucoup de sujet ont été traité dans le passé.

 

Si tu regarde celui-ci, je pense qu'il correspond à ton souhait, ou en tout cas tu peux toujours l’améliorer...

 

Bonjour,

 

En fait j'ai trouvé le problème, ou plutôt ce qui ressembla à mon problème !

 

En fait c'est un soucis de style de texte, ce lisp dans mon dessin ne me prend pas tout les styles de texte, lors du premier point il me prend n'importe quel style puis après il ne veut plus que du helvetica ???? Par contre je disais qu'il ne me prenait pas les attributs dans les blocs, mais cela venait du style aussi.

 

De plus , je réédite ma remarque précédente, ce serait bien de pouvoir soit entrer manuellement un Z (ex: 101.25), soit entrer conserver le dernier Z entré (en tapant la lettre z' par exemple au lieu d'un nombre et le point prendrait le Z de la dernière valeur entrée manuellement ou du dernier texte sélectionné).

 

Sinon, j'ai tout de même utilisé ce lisp en transformant tous mes textes et attribut avec le style qu'il reconnaissait sans problème, et j'ai réalisé une manipulation qui me prenait 1 heure en même pas 30 minutes et sans les modifis ci-dessus, mortel !

 

C'est génial, surtout quand tu sais que certaines manipulations me prennent la journée voir plus parfois !!!!

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Fais quelque modifs rapides pour répondre à ton désir, il suffit cliquer à vide ou de valider à blanc pour pouvoir rentrer une valeur Z.

Pas trop testé...

 

(defun ajouz ( / ent dxf_ent typ_ent z)
 (setq ent (nentsel "\nChoisir le Texte/Texte Multiligne/Attribut pour obtenir le Z: "))
 (cond
   ((not (null ent))
     (setq typ_ent (cdr (assoc 0 (setq dxf_ent (entget (car ent))))))
     (cond
       ((member typ_ent '("TEXT" "MTEXT" "ATTRIB"))
         (setq z (read (cdr (assoc 1 dxf_ent))))
         (if (and (/= (type z) 'REAL) (/= (type z) 'INT))
           (progn
             (princ "\nLa valeur du texte ne convient pas!")
             (initget 1 "Réessayer _Retry")
             (setq z (getreal "\n[Réessayer]/Entrez une valeur numérique: "))
             (if (eq z "Retry") (setq ent nil))
           )
         )
       )
       (T
         (setq ent nil)
         (princ "\nN'est pas un Texte MTexte ou Attribut!")
       )
     )
   )
   (T
     (setq z (getreal (strcat "\nEntrez une valeur numérique <" (rtos (caddr (getvar "LASTPOINT")) 2 2) ">: ")))
     (if (not z) (setq Z (caddr (getvar "LASTPOINT"))))
   )
 )
 (princ (strcat "\nZ = " (rtos z 2 2)))
 z
)
(defun err_plxy (ch)
 (cond
   ((eq ch "Function cancelled") nil)
   ((eq ch "quit / exit abort") nil)
   ((eq ch "console break") nil)
   (T (princ ch))
 )
 (if pt_b (command ""))
 (setq *error* olderr)
 (setvar "cmdecho" 1)
 (princ)
)
(defun c:3dpoly_xy ( / odlerr msg_f msg_n n pt_f pt_n val_z)
 (setvar "cmdecho" 0)
 (setq olderr *error* *error* err_plxy)
 (setq msg_f "\nSpécifiez l'extrémité de la ligne .XY de, ou [annUler]: "
       msg_n "\nSpécifiez l'extrémité de la ligne .XY de, ou [Clore/annUler]: "
       n 0
 )
 (while (null (setq pt_f (getpoint "\nSpécifiez le point de départ de la polyligne: .XY de ")))
   (princ "\nPoint incorrect.")
 )
 (setq val_z (ajouz))
 (command "_.3dpoly" ".xy" pt_f val_z)
 (initget "U ANNUler _Undo UNDO")
 (while (and (setq pt_n (getpoint pt_f (if (< n 2) msg_f msg_n))) (/= pt_n "Close"))
   (if (listp pt_n)
     (progn
       (setq val_z (ajouz))
       (command ".xy" pt_n val_z)
       (setq n (1+ n) pt_f pt_n)
     )
     (if (zerop n)
       (princ "\nTous les segments sont déjà annulés.")
       (progn
         (command "_undo")
         (setq n (1- n) pt_f (getvar "lastpoint"))
       )
     )
   )
   (if (< n 1)
     (initget "U ANNUler _Undo UNDO")
     (initget "U ANNUler Clore _Undo UNDO Close")
   )
 )
 (if (eq pt_n "Close")
   (command "_close")
   (command "")
 )
 (setq *error* olderr)
 (setvar "cmdecho" 1)
 (princ)
)

 

PS: Tu utilise des polices forcées dans tes Textes multiligne pour avoir des soucis avec les styles?

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Heuuuuu....je te joins juste si tu as le temps un bloc de ma bibliothèque, lorsque tu utilise ton lisp si pour ton premier point tu cliques sur un des attributs ça marche, après non !!! Je ne sais pas te répondre concernant le texte forcé ou nom !

 

Pour ce qui est de ta modif, c'est nickel, faut prendre le coup, mais après 2 ou 3 poly3d je maitrisais !

Un grand merci à toi !

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

Heuuuuu....je te joins juste si tu as le temps un bloc de ma bibliothèque, lorsque tu utilise ton lisp si pour ton premier point tu cliques sur un des attributs ça marche, après non !!! Je ne sais pas te répondre concernant le texte forcé ou nom !

 

Avec l'option attribut, il ne reconnait pas l'attribut sélectionné la seconde fois (réagit comme une entrée à vide et laisse la main à l'utilisateur pour renseigner l'altitude,...)

 

Testé sur des blocs points topo de Covadis,

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Bonjour,

 

En fait, j'ai regardé l'histoire du texte (ou de l'attribut) j'ai pas mal cherché de possibilités et je ne trouve pas la solution à mon problème. Ca marche parfaitement si je décompose tout mes attributs et que je modifie le style de texte, mais c'est pas une solution très pratique, ça fait un peu bricolage.

 

Comment puis-je éviter ce problème vu que j'ai beaucoup de bloc avec attribut qui contiennent des textes pouvant être identifiées comme valeur de Z ?

 

J'ai joint un bloc avec attribut qui existe dans ma société, qui me pose ce problème ! (sauf au premier choix...

 

Merci...

2COTV.zip

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Rassure toi ce n'est pas ton bloc qui pose problème, mais bien le code.

J'ai du mal à identifier le problème, car sur la version ou j'avais écrit l'original (voir lien en post #6), je n'avais pas ce problème (ça devait être une version 2002)

 

Sur des versions plus récente, j'ai l'impression que c'est l'affectation de (nentsel) à une variable (ici ent) qui pose problème dans une boucle invoquant un (command).

 

Dans l'immédiat je sèche un peu, je pense qu'il va falloir trouver une autre façon de coder. (si j'ai un peu de temps, ce qui n'est pas sur!)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Rassure toi ce n'est pas ton bloc qui pose problème, mais bien le code.

J'ai du mal à identifier le problème, car sur la version ou j'avais écrit l'original (voir lien en post #6), je n'avais pas ce problème (ça devait être une version 2002)

 

Sur des versions plus récente, j'ai l'impression que c'est l'affectation de (nentsel) à une variable (ici ent) qui pose problème dans une boucle invoquant un (command).

 

Dans l'immédiat je sèche un peu, je pense qu'il va falloir trouver une autre façon de coder. (si j'ai un peu de temps, ce qui n'est pas sur!)

 

Merci bien pour ta réponse.

 

En attendant une solution je peux faire en changeant le style de texte. En fait je crée un bloc des entités textes qui vont me servir pour donner un Z à mes points, je les décompose et change le style et le nom du calque (calque bidon que j'efface à la fin). Après j'insère ce bloc et crée mes poly. La manip et certes du bricolage mais je viens de faire un projet, la manip m'a pris 2 minutes et la création des poly 1,5 heures au lieu de 4 heures avant ton lisp. C'est impressionnant le gain de temps !!! Encore merci pour ton lisp et dès que tu trouveras l'astuce tiens moi au jus !!

 

@+

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Essayes avec cette version remaniée, cela devrait aller...

 

(vl-load-com)
(defun nentsel-getreal ( / ent key n nbr)
 (setq nbr "")
 (princ (strcat "\nChoisir le Texte/Texte Multiligne/Attribut pour obtenir le Z <" (rtos (caddr (getvar "LASTPOINT")) 2 2) ">: "))
 (while (and (not (member (setq key (grread T 4 2)) '((2 13) (2 32)))) (/= (car key) 25) (/= (car key) 3))
   (cond
     ((eq (car key) 2)
       (if (member (cadr key) '(8 46 48 49 50 51 52 53 54 55 56 57))
         (if (eq (cadr key) 8)
           (progn
             (princ (chr 8)) (princ (chr 32)) (princ (chr 8))
             (setq nbr (substr nbr 1 (1- (strlen nbr))))
           )
           (progn
             (setq n (chr (cadr key)))
             (princ n)
             (setq nbr (strcat nbr n))
           )
         )
       )
     )
   )
 )
 (if (eq (car key) 3)
   (if (setq ent (nentselp (cadr key)))
     (progn
       (setq ent (entget (car ent)))
       (if (member (cdr (assoc 0 ent)) '("TEXT" "MTEXT" "ATTRIB"))
         (progn
           (setq ent (read (cdr (assoc 1 ent))))
           (if (or (eq (type ent) 'INT) (eq (type ent) 'REAL))
             (progn (princ (strcat "\nZ = " (rtos ent 2 2))) ent)
             (progn (princ "\nLe texte n'est pas valide!") (nentsel-getreal))
           )
         )
         (progn (princ "\nObjet n'est pas un Texte!") (nentsel-getreal))
       )
     )
     (progn (princ "\nSélection vide!") (setq ent nil) (nentsel-getreal))
   )
   (if (/= nbr "")
     (progn (princ (strcat "\nZ = " nbr)) (atof nbr))
     (progn (princ (strcat "\nZ = " (rtos (caddr (getvar "LASTPOINT"))2 2))) (caddr (getvar "LASTPOINT")))
   )
 )
)
(defun c:3dpoly_xy ( / AcDoc Space msg_f msg_n n pt_f lst_pt lst_tmp pt_n nw_pl)
 (setq
   AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
   Space
   (if (eq (getvar "CVPORT") 1)
     (vla-get-PaperSpace AcDoc)
     (vla-get-ModelSpace AcDoc)
   )
   msg_f "\nSpécifiez l'extrémité de la ligne .XY de, ou [annUler]: "
   msg_n "\nSpécifiez l'extrémité de la ligne .XY de, ou [Clore/annUler]: "
   n 0
 )
 (while (null (setq pt_f (getpoint "\nSpécifiez le point de départ de la polyligne: .XY de ")))
   (princ "\nPoint incorrect.")
 )
 (setq pt_f (trans pt_f 1 0) lst_pt (list (list (car pt_f) (cadr pt_f) (nentsel-getreal))) lst_tmp lst_pt)
 (setvar "LASTPOINT" (car lst_pt))
 (initget "U ANNUler _Undo UNDO")
 (while (and (setq pt_n (getpoint (trans pt_f 0 1) (if (< n 2) msg_f msg_n))) (/= pt_n "Close"))
   (if (listp pt_n)
     (progn
       (setq pt_n (trans pt_n 1 0) lst_pt (cons (list (car pt_n) (cadr pt_n) (nentsel-getreal)) lst_pt) lst_tmp lst_pt)
       (setvar "LASTPOINT" (car lst_pt))
       (setq n (1+ n) pt_f pt_n)
     )
     (if (zerop n)
       (princ "\nTous les segments sont déjà annulés.")
       (progn
         (setq lst_pt (cdr lst_pt) lst_tmp lst_pt)
         (setvar "LASTPOINT" (car lst_pt))
         (setq n (1- n) pt_f (getvar "lastpoint"))
       )
     )
   )
   (if (< n 1)
     (initget "U ANNUler _Undo UNDO")
     (initget "U ANNUler Clore _Undo UNDO Close")
   )
   (redraw)
   (while (cdr lst_tmp) (grdraw (trans (car lst_tmp) 0 1) (trans (cadr lst_tmp) 0 1) 7) (setq lst_tmp (cdr lst_tmp)))
 )
 (redraw)
 (setq nw_pl (vlax-invoke Space 'Add3DPoly (apply 'append (reverse lst_pt))))
 (if (eq pt_n "Close")
   (vlax-put nw_pl 'Closed 1)
 )
 (princ)
)

Modifié par bonuscad

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Merci pour ta réponse !

 

Maintenant il me prend bien tous les textes et attributs sauf que ta modif d'avant qui permettait de rentrer soi même une valeur, ou de double cliquer pour conserver la dernière valeur entrée ne marche plus...

 

Ca sent bon la fin !!!

Lien vers le commentaire
Partager sur d’autres sites

ou de double cliquer pour conserver la dernière valeur entrée ne marche plus...

Pour ça j'avais changé le mode de fonctionnement, il suffisait de faire un click-droit/Entrée ou Espace.

 

qui permettait de rentrer soi même une valeur

Pour ça j'ai édité mon dernier message et modifié la fonction (ajouz) qui est maintenant (nentsel-getreal), un mixe des deux fonctions native du lisp (nentsel) et (getreal)

Au lieu de valider la valeur Z du dernier point entré, il te suffit de taper la valeur souhaitée et de la valider.

 

Cette fonction te permet donc soit de récupérer la valeur du texte graphiquement, soit le Z du dernier point, soit de faire une saisie numérique en une seule invite de commande; je peux pas faire moins ;)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

En effet, je suis vraiment pas logique, en fait tu as raison, mais hier je traçais ma poly comme sur ta version d'avant en double cliquant et donc la fonction s'arrêtait....

 

Par contre, ce matin je redémarre mon autocad à cause d'un plantage et là lorsque je lance ta fonction il me crée des polylignes correctement (niquel ton lisp) sauf lorsque j'ai fini ma poly je n'arrivais pas à la sélectionner, je fais donc un petit regen et la la poly disparait (calque actif et tout j'ai vérifié) ????? Bref je redémarre à nouveau autocad, je lance ton lisp et là il me dit "erreur: no function definition: VLAX-GET-ACAD-OBJECT"???????

 

Je comprends pas ce qui se passe ! Désolé de t'embêter encore...

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

je lance ton lisp et là il me dit "erreur: no function definition: VLAX-GET-ACAD-OBJECT"???????

J'ai oublié de lancer la fonction (vl-load-com), suivant les versions d'Autocad, elle n'est pas lancée au démarrage.

Tu peux la rajouter dans le code en tout première exécution (en dehors des defun car il suffit d'un seul lancement par session)

 

ma poly je n'arrivais pas à la sélectionner

Si le lisp à avorté, tu n'as qu'une image de dessiné, c'est d'ailleurs l'inconvénient de cette nouvelle approche car si tu fais un redess, pan ou un zoom molette les segments déjà saisis vont disparaître (pour réapparaître lors de la validation du sommet suivant).

Garder l'affichage de ses segments pourrait se faire, mais alourdirais énormément le code (pour peu de bénéfices, j'ai donc fais l'impasse). Donc si tu veux savoir où tu en es, évite le plus possible les commande d'affichage transparentes lors de l'utilisation.

 

Un (redraw) serait peut être judicieux; à placer sur la ligne avant (setq nw_pl (vlax-invoke Space 'Add3DPoly (apply 'append (reverse lst_pt))))

Je te laisse faire ses modifications bénignes.

  • Upvote 1

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup pour ton lisp qui marche à merveille maintenant !!!!

 

Trop fort BONUSCAD...merci encore !!!

 

Voici le code définitif pour ceux que ça interresse ....

 

(vl-load-com)

(defun ajouz ( / ent dxf_ent typ_ent z)

(while (null ent)

(setq ent (nentsel (strcat "\nChoisir le Texte/Texte Multiligne/Attribut pour obtenir le Z <" (rtos (caddr (getvar "LASTPOINT")) 2 2) ">: ")))

(if (null ent)

(setq dxf_ent (list '(0 . "TEXT") (cons 1 (rtos (caddr (getvar "LASTPOINT")) 2 4))) ent T)

(setq dxf_ent (entget (car ent)))

)

(setq typ_ent (cdr (assoc 0 dxf_ent)))

(cond

((member typ_ent '("TEXT" "MTEXT" "ATTRIB"))

(setq z (read (cdr (assoc 1 dxf_ent))))

(if (and (/= (type z) 'REAL) (/= (type z) 'INT))

(progn (setq ent nil) (princ "\nLa valeur du texte ne convient pas!"))

)

)

(T

(setq ent nil)

(princ "\nN'est pas un Texte MTexte ou Attribut!")

)

)

)

(princ (strcat "\nZ = " (rtos z 2 2)))

z

)

(defun c:3dpoly_xy ( / AcDoc Space msg_f msg_n n pt_f lst_pt lst_tmp pt_n nw_pl)

(setq

AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))

Space

(if (eq (getvar "CVPORT") 1)

(vla-get-PaperSpace AcDoc)

(vla-get-ModelSpace AcDoc)

)

msg_f "\nSpécifiez l'extrémité de la ligne .XY de, ou [annUler]: "

msg_n "\nSpécifiez l'extrémité de la ligne .XY de, ou [Clore/annUler]: "

n 0

)

(while (null (setq pt_f (getpoint "\nSpécifiez le point de départ de la polyligne: .XY de ")))

(princ "\nPoint incorrect.")

)

(setq pt_f (trans pt_f 1 0) lst_pt (list (list (car pt_f) (cadr pt_f) (ajouz))) lst_tmp lst_pt)

(setvar "LASTPOINT" (car lst_pt))

(initget "U ANNUler _Undo UNDO")

(while (and (setq pt_n (getpoint (trans pt_f 0 1) (if (< n 2) msg_f msg_n))) (/= pt_n "Close"))

(if (listp pt_n)

(progn

(setq pt_n (trans pt_n 1 0) lst_pt (cons (list (car pt_n) (cadr pt_n) (ajouz)) lst_pt) lst_tmp lst_pt)

(setvar "LASTPOINT" (car lst_pt))

(setq n (1+ n) pt_f pt_n)

)

(if (zerop n)

(princ "\nTous les segments sont déjà annulés.")

(progn

(setq lst_pt (cdr lst_pt) lst_tmp lst_pt)

(setvar "LASTPOINT" (car lst_pt))

(setq n (1- n) pt_f (getvar "lastpoint"))

)

)

)

(if (< n 1)

(initget "U ANNUler _Undo UNDO")

(initget "U ANNUler Clore _Undo UNDO Close")

)

(redraw)

(while (cdr lst_tmp) (grdraw (trans (car lst_tmp) 0 1) (trans (cadr lst_tmp) 0 1) 7) (setq lst_tmp (cdr lst_tmp)))

)

(redraw)

(setq nw_pl (vlax-invoke Space 'Add3DPoly (apply 'append (reverse lst_pt))))

(if (eq pt_n "Close")

(vlax-put nw_pl 'Closed 1)

)

(princ)

)

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup pour ton lisp qui marche à merveille maintenant !!!!

 

Trop fort BONUSCAD...merci encore !!!

 

Voici le code définitif pour ceux que ça interresse ....

 

 

(vl-load-com)

(defun ajouz ( / ent dxf_ent typ_ent z)

(while (null ent)

(setq ent (nentsel (strcat "\nChoisir le Texte/Texte Multiligne/Attribut pour obtenir le Z <" (rtos (caddr (getvar "LASTPOINT")) 2 2) ">: ")))

(if (null ent)

(setq dxf_ent (list '(0 . "TEXT") (cons 1 (rtos (caddr (getvar "LASTPOINT")) 2 4))) ent T)

(setq dxf_ent (entget (car ent)))

)

(setq typ_ent (cdr (assoc 0 dxf_ent)))

(cond

((member typ_ent '("TEXT" "MTEXT" "ATTRIB"))

(setq z (read (cdr (assoc 1 dxf_ent))))

(if (and (/= (type z) 'REAL) (/= (type z) 'INT))

(progn (setq ent nil) (princ "\nLa valeur du texte ne convient pas!"))

)

)

(T

(setq ent nil)

(princ "\nN'est pas un Texte MTexte ou Attribut!")

)

)

)

(princ (strcat "\nZ = " (rtos z 2 2)))

z

)

(defun c:3dpoly_xy ( / AcDoc Space msg_f msg_n n pt_f lst_pt lst_tmp pt_n nw_pl)

(setq

AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))

Space

(if (eq (getvar "CVPORT") 1)

(vla-get-PaperSpace AcDoc)

(vla-get-ModelSpace AcDoc)

)

msg_f "\nSpécifiez l'extrémité de la ligne .XY de, ou [annUler]: "

msg_n "\nSpécifiez l'extrémité de la ligne .XY de, ou [Clore/annUler]: "

n 0

)

(while (null (setq pt_f (getpoint "\nSpécifiez le point de départ de la polyligne: .XY de ")))

(princ "\nPoint incorrect.")

)

(setq pt_f (trans pt_f 1 0) lst_pt (list (list (car pt_f) (cadr pt_f) (ajouz))) lst_tmp lst_pt)

(setvar "LASTPOINT" (car lst_pt))

(initget "U ANNUler _Undo UNDO")

(while (and (setq pt_n (getpoint (trans pt_f 0 1) (if (< n 2) msg_f msg_n))) (/= pt_n "Close"))

(if (listp pt_n)

(progn

(setq pt_n (trans pt_n 1 0) lst_pt (cons (list (car pt_n) (cadr pt_n) (ajouz)) lst_pt) lst_tmp lst_pt)

(setvar "LASTPOINT" (car lst_pt))

(setq n (1+ n) pt_f pt_n)

)

(if (zerop n)

(princ "\nTous les segments sont déjà annulés.")

(progn

(setq lst_pt (cdr lst_pt) lst_tmp lst_pt)

(setvar "LASTPOINT" (car lst_pt))

(setq n (1- n) pt_f (getvar "lastpoint"))

)

)

)

(if (< n 1)

(initget "U ANNUler _Undo UNDO")

(initget "U ANNUler Clore _Undo UNDO Close")

)

(redraw)

(while (cdr lst_tmp) (grdraw (trans (car lst_tmp) 0 1) (trans (cadr lst_tmp) 0 1) 7) (setq lst_tmp (cdr lst_tmp)))

)

(redraw)

(setq nw_pl (vlax-invoke Space 'Add3DPoly (apply 'append (reverse lst_pt))))

(if (eq pt_n "Close")

(vlax-put nw_pl 'Closed 1)

)

(princ)

)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

En fait je viens de m'apercevoir qu'il ne prend pas les valeurs entrées à la main. Je l'avais pourtant testé, lorsque je rentrais une valeur à la main il me demandait le point suivant mais en fait je n'avais pas vu qu'il ne prenait pas en compte ma valeur mais celle d'avant ?

 

Je trouve ça bizarre !

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Je trouve ça bizarre !

 

Disons que ce qui est bizarre, c'est que le code que tu as publié n'a rien à voir avec celui que je t'ai proposé.

La dernière mouture à été publiée (par modification) à la réponse #16

 

Assures toi que celle que tu utilises est bien la bonne. Refais un copier-coller du code ...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

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é