Aller au contenu

(gile)

Moderateurs
  • Compteur de contenus

    12 247
  • Inscription

  • Dernière visite

  • Jours gagnés

    209

Tout ce qui a été posté par (gile)

  1. (gile)

    Echap et lisp

    Le code que je proposais concerne uniquement la définition de mon_err. Tu as défini mon_err à l'intérieur de la fonction principale (c'est pour çà que je te proposais de déclarer la fonction avec les variables système), mais cela reste une fonction différente de la fonction principale c:FixCn utilisée par celle-ci au même titre que FixVl à ceci près que FixVl est appelé dans le déroulement "normal" de c:FixCn et que mon_err remplace pendant l'exécution de c:FixCn la fonction originelle*error*. Donc, au début de c:FixCn on sauvegarde la définition originelle de *error* dans olderr et on affecte celle de mon_err à *error*. c'est donc cette fonction qui sera exécutée en cas d'erreur ou d'annulation, et ce jusqu'à ce que soit restauré la définition originelle de *error* en fin de c:FixCn mais aussi en fin de mon_err (en cas d'annulation). (defun c:FixCn (/mon_err Nomfile Nomfile2 PathFdwg ACINS2000 FINS2000 PathFdwgf PathFacad ) ;;;********** Redéfiniton de *error* **********;;; (defun mon_err (ch) (cond ((or (eq ch "Fonction annulée") (eq ch "Function cancelled") ) (princ "\nProcédure d'annulation en cours, patientez....") (alert "fonction aborted") ) (T (princ (strcat "\nErreur: " ch))) ) ;_ cond [color=#990000](setq *error* olderr ;_ Restauration de *error* olderr nil) ;_ Renvoi de olderr à nil[/color] ) ) ;_ defun ;;;********** Fonction principale **********;;; [color=#990000](setq olderr *error* ;_ Sauvegarde de *error* *error* mon_err) ;_ Remplacement par mon_err[/color] (if (or (= (setq FINS2000 (vl-registry-read "HKEY_LOCAL_MACHINE\\SOFTWARE\\FixCAD\\R1.0\\R15.0\\ACAD-1001:40C" "InstallPath")) nil) (= (setq FINS2000 (vl-registry-read "HKEY_LOCAL_MACHINE\\SOFTWARE\\FixCAD\\R1.0\\R15.0\\ACAD-1001:40C" "InstallPath")) "")) (alert "FixCAD n'est pas installée sur cet ordinateur.") (progn (setq ACINS2000 (vl-registry-read "HKEY_LOCAL_MACHINE\\SOFTWARE\\Autodesk\\AutoCAD\\R15.0\\ACAD-1001:40C" "AcadLocation")) (FixVl) );if [color=#990000](setq *error* olderr ;_ Restauration de *error* olderr nil) ;_ Renvoi de olderr à nil[/color] );defun c:FixCn On peut aussi definir mon_err à part (dans ce cas on ne la déclare pas, bien sûr) : ;;;********** Redéfiniton de *error* **********;;; (defun mon_err (ch) (cond ((or (eq ch "Fonction annulée") (eq ch "Function cancelled") ) (princ "\nProcédure d'annulation en cours, patientez....") (alert "fonction aborted") ) (T (princ (strcat "\nErreur: " ch))) ) ;_ cond (setq *error* olderr ;_ Restauration de *error* olderr nil) ;_ Renvoi de olderr à nil ) ) ;_ defun ;;;********** Fonction c:FixCn **********;;; (defun c:FixCn (/ Nomfile Nomfile2 PathFdwg ACINS2000 FINS2000 PathFdwgf PathFacad ) (setq olderr *error* ;_ Sauvegarde de *error* *error* mon_err) ;_ Remplacement par mon_err (if (or (= (setq FINS2000 (vl-registry-read "HKEY_LOCAL_MACHINE\\SOFTWARE\\FixCAD\\R1.0\\R15.0\\ACAD-1001:40C" "InstallPath")) nil) (= (setq FINS2000 (vl-registry-read "HKEY_LOCAL_MACHINE\\SOFTWARE\\FixCAD\\R1.0\\R15.0\\ACAD-1001:40C" "InstallPath")) "")) (alert "FixCAD n'est pas installée sur cet ordinateur.") (progn (setq ACINS2000 (vl-registry-read "HKEY_LOCAL_MACHINE\\SOFTWARE\\Autodesk\\AutoCAD\\R15.0\\ACAD-1001:40C" "AcadLocation")) (FixVl) );if (setq *error* olderr ;_ Restauration de *error* olderr nil) ;_ Renvoi de olderr à nil );defun c:FixCn
  2. (gile)

    Echap et lisp

    Pour de plus amples explications sur la gestion des erreurs en AutoLISP , tu peux consulter l'aide aux développeurs d'AutoCAD -> AutoLISP Developer's guide -> Using theAutoLISP Language -> AutoLISP Basics -> Error Handling in AutoLISP ->Using the *error* Function On peut aussi, par la fonction redéfinie de *error*, restituer l'environnement initial en cas d'erreur ou d'annulation, au cas où celui-ci aurait été modifié pendant l'exécution du LISP (fermeture du groupe UNDO, restauration des valeurs initiales des variables système, du SCU, du calque courant ...) À ce propos, tu peux voir les sujets ici, ou encore ici, ou encore là.
  3. (gile)

    Echap et lisp

    Salut 1 - À la fin du (defun mon_err ... tu devrais restituer la fonction *error* originelle avec un (setq *error* olderr olderr nil) 2 - Normal, le message avec une version anglaise pour "Fonction annulée" c'est : "Function cancelled". Je te propose donc d'essayer ceci qui devrait fonctionner avec les versions anglaises et françaises : (defun mon_err (ch) (cond ((or (eq ch "Fonction annulée") (eq ch "Function cancelled") ) (princ "\nProcédure d'annulation en cours, patientez....") (alert "fonction aborted") ) (T (princ ch)) ) ;_ cond (setq *error* olderr olderr nil ) ) ;_ defun Tu peux aussi déclarer mon_err comme variable locale (defun c:FixCn (/ mon_err Nomfile ... dans la mesure où la fonction mon_err ne sert qu'à l'intérieur de la fonction c:FixCn elle sera renvoyée à nil à la fin de l'exécution de celle-ci.
  4. Suite à ce sujet, deux autres routines qui peuvent être utiles en 3D. Pour trouver l'élévation d'un point par rapport à un plan : ;;; [b]ELEV[/b] retourne l'élévation point pt par rapport au plan défini par p1 p2 p3 (defun [b]elev[/b] (pt p1 p2 p3) (* (cos ([b]angle_3pts[/b] p1 (mapcar '+ p1 ([b]norm_3pts[/b] p1 p2 p3)) pt)) (distance p1 pt) ) ) Pour obtenir les coordonnées de la projection orthogonale d'un point sur un plan : ;;; [b]PROJ_PT[/b] Retourne les coordonnées de la projection orthogonale du point pt ;;; sur le plan défini par les points p1 p2 p3. (defun [b]proj_pt[/b] (pt p1 p2 p3) (mapcar '- pt (mapcar '(lambda (x) (* x ([b]elev[/b] pt p1 p2 p3))) ([b]norm_3pts[/b] p1 p2 p3) ) ) ) Avec ces deux routines, on peut aisément obtenir les mêmes résultats qu'avec les fonctions dpp et ilp de la calculatrice géométrique Distance entre le point pt et le plan p1 p2 p3 : (abs (elev pt p1 p2 p3)) Intersection de la ligne p1 p2 et du plan p3 p4 p5 : (inters p1 p2 (proj_pt p1 p3 p4 p5) (proj_pt p2 p3 p4 p5) nil )
  5. Généralement le VB est plutôt classé dans les langages orientés objet et le LISP dans les langages fonctionnels, mais ces classements ne sont pas "étanches" le VisualLISP, par exemple, a aussi une orientation objet. Pour te faire une idée générale, un article de Wikipédia qui traite du LISP (pas spécialement du dialecte AutoLISP) ; le lien qui y est donné pour un forum de discussion AutoLISP est celui de CADxp.
  6. Une nouvelle amélioration : la possibilité de spécifier un point pour spécifier un plan parallèle aux plans XY, XZ, et YZ (comme dans la commande _slice/section). J'édite le code ci-dessus Et une nouvelle version qui reprend l'astuce de Bonuscad (points 3D et leur projections sur le plan de coupe) mais sans changement de SCU ni utilisation de la calculatrice. Cette version utilise les routines de calcul angulaire et vectoriel définies ici. Les routines PROJ_PT, VEC1, ANGLE_3D, NORM_3D,LINEARP et ASIN doivent être chargées (c'est ce type de petites fonctions, qui sont amenées à être utilisées dans d'autres routines, qui peuvent être rassemblées dans un fichier "Perso_utils.lsp" chargé systématiquement). ;;; ELEV retourne l'élévation point pt par rapport au plan défini par p1 p2 p3 (defun elev (pt p1 p2 p3) (* (cos (angle_3pts p1 (mapcar '+ p1 (norm_3pts p1 p2 p3)) pt)) (distance p1 pt) ) ) ;;; PROJ_PT Retourne les coordonnées de la projection orthogonale du point pt ;;; sur le plan défini par les points p1 p2 p3. (defun proj_pt (pt p1 p2 p3) (mapcar '- pt (mapcar '(lambda (x) (* x (elev pt p1 p2 p3))) (norm_3pts p1 p2 p3) ) ) ) ;;; C:INT_3D Ajuste ou prolonge un ligne au plan spécifié ;;; NOTA : ELEV, PROJ_PT, ANGLE_3PTS, NORM_3PTS, VEC1, LINEARP et ASIN doivent être chargés (defun c:int_3d (/ ext_mod ent pick dxf_ent p1 p2 p3 p4 p5 cut p_int) ;; EXT_MOD Modifier une extrémité (defun ext_mod (code) (entmod (subst (cons code (trans p_int 1 0)) (assoc code dxf_ent) dxf_ent ) ) ) ;; Sélectionner le plan de coupe (initget "XY XZ YZ 3points") (setq p3 (getpoint "\nSpécifiez le premier point du plan de coupe ou [XY/XZ/YZ/3points] : " ) ) (cond ((or (null p3) (= p3 "3points")) (initget 1) (setq p3 (getpoint "\nPremier point: ")) ) ) (cond ((= (type p3) 'STR) (if (null (setq cut (getpoint (strcat "\nSpécifiez un point sur le plan " p3 " : " ) ) ) ) (setq cut '(0 0 0)) ) (cond ((= p3 "XY") (setq p3 (list 0 0 (caddr cut)) p4 (list 1 0 (caddr cut)) p5 (list 0 1 (caddr cut)) ) ) ((= p3 "XZ") (setq p3 (list 0 (cadr cut) 0) p4 (list 1 (cadr cut) 0) p5 (list 0 (cadr cut) 1) ) ) ((= p3 "YZ") (setq p3 (list (car cut) 0 0) p4 (list (car cut) 1 0) p5 (list (car cut) 0 1) ) ) ) ) (T (initget 1) (setq p4 (getpoint p3 "\nSecond point: ")) (initget 1) (setq p5 (getpoint p3 "\nTroisième point: ")) ) ) ;; Sélectionner la ou les lignes (while (setq ent (entsel "\nSélectionner la ligne à Prolonger/Ajuster au plan de coupe: " ) ) (cond ((= (cdr (assoc 0 (entget (car ent)))) "LINE") (command "_regen") (setq pick (osnap (cadr ent) "_nea") ent (car ent) dxf_ent (entget ent) p1 (trans (cdr (assoc 10 dxf_ent)) 0 1) p2 (trans (cdr (assoc 11 dxf_ent)) 0 1) ) ;; Ajuster / Prolonger (cond ((setq p_int (inters p1 p2 (proj_pt p1 p3 p4 p5) (proj_pt p2 p3 p4 p5) nil ) ) (if ( ;; Ajuster (if ( (ext_mod 10) (ext_mod 11) ) ;; Prolonger (if ( (distance p_int (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2)) p1 p2)) ) (if ( (ext_mod 10) (ext_mod 11) ) (prompt "\nAucun seuil dans cette direction.") ) ) (entupd ent) ) (T (prompt "\nLigne parallèle au plan de coupe.") ) ) ) (T (prompt "\nL'objet sélectionné n'est pas une ligne.") ) ) ) (princ) ) [Edité le 2/4/2006 par (gile)]
  7. (gile)

    probleme avec booleens

    Merci pour la précision, j'ai parlé de cone de révolution parceque Bonus proposait d'utiliser la commande du même nom. Sinon, total respect pour tes connaissances en descro !
  8. (gile)

    probleme avec booleens

    Petites précisions de géométrie Un cône de révolution est une surface engendrée par la révolution d'une droite sécante à un axe autour de cet axe. L'intersection d'un cône avec un plan perpendiculaire à son axe est un cercle, avec un plan non perpendiculaire, une ellipse (la base d'un cone oblique est une ellipse). Si l'intersection de la surface en question avec un plan non perpendiculaire à son axe est un cercle il ne s'agit pas d'un cône de révolution mais d'un cône elliptique. Mais AutoCAD (du moins jusqu'à v2006) refuse d'extruder une ellipse avec un angle d'extrusion : La figure décrite par vanzac ne peut, à mon avis, n'être modélisée avec AutoCAD (du moins jusqu'à v2006) qu'avec une surface réglée (et m2s pour en faire un solide). [Edité le 31/3/2006 par (gile)]
  9. Une autre façon, toujours avec le fichier dans un dossier du chemin de recherche des fichiers de support : ^C^C(autoload "nivc" '("nivc"));nivc; Le fichier n'est chargé qu'au premier appel de la fonction.
  10. Salut, Le point dans _.UCS c'est une garantie d'appeler la commande _UCS (SCU) originelle, au cas où la commande ait été modifiée avec la commande _UNDEFINE (NONDEF en français). Pour le (getvar,"SNAPANG") il me semble que tu mélanges deux syntaxes : le diesel et le LISP. En diesel, il on écrit $(getvar,snapang) et en LISP (getvar "snapang")
  11. Salut, La fonction LISP getcname traduit les commandes Langage international Langage de la version : Avec AutoCAD fr : (getcname "_line") retourne ligne et inversément (getcname "ligne") retourne "line". Pour les options, c'est à l'intuition et avec des test.
  12. Effectivement, je n'ai pas pensé à çà. Comme il n'y a qu'un seul plan de coupe, je ne me suis pas préoccupé du côté de la ligne sélectionné en cas de prolongation. Je corrige pour un fonctionnement plus semblable à la logique habituelle.
  13. (gile)

    Inverser Flèches...

    Salut, La commande est _AIDIMFLIPARROW (avec ou sans underscore)à taper à la ligne de commande, ou à mettre dans un bouton, dans un menu, dans un alias ...
  14. (gile)

    probleme avec booleens

    Salut et bienvenue, Il existe un LISP célèbre qui permet de créer des solides à partir de maillages : M2s. Son fonctionnement consiste en projeter les mailles en autant de polylignes sur le plan parallèle au SCU à l'altitude spécifiée (un peu comme CONTOUR), à extruder ces polys , les couper suivant les sommets des mailles puis unir tous les solides créés en un seul. Sinon il reste la solution 2007 qui semble permettre ce que tu désires sanspasser par de la programmation. Il en résulte donc un solide avec des facettes (plus ou moins suivant les réglages de SURFTAB1 et 2 avant de créer le maillage). Attention aussi : il faut projeter sur un plan qui ne génère pas de fausses dépouilles. Un exemple d'utilisation ici.
  15. (gile)

    mesurer

    Salut, Une bidouille vite fait (aucun contrôle) : Je crée un point avant l'insertion des blocs, je fais un (entlast) pour récupérer le nom d'entité du point, j'insère les blocs avec _measure, je boucle avec (entnext) sur les entités créées après le point (les blocs) et leur donne le facteur d'échelle spécifié. (defun c:test (/ ent bl ali dist ech pt next) ;; Entrées utilisateur (setq ent (car (entsel "\Choix de l'objet à mesurer: ")) bl (getstring "\nEntrez le nom du bloc à insérer: ") ) (initget "Oui Non") (setq ali (getkword "\nAligner le bloc avec l'objet ? [Oui/Non]:") dist (getdist "\Spécifiez la longueur du segment: ") ech (getreal "\nSpécifiez le facteur d'échelle: ") ) ;; Point de départ (command "_.point" '(0 0)) (setq pt (entlast)) ;; Insertion des blocs (command "_.measure" ent "b" bl ali dist) ;; Boucle pour affecter le facteur d'échelle (setq next (entnext pt)) (while next (command "_scale" next "" (cdr (assoc 10 (entget next))) ech ) (setq next (entnext next)) ) ;; Suppression du point (entdel pt) (princ) )
  16. Les Forums, surtout les forums !!! Parceque j'aime le partage et l'entraide.
  17. Ooops, il y avait effectivement une paranthèse supplémentaire. J'ai corrigé le code et j'en ai profité pour ajouter deux petites amélioratons : la possibilité d'ajuster ou prolonger plusieurs lignes et d'annuler les actions. Merci Bonus d'avoir testé, de mon côté je ne vois pas dysfonctionnements (peut-être que mes test ne sont pas "objectifs")
  18. (gile)

    lisp pour fillet metrique

    J'avais fait une vague traduction des invites et commentaires ici
  19. Malin le coup des coordonnées 3D/2D ;) Moi, j'aurais bêtement utilisé la calculatrice géométrique. On peut aussi, avec (entsel) au lieu de (ssget) récupérer un point pour spécifier le côté à ajuster. ;;; EXTRIM3D Ajuste ou prolonge une ligne à un plan (defun c:extrim3d (/ ext_mod ent pick dxf_ent p1 p2 p3 p4 p5 cut p_int) (vl-load-com) ;; EXT_MOD Modifier une extrémité de la ligne (defun ext_mod (code) (entmod (subst (cons code (trans p_int 1 0)) (assoc code dxf_ent) dxf_ent ) ) ) ;; Charger la calculatrice (if (not (member "geomcal.arx" (arx))) (arxload "geomcal") ) ;; Sélectionner le plan de coupe (initget "XY YZ ZX 3points") (setq p3 (getpoint "\nSpécifiez le premier point du plan de coupe ou [XY/YZ/ZX/3points] : " ) ) (cond ((or (null p3) (= p3 "3points")) (initget 1) (setq p3 (getpoint "\nPremier point: ")) ) ) (cond ((listp p3) (setq p4 p3 p5 p3 ) (while (equal p3 p4 1e-9) (initget 1) (setq p4 (getpoint p3 "\nSecond point: ")) ) (while (or (equal p3 p5 1e-9) (equal p4 p5 1e-9) (linearp (list p3 p4 p5)) ) (initget 1) (setq p5 (getpoint p3 "\nTroisième point: ")) ) ) (T (setq cut (getpoint (strcat "\nSpécifiez un point sur le plan " p3 " : " ) ) ) (if (null cut) (setq cut '(0 0 0)) ) (cond ((= p3 "XY") (setq p3 (list 0 0 (caddr cut)) p4 (list 1 0 (caddr cut)) p5 (list 0 1 (caddr cut)) ) ) ((= p3 "YZ") (setq p3 (list (car cut) 0 0) p4 (list (car cut) 1 0) p5 (list (car cut) 0 1) ) ) ((= p3 "ZX") (setq p3 (list 0 (cadr cut) 0) p4 (list 0 (cadr cut) 1) p5 (list 1 (cadr cut) 0) ) ) ) ) ) ;; Sélectionner la ou les lignes (while (setq ent (entsel "\nSélectionner la ligne à Prolonger/Ajuster au plan de coupe: " ) ) (cond ((= (cdr (assoc 0 (entget (car ent)))) "LINE") (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)) ) (setq pick (osnap (cadr ent) "_nea") ent (car ent) dxf_ent (entget ent) p1 (trans (cdr (assoc 10 dxf_ent)) 0 1) p2 (trans (cdr (assoc 11 dxf_ent)) 0 1) ) ;; Ajuster / Prolonger (cond ((setq p_int (cal "ilp(p1,p2,p3,p4,p5)")) (if (and ( ( ) ;; Ajuster (if ( (ext_mod 10) (ext_mod 11) ) ;; Prolonger (if ( (distance p_int (cal "plt(p1,p2,0.5)")) ) (if ( (ext_mod 10) (ext_mod 11) ) (prompt "\nAucun seuil dans cette direction.") ) ) (entupd ent) ) (T (prompt "\nLigne parallèle au plan de coupe.") ) ) ) (T (prompt "\nL'objet sélectionné n'est pas une ligne.") ) ) (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)) ) ) (princ) ) [Edité le 3/5/2006 par (gile)]
  20. En sélectionnant un objet sur le (ou les) calque(s) à traiter : (defun c:lay2wbl (/ echo lay_ss lay_name lay_lst ent_ss) (setq echo (getvar "cmdecho")) (setvar "cmdecho" 0) (prompt "\nSelectionnez les calques.") (setq lay_ss (ssget)) (repeat (setq ct (sslength lay_ss)) (setq lay_name (cdr (assoc 8 (entget (ssname lay_ss (setq ct (1- ct)))))) ) (if (not (member lay_name lay_lst)) (setq lay_lst (cons lay_name lay_lst)) ) ) (mapcar '(lambda (x) (command "_.-layer" "_unlock" x "") (cond ((setq ent_ss (ssget "_X" (list (cons 8 x)))) (if (not (findfile (strcat (getvar "dwgname") "$" x ".dwg"))) (command "_.-wblock" (strcat (getvar "dwgname") "$" x) "" "*0.0,0.0,0.0" ent_ss "" ) ) ) ) ) lay_lst ) (setvar "cmdecho" echo) (princ) )
  21. Je m'en doutais un peu. Merci.
  22. Est il possible de modifier un fichier (ou un dossier) dans la zone Téléchargements proposés par les membres pour celui qui l'a posté ?
  23. (gile)

    nouveau defi

    Encore une routine élégante piquée à Reini Urban (Faq AutoLISP). : ;;; Applique une fonction a chaque entité de ss, dans un ordre inverse. ;;; [renommé de SSAPPLY en SSMAP pour se conformer au nom de stdlib] ;;; Ex: (ssmap 'entupd (ssget)) ; régénère seulement quelques entités (defun SSMAP (fun ss / n) (if (= 'PICKSET (type ss)) (repeat (setq n (sslength ss)) (apply fun (list (ssname ss (setq n (1- n))))) ) ) ) Dans le cas présent : (defun c:xx (/ rad) (command "_.undo" "_begin") (setq rad (getdist "\nRayon des cylindres?")) (SSMAP '(lambda (x) (command "_.cylinder" (trans (cdr (assoc 10 (entget x))) 0 1) rad "_c" (trans (cdr (assoc 11 (entget x))) 0 1) ) ) (ssget '((0 . "LINE"))) ) (command "_.undo" "_end") (princ) ) [Edité le 27/3/2006 par (gile)]
  24. Salut, Tu peux coller tes codes LISP dans les fichiers acad2005.lsp ou acad2005doc.lsp ou encore dans acad.mnl (ou le fichier *.MNL que tu utilises). De plus amples explications dans l'aide d'AutoCAD (F1) Guide de personnalisation -> Introduction aux interfaces de programmation -> AutoLISP et Visual LISP -> Chargement et exécution automatiques des routines AutoLISP. Personnellement, j'ai créé un fichier MENUGILE.MNL (qui fonctionne avec mon fichier de menu MENUGILE.MNS) depuis lequel je commande le chargement des mes fichiers LISP qui sont dans un dossier dont le chemin de recherche est indiqué dans l'onglet fichiers de la boite de dialogue Options, en voici un extrait : ;;; MENUGILE.MNL -28/12/05- ;;; ;;; Charge les applications suivantes. (load "acad.mnl") (princ "\nUtilitaires de menu Gile ") (load "Gile_Utils") (load "Dxf_lst") (load "Echl_lign") (load "Tube") (load "Txtmc") (load "Zmt") (princ "chargés") (princ) [Edité le 28/3/2006 par (gile)]
  25. (gile)

    Les coupes ?

    Pour les coupes, c'est pas plutôt SOLVIEW/SOLDRAW ? :casstet:
×
×
  • 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é