-
Compteur de contenus
12 247 -
Inscription
-
Dernière visite
-
Jours gagnés
208
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par (gile)
-
AutoCAD 2025 et .NET Core 8
(gile) a répondu à un(e) sujet de (gile) dans ObjectARX/DBX, C++, .NET, RealDWG
As-tu bien suivi la procédure ? - Modifier les chemins dans Properties\launchSettings.json et AutocadR25Plugin.csproj (et éventuellement les noms dans MyTemplate.vstemplate). - Coller le dossier dans Visual Studio 2022\Templates\ProjectTemplates. - Démarrer un nouveau projet en choisissant ce modèle. -
AutoCAD 2025 et .NET Core 8
(gile) a répondu à un(e) sujet de (gile) dans ObjectARX/DBX, C++, .NET, RealDWG
À ma connaissance, oui. As-tu essayer de créer un nouveau projet pour AutoCAD 2025 (éventuellement à partir de ce modèle de projet) et d'y ajouter une boite de dialogue ? Tu peux coller le fichier DialogBox.zip ci-joint dans le dossier : ..\Documents\Visual Studio 2022\Templates\ItemTemplates\C#, et faire : Ajouter > Nouvel élément > Boite de dialogue. DialogBox.zip -
Z sur poly3D connaissant XY
(gile) a répondu à un(e) sujet de Olivier Eckmann dans Pour aller plus loin en LISP
Je me permet d'insister. vlax-curve-getClosestPointToProjection ne renvoie pas le même résultat que vlax-curve-getClosestPointTo. Essaye cette routine. (defun c:test (/ pl dxf pt) (if (and (setq pl (car (entsel "\nSélectionnez une polyligne 3d: "))) (= (cdr (assoc 0 (setq dxf (entget pl)))) "POLYLINE") (= 8 (logand 8 (cdr (assoc 70 dxf)))) ) (while (setq pt (getpoint "\nSpécifiez un point: ")) (setq pt (trans pt 1 0)) (entmake (list '(0 . "LINE") '(62 . 3) (cons 10 pt) (cons 11 (vlax-curve-getClosestPointToProjection pl pt '(0 0 1) ) ) ) ) (entmake (list '(0 . "LINE") '(62 . 1) (cons 10 pt) (cons 11 (vlax-curve-getClosestPointTo pl pt ) ) ) ) ) ) (princ) ) -
AutoCAD 2025 et .NET Core 8
(gile) a répondu à un(e) sujet de (gile) dans ObjectARX/DBX, C++, .NET, RealDWG
Est-ce que ça vaut pour tous tes projets ? Je vois que tu dis : ".csproj ou .vbporj", le problème existe-t-il aussi bien en C# qu'en VB ? -
Z sur poly3D connaissant XY
(gile) a répondu à un(e) sujet de Olivier Eckmann dans Pour aller plus loin en LISP
Salut, Et avec vlax-curve-getClosestPointToProjection ? D'après mes tests, ça fonctionne comme attendu. -
La bonne vieille commande 3DROTATION (à ne pas confondre avec ROTATION3D, plus récente) propose une option 2points pour spécifier l'axe de Rotation et une option référence.
-
AutoCAD 2025 et .NET Core 8
(gile) a répondu à un(e) sujet de (gile) dans ObjectARX/DBX, C++, .NET, RealDWG
Salut, Je n'ai pas eu ce genre de problème suite aux migrations de nombreux projets (Windows Forms ou WPF). Vérifie bien que dans le fichier SDK / .csproj (il s'ouvre dans Visual Studio par double clic sur le nom du projet d'ans l'explorateur de solutions), il y ait une balise <UseWindowsForms>true</UseWindowsForms> dans le premier nœud <PropertyGroup> ou que tu aies bien ajouté une balise : <ItemGroup> <FrameworkReference Include="Microsoft.WindowsDesktop.App" /> </ItemGroup> -
Salut, Le cône est-il un Solide 3d (on dirait une surface) ?
-
AutoCAD 2025 et .NET Core 8
(gile) a répondu à un(e) sujet de (gile) dans ObjectARX/DBX, C++, .NET, RealDWG
Salut, AutoCAD installe la version de .NET qu'il utilise (.NET 8.0 pour AutoCAD 2025, .NET Framework 4.8 pour 2021-2024, .NET Framework 4.7 pour 2019-2020, etc.), donc tu n'as pas besoin de vérifier la version de .NET. -
Connaitre si un calque est imprimable
(gile) a répondu à un(e) sujet de PATRICE69 dans Pour aller plus loin en LISP
Salut, Tu peux savoir si un calque est imprimable avec le groupe DXF 290 ou la propriété IsPlottable (1 = imprimable, 0 = non-imprimable). ((lambda (/ layer name lst) (while (setq layer (tblnext "layer" (not layer))) (setq name (cdr (assoc 2 layer)) lst (cons (cons name (cdr (assoc 290 (entget (tblobjname "layer" name)))) ) lst ) ) ) (reverse lst) ) ) ((lambda (/ layer name lst) (while (setq layer (tblnext "layer" (not layer))) (setq name (cdr (assoc 2 layer)) lst (cons (cons name (getpropertyvalue (tblobjname "layer" name) "IsPlottable") ) lst ) ) ) (reverse lst) ) ) -
-
Une machine peut-elle avoir une conscience?
(gile) a répondu à un(e) sujet de Patrick Emin dans Pause café
@didier Si on accepte le sens anglo-saxon pour "intelligence", alors la question : peut se lire : l'intelligence artificielle est-elle un traitement des renseignements collectées ? ou plus crument, l'intelligence artificielle est-elle de l'espionnage ? Alors la réponse est clairement oui ! -
Une machine peut-elle avoir une conscience?
(gile) a répondu à un(e) sujet de Patrick Emin dans Pause café
Salut, Pour moi la question n'est pas tant de savoir si des machines peuvent être "intelligente" ou avoir une "conscience", mais plutôt : le souhaite-t-on vraiment ? Et je trouve effrayant de lire que c'est "inévitable" parce que ça signifierait que nous n'avons déjà plus de prise sur l'accélération de l'artificialisation globale de notre environnement, que la "technoscience" est le nouveau Dieu et les agents conversationnels ses prédicateurs. Je voudrais juste citer, à ce sujet, Aurélien Barrau (astrophysicien et philosophe) : -
AutoCAD 2025 et .NET Core 8
(gile) a répondu à un(e) sujet de (gile) dans ObjectARX/DBX, C++, .NET, RealDWG
J'ai fait un petit document qui décrit pas à pas la mise à jour d'un projet de plugin pour AutoCAD 2024 ou inférieur vers AutoCAD 2025. Migration_NET_Core.pdf est aussi disponible sur cette page. -
AutoCAD 2025 supporte .NET Core 8.0 en place de .NET Framework. Il s'agit d'une rupture de compatibilité pour les développements .NET qui doivent être mis à jour pour fonctionner avec AutoCAD 2025 (et versions ultérieures). J'ai d'ores et déjà migré les applications sur Autodesk App Store et les dépôts sur GitHub: GeometryExtensions Gile.Inspector Gile.AutoCAD.Extension AutoCAD-Cshap-Project-Template AutoCAD-Fsharp-Project-Template Merci de me signaler si je dois le faire pour d'autres programmes .NET publiés sur CADxp. Je peux aussi essayer de faire un petit tuto sur la migration de projets existants si besoin.
-
Salut, Essaye de lancer l'expression suivante et de sélectionner une hachure gradient, tu auras ta réponse pour modifier le LISP. (vla-get-PatternName (vlax-ename->vla-object (car (entsel))))
-
.NET (C#) équivalents des commandes Lisp UCS / DVIEW / PLAN
(gile) a répondu à un(e) sujet de PECTO99 dans ObjectARX/DBX, C++, .NET, RealDWG
Si on veut éviter d'appeler les commandes natives, on accède au SCU courant par la propriété CurrentCoordinateSystem de la classe Editor. Le type de cette propriété est Matrix3d. Mais généralement en programmation on utilise peu les commandes natives donc on ne s'intéresse au SCU que pour transformer les points récupérés par ou passés aux méthodes Editor.Getxxx. (command "_UCS" "_WORLD") la matrice de transformation correspondant au Système de coordonnées général est la matrice identité. var ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.CurrentUserCoordinateSystem = Matrix3d.Identity; (command "_UCS" "_3P" point1 point2 "") , ici il faut construire la matrice. var ed = Application.DocumentManager.MdiActiveDocument.Editor; var xAxis = point1.GetVectorTo(point2).GetNormal(); var yAxis = Vector3d.ZAxis.CrossProduct(xAxis).GetNormal(); var ucsMatrix = Matrix3d.AlignCoordinateSystem( Point3d.Origin, Vector3d.XAxis, Vector3d.YAxis, Vector3d.ZAxis, point1, xAxis, yAxis, Vector3d.ZAxis); ed.CurrentUserCoordinateSystem = ucsMatrix; Les systèmes de coordonnées nommés sont enregistrés dans la "table des SCUs" : UcsTable. (command "_UCS" "_R" nomscu) var ed = Application.DocumentManager.MdiActiveDocument.Editor; var db = HostApplicationServices.WorkingDatabase; using (var tr = db.TransactionManager.StartTransaction()) { var ucsTable = (UcsTable)tr.GetObject(db.UcsTableId, OpenMode.ForRead); if (ucsTable.Has(nomscu)) { var ucs = (UcsTableRecord)tr.GetObject(ucsTable[nomscu], OpenMode.ForRead); ed.CurrentUserCoordinateSystem = Matrix3d.AlignCoordinateSystem( Point3d.Origin, Vector3d.XAxis, Vector3d.YAxis, Vector3d.ZAxis, ucs.Origin, ucs.XAxis, ucs.YAxis, ucs.XAxis.CrossProduct(ucs.YAxis).GetNormal()); } tr.Commit(); } (command "_UCS" "_X" -100.00) , en admettant que -100.00 correspond bien à -100 grades, soit 1.5 * PI radians, on combine la matrice de rotation autour de l'axe X avec la matrice courante. var ed = Application.DocumentManager.MdiActiveDocument.Editor; var ucsMat = ed.CurrentUserCoordinateSystem; var ucs = ucsMat.CoordinateSystem3d; ed.CurrentUserCoordinateSystem = Matrix3d.Rotation(Math.PI * 1.5, ucs.Xaxis, ucs.Origin) * ucsMat; Pour les vues, on utilise des instances de la classe ViewTableRecord telle que renvoyées par la méthode Editor.GetCurrentView ou passées à la méthode Editor.SetCurrentView. (command "_PLAN" "") var ed = Application.DocumentManager.MdiActiveDocument.Editor; var ucs = ed.CurrentUserCoordinateSystem.CoordinateSystem3d; using (var view = ed.GetCurrentView()) { var dcsToWcs = Matrix3d.Rotation(-view.ViewTwist, view.ViewDirection, view.Target) * Matrix3d.Displacement(view.Target.GetAsVector()) * Matrix3d.PlaneToWorld(view.ViewDirection); var centerPoint = new Point3d(view.CenterPoint.X, view.CenterPoint.Y, 0.0) .TransformBy(dcsToWcs); view.ViewDirection = ucs.Zaxis; view.ViewTwist = ucs.Xaxis.GetAngleTo(Vector3d.XAxis, ucs.Zaxis); var wcsToDcs = Matrix3d.WorldToPlane(view.ViewDirection) * Matrix3d.Displacement(view.Target.GetAsVector().Negate()) * Matrix3d.Rotation(view.ViewTwist, view.ViewDirection, view.Target); centerPoint = centerPoint.TransformBy(wcsToDcs); view.CenterPoint = new Point2d(centerPoint.X, centerPoint.Y); ed.SetCurrentView(view); } (command "_DVIEW" "" "_PO" ptTarget ptCamera "_CL" "_B" (* -1 sectionHalfDepth) "_CL" "_F" sectionHalfDepth "") var ed = Application.DocumentManager.MdiActiveDocument.Editor; using (var view = ed.GetCurrentView()) { view.Target = ptTarget; view.ViewDirection = ptTarget.GetVectorTo(ptCamera); view.BackClipDistance = -sectionHalfDepth; view.BackClipEnabled = true; view.FrontClipDistance = sectionHalfDepth; view.FrontClipEnabled = true; view.FrontClipAtEye = false; var wcsToDcs = Matrix3d.WorldToPlane(view.ViewDirection) * Matrix3d.Displacement(view.Target.GetAsVector().Negate()) * Matrix3d.Rotation(view.ViewTwist, view.ViewDirection, view.Target); var centerPoint = ptTarget.TransformBy(wcsToDcs); view.CenterPoint = new Point2d(centerPoint.X, centerPoint.Y); ed.SetCurrentView(view); } -
.NET (C#) équivalents des commandes Lisp UCS / DVIEW / PLAN
(gile) a répondu à un(e) sujet de PECTO99 dans ObjectARX/DBX, C++, .NET, RealDWG
Salut, La réponse simple est de créer une instance de l'éditeur : Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; puis d'appeler les commandes commandes comme en LISP: ed.Command("_UCS", "_WORLD"); ed.Command("_UCS", "_3P", point1, point2, ""); etc. Mais, à mon avis, utiliser .NET pour scripter les commandes natives AutoCAD, c'est un peu comme comme prendre un bazooka pour chasser un moustique. -
[Résolu] Créer un attribut à partir d'un MTEXT dans un bloc existant
(gile) a répondu à un(e) sujet de Steven dans AutoCAD 2020-2024
J'avais pensé que les textes multilignes devaient être convertis en attributs multilignes et les textes simples en attributs simples... Remplace : acAttributeModeMultipleLine par : 0 (zéro). -
[Résolu] Créer un attribut à partir d'un MTEXT dans un bloc existant
(gile) a répondu à un(e) sujet de Steven dans AutoCAD 2020-2024
C'est la synchronisation des références de bloc avec ATTSYNC qui prend du temps. Déjà, en mettant CMDECHO à 0 ça devrait être un peu plus rapide. -
[Résolu] Créer un attribut à partir d'un MTEXT dans un bloc existant
(gile) a répondu à un(e) sujet de Steven dans AutoCAD 2020-2024
Salut, Tu peux essayer le LISP ci-dessous, il traite toutes les définitions de bloc du dessin et remplace tous les textes et textes multilignes dans ces blocs par un attribut (Invite = "Attrib_n" étiquette = ATTRIB_n avec incrémentation par bloc au cas où il y ait plusieurs textes). (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*))) (defun ReplaceTextByAttDef (blockDef / i objName attrib just) (setq i 0) (vlax-for obj blockDef (setq objName (vla-get-ObjectName obj)) (cond ((= objName "AcDbMText") (setq attrib (vla-AddAttribute blockdef (vla-get-Height obj) acAttributeModeMultipleLine (strcat "Attrib_" (itoa (setq i (1+ i))) ": ") (vla-get-InsertionPoint obj) (strcat "ATTRIB_" (itoa i)) (vla-get-TextString obj) ) ) (vla-put-Alignment attrib (+ (vla-get-AttachmentPoint obj) 5)) (vla-put-TextAlignmentPoint attrib (vla-get-InsertionPoint obj)) (vla-Delete obj) ) ((= objName "AcDbText") (setq attrib (vla-AddAttribute blockdef (vla-get-Height obj) 0 (strcat "Attrib_" (itoa (setq i (1+ i))) ": ") (vla-get-InsertionPoint obj) (strcat "ATTRIB_" (itoa i)) (vla-get-TextString obj) ) ) (if (/= (vla-get-Alignment obj) acAlignmentLeft) (progn (vla-put-Alignment attrib (vla-get-Alignment obj)) (vla-put-TextAlignmentPoint attrib (vla-get-TextAlignmentPoint obj) ) ) ) (vla-Delete obj) ) ) ) (command-s "_.ATTSYNC" "_Name" (vla-get-Name blockDef)) (princ) ) (defun c:Steven () (vlax-for blockDef *blocks* (if (and (= (vla-get-Islayout blockDef) :vlax-false) (= (vla-get-IsXRef blockDef) :vlax-false) ) (ReplaceTextByAttDef blockDef) ) ) (princ) ) -
Incrémentation d'attributs avec étiquette commune sur blocs différents.
(gile) a répondu à un(e) sujet de Mysterflo dans Routines LISP
Salut, Avec Increment*, si les blocs sont différents, choisir l'option Texte de l'onglet Sélection (CF le screencast joint). *Increment n'est pas un LISP et nécessite une version pleine. Increment_Selection_Texte.mp4 -
Gestion de liste de paires pointées.
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Et l'apostrophe... -
Gestion de liste de paires pointées.
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
La fonction cons prend deux arguments : (cons new-first-element list-or-atom) - si le second argument (list-or-atom) est une liste, elle ajoute le premier argument (new-first-element) au début de cette liste - si le second argument (list-or-atom) est un atome, elle crée une paire pointée (cons 1 2) crée une paire pointée (1 . 2) parce que 2 est un atome (cons 1 '(2 3)) ajoute 1 au début la liste (2 3) et renvoie (1 2 3) (cons 1 nil) ajoute 1 au début la liste vide nil et renvoie (1) Donc, la réponse à ton interrogation : est : non ce n'est pas possible parce que le deuxième terme de ta fausse paire pointée est une liste. Essaye juste d'entrer : '(10 . ("Pouette" "Tobogan" "EtAutre")) dans la console ou à la ligne de commande. Le point dans une paire pointée peut être vu comme un opérateur correspondant à la fonction cons (ce qui donne lieu à ce qu'on appelle la 'notation en paire pointées' ou 'dotted pair notation') (cons 1 2) est équivalent à '(1 . 2) (cons 1 nil) est équivalent à '(1 . nil), tous les deux renvoient (1) (cons 1 '(2 3)) ou (cons 1 (cons 2 (cons 3 nil))) sont équivalents à '(1 . (2 3)) ou '(1 . (2 . (3 . nil))), tous renvoient (1 2 3) Par conséquent '(10 . ("Pouette" "Tobogan" "EtAutre")) est équivalent à (cons 10 '("Pouette" "Tobogan" "EtAutre")) et tous deux renvoient (10 "Pouette" "Tobogan" "EtAutre") -
Gestion de liste de paires pointées.
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Qu'est-ce qui n'est pas clair dans ce que je dis dans le sujet sur les listes chainées et les 'cellules cons' ?
