Aller au contenu

Classement

Contenu populaire

Affichage du contenu avec la meilleure réputation le 03/06/2025 dans Messages

  1. This strategic move comes as brands without AI-enhanced capabilities face up to 40% drops in visibility and engagement. Cette décision stratégique intervient alors que les marques sans capacités améliorées par l’IA font face à des baisses de visibilité et d’engagement allant jusqu’à 40 %. J'aimerais bien savoir qui lance ce genre "d'étude", ce n'est pas dit comme ça, c'est plus pratique ! J'ai cherché et j'ai trouvé ça ailleurs sur la toile : Les spécialistes du marketing et les consommateurs sont également divisés quant aux capacités créatives de l'IA. L'étude « État du marketing 2025 » de SurveyMonkey révèle que 46 % des consommateurs n'apprécient pas les entreprises qui utilisent l'IA pour générer du contenu , et que 43 % sont moins susceptibles d'acheter auprès d'une telle entreprise. Je ne sais pas si elle plus crédible, au moins le questionneur est cité. Amicalement (sans IA)
    1 point
  2. 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; } } } }
    1 point
  3. Autodidacte et débutant en AutoLISP je soumets cette routine à la critique. Tous les commentaires sont évidemmment les bienvenus. ;;; 20/04/05 Fonction TRAPEZE - Gilles Chanteau - ;;; ;;; c:trapeze Crée une polyligne fermée décrivant un quadrilatère trapézoïdal. ;;; Permet à l'utilisateur de spécifier la largeur entre les deux côtés parallèles (hauteur du trapèze). ;;; Demande respectivement pour chacun des autres côtés, un point à un des sommets (indifféremment ;;; sur l'une ou l'autre base) et, à ce sommet, l'angle formé par ce côté avec l'axe des X. ;;; Cette fonction a été créée pour tracer les pièces rectilignes dont les coupes en bout ne sont ;;; pas d'équerre (écharpes, jambes de force, goussets et autres "diagos") utilisées en menuiserie, ;;; charpente, serrurerie... ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; TRAPEZE_ERR Redéfinition de *error* ;;; ferme le groupe "UNDO" et restaure la valeur initiale des variables. (defun TRAPEZE_ERR (msg) (if (or (= msg "Fonction annulée") (= msg "quitter / sortir abandon") ) (princ) (princ (strcat "\nErreur: " msg)) ) (command "_undo" "_end") (rest_var) (setq *error* m:err m:err nil ) (princ) ) ;;; TRPZ_ERR - Envoie un message explicatif et quitte l'application. (defun TRPZ_ERR (msg) (princ (strcat "\nErreur: " msg)) (exit) ) ;;; EQUALKPI - Évalue si un angle est égal à k pi radians à 0.000000001 près. (defun EQUALKPI (ang) (or (equal (rem ang pi) 0 1e-009) (equal (abs (rem ang pi)) pi 1e-009) ) ) ;;; ACOS Retourne l'arc cosinus du nombre, en radians (defun ACOS (num) (if (<= -1 num 1) (atan (sqrt (- 1 (expt num 2))) num) (princ "\nErreur: L'argument pour ACOS doit être compris entre -1 et 1" ) ) ) ;;; REST_VAR & SAVE_VAR ;;; ;;; SAVE_VAR Enregistre la valeur initiale des variables système dans une liste associative (defun save_var (lst) (setq varlist (mapcar '(lambda (x) (cons x (getvar x))) lst)) ) ;;; REST_VAR Restaure leurs valeurs initiales aux variables système de la liste SAVE_VAR (defun rest_var () (foreach pair varlist (if (/= (getvar (car pair)) (eval (cdr pair))) (setvar (car pair) (eval (cdr pair))) ) ) (setq varlist nil) ) ;;; C:TRAPEZE - Fonction principale (defun c:trapeze (/ pt1 pt2 pt3 pt4 a0 a1 a2 a3 a4 alpha) (setq m:err *error* *error* TRAPEZE_ERR ) (save_var '("orthomode" "cmdecho" "osmode")) (command "_undo" "_begin") (setvar "orthomode" 0) (setvar "cmdecho" 0) (princ "trapeze") ;; Saisie des données (if (not (numberp *larg*)) (setq *larg* 10) ) (while (not (setq pt1 (getpoint (strcat "\nLa largeur courante est de " (rtos *larg*) "\nSpécifiez le premier sommet ou <Largeur>: " ) ) ) ) (initget 6) (setq *larg* (getdist "\nSpécifiez la largeur: ")) ) (setq a1 (getangle pt1 "\nSpécifiez l'angle décrit par ce côté: ")) (initget 1) (setq pt2 (getpoint pt1 "\nSpécifiez le second sommet: ")) (if (not (equal (caddr pt1) (caddr pt2) 1e-009)) (TRPZ_ERR "les sommets ne sont pas dans un plan parallèle au SCU courant." ) ) (setq a2 (getangle pt2 "\nSpécifiez l'angle décrit par ce côté: ")) ;; Conversion des données (setq a0 (angle pt1 pt2) pt3 (polar pt1 a1 *larg*) pt4 (polar pt2 a2 *larg*) ) (foreach n '(a1 a2) (set n (- (eval n) a0)) (if (minusp (eval n)) (set n (+ (eval n) (* 2 pi))) ) (if (EQUALKPI (eval n)) (TRPZ_ERR "un des côtés est aligné avec les sommets.") ) ) (setvar "osmode" 0) ;; Évaluation de la position des côtés par rapport aux deux sommets spécifiés (if (or (and (< 0 a1 pi) (< 0 a2 pi)) (and (< pi a1 (* 2 pi)) (< pi a2 (* 2 pi))) ) ;; Calcul des autres sommets si les premiers sont situés sur une base du trapèze (setq pt3 (polar pt1 (+ a0 a1) (/ *larg* (abs (sin a1)))) pt4 pt2 pt2 (polar pt2 (+ a0 a2) (/ *larg* (abs (sin a2)))) ) ;; Calcul des autres sommets si les premiers sont situés sur une diagonale du trapèze (if (> *larg* (distance pt1 pt2)) (TRPZ_ERR "la largeur est plus grande que la diagonale.") (progn (setq alpha (ACOS (/ *larg* (distance pt1 pt2)))) (if (< a1 pi) (setq a3 (- alpha a1) a4 (- alpha a2 pi) ) (setq a3 (+ alpha a1) a4 (+ alpha a2 pi) ) ) (foreach n (list a3 a4) (if (equal (cos n) 0 1e-009) (TRPZ_ERR "un des côtés est aligné avec une des bases.") ) ) (setq pt3 (polar pt1 (+ a0 a1) (/ *larg* (cos a3))) pt4 (polar pt2 (+ a0 a2) (/ *larg* (cos a4))) ) ) ) ) ;; Création de la polyligne, si les données le permettent (if (inters pt1 pt3 pt2 pt4 T) (TRPZ_ERR "intersection des côtés (polygone croisé).") (command "_pline" pt1 pt3 pt2 pt4 "_c") ) (command "_undo" "_end") (rest_var) (setq *error* m:err m:err nil ) (princ) )
    1 point
×
×
  • 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é