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, Voir ce sujet ou la section 3.1 de Introduction à AutoLISP (téléchargeable depuis cette page ou Exchange Apps).
  2. (gile)

    Nouveau Site Perso

    Salut, Je dois tout d'abord dire que je suis touché que tu m'aies cité, merci. Sinon c'est une excellente initiative. J'aime bien la rubrique "Fonctions par genre" qui devrait être utile aux débutants non anglophones. Si je peux me permettre une critique constructive : je trouve la navigation parfois peu intuitive (exemple : depuis le menu/sommaire : AutoLISP > Fonctions par genre > Comparaison > EQ et là, plus de liens excepté le retour à la page d'accueil...) Et oui, après, AutoLISP et C#, il va falloir aussi se mettre au HTML et à JavaScript (ou à ASP.NET avec C#)...
  3. Non, je pense que c'est mieux de ne faire qu'une transaction. Mais si tu veux faire apparaître les entités au fur et à mesure qu'elles sont créées (avant le Commit(), tu peux utiliser la méthode TransactionManager.QueueForGraphicsFlush() Dim tr As Transaction = db.TransactionManager.StartTransaction() Using tr '1ere entité....... tr.AddNewlyCreatedDBObject(ent1, True) db.TransactionManager.QueueForGraphicsFlush() '2eme entite ....... tr.AddNewlyCreatedDBObject(ent2, True) db.TransactionManager.QueueForGraphicsFlush() '....... 'derniere entite ....... tr.AddNewlyCreatedDBObject(entLast, True) tr.Commit() End Using
  4. Salut, Que veux-tu dire par "apparition du dessin" ? Ne sachant pas ce que fait ton programme, c'est difficile à dire, mais normalement quand on ajoute des entités dans AutoCAD, il apparaissent quand on appelle Commit() sur la Transaction qui a servi à ajouter ces objets.
  5. Le lien dans le premier message est à jour. Désinstaller proprement l'ancienne version via le panneau de configuration. Installer la nouvelle version. PS: il ne s'agit pas d'un LISP mais d'un plugin .NET qui définit : une commande avec version boite de dialogue : SELECTATTSYNC et version ligne de commande : -SELECTATTSYNC une fonction LISP : gc-selectattsync.
  6. (gile)

    VLA - intersectWith

    Salut, Une petite routine extraite de AutomationHelpers.lsp sue cette page (en bas). ;; gc:3dVariantToPointList ;; Convertit un variant de coordonnées 3D en liste de points ;; Polyline dans le SCO (Z = 0) ;; 3DFace, 3DPolyline, Leader, MLine, PolyfaceMesh, ;; PolygonMesh, Solid, Trace dans le SCG ;; ;; Argument ;; var : un variant (array de doubles) tel que retourné par vla-get-Coordinates (defun gc:3dVariantToPointList (var / foo) (defun foo (lst) (if lst (cons (list (car lst) (cadr lst) (caddr lst)) (foo (cdddr lst))) ) ) (foo (vlax-safearray->list (vlax-variant-value var))) )
  7. Salut, Tu peux voir ce sujet, j'ai mis à jour le programme pour qu'il synchronise (ou pas) les attributs ajoutés ou supprimés.
  8. Salut, J'ai ajouté deux options pour pouvoir synchroniser (ou pas) les attributs ajoutés ou supprimés. http://gilecad.azurewebsites.net/DotNet/AttSyncOptions_2.png Couleur 1 Calque 2 Type de ligne 4 Echelle du type de ligne 8 Epaisseur de ligne 16 Transparence 32 Position 64 Style de texte 128 Justifier 256 Hauteur 512 Rotation 1024 Facteur de largeur 2048 Inclinaison 4096 Ajouts 8192 Suppressions 16384
  9. Salut, Empêcher les modifications de composants intégrés permet aussi au constructeurs d'optimiser leur intégration justement (avec le hard comme avec le soft). Ça a toujours été la politique de Apple et c'est, pour partie, ce qui donne (ou donnait) leur fiabilité aux Macs. En même temps, les grands constructeurs proposent aussi (dans leurs gammes "pro" souvent) des machines grandement personnalisables, voire même facilitent l’accès aux composants de certaines stations de travail. "avocat du diable">
  10. Salut, La réponse est : oui. Maintenant j'ai une question : pourquoi utiliser Visual Studio Express 2015 plutôt que Visual Studio Community 2017 ? Les version Community (2015 ou 2017) sont des équivalentes des version PRO mais gratuites.
  11. Salut, Non ce n'est pas possible. AutoLISP ne fonctionne que dans le contexte du document. Ce que tu peux faire, c'est utiliser la fonction autoload depuis un fichier de chargement automatique pour ne charger les LISP qu'au premier appel d'une commande.
  12. Salut, Ce genre de procédure ne devrait pas ralentir plus que ça l'exécution de ton programme. Pour l'utilisation de Stopwatch, c'est assez simple : Tu crées une instance de Stopwatch(). Au moment où l'utilisateur spécifie le point d'insertion, tu démarres le chronométrage et tu récupères des temps intermédiaires après chaque opération (ou groupe d'opérations), une fois toutes les opérations terminées tu arrêtes le chrono et tu affiches les résultats. ' créer une instance de Stopwatch ' Dim sw = New System.Diagnostics.Stopwatch() ' démarrer le chronométrage ' sw.Start() ' exécuter la première opération ' ' prendre un premier temps intermédiaire à la fin de cette opération ' Dim t1 As Long = sw.ElapsedMilliseconds ' exécuter la deuxième opération ' ' prendre un deuxième temps intermédiaire à la fin de cette opération ' Dim t2 As Long = sw.ElapsedMilliseconds ' exécuter la troisième opération ' ' prendre un troisième temps intermédiaire à la fin de cette opération ' Dim t3 As Long = sw.ElapsedMilliseconds ' exécuter la dernière opération ' ' arrêter le chronomètre à la fin de cette opération ' sw.Stop() Dim total As Long = sw.ElapsedMilliseconds ' afficher les résultats ' Dim ed = Application.DocumentManager.MdiActiveDocument.Editor ed.WriteMessage(vbLf & "Première opération: " & t1 & "millisecondes") ed.WriteMessage(vbLf & "Deuxième opération: " & t2 - t1 & "millisecondes") ed.WriteMessage(vbLf & "Troisième opération: " & t3 - t2 & "millisecondes") ed.WriteMessage(vbLf & "Dernière opération: " & total - t3 & "millisecondes") ed.WriteMessage(vbLf & "Durée totale: " & total & "millisecondes")
  13. Salut, Tu peux essayer ça: http://cadxp.com/topic/43277-synchronisation-selective-des-attributs/
  14. Salut, Ce que tu décris ici (ou sur TheSwamp) m'étonne beaucoup. La lenteur à la première exécution peut être due à la compilation JIT du code MSIL et/ou au chargement de calques, styles etc. Dans le premier cas, il faut vraiment qu'il y ait beaucoup de code à compiler pour que la différence entre la première exécution et les suivantes soit sensible. Dans le deuxième cas, la manière dont tu "charges" les calques et styles doit très certainement pouvoir être optimisée. Tu dis utiliser des DLLs pour faire ça, est-ce bien le plus efficient ? Parce que importer des objets depuis un dessin/gabarit ou créer ces objets à la volée ne devrait pas prendre plus d'une seconde (à moins qu'on parle de milliers d'objets). Tu peux facilement savoir si c'est le chargement de ces objets qui ralenti l'exécution en lançant ton programme dans un dessin/gabarit qui a déjà ces objets. Pour faire un diagnostic plus précis des "goulots d'étranglement", tu peux, comme on te l'a conseillé sur TheSwamp, utiliser une instance de StopWatch. Ceci étant, pour "matérialiser" l'attente, tu as le chois entre le ProgressMeter d'AutoCAD et un ProgressBar Windows. Le second est plus complexe à mettre en œuvre : généralement on utilise un BackgroundWorker pour que le ProgressMeter et la tache s'exécutent sur deux Threads différents. Dans tous les cas, d'après ce que tu décris "l'attente" devrait démarrer au moment où l'utilisateur spécifie le point d'insertion et se terminer quand le code finit de dessiner la dernière entité.
  15. (gile)

    Spline en 2 points

    Je ne sais pas si maintenant tu as tout dit, mais tu en déjà dit un peu plus en parlant de grips à déplacer ultérieurement. Une spline avec 1 grip intermédiaire : (defun c:TOPHEUR (/ p1 p2) (if (and (setq p1 (getpoint "\nPremier point: ")) (setq p2 (getpoint p1 "\nDernier point: ")) ) (command "_.spline" "_non" p1 "_non" (polar p1 (+ (angle p1 p2) 0.25) (* 0.5 (distance p1 p2))) "_non" p2 "" "" "" ) ) (princ) ) Une spline avec 2 grips intermédiaires : (defun c:TOPHEUR (/ p1 p2 p3 p4 p5 di) (if (and (setq p1 (getpoint "\nPremier point: ")) (setq p4 (getpoint p1 "\nDernier point: ")) ) (progn (setq di (/ (distance p1 p4) 4) p2 (polar p1 (+ (angle p1 p4) 0.25) di) p3 (polar p4 (+ (angle p4 p1) 0.25) di) ) (command "_.spline") (foreach p (list p1 p2 p3 p4) (command "_non" p)) (command "" "" "") ) ) (princ) ) Une spline avec 3 grips intermédiaires : (defun c:TOPHEUR (/ p1 p2 p3 p4 p5 di) (if (and (setq p1 (getpoint "\nPremier point: ")) (setq p5 (getpoint p1 "\nDernier point: ")) ) (progn (setq di (/ (distance p1 p5) 4) p2 (polar p1 (+ (angle p1 p5) 0.25) di) p3 (polar p1 (angle p1 p5) (* 2. di)) p4 (polar p5 (+ (angle p5 p1) 0.25) di) ) (command "_.spline") (foreach p (list p1 p2 p3 p4 p5) (command "_non" p)) (command "" "" "") ) ) (princ) )
  16. (gile)

    Spline en 2 points

    Un petit truc vite fait qui ne dessine pas un spline mais une polyligne avec une ondulation. On peut modifier la courbure en changeant la valeur des groupes 42 (0. => segment droit, 1.0 => demi cercle). (defun c:TOPHEUR (/ p1 p2 zdir elev pmid) (and (setq p1 (getpoint "\nPremier point: ")) (setq p2 (getpoint p1 "\nPremier point: ")) (setq zdir (trans '(0. 0. 1.) 1 0 T) elev (caddr p1) pmid (mapcar '(lambda (a B) (/ (+ a B) 2.)) p1 p2) ) (entmakex (list (cons 0 "LWPOLYLINE") (cons 100 "AcDbEntity") (cons 100 "AcDbPolyline") (cons 90 3) (cons 70 0) (cons 38 elev) (cons 10 (trans p1 1 zdir)) (cons 42 -0.25) (cons 10 (trans pmid 1 zdir)) (cons 42 0.25) (cons 10 (trans p2 1 zdir)) (cons 210 zdir) ) ) ) (princ) )
  17. (gile)

    Spline en 2 points

    Si tu relis bien le sujet que tu as mis en lien (notamment la réponse #9 de didier) tu devrais comprendre qu'on est loin de "savoir tous" (ou plutôt "savoir tout"). Géométriquement, deux points définissent une droite (ou un segment de droite). Pour un arc ou une spline, il faut au minimum une donnée de plus...
  18. Salut, Il faudrait que tu sois plus clair. Qu'est-ce que c'est ce "dessin à partir de certaines données" que le programme affiche ? Doit-il s'afficher dans AutoCAD ? Sous forme de référence de bloc ?
  19. (gile)

    Lisp to vba

    Salut, En partant de l'expression la plus imbriquée : (getvar "USERS1") retourne la valeur de la variable système USERS1 (String) (tblobjname "block" (getvar "USERS1")) retourne l'identifiant AutoLISP (ENAME) de l'entrée correspondant à la chaîne dans la table des blocs. (entget (tblobjname "block" (getvar "USERS1"))) retourne la liste de données DXF pour le bloc correspondant à l'identifiant. (cdr (assoc 4 (entget (tblobjname "block" (getvar "USERS1")))))retourne la valeur du groupe DXF 4 (Description du bloc) (setvar "USERS1" (cdr (assoc 4 (entget (tblobjname "block" (getvar "USERS1")))))) affecte cette valeur à la variable système USERS1. Je ne pratique pas le VBA (et je suis étonné qu'on continue à l'utiliser) mais une traduction littérale devrait ressembler à ça : ThisDrawing.SetVariable "USERS1", ThisDrawing.Blocks.Item(ThisDrawing.GetVariable "USERS1").Comments Mais il me semble qu'en VB(A) on a plutôt tendance à écrire les choses comme ça : Dim blockName As String Dim blockColl As AcadBlocks Dim block As AcadBlock Dim description As Variant blockName = ThisDrawing.GetVariable "USERS1" blockColl = ThisDrawing.Blocks block = blockColl.Item(blockName) description = block.Comments ThisDrawing.SetVariable "USERS1", description EDIT: bonuscad a été plus rapide...
  20. (gile)

    imprimer les métrés

    Salut, La fonction wcmatch est ton amie. (setq lst nil) ;; parcourrir la table des calques (while (setq lst (tblnext "LAYER" (not lst))) ;; récupérer le nom du calque (setq name (cdr (assoc 2 lst))) ;; récupérer le nom d'entité du calque (setq layer (tblobjname "LAYER" name)) ;; si le nom du calque commence par "-01" (if (wcmatch (cdr (assoc 2 layer)) "-01*") ;; on gèle le calque (setpropertyvalue layer "IsLocked" 1) ;; sinon, on dégèle le calque (setpropertyvalue layer "IsLocked" 0) ) )
  21. Salut, Un sujet sur le groupe de discussion AutoCAD - Français d'Autodesk m'a rappelé ce petit programme. Je l'ai mis à jour pour supporter aussi AutoCAD 2018 et j'ai ajouté : une commande "scriptable" (avec invites en ligne de commande). Le choix des options de synchronisation se fait sous forme d'un nombre entier (CF ci dessous) une fonction LISP qui prend deux arguments: le nom du bloc ou le nom d'entité (ENAME) de la définition du bloc à synchroniser et un entier représentant les options de synchronisation (CF ci dessous). La fonction retourne le nombre de blocs traités (-1 en cas d'erreur). Les options de synchronisation correspondent à la somme des codes binaires suivant : Couleur 1 Calque 2 Type de ligne 4 Echelle du type de ligne 8 Epaisseur de ligne 16 Transparence 32 Position 64 Style de texte 128 Justifier 256 Hauteur 512 Rotation 1024 Facteur de largeur 2048 Inclinaison 4096
  22. Ma dernière réponse arrive un peu tard, mais il faut bien comprendre qu'il ne s'agit pas là de "subtilités" mais d'une notion fondamentale du LISP.
  23. Une expression LISP est soit une liste ; soit un atome. Une liste est une séquence d'expressions LISP balisée par une parenthèse ouvrante et la parenthèse fermante correspondante. 1 est un atome (de type INT). 2.54 est un atome (de type REAL). "LISP" est un atome (de type STR). () est une liste (vide). (8) est une liste (d'un seul élément). (6 1 8) est une liste (de 3 entiers). (1 2.54 "LISP") est une liste (de 3 éléments de types différents). ((1 2 3) (4 5 6) (7 8 9)) est une liste de listes.
  24. L'erreur survient-elle quand tu lances la commande LISP LoginProfile ? Si oui, tu peux essayer la méthode décrite à la fin de la section 4.5 de Introduction à AutoLISP (sur cette page).
  25. Essaye et compare : (type (cddr '(6 1 8))) et (type (caddr '(6 1 8)))
×
×
  • 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é