j'ai peut-être un truc pour toi si tu n'es pas contre un peu du Lisp.
Cette après-midi j'ai bossé sur une routine dont j'avais besoin.
Le principe est de créér un bloc dont tu renseignes le premier attribut, ce qui pourait correspondre avec ton n° de lot, et le deuxième attribut est automatiquement rempli avec la longueur de la polyligne que tu as sélectionné.
Ca donnerait ça pour ton exemple :
- Code:
;;; Insère le bloc "mon_bloc" après sélection d'une polyligne
;;; Attribut 1 : N° de lot
;;; Attribut 2 : Aire de la polyligne
(defun c:pms (/ AcDoc Space bloc nom ent aire ins)
(vl-load-com)
(setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
Space (if (= (getvar "CVPORT") 1)
(vla-get-PaperSpace AcDoc)
(vla-get-ModelSpace AcDoc)
)
)
(cond
((tblsearch "BLOCK" (setq bloc "mon_bloc")))
((findfile (setq bloc "mon_bloc.dwg")))
(T (setq bloc nil))
)
(if bloc
(progn
(while (not (setq ent (car (entsel)))))
(if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
(progn
(setq obj (vlax-ename->vla-object ent)
id (vla-get-ObjectID obj)
aire (strcat "%<\AcObjProp Object(%<\_ObjId "
(itoa id)
">%).Area \f "%lu2%pr2%ct8">%"
)
)
(initget 1)
(setq nom (getstring T "nN° de lot: "))
(initget 1)
(setq ins (trans (getpoint "nPoint d'insertion: ") 1 0))
(setq ref
(vla-InsertBlock
Space
(vlax-3d-point ins)
bloc
1.0
1.0
1.0
0.0
)
)
(mapcar '(lambda (x y) (vla-put-TextString x y))
(vlax-invoke ref 'GetAttributes)
(list nom aire)
)
(vla-regen AcDoc acActiveViewport)
)
(alert "L'objet sélectionné n'est pas une polyligne.")
)
)
(alert "Le bloc "aha_bloc_metre_surf" est introuvable.")
)
(princ)
)
En l'état le LISP fonctionne avec un bloc qui doit exister dans la collection du dessin courant (ou dans le gabarit ayant servi à sa création), ou être un fichier .dwg créé avec la commande wbloc et enregistré dans un dossier du chemin de recherche d'AutoCAD.
Le nom du bloc doit être : "mon_bloc" ou "mon_bloc.dwg" (wbloc). Tu remplaces bien sûr "mon_bloc" par le nom que tu veux, mais n'oublie pas alors de le changer aussi dans le code.
Le bloc doit contenir 3 attributs : n°_lot, longueur, et unité, à sélectionner dans cet ordre lors de la création du bloc. Ces attributs seront renseignés via le LISP (donc inutile de spécifier une invite). Pour l'attribut unité, renseigne le champ valeur avec le suffixe de ton choix (m²,....).
Le LISP invite à sélectionner une polyligne (ouverte ou fermée), à entrer le N° de lot (premier attribut) et à spécifier le point d'insertion.
Et voilà.
C'est une routine qui vient d'un membre de CADxp.
Qu'il en soit ici remercié.
Merci (gile)