Aller au contenu

(gile)

Moderateurs
  • Compteur de contenus

    12 247
  • Inscription

  • Dernière visite

  • Jours gagnés

    208

Tout ce qui a été posté par (gile)

  1. Je n'ai jamais dit ça, relis attentivement.
  2. Salut, Des (defun ...) non imbiqués seront accessibles dès le chargement du fichier LISP Un (defun ...) imbriqué dans un autre, n'est accessible qu'à partir du moment où le (defun ...) parent est exécuté. Mais généralement, quand on imbrique un (defun ...) dans un autre, on le déclare aussi localement de manière à ce qu'il ne soit pas accessible en dehors du (defun ...) dans lequel il est déclaré.
  3. Salut, La fonction set-tile permet de définir l'indice de l'élément de la liste sélectionné (comme get_tile permet de l'obtenir).
  4. (gile)

    ChatGPT

    C'est bien ce que je dis, je voulais juste "corriger" @Vincent P.qui disais qu'en anglais intelligence voulait dire "compréhension". Dès les débuts, dans les années 50 avec John McCarthy l'inventeur du LISP, l'Artificial Intelligence cherche à simuler l'intelligence humaine avec des machines.
  5. Salut, getfolderdlg extrait de Dialog sur cette page. ;; getfolderdlg ;; Boite de dialogue pour choisir un dossier ;; ;; Arguments ;; msg : message à afficher dans la boite ;; newFolder : affiche le bouton "Créer un nouveau dossier" si non nil (defun getfolderdlg (msg newFolder / shell folder self path) (or *acad* (setq *acad* (vlax-get-acad-object))) (vl-catch-all-apply '(lambda (flag) (and (setq shell (vla-getinterfaceobject *acad* "shell.application")) (setq folder (vlax-invoke-method shell 'browseforfolder (vla-get-HWND *acad*) msg flag)) (setq self (vlax-get-property folder 'self)) (setq path (vlax-get-property self 'path)) ) ) (if newFolder '(0) '(512) ) ) (foreach obj (list self folder shell) (and obj (vlax-release-object obj)) ) path )
  6. (gile)

    ChatGPT

    À ma connaissance, quand intelligence en anglais ne signifie pas "intelligence" comme en français, ça signifie "renseignement", au sens d'espionnage comme dans CIA (Central Intelligence Agency)...
  7. Le LISP que j'ai posté plus haut importe de fichier DWG dans la table des blocs sans l'insérer dans le dessin. Comme quand tu lances la commande INSERER, puis Parcourir..., tu sélectionnes le fichier et quand AutoCAD te demandes le point d'insertion, tu fais Echap.
  8. (gile)

    ChatGPT

    @Patrick Emin, Autodesk Certes une calculatrice à quatre opérations est plus "puissante" (en fait plus rapide) qu'un humain quand il s'agit d'effectuer des opérations arithmétiques, mais une grue est plus puissante qu'un être humain quand il s'agit de soulever de lourdes charges, est-elle pour autant plus intelligente qu'un être humain ? À mon avis le problème n'est pas tant l'intelligence (à pas confondre avec la capacité de mémoire ou avec la puissance de calcul) que le côté artificiel. On constate seulement aujourd'hui l'ampleur des dégâts causés par l'artificialisation des sols par exemple, mais combien de temps nous faudra-t-il pour constater ceux causés par l'artificialisation de nos esprits, de nos pensées, de notre intellect. Artificialisation qui s'impose brutalement à nous (essentiellement "par facilité" comme le dit @didier) et dont nous sommes plus en plus dépendant.
  9. (gile)

    rotation bloc 90degré

    Dans ton premier message, tu disais : "je souhaite faire une rotation de 90 degré d'un bloc depuis le point de basse du bloc." (defun c:rotblocs (/ ss rot i bloc) (if (and (setq ss (ssget '((0 . "INSERT")))) (setq rot (cond ((getangle "\nSpécifiez la rotation <90°>: ")) (T (* pi 0.5)) ) ) ) (repeat (setq i (sslength ss)) (setq bloc (ssname ss (setq i (1- i)))) (setpropertyvalue bloc "Rotation" (+ (getpropertyvalue bloc "Rotation") rot) ) ) ) (princ) )
  10. (gile)

    rotation bloc 90degré

    Salut, On peut faire beaucoup plus simple (et plus robuste) sans modifier le SCU ni les variables système (et en localisant les variables). (defun c:rotbloc90 (/ ent) (if (setq ent (car (entsel "\nSelectionnez un bloc: "))) (if (= (cdr (assoc 0 (entget ent))) "INSERT") (setpropertyvalue ent "Rotation" (+ (getpropertyvalue ent "Rotation") (* pi 0.5)) ) (prompt "\nL'objet sélectionné n'est pas un bloc.") ) (prompt "\nAucun objet sélectionné.") ) (princ) )
  11. Au temps pour moi, une petite faute frappe oubliée. Le code est corrigé.
  12. (gile)

    ChatGPT

    Tout d'abord, il n'est nullement question d'intelligence dans ton exemple, exceptée la tienne, bien sûr, pour poser les bonnes questions. Il ne s'agit que de connaissances. Pour résoudre ton problème, je commencerais par regarder l'aide pour la méthode ActiveX AddLightWeightPolyline dans l'aide d'AutoCAD. Il s'agit ensuite de fournir le bon type d'argument à la méthode (array of doubles) en fonction du type des données acquises. Cette conversion est propre au langage utilisé et je pense que c'est en apprenant à le faire par soi même qu'on cultive sa propre intelligence. En LISP : (setq points '((1. 2. 0.) (3. 4. 0.) (5. 6. 0.))) (setq coords (apply 'append (mapcar '(lambda (p) (list (car p) (cadr p))) points))) En F# (à supposer qu'on utilise l'API COM avec F#) : let points = [[|1.; 2.; 0.|]; [|3.; 4.; 0.|]; [|5.; 6.; 0.|]] let coords = points |> List.map (fun p -> p[..1]) |> Array.concat En C# (à supposer qu'on utilise l'API COM avec C#) : var points = new List<double[]> { new[]{1.0, 2.0, 0.0}, new[]{3.0, 4.0, 5.0}, new[]{5.0, 6.0, 0.0} }; var coords = new double[points.Count * 2]; for (int i = 0; i < points.Count; i++) { coords[i * 2] = points[i][0]; coords[i * 2 + 1] = points[i][1]; }
  13. (gile)

    ChatGPT

    Salut, Voir cette discussion. Plutôt que de m'en remettre à une (in)intelligence artificielle, je préfère essayer de continuer à cultiver ma modeste intelligence naturelle...
  14. Salut, Si j'ai bien compris la demande, ça devrait faire l'affaire : EDIT : code corrigé (CF plus bas) (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 c:steven (/ setProps ss att) (defun setProps (o) (vla-put-Layer o "0") (vla-put-Color o 0) (vla-put-Linetype o "ByBlock") (vla-put-Lineweight o -2) ) (vlax-for o (vla-Item *blocks* "TRAMES") (if (= (vla-get-ObjectName o) "AcDbAttributeDefinition") (setProps o) ) ) (if (ssget "_X" '((0 . "INSERT") (2 . "TRAMES"))) (progn (vlax-for b (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (foreach att (vlax-invoke b 'GetAttributes) (if (= (vla-get-TagString att) "N°TRAMES") (progn (vla-put-TrueColor b (vla-get-TrueColor att)) (setProps att) ) ) ) ) (vla-Delete ss) ) ) (princ) )
  15. Pour communiquer entre LISP et VBA, on peut utiliser les variables système USERI1-5, USERR1-5 et USERS1-5 ou, bien mieux à mon avis, ces fonctions VBA de Tony Tanzillo qui utilisent Vl.Application (il faut qu'un (vl-load-com) ait été exécuté côté LISP avant de les utiliser) : ' Credit to Tony Tanzillo Public Sub SetLispVar(Symbol As String, value) Dim vlapp As Object Dim vlFuncs As Object Dim vlSet As Object Dim vlSym Set vlapp = CreateObject("Vl.Application.16") Set vlFuncs = vlapp.ActiveDocument.Functions Set vlSym = vlFuncs.Item("read").funcall(Symbol) Set vlSet = vlFuncs.Item("set") Select Case VarType(value) Case vbByte, vbInteger, vbLong Dim lVal As Long lVal = value vlSet.funcall vlSym, lVal Case vbString Dim strVal As String strVal = value vlSet.funcall vlSym, strVal Case vbDouble Dim dblVal As String dblVal = value vlSet.funcall vlSym, dblVal Case vbEmpty vlSet.funcall vlSym, vlFuncs.Item("read").funcall("nil") Case Else If IsArray(value) Then Dim List As Variant List = value vlSet.funcall vlSym, List Else vlSet.funcall vlSym, value End If End Select End Sub Public Function GetLispVar(Symbol As String) As Variant Dim vlapp As Object Dim vlFuncs As Object Set vlapp = CreateObject("Vl.Application.16") Set vlFuncs = vlapp.ActiveDocument.Functions GetLispVar = vlFuncs.Item("eval").funcall(vlFuncs.Item("read").funcall(Symbol)) End Function
  16. Sinon, pour le presse papier, en LISP : (defun SetClipboardText (text / htmlfile data) (setq htmlfile (vlax-create-object "htmlfile") data (vlax-get (vlax-get htmlfile 'ParentWindow) 'ClipBoardData) ) (vlax-invoke data 'SetData "Text" text) (vlax-release-object htmlfile) ) (defun GetClipboardText (/ htmlfile data text) (setq htmlfile (vlax-create-object "htmlfile") data (vlax-get (vlax-get htmlfile 'ParentWindow) 'ClipBoardData) text (vlax-invoke data 'GetData "Text") ) (vlax-release-object htmlfile) text ) En VBA ça devrait être quelque chose comme ça (pas testé) : Sub SetClipboardText(text As String) With CreateObject("htmlfile") With .parentWindow.clipboardData .setData "text", text End With End With End Sub Function GetClipboardText() As String With CreateObject("htmlfile") With .parentWindow.clipboardData GetClipboardText = .GetData("text") End With End With End Function
  17. Je pense que tu es en passe de devenir un vrai spécialiste de la fuite en avant...
  18. Salut, Encore une fois, vouloir mixer plusieurs environnements de programmation dans le même programme est la plupart du temps une fausse bonne idée qui finit par s'avérer plus complexe que de tout écrire (ou traduire) dans un des deux langages. Là il s'agirait d'en ajouter un troisième ("htmlfile" ou autre) pour faire communiquer les deux, je crains que tu ne t'égares... Pour des données sous forme de chaine accessibles aussi bien en LISP qu'en VBA (ou autre) : données accessible dans le dessin pendant la session : variables systèmes USERS[1-5] données enregistrées dans le dessin : dictionnaires et xrecords données accessibles entre plusieurs dessin : base de registre ou fichier texte
  19. Comme dit plus haut, ces "variables d'environnement" (comme beaucoup de variables systèmes) sont enregistrées dans la base de registre...
  20. Salut, Les fonctions LISP getenv et setenv concernent les variables d'environnement, pas les variables système (CF getvar et setvar). Je crains qu'il n'existe pas d'équivalent à getenv / setenv en VBA (API COM). Mais ces "variables d'environnement" AutoCAD sont enregistrées dans la base de registre : HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R24.2\ACAD-6101:40C\FixedProfile\General (remplacer R24.2\ACAD-6101:40C par les valeurs correspondant à la version utilisée). À mon avis, pour communiquer entre différents environnements de programmation, plutôt que d'utiliser des fonctions qui n'existent pas forcément dans tous ces environnements, il vaut mieux utiliser directement la base de registre, voir ici pour le LISP et là pour le VBA. C'est la même chose pour les "ldata" (données LISP uniquement accessible en LISP), il vaut mieux utiliser les dictionnaires AutoCAD standard (dictionnaires nommés ou d'extension) qui sont accessibles par tous les environnement de programmation.
  21. Salut, Normalement, avec la commande INSERER, si tu fais : Parcourir... (ou onglet Bibliothèques et le bouton en haut à droite) et que tu choisis un fichier DWG, il est automatiquement inséré en tant que bloc. Tu devais pouvoir faire ça directement en LISP : (foreach fichier listeFichiers (if (setq filename (findfile fichier)) (progn (command "_INSERT" (strcat "BLOC_" (vl-filename-base filename) "=" filename) ) (command) ) ) )
  22. (gile)

    Hachures (catalogue)

    Avec l'échelle : (defun c:HatchName (/ ent elst pt) (if (and (setq ent (car (entsel "\nSélectionnez une hachure: "))) (= (cdr (assoc 0 (setq elst (entget ent)))) "HATCH") (setq pt (getpoint "\nSpécifiez le point de départ du texte: ")) ) ((lambda (dz) (setvar 'dimzin 8) (command-s "_TEXT" pt "" 0. (strcat (cdr (assoc 2 elst)) " (Echelle = " (rtos (cdr (assoc 41 elst))) ")" ) ) (setvar 'dimzin dz) ) (getvar 'dimzin) ) ) (princ) )
  23. (gile)

    Hachures (catalogue)

    Salut, Essaye ça : (defun c:HatchName (/ ent elst pt) (if (and (setq ent (car (entsel "\nSélectionnez une hachure: "))) (= (cdr (assoc 0 (setq elst (entget ent)))) "HATCH") (setq pt (getpoint "\nSpécifiez le point de départ du texte: ")) ) (command-s "_TEXT" pt "" 0. (cdr (assoc 2 elst))) ) (princ) )
  24. (gile)

    Double tri sur liste

    Il faut comparer les valeurs des entiers au lieu des chaines. (defun compare (x y) (cond ((and (numberp (read x)) (numberp (read y))) (< (atoi x) (atoi y))) ((numberp (read x)) nil) ((numberp (read y)) T) ((= (strlen x) (strlen y)) (< x y)) (T (< (strlen x) (strlen y))) ) )
  25. (gile)

    gc-vpfreeze de Gile

    Salut, Ce n'est pas spécifique à gc-vpFreeze. Si la variable système LayoutRegenCtl est à 2 les présentation ne sont pas régénérées donc les modification apportées aux fenêtres flottantes par programmation (sans activer la présentation) ne s'affichent pas. Donc, soit tu travailles avec LAYOUTREGENCTL à 0 ; soit tu actives chaque présentation pour y modifier les fenêtres comme ci-dessous : (setq ctab (getvar "ctab")) (foreach layout (layoutlist) (setvar "ctab" layout) (if (setq ss (ssget "_X" (list (cons 0 "VIEWPORT") (cons 410 layout) (cons -4 "<NOT") (cons 69 1) (cons -4 "NOT>") ) ) ) (repeat (setq i (sslength ss)) (setq vp (ssname ss (setq i (1- i)))) (gc-vpfreeze vp listecalque) ) ) ) (setvar "ctab" ctab)
×
×
  • 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é