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, 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.
  2. 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
  3. Regarde du côté de la variable système ATTREQ.
  4. 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.
  5. (gile)

    Unknown command "DWG"

    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;
  6. (gile)

    Unknown command "DWG"

    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")
  7. 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"
  8. (gile)

    Ayez enfin je débute

    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.
  9. 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.
  10. 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.
  11. 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.
  12. 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.
  13. Essaye de mettre : Option Strict = On, et tu verras si Visual Studio te signale des erreurs.
  14. 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.
  15. 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.
  16. (gile)

    Lisps de gile

    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...
  17. 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; } } }
  18. 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); } } }
  19. 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; }
  20. 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.
  21. 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).
  22. (gile)

    Lisps de gile

    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).
  23. 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") ) )
  24. (gile)

    Nouveau Site Perso

    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.
  25. 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).
×
×
  • 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é