Aller au contenu

Pirlouit

Membres
  • Compteur de contenus

    14
  • Inscription

  • Dernière visite

Tout ce qui a été posté par Pirlouit

  1. Pirlouit

    Prob sur mon lisp

    Message supprimé
  2. Bonjour, en cherchant sur le net et les différents sujets de Cadxp, je n'ai pas trouvé réponse à un besoin. Si quelqu'un peu me confirmer que cela n'est effectivement pas possible. Ou m'indiquer un lien vers un sujet ou une solution existante ... Je souhaite créer un lisp + DCL permettant de dessiner des panneaux de signalisation directionnel. On rentre les dimensions de panneaux et hauteur de texte et cela dessine les panneaux. Jusque là, pas trop de difficultés. J'en ai déjà fait un sans DCL qui fonctionne. Mais je souhaite voir le résultat dans une zone de ma boite de dialogue par le biais d'un bouton "APERCU", et ainsi modifier mes dimensions tant qu'elles ne me conviennent pas, pour enfin cliquer sur OK qui déchargera la boite de dialogue. Je me suis orienté vers les commandes slide_image et vector_image, mais elles ne semblent pas appropriées. Pour voir un aperçu, suis-je obligé de faire comme la commande existante Autocad "Hachures" qui masque la boite de dialogue lorsqu'on clique sur "Aperçu" afin que l'utilisateur voit le résultat dans la fenêtre objet d'Autocad. Puis ré-affichage de boite de dialogue pour ajustement si le résultat ne me convient pas ? D'avance merci.
  3. 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). Cette fonction suggérée par (gile) fonctionne parfaitement sur toutes les entités que j'ai à traiter (LINE, LWPOLYLINE, ARC, ELLIPSE, SPLINE). J'ai retenu la 2ème méthode (getfiled), qui permet de laisser le choix du chemin d'enregistrement. 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
  4. 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 @+
  5. 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 ! @+
  6. 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 ... @+
  7. 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 ;***********************************************************************************************************
  8. 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))
  9. Pirlouit

    Test code

    Augmenter le retrait Centré
  10. Je rejoins Gile sur la complexité de passer par Entmake pour créer des hachures (j'avais sous estimé la tâche). J'avais également de mon côté testé par élimination les codes DXF indispensables. Il s'avère que peu sont facultatifs. J'ai fini par m'en sortir car mon cas est simple : hachures d'une polyligne fermée composée uniquement de lignes (pas d'arcs ou d'autres formes exotiques). Et pourtant mon code ressemble déjà à une usine à gaz ! En effet, il ne suffit pas d'indiquer l'entité à hachurer (code 330), mais également tous les segments qui la compose (code 72, 10 et 11 pour une polyligne "simple"). Je me garderai bien de partir sur cette voie pour un cas plus complexe. J'ai pris note que d'autres solutions existent : 1) (command "_hatch" ...) Tout se résume en une seule ligne! 2) Vla-AddHatch Malheureusement, je ne maitrise pas encore les vl, vla, vlax et leur syntaxe. Je me contente de copier "bêtement" des lignes de code qui en contiennent. Déjà que quelques subtilités du lisp basique m'échappe encore ... 3) En passant par Entmake Ou comment faire compliqué lorsque des solutions plus simples existent ! Merci Bonuscad pour la version de ElpanovEvgeniy qui fonctionne à merveille. Je connaissais déjà son code "triangulate" qui est assez impressionnant (même s'il manque la gestion des limites extérieures et celle des "cassures" de terrain pour créer des MNT parfaits), ce sera certainement l'objet d'un post ultérieur. En conclusion, pour celles et ceux qui veulent absolument passer par Entmake, préférer la solution préconisée par Bonuscad. Pour éviter de finir avec cela (mon usine à gaz, qui divise un arc, trace une polyligne, la hachure, indique sa surface) : (defun c:Div_arc (/ os ent1 nbdiv defpoly1 defpoly2a defpoly2b defpoly2c defpoly2 defpoly3 a) (setq os (getvar "osmode")) ;récupère le(s) type(s) d'accroche objet (setvar "osmode" 0) ;désactive les accroches objets (setvar "pdmode" 35) ;défini un style de point (setvar "pdsize" -2) ;défini une taille point par rapport à l'écran (setq ent (entlast)) ;récupère la dernière entité créée (setq ent1 (car (entsel "\n ==> Sélectionnez un arc de cercle : "))) (setq nbdiv (getint "\n ==> Nombre de division pour l'arc : ")) (setq ent1def (entget ent1)) ;récupère la définition de l'arc (setq cent (cdr (assoc 10 ent1def))) ;récupère les coordonnées du centre (setq ray (cdr (assoc 40 ent1def))) ;récupère le rayon de l'arc (setq ang1 (cdr (assoc 50 ent1def))) ;récupère l'angle 1 (setq ang2 (cdr (assoc 51 ent1def))) ;récupère l'angle 2 ;Calcul coordonnées points départ et arrivée de l'arc (setq x1 (* ray (cos ang1))) (setq y1 (* ray (sin ang1))) (setq x2 (* ray (cos ang2))) (setq y2 (* ray (sin ang2))) (setq x1scg (+ x1 (nth 0 cent))) (setq y1scg (+ y1 (nth 1 cent))) (setq x2scg (+ x2 (nth 0 cent))) (setq y2scg (+ y2 (nth 1 cent))) ;----------------------------------- (setq lstdiv nil def1 nil def2 nil) (setq defpoly1 (list '(70 . 1) (cons 90 (+ nbdiv 1)) '(100 . "AcDbPolyline") '(62 . 1) '(100 . "AcDbEntity") '(0 . "lwpolyline"))) (setq defpoly1 (cons (list 10 x1scg y1scg) defpoly1)) ;ajoute les coordonnées du point de départ de l'arc (command "_divide" ent1 nbdiv) ;divise l'arc (repeat (- nbdiv 1) (setq ent (entnext ent)) (setq ptent (assoc 10 (entget ent))) ;récupère les coordonnées du point (setq defpoly1 (cons ptent defpoly1)) ;ajoute les coordonnées à la liste );end repeat (setq defpoly1 (cons (list 10 x2scg y2scg) defpoly1)) ;ajoute les coordonnées du point d'arrivée de l'arc (setq defpoly1 (reverse defpoly1)) (entmake defpoly1) ;trace la polyligne (setq ent2 (entlast)) ;récupère le nom de la polyligne ;----------------------------- (command "_area" "o" (entlast)) (setq aire (getvar "area")) ;récupère l'aire de la polyligne ;------------------------------------------- ;-> Récupération définition contour hachures ;------------------------------------------- (setq lst-pts (mapcar 'cdr (vl-remove-if-not ' (lambda (x) (= (car x) 10)) (entget (entlast)) ) ) ) ;récupère les coordonnées d'extrémités de la polyligne (setq cpt1 0) (setq defpoly2a '(72 . 1)) (setq ptfinal1a (list 11 (car (nth 0 lst-pts)) (cadr (nth 0 lst-pts)))) ; coordonnées x du dernier point (setq ptfinal1b (list 10 (car (last lst-pts)) (cadr (last lst-pts)))) ; coordonnées y du dernier point (setq defpoly4 (list defpoly2a ptfinal1b ptfinal1a)) ; dernier segment de polyligne (repeat nbdiv ;(cons '(72 . 1) defpoly2) (setq defpoly2b (list 10 (car (nth cpt1 lst-pts)) (cadr (nth cpt1 lst-pts)) )) ;construit une liste du type (10 256.36 584.752) (setq defpoly2c (list 11 (car (nth (+ 1 cpt1) lst-pts)) (cadr (nth (+ 1 cpt1) lst-pts)) )) (setq defpoly2 (list defpoly2a defpoly2b defpoly2c)) (setq defpoly3 (append defpoly3 defpoly2)) (setq cpt1 (+ cpt1 1)) ) (setq defpoly3 (append defpoly3 defpoly4)) ; contour complet hachures ;----------- ;-> Hachures ;----------- ;Début de définition (setq lst1 (list '(0 . "HATCH") ; Type d'entité ;'(5 . "209") ; <FACULTATIF> Maintien (handle) '(100 . "AcDbEntity") '(67 . 0) ; 0 => espace papier, 1 => espace objet ;'(410 . "Model") ; <FACULTATIF> Nom de la présentation ou "Model" ;'(8 . "0") ; <FACULTATIF> Nom du calque ;'(62 . 94) ; <FACULTATIF> Couleur hachures '(100 . "AcDbHatch") '(10 0 0 0) ; Elevation ? '(210 0 0 1) ; Direction d'extrusion '(2 . "ANSI36") ; Motif de hachures '(70 . 0) ; Solid Fill Flag : 0 => Pattern Fill, 1 => Solid Fill '(71 . 1) ; Associativity Flag : 0 => Non-associative, 1 => Associative '(91 . 1) ; Number of body loops '(92 . 1) ; ?? (cons 93 (+ nbdiv 1)) ; Nb de sommets ou de côtés ?? ) ) ;Fin de définition (setq lst2 (list '(97 . 1) (cons 330 ent2) '(75 . 0) ; Hatch Style : 0 => Normal "Odd Parity", 1 => Hatch Outermost Area only, 2 => Hatch Entire Area, "Holes" included '(76 . 1) ; Hatch Pattern Type : 0 => User-Defined, 1 => Predefined, 2 => Custom '(52 . 0.0) ; Angle hachures en radians '(41 . 10.0) ; Echelle hachures '(77 . 0) '(78 . 1) '(53 . 0.0) '(43 . 0.0) '(44 . 0.0) '(45 . -2.24506) '(46 . 2.24506) '(79 . 0) '(98 . 1) ; Nombre de point de départ '(10 0.0 0.0 0.0) ; Point de départ ) ) (setq defhach (append lst1 defpoly3 lst2)) ; début définition + contour hachures + fin définition (entmake defhach) ;----------------------------- (setq pt_txt (list (+ (/ (+ x1scg x2scg) 2) (/ ray 10)) (/ (+ y1scg y2scg) 2))) ;point d'insertion du texte (entmake (list '(0 . "TEXT") ;insertion du texte relatif à l'aire '(62 . 1) (cons 10 pt_txt) (cons 40 (/ ray 15)) (cons 1 (strcat "Section : " (rtos aire))) (cons 50 (+ (/ (+ ang1 ang2) 2) pi)) '(72 . 0) '(73 . 0))) (setvar "osmode" os) );_end defun Et merci à Gile, Luna, Fraid et Bonuscad de votre aide pour ma 1ère question sur ce forum. @+
  11. Bonjour Fraid, en fait je souhaite connaitre uniquement les éléments de définition indispensables, afin de ne pas avoir à indiquer les 49 retournés par ENTGET.
  12. Quel retour rapide ! Luna, merci pour ce lien, il semble lister l'intégralité des codes liés aux hachures, mais sans identifier ceux indispensables. Enfin je crois, car mon niveau en anglais laisse à désirer !! Gegematic, je ne connaissais effectivement pas la STD LIB qui est une vraie mine d'or. Bizarre que je n'en ai pas entendu parler avant !? Depuis le temps que je parcours les sites et forums liés au lisp. Je pense pouvoir m'en sortir avec STD-ENTMAKE-HATCH, si c'est le cas je posterai une solution qui fonctionne au cas cela serve à quelqu'un. Et dans tous les cas la STD LIB deviendra une de mes références, à l'instar du guide de Giles "Introduction à Autolisp" qui commence à être bien usé, à force de le feuilleter ... Merci de votre contribution rapide (et de qualité) à tous les 2. PS : joyeuses Pâques !
  13. Bonjour, il s'agit de mon 1er post sur ce forum, espérant en respecter le protocole. Voici donc ma 1ère question : je souhaite créer des hachures avec la fonction lisp "ENTMAKE". Cependant, en souhaitant m'inspirer de la définition d'une hachure existante, je m'aperçois que celle-ci est très longue ... Quelqu'un peut-il m'indiquer quels sont les éléments indispensables dans la définition ? Ci-dessous un essai qui ne fonctionne pas ("ent" étant l'entité à hachurer) : (entmake (list '(0 . "HATCH") '(5 . "289") '(100 . "AcDbEntity") '(67 . 0) '(410 . "Model") '(8 . "0") '(100 . "AcDbHatch") '(2 . "ANSI36") '(41 . 0.1) (cons 330 ent)))
  14. Pirlouit

    Test code

    Essai insertion de code : (entmake (list '(0 . "HATCH") '(5 . "289") '(100 . "AcDbEntity") '(67 . 0) '(410 . "Model") '(8 . "0") '(100 . "AcDbHatch") '(2 . "ANSI36") '(41 . 0.1) (cons 330 ent))) )
×
×
  • 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é