-
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)
-
Utiliser une fonction php avec lisp
(gile) a répondu à un(e) sujet de GEGEMATIC dans Pour aller plus loin en LISP
Salut, D'après ce que j'ai vu, pour la distance de Levenshtein, il semble que le plus efficient soit l'utilisation d'un tableau de dimension 2. J'ai donc essayé de transcrire ce que j'ai trouvé en Visual LISP avec l'utilisation d'un safearray. (defun LevenshteinDistance (str1 str2 / lst1 lst2 len1 len2 matrix i j cost) (vl-load-com) (setq lst1 (vl-string->list str1) len1 (length lst1) lst2 (vl-string->list str2) len2 (length lst2) ) (cond ((zerop len1) len2) ((zerop len2) len1) ) (setq matrix (vlax-make-safearray vlax-vbInteger (cons 0 len1) (cons 0 len2))) (setq i 0) (repeat (1+ len1) (vlax-safearray-put-element matrix i 0 i) (setq i (1+ i)) ) (setq j 0) (repeat (1+ len2) (vlax-safearray-put-element matrix 0 j j) (setq j (1+ j)) ) (setq i 1) (repeat len1 (setq j 1) (repeat len2 (setq cost (if (= (nth (1- i) lst1) (nth (1- j) lst2)) 0 1 ) ) (vlax-safearray-put-element matrix i j (min (1+ (vlax-safearray-get-element matrix (1- i) j)) (1+ (vlax-safearray-get-element matrix i (1- j))) (+ (vlax-safearray-get-element matrix (1- i) (1- j)) cost) ) ) (setq j (1+ j)) ) (setq i (1+ i)) ) (vlax-safearray-get-element matrix len1 len2) ) -
Salut, J'ai ajouté à CustomCurvesSetup.msi une commande ANSEDEPANIER (_BASKETHANDLE) pour tracer des anses de panier (Polyline) à 3 ou 7 centres.
-
Salut, Avec la fonction command (comme avec vl-cmdf ou command-s), on ne peut appeler que les commandes natives ou les commandes personnalisées définies en .NET ou ObjectARX. Les "commandes" définies en LISP avec : (defun c:NomDeLaCommande ...) ne peuvent être appelées en AutoLISP qu'en tant que fonctions LISP : (c:NomDeLaCommande). Ceci qui ne permet pas de spécifier les options ou entrées utilisateur. La méthode COM SendCommand que l'on peut appeler en LISP avec vla-SendCommand) permet de "scripter" une commande LISP en lui passant les entrées utilisateur à condition que celles-ci soient exprimables en chaîne de caractère. (defun c:exemple (/ cen) (if (setq cen (getpoint "\nCentre: ")) (command "_.circle" cen 10.) ) (princ) ) La fonction c:exemple définie ci-dessus peut être appelée simplement avec : (c:exemple)mais l'utilisateur sera invité à spécifier le centre. En utilisant SendCommand, on peut passer la donnée pour le centre : (vla-SendCommand (vla-get-ActiveDocument (vlax-get-acad-object)) ; le dessin actif "exemple 10,8 " ; le script à exécuter )Cette dernière méthode est équivalente à exécuter un fichier .scr qui contiendrait : exemple 10,8
-
Salut, Les fonctions LISP s'exécutent toujours de manière séquentielles ("les une derrière les autres") jamais "en parallèle".
-
Salut, Il faut parcourir la définition du bloc à la recherche de textes dont les positions correspondent. (cdr (assoc -2 (tblsearch "block" nomDuBloc))) retourne la première entité dans le nom du bloc, une boucle avec entnext permet de retrouver les suivantes. Tu peux aussi le faire avec COM : (vlax-for obj (vla-Item (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))) nomBloc) ...)
-
Le biais cognitif : conte à raconter aux petit utilisateurs
(gile) a répondu à un(e) sujet de Aleck_Ultimate dans AutoCAD, liste de souhaits
Salut, Je n'ai pas tout compris à cette "publication", mais concernant la citation ci-desous, il ne s'agit absolument pas d'un bug mais bien du comportement normal des blocs imbriqués, voir ce sujet. -
Salut, Un des principaux problèmes avec l'utilisation de command est dû aux modifications apportées aux commandes AutoCAD qui ne sont pas toujours répercutés dans les versions LISP des commandes. La fonction initcommandversion permet de forcer la version de la commande. Comme tu as pu le constater, lancée directement dans AutoCAD, c'est la dernière version de la commande SPLINE qui s'exécute, mais avec (command "_spline") c'est l'ancienne version de SPLINE qui est lancée. Pour forcer AutoLISP à lancer la dernière version, il faut exécuter (initcommandversion) avant d'appeler la commande. (defun c:SPL_FIT () (initcommandversion) (command "_.spline" "_method" "_Fit") (princ) ) (defun c:SPL_CV () (initcommandversion) (command "_.spline" "_method" "_CV") (princ) ) Tu peux aussi jouer avec la variable système SPLMETHOD. (defun c:SPL_FIT () (spline 0)) (defun c:SPL_CV () (spline 1)) (defun spline (m) (setvar 'splmethod m) (initcommandversion) (command "_.spline") (princ) )
-
Tu n'as pas besoin d'appeler Dispose() sur une transaction démarrée avec une instruction Using, ce sera fait automatiquement lors du End Using. Tu n'as pas besoin d'appeler Abort() en cas d'erreur, ce sera fait automatiquement puisque l'exécution s'arrêtera avant le Commit(). Tu n'as pas besoin de faire un Try/Catch sur tout le contenu de l'instruction Using si celle-ci est déjà à l'intérieur d'un autre Try/Catch. Public Sub UpdateField() Try Dim doc As Document = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument Dim db As Database = doc.Database Using doc.LockDocument Using tr As Transaction = db.TransactionManager.StartTransaction() [...] tr.Commit() End Using End Using Catch ex As System.Exception mod_Exception.Traiter_Exception(ex) End Try End Sub
-
Je vois mal comment t'aider sans avoir le bloc ni voir le code... Mais par principe, les blocs dynamiques imbriqués dans d'autre blocs, ça peut être problématique à gérer par programmation à moins de créer la définition du bloc propriétaire par programmation.
-
Tu peux simplement faire : '((-4 . "")) PS : les tests relationnels comme "/=" ne fonctionnent qu'avec des nombres. Voir la section 16.4 de Introduction à AutoLISP.
-
Salut, ssget retourne nil si aucun objet n'a été sélectionné. (sslength nil) génère une erreur : type d'argument incorrect: lselsetp nil. Donc pour savoir si le jeu de sélection retourné par ssget est vide, il suffit de regarder si l'expression retourne nil. (if (null (setq JeuSel (ssget "_W" XYMinSel XYmaxSel))) (princ "\nAucun objet sélectionné.") (princ (strcat "\n" (itoa (sslength jeuSel)) " objet(s) sélectionné(s).")) ) ou, plus simplement puisqu'en LISP tout c qui n'est pas nil est vrai : (if (setq JeuSel (ssget "_W" XYMinSel XYmaxSel)) (princ (strcat "\n" (itoa (sslength jeuSel)) " objet(s) sélectionné(s).")) (princ "\nAucun objet sélectionné.") ) NB : on devrait toujours "emballer" un appel à ssget dans une expression conditionnelle du type: (if (setq ss (ssget ...)) ...)
-
Salut, Est-ce que ton bloc dynamique fonctionne correctement quand tu le modifies "à la main" (sans programmation) ? Personnellement, j'ai souvent modifié les propriétés dynamiques de blocs avec hachures et/ou côtes par programmation sans avoir besoin de faire de mise à jour spécifique (ni même appeler RecordGraphicsModified().
-
[Résolu] Texte toujours "horizontal"
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Le principe est le même, si tu veux utiliser la valeur de SNAPANG comme angle de référence, il suffit de remplacer : (setq ucsAngle (angle '(0. 0. 0.) (getvar 'ucsxdir))) par : (setq snapAngle (getvar 'snapang)) et ucsAngle par snapAngle dans le code donné plus haut. (setq snapAngle (getvar 'snapang)) (if (setq ss (ssget "_X" '((0 . "TEXT") (410 . "Model")))) (repeat (setq i (sslength ss)) (setq texte (ssname ss (setq i (1- i))) rotation (getpropertyvalue texte "Rotation") ) (if (< (cos (- rotation snapAngle)) 0.) (setpropertyvalue texte "Rotation" (+ rotation pi)) ) ) ) -
[Résolu] Texte toujours "horizontal"
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Salut, Je ne comprends pas ce que tu veux faire (je ne vois pas le rapport avec SNAPANG) mais là, tu compares un cosinus et un angle... Relis ce que je disais réponse #7. Le code ci-dessous fonctionne quelles que soient les valeurs de ANGDIR, ANGBASE, AUNITS et le SCU courant. (setq ucsAngle (angle '(0. 0. 0.) (getvar 'ucsxdir))) (if (setq ss (ssget "_X" '((0 . "TEXT") (410 . "Model")))) (repeat (setq i (sslength ss)) (setq texte (ssname ss (setq i (1- i))) rotation (getpropertyvalue texte "Rotation") ) (if (< (cos (- rotation ucsAngle)) 0.) (setpropertyvalue texte "Rotation" (+ rotation pi)) ) ) ) -
Une version plus "robuste" avec quelques commentaires : (if (and (setq xref (car (entsel))) ; une entité est sélectionnée (= "INSERT" (cdr (assoc 0 (entget xref)))) ; c'est une référence de bloc (setq def (tblsearch "block" (cdr (assoc 2 (entget xref))))) ; la définition du bloc (= 4 (logand 4 (cdr (assoc 70 def)))) ; c'est une référence externe ) (setq chemin (cdr (assoc 1 def))) ; le chemin de la référence ) Ou, plus simple, avec les nouvelles fonctions (2012) : (if (and (setq xref (car (entsel))); une entité est sélectionnée (= (getpropertyvalue xref "LocalizedName") "Référence externe"); c'est une référence externe ) (setq chemin (getpropertyvalue xref "ExternalPath")); le chemin de la référence )
-
Salut, Il faut chercher dans la définition de bloc de la référence externe. Un petit exemple (sans vérifications de la sélection) : (setq chemin (cdr (assoc 1 (tblsearch "block" (cdr (assoc 2 (entget (car (entsel "\nSélectionnez une référence externe: "))))) ) ) ) )
-
[Résolu] Texte toujours "horizontal"
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Re, En règle générale, en programmation, sauf à appeler les commandes avec (command ...) ou ses clones, on travaille toujours en radians, en sens trigonométrique avec le 0 à l'est et dans le SCG ou le SCO pour certaines entités 2D utilisées en 3D (dans des plans non parallèles au plan XY). Essaye de penser comme ça, ça te simplifiera la vie. Par exemple la propriété Rotation d'un texte d'un bloc etc... (code DXF 50) est toujours exprimée en radians, sens trigo, 0 à l'est dans le SCO de l'entité (le SCO est identique au SCG pour tous les plans parallèles au plan XY). -
[Résolu] Texte toujours "horizontal"
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Je ne comprends pas ce que tu veux dire. De quelles valeurs de 'x_alpha' parles tu ? "100g" ? "300g" ?... -
[Résolu] Texte toujours "horizontal"
(gile) a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Salut, Première chose : angtof renvoie toujours l'angle en radians avec 0 à l'est et croissant en sens anti-horaire. Ce sachant, la trigonométrie est ton amie : (if (< (cos (angof x_alpha)) 0.) (setq x_alpha (angtos (+ (angof x_alpha) pi) 2 3)) ) PS : 2 * pi radians = 360° = 400g -
Salut, RadicalPurge permet de purger les images Raster non référencées.
-
Créer et enregistrer des hachures personnalisées
(gile) a répondu à un(e) sujet de nen dans LISP et Visual LISP
Salut, Un recherche avec c:drawhatch t'aurait fait trouver cette réponse. -
Salut, Je crois que PHILPHIL parle de ports PS/2. Microsoft c'est "Retour vers le futur"...
-
Salut, Par défaut AutoLISP utilise toujours la ligne de commande quand elle existe (d'où l'inutilité du tiret devant les noms de commandes). Pour forcer l'utilisation de la boite de dialogue il faut appeler la fonction initdia avant l'appel à la fonction command.
-
Salut et bienvenue, Rien n'est moins sûr. AutoLISP n'a pratiquement pas évolué depuis l'arrivée de Visual LISP (R14 / 2000) et la quasi totalité des routines LISP développées depuis continuent de fonctionner avec les dernières versions. Si l'application se révélait non compatible avec AutoCAD 2019 ou si vous souhaitez absolument migrer vers du C#/.NET vous pouvez me contacter.
-
[RESOLU] EntMake Cote Alignée (AcDbAlignedDimension)
(gile) a répondu à un(e) sujet de Ahimsa dans Pour aller plus loin en LISP
Salut, Le code minimum pour créer une cote alignée : (and (setq pt1 (getpoint "\nSpécifiez le point d'origine de la première ligne d'attache: ")) (setq pt2 (getpoint pt1 "\nIndiquez le point d'origine de la seconde ligne d'attache: ")) (setq pt3 (getpoint "\nIndiquez la position de la ligne de cote: ")) (entmake (list (cons 0 "DIMENSION") (cons 100 "AcDbEntity") (cons 100 "AcDbDimension") (cons 10 pt3) ; position de la ligne de cote (cons 70 1) ; 1 = cote alignée (cons 100 "AcDbAlignedDimension") (cons 13 pt1) ; point d'origine de la première ligne d'attache (cons 14 pt2) ; point d'origine de la seconde ligne d'attache ) ) )
