Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Wed 05 October 2011 12:03

bruno v.
Participant actif
Date d'inscription: 22 Mar 2010
Messages: 89

[MAP/CIVIL]Répéter le texte d'une OD le long d'une polyligne optimisée

Bonjour,

J'avais besoin de cet outil, donc je l'ai écrit.

Si vous pensez en avoir besoin aussi voici le code.

Code:

(vl-load-com)
(defun c:OD2Label_Side ( / js obj ename htx AcDoc Space nw_style lst_tabl_def lst_def desc_od str pt deriv rtx  nw_obj)
    (princ "\nSélectionnez une polyligne.")
    (while
        (null
            (setq js
                (ssget "_+.:E:S"
                    (list
                        '(0 . "LWPOLYLINE")
                        (cons 67 (if (eq (getvar "CVPORT") 1) 1 0))
                        (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model"))
                    )
                )
            )
        )
        (princ "\nCe n'est pas un objet valable pour cette fonction!")
    )
    (setq
        obj (ssname js 0)
        ename (vlax-ename->vla-object obj)
    )
    (cond
        ((ade_odgettables obj)
            (initget 6)
            (setq htx (getdist (getvar "VIEWCTR") (strcat "\nSpécifiez la hauteur du texte <" (rtos (getvar "TEXTSIZE")) ">: ")))
            (if htx (setvar "TEXTSIZE" htx))
            (setq
                AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
                Space
                (if (= 1 (getvar "CVPORT"))
                    (vla-get-PaperSpace AcDoc)
                    (vla-get-ModelSpace AcDoc)
                )
            )
            (cond
                ((null (tblsearch "LAYER" "Label"))
                    (vlax-put (vla-add (vla-get-layers AcDoc) "Label") 'color 96)
                )
            )
            (cond
                ((null (tblsearch "STYLE" "Romand-Label"))
                    (setq nw_style (vla-add (vla-get-textstyles AcDoc) "Romand-Label"))
                    (mapcar
                        '(lambda (pr val)
                            (vlax-put nw_style pr val)
                        )
                        (list 'FontFile 'Height 'ObliqueAngle 'Width 'TextGenerationFlag)
                        (list "romand.shx" 0.0 (/ (* 15.0 pi) 180) 1.0 0.0)
                    )
                )
            )
            (setq lst_tabl_def (mapcar 'ade_odtabledefn (ade_odgettables obj)))
            (foreach n lst_tabl_def
                (foreach el n
                    (if (listp (cdr el))
                        (foreach sel (cdr el)
                            (foreach msel sel
                                (if (eq (car msel) "ColName")
                                    (setq lst_def (cons (strcase (cdr msel)) lst_def))
                                )
                            )
                        )
                    )
                )
            )
            (print lst_def)
            (while (not (member (setq desc_od (strcase (getstring T "\nDescription de la donnée d'objet: "))) lst_def))
                (princ "\nCette description n'est pas présente dans la table")
            )
            (setq str (ade_odgetfield obj (car(ade_odgettables obj)) desc_od 0))
            (while (setq pt (getpoint "\nPoint?: "))
                (setq
                    pt (vlax-curve-getClosestPointTo ename    (trans pt 1 0))
                    deriv (vlax-curve-getFirstDeriv ename (vlax-curve-GetParamAtPoint ename pt))
                    rtx (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR")))
                )
                (if (or (> rtx (* pi 0.5)) (< rtx (- (* pi 0.5)))) (setq rtx (+ rtx pi)))
                (setq nw_obj
                    (vla-addMtext Space
                        (vlax-3d-point (setq pt (polar pt (+ rtx (* pi 0.5)) (getvar "TEXTSIZE"))))
                        0.0
                        str
                    )
                )
                (mapcar
                    '(lambda (pr val)
                        (vlax-put nw_obj pr val)
                    )
                    (list 'AttachmentPoint 'Height 'DrawingDirection 'InsertionPoint 'StyleName 'Layer 'Rotation)
                    (list 5 (getvar "TEXTSIZE") 5 pt "Romand-Label" "Label" rtx)
                )
            )
        )
        (T (princ "\nPas de données d'objet attachées"))
    )
    (prin1)
)

J'avais besoin que pour des LWPolyline, libre à vous d'étendre à d'autres objets curviligne valides  en modifiant le filtre ssget:
"*POLYLINE,LINE,ARC,CIRCLE,ELLIPSE"....

Hors ligne

 

#2 Sat 08 October 2011 20:31

Patrice
JeSuisCharlie
Date d'inscription: 16 Sep 2005
Messages: 4741

Re: [MAP/CIVIL]Répéter le texte d'une OD le long d'une polyligne optimisée

Hello Bruno

Merci pour ta routine que je viens de tester sur un vieux MAP 2004 et qui marche Nickel-Chrome !

Le style de texte n'est "pas terrible" mais ce n'est pas un probleme ...

A propos de routine en Lisp/VLisp pour les OD de MAP/CIVIL, je te propose un CDC/CCTP
si bien sur tu as le temps ... je pense que cela est VITAL des que l'on a des ODs dans MAP/CIVIL !?

On n'a aucun moyen simple (sauf en passant par des requetes sur le groupe dessins, c penible) dans MAP/CIVIL pour tout simplement selectionner les objets ayant une certaine table OD avec un certain de contenu de champ OD ...

Donc apres une selection AutoCAD classique ...

Question 1 : Nom de la table OD a traiter ?
Cela permettra DEJA d'eliminer les objets selectionnes mais non concernes !

Question 2 : Nom du champ OD a traiter ?
Attention aux 3 types de champ : Caractere, Entier, Reel (Quant a POINT, je ne l'ai jamais utilise !)

Question 3 : Operateur < <= > >= = <> ?

Question 4 : Valeur/Contenu ?

Execution et Selection depuis la selection initiale QUE des objets qui respecte les parametres !

Par exemple :
- Trouver les objets dont le champ IDENTIFIANT = AB0001 (ou DIFFERENT)
- Trouver les objets dont le champ DIAMETRE <= 200 (ou > ou etc)
- Trouver les objets dont le champ PRIX >= 1234.50 (ou <= ou < ou > ou etc)
etc etc

Cela serait une grande aide pour TOUS les utlisateurs de MAP et CIVIL ...

GeoBye, Pat


(Autodesk Expert Elite Team)

Hors ligne

 

Pied de page des forums

Powered by FluxBB