Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

J'ai comme à mon habitude un problème de simplification, mais étant plutôt compliqué dans ma tête je n'y arrive pas, je m'explique (ou en tout cas j'essaye) :

 

J'ai pour base un bloc avec attribut (un point topo avec un matricule, une altitude et éventuellement un code),

une ligne qui traine pas loin voir qui passe par ce point (une bordure de trottoir) et grâce à ce code (un Frankenstein-code) je sélectionne 2 points pour l'orientation futur de mon texte (un simple texte avec un point) je sélectionne le fameux point et l'altitude du point doit s'écrire à la place de mon texte insérer.

 

Et mon problème dans ce bout de code est le suivant j'ai trop de sélection à faire et refaire, comment dois-je faire pour simplifier la chose ?

L'idéal pour moi serait :

1-orientation par deux points

2-selection du bloc point

fin

 

Voici mon brico-code même si les critiques vont être dur, j'espère vous lire avec une réponse positive à mon questionnement.

 

Merci d'avance.

 


(Defun C:altip ( / OldAccr p ang di)

(SetVar "CMDECHO" 0)

(Setq OldAccr (Getvar "OSMODE"))

(Setvar "OSMODE" 8)

(defun OuEstTu()

(IF (= (FindFile "Altip.DWG") Nil)

(Prompt "\nLe Fichier Altip.DWG est introuvable.")

(Progn
         
(Command "_Insert" "*Altip" "0.0,0.0" "" "")
  
(DESSINE))))

(Setvar "OSMODE" 512)

(setq p11 (getpoint "\n1er point pour l'Orientation : "))
	
(setq p12 (getpoint "\t2ème  point pour l'Orientation : "))
	
(setq di11 (/ (Distance p11 p12) 2))

(setq p13 (polar p11 (angle p11 p12) di11))
	
(setq p14 (polar p13 (+ (angle p13 p12) (/ pi 2.0)) (/ 1.0)))
	
(setq p15 (polar p14 (- (angle p13 p12) (/ pi 2.0)) (/ 2.0)))

(setq Ang1 (angle p11 p12))

(setq Ang2 (angtos Ang1 2 2))

(setq Ang3 (atof Ang2))

(setq Ang4 (+ Ang3 300))

(setq zz (caddr p))

(if (and (setq ent1 (car (entsel) )) ; Sélection d'une entité

(wcmatch (cdr (assoc 0 (entget ent1) )) "*"))

(setq ins_pt (cdr (assoc 10 (entget ent1) ))))

(Command "_INSERT" "Altip" ins_pt "" "" Ang4)

(Command "_Explode" "d")

(setq T1 (entlast))

(command "_.layer" "CH" "0" "" "") 

(Setvar "OSMODE" OldAccr) 

(setvar 'pdmode 32)

(setvar "PDSIZE" 0.1)  

(defun extract_txt ( flag msg / ent dxf_ent typ_ent)

(while (null ent)

(setq ent (nentsel (strcat "\nChoisir le " msg ": ")))

(cond

((not (null ent))

(setq typ_ent (cdr (assoc 0 (setq dxf_ent (entget (car ent))))))

(cond

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

(if flag

(progn

(entmod (subst (cons 1 (extract_txt nil "L'ALTITUDE A APPLIQUER")) (assoc 1 dxf_ent) dxf_ent))

(if (assoc 330 dxf_ent) (entupd (cdr (assoc 330 dxf_ent)))))

(cdr (assoc 1 dxf_ent))))                                      

(T

(setq ent nil)

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

))))))

(defun subtitutexte ( / )

(extract_txt T "TEXTE à MODIFIER")

(prin1))
     		
(princ)

(subtitutexte)

)


  • 2 semaines après...
Posté(e)

Coucou

 

Du monde pour t'aider il y en a plein.

Dis-toi que si tu n'as pas d'aide c'est que tu appelles au secours dans une langue inconnue

Tu parles de texte, d'attribut, de Frankenstein-code, on est perdus ...

Et du coup on ne répond pas, c'est aussi simple que ça.

 

Une image ?

Un fichier avec avant/après ?

 

Amicalement

Posté(e)

Salut.

 

J'ai fais ce code (avec l'aide habituelle de CadXP) la semaine dernière :

;;;**************************************************************
;;; Placement d'une altitude en sélectionnant la version "brute" 
;;;**************************************************************
(defun c:PlaceAlti (/ Txt_Clic Txt_Alti Coord)
 (setq Txt_Clic (car (entsel "\nSélectionnez l'altitude :"))
       Txt_Alti (cdr (assoc 1 (entget Txt_Clic)))
       Coord    (cdr (assoc 10 (entget Txt_Clic)))
       Calq     (cdr (assoc 8 (entget Txt_Clic)))
 ) ;_ Fin de setq
 (if (setq e_seg (entsel "\tSélectionnez le segment de la polyligne ou [ENTRÉE] pour un texte horizontal : ") ;_ Fin de entsel
     ) ;_ Fin de setq
   (progn (setq typent (cdr (assoc 0 (setq dxf_ent (entget (car e_seg))))))
          (cond ((or (eq typent "XLINE") (eq typent "RAY"))
                 (setq dxf_11 (cdr (assoc 11 dxf_ent)))
                 (setq x_alpha (angtos (atan (/ (cadr dxf_11) (car dxf_11)))))
                 (grdraw (trans (cdr (assoc 10 dxf_ent)) 0 1)
                         (polar (trans (cdr (assoc 10 dxf_ent)) 0 1) x_alpha (distance (getvar "vsmin") (getvar "vsmax"))) ;_ Fin de polar
                         -1
                         1
                 ) ;_ Fin de grdraw
                )
                ((eq typent "LINE")
                 (setq x_alpha (angtos (angle (cdr (assoc 10 dxf_ent)) (cdr (assoc 11 dxf_ent))) ;_ Fin de angle
                               ) ;_ Fin de angtos
                 ) ;_ Fin de setq
                 (grdraw (trans (cdr (assoc 10 dxf_ent)) 0 1) (trans (cdr (assoc 11 dxf_ent)) 0 1) -1 1) ;_ Fin de grdraw
                )
                ((or (eq typent "LWPOLYLINE")
                     (and (eq typent "POLYLINE") (zerop (boole 1 118 (cdr (assoc 70 dxf_ent))))) ;_ Fin de and
                 ) ;_ Fin de or
                 (setq l_2pt (near_vertex_arr e_seg))
                 (grdraw (car l_2pt) (cadr l_2pt) -1 1)
                 (if (zerop (caddr l_2pt))
                   (setq x_alpha (angtos (angle (trans (car l_2pt) 1 0) (trans (cadr l_2pt) 1 0)) ;_ Fin de angle
                                 ) ;_ Fin de angtos
                   ) ;_ Fin de setq
                   (progn (princ "\nNe peut obtenir un angle depuis ce type d'objet!") ;_ Fin de princ
                   ) ;_ Fin de progn
                 ) ;_ Fin de if
                )
          ) ;_ Fin de cond
   ) ;_ Fin de progn
   (progn (princ "\nAngle pris par rapport à la vue active")
          (setq x_alpha (vlax-ldata-get "DenisH" "AngSCU")) ;_ Fin de setq
   ) ;_ Fin de if
 ) ;_ Fin de if
 (command "-style" "Altitude" "" "" "" "" "" "" "")
 (command "_.text" "j" "mc" Coord 0.15 x_alpha (rtos (atof Txt_Alti) 2 2))
 (command "_move" "_last" "" "_non" Coord pause)
 (princ)
) ;_ Fin de defun

 

Tu as juste à utiliser la commande "burst" des ExpressTools avant. Tu sélectionne ton altitude (un texte) et le segment de droite pour l'alignement, puis, tu places l'altitude.

Sinon, il faudra changer ce code pour sélectionner un attribut au lieu d'un texte.

 

A+

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Pardonnez moi pour ma mauvaise façon de m'exprimer.

 

Je cherche à appliquer la valeur se trouvant dans une étiquette d'un attribut (l'altitude d'un point)

 

dans un simple texte que j'oriente suivant 2 points.

 

Dans mon code précèdent cela fonctionne mais je suis obligé de sélectionner plusieurs fois l'attribut puis le texte insérer, je cherche à sélectionner 1 seul fois l'attribut et que le texte prenne la valeur de l'étiquette Altitude.

 

Ci dessous le point avec l'attribut altitude :

base112.jpg

 

et ci dessous le simple Texte rajouté qui récupère l'altitude:

base212.jpg

 

En espérant que ce message permet de me faire comprendre et que quelqu'un m'aide sur mon sujet.

 

En vous remerciant de votre compréhension.

Posté(e)

Re.

 

Quel est le nom de l'étiquette de l'attribut qui contient l'altitude ?

Poste ton bloc, ça ira plus vite...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

essai via WeTransfer

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Ok, je viens de modifier ma routine pour tes besoin.

 

Tu cliques sur l'altitude dans le bloc,

Tu clique sur le segment de polyligne pour récupérer la rotation

Tu place la nouvelle altitude sous forme de texte.

 

Voici le code :

(defun c:RecupAlti (/)
 (setq Txt_Alti (cdr (assoc 1 (entget (car (nentsel "\nSélectionner l'altitude du bloc :")))))
 ) ;_ Fin de setq
 (if (setq e_seg (entsel "\tSélectionnez le segment de la polyligne ou [ENTRÉE] pour un texte horizontal : ") ;_ Fin de entsel
     ) ;_ Fin de setq
   (progn (setq typent (cdr (assoc 0 (setq dxf_ent (entget (car e_seg))))))
          (cond ((or (eq typent "XLINE") (eq typent "RAY"))
                 (setq dxf_11 (cdr (assoc 11 dxf_ent)))
                 (setq x_alpha (angtos (atan (/ (cadr dxf_11) (car dxf_11)))))
                 (grdraw (trans (cdr (assoc 10 dxf_ent)) 0 1)
                         (polar (trans (cdr (assoc 10 dxf_ent)) 0 1) x_alpha (distance (getvar "vsmin") (getvar "vsmax"))) ;_ Fin de polar
                         -1
                         1
                 ) ;_ Fin de grdraw
                )
                ((eq typent "LINE")
                 (setq x_alpha (angtos (angle (cdr (assoc 10 dxf_ent)) (cdr (assoc 11 dxf_ent))) ;_ Fin de angle
                               ) ;_ Fin de angtos
                 ) ;_ Fin de setq
                 (grdraw (trans (cdr (assoc 10 dxf_ent)) 0 1) (trans (cdr (assoc 11 dxf_ent)) 0 1) -1 1) ;_ Fin de grdraw
                )
                ((or (eq typent "LWPOLYLINE")
                     (and (eq typent "POLYLINE") (zerop (boole 1 118 (cdr (assoc 70 dxf_ent))))) ;_ Fin de and
                 ) ;_ Fin de or
                 (setq l_2pt (near_vertex_arr e_seg))
                 (grdraw (car l_2pt) (cadr l_2pt) -1 1)
                 (if (zerop (caddr l_2pt))
                   (setq x_alpha (angtos (angle (trans (car l_2pt) 1 0) (trans (cadr l_2pt) 1 0)) ;_ Fin de angle
                                 ) ;_ Fin de angtos
                   ) ;_ Fin de setq
                   (progn (princ "\nNe peut obtenir un angle depuis ce type d'objet!") ;_ Fin de princ
                   ) ;_ Fin de progn
                 ) ;_ Fin de if
                )
          ) ;_ Fin de cond
   ) ;_ Fin de progn
   (setq x_alpha 100) ;_ Fin de setq
 ) ;_ Fin de if
 (command "_.text" "j" "mc" "0,0,0" 0.15 x_alpha (rtos (atof Txt_Alti) 2 2))
 (command "_move" "_last" "" "_non" "0,0,0" pause)
 (princ)
) ;_ Fin de defun

 

Le style de texte par défaut ne doit pas avoir de hauteur, elle doit être égale à 0

La hauteur du texte est le "0.15" dans la ligne

(command "_.text" "j" "mc" "0,0,0" 0.15 x_alpha (rtos (atof Txt_Alti) 2 2))

Tiens nous au courant si c'est ce que tu voulais...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Re.

 

J'ai essayé de simplifier (surtout pour récupérer les coordonnées du bloc) de façon à ce que les coordonnées du texte à placer soient plus proches, mais je n'y arrive pas, j'avais ce code :

(setq Txt_Blk  (entsel "\nSélectionner l'altitude du bloc :")
       Txt_Alti (getpropertyvalue Txt_Blk "ALT")
       Coord    (cdr (assoc 10 (entget (car Txt_Blk))))
 ) ;_ Fin de setq

Mais AutoCAD me répond :

Sélectionner l'altitude du bloc :; erreur: Demande ADS erronée

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Coucou

 

je t'ai tapé ça vite fait sur le gaz et tu peux t'en inspirer

je fais exprès de déposer une image pour que tu te coltines avec le clavier et que tu comprennes ce que tu fais.

je pars du principe que l'attribut altitude est le deuxième attribut du bloc point

 

mini_42217002062017153651.png

 

je pense que pendant sa formation l'ami DenisHEN va apprendre à faire plus court (hihi)

 

amicalement

 

PS : comment as tu déposé tes images sur CadXP, moi je ne peux pas autrement que par un hébergeur !

Posté(e)

C'est presque bon tous ça, mais comment je peux insérer un nouveau point au coordonnée du bloc sélectionné ?

 

J'ai essayer ça, mais ça semble récupérer la valeur et non les xy.

 


(setq Txt_Alti (cdr (assoc 1 (entget (entnext (entnext (car (entsel "\bloc\n"))))))))

(setq xypt (cdr (assoc 70 (entget (car Txt_Alti)))))

(command "_point" xypt)

Posté(e)

Même comme cela, ça ne marche pas :(

 

(setq Txt_Alti (cdr (assoc 1 (entget (car (nentsel "\nSélectionner l'altitude du bloc :"))))))

(setq xypt (list (car (cdr (assoc 10 (entget Txt_Alti))))
                (cadr(cdr (assoc 10 (entget Txt_Alti))))))

 

Je suis vraiment pas doué...

Posté(e)

Coucou

 

Je crois que je te vois venir, je peux me tromper mais je dirais que tu es géomètre, ou que tu travailles chez un géomètre et que tu veux donner un fichier dans lequel les altitudes ne seront plus définies par des points topo, histoire de bien pourrir la vie de celui qui devra travailler avec ton fichier !!!

Si j'ai bon je me permets de te dire que ce n'est pas respectable mais je vais t'aider quand même car je fais la part des choses

 

;sélection de ton bloc
(setq blocent (car (entsel"message de sélection")))
;obtention du point d'insertion
(setq pins (cdr(assoc 10 (entget blocent))))

 

Pour dessiner le point je te laisse trouver car encore une fois si j'ai bon pour mon hypothèse je devrais passer mon chemin.

 

Amicalement, dans le doute mais je compte sur ta franchise pour connaître le vrai du faux

Posté(e)

Bonjour à vous tous,

 

Effectivement Didier, comme tu l'as deviné, je suis bien Géomètre, je te remercie pour ta réponse qui fonctionne à merveille, une fois le code sous les yeux tout parait évident mais avant j'étais dans un brouillard épais. (Oops encore une métaphore dans une langue inconnue : désolé ) :P

 

Par ailleurs je ne tiens vraiment pas à pourrir la vie des gens qui récupère mes fichiers mais pour certains cas j'ai juste besoin d'un texte au lieu d'un bloc point (demandés par certains). Et pour te rassurer et de ne pas faire de moi un homme non respectable sur ce forum et ailleurs, je fourni toujours les points dans des calques gelés, je veille toujours à la qualité de mon travail, et au bien être de ceux qui vont utiliser mes fichiers propre et purgé comme il faut.

 

En te remerciant encore une fois pour ton écoute et ta solution.

 

Au plaisir

Posté(e)

En fait je me suis fait une fausse joie (une variable devait surement être encore valide)

 

Je suis obligé de cliqué 2 fois sur le bloc ? Je ne peux pas réunir tous cela pour cliquer une seule fois ?

 


(setq blocent (car (entsel"\nChoisir le Bloc :")))

(setq Txt_Alti (cdr (assoc 1 (entget (entnext (entnext (car (entsel "\Cliquer sur l'altitude à appliquer\n"))))))))

(setq pins (cdr(assoc 10 (entget blocent))))

(command "_point" pins)

(command "_.text" "_s" "Altimetrie" p17 Ang3 (rtos (atof Txt_Alti) 2 2))

 

Merci par avance (en espérant être clair sur ma question)

Posté(e)

Coucou

 

Je pense que ce qui suit va te convenir

Par ailleurs tes propos me rassurent, il y a tellement de gens qui font comme j'ai dit que je ne voudrais en être complice.

(setq blocent (car (entsel"\nChoisir le Bloc :"))
 	ht 1
 	Txt_Alti (cdr (assoc 1 (entget (entnext (entnext blocent)))))
 	pins (cdr(assoc 10 (entget blocent)))
 	)

(command "_point" pins)

(command "_.text" "_s" "Altimetrie" pins ht (angtos (+ (getangle pins "\Direction\n")(/ pi 2.0))) (rtos (atof Txt_Alti) 2 2))

(command "_move" (entlast) ""  pins pause)

 

Amicalement

Posté(e)

Doublement Satisfait...

 

Merci Didier, après plusieurs longues minutes à comprendre correctement tes dernières lignes, tout fonctionne cette fois à Merveille.

 

Et je te rassure encore une fois, je ne fais pas partie des gens qui ne pense pas aux autres, j'aime le travail bien fait et pratique pour les autres derrière moi.

 

Encore MERCI pour ta compréhension et tes réponses instructives.

Posté(e)

Coucou

 

Pour faire ce genre de manipulation je me permets de te conseiller de ne pas travailler avec des textes

Prenons l'exemple d'un géomètre qui est fier de ce qu'il fait et qui souhaite que ses plans soient lisibles, il ne va pas appuyer bêtement sur le bouton et imprimer les milliers d'altitudes afférentes à chaque point topo, mais n'en choisir que quelques unes représentatives et qui sont celle qu'il aurait choisies s'il avait dessiné "à la main".

Je sais pour le voir tous les jours que la première solution (de fainéantise) est la plus répandue).

Les jeunes (et moins jeunes) qui ont travaillé à mes côtés (pour ne dire que je les ai formés) se souviennent de ma façon de faire, à savoir un lisp qui se nomme "zza" qui était un des premiers "programmes" que j'ai eu l'occasion d'écrire.

Je vous raconterai peut-être pourquoi il se nommait ainsi

 

Il utilise la définition "classique" du point topo, deux attributs "mat" et "alt" et il fonctionne ainsi :

  • choix du bloc par clic
  • changement de l'attribut alt de calque pour passer dans le calque za (Z actif)
  • changement de style de texte de l'attribut pour devenir une "vraie" altitude (écriture en italique)
  • changement de calque du point qui passe dans le calque "za-points"
  • choix de la direction d'écriture (lisibilité du plan et alignement de la valeur (angle de bâti, trottoir, émergence d'assainissement...)
  • déplacement de la valeur écrite pour la lisibilité
  • il ne reste qu'à gérer l'affichage des calques pour rendre le plan lisible en cachant les altitudes non désirées

Et dans tout ça je garde la possibilité de modifier les valeurs attributaires par exemple lors d'un changement de référentiel altimétrique car les valeurs sont toujours dans des attributs pas des "textes" et ça change TOUT car en restant attributs ils peuvent être travaillés par un autre lisp qui modifie TOUTES les valeurs en additionnant une constante.

Travailler avec des textes c'est bien mais c'est insuffisant pour garder la réactivité de l'objet "point topo".

 

Amicalement

 

 

 

Posté(e)

Salut.

 

didier : je suis entièrement d'accord avec toi, mais comment fais-tu lorsqu'il y a un texte devant l'altitude, comme pour les seuils (S=) ou les tampons (T=) ?

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Effectivement je suis complétement d'accord avec toi Didier sur ta méthodologie ainsi que sur ta déontologie professionnelle, j'ai bien connu le Rotring et les Altitudes sélectionnées pour leurs représentations, c'est pourquoi un traitement de chacun des points topo permet une relecture et une analyse des altitudes apposées sur le plan.

 

En revanche n'ayant aucun programme de ce genre il me faut bien une solution pour certains cas, car je vois ou croise trop souvent des blocs de points explosés pour n'afficher que l'altitude, je préfère garder mon point topo (gelé) et ajouter un simple texte d'altitude.

 

Je reste bien sur ouvert d'esprit et à l'écoute de bons conseils comme les tiens, c'est pourquoi je t'invite avec envie à nous présenter ton "zza" qui m'a l'air de correspondre exactement à nos besoins.

 

Merci encore pour ta bienveillance et ta mansuétude.

Posté(e)

c'est pourquoi je t'invite avec envie à nous présenter ton "zza" qui m'a l'air de correspondre exactement à nos besoins.

 

J'attend avec impatience aussi l'explication.

 

Personnellement, je place mes points toujours en double :

en XY et Z=0 dans le calque Points 2D,

en XYZ dans le calque Points 3D.

 

De cette façon, le client a toujours la possibilité de travailler "à pat" à Z=0 mais il peut aussi faire une modélisation du terrain, par exemple, grâce aux points 3D.

 

Mais j'évite d'encombrer le client avec les matricules, mais parfois, c'est tout de même utile pour quand on parle avec lui de savoir de quel point on parle...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

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é