-
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)
-
Salut, 1) Tu as une documentation dans le fichier arxmgd.chm dans le dossier ObjectARX 20XX\docs (si tu as bien téléchargé et installé le SDK ObjectARX). On peut aussi avoir le guide des références .NET 2018 en ligne. 2) Application.Idle est un évènement déclenché quand l'application est au repos. En délégant l'évènement DocumentActivated à Idle, on s'assure que le gestionnaire d'évènement ne sera exécuté qu'après la complète initialisation du document.
-
Installation entreprise et personnalisation
(gile) a répondu à un(e) sujet de Hydro8 dans Suggestions de développements
Salut, Si tu cibles des version d'AutoCAD 2012 ou ultérieures, le plus simple, à mon avis, est d'utiliser le mécanisme 'Autoloader'. tu n'auras qu'à créer un dossier '.bundle' avec un fichier PackageContents.xml qui décris les chargements automatiques. Voir : la rubrique (et les sous rubriques) A propos de l'installation et de la désinstallation d'applications de plug-in la partie concernant Autoloader dans Chargement automatique des DLLs .NET (adaptable pour des routines LISP) et, si tu comprends l'anglais Autodesk Autoloader White Paper -
Modification attribut lisp impossible
(gile) a répondu à un(e) sujet de Aligol dans LISP et Visual LISP
Regarde du côté de la variable système ATTREQ. -
Appel de fonction trop long
(gile) a répondu à un(e) sujet de samideqlqpart dans ObjectARX/DBX, C++, .NET, RealDWG
Salut, Même si tu n'as pas fini les corrections, tu peux déjà voir si ça semble résoudre ton problème en désactivant Option Strict pour tester si les performance sont améliorées avec les corrections déjà effectuées. -
Essaye en utilisant le nom global de la commande (_.insert) plutôt qu'un alias (i) qui peut être différent par défaut suivant la version d'AutoCAD et/ou modifié par l'utilisateur. ^C^C_.insert;"C:/Program Files/Autodesk/nom de l'entreprise/CADS/type/nomdubloc.dwg";\;;;_.explode;_last;
-
Salut, Si tu utilises une version pleine, tu peux essayer de passer une expression LISP : ^C^C(command "_.insert" "C:\\Program Files\\Autodesk\\nom de l'entreprise\\CADS\\type\\nomdubloc.dwg" pause "" "" "" "_.explode" "_last")
-
Concaténer les valeurs de variables...
(gile) a répondu à un(e) sujet de willy95 dans Débuter en LISP
Salut, Es-tu bien sûr d'exécuter ces 3 expressions LISP à la suite ? Les résultats dans la console Visual LISP devraient être : _$ Q1 "Je suis" _$ Q2 "ici" _$ R "Je suisici" Et en ligne de commande : Commande: !Q1 "Je suis" Commande: !Q2 "ici" Commande: !R "Je suisici" -
Tu peux t'inspirer des routines de Spécial_Selections.lsp sur cette page. La première routine avec des commentaires : ;; Sélection par calque (defun c:ssl (/ ss ent) (and ; si... ('and' joue ici le rôle de 'if') (or ;; soit... (and (setq ss (cadr (ssgetfirst))) ; une sélection est active et... (= 1 (sslength ss)) ; elle ne contient qu'une entité et ... (setq ent (ssname ss 0)) ; on affecte à ent cette entité ) ;; soit... (and (sssetfirst nil nil) ; on déselectionne tout et... (setq ent (car (entsel))) ; l'utilisateur sélectionne une entité ) ) ;; on active une sélection de toutes les entités sur le même calque que l'entité sélectionnée (sssetfirst nil (ssget "_X" (list (assoc 8 (entget ent))))) ) (princ) ) Tu trouveras des explication sur les fonctions utilisées dans la rubrique 16 Accès aux objets du dessin de Introduction à AutoLISP (sur cette page). entsel : 16.1 entget : 16.2 ssget, sslength, ssname, ssgetfirst, sssetfirst : 16.3 les filtres de sélection : 16.4 Les opérateurs loginque and et or sont traités à la rubrique 12.2.
-
Il faut que tu nettoies le cache de ton navigateur qui doit conserver une ancienne version. Sinon, tu peux tout simplement modifier le fichier PackageContents.xml (SeriesMax="R22.0"), il n'y a pas eu de modifications dans l'application.
-
Ouvre le fichier : C:\Users\<UserName>\AppData\Roaming\Autodesk\ApplicationPlugins\RadicalPurge.bundle\PackageContents.xml dans un éditeur de texte (notepad++, notepad) et vérifie que dans le noeud : <Components Description="2013 to 2018 parts"> tu aies bien : <RuntimeRequirements SupportPath="./Contents" OS="Win32|Win64" Platform="AutoCAD*" SeriesMin="R19.0" SeriesMax="R22.0" /> Si tu n'as pas : SeriesMax="R22.0", c'est que tu n'as pas la dernière version.
-
Appel de fonction trop long
(gile) a répondu à un(e) sujet de samideqlqpart dans ObjectARX/DBX, C++, .NET, RealDWG
Comme expliqué dans les articles en lien, en voulant faciliter les choses, VB permet d'écrire du code moins sûr et peu efficient. C'est une des raison pour lesquelles j'ai toujours préconisé d'utiliser C#, ou, pour les inconditionnels du VB, d'activer l'option Strict. -
Très étrange... C'est Autodesk qui crée l'installeur, je ne peux donc que faire des suggestions. As-tu bien regardé dans : C:\Users\\AppData\Roaming\Autodesk\ApplicationPlugins Regarde aussi si tu vois RadicalPurge dans le Panneau de configuration > Programmes et fonctionnalités. Si c'est le cas, désinstalle-le et réinstalle la dernière version.
-
Appel de fonction trop long
(gile) a répondu à un(e) sujet de samideqlqpart dans ObjectARX/DBX, C++, .NET, RealDWG
Essaye de mettre : Option Strict = On, et tu verras si Visual Studio te signale des erreurs. -
Appel de fonction trop long
(gile) a répondu à un(e) sujet de samideqlqpart dans ObjectARX/DBX, C++, .NET, RealDWG
Si tu utilises Option Strict = On, VB ne fera plus de conversion implicite (comme en C#) et n'autorisera plus la liaison tardive (late binding) implicite avec le type Object. Voir ce message ou la rubrique V-N-3 (spécialement V-N-3-c) de ce tuto. -
Appel de fonction trop long
(gile) a répondu à un(e) sujet de samideqlqpart dans ObjectARX/DBX, C++, .NET, RealDWG
Le problème semble donc bien venir de la compilation JIT (voir ce sujet). Il faut donc regarder du côté du code de la méthode 'armature' et des méthodes qu'elle appelle (la compilation JIT se fait au premier appel de chaque méthode). Je ne pense pas que les modificateurs d'accès comme public, private, internal, ou protected influent beaucoup sur le temps de compilation d'une méthode, par contre l'utilisation de la liaison tardive (implicite avec Object en VB si l'option strict est désactivée) peut considérablement ralentir l'exécution. Il est aussi possible que l'utilisation de l'interface COM ait une influence sur les performances. Ce ne sont bien sûr que des suppositions, n'ayant vu aucun code. -
Il faut que le fichier ssmatch_box2.dcl soit enregistré dans un répertoire des chemins de recherche. Sinon, tu peux simplement charger le fichier compilé Ssmatch.VLX qui est une compilation du LISP et du DCL. Tout ça est expliqué dans le fichier lisez-moi.txt...
-
Plus proche de ce que tu cherches à faire avec un ComboBox (si j'ai bien compris). Nota: si une valeur non valide est affectée en LISP, le code .NET réaffecte automatiquement la valeur précédente. XAML: <UserControl x:Class="NetToLispPalette.PaletteTab" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:NetToLispPalette" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> <Grid Background="WhiteSmoke"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid Grid.Row="0"> <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <Label Margin="5,15,5,5">Largeur de la gaine :</Label> <ComboBox x:Name="cbxLayer" Grid.Column ="1" Margin="5,15,10,5" HorizontalAlignment="Stretch" ItemsSource="{Binding Largeurs}" SelectedItem="{Binding Epaisseur}" /> </Grid> </Grid> </UserControl> Code behind: using System.Windows.Controls; namespace NetToLispPalette { /// <summary> /// Logique d'interaction pour PaletteTab.xaml /// </summary> public partial class PaletteTab : UserControl { public PaletteTab() { InitializeComponent(); DataContext = new PaletteTabViewModel(); } } } ViewModel: using Autodesk.AutoCAD.ApplicationServices; using System; using System.Collections.Generic; namespace NetToLispPalette { public class PaletteTabViewModel : ObservableObject { DocumentCollection docs = Application.DocumentManager; HashSet<double> largeurs = new HashSet<double> { 80.0, 125.0, 160.0, 200.0, 250.0, 315.0, 355.0, 400.0 }; double epaisseur = 125.0; // valeur par défaut // Propriété liée à ItemsSource du ComboBox public HashSet<double> Largeurs => largeurs; // Propriété liée à SelectedItem du ComboBox public double Epaisseur { get { return epaisseur; } set { epaisseur = value; docs.MdiActiveDocument.SetLispSymbol("epais", value); RaisePropertyChanged(nameof(Epaisseur)); } } // Constructeur public PaletteTabViewModel() { Epaisseur = TryGetLispValue(); // Abonnement de tous les documents ouverts à LispEnded foreach (Document doc in docs) doc.LispEnded += Doc_LispEnded; // Abonnement des documents créés à Docs_DocumentCreated docs.DocumentCreated += Docs_DocumentCreated; // Abonnement des documents activés à Docs_DocumentActivated docs.DocumentActivated += Docs_DocumentActivated; } // Mise à jour de la propriété Epaisseur à la fin de chaque LISP private void Doc_LispEnded(object sender, EventArgs e) { Epaisseur = TryGetLispValue(); } // Abonnement à Doc_LispEnded pour tous les documents créés private void Docs_DocumentCreated(object sender, DocumentCollectionEventArgs e) { e.Document.LispEnded += Doc_LispEnded; } // Abonnement à Application_Idle pour tous les documents activés private void Docs_DocumentActivated(object sender, DocumentCollectionEventArgs e) { Application.Idle += Application_Idle; ; } // Mise à jour de la propriété Epaisseur dès que le document activé est au repos private void Application_Idle(object sender, EventArgs e) { Application.Idle -= Application_Idle; // désabonnement var doc = docs.MdiActiveDocument; if (doc != null) Epaisseur = TryGetLispValue(); } // Retourne la valeur de la variable LISP si elle est valide, sinon la valeur courante de epaisseur private double TryGetLispValue() { double epais; try { epais = Convert.ToDouble(docs.MdiActiveDocument.GetLispSymbol("epais")); } catch { epais = epaisseur; } return largeurs.Contains(epais) ? epais : epaisseur; } } }
-
Un exemple simple avec la gestion d'une seule propriété (LispVar) pour une variable LISP nommée "foo". cette propriété peut être liée à un contrôle de la palette. using Autodesk.AutoCAD.ApplicationServices; using System; namespace NetToLispPalette { public class PaletteTabViewModel : ObservableObject { const string varName = "foo"; object lispVar; DocumentCollection docs = Application.DocumentManager; // Valeur de la variable LISP 'foo' public object LispVar { get { return lispVar; } set { lispVar = value; if (value != null) docs.MdiActiveDocument.SetLispSymbol(varName, value); RaisePropertyChanged(nameof(LispVar)); } } // Constructeur public PaletteTabViewModel() { // Abonnement de tous les documents ouverts à LispEnded foreach (Document doc in docs) doc.LispEnded += Doc_LispEnded; // Abonnement des documents créés à Docs_DocumentCreated docs.DocumentCreated += Docs_DocumentCreated; // Abonnement des documents activés à Docs_DocumentActivated docs.DocumentActivated += Docs_DocumentActivated; } // Mise à jour de la propriété LispVar à la fin de chaque LISP private void Doc_LispEnded(object sender, EventArgs e) { LispVar = ((Document)sender).GetLispSymbol(varName); } // Abonnement à Doc_LispEnded pour tous les documents créés private void Docs_DocumentCreated(object sender, DocumentCollectionEventArgs e) { e.Document.LispEnded += Doc_LispEnded; } // Abonnement à Application_Idle pour tous les documents activés private void Docs_DocumentActivated(object sender, DocumentCollectionEventArgs e) { Application.Idle += Application_Idle; ; } // Mise à jour de la propriété LispVar dès que le document activé est au repos private void Application_Idle(object sender, EventArgs e) { Application.Idle -= Application_Idle; // désabonnement var doc = docs.MdiActiveDocument; if (doc != null) LispVar = doc.GetLispSymbol(varName); } } }
-
Salut, Tout d'abord, je me permettrais une remarque d'ordre général : j'évite tant que possible d'utiliser des variables globales LISP a fortiori si ces variables doivent être utilisées dans un autre environnement de programmation plus "rigoureux" comme .NET. J'utiliserais plutôt des valeurs stockées dans des dictionnaires ou des variables système personnalisées (il est possible de créer ses propres variables système depuis AutoCAD 2011). Sinon, il n'est plus nécessaire depuis AutoCAD 2013 d'utiliser P/Invoke avec acedGetSym et acedSetSym. Les méthodes Document.GetLispSymbol() et Document.SetLispSymbol() permettent la même chose en "pur .NET" (code managé). Habituellement quand on veut abonner tous les documents à un gestionnaire d'évènement (LispEnded par exemple), on fait ça en deux temps : 1. abonnement des documents déjà ouverts (il peut y en avoir plusieurs si le code n'est pas exécuté depuis la méthode Initialize() d'une classe implémentant IExtensionApplication). foreach (Document doc in Application.DocumentManager) doc.LispEnded += LispEndedHandler; 2. abonnement des documents créés (ou ouverts) ultérieurement. On utilise l'évènement DocumentCreated qui ne sera lancé qu'à la création (nouveau ou ouvrir) du document (contrairement à DocumentActivated qui est activé à chaque fois qu'on passe d'un dessin à un autre) Application.DocumentManager.DocumentCreated += DocumentCreatedHandler; et private void DocumentCreatedHandler(object sender, DocumentCollectionEventArgs e) { e.Document.LispEnded += LispEndedHandler; }
-
Appel de fonction trop long
(gile) a répondu à un(e) sujet de samideqlqpart dans ObjectARX/DBX, C++, .NET, RealDWG
Salut, À mon avis il faudrait déterminer si cette différence de temps d'exécution est due au contexte du chronométrage (depuis la méthode appelante ou depuis l'intérieur de la méthode appelée) ou bien si le temps d'exécution proche de 5 secondes n'apparaît pas uniquement à la première exécution dans une session AutoCAD (quel que soit de contexte de chronométrage). Si le temps est notablement réduit pour les exécutions suivantes, c'est probablement dû à la compilation JIT (Just In Time) du code CIL (Common Intermediate Language) en code exécutable (cette compilation n'ayant lieu qu'à la première exécution). Dans ce cas, je me pencherais sérieusement sur l'optimisation du code de "armature" car je n'ai jamais rencontré de méthode qui nécessite près de 5 secondes pour la compilation JIT. -
Salut, C'est quoi tes "variables LISP" ? Sous quelle forme sont-elle exposées au code .NET ? Montre ton code pour modifier ces variable depuis la palette ou vers la palette (le code que tu montres est celui de l'exemple et de la gestion des calques qui n'a rien à voir avec ce que tu demandes). Si tu veux une mise à jour à chaque changement de dessin, tu peux utiliser l'évènement DocumentManager.DocumentActivated. En général, pour utiliser le Binding avec WPF on expose des propriétés dans une classe qui implémente INotitfyPropertyChanged et/ou on utilise des collection de type ObservableCollection (comme UIBindings.Collections).
-
J'ai renoncé à tout réécrire en utilisant WPF (pas assez de temps en ce moment) mais j'ai corrigé les problèmes de redimensionnement de la boite de dialogue (télécharger et installer la dernière version).
-
[RESOLU] Image selon choix bouton radio
(gile) a répondu à un(e) sujet de Bortch59 dans Pour aller plus loin en LISP
Salut, Tu peux utiliser action_tile pour mettre à jour l'image. Un petit exemple qui suppose que les fichiers Face.sld, Dessus.sld et Coupe.sld soient dans les chemin de recherche d'AutoCAD. Un petit DCL basique avec 3 boutons radio et une image : ImageOption :dialog{ label = "Test"; :row{ :boxed_radio_column{ label = "Choix de la vue"; key = "view"; :radio_button{ label = "Face"; key = "front"; } :radio_button{ label = "Dessus"; key = "top"; } :radio_button{ label = "Coupe"; key = "section"; } } :column{ :image{ key = "img"; aspect_ratio = 1.0; height = 8; } } } spacer; ok_cancel; } Le LISP qui contrôle la boite de dialogue : (defun imgdlg (/ updateImage view dcl_id status) ;; met à jour l'image en fonction du bouton radio (defun updateImage (key / sld x y) (setq sld (cond ((= key "front") "Face") ((= key "top") "Dessus") ((= key "section") "Coupe") ) x (dimx_tile "img") y (dimy_tile "img") ) (start_image "img") (fill_image 0 0 x y 0) (slide_image 0 0 x y sld) (end_image) ) (setq view "front") ; valeur par défaut (if (< 0 (setq dcl_id (load_dialog "ImageOption.dcl"))) (if (new_dialog "ImageOption" dcl_id) (progn (set_tile "view" view) (updateImage view) (action_tile "view" "(updateImage (setq view $value))") (setq status (start_dialog)) (unload_dialog dcl_id) ;; si OK (if (= status 1) view ) ) (prompt "\nLa boite de dialogue 'ImageOption' n'est pas définie.") ) (prompt "\nLe fichier 'ImageOption.dcl' est introuvable") ) ) -
Salut, Préfères tu qu'on t'envoie nos remarques dans ce sujet, par message privé, ou par mail ? Exemple de remarque : AutoLISP > Fonctions par genre > Les nombres > Ordre d'évaluation dans AutoLISP : (/ 3 2) ne retourne pas 1.5 mais 1 (division entière) il vaudrait mieux écrire : (/ 4 2) retourne 2 (pour rester avec des entiers) ou (/3 2.0) retourne 1.5 pour illustrer le fait que si un des opérandes est un réel les résultat est réel.
-
Chargement automatique d'un Lisp à chaque fichier
(gile) a répondu à un(e) sujet de DenisHen dans LISP et Visual LISP
Il y a variable système ACADLSPASDOC qui détermine si le fichier acad.lsp est chargé uniquement au démarrage d'AutoCAD (0 valeur par défaut) ou dans chaque dessin ouvert (1). Mais à ma connaissance, le contenu de la "valise" de APPLOAD est chargé à l'ouverture de chaque dessin (comme les fichiers acaddoc.lsp ou MNL).
