Aller au contenu

Messages recommandés

Posté(e)

Bon, vous aimer les chalenges... Et je l'ai bien compris, les critères de mon premier n'étaient pas "correctes"...

 

J'ai donc un nouveau "truc" à vous proposer...

 

Quelque-soit le langage que vous proposerez sera le bien venu (Lisp, V-Lisp, VBA, C#, F# Ruby, patatruc...), vous êtes libre :

 

C'est de la géométrie, désolé, mais c'est mon truc. Le challenge est :

 

Dessinez un cercle (oui, c'est graphique Et géométrique).

 

Dans ce cercle, dessinez un carré inscrit, et dans ce carré un cercle inscrit... Et ce, au moins 4 ...

 

Mais avant tout, Est-ce judicieux comme challenge ? Ai-je oublié quelque-chose ?

 

Mais bien à vous, et lancez-vous...

 

On ne "jugera" as sur la quantité de fonction/commande et non du nombre de lignes de programmation...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

edit : question effacés je garde mon idée pour moi

 

Égoïste ! ! ! ;)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

En attendant voici un aperçu (qui marche)

 

Dim MonCercle As AcadCircle

Dim p(0 To 7) As Double

Dim Poly As AcadLWPolyline

Dim ANGLE As Double

Me.Hide

DIA = DIAM_CERCLE

ptCen = ThisDrawing.Utility.GetPoint(, "Viser le point de départ")

For i = 1 To NB_CERCLE

Set MonCercle = ThisDrawing.ModelSpace.AddCircle(ptCen, DIA / 2)

MonCercle.Update

c = DIA / Sqr(2)

p(0) = (ptCen(0) + c / 2): p(1) = (ptCen(1) - c / 2)

p(2) = (ptCen(0) + c / 2): p(3) = (ptCen(1) + c / 2)

p(4) = (ptCen(0) - c / 2): p(5) = (ptCen(1) + c / 2)

p(6) = (ptCen(0) - c / 2): p(7) = (ptCen(1) - c / 2)

Set Poly = ThisDrawing.ModelSpace.AddLightWeightPolyline(p)

Poly.Closed = True

Poly.Update

DIA = c

A = A + A

Next i

 

 

Ma version 2 sera bien plus complete ^^

 

j'ai un userform ou je rentre le nombre de cercle et la taille initial du cercle

Posté(e)

Bon un petit plus pour faire tourner le carré

 

Présentation via ce lien :

 

Private Sub UserForm_Initialize()

NB_CERCLE = 6

DIAM_CERCLE = 10

ANGLE_CAR = 0

End Sub

 

Private Sub VALIDER_Click()

Dim MonCercle As AcadCircle

Dim p(0 To 7) As Double

Dim Poly As AcadLWPolyline

Dim ANGLE As Double

Me.Hide

ANGLE = ANGLE_CAR

A = Deg2Rad(ANGLE)

DIA = DIAM_CERCLE

PI = Atn(1) * 4

 

ptCen = ThisDrawing.Utility.GetPoint(, "Viser le point de départ")

 

For i = 1 To NB_CERCLE

 

Set MonCercle = ThisDrawing.ModelSpace.AddCircle(ptCen, DIA / 2)

MonCercle.Update

c = DIA / Sqr(2)

 

p(0) = (ptCen(0) + c / 2): p(1) = (ptCen(1) - c / 2)

p(2) = (ptCen(0) + c / 2): p(3) = (ptCen(1) + c / 2)

p(4) = (ptCen(0) - c / 2): p(5) = (ptCen(1) + c / 2)

p(6) = (ptCen(0) - c / 2): p(7) = (ptCen(1) - c / 2)

 

Set Poly = ThisDrawing.ModelSpace.AddLightWeightPolyline(p)

Poly.Closed = True

Poly.Rotate ptCen, A

Poly.Update

 

DIA = c

A = A + A

 

Next i

 

End Sub

 

Function Deg2Rad(dDegrees As Double)

PI = Atn(1) * 4

Deg2Rad = dDegrees * PI / 180

End Function

Function Rad2Deg(dRadians As Double)

PI = Atn(1) * 4

Rad2Deg = dRadians * 180 / PI

End Function

Posté(e)

Salut CurlyGoth.

 

Quelle commande faut-il lancer, car VBA plante lors du Me.Hide... Et pour cacher quoi ?

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

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) ?

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

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

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Salut.

moi si on juge je pars xD Have fun ;-)

J'ai utilisé le verbe juger entre guillemets, c'est plus pour se faire une idée des différentes façons de faire dans différents langages.

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Salut (gile).

J'applaudis à m'en faire mal aux mains, challenge superbement relevé ! ! ! Et belle démonstration du code...

Un exemple en .NET (C#).

Comment fais-tu du .NET pour AutoCAD ? Avec Visual Studio Express ? Puis-je le faire ? Est-ce interactif avec AutoCAD ? Comment se epasse la création d'une DLL ?

Je suis très attiré par ses possibilités de langages, j'ai débuté en Pascal dans les années 80) puis en Turbo Pascal, ensuite est venu le Basic (vers 1992) puis en Turbo Basic (peu de temps après) puis le Visual Basic (avec VB 6), et pour finir, un peu de Lisp...

 

Affichage dynamique pendant la saisie du rayon.

Ca, c'est de la magie ! ! !

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Comment fais-tu du .NET pour AutoCAD ? Avec Visual Studio Express ? Puis-je le faire ? Est-ce interactif avec AutoCAD ? Comment se epasse la création d'une DLL ?

Je suis très attiré par ses possibilités de langages, j'ai débuté en Pascal dans les années 80) puis en Turbo Pascal, ensuite est venu le Basic (vers 1992) puis en Turbo Basic (peu de temps après) puis le Visual Basic (avec VB 6), et pour finir, un peu de Lisp...

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.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e) (modifié)

Coucou

 

Je ne viens plus très souvent mais aujourd'hui j'ai décidé de le faire

Donc je viens répondre en Autolisp après une version VBA et une C#.

 

Fonctionnement semblable au travail de (gile)

Le nom de la commande est TEST

Une vidéo jointe pour voir le résultat des fois que ça ne fonctionne pas chez vous

 

Lien Vidéo

 

Amicalement

 

(defun da:DessPoly2D (listesommets z closed)
 (entmake
   (append
     (list '(0 . "LWPOLYLINE")
    '(100 . "AcDbEntity")
    '(100 . "AcDbPolyline")
    (if	z
      (cons 38 z)
    )
    (cons 90 (length listesommets))
    (if	closed
      (cons 70 1)
      (cons 70 0)
    )
     )
     (mapcar '(lambda (p) (cons 10 p)) listesommets)
   )
 )
)
(defun c:test (/ loop centre rayon sommets)
 (setq loop (getint "\nNombre de cercles\n"))
 (setq	centre '(0 0 0)
rayon  1
 )
 (setq ss (ssadd))
 (entmake (list (cons 0 "CIRCLE") (cons 10 centre) (cons 40 rayon)))
 (setq ss (ssadd (entlast) ss))
 (setq	sommets	(list (polar centre 0 rayon)
	      (polar centre (/ pi 2) rayon)
	      (polar centre pi rayon)
	      (polar centre (+ pi (/ pi 2)) rayon)
	)
 )
 (da:DessPoly2D sommets 0 T)
 (setq ss (ssadd (entlast) ss))
 (repeat (- loop 1)
   (setq rayon (* (/ (sqrt 2) 2) rayon))
   (entmake (list (cons 0 "CIRCLE") (cons 10 centre) (cons 40 rayon)))
   (setq ss (ssadd (entlast) ss))
   (setq sommets (list	(polar centre 0 rayon)
		(polar centre (/ pi 2) rayon)
		(polar centre pi rayon)
		(polar centre (+ pi (/ pi 2)) rayon)
	  )
   )
   (da:DessPoly2D sommets 0 T)
   (setq ss (ssadd (entlast) ss))
 )
 (command "_move" ss "" centre pause)
 (command "_scale" ss "" (getvar "lastpoint") pause)
 (princ)
) 

Modifié par (gile)
Suppression des balises [color] dans le code et formatage du code
Posté(e)

Merci à vous deux, (gile) et didier (je vous surveille toujours, vous êtes (même si vous ne le voulais pas, mes très humbles professeurs.) et mes maîtres à penser pour le lisp...

Et je parle au nom de beaucoup de personnes...

 

@(gile) : tu m'a fais "adoré le lisp"... Tu m'as tellement aidé... Tu n'estime pas à quel point... A quel point tu es extraordinaire... Tu aides et tu professe, j'adore, et je serais toujours ton élève...

@didier : toi aussi, tu était (et restera à jamais) un réel support dans mes développement, tu as été d'une aide que tu ne peux peut-être pas comprendre, tellement tu m'as donné. mais j'ai côtoyé tous tes le Lisp, c'est grâce à vous deux et d'autres aussi, Tramber, le crabe (Ô décapode) que je fais du Lisp...

 

Bref; vous avez été tous les deux (avec d'autres, je le redis, Tramber, le crabe... Je persiste.) Un réel confort... Je ne serais jamais assez vous remercier...

 

En gros, si je peux faire des petit Lisp (humbles), c'est uniquement grâce à vous...

 

J'ai testé le lisp dans les années 90, mais depuis 2005 (environ), vous avez été d'une grande aide, et je ne saurait vous la prouver et vous remercier... Mais vous êtes tous extraordinaires, tous...

 

Didier avec ton site (que je consulte au moins deux fois par jour) tu es un de mes maître, je sais, c'est dur à porter, mais tu l'es, quand à d'autres, comme Maître (gile), que dire... Que du bien... Maître (gile) va me faire aborder le .NET... Car il me (nous) démontre sa puissance...

 

Extraordinaire, je vous dois tellement... Vous êtes et resterez des maîtres... Je suis désolé de vous l'apprendre, mais ce n'est juste qu'une question, en gros et pour parler comme nus le comprenons, vous êtes vraiment balaises...

 

je vous serez toujours redevable, et je ne suis pas le seul...

 

Encore un énorme merci à vous tous...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Didier, t'es sérieux ?

 

Tu vas me faire croire que ton Lisp fait ça ? ? Tu vas me faire croire qu'en vingt ligne, tu as fais autant que (gile) en plus de 100 lignes ? ? ?

Car si en Lisp c'était faisable en 20 lignes; Maître (gile) nous aurait fait la démonstration... Non ?

 

Si c'est vrai, tu DOIS me donner ton secret... Et à nous tous...

 

Mais je suis très content de t'avoir vu, tu ne ressemblais pas à ce que j'imaginais de toi, je croyais voir un vieux aigris... Mais en fait, tu est très jeune...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Bonjour DenisHEN

 

Je te remercie de ces déclarations qui me font rosir, comme aujourd'hui je suis habillé en rouge ça nous fait un beau camaïeu.

Oui le Lisp est moins verbeux que le C# mais on ne joue pas dans la même cour, le C# est bien plus puissant que le lisp (pour AutoCAD)

en vitesse de traitement mais surtout en possibilités bien plus étendues.

 

J'ai fait des trucs en C# qui sont bluffants de rapidité mais c'est tellement différent que je me permets de te mettre en garde :

Tant que tu restes dans des routines dont tu as la solution LSP ne te prends pas le chou

 

Je me suis sérieusement agacé pour comprendre ce langage et je suis très loin d'en avoir fait le tour, j'ai juste gratté la surface

Tout ça pour dire que tu peux t'y coller mais tu dois assurer tes bases comme le conseille (gile)

il me l'a conseillé, je l'ai ignoré, mal m'en a pris, quelques années plus tard je m'y suis remis et ça va mieux en ayant fait des applications "console" par dizaines.

 

Dans quelques temps (je ne donne pas de date) je pense augmenter le périmètre de da-code en y ajoutant le VBA et le C#. (pour débutants)

Amicalement

Posté(e)

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)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Pour la dernière je me suis fait doubler sur le fil du rasoir.. Le temps de lire le sujet et d'écrire les qq lignes de codes en command...

(defun c:ccc2 (/ ss c r cmdecho)
 (setq	c  (getpoint "\nSpécifiez le centre du Cercle: ")
ss (ssadd)
r  1.
cmdecho (getvar 'cmdecho)
 )

(setvar 'cmdecho 0)
 (repeat (getint "\nEntrez le nombre de Cercles: ")
   (command "_circle" c r)
   (ssadd (entlast) ss)
   (command "_rectang" "_NON" (polar c (* 1.25 pi) r) "_NON" (polar c (* 0.25 pi) r))
   (ssadd (entlast) ss)
   (setq r (* (/ (sqrt 2) 2) r))
 )

 (princ "\nSpécifiez le rayon: ")
 (command "_scale" ss "" c pause)
 (setvar 'cmdecho cmdecho)
 (princ)
)

Apprendre => Prendre => Rendre

Posté(e)

@ Didier un petit oublie dans le code, les changements de plans (code 210 sur le cercle et la lwp) :rolleyes:

 

@ DenisHen, à être spectateur tu passes à coté de tous ce qu'il y a prendre dans ce type d'exercice, c'est vraiment dommage...

 

Salutations Bruno

Apprendre => Prendre => Rendre

Posté(e)
Dans quelques temps (je ne donne pas de date) je pense augmenter le périmètre de da-code en y ajoutant le VBA et le C#. (pour débutants)

OOOUUUIII

 

 

Si tu as besoin ;-) je serais à ton service ! (pour le VBA)

Posté(e)

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

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour,

 

Cette fois je ne pensais pas participé (peu de disponibilité), mais comme ça n'a pas l'air de ce bousculer, une première proposition avec un code à minima calqué sur les 2 dernières propositions de l'exercice précédent.

(defun c:ccc1 (/ nc ns c pt r ang)
 (and
   (setq nc (getint "\nEntrez le nombre de cercles: "))
   (setq ns (getint "\nEntrez le nombre de sommets: "))
   (setq c (getpoint "\nSpécifiez le centre: "))
   (setq pt (getpoint c "\nSpécifiez la position du sommet: "))
   (setq r   (distance c pt)
  ang (angle c pt)
   )
   (repeat nc
     (command "_.circle" "_non" c r)
     (command "_.polygon" ns "_non" c "_I" "_non" (polar c ang r))
     (setq r (* r (cos (/ pi ns))))
   )
 )
 (princ)
)

 

 

Côté affichage, on peut aussi demander la rotation et, plus difficile (si je ne me trompe pas cette fois) combiner échelle et rotation.

:(rires forts): :(rires forts): :(rires forts):

 

C'est forcément, cette dernière affirmation qui m'a fait sourire et décider de participé (car je sais trés bien ce que cela implique), car non on ne fera pas aussi bien que en .net, à moins d'essayer d'émuler le code au moyen de la fonction grread et de réécrire les accrochages aux objets en faisant d'interminable page de code fastidieuse, pour au final avoir un fonctionnement plus ou moins bancal...

 

Malgré tout on peut s'en approcher à très peu de frais, très rapidement ma deuxième proposition sur le ton de l'humour :D :

(defun c:ccc2 (/ nc ns c pt r ang cmdecho)
 (and
   (setq nc (getint "\nEntrez le nombre de cercles: "))
   (setq ns (getint "\nEntrez le nombre de sommets: "))
   (setq c (getpoint "\nSpécifiez le centre: "))
   (princ "\nSpécifiez la position du sommet: ")
   (setq cmdecho (getvar 'cmdecho))
   (setvar 'cmdecho 0)
   (vl-cmdf "_.polygon" ns "_non" c "_I" "_non" pause)
   (setq pt  (cdr (assoc 10 (entget (entlast))))
  r   (distance c pt)
  ang (angle c pt)
   )
   (entdel (entlast))    
   (repeat nc
     (command "_.circle" "_non" c r)
     (command "_.polygon" ns "_non" c "_I" "_non" (polar c ang r))
     (setq r (* r (cos (/ pi ns))))
   )
   (setvar 'cmdecho cmdecho)
 )
 (princ)
) 

 

A+ Bruno

Apprendre => Prendre => Rendre

Posté(e)

Salut à tous...

 

Pour faire quelques réponses collégiales, je dirais :

 

Si je lance un challenge, c'est que, justement, je me demande comment faire ? Je ne suis ni un professeur, ni un expert (comme beaucoup d'entre vous).

 

C'est une façon vulgairement cachée de voir "comment d'autres feraient ?"...

 

Je n'ai pas la solution, je regarde, analyse et apprend énormément de tous vos commentaires et vos codes... A mon époque (les années 90) j'apprenais seul avec juste un "maître penseur codifiant" (et il n'y avait pas internet, et pas CadXP) qui m'a mit le pied à l'étrier du développement : Pascal, Turbo Pascal, puis, Basic, Turbo Basic, et Visual Basic pour continuer en Lisp...

 

Donc, mes challenges sont peut-être égoïstes (bien qu'ils peuvent servir à beaucoup d'autres, je l'espère) mais ils ne sont pas dénués de tous sens...

 

Je pense avoir atteint mes limites en Lisp (car je suis autodidacte et non anglophone), je fais plein de dev dont je suis très fier, mais j'aurai pû faire mieux...

 

Et actuellement, je me pose la question : le Lisp est-il mon langage de "prédilection" ?

 

Je reçois avec grand plaisir toutes vos remarques/critiques envers moi, ou sur mes capacités, je ne suis absolument pas susceptible... Mais comprenez que je n'ai eu que des aides ponctuelles (grâce à 99% aux membres de CadXP) suite à mes question pas toujours très explicites ou très "compréhensibles"...

 

Mais j'ai tellement appris depuis mes début que je ressent une petite fierté, mais je devrais réussir à faire plus...

 

En VBA, j'ai utilisé un classeur Excel comme une base de données, j'utilisais Excel comme "interface" pour avoir accès à des centaines de fichiers .txt... Mes collègues ouvraient le même classeur en lecture seule, mais n'avaient pas besoin de l'enregistrer... Ils remplissaient des champs et tout était envoyé par courriel, avec un minimum d'intervention de leurs part... Tous était géré par un seul ruban, personnalisé lui aussi

 

C'est compliqué, mais je m'en suis sortie, et ce code était utilisé par quatre à six personnes en même temps, et pendant 4 à 5 ans. Après, la direction a commandé un ERP. Mais cet ERP ne remplissait pas ce que je faisais... C'est une source de fierté... Je sais, mais restant humble, j'aurais aimé être "balaize" en Lisp, mais je n'y arrive pas... Il y a plein de choses que j'aimerais faire en Lisp, mais je n'y arrive simplemement pas, malgré toutes les aides (Maître (gile), Tramber, LeCrabe, didier...) je ne m'en sors pas...

 

Donc, il me faut apprendre un autre langage, et en ce moment, je pense me tourner vers le .NET et C#...

 

Qu'en pensez-vous ?

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant



×
×
  • 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é