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. Pour utiliser ces fonctions, il ne faut pas hésiter à faire un dumpallproperties pour voir (dans la fenêtre de texte) le nom des propriétés et le type de valeur (setpropertyvalue ssObj "LayerId" (tblobjname "layer" "FDP_Talus Barbules")) (setpropertyvalue ssObj "Color" "BYLAYER")
  2. Tu pourrais utiliser setpropertyvalue pour modifier le calque et la couleur plutôt que la commande CHPROP.
  3. Salut, On ne peut pas filtrer directement avec la longueur d'une polyligne avec un filtre d sélection (il n'y a pas de propriété DXF correspondant à ce critère). Il faut que tu fasse ça dans le traitement de ton jeu de sélection.
  4. Merci pour la correction, bien vu ;) Sinon, la routine GetXdataForApplication comme je l'ai définie est plus générique et retourne la listes des données quelle que soit sa longueur (il peut y avoir plusieurs données) et quel que soit le type de donnée (pas forcément une chaîne). Je pense qu'il est préférable que les routines soit génériques et qu'on adapte leur usage suivant les cas. donc dans ton cas, plutôt que modifier la définition GetXdataForApplication , il vaudrait mieux faire : (cdr (assoc 1000 (GetXdataForApplication (entlast) "Matri"))) comme ça, ailleurs, tu pourras aussi faire : (cdr (assoc 1070 (GetXdataForApplication ...))) pour récupérer un entier, etc.
  5. Oui, ces fonctions sont fondamentales.
  6. Salut, Regardes bien ton code... L'expression : '((-3 ("Matri" (1000 . xMatri)))) retourne : ((-3 ("Matri" (1000 . XMATRI)))) sans évaluer XMATRI... C'est l'apostrophe ('), qui est un raccourci pour la fonction quote qui empêche l'évaluation. Pour que la variable XMATRI soit évaluée, il faut que toute l'expression soit évaluée : (list (list -3 (cons "Matri" (cons 1000 xMatri)))) Je te propose deux petites routine qui facilitent les choses EDIT: correction faite suite à la remarque pertinente de DenisHen. ;; GetXdataForApplication ;; Retourne la liste des données étendues pour l'application ;; ;; Arguments ;; ename : nom d'entité de l'objet auquel les données sont attachées ;; appName : nom de l'application enregistrée (defun GetXdataForApplication (ename appName) (cdadr (assoc -3 (entget ename (list appName)))) ) ;; SetXdataForApplication ;; Affecte à l'objet la liste des données étendues pour l'application ;; ;; Arguments ;; ename : nom d'entité de l'objet auquel les données sont attachées ;; appName : nom de l'application enregistrée ;; data : liste de paires pointées contenant les données (defun SetXdataForApplication (ename appName data) (or (tblsearch "APPID" appName) (regapp appName)) (entmod (append (entget ename) (list (list -3 (cons appName data))))) ) Une fois ces routines chargées, tu peux simplement faire : (SetXdataForApplication (entlast) "Matri" (list (cons 1000 xMatri)))
  7. (gile)

    Raccord multiple

    Ça c'est fondamental. LISP est un langage de manipulation des listes : Une expression LISP c'est : (définition récursive) soit un atome (un objet élémentaire comme un nombre, une chaîne de caractère, une entité, une fonction, etc.) soit une liste d'expressions LISP (voir ci-dessus) Donc les fonctions de manipulation des listes telles que car, cdr (et leurs différentes combinaisons), cons, list, quote sont absolument fondamentales. Il est indispensable des les connaitre pour pouvoir avancer en LISP (CF chapitre 8 page 18 de introduction à AutoLISP).
  8. (gile)

    Raccord multiple

    Vas dans l'éditeur Visual LISP, dans la console, tu entres : (entsel) et tu valides par Entrée. Automatiquement tu te retrouves dans la fenêtre d'AutoCAD avec une invite : Choix de l'objet: Tu choisis une entité et tu te retrouves dans l'éditeur Visual LISP avec le résultat de l'évaluation de l'expression (entsel), quelque chose du genre : ( (1997.09 1257.39 0.0)) Qu'es aquò ?... Pour en savoir plus, tu sélectionne le mot entsel dans la console par double clic et tu fais Ctrl+F1 (ou l'icône avec le point d'interrogation [?]). L'aide aux développeurs s'ouvre directement à la page de la fonction entsel. C'est en anglais mais ce n'est pas bien compliqué à comprendre. Ce qui nous intéresse ici c'est la valeur retournée : Return Values A list whose first element is the entity name of the chosen object and whose second element is the coordinates (in terms of the current UCS) of the point used to pick the object. Donc en gros ça nous dit qu'il s'agit d'une liste (effectivement la valeur retournée est entre parenthèses) dont le premier élément est le nom d'entité de l'objet sélectionné et le second la liste (eh oui encore des parenthèses) des coordonnées SCU du point cliqué. Donc selon ce dont on a besoin, on stockera le premier et/ou le second élément dans des variables. ;; invite l'utilisateur à sélectionner une entité et stocke le résultat dans ent (setq ent (entsel)) ;; stocke le nom d'entité dans ename (setq ename (car ent)) ;; stocke le point cliqué dans pickedPt (setq pickedPt (cadr ent)) Souvent, on n'a besoin que de l'entité, donc on fait directement : (setq ename (car (entsel)))
  9. (gile)

    Mtext et exposant

    Salut, En ce qui concerne les problèmes d'accent, le LISP a dû passer dans un éditeur de texte qui l'aura mal encodé. Voir ici.
  10. (gile)

    Raccord multiple

    Salut et bienvenue au club, Quand on utilise une fonction LISP (comme ici entsel) il est impératif de connaitre ce que la fonction retourne. Il faut donc consulter l'aide ou toute autre documentation si on ne sait pas précisément le type de valeur retournée et si ce type correspond bien à ce qui est attendu à cet endroit du code. Par ailleurs, il est préférable de ne pas imbriquer dans une expression (command ...) des appels à des fonctions d'entrée utilisateur (ssget, entsel, getdist, getangle, getpoint, ...). Il vaut toujours mieux récupérer les entrées utilisateurs avant et les stocker dans des variables (ceci permet aussi de contrôler leur validité). Pour implémenter des appels à command, j'avais fait cette petite vidéo qui décris une méthode pas à pas dont tu devrais pouvoir t'inspirer.
  11. Salut, Puisque ton projet est (hélas) écrit en VB, il faut d'abord que tu convertisses le code de NumericBox en VB, ça devrait bien se passer avec Telerik. Ensuite, dans ton projet tu fais Ajouter > Classe..., tu renommes la classe NumericBox dans la boite de dialogue et tu colles le code de la classe dans ce fichier. Tu auras peut-être quelques corrections à faire. Tu peux supprimer l'espace de nom ControlLibrary pour que la classe appartienne au même espace de nom que ton projet (je n'ai jamais vraiment compris comment VB gérait les espaces de nom). Visual Studio devrait reconnaitre la classe comme une définition de UserControl (puisqu'elle dérive de TextBox) et la proposer dans la Boite à outils (une génération du projet est peut-être nécessaire pour qu'elle apparaisse). http://gilecad.azurewebsites.net/Resources/NumericBox.png Il suffit ensuite de faire un glisser / déposer de NumericBox dans ton formulaire comme avec n'importe quel autre composant.
  12. Pour récupérer des valeurs numériques (entières ou réelles) depuis un TextBox, j'avais fait ces petites classes qui dérivent de TextBox et utilisent une validation du texte entré. La propriété Value, permet de récupérer directement la valeur numérique (Integer ou Double)
  13. Salut, Le code que tu montres ne permet pas de déterminer ton problème (de plus il est plein de lignes commentées qui n'en facilite pas la lecture). Le problème semble venir de epL qui est défini ici : Dim epL As Double = CDbl(OutilsGpO.OutilsGpO.Virg(txtWidth.Text, ",")) Or on ne sait rien de la méthode OutilsGpO.OutilsGpO.Virg()...
  14. (gile)

    Variable OSOPTIONS

    Salut, OSOPTIONS est enregistrée dans la base de registre donc, normalement, le changement de valeur devrait persister d'une session à l'autre. La seule explication que je vois est qu'un programme (LISP ou autre) chargé au démarrage en change la valeur.
  15. Pour les pilotes de cartes graphique, le plus sûr est de regarder >>ici s'il existe un pilote certifié pour la configuration.
  16. Salut, Je ne pense pas que ça vienne de la carte graphique, j'ai une K620 sur un poste et je n'ai jamais eu de souci avec 2018. Essaye une réparation, voire une réinstallation.
  17. Salut Patrice, C'est stocké dans les profils : HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-XXXX.XXX\Profiles\\General\DefaultConfig DefaultConfig est aussi une variable système (comme à peu près tous les paramètres de la boite de dialogue Options). On y accède aussi en LISP avec getenv / setenv.
  18. Salut, Je ne suis pas sûr qu'il y ait une variable système correspondante, mais c'est géré par la variable d'environnement AutoSnapSize. HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-XXXX:XXX\FixedProfile\Editor Configuration\AutoSnapSize On y accède en LISP avec, pour obtenir la valeur courante : (getenv "AutoSnapSIze") et, pour assigner une valeur (5, par exemple) : (setenv "AutoSnapSIze" "5")
  19. C'est une erreur de ma part. Le LISP construit une chaine de caractères en concaténant (srtcat) les résultats pour les différents types d'entité. J'avais oublié la variable str (la chaine en construction) dans l'expression (strcat ...) du cas où il n'y a pas d'entité de ce type. Comme les polylignes 3d sont traitées en dernier, la chaine "Le dessin ne contient pas de Polyligne 3d" a écrasé tout ce qui avait été construit avant. J'ai corrigé le code ci dessus.
  20. (defun C:xL_by_layer (/ ss lines plines 2dplines 3dplines objName layer leng lst sum str ) (vl-load-com) ;; sélection de toutes les lignes et polylignes (tous types) (if (ssget "_X" '((0 . "LINE,*POLYLINE"))) (progn (vlax-for obj (setq ss (vla-get-ActiveSelectionSet (vla-get-Activedocument (vlax-get-acad-object) ) ) ) (setq objName (vla-get-ObjectName obj) layer (vla-get-Layer obj) leng (vla-get-Length obj) ) ;; construction d'une liste pour chaque type d'entité (cond ((= objName "AcDbLine") (setq lines (cons (cons layer leng) lines)) ) ((= objName "AcDbPolyline") (setq plines (cons (cons layer leng) plines)) ) ((= objName "AcDb2dPolyline") (setq 2dplines (cons (cons layer leng) 2dplines)) ) ((= objName "AcDb3dPolyline") (setq 3dplines (cons (cons layer leng) 3dplines)) ) ) ) (vla-Delete ss) ;; contruction d'une chaîne de caractère (setq str "") ;; traitement par liste (mapcar (function (lambda (l n) (if l (progn ;; nombre d'entité dans la liste (setq str (strcat str "Le dessin contient : " (itoa (length l)) " " n (if (= 1 (length l)) "\n" "s\n" ) ) ) ;; somme des longueurs par calque (setq lst nil) (foreach p l (setq lst (if (setq sum (assoc (car p) lst)) (subst (cons (car p) (+ (cdr p) (cdr sum))) sum lst) (cons p lst) ) ) ) (foreach p (vl-sort lst (function (lambda (a B) (< (car a) (car B))))) (setq str (strcat str (car p) " " (rtos (cdr p)) "\n" ) ) ) ;; somme des longueur pour le type d'entité (setq str (strcat str "Longueur totale dans le dessin = " (rtos (apply '+ (mapcar 'cdr l))) "\n\n" ) ) ) ;; pas d'entité de ce type (setq str (strcat str "Le dessin ne contient pas de " n "\n\n" ) ) ) ) ) (list lines plines 2dplines 3dplines) '("Ligne" "Polyligne" "Polyligne 2d" "Polyligne 3d") ) (terpri) ;; écriture des résultats dans la fenêtre de texte (prompt str) ;; écriture des résultats dans un fichier texte (setq file (open (strcat (getvar 'dwgprefix) (vl-filename-base (getvar 'dwgname)) ".txt") "w") ) (princ str file) (close file) ) ) (princ) )
  21. S'il y a 3 lignes dont 2 sur le calque layer_a, faut-il écrire : Le dessin contient : 3 LINE layer_a 10.00 layer_a 5.00 layer_c 3.00 Longueur totale dans le dessin = 18.00 ou : Le dessin contient : 3 LINE layer_a 15.00 layer_c 3.00 Longueur totale dans le dessin = 18.00
  22. Salut, Donne plutôt un exemple simple mais significatif du résultat souhaité, parce que les modifications apportées à la routine ne permettent pas de le comprendre.
  23. Salut, Les données d'activation des licences Autodesk sont inscrites dans la zone d'amorce du disque dur système et seul un formatage "bas niveau" peut les effacer. De toutes façon, même dans le cas d'un formatage de bas niveau (ou d'un changement de disque dur), quand on réinstalle les logiciels, on bénéficie des 30 jours d'évaluation ce qui permet de ré-obtenir les codes d'activations auprès d'Autodesk.
  24. Oupss!... je voulais dire espace papier, bien sûr...
  25. Pour bonuscad et tous ceux qui ont des autorisations restreintes mais me font confiance et voudraient essayer en cachette de leur chef: Télécharger ClipDetail.zip. Débloquer le ZIP (clic droit > Propriétés > onglet Général > Débloquer) Extraire le contenu (ClipDetail.dll et dossier fr) dans un même dossier (pour avoir l'interface en français) Charger la DLL depuis AutoCAD avec la commande NETLOAD. lili2006, en espace objet papier, je pense qu'il est (beaucoup) plus pertinent d'utiliser des fenêtre et des échelles.
×
×
  • 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é