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. Effectivement je n'avais pas testé suffisamment en profondeur. ;; Select Blocks by Attribute Value - Lee Mac ;; Selects all attributed blocks in the current layout which contain a specified attribute value. (defun c:selblkbyattval (/ att atx ent idx sel str) (vl-load-com) (if (/= "" (setq str (strcase (getstring t "\nEntrez la ou les valeurs de l'attribut (Séparez les valeurs par une virgule) : ") ) ) ) (if (and (setq sel (ssget "_X" (list '(0 . "INSERT") '(2 . "Bulle,`*U*") '(66 . 1) (cons 410 (getvar 'ctab)) ) ) ) (progn (repeat (setq idx (sslength sel)) (setq ent (ssname sel (setq idx (1- idx)))) (if (= (vla-get-Effectivename (vlax-ename->vla-object ent)) "Bulle") (progn (setq att (entnext ent) atx (entget att) ) (while (and (= "ATTRIB" (cdr (assoc 0 atx))) (not (wcmatch (strcase (cdr (assoc 1 atx))) str)) ) (setq att (entnext att) atx (entget att) ) ) (if (= "SEQEND" (cdr (assoc 0 atx))) (ssdel ent sel) ) ) (ssdel ent sel) ) ) (< 0 (sslength sel)) ) ) ;;; Modification by Patrick_35 (progn (zoomobject (mapcar '(lambda (x) (vlax-ename->vla-object (cadr x))) (ssnamex sel))) (sssetfirst nil sel) ) ;;; Fin de la modification by Patrick_35 (princ (strcat "\nAucun bloc trouvé avec la valeur d'attribut \"" str "\".")) ) ) (princ) ) ;; ZoomObject Effectue un zoom sur les objets contenus dans la liste ;; ;; Argument ;; objlst : une liste de vla-object ;; ;; Variables ;; dir : normale du plan de la vue courante ;; ang : angle de la vue courante ;; 3x3 : matrice de transformation du SCG vers la vue courante (dimension 3) ;; 4x4 : matrice de transformation du SCG vers la vue courante (dimension 4) ;; ptlst : liste des points minimum et maximum des bounding-boxes des objets sélectionnés (SCG) (defun ZoomObject (objlst / dir ang 3x3 4x4 ptlst) (vl-load-com) (setq dir (mapcar '- (trans (getvar "viewdir") 1 0) (trans '(0 0 0) 1 0) ) ang (- (getvar "viewtwist")) 3x3 (mxm (mapcar '(lambda (x) (trans x 0 dir)) '((1 0 0) (0 1 0) (0 0 1)) ) (list (list (cos ang) (- (sin ang)) 0) (list (sin ang) (cos ang) 0) '(0 0 1) ) ) 4x4 (append (mapcar '(lambda (v o) (append v (list o)) ) 3x3 '(0 0 0) ) (list '(0 0 0 1)) ) ) (foreach obj objlst (vla-TransformBy obj (vlax-tmatrix (trp 4x4))) (vla-getBoundingBox obj 'minpt 'maxpt) (vla-TransformBy obj (vlax-tmatrix 4x4)) (setq ptlst (cons (vlax-safearray->list minpt) (cons (vlax-safearray->list maxpt) ptlst) ) ) ) (vla-ZoomWindow (vlax-get-acad-object) (vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'min ptlst)))) (vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'max ptlst)))) ) ) ;; transpose une matrice Doug Wilson (defun trp (m) (apply 'mapcar (cons 'list m)) ) ;; Apply a transformation matrix to a vector by Vladimir Nesterovsky (defun mxv (m v) (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m) ) ;; Multiply two matrices by Vladimir Nesterovsky (defun mxm (m q) (mapcar '(lambda (r) (mxv (trp q) r)) m) )
  2. salut, Peux-tu reformuler, voire donner un extrait de code, parce que là, je ne comprends pas.
  3. Ah bon, j'ai pourtant testé avant de poster... Peux-tu donner un lien vers un fichier contenant des blocs dynamiques nommés "Bulle" et préciser ce que tu as spécifié comme valeurs d'attribut ?
  4. (gile)

    Numérotation autocad

    Sans savoir programmer, quel serait l'algorithme (la démarche à suivre) pour ordonner des points dans un sens horaire ou anti-horaire uniquement en comparant leurs coordonnées x et y ? Quels critères objectifs choisir pour résoudre les cas équivoques : http://gile.pagesperso-orange.fr/Images/TriHoraire.png Il n'y a pas de magie dans la programmation, il s'agit juste de transcrire un processus intellectuel dans un langage compris par une machine qui ne fonctionne qu'avec des choix binaires (si... alors... sinon...). Dans ce cas, implémenter les processus de décision pour répondre à toute les situations risque de prendre beaucoup plus que quelques minutes...
  5. Un exemple de code qui traite toutes les références insérées du bloc "CARTOUCHE LU" (fonctionne aussi avec les blocs dynamiques. [CommandMethod("ListBlockAtts")] public static void ListBlockAtts() { var doc = Application.DocumentManager.MdiActiveDocument; var db = doc.Database; using (var tr = db.TransactionManager.StartTransaction()) { var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; // si la table de blocs contient le bloc "CARTOUCHE LU" if (bt.Has("CARTOUCHE LU")) { // on ouvre la définition du bloc var btr = (BlockTableRecord)tr.GetObject(bt["CARTOUCHE LU"], OpenMode.ForRead); // on recherche toutes les références insérées var ids = new ObjectIdCollection(); foreach (ObjectId brId in btr.GetBlockReferenceIds(true, true)) { ids.Add(brId); } // si le bloc est dynamique on cherche aussi les reférence des blocks anonymes if (btr.IsDynamicBlock) { foreach (ObjectId btrId in btr.GetAnonymousBlockIds()) { var anonymousBtr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead); foreach (ObjectId brId in anonymousBtr.GetBlockReferenceIds(true, true)) { ids.Add(brId); } } } // pour chaque référence trouvée, on modifie l'attribut "TITRE" foreach (ObjectId brId in ids) { var br = (BlockReference)tr.GetObject(brId, OpenMode.ForRead); foreach (ObjectId attId in br.AttributeCollection) { var att = (AttributeReference)tr.GetObject(attId, OpenMode.ForRead); if (att.Tag == "TITRE") { att.UpgradeOpen(); att.TextString = "Something"; break; // on sort de la boucle } } } } tr.Commit(); } }
  6. Salut, Sauf si l'attribut est constant, la propriété TextString d'une définition d'attribut (AttributeDefifnition) correspond à la valeur par défaut des références d'attribut (AttributeReference). Donc ton code devrait modifier cette valeur par défaut, mais n'a aucune influence sur les référence d'attributs des références de blocs déjà insérées dans le dessin. Si tu veux modifier les références d'attributs des blocs insérés, il faut collecter les références de bloc (BlockReference) insérées avec une sélection filtrée ou avec la méthode BlockTableRecord.GetBlockReferencIds() de la défintion de bloc (plus performant), puis pour chaque référence, parcourir la collection de références d'attributs (AttributeCollection) pour trouver la référence d'attribut recherchée.
  7. Salut, C'était mon premier message sur CADxp. Cette routine LISP a été écrite pour dessiner les triangulations ou contreventements dont la construction peut parfois être un peu fastidieuse (CF le screencast). Elle peut en fait servir à dessiner tout contour trapézoïdal à partir d'une hauteur (la largeur du contreventement), d'un point à chacune des extrémités (situés sur la même base ou non) et de l'angle depuis chacun de ces points, soit 4 clics une fois la hauteur paramétrée. Pratiquement, pour dessiner tout profil dont les coupes aux extrémités peuvent être de fausse équerre. J'ai repris cette routine en .NET pour en faire un plugin (AutoCAD 2013 et plus) que je propose ici en test. Télécharger et exécuter TrapezeSetup.msi pour installer le plugin sur toutes les versions d'AutoCAD (et verticaux) de 2013 à 2018. Télécharger Trapezoid.zip depuis cette page, débloquer puis extraire et exécuter TrapezeSetup.msi pour installer le plugin sur toutes les versions d'AutoCAD (et verticaux) depuis 2013. Lancer la commande TRZ. La hauteur est enregistrée avec le dessin. Le code : using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using static System.Math; using AcAp = Autodesk.AutoCAD.ApplicationServices.Application; [assembly: CommandClass(typeof(Trapeze.Commands))] namespace Trapeze { public class Commands { Document doc; Database db; Editor ed; double height; public Commands() { doc = AcAp.DocumentManager.MdiActiveDocument; db = doc.Database; ed = doc.Editor; height = GetHeight(); db.BeginSave += (s, e) => SaveHeight(); } [CommandMethod("TRZ")] public void Trapeze() { PromptPointOptions ppo; PromptPointResult ppr; Point3d pt1; while (true) { ppo = new PromptPointOptions($@" Hauteur courante = {height} Spécifiez le premier coin ou [Hauteur du trapeze]: ", "Hauteur"); ppo.Keywords.Default = "Hauteur"; ppr = ed.GetPoint(ppo); if (ppr.Status == PromptStatus.Keyword) { var pdo = new PromptDistanceOptions("\nSpécifiez la hauteur: "); pdo.DefaultValue = height; pdo.UseDefaultValue = true; var pdr = ed.GetDistance(pdo); if (pdr.Status != PromptStatus.OK) return; height = pdr.Value; } else { if (ppr.Status != PromptStatus.OK) return; pt1 = ppr.Value; break; } } ppo.Message = "\nSpécifiez un point dans la direction de ce côté: "; ppo.AppendKeywordsToMessage = false; ppo.BasePoint = pt1; ppo.UseBasePoint = true; ppr = ed.GetPoint(ppo); if (ppr.Status != PromptStatus.OK) return; var pt2 = ppr.Value; ppo.Message = "\nSpécifiez l'autre extémité de la base ou de la diagonale: "; ppr = ed.GetPoint(ppo); if (ppr.Status != PromptStatus.OK) return; var pt3 = ppr.Value; using (var tr = db.TransactionManager.StartTransaction()) using (var pline = new Polyline(4)) { pline.AddVertexAt(0, new Point2d(pt1.X, pt1.Y), 0.0, 0.0, 0.0); pline.AddVertexAt(1, new Point2d(pt1.X, pt1.Y), 0.0, 0.0, 0.0); pline.AddVertexAt(2, new Point2d(pt3.X, pt3.Y), 0.0, 0.0, 0.0); pline.AddVertexAt(3, new Point2d(pt3.X, pt3.Y), 0.0, 0.0, 0.0); pline.Closed = true; pline.Elevation = pt1.Z; var ucs = ed.CurrentUserCoordinateSystem; pline.TransformBy(ucs); var jig = new TrapezeJig(pline, height, pt1.TransformBy(ucs), pt2.TransformBy(ucs), pt3.TransformBy(ucs)); var pr = ed.Drag(jig); if (pr.Status == PromptStatus.OK) { var curSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); curSpace.AppendEntity(pline); tr.AddNewlyCreatedDBObject(pline, true); } tr.Commit(); } } private void SaveHeight() { using (var tr = db.TransactionManager.StartOpenCloseTransaction()) { var NOD = (DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead); DBDictionary dict; if (NOD.Contains("GILE_TRAPEZE")) { dict = (DBDictionary)tr.GetObject(NOD.GetAt("GILE_TRAPEZE"), OpenMode.ForRead); } else { NOD.UpgradeOpen(); dict = new DBDictionary(); NOD.SetAt("GILE_TRAPEZE", dict); tr.AddNewlyCreatedDBObject(dict, true); } Xrecord xrec; if (dict.Contains("TrapezeHeight")) { xrec = (Xrecord)tr.GetObject(dict.GetAt("TrapezeHeight"), OpenMode.ForWrite); } else { xrec = new Xrecord(); dict.SetAt("TrapezeHeight", xrec); tr.AddNewlyCreatedDBObject(xrec, true); } xrec.Data = new ResultBuffer(new TypedValue(40, height)); tr.Commit(); } } private double GetHeight() { using (var tr = db.TransactionManager.StartOpenCloseTransaction()) { var NOD = (DBDictionary)tr.GetObject(db.NamedObjectsDictionaryId, OpenMode.ForRead); if (NOD.Contains("GILE_TRAPEZE")) { var dict = (DBDictionary)tr.GetObject(NOD.GetAt("GILE_TRAPEZE"), OpenMode.ForRead); if (dict.Contains("TrapezeHeight")) { var xrec = (Xrecord)tr.GetObject(dict.GetAt("TrapezeHeight"), OpenMode.ForWrite); return (double)xrec.Data.AsArray()[0].Value; } } return 10.0; } } class TrapezeJig : EntityJig { Polyline pline; Plane plane; Point3d dragPt, basePt; Point2d p1, p2, p3; Vector2d v1, v2, v3; double width, a1; public TrapezeJig(Polyline pline, double width, Point3d pt1, Point3d pt2, Point3d pt3) : base(pline) { this.pline = pline; this.width = width; plane = new Plane(Point3d.Origin, pline.Normal); basePt = pline.GetPoint3dAt(2); p1 = pt1.Convert2d(plane); p2 = pt2.Convert2d(plane); p3 = pt3.Convert2d(plane); v1 = p1.GetVectorTo(p3); v2 = p1.GetVectorTo(p2).GetNormal(); a1 = v2.Angle - v1.Angle; } protected override SamplerStatus Sampler(JigPrompts prompts) { var options = new JigPromptPointOptions("\nSpécifiez un point dans la direction de ce côté: "); options.UseBasePoint = true; options.BasePoint = basePt; options.Cursor = CursorType.RubberBand; options.UserInputControls = UserInputControls.Accept3dCoordinates | UserInputControls.UseBasePointElevation; var result = prompts.AcquirePoint(options); if (result.Value.IsEqualTo(dragPt)) return SamplerStatus.NoChange; dragPt = result.Value; return SamplerStatus.OK; } protected override bool Update() { v3 = p3.GetVectorTo(dragPt.Convert2d(plane)).GetNormal(); double a2 = v3.Angle - v1.Angle; Point2d pt1, pt2, pt3, pt4; if (Sign(Sin(a1)) == Sign(Sin(a2))) { double d1 = Abs(width / Sin(a1)); double d2 = Abs(width / Sin(a2)); pt1 = p1 + v2 * d1; pt2 = p3 + v3 * d2; pt3 = p3; pt4 = p1; } else { double a0 = Acos(width / v1.Length); double d1, d2; if (Sin(a1) < 0) { d1 = Abs(width / Cos(a0 + a1)); d2 = Abs(width / Cos(a0 + a2)); } else { d1 = Abs(width / Cos(a0 - a1)); d2 = Abs(width / Cos(a0 - a2)); } pt1 = p1; pt2 = p1 + v2 * d1; pt3 = p3; pt4 = p3 + v3 * d2; } if (IsConvex(pt1, pt2, pt3, pt4)) { pline.SetPointAt(0, pt1); pline.SetPointAt(1, pt2); pline.SetPointAt(2, pt3); pline.SetPointAt(3, pt4); } return true; } private bool IsConvex(Point2d pt1, Point2d pt2, Point2d pt3, Point2d pt4) { var a1 = (pt2 - pt1).Angle; var a2 = (pt3 - pt2).Angle; var a3 = (pt4 - pt3).Angle; var a4 = (pt1 - pt4).Angle; var sign = Sign(Sin(a1 - a2)); return Sign(Sin(a2 - a3)) == sign && Sign(Sin(a3 - a4)) == sign; } } } }
  8. Salut, Dans le LISP "P2B" (que je ne me souviens pas avoir écrit, mais je ne me souvenais pas non plus pour "rtable"), dans "P2B" donc, tu dois trouver une expression du genre : (getstring "\nSaisir le nom du bloc: ") Il suffit de mettre un : T après getsring pour que l'invite accepte les espaces : (getstring T "\nSaisir le nom du bloc: ") Néanmoins, il est toujours préférable d'éviter les espaces dans les noms de blocs, calques, styles, fichiers, etc...
  9. Salut, Que retourne la fonction entsel ? Quel est le type de Txt_Clic dans l'expression : (setq Txt_Clic (entsel "\nSélectionnez l'altitude :")) ? Si on peut faire : (car Txt_Clic), on devrait pouvoir aussi faire : (cdr Txt_Clic) ou (cadr Txt_Clic)...
  10. ;; Select Blocks by Attribute Value - Lee Mac ;; Selects all attributed blocks in the current layout which contain a specified attribute value. (defun c:selblkbyattval (/ att atx ent idx sel str) (vl-load-com) (if (/= "" (setq str (strcase (getstring t "\nEntrez la ou les valeurs de l'attribut (Séparez les valeurs par une virgule) : ") ) ) ) (if (and (setq sel (ssget "_X" (list '(0 . "INSERT") '(2 . "Bulle,`*U*") '(66 . 1) (cons 410 (getvar 'ctab)) ) ) ) (progn (repeat (setq idx (sslength sel)) (setq ent (ssname sel (setq idx (1- idx)))) (if (= (vla-get-Effectivename (vlax-ename->vla-object ent)) "Bulle") (progn (setq att (entnext ent) atx (entget att) ) (while (and (= "ATTRIB" (cdr (assoc 0 atx))) (not (wcmatch (strcase (cdr (assoc 1 atx))) str)) ) (setq att (entnext att) atx (entget att) ) ) (if (= "SEQEND" (cdr (assoc 0 atx))) (ssdel ent sel) ) ) ) ) (< 0 (sslength sel)) ) ) ;;; Modification by Patrick_35 (progn (zoomobject (mapcar '(lambda (x) (vlax-ename->vla-object (cadr x))) (ssnamex sel))) (sssetfirst nil sel) ) ;;; Fin de la modification by Patrick_35 (princ (strcat "\nAucun bloc trouvé avec la valeur d'attribut \"" str "\".")) ) ) (princ) ) ;; ZoomObject Effectue un zoom sur les objets contenus dans la liste ;; ;; Argument ;; objlst : une liste de vla-object ;; ;; Variables ;; dir : normale du plan de la vue courante ;; ang : angle de la vue courante ;; 3x3 : matrice de transformation du SCG vers la vue courante (dimension 3) ;; 4x4 : matrice de transformation du SCG vers la vue courante (dimension 4) ;; ptlst : liste des points minimum et maximum des bounding-boxes des objets sélectionnés (SCG) (defun ZoomObject (objlst / dir ang 3x3 4x4 ptlst) (vl-load-com) (setq dir (mapcar '- (trans (getvar "viewdir") 1 0) (trans '(0 0 0) 1 0) ) ang (- (getvar "viewtwist")) 3x3 (mxm (mapcar '(lambda (x) (trans x 0 dir)) '((1 0 0) (0 1 0) (0 0 1)) ) (list (list (cos ang) (- (sin ang)) 0) (list (sin ang) (cos ang) 0) '(0 0 1) ) ) 4x4 (append (mapcar '(lambda (v o) (append v (list o)) ) 3x3 '(0 0 0) ) (list '(0 0 0 1)) ) ) (foreach obj objlst (vla-TransformBy obj (vlax-tmatrix (trp 4x4))) (vla-getBoundingBox obj 'minpt 'maxpt) (vla-TransformBy obj (vlax-tmatrix 4x4)) (setq ptlst (cons (vlax-safearray->list minpt) (cons (vlax-safearray->list maxpt) ptlst) ) ) ) (vla-ZoomWindow (vlax-get-acad-object) (vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'min ptlst)))) (vlax-3d-point (mxv 3x3 (apply 'mapcar (cons 'max ptlst)))) ) ) ;; transpose une matrice Doug Wilson (defun trp (m) (apply 'mapcar (cons 'list m)) ) ;; Apply a transformation matrix to a vector by Vladimir Nesterovsky (defun mxv (m v) (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m) ) ;; Multiply two matrices by Vladimir Nesterovsky (defun mxm (m q) (mapcar '(lambda (r) (mxv (trp q) r)) m) )
  11. Dans ton code, tu remplaces : (= (vla-get-EffectiveName ent) "Bulle") par: (= (vla-get-EffectiveName (vlax-ename->vla-object ent)) "Bulle")
  12. Probablement ent qui est nil. Voir cette réponse.
  13. Oupss!... (if (= (vla-get-EffectiveName (vlax-ename->vla-object ent)) "Bulle") ...)
  14. Salut, Quand on modifie les propriétés dynamiques d'un bloc dynamique, AutoCAD crée une nouvelle définition de bloc anonyme : *Uxxx. On ne peut donc pas directement filtrer une sélection de blocs dynamiques avec le nom du bloc. Tu peux sélectionner tous les blocs "Bulle" et les blocs anonymes de l'espace courant et, dans la boucle (repeat ...) ne traiter que les blocs dont le "nom effectif" est : "Bulle". (if (and (setq sel (ssget "_X" (list '(0 . "INSERT") '(2 . "Bulle,`*U*") '(66 . 1) (cons 410 (getvar 'ctab)) ) ) ) (repeat (setq idx (sslength sel)) (setq ent (ssname sel (setq idx (1- idx)))) (if (= (vla-get-EffectiveName ent) "Bulle") (progn ;; ... ) ) ) ) )
  15. Salut, Un petit screencast pour montrer quelques fonctions de débogage de l'éditeur Visual LISP. Mais qu'un code soit débogué (qu'il ne génère plus d'erreurs) ne veut pas dire qu'il fonctionne comme attendu. On ne renomme pas des référence de bloc, on renomme les définitions de bloc...
  16. Salut, Difficile à dire... As-tu essayé avec plusieurs points d'arrêt a des endroits différents ?
  17. Pour savoir ou est l'erreur, tu peux utiliser la méthode décrite chapitre 4.5 de "Introduction à AutoLISP" : Si le déroulement d’une routine génère une erreur, on peut déterminer l’expression en cause en activant Arrêt sur erreur (Menu Débogage), puis en utilisant l’outil : Source de la dernière interruption (Ctrl+F9). Une fois l’erreur localisée, on doit Réinitialiser(Ctrl+Q). Je pense que ça devrait être : (setq n (+ n 1)) où n est nil.
  18. Salut, La fonction substr retourne la sous-chaîne depuis l'index spécifié (base 1) et, optionnellement, de la longueur spécifiée. La fonction vl-string-position retourne la position d'un caractère dans une chaîne. Ce que veux obtenir, c'est la sous-chaine depuis le premier caractère (indice 1) d'une longueur égale à la position du caractère "_". (substr str 1 (vl-string-position (ascii "_") str))
  19. Salut, La fonction substr retourne une partie de la chaîne, et la fonction strlen retourne la longueur de la chaîne Ce que tu veux est la sous-chaîne depuis le premier caractère (indice 1) d'une longueur égale à la chaîne moins 4 : (substr a 1 (- (strlen a) 4)) Mais il existe aussi une fonction qui retourne directement le nom d'un fichier sans l'extension (ni le chemin du dossier) : vl-filename-base. (vl-filename-base a)
  20. Salut, Pas besoin de stocker dans une variable, un script (comme la ligne de commande) accepte et évalue les expressions LISP. Donc, tu peux directement utiliser : (getvar "dwgname") ou, pour le chemin complet : (strcat (getvar "dwgprefix") (getvar "dwgname"))
  21. Ou, dans un style plus "fonctionnel" : (defun getSnap (pt / match) (defun match (modes) (cond ((null modes) nil) ((equal pt (osnap pt (cdar modes))) (car modes)) (T (match (cdr modes))) ) ) (match '((1 . "_END") (2 . "_MID") (4 . "_CEN") (8 . "_NOD") (16 . "_QUA") (32 . "_INT") (64 . "_INS") (128 . "_PER") (256 . "_TAN") (512 . "_NEA") (1024 . "_GCE") (2048 . "_APP") ) ) )
  22. Salut, Tu peux essayer ça : (defun getSnap (pt / modes) (setq modes '((1 . "_END") (2 . "_MID") (4 . "_CEN") (8 . "_NOD") (16 . "_QUA") (32 . "_INT") (64 . "_INS") (128 . "_PER") (256 . "_TAN") (512 . "_NEA") (1024 . "_GCE") (2048 . "_APP") ) ) (while (and modes (not (equal pt (osnap pt (cdar modes))))) (setq modes (cdr modes)) ) (car modes) ) (getSnap (setq pt(getpoint "\nCliquez un point: ")))retourne : (4 . "_CEN") si tu cliques sur un centre (1 . "_END") si tu cliques sur une extrémité nil si tu cliques dans le vide.
  23. Salut, En LISP, un filtre de sélection doit être une liste d'association de type liste DXF. (defun c:S4 (/ A1) (setq A1 (ssget "_X" (list (cons 8 "*4")))) ) ou : (defun c:S4 (/ A1) (setq A1 (ssget "_X" '((8 . "*4")))) ) Voir le chapitre 16.4 dans Introduction à AutoLISP.
  24. (gile)

    Screencast

    Salut, On peut toujours utiliser Autodesk screencast pour enregistrer et stocker les vidéos sur leur serveur et ensuite "incorporer" la vidéo sur CADxp en "activant le HTML". Dès que j'aurai un peu plus de temps, je ferais un screencast pour montrer comment on fait...
  25. Essaye ça : (alert (if (setq txt (InputBox "Test" "Entrez un texte:" "")) (strcat "Texte : \"" txt "\"") "Annulation" ) )
×
×
  • 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é