Ksow
Membres-
Compteur de contenus
18 -
Inscription
-
Dernière visite
-
Jours gagnés
3
Ksow a gagné pour la dernière fois le 25 juillet 2019
Ksow a eu le contenu le plus aimé !
À propos de Ksow
- Date de naissance 19/07/1997
Profile Information
-
Gender
Not Telling
Ksow's Achievements
Newbie (1/14)
3
Réputation sur la communauté
-
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.
