-
Compteur de contenus
12 247 -
Inscription
-
Dernière visite
-
Jours gagnés
209
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par (gile)
-
Petit problème de lecture et de tri...
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Essaye comme ça : (setq ListLine nil) ;; on crée une liste de sous-listes en lisant le fichier (while (setq LstCalqLine (read-line FichLstCalq)) (setq ListLine (cons (str2lst LstCalqLine "#") ListLine)) ) ;; on ferme le fichier (close FichLstCalq) ;; pour chaque sous-liste (ligne) (foreach line Listline (setq nomCalque (strcat (vlax-ldata-get "DenisH" "ECPSNiveauCalq") "_" (car line) ) ) (command "_layer" "_make" nomCalque "_color") ;; si on est en couleur RGB, on ajoute l'option _true (if (vl-string-search "," (cadr line)) (command "_true") ) (command (cadr line) nomCalque "_ltype" (caddr line) nomCalque "_lweight" (/ (atoi (cadddr line)) 100.) nomCalque "_description" (last line) nomCalque "" ) ) -
Petit problème de lecture et de tri...
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Salut, Je ne sais pas d'où vient ce fichier .LstCalq, mais la première chose quand on fait un fichier de données de ce type est de le structurer de façon à ce qu"il soit facilement "lisible". Le format le plus simple (.csv) utilise un séparateur pour le données (la virgule -le comma dans Comma Separated Values- remplacée par le point-virgule dans les langues (comme le français) qui utilisent la virgule comme séparateur décimal) et un séparateur pour les lignes (\n ou \r\n). Dans ton fichier il semble qu'il n'y en ait qu'un (#) ce qui déjà ne facilite pas la lecture. Ensuite, pour la couleur, tu peux utiliser str2lst avec la virgule comme séparateur sur le champ 'couleur' et si la liste contient 3 éléments, c'est du RGB, si elle ne contient qu'un élément, c'est une couleur de l'index, dans tous les autres cas, c'est une erreur... PS : quand on fait (open ...), bien penser à faire un (close ...) pour refermer le flux. -
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
J'aiderais certainement, dans la mesure de mes moyens, tous ceux qui voudraient se lancer dans l'aventure de la programmation d'AutoCAD avec .NET. Mais quand certains semblent vouloir se lancer dans .NET parce qu'ils ont du mal avec AutoLISP, ça me fait vraiment penser à une fuite en avant, du style : j'ai du mal à utiliser une bicyclette, je vais plutôt essayer l'hélicoptère. Parce qu'à ma connaissance le langage LISP (et plus encore le dialecte AutoLISP) est certainement le langage de programmation le plus simple qui soit. Du point de vue de l'architecture du langage LISP se définit simplement comme ceci: - Un programme LISP est une liste d'expressions LISP - Une expression LISP est soit un atome ; soit une liste d'expressions LISP - un atome est un nombre, une chaîne, une fonction, ... Donc pas de classes, de méthodes (voire de procédures et fonctions), de propriétés, d'évènements, de tableaux, de dictionnaires, ... Du point de vue de la syntaxe, une seule et unique règle : la notation préfixée dans des parenthèses. Si on prend l'exemple du calcul de la longueur d'un vecteur 2D défini par ses coordonnées x et y avec le théorème de Pythagore, en LISP, on écrit : (sqrt (+ (* x x) (* y y))) avec la plupart des langages "classiques", on écrit : Sqrt(x * x + y * y) Si cette dernière peut sembler plus simple, ce n'est qu'une illusion. En LISP on n'utilise que des fonctions (sqrt, *, +) et toujours de la même façon : (fonction [argument ...]) Avec les langages classiques, on mélange fonctions (sqrt) et opérateurs (*, +) avec deux syntaxes différentes : fonction([arguments ...]) et : opérande opérateur opérande. De plus, là ou le dernier exemple fait appel à une notion de priorité entre les opérateur pour effectuer les multiplications avant l'addition, en LISP, l'usage systématique des parenthèses écarte toute équivoque. Donc rien de vraiment insurmontable si on veut faire de la programmation. En tout cas, les problèmes de syntaxe sont vraiment minimes par rapport aux différences de paradigmes et d'architecture. -
Créer un champ avec une macro-commande
(gile) a répondu à un(e) sujet de nen dans Personnalisation, macros, DIESEL
Salut, Je pense que ce n'est pas possible avec Diesel, les expressions de champs liés à des objets utilisent un identifiant pour l'objet ciblé (ObjectId) qui n'est accessible que par programmation (Visual LISP, VBA, .NET ou ObjectARX). -
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
Rien qu'à lire ça, on voit que les notions de bases ne sont pas acquises. Je n'ai jamais fait de tuto pour la "mise en place d'une classe autocad". -
Supprimer une XDATA en VLA
(gile) a répondu à un(e) sujet de Fraid dans Pour aller plus loin en LISP
Salut, Pour modifier plus facilement les xdata (et plus généralement pour rendre plus "LISP friendly" les variants et autres joyeusetés), tu trouveras en bas de cette page une petite bibliothèque de routines nommée AutomationHelpers qui contient, entre autre, deux fonctions : gc:GetXdata et gc:SetXdata qui, respectivement, retournent ou prennent en argument une liste DXF. Pour supprimer toutes les données pour une application, tu fais simplement (gc:setxdata '((1001 . "NomApplication"))). -
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
Je le redis encore : essayer de programmer AutoCAD avant d'être à l'aise avec les notions de POO (classes, interfaces, structures, héritage, etc.), l'IDE Visual Studion (solution, projet, références, etc.) et le langage C#, c'est comme s'inscrire à un marathon avant de savoir marcher. Il existe nombre de tutoriels et bouquins en français pour démarrer en .NET / C#. -
Problème de lenteur de l'éditeur Vlisp
(gile) a répondu à un(e) sujet de Didier du 19 dans Visual LISP
Salut, Le changement en LISP avec AutoCAD 2021 est essentiellement la possibilité d'utiliser Visual Studio Code comme IDE et de reconnaitre les caractères Unicode. Tes traitements itératifs ou grande listes concernent-ils des chaînes de caractères ? Quelle est la valeur de LISPSYS ? En mettant LISPSYS à 0 (et en redémarrant AutoCAD) on retrouve l'ancien environnement (VLIDE et caractères ASCII). C'est peut-être une piste. -
[RESOLU] Une commande pour un bouton LANCEMENT VBA VIA LISP
(gile) a répondu à un(e) sujet de Curlygoth dans AutoCAD 2015
Si dans les boutons tu n'as que le vbarun : ^c^c^p-vbarun "C:/.../FICHIER.dvb!MODULE.PROC_SUB"c'est que le fichier DVB est chargé par ailleurs. Donc en LISP il suffirait de faire : (defun c:USF () ; le nom que tu veux (vl-vbarun "USF") ; le nom de la macro (princ) ) Non, pas autre nom, acaddoc.lsp avec un seul c. À l'ouverture de chaque dessin, AutoCAD cherche un fichier nommé acaddoc.lsp dans les chemin de recherche et, s'il le trouve, il le charge. pourquoi ne pas "insérer" les ^C^C dans le le Nom USF de base dans le Lancement.lsp que j'ai créé ? C^C^ c'est uniquement pour les macros de commande AutoCAD. Ça n'a aucune signification en LISP. Fais les choses tranquillement, calmement. Tu sembles surexcité, les exemples que tu donnes ne sont pas cohérents : (vl-vbaload "C:\\K2M\\ACAD\\LANCEMENT.lsp") -
[RESOLU] Une commande pour un bouton LANCEMENT VBA VIA LISP
(gile) a répondu à un(e) sujet de Curlygoth dans AutoCAD 2015
Nos messages se sont croisés. Je parlais de macro AutoCAD (ce qu'il y a dans les boutons) pas de macro VBA. -
[RESOLU] Une commande pour un bouton LANCEMENT VBA VIA LISP
(gile) a répondu à un(e) sujet de Curlygoth dans AutoCAD 2015
Normalement, avec vl-vbarun tu as juste besoin de passer le nom de la macro, pas le chemin complet (voir l'aide). Pour le chargement, tu peux créer, dans un dossier des chemins de recherche, un fichier nommé : acaddoc.lsp dans lequel tu mets toutes les définitions de commande LISP. Ce fichier sera automatiquement chargé dans chaque dessin AutoCAD. -
[RESOLU] Une commande pour un bouton LANCEMENT VBA VIA LISP
(gile) a répondu à un(e) sujet de Curlygoth dans AutoCAD 2015
Montre le contenu d'une ou deux macros, on les convertira en commandes LISP. -
[RESOLU] Une commande pour un bouton LANCEMENT VBA VIA LISP
(gile) a répondu à un(e) sujet de Curlygoth dans AutoCAD 2015
Salut, Le plus simple est de définir une commande LISP. Exemple pour une macro VBA avec les fonctions vl-vbaload et vl-vbarun. (defun c:TOTO () (vl-vbaload "C:\Macros VBA\AutoCAD\laMacro.dvb") (vl-vbarun "laMacro") (princ) )ensuite tu peux simplement entrer : TOTO en ligne commande (et simplifier ta macro AutoCAD : ^C^Ctoto). Si tu ne veux absolument pas de LISP, le seul autre moyen, à ma connaissance, pour définir une commande AutoCAD est de le faire .NET ou ObjectARX, mais là, c'est vraiment comme prendre l'avion pour acheter une baguette de pain à un pâté de maison. -
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
Ça reste une convention, il n'y a pas d'obligation. Mais indiquer le type de la variable dans son nom me parait redondant dans un environnement statiquement typé. Entre parenthèses, le nommage des variables et arguments dans les exemples de la documentation Autodesk est aussi très loin de cette convention. -
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
C'est essentiellement par flemme, mais aussi : - parce que je n'aime pas les redondances du style : PromptPointOptions options = new PromptPointOptions("\nPremier point: "); - parce qu'il suffit de placer son curseur sur la variable pour avoir son type dans une infobulle - parce que l'inférence de type est la "norme" en F# - parce que j'essaye de respecter cette convention de nommage -
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
Bravo Olivier! Ce coup ci je ne pense pas qu'on ait droit à un "on peut faire la même chose en LISP avec (command ...)" ;) -
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
Pour programmer AutoCAD avec .NET tu ne trouveras rien en français. Par contre, tu trouveras des tutoriels et/ou des livres pour débuter en .NET dans Windows (hors AutoCAD) et c'est par là qu'il faut commencer. Je pense qu'il faut être à l'aise avec les notions de POO (Programmation Orientée Objet : notions de classes, héritage, encapsulation, polymorphisme), l'IDE Visual Studio (solution, projets, bibliothèques en référence, ...) et un langage supporté (encore une fois, je recommande C#) avant d'essayer de se lancer dans l'API .NET d'AutoCAD qui est assez complexe et pas toujours très bien foutue. Et là, toute la documentation est en anglais. -
Geler des claques nouveaux dans des FMULT existantes
(gile) a répondu à un(e) sujet de BernardL dans AutoCAD, liste de souhaits
Je ne connais pas de livre, mais je te ferais le même conseil que je fais à tout le monde : si tu veux te lancer dans .NET fais le avec C#, tu auras plus d'aide et plus d'exemples venant le plus souvent de programmeurs plus expérimentés. De plus, ça te permettra de te débarrasser plus facilement des habitudes prises avec VBA pour aborder plus sereinement un environnement radicalement différent. Apprendre un langage n'est vraiment rien comparer à apprendre .NET et l'API .NET d'AutoCAD. -
Geler des claques nouveaux dans des FMULT existantes
(gile) a répondu à un(e) sujet de BernardL dans AutoCAD, liste de souhaits
Ce qui est terrible avec ceux qui posent une question mais ne font jamais de retour sur les réponses qu'ils ont eu, c'est qu'on ne sait pas s'ils ont résolu leur problème. Dans tous les cas, si j'ai bien compris la demande, pas besoin de développement, la commande FCALQUE (_VPLAYER) propose cette option (Nouvgel / _Newfr). -
Salut, Vues et SCU sont deux choses indépendantes mais on peut paramétrer AutoCAD pour les lier : - avec UCSFOLLOW à 1, la vue s'aligne automatiquement sur le SCU quand il change ; - avec UCSORTHO à 1, le SCU s'aligne automatiquement sur la vue quand on change de vue orthogonale, ce qu'on voit au début de la vidéo quand il passe en vue Avant (Front)).
-
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
Je dois tirer mon chapeau à didier, qui a été malin pour facilement contourner ce que je pensais être une difficulté en LISP en utilisant la commande native ECHELLE (_SCALE). Je propose donc de mettre la barre un peu plus haut. Côté géométrie, on peut rendre la commande plus polyvalent en ne se limitant pas au carré et en demandant le nombre de sommets du polygone inscrit/circonscrit. Côté affichage, on peut aussi demander la rotation et, plus difficile (si je ne me trompe pas cette fois) combiner échelle et rotation. ChallengeCerclePolygone.zip -
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
Hé, Denis, tu ne réponds jamais aux challenges que tu lances. Autrefois, celui qui lançait un challenge avait une réponses déjà prête dans les tuyaux... Perso, en LISP j'aurais simplement fait ça: (defun c:test (/ cen rad nb) (initget 6) (and (setq nb (getint "\nNombre de cercles: ")) (setq cen (getpoint "\nCentre du cercle: ")) (setq rad (getdist cen "\nRayon du cercle: ")) (repeat nb (command "_.circle" "_non" cen rad) (command "_.rectang" "_non" (polar cen (* PI 1.25) rad) "_non" (polar cen (* PI 0.25) rad)) (setq rad (* rad (sqrt 0.5))) ) ) (princ) ) -
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
Si tu veux te lancer dans l'aventure, bienvenue à toi. Mais sache que c'est un gros morceau. Je pense qu'avant d'attaquer la programmation d'AutoCAD il faut se familiariser avec l'environnement .NET à savoir : Visual Studio (le plus gros logiciel de chez Microsoft). Visual Studio Code peut suffire pour te dégrossir dans l'environnement Windows mais un "vrai" Visual Studio est nécessaire pour AutoCAD (la version Community est gratuite) ; la Programmation Orientée Objet (les classes, l'héritage, le polymorphisme, l'encapsulation, ...) le typage statique (*]un langage supporté, je recommande fortement C#,il a été créé pour .NET et c'est le plus utilisé. VB.NET est une adaptation de VB à l'environnement .NET qui a conservé la plupart des trucs foireux du VB... de plus, Microsoft a annoncé qu'il ne ferait plus évoluer le VB.NET (C# évolue régulièrement avec de nouvelle fonctionnalités). Ceci fait, (il faut compter quelques mois avec l'aide de livres et/ou de tutos sérieux) tu pourras aborder l'API .NET d'AutoCAD qui n'est pas d'un accès si facile. Après, dans Visual Studio, tu référence les bibliothèques AutoCAD, tu codes, tu compiles en DLL, tu charges la DLL dans AutoCAD pour l'utiliser. -
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
Un exemple en .NET (C#). Nombre de cercles limité : minimum 4, maximum 32. Valeur par défaut du nombre de cercles (dernière valeur entrée). Affichage dynamique pendant la saisie du rayon. Fonctionnement suivant le SCU courant. Si vous avez confiance, téléchargez le fichier ChallengeCercleCarre.zip joint, le débloquer, extraire la DLL ChallengeCercleCarre.dll, la charger dans AutoCAD avec NETLOAD et lancer la commande CCC. using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.GraphicsInterface; using Autodesk.AutoCAD.Runtime; using System.Collections.Generic; using static System.Math; using AcAp = Autodesk.AutoCAD.ApplicationServices.Core.Application; using AcDb = Autodesk.AutoCAD.DatabaseServices; namespace ChallengeCercleCarre { public class Commands { static int numOfCircles = 4; [CommandMethod("CCC")] public static void ChallengeCercleCarre() { var doc = AcAp.DocumentManager.MdiActiveDocument; var db = doc.Database; var ed = doc.Editor; var intOptions = new PromptIntegerOptions("\nEntrez le nombre de cercles: "); intOptions.DefaultValue = numOfCircles; intOptions.UseDefaultValue = true; intOptions.LowerLimit = 4; intOptions.UpperLimit = 32; var intResult = ed.GetInteger(intOptions); if (intResult.Status != PromptStatus.OK) return; numOfCircles = intResult.Value; var pointResult = ed.GetPoint("\nSpécifiez le centre : "); if (pointResult.Status != PromptStatus.OK) return; var center = pointResult.Value; double radius = 1.0; var ucs = ed.CurrentUserCoordinateSystem; using (var tr = db.TransactionManager.StartTransaction()) { var cSpace = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); var entities = new List<Entity>(); for (int i = 0; i < numOfCircles; i++) { var circle = new Circle(center, Vector3d.ZAxis, radius); circle.TransformBy(ucs); entities.Add(circle); var pline = new AcDb.Polyline(); pline.AddVertexAt(0, new Point2d(center.X + radius, center.Y), 0.0, 0.0, 0.0); pline.AddVertexAt(1, new Point2d(center.X, center.Y + radius), 0.0, 0.0, 0.0); pline.AddVertexAt(2, new Point2d(center.X - radius, center.Y), 0.0, 0.0, 0.0); pline.AddVertexAt(3, new Point2d(center.X, center.Y - radius), 0.0, 0.0, 0.0); pline.Elevation = center.Z; pline.Closed = true; pline.TransformBy(ucs * Matrix3d.Rotation(PI * 0.25, Vector3d.ZAxis, center)); entities.Add(pline); radius *= Sqrt(0.5); } var jig = new ScaleJig(entities, center.TransformBy(ucs)); var jigResult = ed.Drag(jig); if (jigResult.Status == PromptStatus.OK) { foreach (var entity in entities) { cSpace.AppendEntity(entity); tr.AddNewlyCreatedDBObject(entity, true); entity.TransformBy(jig.Transform); } } else { foreach (var entity in entities) { entity.Dispose(); } } tr.Commit(); } } class ScaleJig : DrawJig { List<Entity> entities; Point3d center; double radius; public Matrix3d Transform { get; private set; } public ScaleJig(List<Entity> entities, Point3d center) { this.entities = entities; this.center = center; } protected override SamplerStatus Sampler(JigPrompts prompts) { var options = new JigPromptDistanceOptions("\nSpécifiez le rayon: "); options.BasePoint = center; options.UseBasePoint = true; options.Cursor = CursorType.RubberBand; options.UserInputControls = UserInputControls.Accept3dCoordinates; var result = prompts.AcquireDistance(options); if (result.Value == radius) return SamplerStatus.NoChange; radius = result.Value; Transform = Matrix3d.Scaling(radius, center); return SamplerStatus.OK; } protected override bool WorldDraw(WorldDraw draw) { var geometry = draw.Geometry; if (geometry != null) { geometry.PushModelTransform(Transform); foreach (var entity in entities) { geometry.Draw(entity); } geometry.PopModelTransform(); } return true; } } } } ChallengeCercleCarre.zip -
Vous aimez les challenges ? ? ?
(gile) a répondu à un(e) sujet de DenisHen dans Programmer en s'amusant
Salut, S'il s'agit de dessiner dans AutoCAD, on ne peut le faire qu'avec 4 API : AutoLISP, donc uniquement en LISP COM/ActiveX, avec tous langage ayant accès à l'interface COM : VBA, Visual LISP, C#, F#, VB.NET, C, C++, Python, ... .NET, avec tous les langages supportant .NET : C#, F#, VB.NET, IronPython, ... ObjectARX, uniquement avec C/C++ Qu'est-ce qu'on veut comparer ? Les capacités des différentes API à régler les problèmes géométriques ? La façon dont on dessine dans AutoCAD suivant l'API ? Les possibilités des différentes API pour la saisie des données (interface utilisateur, saisie avec affichage dynamique) ?
