Pirlouit Posté(e) le 21 avril 2020 Posté(e) le 21 avril 2020 Je finalise un lisp qui me permet de réaliser un métré des surfaces et longueur par calques de certains types d'entités (LINE, ARC, LWPOLYLINE, CIRCLE, SPLINE,ELLIPSE). Comme je dessine mon projet en affectant chaque calque à un type de prestations, et que je fais toujours une polyligne fermée autour de mes surfaces, c'est simpliste mais me convient. Les résultats s'affichent dans la fenêtre texte d'Autocad + création d'un fichier TXT (afin d'être imprimable). Bref, je suis en phase test sur d'autres projets DWG non réalisés par moi. Et j'ai un plantage que je n'arrive pas à résoudre. Le lisp plante sur une entité de type "LWPOLYLINE" mais dont la particularité semble être un code DXF 102 que je n'ai pas l'habitude de voir.A noter que la commande en "manuel" sur la ligne de commande d'Autocad, elle, fonctionne sur cette même polyligne !? --> (command "_.area" ...), mais pas dans mon lisp !? Ci-dessous, 2 définitions de LWPOLYLINE, la 1ère ne pose aucun souci, la 2ème me plante. Si quelqu'un peut m'aider à identifier la cause, et surtout à la contourner !! D'avance, merci.Polyligne type 1 (RAS)((-1 . <Nom d'entité: 7ffffbb2a50>) (0 . "LWPOLYLINE") (330 . <Nom d'entité: 7ffffb119f0>) (5 . "935D") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 2) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 823978.0 270360.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 823993.0 270360.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0)) Polyligne type 2 (plantage)((-1 . <Nom d'entité: 7ffffbab150>) (0 . "LWPOLYLINE") (5 ."8C05") (102 . "{ACAD_REACTORS") (330 . <Nom d'entité: 7ffffbaef70>) (102 . "}") (330 . <Nom d'entité: 7ffffb119f0>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 2) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 823989.0 270367.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 823988.0 270366.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0)) Pirlouit 21AUTOCAD 2010
Luna Posté(e) le 21 avril 2020 Posté(e) le 21 avril 2020 Salut, Pourquoi ne pas passer par une fonction pour récupérer l'aire de la polyligne comme ceci par exemple pour éviter l'utilisation d'une commande : ;;version vanilla (vl-catch-all-error-p (setq Area (vl-catch-all-apply 'getpropertyvalue (list ename "AREA")))) ;; ou bien en visual (vl-catch-all-error-p (setq Area (vl-catch-all-apply 'vla-get-area (list (vlax-ename->vla-object ename))))) Serait-il possible de connaître l'objet auquel est rattachée la polyligne (les deux codes 330 sont différents) ? Je doute qu'une liaison reactor influe sur la lecture de l'aire de la polyligne cependant mais il y a forcément une explication :3 Bisous,Luna
Pirlouit Posté(e) le 21 avril 2020 Auteur Posté(e) le 21 avril 2020 Salut, Je voyais l'avantage de la commande "_.area" qui permet juste derrière de récupérer les 2 informations dont j'ai besoin :- Longueur -> via (getvar "perimeter")- Aire -> via (getvar "area")je ne maitrise pas du tout les vl, vla, vlax ... Je me contente d'en faire des copier/coller de temps à autres. J'ai essayé malgré tout rapidement tes 2 solutions :Version vanilla : bloque sur 'getpropertyvalue → "erreur: fonction incorrecte: GETPROPERTYVALUE"Version en visual : fonctionne, mais ne permet de récupérer que l'air, pas la longueur ? Je ne suis pas en mesure de t'indiquer à quel objet est rattaché la polyligne pour au moins 2 raisons : je ne sais ce que cela signifie ..., et il s'agit d'un fichier DWG de collègues (issu du logiciel MENSURA que je ne pratique pas). A titre d'info, la partie de mon lisp qui gère la récup des longueurs et aires : ;**************************************************************************************** ;--Récupération longueur et surface-- (defun recup () ;--Récupère la longueur-- (setq lg_ent (cond ((= obj "LINE") ; si line (distance (cdr (assoc 10 entdef)) (cdr (assoc 11 entdef)))) ((= obj "ARC") ; si arc (* (cdr (assoc 40 entdef)) (if (minusp (setq lg_ent (- (cdr (assoc 51 entdef)) (cdr (assoc 50 entdef))))) (+ pi pi lg_ent) lg_ent))) ((= obj "LWPOLYLINE") ; si lwpolyligne (command "_.area" "_o" ent) (getvar "perimeter")) ((= obj "ELLIPSE") ; si ellipse (command "_.area" "_o" ent) (getvar "perimeter")) ((= obj "SPLINE") ; si spline (command "_.area" "_o" ent) (getvar "perimeter")) (T (setq lg_ent 0)) );_cond );_setq ;--Récupère la surface-- (setq sf_ent (cond ((= obj "CIRCLE") ; si circle (command "_.area" "_o" ent) (getvar "area")) ((and (= obj "LWPOLYLINE") (= (cdr (assoc 70 entdef)) 1)) ; si lwpolyligne fermée (command "_.area" "_o" ent) (getvar "area")) ((and (= obj "ELLIPSE") (= (cdr (assoc 41 entdef)) 0)) ; si ellipse fermée (command "_.area" "_o" ent) (getvar "area")) ((and (= obj "SPLINE") (= (cdr (assoc 70 entdef)) 11)) ; si spline fermée (command "_.area" "_o" ent) (getvar "area")) (T (setq sf_ent 0)) );_cond );_setq (setq lg_lay (+ lg_lay lg_ent)) ; incrémente le total de longueur pour ce calque (setq sf_lay (+ sf_lay sf_ent)) ; incrémente le total de surface pour ce calque );_defun recup ;*********************************************************************************************************** Salut, Pourquoi ne pas passer par une fonction pour récupérer l'aire de la polyligne comme ceci par exemple pour éviter l'utilisation d'une commande : ;;version vanilla (vl-catch-all-error-p (setq Area (vl-catch-all-apply 'getpropertyvalue (list ename "AREA")))) ;; ou bien en visual (vl-catch-all-error-p (setq Area (vl-catch-all-apply 'vla-get-area (list (vlax-ename->vla-object ename))))) Serait-il possible de connaître l'objet auquel est rattachée la polyligne (les deux codes 330 sont différents) ? Je doute qu'une liaison reactor influe sur la lecture de l'aire de la polyligne cependant mais il y a forcément une explication :3 Bisous,Luna Pirlouit 21AUTOCAD 2010
Luna Posté(e) le 21 avril 2020 Posté(e) le 21 avril 2020 je ne maitrise pas du tout les vl, vla, vlax ... Je me contente d'en faire des copier/coller de temps à autres. J'ai essayé malgré tout rapidement tes 2 solutions :Version vanilla : bloque sur 'getpropertyvalue → "erreur: fonction incorrecte: GETPROPERTYVALUE" Version en visual : fonctionne, mais ne permet de récupérer que l'air, pas la longueur ? Oki, je comprend parfaitement que tu n'as pas eu le temps de te pencher sur les fonctions vl, vla et vlax. Il est préférable de commencer par les bases :3Le fait que getpropertyvalue renvoit une erreur peut simplement venir de ta version AutoCAD (il me semble mais je ne suis pas sûre, que ces méthodes vanilla aient été ajoutées à partir des versions 2014) En effet, si ton but est de récupérer l'aire et le périmètre d'un objet linéaire, je te suggère ceci (je sais il s'agit de visual lisp donc on s'éloigne des bases mais ça reste le plus efficace) : ;;Récupération de l'aire d'un objet linéaire dont son nom d'entité vaut "ename" : (if (vl-catch-all-error-p (setq Area (vl-catch-all-apply 'vla-get-area (list (vlax-ename->vla-object ename))))) (setq Area 0.0) ;;Si (vl-catch-all-apply) retourne une erreur (dans le cas d'un bloc qui ne possède pas de propriété d'aire par exemple), permet de ne pas interrompre le programme et renvoie une aire nulle ) ;;Récupération du périmètre d'un objet linéaire dont son nom d'entité vaut "ename" : (if (vl-catch-all-error-p (setq Lg (vl-catch-all-apply 'vla-get-length (list (vlax-ename->vla-object ename))))) (setq Lg 0.0) ;;Si (vl-catch-all-apply) retourne une erreur (dans le cas d'un bloc qui ne possède pas de propriété de périmètre par exemple), permet de ne pas interrompre le programme et renvoie une longueur nulle ) Pour expliquer rapidement le fonctionnement : - l'utilisation du (if) permet de "capter" les erreurs lors de la récupération de données et de passer outre en définissant la variable d'aire ou de longueur à 0.0, ce qui ne perturbe pas l'exécution du programme. - les fonctions (vl-catch-all-apply) et (vl-catch-all-error-p) sont souvent utilisées ensemble car c'est justement grâce à elles que le programme est capable de "contenir" une erreur sans s'arrêter (voir aide AutoCAD (vl-catch-all-apply) et (vl-catch-all-error-p)) Pour vulgariser un peu leur utilisation, la fonction (vl-catch-all-apply) exécute la fonction qui lui est passée en premier argument (ici (vla-get-area) ou (vla-get-length) - Attention, il ne faut pas utiliser les parenthèses mais une ' -), le second argument correspond aux arguments de la fonction évaluée sous forme de liste. Si la fonction évaluée fonctionne correctement, alors (vl-catch-all-apply) retourne le résultat de la fonction (d'où le (setq) situé à ce niveau), sinon, renvoie un objet de type error. L'erreur ainsi rencontrée ne stoppe pas le programme, ce qui est très efficace.La fonction (vl-catch-all-error-p) se contente de retourner T s'il évalue un objet de type error, nil sinon. - les fonctions (vla-get-property), donc ici on recherche les propriétés nommée Area et Length, d'où (vla-get-area) et (vla-get-length), nécessite des VLA-OBJECT. Ce qu'il faut comprendre, c'est que les fonctions vanilla comme (entget) par exemple utilise l'ename d'un objet (qui n'est pas toujours identique selon la session) pour accéder à sa liste DXF.Liste DXF de ta polyligne gênante:((-1 . <Nom d'entité: 7ffffbab150>) (0 . "LWPOLYLINE") (5 ."8C05") (102 . "{ACAD_REACTORS") (330 . <Nom d'entité: 7ffffbaef70>) (102 . "}") (330 . <Nom d'entité: 7ffffb119f0>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 2) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 823989.0 270367.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 823988.0 270366.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0)) Les VLA-OBJECT ne sont rien d'autre qu'une écriture différente de l'ename de ton entité. C'est d'ailleurs pour cela que l'on peut facilement switcher entre l'ename et le VLA-OBJECT d'une même entité. Ce qui change, c'est le codage. Le visual LISP, qui travaille avec les VLA-OBJECT fonctionne comme du VBA (si jamais tu as eu l'occassion d'en faire) donc c'est une écriture un peu complexe au début mais c'est comme le LISP, il suffit de s'entraîner... :3 La fonction (getpropertyvalue) a été ajouté assez récemment pour justement permettre d'accéder plus facilement aux propriétés d'un objet (propriétés semblables aux propriétés présentes dans la palette des propriétés) sans faire appel aux méthodes (vla-get-property) et ainsi conserver l'écriture "vanilla" (bon il y a d'autres raisons bien sûr ^^). Donc les deux méthodes fonctionnent mais ne font pas appel aux mêmes principe d'écriture... Pour ma part, je ne maîtrise pas non plus les méthodes Visual LISP et j'aurais tendance à préférer les fonctions vanilla mais si ta version d'AutoCAD ne te permet d'avoir accès à cet fonction, il est plus simple et juste de passer par les fonctions (vla-get-property).En effet, cela permet d'éviter l'utilisation du (cond) pour chaque type d'entité linéaire et t'évite le calcul des longueurs (arc par exemple) et l'utilisation des command+getvar dans le cas des entités linéaires complexes... Je ne suis pas en mesure de t'indiquer à quel objet est rattaché la polyligne pour au moins 2 raisons : je ne sais ce que cela signifie ..., et il s'agit d'un fichier DWG de collègues (issu du logiciel MENSURA que je ne pratique pas)Dans la liste DXF que tu as envoyée (cf ci-dessus), il existe un code 102 faisant référence à un réacteur. Ces réacteurs sont des liaisons entre des entités pour que, si une entité est modifiée par exemple, l'autre entité liée est modifiée également.Pour un exemple concret, une hachure associative correspond justement à une liaison directe entre ta hachure et ton contour. Si ton contour est modifié au niveau de sa géométrie, la hachure va suivre pour conserver le contour.Donc je suppose ici que c'est le cas de ta polyligne (elle doit être liée à un objet) mais encore une fois, je doute sincèrement que cette liaison interfère avec l'utilisation de la commande "AREA". Ce réacteur (situé au code DXF 102) fait référence à l'objet lié via le code 330 :((-1 . <Nom d'entité: 7ffffbab150>) (0 . "LWPOLYLINE") (5 ."8C05") (102 . "{ACAD_REACTORS") (330 . <Nom d'entité: 7ffffbaef70>) (102 . "}") (330 . <Nom d'entité: 7ffffb119f0>) (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 2) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 823989.0 270367.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 823988.0 270366.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0)) ;; on extrait uniquement la partie "réacteur" : ( (102 . "{ACAD_REACTORS") ;; Début du marqueur du réacteur (330 . <Nom d'entité: 7ffffbaef70>) ;; Nom d'entité liée à la polyligne (102 . "}") ;; Fin du marqueur du réacteur ) ;;Pour récupérer les informations sur l'objet lié, tu peux utiliser ceci dans la barre de commande AutoCAD et en cliquant sur la polyligne problématique ou bien remplacer le (car (entsel)) par ename et évaluer cette expression via l'espion avec un arrêt sur erreur : (entget (cdr (assoc 330 (entget (car (entsel "\nSélectionner la polyligne :")))))) Bon, je tiens à m'excuser d'avance... J'ai la fâcheuse manie de beaucoup blablater sans faire avancer le schmilblick... Bisous,Luna
Pirlouit Posté(e) le 21 avril 2020 Auteur Posté(e) le 21 avril 2020 Un grand merci Luna pour le temps accordé. Quel pavé !Je commence à y voir un peu plus clair. Mais je vais m'arrêter là pour aujourd'hui, mon esprit ne suit plus ...Je tente le remplacement de tes propositions dans mon code dés demain, et ne manquerai pas de tenir au courant de l'issue. PS : pas de souci, tu es très clair ! Mais bien plus calée que moi dans le domaine ... @+ Pirlouit 21AUTOCAD 2010
lecrabe Posté(e) le 22 avril 2020 Posté(e) le 22 avril 2020 Hello Si je me souviens bien les fonctions GETPROPERTYVALUE , SETPROPERTYVALUE , etc ont ete ajoutees a la version 2012 a cause de la version Mac !? LA SANTE (Stay Safe), Bye, lecrabe "triste" Automne 2020, la retraite Autodesk Expert Elite Team
Pirlouit Posté(e) le 22 avril 2020 Auteur Posté(e) le 22 avril 2020 Luna, encore merci pour ton aide. J'ai testé les solutions que tu proposes. Il y a 1 bonne nouvelle et plusieurs mauvaises, • Bonne nouvelle : j'ai utilisé 'vla-get-length dans mon lisp, ça ne plante pas sur la polyligne qui posait problème auparavant.• Mauvaises nouvelles : j'ai testé à part 'vla-get-length et 'vla-get-area sur les différentes entités qui m'intéressent. Conclusions,'vla-get-length : "error" sur ARC, CIRCLE, SPLINE, ELLIPSE'vla-get-area : fonctionne sur tout ! Sauf sur LINE bien entendu :P Si je n'arrive pas à isoler la cause de mon plantage, j'utiliserai ta solution 'vla-get-length uniquement sur les LWPOLYLINE dans mon lisp. Ca reste une solution viable, merci ! Il faudra que je me plonge sérieusement dans les fonctions vl... même si cela ne m'enchante pas. Je maîtrise tout juste l'autolisp, alors de nouvelles fonctions avec leurs syntaxes propres ! Sans parler du mix entre les 2 (autolisp / vl).J'ai pratiqué le VBA il y a quelques années mais sur ... EXCEL ! Langage très facile à prendre en main, intuitif. Permet de faire des codes dont on se croyait pas capable en peu de temps. Sans parler de la création de boites de dialogues en 3 mn (en copier/glisser). Bref, en créant ma 1ère boite de dialogue en lisp, j'ai cru remonter à la préhistoire ... Mais ça fonctionne ! J'aurais juste 2 questions supplémentaires :1) Je n'arrive pas à maitriser le répertoire où va aller s'enregistrer mon fichier .TXT d'export des résultats. Si j'ai tout saisi, • (setq file (open "C:\\Resultats.txt" "w")) -> enregistrement à la racine C:, ne m'intéresse pas.• (setq file (open "C:\Resulats.txt" "w")) -> identique à "Resultats.txt", enregistrement dans le répertoire "Mes documents". MAIS, un jour me l'enregistre sous "Mes documents" et le lendemain dans un répertoire inconnu dans les entrailles su PC !??Comment construire le chemin en récupérant celui du dessin DWG courant par exemple, ou en indiquant un chemin de son choix (qui ressemblerait à la fonction "GETFILED", qui elle, permet d'ouvrir un fichier déjà existant).Récupérer la variable Autocad SAVEFILE ne semble pas fiable. Renvoi à un répertoire "temp". 2) Je ne trouve pas la variable Autocad (ou un autre moyen) qui me permet de savoir si je suis dans une présentation ou dans l'onglet "Objet". Pour ensuite, suivant le résultat forcer à basculer par (command "objet"). Encore merci pour le déplantage ! @+ Pirlouit 21AUTOCAD 2010
(gile) Posté(e) le 22 avril 2020 Posté(e) le 22 avril 2020 Pour la longueur des objets curviligne (excepté les droites et demi-droites bien sûr) utiliser :(vlax-curve-getDistAtParam curve (vlax-curve-getEndParam curve)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Luna Posté(e) le 22 avril 2020 Posté(e) le 22 avril 2020 Salut, Mauvaises nouvelles : j'ai testé à part 'vla-get-length et 'vla-get-area sur les différentes entités qui m'intéressent. Conclusions,'vla-get-length : "error" sur ARC, CIRCLE, SPLINE, ELLIPSEJe peux te proposer ceci, qui ne se base pas sur l'existence d'une propriété longueur pour l'entité mais sur les paramètres géométrique de l'objet donc tu n'auras plus de problème avec les spline, arc, circle et ellipse(setq Lg (vlax-curve-getDistAtParam (vlax-ename->vla-object ename) (vlax-curve-getEndParam (vlax-ename->vla-object ename))))Ahh bah coiffée au poteau par maître (gile) sur ce coup là :3 Bon par contre, il s'agit encore de visual lisp, désolé d'avance... :.(Le soucis c'est que si l'on ne souhaite pas utiliser les fonctions vl, vla, vlax, ... ça demande de passer par des commandes et des calculs et les sources d'erreurs sont plus grandes (du moins, il s'agit de mon avis perso' !) ainsi que le temps d'exécution. Je serais ravie de pouvoir t'aider si jamais tu as des questions sur les bases du LISP (à vrai dire je n'ai commencer la programmation il n'y a qu'un an, donc je suis loin de connaître le LISP et encore moins le visual LISP ! --"). 1) Je n'arrive pas à maitriser le répertoire où va aller s'enregistrer mon fichier .TXT d'export des résultats. Si j'ai tout saisi,• (setq file (open "C:\\Resultats.txt" "w")) -> enregistrement à la racine C:, ne m'intéresse pas.• (setq file (open "C:\Resulats.txt" "w")) -> identique à "Resultats.txt", enregistrement dans le répertoire "Mes documents". MAIS, un jour me l'enregistre sous "Mes documents" et le lendemain dans un répertoire inconnu dans les entrailles su PC !??Comment construire le chemin en récupérant celui du dessin DWG courant par exemple, ou en indiquant un chemin de son choix (qui ressemblerait à la fonction "GETFILED", qui elle, permet d'ouvrir un fichier déjà existant).Récupérer la variable Autocad SAVEFILE ne semble pas fiable. Renvoi à un répertoire "temp". Pour commencer, si tu souhaites enregistrer le fichier .txt dans le même dossier que ton dessin, tu peux utiliser la variable système DWGPREFIX (setq filepath (getvar "DWGPREFIX")). Celle-ci te renvoie le chemin d'accès de ton fichier DWG courant sous forme de chaîne de caractères. Ensuite pour faire cela, je n'ai pas encore vraiment de maîtrise dans le domaine de l'écriture de fichiers .txt donc je vais t'aider au mieux :3 (setq file (open (strcat (getvar "DWGPREFIX") "Résultats.txt") "w")) (write-line [expr...]) ;;Peut se situer dans un foreach ou une boucle en fonction de la manière dont tu conserves tes résultats (close file) ;;========================================================;; ;;Si tu préfères en effet passer par une boîte de dialogue pour contrôler la position de ton fichier .txt et changer le nom si besoin (existence de deux fichiers...) (setq file (open (getfiled Title "Résultats" "txt" 1) "w")) ;;Title correspond au nom de ta boîte de dialogue (= l'entête), cf. Aide AutoCAD sur (getfiled) (write-line [expr...]) ;;Peut se situer dans un foreach ou une boucle en fonction de la manière dont tu conserves tes résultats (close file) Tu as donc le choix entre prendre le chemin d'accès de ton .dwg (1ère méthode) ou en passant par une boîte de dialogue (2nde méthode).Voici l'aide associer pour (getfiled) si besoin :3Car (getfiled) n'ouvre pas un fichier existant, elle renvoie le chemin d'accès pour le fichier spécifié :3 ici, le dernier argument signifie qu'il s'agit d'un nouveau document, mais pour ouvrir ce-dit document, il faut tout de même passer par (open) et (close). 2) Je ne trouve pas la variable Autocad (ou un autre moyen) qui me permet de savoir si je suis dans une présentation ou dans l'onglet "Objet". Pour ensuite, suivant le résultat forcer à basculer par (command "objet"). Je te suggère la variable système CTAB qui renvoie le nom de la présentation en cours d'utilisation, donc si tu te trouves en espace objet, (getvar "CTAB") renvoie "Model" (et vouih c'est en anglais :3) et si tu es en espace présentation, la variable système renvoie le nom de la présentation.Mais il existe également la variable système TILEMODE qui est un peu plus générale car elle définie uniquement si on est en espace objet ou papier (correspondant à la dernière présentation activée)Autrement dit, je peux te proposer une méthode semi-brutale mais si ton programme ne doit fonctionner qu'en espace objet :(setvar "TILEMODE" 1) Voici également un lien vers un document primordial pour démarrer avec AutoCAD : Liste des Variables systèmes AutoCAD (par rebcao)Un petit ctrl+F pour trouver ton bonheur et ensuite rechercher dans l'aide AutoCAD le détail sur le fonctionnement de la variable système :3 Du coup voici pour TILEMODEpour que tu comprennes sont fonctionnement.Je crois que je ne me suis pas égarée cette fois-ci ^^" Bisous,Luna
(gile) Posté(e) le 22 avril 2020 Posté(e) le 22 avril 2020 Pour info, contrairement à ce qui est dit dans l'aide, les fonctions vlax-curve fonctionnent aussi avec des arguments de type ENAME (elles s'exécutent même un peu plus rapidement).((lambda (curve) (vlax-curve-getDistAtParam curve (vlax-curve-getEndParam curve))) (car (entsel))) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Pirlouit Posté(e) le 22 avril 2020 Auteur Posté(e) le 22 avril 2020 Et bien entre la réponse de (gile) et les précisions de Luna, je vais pouvoir finaliser mon lisp ! Tout est clair !Juste étonné pour GETFILED, mais je te fais confiance, je vais regarder ça. Et merci à tous les 2 @+ Pirlouit 21AUTOCAD 2010
Pirlouit Posté(e) le 24 avril 2020 Auteur Posté(e) le 24 avril 2020 Bon, et bien après plusieurs tests, tout fonctionne parfaitement. Je n'ai plus qu'à ajouter une boite de dialogue à mon lisp pour le rendre plus convivial (directement dans le .lsp sans créer de .dcl). Pour la longueur des objets curviligne (excepté les droites et demi-droites bien sûr) utiliser : (vlax-curve-getDistAtParam curve (vlax-curve-getEndParam curve)) Cette fonction suggérée par (gile) fonctionne parfaitement sur toutes les entités que j'ai à traiter (LINE, LWPOLYLINE, ARC, ELLIPSE, SPLINE). Tu as donc le choix entre prendre le chemin d'accès de ton .dwg (1ère méthode) ou en passant par une boîte de dialogue (2nde méthode).Voici l'aide associer pour (getfiled) si besoin :3Car (getfiled) n'ouvre pas un fichier existant, elle renvoie le chemin d'accès pour le fichier spécifié :3 ici, le dernier argument signifie qu'il s'agit d'un nouveau document, mais pour ouvrir ce-dit document, il faut tout de même passer par (open) et (close).J'ai retenu la 2ème méthode (getfiled), qui permet de laisser le choix du chemin d'enregistrement. Je te suggère la variable système CTAB qui renvoie le nom de la présentation en cours d'utilisation, donc si tu te trouves en espace objet, (getvar "CTAB") renvoie "Model" (et vouih c'est en anglais :3) et si tu es en espace présentation, la variable système renvoie le nom de la présentation.Mais il existe également la variable système TILEMODE qui est un peu plus générale car elle définie uniquement si on est en espace objet ou papier (correspondant à la dernière présentation activée)Autrement dit, je peux te proposer une méthode semi-brutale mais si ton programme ne doit fonctionner qu'en espace objet : (setvar "TILEMODE" 1)J'ai utilisé la variable CTAB, ça me paraissait plus "propre". Donc encore un grand merci à vous 2, Luna & (Gile), Un petit extrait du fichier .txt d'export de mes résultats. Ca ne vous servira pas, mais lorsque l'on est content d'être parvenu à ses fins, on aime partager son bonheur ... :D \\data\DONNEES_UTILISATEURS\Documents\BOULOT\Voirie.dwg Vendredi, 24 Avril 2020 - 11:04 ################################################## ################### RESULTATS #################### ################################################## Types entités retenues pour le calcul des lg : -> LINE, ARC, LWPOLYLINE, ELLIPSE, SPLINE. Types entités retenues pour calcul des surfaces : -> CIRCLE, LWPOLYLINE, ELLIPSE, SPLINE. ################################################## ********** _Asphalte ********** Nb d'entités prises en compte : 8 sur 9 --> Longueur pour le calque : 585.36 m --> Surface pour le calque : 269.99 m2 ---------------------------------------- ********** _BorduresCS1 ********** Nb d'entités prises en compte : 0 sur 0 --> Longueur pour le calque : 0 m --> Surface pour le calque : 0 m2 ---------------------------------------- ********** _BorduresT2 ********** Nb d'entités prises en compte : 8 sur 8 --> Longueur pour le calque : 395.44 m --> Surface pour le calque : 0 m2 ---------------------------------------- ********** _Chaussee ********** Nb d'entités prises en compte : 1 sur 2 --> Longueur pour le calque : 226.01 m --> Surface pour le calque : 756.23 m2 ---------------------------------------- ********** _Engazonnement ********** Nb d'entités prises en compte : 8 sur 9 --> Longueur pour le calque : 553.1 m --> Surface pour le calque : 363.25 m2 ---------------------------------------- ********** _ReseauEP ********** Nb d'entités prises en compte : 3 sur 7 --> Longueur pour le calque : 54.69 m --> Surface pour le calque : 0 m2 Pirlouit 21AUTOCAD 2010
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant