Ksow
Membres-
Compteur de contenus
18 -
Inscription
-
Dernière visite
-
Jours gagnés
3
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Ksow
-
Salut, Effectivement tu as raison! C'est plutôt étrange car si je rentre dans le bloc de ré-hausse il est à la bonne échelle. Comme tu dis j'ai du avoir un problème lors de son importation, je vais essayé de régler ça. Sinon concernant l'utilisation d'un seul bloc avec dans une seule unité et d'utiliser une échelle est tout simplement dû au fait que je ne réussissais pas à le faire... Du coup la solution que j'ai trouvé a été de créer plusieurs blocs d'échelle différente... Merci :) EDIT : il s'agissait bien d'un problème d'échelle pour mes blocs, je les ai modifié un par un et tout est bon maintenant. J'ai vérifier toutes mes dimensions et tout correspond bien à ce qui est souhaité. Encore merci pour me l'avoir signalé !
-
Salut et merci pour l'info ! J'ai essayé et ça fonctionne très bien :) J'ai mis le programme à jour. Bonne journée. Ksow
-
Merci par rapport à l'écriture de mon lisp, j'essaye d'écrire le plus clair possible histoire de ne pas me perdre non plus quand je travaille dessus. A vrai dire je suis tout aussi débutant haha.. En tout cas, si ça t'a aidé et bien tant mieux :D Ci-joint le fichier DWG qui me sert de support lors de mes essais : https://transfernow.net/8215g2b5ibfa
-
Bonjour ! Oui c'est encore moi, le mec chiant avec son LISP de quadrillage :D MAIS cette fois-ci je tenais à partager un programme que j'ai fait en parallèle sur l'insertion automatique de blocs dynamiques de banches pour la réalisation de calepinage (et de rotation de banches). Ci-joint la représentation des blocs dynamiques avec plusieurs visibilités : Donc le but du programme est l'insertion automatique de banches avec le choix entre les différentes visibilités (avec/sans ré-hausse/sous-hausse) mais aussi le fait de pouvoir incrémenter le jour de rotation et ranger les banches par calques selon le jour. De plus j'ai ajouté la possibilité de simplifier les blocs en désactivant un calque qui permet de n'avoir plus que les joints et les trous de banches (en vert et rouge) ce qui reste plus agréable pour dessiner. Si je partage ce programme, déjà si jamais quelqu'un en a besoin et bien tant mieux, sinon c'est pour m'en servir pour apprendre. J'aimerai savoir si vous avez une idée de comment l'améliorer (je pars du principe qu'il est toujours possible d'améliorer un programme) tout aussi bien dans l'écriture que dans son utilisation et m'expliquer pourquoi, voilà tout. :P Ci-joint le programme LISP : (Edit suite à la remarque de eklundh80) ;; +---------------------------+ ;; | Projet : CALEPINAGE | ;; +---------------------------+ ;;;***************** ;;; DONNEES ;;;***************** ;;Recuperation et redefinition des donnees utilisateur (defun init () (setq acrobj (getvar "OSMODE")) ;Accrochage aux objets (setq units_angle (getvar "AUNITS")) ;Unites angulaire (setq nbdeci (getvar "LUPREC")) ;Nombre de decimal (setq attreq (getvar "ATTREQ")) (setq attdia (getvar "ATTDIA")) (setvar "OSMODE" 167) ;Accrobj (Ext'/Mil'/Centre/Intersect'/Perpendi') (setvar "AUNITS" 0) ;Angle en degres (setvar "LUPREC" 2) ;Decimale choisie : 2 (setvar "ATTREQ" 1) (setvar "ATTDIA" 0) ) ;;RàZ des modifications des donnees utilisateur (defun reinit () (setvar "OSMODE" acrobj) (setvar "AUNITS" units_angle) (setvar "LUPREC" nbdeci) (setvar "ATTREQ" attreq) (setvar "ATTDIA" attdia) ) (defun IncrCalq (name value inf sup) (cond ((= calq_color sup) (setq calq_color inf)) ((or (= calq_color nil) (< calq_color inf) (> calq_color sup)) (setq calq_color value)) ((and (<= calq_color sup) (>= calq_color inf)) (setq calq_color (1+ calq_color))) ) (setq i (1+ i)) (setq calq_name (strcat name (rtos i 2 0))) (VerifCalq calq_name calq_color "CONTINUOUS") ) (defun VerifCalq (name color typel) (if (not (tblsearch "LAYER" name)) (command "_LAYER" "N" name "CO" color name "TL" typel name "") ) (command "_LAYER" "CH" name "") ) (defun Ins_Banche (Pt) (cond ((= SH RH "Non") (setq Chx "SH / RH" Num "0")) ((and (/= SH "Non") (/= RH "Non")) (setq Chx "SH / RH" Num (strcat SH " / " RH))) ((and (= SH "Non") (/= RH "Non")) (setq Chx "RH" Num RH)) ((and (/= SH "Non") (= RH "Non")) (setq Chx "SH" Num SH)) ) (setq Vis (strcat Chx " - " Num)) (setq name (strcat "Bloc_Banche_" Dim)) (command "-INSERER" name Pt 1 1 0 "") (cond ((= Vue "Face") (setpropertyvalue (entlast) (strcat "AcDbDynBlockProperty" "Visibilité1") Vis)) ((= Vue "Dessus") (setpropertyvalue (entlast) (strcat "AcDbDynBlockProperty" "Visibilité1") Vue)) ) ) ;;; ***************** ;;; PROGRAMME ;;; ***************** (defun c:CALEPINAGE (/ Choix_unit Choix Dim Vue SH RH Chx Num name acrobj units_angle nbdeci attreq attdia) (init) (initget 1 "MIllimetre Centimetre MEtre") (setq Choix_unit (getkword "\nSpécifier l'unité du dessin [MIllimetre/Centimetre/Metre] : ")) (cond ((= Choix_unit "MIllimetre") (setvar "INSUNITS" 4)) ((= Choix_unit "Centimetre") (setvar "INSUNITS" 5)) ((= Choix_unit "MEtre") (setvar "INSUNITS" 6)) ) (if (null i) (setq i 0)) (initget "62.5 125 250") (setq Dim (cond ((getkword "\nQuelle taille de banche souhaitez-vous implanter [62.5/125/250] <250> ?")) ("250"))) (initget "100 150 Non") (setq SH (cond ((getkword "\nSouhaitez-vous une sous-hausse [100/150/Non] <Non> ?")) ("Non"))) (initget "500 Non") (setq RH (cond ((getkword "\nSouhaitez-vous une ré-hausse [500/Non] <Non> ?")) ("Non"))) (initget "Face Dessus") (setq Vue (cond ((getkword "\nSous quelle vue souhaitez-vous l'implanter [Face/Dessus] <Dessus> ? ")) ("Dessus"))) (while (/= Choix "Quitter") (initget "J-Incrément Banche Quitter Implanter") (if (null (setq Choix (getkword "\nQue souhaitez-vous faire [J-Incrément/Banche/Quitter] <Implanter> ? "))) (progn (setq Choix "Implanter") (while (setq Pt (getpoint "\nVeuillez saisir un nouveau point d'insertion : ")) (Ins_Banche Pt) ) ) (cond ((= Choix "J-Incrément") (IncrCalq "00-CALEPINAGE JOUR " 1 1 7)) ((= Choix "Banche") (progn (initget "62.5 125 250") (setq Dim (cond ((getkword "\nQuelle taille de banche souhaitez-vous implanter [62.5/125/250] <250> ? ")) ("250")) ) (initget "100 150 Non") (setq SH (cond ((getkword "\nSouhaitez-vous une sous-hausse [100/150/Non] <Non> ?")) ("Non")) ) (initget "500 Non") (setq RH (cond ((getkword "\nSouhaitez-vous une ré-hausse [500/Non] <Non> ?")) ("Non")) ) (initget "Face Dessus") (setq Vue (cond ((getkword "\nSous quelle vue souhaitez-vous l'implanter [Face/Dessus] <Dessus> ?")) ("Dessus")) ) ) ) ) ) ) ) Bonne journée. Ksow
-
EDIT 19.07.2019 : Je transmets ici mon programme au cas où cela pourrait servir. (finir le programme le jour de son anniversaire c'est quand même assez comique) ;; +---------------------------------------------------+ ;; | Projet : QUADRILLAGE DE REFERENCE | ;; +---------------------------------------------------+ ;;;***************** ;;; DONNEES ;;;***************** (defun init () (setq acrobj (getvar "OSMODE")) (setq units_angle (getvar "AUNITS")) (setq nbdeci (getvar "LUPREC")) (setq attreq (getvar "ATTREQ")) (setq attdia (getvar "ATTDIA")) (setq units (getvar "INSUNITS")) (setvar "OSMODE" 167) (setvar "AUNITS" 0) (setvar "LUPREC" 0) (setvar "ATTREQ" 1) (setvar "ATTDIA" 0) ) (defun reinit () (setvar "OSMODE" acrobj) (setvar "AUNITS" units_angle) (setvar "PLINEWID" 0) (setvar "ATTREQ" attreq) (setvar "ATTDIA" attdia) (setvar "INSUNITS" units) (setvar "LUPREC" nbdeci) ) (defun Ins_Bloc (Pt Ht_NGF) (setq bloc_name (strcat "BLOC_" axe unit)) (command "-INSERER" bloc_name Pt 1 1 0 Ht_NGF) ) ;;; ***************** ;;; PROGRAMME ;;; ***************** (defun c:NGF () (init) (if (not (tblsearch "LAYER" "00-QUADRILLAGE-NGF")) (command "_LAYER" "N" "00-QUADRILLAGE-NGF" "CO" "230" "00-QUADRILLAGE-NGF" "TL" "AXES" "00-QUADRILLAGE-NGF" "") ) (command "_LAYER" "CH" "00-QUADRILLAGE-NGF" "") (setvar "CECOLOR" "DUCALQUE") (initget 1 "MIllimètre CEntimètre MEtre") (setq Choix_unit (getkword "\nSpécifier l'unité de dessin : [MIllimètre/CEntimètre/MEtre] ")) (cond ((= Choix_unit "MIllimètre") (setq unit "mm" coeff_unit 1000.0) (setvar "INSUNITS" 4) ) ((= Choix_unit "CEntimètre") (setq unit "cm" coeff_unit 100.0) (setvar "INSUNITS" 5) ) ((= Choix_unit "MEtre") (setq unit "m" coeff_unit 1.0) (setvar "INSUNITS" 6) ) ) (setq axe "NGF_") (prompt "\nDessin des axes HORIZONTAUX :") (initget 1 "Point Distance Saisie") (setq Choix_trace (getkword "\nVeuillez préciser si vous souhaitez choisir des points ou si vous souhaitez entrer les niveaux NGF [Point/Distance/Saisie] : ")) (setq Pt_ref (getpoint "\nVeuillez renseigner un point de référence : ")) (setq Y-Pt_ref (cadr Pt_ref)) (setq X-Pt_ref (- (car Pt_ref) (* 1 coeff_unit))) (setq Ht_ref (getreal "\nVeuillez renseigner le niveau NGF du point de référence (en m) : ")) (command "_XLINE" "H" Pt_ref "") (Ins_Bloc (list X-Pt_ref Y-Pt_ref (caddr Pt_ref)) (strcat (if (< Ht_ref 0) "-" "+") (rtos Ht_ref 2 2) " NGF")) (cond ((= Choix_trace "Point") (while (setq Pt_Ins (getpoint "\nVeuillez renseigner un point altimétrique (ENTRER pour terminer) : ")) (setq Ht_Ins (+ Ht_ref (/ (- (cadr Pt_Ins) Y-Pt_ref) coeff_unit))) (setq Pt_Ins (list X-Pt_ref (cadr Pt_Ins) (caddr Pt_ref))) (command "_XLINE" "H" Pt_Ins "") (Ins_Bloc Pt_Ins (strcat (if (< Ht_Ins 0) "-" "+") (rtos Ht_Ins 2 2) " NGF")) ) ) ;;;; ((= Choix_trace "Distance") (while (setq Pt_1 (getpoint "\nSpécifier le point de départ")) (setq Pt_2 (getpoint "\nSpécifier le point suivant")) (setq Dist_PtSCU (distance Pt_1 Pt_2)) (setq PtSCU (list X-Pt_ref (+ Y-Pt_ref Dist_PtSCU) (caddr Pt_ref))) (setq NewVal (+ Ht_ref (/ (- (cadr PtSCU) Y-Pt_ref) coeff_unit))) (command "_XLINE" "H" PtSCU "") (Ins_Bloc PtSCU (strcat (if (< NewVal 0) "-" "+") (rtos NewVal 2 2) " NGF")) ) ) ;;;; ((= Choix_trace "Saisie") (while (setq Ht_Ins (getreal "\nVeuillez renseigner un niveau NGF (en m) (ENTRER pour terminer) : ")) (setq Pt_Ins (list X-Pt_ref (+ Y-Pt_ref (* (- Ht_Ins Ht_ref) coeff_unit)) (caddr Pt_ref))) (command "_XLINE" "H" Pt_Ins "") (Ins_Bloc Pt_Ins (strcat (if (< Ht_Ins 0) "-" "+") (rtos Ht_Ins 2 2) " NGF")) ) ) ) (setq axe "DIST_") (command "_XLINE" "V" Pt_ref "") (setq Y-Pt_ref (- (cadr Pt_ref) (* 2 coeff_unit))) (setq X-Pt_ref (car Pt_ref)) (Ins_Bloc (list X-Pt_ref Y-Pt_ref (caddr Pt_ref)) (strcat "+" "0.00" " m")) (prompt "\nDessin des axes VERTICAUX :") (initget 1 "Point Distance Saisie") (setq Choix_trace (getkword "\nVeuillez préciser si vous souhaitez choisir des points ou si vous souhaitez entrer les distances [Point/Distance/Saisie] : ")) (setq Dist_ref 0) (cond ((= Choix_trace "Point") (while (setq Pt_Ins (getpoint "\nVeuillez renseigner un point distant du point de référence (ENTRER pour terminer) : ")) (setq Dist_Ins (+ Dist_ref (/ (- (car Pt_Ins) X-Pt_ref) coeff_unit))) (setq Pt_Ins (list (car Pt_Ins) Y-Pt_ref (caddr Pt_ref))) (command "_XLINE" "V" Pt_Ins "") (Ins_Bloc Pt_Ins (strcat (if (< Dist_Ins 0) "-" "+") (rtos Dist_Ins 2 2) " m")) ) ) ((= Choix_trace "Distance") (while (setq Pt_1 (getpoint "\nSpécifier le point de départ")) (setq Pt_2 (getpoint "\nSpécifier le point suivant")) (setq Dist_PtSCU (distance Pt_1 Pt_2)) (setq PtSCU (list (+ X-Pt_ref Dist_PtSCU) Y-Pt_ref (caddr Pt_ref))) (setq NewVal (+ Ht_ref (/ (- (car PtSCU) X-Pt_ref) coeff_unit))) (command "_XLINE" "V" PtSCU "") (Ins_Bloc PtSCU (strcat (if (< NewVal 0) "-" "+") (rtos NewVal 2 2) " NGF")) ) ) ((= Choix_trace "Saisie") (while (setq Dist_Ins (getreal "\nVeuillez renseigner une distance par rapport au point de référence (en m) (ENTRER pour terminer) : ")) (setq Pt_Ins (list (+ X-Pt_ref (* Dist_Ins coeff_unit)) Y-Pt_ref (caddr Pt_ref))) (command "_XLINE" "V" Pt_Ins "") (Ins_Bloc Pt_Ins (strcat (if (< Dist_Ins 0) "-" "+") (rtos Dist_Ins 2 2) " m")) ) ) ) (reinit) )
-
EDIT 19.07.2019 : Bonjour, J'ai réussi à trouver une solution et je pense avoir terminer mon programme. Merci à ceux qui m'ont aidé (et supporter) ! Mention spécial à didier :D Vous trouverez mon programme dans le message suivant et si jamais vous avez des idées pour améliorer ou simplifier mon programme je suis toute ouïe ! Bonne journée. Ksow
-
Bonjour, Tout d'abord aucun souci sur le fait d'être cash, au contraire je préfère qu'on me dise directement si quelque chose ne va pas plutôt que tourner 3h autour du pot. :) Actuellement je suis toujours en train de chercher , dès que j'ai l'occasion, une solution à mon problème énoncé plus tôt et je n'ai encore aucun résultat. J'enchaîne erreur sur erreur hahaha :D Du coup depuis le temps, le fait de devoir chercher et essayer plusieurs lignes de codes je me suis posé une question toute bête : Est ce qu'il est possible de passer directement tout une sélection en ;commentaire ? Car il m'arrive souvent d'essayer plusieurs lignes codes puis je les passent en commentaire une par une pour essayer autres choses sans perdre ce que j'ai fait au préalable par exemple et le fait de devoir aller devant chaque début de ligne placer ";" cela devient fastidieux. Après il se peut aussi que je m'y prends mal dans ma "phase de recherche" ? Sinon pour revenir sur le sujet, je travaille sur une feuille vierge sur ma partie "Distance" mais je ne comprends pas bien en quoi je me dirigeai vers une impasse et vers une usine à gaz ? Mon but est juste de proposé 3 façon d'utiliser le programme pour que celui-ci s'adapte à tout les critères possible. - On souhaite réalisé le quadrillage à partir de NGF connu on utilise la partie "Saisie" - On ne connait pas les niveaux NGF et on souhaite réalisé le quadrillage à la souris à partir d'un plan de référence on utilise la partie "Point" - Le plan de référence est incliné et donc n'a pas de SCU correspond à notre quadrillage on utilise la partie "Distance" A savoir que si mon programme ne cesse d'évoluer (peut être dans la mauvaise direction de ce que j'ai cru comprendre) c'est parce que j'essaye de l'adapter en fonction des demandes de mon tuteur en entreprise et de ses observations (ainsi que les miennes) lors de l'utilisation du programme. Si vous avez des idées ou des réponses à m'apporter pour l'améliorer et éviter que j'aille dans une impasse, merci de bien vouloir m'aider. Bonne journée, Ksow
-
Je ne connaissais pas spécialement Patrick mais je l'ai souvent aperçu dans les réponses aux différents sujets dans plusieurs forums. Merci à lui pour son aide et ses connaissances qu'il a bien voulu partagé tout ce temps. Mes sincères condoléance à sa famille.
-
Bonjour! Oui c'est encore moi, désolé de toujours vous solliciter mais j'ai du mal avec la programmation LISP... Comme je l'ai dit dans la partie "EDIT" de mon message au-dessus je cherche un moyen d'intervenir sur le SCU pour permettre à l'utilisateur d'utilisé la souris pour faire le quadrillage. Le but étant de pouvoir s'appuyer sur un plan incliné par rapport à notre quadrillage par exemple et les axes se créent selon la distance entre les deux clics de l'utilisateur. Je ne sais pas si j'ai été assez clair, du coup je vous ajoute un dessin en espérant être compréhensible. Donc j'ai essayé d'intervenir sur le SCU avec (command "_ucs") et sans succès. J'ai pensé à créer un 3ème choix "Distance" en plus des deux premiers "Point" et "Saisi". De plus avec des recherches je suis tombé sur un sujet où un utilisateur utilise ceci : - sauvegarde du SCU courant (if (tblsearch "UCS" "$$temp$$") (command "_ucs" "_d" "$$temp$$") ) (command "_ucs" "_s" "$$temp$$") - retour au scu sauvegardé : (command "_ucs" "_r" "$$temp$$") (command "_ucs" "_d" "$$temp$$") J'aimerai savoir d'où sors le " $$temp$$ " et comment il fonctionne? C'est la première fois que je vois ça et j'aimerai ne pas copier bêtement sans comprendre... car pour l'instant j'ai prévu de les réutiliser dans mes fonctions de données au début (init) et (reinit). Ma partie de programme : ((= Choix_trace "Distance") (while (setq Pt_1 (getpoint "\n Spécifier le point de départ")) (setq Pt_2 (getpoint "\n Spécifier le point suivant")) (command "_ucs" ...) ;Problème ici, je ne sais pas quoi rentrer après "_ucs". ;J'ai essayé de voir sur autocad tout les choix possible je n'arrive pas à trouver une solution malgré plusieurs essais. (setq Pt_dist (- (cadr Pt_2) (cadr Pt_1))) (setq Pt_Ins (list X-Pt_ref (+ Y-Pt_ref (* Pt_dist coeff_unit)) (caddr Pt_ref))) (command "_XLINE" "H" Pt_Ins "") (Ins_Bloc Pt_Ins (strcat (if (< Ht_Ins 0) "-" "+") (rtos Ht_Ins 2 2) " NGF")) ) ) Merci!
-
Tout simplement... Merci beaucoup @Olivier Eckmann cela fonctionne très bien maintenant ! J'avais beau lire et relire mes lignes de codes impossible de voir cette erreur qui était pourtant pas si compliqué. Bonne journée --------------------------------------------------------------- EDIT : J'ai remarqué que ma partie "Point" est limité par le SCU. En effet, si je veux faire mon quadrillage à partir d'un plan qui a une rotation quelconque cela ne marchera pas... Je vais travaillé sur ce problème. ((= Choix_trace "Point") (while (setq Pt_Ins (getpoint "\nVeuillez renseigner un point altimétrique (ENTRER pour terminer) : ")) (setq Ht_Ins (+ Ht_ref (/ (- (cadr Pt_Ins) Y-Pt_ref) coeff_unit))) (setq Pt_Ins (list X-Pt_ref (cadr Pt_Ins) (caddr Pt_ref))) (command "_XLINE" "H" Pt_Ins "") (Ins_Bloc Pt_Ins (strcat (if (< Ht_Ins 0) "-" "+") (rtos Ht_Ins 2 2) " NGF")) ) )
-
Bonjour à tous! Je reviens vers vous car, avec les quelques temps libre que j'ai eu dernièrement, j'ai modifié mon programme. Tout semble fonctionner correctement mis à part le fait que j'ai une erreur que je n'arrive pas à résoudre alors que cela doit être tout bête, je ne vois pas ce qui fait défaut. Avant tout je vais expliqué le fonctionnement du code que je vous joins à la suite. Alors le but n'a pas changé, il s'agit de réaliser un quadrillage de référence pour dessiner une coupe ou une élévation. Pour cela j'ai permis à l'utilisateur d'utiliser deux façon de faire que j'ai nommé "Point" & "Saisie". - Lorsque l'utilisateur choisi "Point" il devra (pour tracer le quadrillage) cliquer sur justement des points du dessin après avoir renseigné un point de référence. Les valeurs des points suivant se feront en fonction de ce point de référence. - Ensuite avec "Saisie", c'est dans le cas où l'utilisateur connait les valeurs dont il a besoin, auquel cas il a juste à les renseigner dans la barre de commande et le quadrillage se réalisera par lui même (toujours après avoir renseigné un point de référence au préalable) Donc voici le code : ;; +---------------------------------------------------+ ;; | Projet : QUADRILLAGE DE REFERENCE | ;; +---------------------------------------------------+ ;;;***************** ;;; DONNEES ;;;***************** (defun init () (setq acrobj (getvar "OSMODE")) (setq units_angle (getvar "AUNITS")) (setq nbdeci (getvar "LUPREC")) (setq attreq (getvar "ATTREQ")) (setq attdia (getvar "ATTDIA")) (setq units (getvar "INSUNITS")) (setvar "OSMODE" 167) (setvar "AUNITS" 0) (setvar "LUPREC" 0) (setvar "ATTREQ" 1) (setvar "ATTDIA" 0) ) (defun reinit () (setvar "OSMODE" acrobj) (setvar "AUNITS" units_angle) (setvar "PLINEWID" 0) (setvar "ATTREQ" attreq) (setvar "ATTDIA" attdia) (setvar "INSUNITS" units) (setvar "LUPREC" nbdeci) ) (defun Ins_Bloc (Pt Ht_NGF) (setq bloc_name (strcat "BLOC_" axe unit)) (command "-INSERER" bloc_name Pt 1 1 0 Ht_NGF) ) ;;; ***************** ;;; PROGRAMME ;;; ***************** (defun c:NGF () (init) (if (not (tblsearch "LAYER" "00-QUADRILLAGE-NGF")) (command "_LAYER" "N" "00-QUADRILLAGE-NGF" "CO" "230" "00-QUADRILLAGE-NGF" "TL" "AXES" "00-QUADRILLAGE-NGF" "") ) (command "_LAYER" "CH" "00-QUADRILLAGE-NGF" "") (setvar "CECOLOR" "DUCALQUE") (initget 1 "MIllimètre CEntimètre MEtre") (setq Choix_unit (getkword "\nSpécifier l'unité de dessin : [MIllimètre/CEntimètre/MEtre] ")) (cond ((= Choix_unit "MIllimètre") (setq unit "mm" coeff_unit 1000.0) (setvar "INSUNITS" 4) ) ((= Choix_unit "CEntimètre") (setq unit "cm" coeff_unit 100.0) (setvar "INSUNITS" 5) ) ((= Choix_unit "MEtre") (setq unit "m" coeff_unit 1.0) (setvar "INSUNITS" 6) ) ) (setq axe "NGF_") (prompt "\nDessin des axes HORIZONTAUX :") (initget 1 "Point Saisie") (setq Choix_trace (getkword "\nVeuillez préciser si vous souhaitez choisir des points ou si vous souhaitez entrer les niveaux NGF [Point/Saisie] : ")) (setq Pt_ref (getpoint "\nVeuillez renseigner un point de référence : ")) (setq Y-Pt_ref (cadr Pt_ref)) (setq X-Pt_ref (- (car Pt_ref) (* 1 coeff_unit))) (setq Ht_ref (getreal "\nVeuillez renseigner le niveau NGF du point de référence (en m) : ")) (command "_XLINE" "H" Pt_ref "") (Ins_Bloc (list X-Pt_ref Y-Pt_ref (caddr Pt_ref)) (strcat (if (< Ht_ref 0) "-" "+") (rtos Ht_ref 2 2) " NGF")) (cond ((= Choix_trace "Point") (while (setq Pt_Ins (getpoint "\nVeuillez renseigner un point altimétrique (ENTRER pour terminer) : ")) (setq Ht_Ins (+ Ht_ref (/ (- (cadr Pt_Ins) Y-Pt_ref) coeff_unit))) (setq Pt_Ins (list X-Pt_ref (cadr Pt_Ins) (caddr Pt_ref))) (command "_XLINE" "H" Pt_Ins "") (Ins_Bloc Pt_Ins (strcat (if (< Ht_Ins 0) "-" "+") (rtos Ht_Ins 2 2) " NGF")) ) ) ((= Choix_trace "Saisie") (while (setq Ht_Ins (getreal "\nVeuillez renseigner un niveau NGF (en m) (ENTRER pour terminer) : ")) (setq Pt_Ins (list X-Pt_ref (+ Y-Pt_ref (* Ht_Ins coeff_unit)) (caddr Pt_ref))) (command "_XLINE" "H" Pt_Ins "") (Ins_Bloc Pt_Ins (strcat (if (< Ht_Ins 0) "-" "+") (rtos Ht_Ins 2 2) " NGF")) ) ) ) (setq axe "DIST_") (command "_XLINE" "V" Pt_ref "") (setq Y-Pt_ref (- (cadr Pt_ref) (* 2 coeff_unit))) (setq X-Pt_ref (car Pt_ref)) (Ins_Bloc (list X-Pt_ref Y-Pt_ref (caddr Pt_ref)) (strcat "+" "0.00" " m")) (prompt "\nDessin des axes VERTICAUX :") (initget 1 "Point Saisie") (setq Choix_trace (getkword "\nVeuillez préciser si vous souhaitez choisir des points ou si vous souhaitez entrer les distances [Point/Saisie] : ")) (setq Dist_ref 0) (cond ((= Choix_trace "Point") (while (setq Pt_Ins (getpoint "\nVeuillez renseigner un point distant du point de référence (ENTRER pour terminer) : ")) (setq Dist_Ins (+ Dist_ref (/ (- (car Pt_Ins) X-Pt_ref) coeff_unit))) (setq Pt_Ins (list (car Pt_Ins) Y-Pt_ref (caddr Pt_ref))) (command "_XLINE" "V" Pt_Ins "") (Ins_Bloc Pt_Ins (strcat (if (< Dist_Ins 0) "-" "+") (rtos Dist_Ins 2 2) " m")) ) ) ((= Choix_trace "Saisie") (while (setq Dist_Ins (getreal "\nVeuillez renseigner une distance par rapport au point de référence (en m) (ENTRER pour terminer) : ")) (setq Pt_Ins (list (+ X-Pt_ref (* Dist_Ins coeff_unit)) Y-Pt_ref (caddr Pt_ref))) (command "_XLINE" "V" Pt_Ins "") (Ins_Bloc Pt_Ins (strcat (if (< Dist_Ins 0) "-" "+") (rtos Dist_Ins 2 2) " m")) ) ) ) (reinit) ) Mon problème est le fait que lorsque je veux faire mes premiers axes horizontaux, si je choisi de passer par "Saisie" et que je renseigne un point de référence, il l'affecte directement à 0 peu importe ce que je renseigne comme valeur. De fait les valeurs renseigné par la suite ont un gros décalage. Ci-dessous un screen pour vous illustrer le problème, lorsque je rentre 10 en valeur de référence il force la valeur à 0. (Ensuite j'ai toujours ce problème concernant le point d'insertion du premier bloc qui ne se déplace pas sur la gauche par rapport au point de référence comme les autres niveaux) Merci pour vos conseils depuis le début, j'ai pu m'améliorer au fur et à mesure et j'espère que vous allez pouvoir continuer à m'aider. Bonne journée.
-
Bonjour, merci didier pour ta réponse et effectivement je ne sais pas quoi dire non plus... j'ai décomposé et redéfini mes blocs "BLOC_DIST" et cela fonctionne. Par contre, je ne comprend vraiment pas pourquoi j'ai eu un tel problème ? Surtout qu'il me semble avoir essayé avec d'autres blocs. Cela reste un mystère du Lisp pour moi. Du coup tout fonctionne, ou presque! J'ai toujours ce même souci : lorsque j'insère le premier point demandé il n'applique pas le décalage prévu et cela me donne ça : Mon lien Comme on peut le constater, les niveaux 10.00 NGF et 0.00 m reste sur le point de référence. J'ai transmis mon programme à un ami et de chez il n'aurait pas ce problème apparemment. J'aimerai donc comprendre ce qui me fait défaut.. Enfin, comme je l'ai dit dans mes précédents messages, si quelqu'un voit une potentielle façon d'améliorer ce programme je suis preneur. Merci à vous d'avoir prit le temps de m'aider, je met mon programme (fonctionnel) en fin de message au cas où cela pourrait servir. Bonne journée. ;; +---------------------------+ ;; | Projet : NGF | ;; +---------------------------+ ;;;***************** ;;; DONNEES ;;;***************** ;;Récupération et redéfinition des données utilisateur (defun init () (setq acrobj (getvar "OSMODE")) ;Accrochage aux objets (setq units_angle (getvar "AUNITS")) ;Unités angulaire (setq nbdeci (getvar "LUPREC")) ;Nombre de décimal (setq dimz (getvar "DIMZIN")) ; enregistrement des valeurs initiales de la variable système (setq attreq (getvar "ATTREQ")) (setq attdia (getvar "ATTDIA")) (setq units (getvar "INSUNITS")) (setvar "OSMODE" 167) ;Accrobj (Ext'/Mil'/Centre/Intersect'/Perpendi') (setvar "AUNITS" 0) ;Angle en degrés (setvar "LUPREC" 2) ;Décimale choisie : 2 (setvar "DIMZIN" 0) ; modification des valeurs courantes de la variable système (setvar "ATTREQ" 1) (setvar "ATTDIA" 0) ) ;;RàZ des modifications des données utilisateur (defun reinit () (setvar "OSMODE" acrobj) (setvar "AUNITS" units_angle) (setvar "PLINEWID" 0) (setvar "DIMZIN" 8) (setvar "ATTREQ" attreq) (setvar "ATTDIA" attdia) (setvar "INSUNITS" units) ) ;;Fonction d'insertion des blocs (defun Ins_Bloc (choix_unit Pt Ht_NGF) (setq blc_name (strcat "BLOC_" axe unit)) (command "-inserer" blc_name Pt 1 1 0 Ht_NGF) ) ;;; ***************** ;;; PROGRAMME ;;; ***************** (defun c:NGF () (init) ;Initialisation ;Vérification de l'existance du calque NGF (if (not (tblsearch "LAYER" "00-QUADRILLAGE-NGF")) ;Création du calque NGF (s'il est inexistant) (command "_LAYER" "N" "00-QUADRILLAGE-NGF" "CO" "230" "00-QUADRILLAGE-NGF" "TL" "AXES" "00-QUADRILLAGE-NGF" "" ) ) (command "_LAYER" "CH" "00-QUADRILLAGE-NGF" "") ;Rend courant le calque (setvar "CECOLOR" "DUCALQUE") ;Choix de l'unité de dessin (initget 1 "MIllimetre CEntimetre MEtre") (setq choix_unit (getkword "\nSpécifier l'unité de dessin [MIllimetre/CEntimetre/MEtre]" ) ) ;;condition pour choisir l'unité d'échelle (cond ((= choix_unit "MIllimetre") (setq unit "_mm" coeff_unit 1000 ) (setvar "INSUNITS" 4) ) ((= choix_unit "CEntimetre") (setq unit "_cm" coeff_unit 100 ) (setvar "INSUNITS" 5) ) ((= choix_unit "MEtre") (setq unit "_m" coeff_unit 1 ) (setvar "INSUNITS" 6) ) ) ;;; AXES HORIZONTAUX (setq axe "NGF") ;;insertion bloc NGF (setq Pref (getpoint "\nVeuillez renseigner le point de référence.") ) (setq P0 (list (- (car Pref) (* 2 coeff_unit)) (cadr Pref) (caddr Pref) ) ) (command "_XLINE" "_H" Pref "") (setq Val_NGF (getreal "\nVeuillez saisir le niveau NGF (en m) :")) (Ins_Bloc choix_unit Pref (strcat (rtos Val_NGF 2 2) " NGF") ) ;;récup nom_bloc (setq nom_bloc (entlast)) (initget 1 "Oui Non") ;restreins l'utilisateur à choisir entre les deux conditions pour réitérer l'opération (setq Choix_utilisateur (getkword "\nVoulez vous tracer un nouveau niveau NGF ? [Oui/Non]" ) ) (cond ((= Choix_utilisateur "Oui") (while (setq NGF_ins (getreal "\nVeuillez saisir le niveau NGF (en m) :") ) (setq P_ins (list (car P0) (+ (cadr P0) (* (- NGF_ins Val_NGF) coeff_unit)) (caddr P0) ) ) (Ins_Bloc choix_unit P_ins (strcat (rtos NGF_ins 2 2) " NGF") ) (command "_XLINE" "_H" P_ins "") ) ) ) ;;; AXES VERTICAUX (setq axe "DIST") ;;insertion bloc DIST (command "_XLINE" "_V" Pref "") (setq Vref (list (car Pref) (+ (cadr Pref) (* 10 coeff_unit)) (caddr Pref) ) ) (setq Val_m (getreal "\nVeuillez saisir la valeur de la distance (en m) :" ) ) (Ins_Bloc choix_unit Vref (strcat (rtos Val_m 2 2) " m") ) ;;récup nom_bloc (setq nom_bloc2 (entlast)) (initget 1 "Oui Non") ;restreins l'utilisateur à choisir entre les deux conditions pour réitérer l'opération (setq Choix_utilisateur (getkword "\nVoulez vous tracer un nouvel axe ? [Oui/Non]" ) ) (cond ((= Choix_utilisateur "Oui") (while (setq m_ins (getreal "\nVeuillez saisir le niveau NGF (en m) :") ) (setq Dist_ins (list (+ (car Vref) (* (- m_ins Val_m) coeff_unit)) (cadr Vref) (caddr Vref) ) ) (Ins_Bloc choix_unit Dist_ins (strcat (rtos m_ins 2 2) " m") ) (command "_XLINE" "_V" Dist_ins "") ) ) ) ;;; ***************** ;;; FIN DU PROGRAMME ;;; ***************** (reinit) ;RàZ )
-
Bonjour didier, Tout d'abord merci pour ta réponse. Alors pour ta première question, ce qu'il se passe c'est que lorsque je lance mon programme, après avoir choisi l'unité et le point de référence, il est demandé à l'utilisateur d'entrer le niveau NGF de ce premier point. Ici on peut y entrer n'importe quel valeur (j'ai juste prit l'habitude de commencer par 10.00 NGF lors de mes essais). Donc on a notre premier niveau qui s'insère or il s'insère là où je clique (au niveau du point de référence). Puis quand j'insère d'autres niveaux eux sont décalé sur le côté et si jamais je remet la même valeur que le premier niveau (ici 10.00 NGF) il se placera comme les autres avec un décalage sur le côté. Du coup mon souci est que le premier niveau NGF renseigné ne veut pas faire se décalage comme tu peux le voir sur mon screen avec le premier 10.00 NGF collé au "pseudo-bâtiment" et l'autre placé correctement. Pour ton site j'avais remarqué mais je tenais simplement à te remercier car il m'a tout de même bien servir pour savoir comment fonctionne certaines fonctions. Voilà tout :) Pour le trois, comme je l'ai précisé c'est un problème disons mineur. En fait lorsque j'insère mon bloque je ne sais pourquoi mais il a une rotation de 91° (chose que je n'ai pas prévu à sa création) et je me retrouve donc avec mon bloc avec un angle de 1° par rapport à l'horizontal mais je ne sais pas pourquoi il applique une telle rotation sans que je lui précise. Sinon pour mon problème majeur, je vais essayé de l'expliquer un peu mieux. Dans mon programme j'ai créé une fonction d'insertion de bloc. (defun Ins_Bloc (choix_unit Pt Ht_NGF) (setq blc_name (strcat "BLOC_" axe unit)) (command "-inserer" blc_name Pt 1 1 0 Ht_NGF) ) Elle me sert à insérer mes blocs en fonction de certains critère. (setq blc_name (strcat "BLOC_" axe unit)) ici "axe" me permet de choisir entre NGF ou DIST et "unit" entre _mm, _cm, m. Sachant que j'ai 6 blocs qui se nomment respectivement : - BLOC_NGF_mm - BLOC_NGF_cm - BLOC_NGF_m - BLOC_DIST_mm - BLOC_DIST_cm - BLOC_DIST_mm Du coup grâce à cette fonction je peux choisir quel bloc je veux selon mes choix. Cela marche très bien avec les 3 premiers blocs mais lorsque je choisi les blocs BLOC_DIST_xx j'ai une erreur. Comme on peut le voir dans la barre de commande dans le screen que j'ai transmis plus haut, le programme affecte directement la valeur aux attributs et donc lorsque je rentre ma valeur à l'aide du "getreal" et bien il prend ça pour une commande. Or la commande : 2.00 m n'existe pas bien évidemment. Voici un screen permettant d'illustrer mes propos, dans le premier menu c'est lorsque j'insère un bloc BLOC_NGF et que tout se passe bien. Dans le deuxième cas c'est la fameuse erreur dont je parle : C'est pourquoi j'ai pensé à ce que j'ai appris lors de mes recherches, comme quoi la commande "-INSERER" aurait deux versions d'utilisation. Et je me dis que c'est peut être de là que vient le problème mais il se peut que je fasse complètement fausse route. Dans tout les cas je n'arrive pas à trouver de solution malgré mes recherches. Pour finir, concernant mon programme, je suis étudiant en alternance en licence professionnelle et il s'agit de mon projet de fin d'étude (enfin disons plutôt que c'est une partie de mon projet). Mon tuteur d'entreprise m'a demandé de réaliser un programme LISP pour lui permettre de gagner du temps lors de la réalisation de coupe ou d'élévation. Il m'a bien indiqué qu'il souhaitait que cela fasse un quadrillage avec en horizontal les niveaux NGF et à la vertical la distance en m. Ensuite il m'a aussi précisé qui ne souhaitait pas de boîte de dialogue car selon lui cela ferait perdre du temps mais qu'il préférait rentrer des renseignement dans la barre de commande AutoCAD. Ainsi le but de mon programme et de faire quelques demande en début de programme pour préparé celui-ci (unité, point de référence) et puis de continuer en entrant autant de niveaux que l'on souhaite. Pour passer à la suite il suffit de faire "entrée" sans indiquer d'autres valeurs et idem dans la partie des axes verticaux. Je précise tout de même que lorsque je rendrai mon programme, j'y ajouterai une notice d'utilisation. J'espère avoir été assez clair cette fois ci et que le pavé que j'ai écrit ne soit pas trop imbuvable, bonne journée ! Salutation,
-
Bonjour, Me revoilà après quelques temps d'absences.. J'ai été assez occupé mais j'ai tout de même essayé d'avancer mon programme quand j'avais du temps libre. Je pense l'avoir bien amélioré par rapport au début sauf que je suis arrivé à un stade où je ne sais plus quoi faire. Tout d'abord, voici l'avancé de mon programme LISP : ;; +---------------------------+ ;; | Projet : NGF | ;; +---------------------------+ ;;;***************** ;;; DONNEES ;;;***************** ;;Récupération et redéfinition des données utilisateur (defun init () (setq acrobj (getvar "OSMODE")) ;Accrochage aux objets (setq units_angle (getvar "AUNITS")) ;Unités angulaire (setq nbdeci (getvar "LUPREC")) ;Nombre de décimal (setq dimz (getvar "DIMZIN")) ; enregistrement des valeurs initiales de la variable système (setq attreq (getvar "ATTREQ")) (setq attdia (getvar "ATTDIA")) (setq units (getvar "INSUNITS")) (setvar "OSMODE" 167) ;Accrobj (Ext'/Mil'/Centre/Intersect'/Perpendi') (setvar "AUNITS" 0) ;Angle en degrés (setvar "LUPREC" 2) ;Décimale choisie : 2 (setvar "DIMZIN" 0) ; modification des valeurs courantes de la variable système (setvar "ATTREQ" 1) (setvar "ATTDIA" 0) ) ;;RàZ des modifications des données utilisateur (defun reinit () (setvar "OSMODE" acrobj) (setvar "AUNITS" units_angle) (setvar "PLINEWID" 0) (setvar "DIMZIN" 8) (setvar "ATTREQ" attreq) (setvar "ATTDIA" attdia) (setvar "INSUNITS" units) ) ;;Fonction d'insertion des blocs (defun Ins_Bloc (choix_unit Pt Ht_NGF) (setq blc_name (strcat "BLOC_" axe unit)) (command "-inserer" blc_name Pt 1 1 0 Ht_NGF) ) ;;; ***************** ;;; PROGRAMME ;;; ***************** (defun c:NGF () (init) ;Initialisation ;Vérification de l'existance du calque NGF (if (not (tblsearch "LAYER" "00-QUADRILLAGE-NGF")) ;Création du calque NGF (s'il est inexistant) (command "_LAYER" "N" "00-QUADRILLAGE-NGF" "CO" "230" "00-QUADRILLAGE-NGF" "TL" "AXES" "00-QUADRILLAGE-NGF" "" ) ) (command "_LAYER" "CH" "00-QUADRILLAGE-NGF" "") ;Rend courant le calque (setvar "CECOLOR" "DUCALQUE") ;Choix de l'unité de dessin (initget 1 "MIllimetre CEntimetre MEtre") (setq choix_unit (getkword "\nSpécifier l'unité de dessin [MIllimetre/CEntimetre/MEtre]" ) ) ;;condition pour choisir l'unité d'échelle (cond ((= choix_unit "MIllimetre") (setq unit "_mm" coeff_unit 1000 ) (setvar "INSUNITS" 4) ) ((= choix_unit "CEntimetre") (setq unit "_cm" coeff_unit 100 ) (setvar "INSUNITS" 5) ) ((= choix_unit "MEtre") (setq unit "_m" coeff_unit 1 ) (setvar "INSUNITS" 6) ) ) ;;; AXES HORIZONTAUX (setq axe "NGF") ;;insertion bloc NGF (setq Pref (getpoint "\nVeuillez renseigner le point de référence.") ) (setq P0 (list (- (car Pref) (* 2 coeff_unit)) (cadr Pref) (caddr Pref) ) ) (command "_XLINE" "_H" Pref "") (setq Val_NGF (getreal "\nVeuillez saisir le niveau NGF (en m) :")) (Ins_Bloc choix_unit Pref (strcat (rtos Val_NGF 2 2) " NGF") ) ;;récup nom_bloc (setq nom_bloc (entlast)) (initget 1 "Oui Non") ;restreins l'utilisateur à choisir entre les deux conditions pour réitérer l'opération (setq Choix_utilisateur (getkword "\nVoulez vous tracer un nouveau niveau NGF ? [Oui/Non]" ) ) (cond ((= Choix_utilisateur "Oui") (while (setq NGF_ins (getreal "\nVeuillez saisir le niveau NGF (en m) :") ) (setq P_ins (list (car P0) (+ (cadr P0) (* (- NGF_ins Val_NGF) coeff_unit)) (caddr P0) ) ) (Ins_Bloc choix_unit P_ins (strcat (rtos NGF_ins 2 2) " NGF") ) (command "_XLINE" "_H" P_ins "") ) ) ) ;;;/////////////////////////////////////////////////////////////////NON FONCTIONNEL ;;; AXES VERTICAUX (setq axe "DIST") ;;insertion bloc DIST (command "_XLINE" "_V" Pref "") (setq Vref (list (car Pref) (+ (cadr Pref) (* 10 coeff_unit)) (caddr Pref) ) ) (setq Val_m (getreal "\nVeuillez saisir la valeur de la distance (en m) :" ) ) (Ins_Bloc choix_unit Vref (strcat (rtos Val_m 2 2) " m") ) ;;récup nom_bloc (setq nom_bloc2 (entlast)) (initget 1 "Oui Non") ;restreins l'utilisateur à choisir entre les deux conditions pour réitérer l'opération (setq Choix_utilisateur (getkword "\nVoulez vous tracer un nouvel axe ? [Oui/Non]" ) ) (cond ((= Choix_utilisateur "Oui") (while (setq m_ins (getreal "\nVeuillez saisir le niveau NGF (en m) :") ) (setq Dist_ins (list (+ (car P1) (* (- m_ins Val_m) coeff_unit)) (cadr P1) (caddr P1) ) ) (Ins_Bloc choix_unit Dist_ins (strcat (rtos m_ins 2 2) " m") ) (command "_XLINE" "_V" Dist_ins "") ) ) ) ;;;FIN DU PROGRAMME (reinit) ;RàZ ) J'ai donc 3 problèmes qui sont les suivants : 1 / Dans la partie axe horizontaux, la première valeur à un souci au niveau de son décalage par rapport au point de référence. Pour les suivantes le décalage s'effectue sans problème. De fait si comme premier point je lui renseigne 10 et que par la suite après avoir renseigné 11, 12 ...etc je lui renseigne de nouveau 10 cette fois ci seulement il sera bien placé avec un décalage par rapport au point de référence. 2 / La partie axe verticaux ne fonctionne pas du tout. J'ai cherché un peu partout (dont le site de Didier qui d'ailleurs je remercie pour son travail) mais sans succès. J'ai utilisé la même idée pour les axes horizontaux et je n'arrive pas à comprendre là où cela fait défaut. De ce que j'aurais compris après avoir demander des renseignements il se pourrait que la commande "-INSERER" a deux versions d'exécution : - la première, elle va demander le nom, puis les échelles X/Y, l'angle de rotation, la définition des attributs - la seconde, elle va demander le nom, l'échelle générale, l'angle de rotation, la définition des attributs. Or dans la partie axe verticaux, cette commande utilise sa deuxième version ce qui expliquerait les erreurs. Mais je n'ai pas trouvé plus d'informations dessus et ni comment choisir entre ces versions (si elles existent...) 3 / Ici j'ai un problème mineur, mon bloc BLOC_DIST_ quand je l'insère par le programme a une rotation de 91 degrés alors que lorsque je l'ai créé j'avais bien précisé 0° (ou 90°). Du coup il penche légèrement. Voilà, j'espère que malgré tout ce temps quelqu'un pourra m'aider. En attendant voilà une image représentant ce que donne le programme : Et ci-joint le DWG qui me permet de faire des tests du programme avec les blocs nécessaires (http://fromsmash.com/ff4ebff4-6fd3-11e9-b6fe-06812412be8a) PS : Je tiens à rappeler que je suis débutant dans l'utilisation de la programmation Lisp donc si vous voyez une quelconque amélioration du programme possible n'hésitez surtout pas ! (avec une explication s.v.p) :) PS 2 : Une fois ce programme fonctionnel, je comptais ajouter en début de programme un choix utilisateur entre clavier et souris. La réponse Clavier serait pour le programme ci-dessus et pour la réponse Souris, j'aimerai faire quelque chose dans le style de ce que m'avait proposé x_all, où (après avoir choisi un point de référence et renseigné son niveau NGF) l'utilisateur a juste à cliquer où il veut sur le dessin et cela indiquera un niveau NGF (avec insertion d'un bloc ou juste une polyligne) Merci à vous, Bonne journée. Ksow
-
- Je continu de travailler sur mon programme quand j'ai du temps libre et je vous tiens au courant de son avancé, si vous le voulez bien. Bonne journée, Salutation.
-
Bonjour, Je n'ai pas pu continuer hier soir d'où ma réponse un peu tardive. J'ai donc modifié mon programme ce matin (à plusieurs reprise :D ) en tenant compte de vos commentaires, cependant j'ai quelques petits soucis : - quand je modifie comme me l'a suggéré didier : je me retrouve avec une erreur de fonction... et je reste bloqué dans ma commande "_XLINE" sans pouvoir continuer sur l'insertion de texte. J'ai bien essayé de faire quelques changement mais rien à faire j'ai toujours ce problème et la seule façon de le résoudre c'est de revenir sur mes lignes d'origine. J'imagine que j'ai du mal comprendre le commentaire. - pour l'utilisation de RTOS, le nombre de décimal reste bien bloqué à 2 si par exemple j'écris 10.123456 il me rend 10.12 néanmoins dans le cas où j'écrirai 10, j'aimerai qu'il m'affiche 10.00 NGF or il reste sur 10 tout simplement.. Pourtant j'ai essayé de corriger ça en utilisant la variable LUPREC (que j'ai configuré à 2). Sinon je suis toujours en pleine recherche/phase de test avec le site de didier pour trouver comment faire mon "décalage" à partir de mon plan horizontal de référence (@DenisHen) Je continu donc à faire mes modifications (même si je prend énormément de temps pour quelques lignes) en tenant compte de vos remarques pour améliorer, optimiser mon programme. Voici plus ou moins à quoi ressemble mon programme pour l'instant, je suis encore en train de le modifier en ce moment même donc il est pas 100% à jour. ;; +---------------------------+ ;; | Projet : NGF | ;; +---------------------------+ ;;;***************** ;;; DONNEES ;;;***************** ;;Récupération et redéfinition des données utilisateur (defun init () (setq acrobj (getvar "OSMODE")) ;Accrochage aux objets (setq units_angle (getvar "AUNITS")) ;Unités angulaire (setq nbdeci (getvar "LUPREC")) ;Nombre de décimal (setvar "OSMODE" 167) ;Accrobj (Ext'/Mil'/Centre/Intersect'/Perpendi') (setvar "AUNITS" 0) ;Angle en degrés (setvar "LUPREC" 2) ;Décimale choisie : 2 ) ;;RàZ des modifications des données utilisateur (defun reinit () (setvar "OSMODE" acrobj) (setvar "AUNITS" units_angle) (setvar "PLINEWID" 0) ) ;;; ***************** ;;; PROGRAMME ;;; ***************** (defun c:NGF1 () (init) ;Initialisation ;Vérification de l'existance du calque NGF (if (not (tblsearch "LAYER" "00-COUPE-NGF")) ;Création du calque NGF (s'il est inexistant) (command "_LAYER" "N" "00-COUPE-NGF" "CO" "230" "00-COUPE-NGF" "TL" "AXES" "00-COUPE-NGF" "" ) ) (command "_LAYER" "CH" "00-COUPE-NGF" "") ;Rend courant le calque (setvar "CECOLOR" "DUCALQUE") ;Choix de l'unité de dessin (initget 1 "MIllimetre CEntimetre MEtre") (setq choix_unit (getkword "\nSpécifier l'unité de dessin [MIllimetre/CEntimetre/MEtre]" ) ) (cond ((= choix_unit "MIllimetre") (setvar "INSUNITS" 4)) ;si l'unité est des mm ((= choix_unit "CEntimetre") (setvar "INSUNITS" 5)) ;si l'unité est des cm ((= choix_unit "MEtre") (setvar "INSUNITS" 6)) ;si l'unité est des m ) ;;; AXES HORIZONTAUX ;Renseignement du point de référence ////PROBLEME ICI//// ;(command "_XLINE" "_H") (setq Pref (getpoint "\nVeuillez renseigner le point de référence.")) (command "_XLINE" "_H" Pref) ;(command Pref "") ;Saisie de la première valeur NGF (setq name_NGF (entlast)) (command "_TEXT" pause "15" "0" (setq Val_NGF (strcat (rtos (getreal "\nVeuillez saisir le niveau NGF (en m) :") 2 2 ) " NGF" ) ) ) (initget 1 "Oui Non") (setq Choix_utilisateur (getkword "\nVoulez vous tracer un nouveau niveau NGF ? [Oui/Non]" ) ) (cond ((= Choix_utilisateur "Oui") ;;;;__________________________________________________________JUSQU ICI TOUT FONCTIONNE CORRECTEMENT (ou presque...) (ssget "_L") (setq PtNGF (command "DECALER" (getreal "\nVeuillez saisir le niveau NGF (en m) :") ) ) (setq name_NGF1 (entlast)) (command "_TEXT" pause "15" "0" (setq Val_NGF1 (strcat (rtos PtNGF 2 2) " NGF" ) ) ) ) ;;;;;; ((= Choix_utilisateur "Non") ;;;;;; ON PASSE DIRECTEMENT A LA PARTIE AXE VERTICAUX ) ;;; AXES VERTICAUX (reinit) ;RàZ ) Merci à vous! Salutation.
-
Bonjour didier, tout d'abord merci de ta réponse. Je prend note pour "algorithme" et la syntaxe internationale. Ensuite j'avoue ne pas être à l'aise du tout avec l'anglais donc il se peut que j'utilise des termes qui peuvent porter à confusion effectivement comme tu l'as fait remarqué avec boot. C'est pourquoi j'aime bien utilisé des annotations à côté pour m'y retrouver moi mais aussi pour qu'une autre personne qui voudrait intervenir sur mon programme ne soit pas trop perdu. Concernant ta question sur la finalité du programme, en gros si je devais résumé : L'utilisateur doit cliquer sur un point de référence et entrer sa cote NGF pour créer le premier niveau NGF, ensuite pour les autres niveaux il aura 2 possibilités : - soit il continu de cliquer sur chaque angle de son plan pour y faire apparaître des axes avec les côtes NGF qui se calcule en fonction de l'échelle choisi au début du programme et du premier niveau de référence choisi au préalable. - soit après avoir créer ce premier niveau NGF, il entre les suivants et les axes (+ cotes) se tracent tout seul en fonction du premier niveau référence Le but étant d'avoir un quadrillage qui pourra être utile pour réaliser une coupe. (cela se passe donc en 2D seulement dans mon cas) Je vais donc rectifier mon programme en tenant compte de tes commentaires et conseils, et faire un tour sur ton site voir si j'arrive à trouver une solution à mon problème. Encore merci d'avoir prit le temps de répondre. Salutation.
-
Edit 15.07.19 : (ci-joint un lien pour passer directement à la dernière version du programme : Dernière version du programme) Bonjour, je débute dans la programmation LISP. J'ai pour projet de faire un programme LISP permettant la création de "traits de construction" (horizontaux et verticaux) pour pouvoir faire des coupes... avec le niveau NGF renseignés pour les axes horizontaux et la distance en m pour les axes verticaux. Voici-ci un "organigramme"algorithme pour mieux comprendre mon projet. 1 Clique sur un icone ↓ 2 Choix échelle (m/cm/mm) ↓ 3 Renseigner un point de référence ↓ 4 NGF de ce point ↓ 5 Point à intégrer ↓ 6 Valeur ↓ 7 Autre point ? OUI nous ramène à la ligne 5 (boucle) NON ↓ Axes verticaux ? NON met fin au programme OUI ↓ Renseigner l’axe le plus à gauche ↓ … (boucle idem que Axes horizontaux) ↓ Fin du programme Donc maintenant concernant le programme LISP voici la base que j'ai pu réalisé : ;; +---------------------------+ ;; | Projet NGF | ;; +---------------------------+ ;;;***************** ;;; DONNEES ;;;***************** ;Récupération et redéfinition des données utilisateur (defun boot () (setq acrobj (getvar "OSMODE")) ;Accrochage aux objets (setq units_angle (getvar "AUNITS")) ;Unités angulaire (setvar "OSMODE" 167) ;Accrobj (Ext'/Mil'/Centre/Intersect'/Perpendi') (setvar "AUNITS" 0) ;Angle en degrés ) ;RàZ des modifications des données utilisateur (defun reboot () (setvar "OSMODE" acrobj) (setvar "AUNITS" units_angle) (setvar "PLINEWID" 0) ) ;;; ***************** ;;; PROGRAMME ;;; ***************** (defun c:NGF () (boot) ;Initialisation ;Vérification de l'existance du calque NGF (if (not (tblsearch "LAYER" "00-PIC-NGF")) ;Création du calque NGF (s'il est inexistant) (command "-CALQUE" "N" "00-PIC-NGF" "CO" "230" "00-PIC-NGF" "TL" "AXES" "00-PIC-NGF" "" ) ) (command "-CALQUE" "CH" "00-PIC-NGF" "") ;Rend courant le calque (setvar "CECOLOR" "DUCALQUE") ;Choix de l'unité de dessin (initget 1 "MIllimetre CEntimetre MEtre") (setq choix_unit (getkword "\nSpécifier l'unité de dessin [MIllimetre/CEntimetre/MEtre]" ) ) (cond ((= choix_unit "MIllimetre") (command "INSUNITS" 4)) ;si l'unité est des mm ((= choix_unit "CEntimetre") (command "INSUNITS" 5)) ;si l'unité est des cm ((= choix_unit "MEtre") (command "INSUNITS" 6)) ;si l'unité est des m ) ;;; AXES HORIZONTAUX ;Renseignement du point de référence (command "DROITE" "H") (setq Pref (getpoint "\nVeuillez renseigner le point de référence.")) (command Pref "") ;Saisie de la première valeur NGF (setq name_NGF (entlast)) (command "-TEXTE" pause "15" "0" (setq Ht_NGF (strcat (rtos (getreal "\nVeuillez saisir la côte NGF (en m) :")) " NGF" ) ) ) (initget 1 "Oui Non") (setq Choix_utilisateur (getkword "\nVoulez vous tracer un nouveau niveau NGF ? [Oui/Non]" ) ) (cond ((= Choix_utilisateur "Oui") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;JUSQUE LA CA FONCTIONNE ; (setq Ht_NGF (getreal "\nVeuillez saisir le niveau NGF (en m) :")) ; (setq DELTA (distance Pref PtNGF)) ; (setq PtNGF (polar Pref (/ pi 2) DELTA)) ; (command "DECALER" "DELTA") ) ) ;;;;;;;;;;;;;;;;;;;;((= Choix_utilisateur "Non") ;;;;;;;;;;;;;;;;;;;;...... PASSER DIRECTEMENT A LA PARTIE AXE VERTICAUX ;;; AXE VERTICAUX (reboot) ; => RàZ ) Du coup, jusqu'à la ligne ";;; JUSQUE LA CA FONCTIONNE" je ne pense pas avoir de souci (bien qu'il faudra que je mette en place des coefficients selon l'échelle choisi car pour l'instant j'essaye de faire fonctionner mon programme avec une seule échelle) J'arrive ainsi à créer mon premier niveau NGF mais je n'arrive pas à créer les autres en fonction de celui-ci. Je m'explique, j'aimerai qu'en rentrant le prochain niveau NGF (exemple : 40.00 NGF), cela crée automatiquement ma deuxième droite avec son texte. (mais il faudrait aussi que ça soit possible en cliquant directement sur le prochain point) J'ai essayé de passer par la commande "DECALER" mais rien à faire, j'enchaine erreur sur erreur et après multiple tentative, j'avoue être perdu... Voici aussi un petit schéma très très simpliste, qui permettra je l'espère de mieux comprendre mon début de programme : Merci à ceux qui prendront la peine de tout lire et de m'aider ~ Bonne journée.
