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. Salut, À ma connaissance c'est possible en .NET, mais uniquement avec RealDwg (dont la licence coûte à peu près le même prix d'un AutoCAD).
  2. Je ne cherchais pas à te vexer, mais je vais le faire. Si tu ne connais pas des termes, tu les cherches sur Google. Si C# permet la programmation impérative, comme la plupart des langages, tout l'environnement .NET est basé sur la Programmation Orientée Objet. Les livres que j'ai sont vieux : "Visual C# 2005", "C# Développez avec Visual Studio 2008" et "C# et .NET versions 1 à 4" et ne sont plus édités (on en est à C# 8 et Visual Studio 2019). N'y avait-il pas d'autre critiques du bouquin en question que celle que tu cites ? Mais il faudrait avant tout te poser les bonnes questions : Que connais-tu de .NET ? Pourquoi veux-tu t'y mettre ?
  3. @DenisHen Comme je disais, je n'ai pas lu ce livre, mais, à mon avis, la critique en dit plus long sur son auteur que sur le livre. À mon sens, ce sont justement ces concepts d'héritage, de polymorphisme, d'encapsulation, etc. qu'il convient d'acquérir. Utiliser .NET pour faire uniquement de la programmation impérative (procédurale), c'est comme de ne dessiner que des lignes dans AutoCAD.
  4. Je ne connais pas ces livres, mais d'après les sommaires, "C# 8 et Visual Studio 2019 - Les fondamentaux du langage" me semble mieux convenir pour démarrer.
  5. J'oubliais, la réponse à la question titre est évidemment : non. Dans les années 2010 (quand Microsoft parlait d'abandonner le VBA et qu'Autodesk était bien obligé de s'y plier), il y avait un exe développé par Autodesk appelé "super macro" qui convertissait (pas toujours très bien) du code VBA en code VB.NET mais sans changer d'API bien sûr (on restait avec l'API COM). C'était surtout pour permettre de porter facilement les programmes VBA existants en langage "VB.NET" mais sans utiliser l'API .NET. Donc, s'il s'agit de programmer en VB.NET avec la même interface COM qu'en VBA, je ne vois vraiment pas l'intérêt de s'embêter avec Visual Studio, la compilation des programmes, etc.
  6. Salut, À part une syntaxe ressemblante (Dim, Sub, Func, ...) VBA et VB.NET n'ont absolument rien à voir. Si tu veux te mettre au .NET, oublie VB et apprend plutôt C#. Apprendre un nouveau langage et sa syntaxe n'est vraiment rien à côté de tout ce que devras apprendre pour programmer en NET. C# est beaucoup plus proche de VB.NET que le VBA et tu auras plus d'aide, plus d'exemples en C# qu'en VB. Ensuite, comme je ne cesse de le répéter à ceux qui veulent débuter avec .NET, dans un premier temps oublier la programmation d'AutoCAD et apprendre la Programmation Orientée Objet (classes, héritage, encapsulation, polymorphisme), les bases du Framework .NET, l'IDE Visual Studio (projet, solution, compilation, etc.) avec les nombreux cours, tutoriels et livres (je ne saurais trop recommander l'achat d'au moins un livre de référence -j'en ai 3 pour C# et un pour F#) qu'on peut trouver. Et, seulement quand on est à l'aise avec tout ça, on peut envisager de commencer sereinement et efficacement à étudier l'API .NET d'AutoCAD. Commencer en programmant AutoCAD avec des bouts de codes glanés à droite et à gauche est le moyen le plus certain de se retrouver assez vite dans le mur. Ceci dit, tu feras comme bon te semble, mais je pense vraiment que si tu as du mal avec AutoLISP, ce n'est certainement pas avec .NET que tu auras plus de facilités.
  7. Salut, Avec le convertisseur de calques ? Commande CONVCALQUE.
  8. Salut, la routine suivante passe la largeur du MText de la cote passé en argument à 0 (il faut chercher le MText dans le bloc anonyme (*D...) de la côte. (defun dimTextWidthTo0 (dim / blk break ent dxf) (setq blk (tblsearch "block" (cdr (assoc 2 (entget dim)))) ent (cdr (assoc -2 blk)) ) (while (and ent (not break)) (if (= (cdr (assoc 0 (setq dxf (entget ent)))) "MTEXT") (progn (entmod (subst '(41 . 0.0) (assoc 41 dxf) dxf)) (setq break T) ) (setq ent (entnext ent)) ) ) ) PS @Fraid vlax-release-object n'est pas utile avec les objets AutoCAD. On l'utilise pour "libérer" les objets externes créés ou obtenus avec vlax-get-object, vlax-create-object ou vlax-get-or-create-object (ex : application Excel).
  9. (gile)

    Lisps de gile

    Salut Luna, il s'agit des liens vers les sujets d'où sont issus les routines (ou l'idée des routines) ces liens datent d'avant la première refonte de CADxp lors de son rachat vers 2010 et ils ont tous été perdus lors de cette refonte.
  10. @CurlygothLes seules interfaces de programmation supportés par AutoCAD MAC sont : AutoLISP (sans COM/ActiveX ni DCL) et ObjectARX/C++ donc ni VBA, ni .NET. Voir cette page. @DPB6804Désolé mais, le LISP Increment utilise un peu COM/ActiveX (ce qui aurait pu être transcrit en "pur AutoLISP") mais aussi des boites de dialogue DCL qui, comme dit ci-dessus ne sont pas supportées non plus par AutoCAD MAC.
  11. je crains que tu en ait dit une. VBA utilise précisément l'interface COM...
  12. Salut, AutoCAD MAC ne supporte pas entièrement le LISP. Toutes les fonctions dites Visual LISP qui utilisent l'interface COM ne sont pas reconnues (et pour cause, COM/ActiveX est spécifique à Windows).
  13. Bravo pour ce diagnostic !
  14. Je ne vois pas bien pourquoi, mais si tu arrives à implémenter cet algorithme en 15 lignes de VB(A) normalement formaté, je veux bien manger mon chapeau. Évidemment, quelle question. Je suis ravi que ceux qui ont participé se soient amusés, c'est aussi mon cas. Mais rien n'est arrêté, il y a certainement d'autres façons de faire et d'autres langages à explorer...
  15. Un nouvelle en F# (pas plus efficiente, mais un peu plus concise). let quickhull_ (pts: Point2d list) = let area (p1: Point2d) (p2: Point2d) (p3: Point2d) = ((p2.X - p1.X) * (p3.Y - p1.Y)) - ((p2.Y - p1.Y) * (p3.X - p1.X)) let rightPts p1 p2 pts = match List.choose(fun p -> let a = area p1 p2 p if a < 0. then Some (a, p) else None) pts with | [] -> None | lst -> Some (lst |> List.minBy fst |> snd, lst |> List.map snd) let rec loop p1 p2 pts = match rightPts p1 p2 pts with | None -> [p1] | Some (p, l) -> loop p1 p l @ loop p p2 l let minX = pts |> List.minBy (fun p -> p.X) let maxX = pts |> List.maxBy (fun p -> p.X) loop minX maxX pts @ loop maxX minX pts
  16. @didierBravo ! Pas si 'impératif' que ça. La réponse de @VDH-Bruno ne t'a pas fait d'ombre, tu as implémenté le "parcours de Graham" et Bruno un "quickhull". Voici ma réponse : ;; quickhull ;; ;; La fonction loop est celle qui implémente l'algorihme général ;; (loop p1 p2 pts) cherche dans pts des points à droite du segment p1 p2. ;; - S'il y en a (l), on prend le point le plus éloigné (pt) et on concatène ;; (loop p1 pt l) avec (loop pt p2 l) ;; - S'il n'y en a pas on garde p2. ;; ;; La fonction filter ;; (filter p1 p2 pts 'pt) renvoie les points de pts qui sont à droite de p1 p2 ;; et assigne à pt le point le plus éloigné ;; ;; La fonction area est utilisée pour déterminer si les points sont à droite ;; et quel est le plus éloigné. ;; (area p1 p2 pt) renvoie l'aire algébrique du triangle p1 p2 pt. ;; Cette aire est négative si pt est strictement à droite de p1 p2. ;; Elle est proportionnelle à la distance entre pt et le segment p1 p2. (defun quickhull (pts / area filter loop lst minX maxX) (defun area (p1 p2 p3) (- (* (- (car p2) (car p1)) (- (cadr p3) (cadr p1))) (* (- (cadr p2) (cadr p1)) (- (car p3) (car p1))) ) ) (defun filter (p1 p2 pts outparam / ref a lst) (setq ref 0) (foreach p pts (and (minusp (setq a (area p1 p2 p))) (setq lst (cons p lst)) (< a ref) (setq ref a) (set outparam p) ) ) lst ) (defun loop (p1 p2 pts / l pt) (if (setq l (filter p1 p2 pts 'pt)) (append (loop p1 pt l) (loop pt p2 l)) (list p2) ) ) (setq lst (mapcar 'car pts) minX (assoc (apply 'min lst) pts) maxX (assoc (apply 'max lst) pts) ) (append (loop minX maxX pts) (loop maxX minX pts)) )
  17. Super, ça démarre. @didier C'est pas grave si des réponses commencent à arriver, ce n'est pas un concours il s'agit juste d'apprendre en comparant différentes façon de faire et il me semble qu'il reste de place pour bien d'autres réponses. J'attendrai la tienne pour poster ma réponse en LISP. @VDH-Bruno Bravo, ça répond tout à fait à la demande. Je suis sûr que si tu as le temps tu pourras "optimiser" ta routine (ma réponse en LISP est proche de la tienne, mais plus concise). @Fraid Ça ne répond pas tout à fait à la demande donc on ne peut pas comparer directement avec les autres réponses et on est assez loin de l'algorithme du quicksort. En tout cas, c'est pas vraiment 'quick'. J'ai eu un peu peur quand vous parliez de "nuage de points", avec ta solution, il y a intérêt à ce que ce soit un cirrus de beau temps. Suivant la tâche à accomplir, certains langages sont plus ou moins bien adaptés. Dans ce cas là, parmi les langages que je connais F# est certainement le plus adapté. Je ne pense pas "divulgacher" le challenge en donnant une réponse en F# maintenant. let quickhull (pts: Point2d list) = let area (p1: Point2d) (p2: Point2d) (p3: Point2d) = ((p2.X - p1.X) * (p3.Y - p1.Y)) - ((p2.Y - p1.Y) * (p3.X - p1.X)) let rec rightPts p1 p2 min acc = function | [] -> acc | x :: xs -> match area p1 p2 x with | a when 0. <= a -> rightPts p1 p2 min acc xs | a -> match acc with | [] -> rightPts p1 p2 a [x] xs | y :: ys -> if a < min then rightPts p1 p2 a (x :: acc) xs else rightPts p1 p2 min (y :: x :: ys) xs let rec loop p1 p2 pts = match rightPts p1 p2 0. [] pts with | [] -> [p1] | h :: t -> loop p1 h t @ loop h p2 t let minX = pts |> List.minBy (fun p -> p.X) let maxX = pts |> List.maxBy (fun p -> p.X) loop minX maxX pts @ loop maxX minX pts
  18. Outre que je ne vois pas bien le rapport avec ce challenge, cet algorithme n'est pas fiable à 100%. Tu n'envisages pas le cas où la droite passe par un sommet (point vert) ou deux sommets (point jaune), ni celui où elle est tangente à un arc (point rouge). Dans ces trois cas, les points sont à l'intérieur mais la droite a 3 intersections... Ça m'a toujours intrigué cette tendance à la verbosité dans la culture VB : Point_dans_Polyligne = False If NbrePoints Mod 2 = 0 Then Point_dans_Polyligne = False Else Point_dans_Polyligne = True End If Alors qu'on devrait pouvoir écrire tout simplement : Point_dans_Polyligne = NbrePoints Mod 2 <> 0
  19. @CurlygothSi tu lis attentivement les articles de Wikipédia que j'ai donné en liens, tu auras une description du problème dans celui qui concerne l'enveloppe convexe et la description de deux algorithmes : parcours de Graham et quickhull.
  20. Le but du challenge est de fournir une fonction qui prends en argument une collection de points 2D (je conseille des commencer avec une ou quelques dizaines de points pas plus) et qui renvoie les points qui constituent l'enveloppe convexe de cette collection. J'ai implémenté ce type de fonction en utilisant l'algorithme dit du parcours de Graham (en C# et F# ainsi qu'en LISP : gc:ConvHull dans MathGeom sur cette page). Je proposais de le faire avec ici avec QuickHull, mais après tout, toute solution est bienvenue.
  21. Salut, En tombant sur cet article à propos d'un algorithme pour calculer l'enveloppe convexe d'une collection de points, je me suis dit que ça pourrait faire l'objet d'un nouveau challenge et que ça pourrait aussi être une base pour résoudre un problème plus complex posé par @Luna dans ce sujet : faire une enveloppe concave (concave hull). Donc, il s'agit toujours d'écrire un fonction (dans le langage de son choix) qui prend en argument une liste de points et qui renvoie la liste des points qui constituent l'enveloppe convexe (convex hull) des points passés en argument. Il existe au moins un autre algorithme bien connu pour extraire l'enveloppe convexe d'une collection de points, mais comme il a déjà été souvent implémenté, je trouve plus intéressant de se pencher sur celui-là et je suppute qu'il se prête mieux à la généralisation vers une enveloppe concave (mais c'est une autre histoire...). On doit pouvoir tester la fonction 'quickhull' via une sélection d'entités points (nodal) en dessinant une polyligne. Exemple en LISP : (defun c:test (/ ss i pts) (if (setq ss (ssget '((0 . "point")))) (progn (repeat (setq i (sslength ss)) (setq pts (cons (cdr (assoc 10 (entget (ssname ss (setq i (1- i)))))) pts ) ) ) (command "_pline") (foreach p (quickhull pts) (command "_non" p) ) (command "_close") ) ) (princ) )
  22. Dans le lien donné par @Olivier Eckmann la réponse du grand (de l'immense) Tony Tanzillo est sans appel : PS : VL.Application = Application Visual LISP
  23. Ça ressemble à une fuite (en avant ?). Déjà tu as besoin d'aide pour une boite de dialogue. Mais tout le reste, lire le fichier texte, créer les calques avec les données étendues pour le commentaire, tu sais le faire en VBA AutoCAD, ou tu penses que c'est plus simple qu'en LISP ? Tout ce que tu fais avec le VBA AutoCAD peut être fait avec Visual LISP qui peut acccéder à la même interface COM/ActiveX. J'aurais continué à t'aider en essayant de te pousser à être plus méthodique (décomposer le problème en problèmes plus simples et les résoudre avec des fonctions séparées) mais si tu penses que changer de route est mieux pour toi...
  24. Salut, Avec vlisp : (vlax-invoke (vlax-ename->vla-object (car (entsel))) 'Explode) renvoie la liste des entités (vla-object) après décomposition.
  25. Bien sûr, mais ici on n'en est pas là, et puis je pense que c'est une bonne habitude en programmation de scinder le problème général en plusieurs problèmes plus simples, testables séparément (tests unitaires) et, éventuellement, réutilisables. Par exemple, ici on cherche à : "créer des calques avec des données d'un fichier externe", ce qu'on pourrait scinder en : 1. lire un fichier texte ligne par ligne 2. convertir le texte d'une ligne en données LISP 3. créer un calque à partir de ces données Dans l'absolu, on crée une fonction séparée et autonome pour chacun de ces 3 points (pour le 2. c'est str2lst) on peut tester chaque fonction indépendamment les unes des autres et si une autre fois il s'il s'agit d'insérer des blocs, on n'a qu'à écrire une fonction pour remplacer la troisième fonction, si on récupère les données depuis une autre source (fichier Excel, table de données, ...) on n'a qu'à ré-écrire la première.
×
×
  • 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é