Dersou Posté(e) le 29 juin 2023 Posté(e) le 29 juin 2023 Bonjour à tous, J'ai un projet un peu ambitieux vu mon niveau (...) pour une énième application de calcul d'aire sur base de polylignes. L'idée première est de récupérer les aires de polylignes dans un bloc avec des champs dynamiques et de les exporter sous forme de tableau excel (ca c'est OK, j'ai regardé du coté du lisp Pline_Block et TotalArea) L'étape suivante serait de générer des hachures associées à ces polylignes avec des couleurs associées aux noms de pièces Et en bonus développer l'arborescence de classement de ces surfaces (par exemple bâtiment - étage - pièce) et gérer des déductions de polylignes à l'intérieur d'une surface.. Mais commençons par le début et à ma question: je n'arrive pas à comprendre comment fonctionne l'association entre le champ créé dans le bloc et la polyligne à laquelle on va l'associer. Par exemple, j'ai essayé d'ajouter au lisp Pline_Block un attribut pour indiquer le calque auquel la polyligne appartient mais je ne parviens pas à modifier le bloc de telle sorte que la valeur du champ dynamique s'ajuste correctement. C'est une question de base probablement mais je n'ai pas trouvé d'explication sur ce point. Si vous avez des éléments de réponse ou des liens vers des sujets où la question est traitée, je suis preneur. Merci! Citer
dxxx01 Posté(e) le 29 juin 2023 Posté(e) le 29 juin 2023 le soucis avec les blocs c est qu il ont un nom et quand tu l ai edite il prenne la forme d un nom de bloc précédé d un u* en d autre terme ce qui est programmé dans le bloc peu ne pas fonctionner quand ce bloc est fermé et reprend ces attributions de définition de bloc aux champs sur le nom du bloc il faut donc éditer les attributs un par un quand le bloc est fermé puis lancer la commande formule en choisissant au départ le bloc puis ta commande et faire pour chaque champ la meme manip normalement ça fonctionne Citer
Luna Posté(e) le 29 juin 2023 Posté(e) le 29 juin 2023 Coucou, @dc01, la dénomination des références de blocs ayant un *U--- c'est lorsque les blocs possèdent des propriétés dynamiques. Or ici le bloc créé n'est pas dynamique si mes souvenirs sont bons via la commande TotalArea. @Dersou Je ne connais pas par cœur la structure du programme de Pline_Block et TotalArea mais il peut y avoir plusieurs solutions à ton problème. Cependant tout va dépendre de ce dont tu as réellement besoin de faire EN PLUS de ces programmes. Ce que je suggère c'est de laisser ces programmes intacts et de créer un autre programme pour gérer ce que tu souhaites faire en plus (cela permet que si tu as un problème de fonctionnement sur le programme TotalArea par exemple, l'auteur pourra plus facilement corriger le soucis car tout le monde aura le même). Normalement TotalArea créé un bloc avec un attribut dont sa valeur est un champ dynamique objet. Ce champs utilise donc l'ID de la polyligne que tu as dû sélectionner et affiche la propriété "Aire". Cela se traduit par une chaîne de caractère un peu spéciale qu'AutoCAD est capable de lire (ex: %<\AcObjProp Object(%<\_ObjId 2294000122144>%).Area \f "%lu2">% ). Il existe donc plusieurs façons de retrouver le calque de la polyligne à partir du bloc, notamment en utilisant l'ID de la polyligne apparaissant dans le champ dynamique. Le plus simple serait d'avoir un .dwg d'exemple affichant clairement les données de base ainsi que le résultat final (et si possible les étapes souhaitées pour y parvenir). Evidemment si tu as besoin que l'on t'aide à développer un programme il nous faut un maximum d'infos sur ce que tu souhaites au final. Bisous, Luna Citer
(gile) Posté(e) le 30 juin 2023 Posté(e) le 30 juin 2023 Salut, Pline_Block et TotalArea ne fonctionnent pas de la même façon. Pline_Block utilise des attributs avec des champs dynamiques, Total_Area utilise des réacteurs pour mettre à jour des attributs en temps réel. Modifier le LISP TotalArea demande un bonne maitrise du langage LISP, modifier Pline_Block est moins difficile mais il faudrait connaître la version à modifier (il y en a eu de nombreuses). Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Dersou Posté(e) le 30 juin 2023 Auteur Posté(e) le 30 juin 2023 Merci pour vos réponses. Comme je tâtonne avec le LISP, je voulais effectivement débuter avec des modifications sur base de Pline_Block pour aborder la chose. Pour mon premier test d'ajout d'un attribut j'ai ajouté les éléments gras ci dessous: ;;; Pline_block -Gilles Chanteau- 13/04/07 ;;; Insère le bloc "pline_block" après sélection d'une polyligne ;;; Attribut 1 : Nom de la pièce ;;; Attribut 2 : Longueur de la polyligne ;;; Attribut 3 : Aire de la polyligne ;;; Attribut 3 : Calque de la polyligne (defun c:pline_block (/ AcDoc Space bloc nom ent obj ins op reg ech id long aire layer ref) (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) ) ) (if (or (tblsearch "BLOCK" (setq bloc "Pline_block")) (findfile (setq bloc "Pline_block.dwg")) ) (progn ;; attribut "nom de la pièce" (if (not (setq nom (getname "Nom de la pièce"))) (setq nom "") ) (while (not (setq ent (car (entsel))))) (setq obj (vlax-ename->vla-object ent)) (if (= "AcDbPolyline" (vla-get-ObjectName obj)) (progn (if (not (setq ins (getpoint "\nSpécifiez le point d'insertion ou < Centre >: " ) ) ) (progn (if (= (vla-get-closed obj) :vlax-false) (progn (vla-put-closed obj :vlax-true) (setq op T) ) ) (setq reg (vlax-invoke space 'addRegion (list obj)) ins (vlax-get (car reg) 'Centroid) ) (if op (vla-put-closed obj :vlax-false) ) (vla-delete (car reg)) ) ) (if (not (vlax-ldata-get "Pline_block" "ech")) (vlax-ldata-put "Pline_block" "ech" 1) ) (if (not (setq ech (getreal (strcat "\nEntrez le facteur d'échelle <" (rtos (vlax-ldata-get "Pline_block" "ech")) ">: " ) ) ) ) (setq ech (vlax-ldata-get "Pline_block" "ech")) (vlax-ldata-put "Pline_block" "ech" ech) ) (setq id (vla-get-ObjectID obj) ;; Attribut périmètre (m -> m) long (strcat "%<\\AcObjProp Object(%<\\_ObjId " (itoa id) ">%).Length \\f \"%lu2%pr2%ct8[1]\">%" ) ;; Attribut surface (m² -> m²) aire (strcat "%<\\AcObjProp Object(%<\\_ObjId" (itoa id) ">%).Area \\f \"%lu2%pr2%ct8[1]\">%" ) ) ;; Attribut calque de la polyligne layer (strcat "%<\\AcObjProp Object(%<\\_ObjId" (itoa id) ">%).Layer \\f \"%tc1\">%" ) ) (setq ref (vla-InsertBlock Space (vlax-3d-point (trans ins 1 0)) bloc ech ech 1 (angle '(0 0 0) (trans (getvar 'ucsxdir) 0 (trans '(0 0 1) 1 0 T))) ) ) ;; attribution de leur valeur aux attributs (mapcar '(lambda (x y) (vla-put-TextString x y)) (vlax-invoke ref 'GetAttributes) (list nom long aire layer) ) (vla-regen AcDoc acActiveViewport) ) (alert "L'objet sélectionné n'est pas une polyligne.") ) ) (alert "Le bloc \"Pline_block\" est introuvable.") ) (princ) ) Lors de la définition du nouvel attribut dans le bloc je ne parviens pas à faire le lien avec le paramètre de la polyligne. Je suis peut-être sur une fausse route. Citer
Messages recommandés