-
Compteur de contenus
1 113 -
Inscription
-
Dernière visite
-
Jours gagnés
42
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par Luna
-
Cherche LSP pour incrementer un Attr existant dans N Blocs differents deja inseres
Luna a répondu à un(e) sujet de lecrabe dans Pour aller plus loin en LISP
Coucou @lecrabe Je présume que la différence avec les programmes déjà existants c'est de ne pas considérer le nom du bloc comme une valeur de référence. Tout ce qui t'intéresse c'est de filtrer les blocs qui possèdent un attribut portant toujours le même nom, peu importe le nom du bloc. Si c'est le cas, je vais voir ce que je peux sortir (mais chat ne sera pas au niveau d'un GILE_INCR ou autre évidemment Bisous, Luna -
[Résolu] Suppression des remplacements de fenêtres
Luna a répondu à un(e) sujet de grand_sapin dans AutoCAD 2020-2024
En effet c'est bon à savoir ! Encore merci @Olivier Eckmann et @Eric pour ce partage 🙂 C'est Rebcao qui sera content ^^ Mais vui, plutôt étrange cette différence entre les deux. Sûrement un oublie de fonctionnalité lors de la création de la palette. Je ne connaissais même pas la commande CALQCLASSIQ ou même LAYERDLGMODE 😢 Bisous, Luna -
[Résolu] Suppression des remplacements de fenêtres
Luna a répondu à un(e) sujet de grand_sapin dans AutoCAD 2020-2024
Coucou, Pour être honnête je pensais pendant très longtemps que cela faisait effet sur l'ensemble des présentations (du moins c'est comme chat que je comprends la traduction) mais en faisant 2-3 tests ce matin justement j'ai remarqué que seul ma présentation courante était modifiée... c'est dommage Bisous, Luna -
[Résolu] Suppression des remplacements de fenêtres
Luna a répondu à un(e) sujet de grand_sapin dans AutoCAD 2020-2024
Donc pour modifier l'ensemble des présentations, je dirais quelque chose comme cela ? (defun c:RESETPSPACELAYERS (/ *error* layout cmdecho nomutt) (defun *error* (msg) (setvar "CMDECHO" cmdecho) (setvar "NOMUTT" nomutt) (princ msg) ) (setq layout (getvar "CTAB") cmdecho (getvar "CMDECHO") nomutt (getvar "NOMUTT") ) (setvar "CMDECHO" 0) (setvar "NOMUTT" 1) (mapcar '(lambda (l) (setvar "CTAB" l) (command "_-VPORTS" "_Layer" "_Yes" "_All" "")) (layoutlist)) (setvar "CTAB" layout) (setvar "CMDECHO" cmdecho) (setvar "NOMUTT" nomutt) (princ) ) C'est clairement pas parfait et cela ne fonctionne pas avec les fenêtres de l'espace papier mais bon... Bisous, Luna -
[Résolu] Suppression des remplacements de fenêtres
Luna a répondu à un(e) sujet de grand_sapin dans AutoCAD 2020-2024
Coucou, Normalement on peut faire : Espace présentation > Gestionnaire des propriétés des calques > Clic droit sur un calque > Supprimer les remplacements de fenêtre pour > Tous les calques > Dans toutes les fenêtres (voir ci-dessous) Bien faire attention d'être dans une présentation et non l'espace objet pour avoir accès à cette propriété ! Quand je parle d'espace Objet, je parle évidemment de l'onglet "Objet", à partir du moment où tu es dans une présentation (espace papier ou espace objet flottant au sein d'une fenêtre) c'est bon 🙂 (ou pour les développeurs : TILEMODE = 0) PS : Finalement ce n'est valable que pour la présentation courante, my bad! Bisous, Luna -
Un Lisp pour changer un texte dans chaque fichier
Luna a répondu à un(e) sujet de maxiloxi dans Débuter en LISP
Coucou, Je n'ai malheureusement aucune maîtrise des scripts (peut-être que @Eric pourra te conseiller pour cela) mais autrement, tu copies le code que j'ai envoyer et tu le colle dans un bloc note vierge. Tu l'enregistres au format .lsp et pour l'utilisation, soit tu charges ton fichier .lsp dans ton dessin puis tu utilises la fonction (modif_texte "130" "135") (donc tu exécutes toi-même le code dans ton dessin courant) soit tu passes par un script et là, comme je disais, c'est au-delà de mes compétences. Bisous, Luna -
Un Lisp pour changer un texte dans chaque fichier
Luna a répondu à un(e) sujet de maxiloxi dans Débuter en LISP
Coucou, La commande RECHERCHER éventuellement ? Non utilisable sur un script cependant mais d'un point de vue besoin recherché (sans mauvais jeu de mots),chat me paraît être le plus efficace... Autrement tu peux voir un LISP dans le genre (très succinct) : (defun modif_text (old new / jsel i name txt) (setq jsel (ssget "_X" (list '(0 . "TEXT,MTEXT") (cons 1 (strcat "*" old "*"))))) (repeat (setq i (sslength jsel)) (setq name (ssname jsel (setq i (1- i))) txt (cdr (assoc 1 (entget name))) txt (vl-string-subst new old txt) ) (entmod (subst (cons 1 txt) (assoc 1 (entget name)) (entget name))) ) (princ) ) old -> ancienne valeur de texte (par exemple "130") sous format STRING new -> nouvelle valeur de texte (par exemple "135") sous format STRING Exemple d'utilisation : (modif_text "130" "135") Bisous, Luna -
Redéfinir un contour (polyligne) avec des intersections (lignes).
Luna a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Coucou @Olivier Eckmann, Juste pour la petite précision inutile mais c'est toujours bon à savoir : les fonctions vlax-curve-... font exception à la règle car elles acceptent aussi bien un VLA-Object qu'un ename comme argument. Et pour la petite anecdocte d'ailleurs, si on regarde un Benchmark avec par exemple la fonction (vlax-curve-getDistAtParam), on se rend compte que la fonction est d'ailleurs plus "rapide" en utilisant un ename plutôt qu'un VLA-Object : Commande: (benchmark '((vlax-curve-getDistAtParam name 7) (vlax-curve-getDistAtParam obj 7))) Elapsed milliseconds / relative speed for 65536 iteration(s): (vlax-curve-getDistAtParam NAME 7).....1640 / 1.26 <fastest> (vlax-curve-getDistAtParam OBJ 7)......2063 / 1.00 <slowest> Avec ici 'name' correspondant à l'ename et 'obj' correspondant au VLA-Object 😉 Bref, parenthèse fermée pour moi :3 Bisous, Luna -
Redéfinir un contour (polyligne) avec des intersections (lignes).
Luna a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Coucou, Lorsque je parle de bulge (c'est essentiellement parce que je ne connais pas la traduction en français), je parle de ceci : https://www.afralisp.net/autolisp/tutorials/polyline-bulges-part-1.php Il s'agit d'une valeur qui permet de décrire l'arc du segment de ta polyligne. Cette valeur correspond entre-autre au code DXF 42. J'ai commencé à travailler comme ceci (si jamais tu veux essayer de voir, cependant j'ai une approche beaucoup plus... Visual LISP donc peut-être trop complexe pour toi pour le moment) : (defun makeSpotOnIntersect (poly line e / LM:intersections lwpoly-AddVertex 2D-Point foo obj pti p pt1 pt2 b) (defun LM:intersections ( ob1 ob2 mod / lst rtn ) (if (and (vlax-method-applicable-p ob1 'intersectwith) (vlax-method-applicable-p ob2 'intersectwith) (setq lst (vlax-invoke ob1 'intersectwith ob2 mod)) ) (repeat (/ (length lst) 3) (setq rtn (cons (list (car lst) (cadr lst) (caddr lst)) rtn) lst (cdddr lst) ) ) ) (reverse rtn) ) (defun lwpoly-AddVertex (obj pt i / e n s) (setq e (vlax-vla-object->ename obj) n (cdr (assoc 90 (entget e))) pt (2D-Point pt) s (vlax-make-safearray vlax-vbDouble '(0 . 1)) i (cond ((null i) n) ((minusp i) 0) ((< i n) (fix i)) (n)) ) (vlax-safearray-fill s pt) (vla-AddVertex obj i s) (vla-Update obj) (if (= (1+ n) (cdr (assoc 90 (entget e)))) (1+ n)) ) (defun 2D-Point (pt / lg) (cond ( (or (not (listp pt)) (not (setq lg (vl-list-length pt)))) nil) ( (= 3 lg) (reverse (cdr (reverse pt)))) ( (= 2 lg) pt) ) ) (defun foo (pt / i d pt1 pt2) (setq i (vlax-curve-getParamAtPoint poly pt) d (vlax-curve-getDistAtPoint poly pt) ) (cond ( (= i (fix i)) ; Ajout de 2 point + suppression d'un point ) ( (setq i (1+ i)) (setq pt1 (vlax-curve-getPointAtDist poly (- d (/ e 2.))) pt2 (vlax-curve-getPointAtDist poly (+ d (/ e 2.))) ) (lwpoly-AddVertex obj pt2 i) (lwpoly-AddVertex obj pt1 i) (vla-setBulge obj i -0.5) i ) ) ) (setq obj (vlax-ename->vla-object poly) pti (LM:intersections obj (vlax-ename->vla-object line) acextendotherentity) ) (mapcar 'foo pti) ) C'est partiellement fonctionnel et il y a encore beaucoup de spécificités à prévoir mais c'est une ébauche. Bisous, Luna -
Redéfinir un contour (polyligne) avec des intersections (lignes).
Luna a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Coucou @DenisHen, A mon humble avis, je dirais que les encoches rectangulaires peuvent être plus délicates à gérer que les encoches arrondies. Car d'un point de vue programmation, l'encoche arrondie possède 2 sommets et une valeur de bulge (arbitraire) tandis que les encoches rectangulaires possèdent 4 sommets et à minima 3 angles droits. Donc cela nécessite plus de calculs avec les encoches rectangulaires. Ensuite, ce que j'ai un peu de mal à comprendre c'est en terme d'intersection et notamment sur ton intersection sur segment oblique : Il semblerait que le trait vert coupe la moitié de l'encoche sur le haut et non le bas (donc la ligne noire initiale), est-ce normal ? Et concernant les intersections sur extrémités : ces intersections seront-elles toujours précisément sur l'extrémité ou bien cela peu être décalée d'un demi-millimètre ? Autrement, tu peux éventuellement regarder ces fonctions proposées par LeeMac pour trouver ton sommet d'intersection entre 2 objets : http://www.lee-mac.com/intersectionfunctions.html Puis il te suffira de calculer les points sur ta polyligne noire avec une distance de +0,75mm et -0,75mm par rapport à ton point d'intersection (donc tu auras tes 2 nouveaux sommets) afin de les ajouter au bon index. Il suffira ensuite de modifier le bulge entre ces 2 points pour obtenir une encoche (sens de la polyligne important car un bulge peut être négatif ou positif). Si tu as besoin d'un exemple plus concret, je peux voir ce qu'il est possible de faire (mais j'ai peur de tout coder et donc de t'empêcher de t'amuser ^^") Bisous, Luna -
[Résolu] "FIGER" une présentation indépendamment du travail dans l'espace objet.
Luna a répondu à un(e) sujet de Bebétudes dans AutoCAD LT 2024
Coucou, Rien ne t'empêche de travailler dans une fenêtre de présentation (auquel cas tu gèles les calques dans ta fenêtre sans impacter ton Espace Objet pour les autres présentations) ou bien d'explorer la gestion des États de calques (très pratique également !). Ce que je te conseille par exemple de faire c'est dans un premier temps de créer un état de calque "_ALL" avec aucun calque geler (tel que ton dessin doit être en imprimant un plan en gros) puis à chaque fois que tu définis le gel de tous les calques dans tes fenêtres de présentation, tu crées ensuite un état de calque pour cette fenêtre (par exemple "R+1 Général", "R+2 Général", "R+1 BET", etc...). Ainsi dès que tu as besoin d'épurer la visibilité des calques pour travailler correctement et sans modifier ta présentation d'impression (échelle, position, etc...), il te suffit de Restaurer l'état de calque sur lequel tu dois travailler soit en Espace Objet (et auquel cas il faudra penser à remettre tes calques bien visible pour l'impression) soit dans une fenêtre de présentation nommée par exemple "TRAVAIL". Tu peux ainsi switch entre tes différents états de calques et quelques clics seulement. Plus tu auras d'états de calques, et plus se sera simple et rapide pour toi de travailler avec seulement les éléments nécessaire à l'écran. Pour rappel, pour créer un nouvel état de calque, tu peux lancer la commande LMAN puis "Nouveau". Si jamais tu as modifié ton état de calque dans ta présentation (geler/dégeler de nouveau calques, créer de nouveaux calques, etc...), il faut retourner dans ta présentation modifiée, lancer LMAN puis "Mettre à jour". Et ensuite pour pouvoir travailler avec l'état de calque voulu (en Espace Objet ou dans une fenêtre de TRAVAIL), il faut sélectionner l'état de calque désiré -> "Restaurer". Bisous, Luna -
[Résolu] "FIGER" une présentation indépendamment du travail dans l'espace objet.
Luna a répondu à un(e) sujet de Bebétudes dans AutoCAD LT 2024
Coucou, Alors, si j'ai bien compris (super message btw!) en prenant l'exemple des étages R+1 et R+2 on a : • Présentation R+1 • Présentation R+2 • Espace Objet Dans la Présentation R+1, on considère que l'on a une fenêtre de présentation (nommons la "F1") et idem pour la Présentation R+2 (que l'on nommera F2). Si l'on gèle un ensemble de calques dans l'Espace Objet, alors l'ensemble des calques seront gelés dans l'ensemble du dessin (espace papier et fenêtres également). Si l'on gèle un calque dans F1 (auquel cas c'est un gel de fenêtre) alors ce calque ne sera gelé qu'uniquement dans F1, mais s'il n'est pas gelé ailleurs alors il sera visible dans F2 et également l'espace Objet. Personnellement j'ai toujours pris pour habitude de dégeler tous mes calques dans l'Espace Objet avant de m'occuper de la liste des calques à geler dans les fenêtres (à moins de les connaître par cœur) pour être sûre de ne dégeler QUE les calques que je souhaite faire apparaître dans chacune de mes fenêtres. Donc l'idée ici est de geler TOUS les calques dans F1 SAUF les calques relatif à l'étage R+1, puis faire de-même avec F2 mais cette fois-ci tu dois geler TOUS les calques SAUF les calques relatifs à R+2. Tu pourras ensuite geler les calques comme tu le souhaites en travaillant dans ton espace Objet mais à chaque fois que tu voudras imprimer (ou juste vérifier un plan/présentation), il faudra penser à dégeler les calques de l'espace Objet pour s'assurer que tes présentations sont correctes par rapport à ce que tu as défini en amont. Donc là où tu dis : En vérité ce n'est pas dans ton Espace Objet que tu dois faire cela, mais dans ta fenêtre de la présentation relative au R+2. Car justement les gels de fenêtres (donc tu "rentres" dans la fenêtre de présentation et tu gèles/dégèles les calques via l’icône relative au gel de fenêtre) permettent de geler les calques indépendamment pour chaque fenêtre de présentation ! Bisous, Luna -
Utilisation des curseurs "DCL" en temps réel ?
Luna a répondu à un(e) sujet de Hey_Its_Sanka dans ObjectDCL
Coucou, Si je comprends (mieux), le "curseur" dont tu parles corresponds à une image de ton dessin ? Par exemple si l'on prend ton exemple de maison et d'étage il faudrait qu'en déplaçant les sliders (en bas et à droite), cela face une action de "PAN" sur ton image (en bleu sur ta photo). Auquel cas, je pense que cela est faisable dans le cas où l'image affichée n'est pas un zoom étendu (et du coup il suffirait de redéfinir les XY de l'image je suppose ?). Mais dans ce cas, comment obtiens-tu cette image ? Bisous, Luna -
Insertion de blocs avec les coordonnées en TXT
Luna a répondu à un(e) sujet de ZCAD dans Routines LISP
Coucou, Au vue des coordonnées présentes dans le fichier TXT, il semblerait que celle-ci correspondent à des coordonnées GPS (longitude/latitude). Donc je ne sais pas s'il faut prévoir une conversion des coordonnées sur un système de coordonnées RGF ou autre. Car présentement il me semble que tous les points seront à quelques centième d'unité seulement les uns des autres... Mais peut-être que je dit des bêtises, auquel cas je suis désolée ^^' Bisous, Luna -
Pas de soucis 🙂
-
Coucou, Utilises-tu un fichier PGP différent du fichier de base "acad.pgp" ? Normalement tu peux parfaitement utiliser le fichier PGP existant (dispo ici "C:\Users\username\AppData\Roaming\Autodesk\AutoCAD ####\R24.3\fra\Support" avec username ton nom d'utilisateur Windows et #### la version de ton AutoCAD, par exemple 2021) en ajoutant des alias Utilisateur (en bas de page) qui viendront overwrite les alias identiques définis par AutoCAD. Voici un simple exemple (merci de ne pas modifier les alias créés par AutoCAD mais bien d'ajouter tes alias dans la section Utilisateur ;p) : Il te suffit ensuite de faire REINIT sur AutoCAD sur les dessins déjà ouverts pour recharger le fichier "acad.pgp" autrement les dessins nouvellement ouverts auront la bonne version de ton PGP 🙂 Donc pour ta demande tu aurais ceci : sans modifier l'alias d'AutoCAD qui est COR ! Ce n'est pas grave si tu as 2 raccourcis pour une même commande puisqu'après tout, tu vas uniquement utiliser le N ^^ et si un raccourci N prévu par AutoCAD existe déjà, alors il sera simplement obsolète car les alias utilisateur ont toujours la priorité. Et si jamais tu peux également avoir des complications de droits d'accès à certains dossiers en lien avec ton support informatique propres à l'entreprise. Déjà voir si la bonne utilisation du fichier PGP règle le soucis. Bisous, Luna
-
Appliquer une commande lisp 8 dwg ouverts en SDI= 0 .
Luna a répondu à un(e) sujet de CISCO SYSTEM dans AutoCAD 2020-2024
Coucou, Comme je l'ai expliqué, il n'est pas possible d'exécuter 1 fois 1 LISP pour N fichiers AutoCAD ouverts. Cependant, tu peux très bien exécuter N fois 1 LISP sur les N fichiers ouverts, il te suffit d'utiliser un script ou bien de simplement lancer le LISP sur les fichiers, un à un. Mais (encore une fois), tu ne pourras pas récupérer une information de ton premier dessin ouvert, puis d'utiliser cette infos dans les dessins suivant, etc... A moins éventuellement de passer par des variables système Windows ou des variables environnement (setenv)/(getenv) ? A part cela, chat dépasse malheureusement mes compétences. Bisous, Luna -
Appliquer une commande lisp 8 dwg ouverts en SDI= 0 .
Luna a répondu à un(e) sujet de CISCO SYSTEM dans AutoCAD 2020-2024
Coucou, Malheureusement il ne me semble pas que cela soit possible car la commande serait alors lancée depuis un premier DWG puis lorsqu'on rendrait un autre DWG actif alors le DWG nouvellement actif ne pourra aucunement reprendre le déroulement de la commande lancée précédemment car il s'agit d'un nouveau dessin avec un historique de commande totalement indépendant des autres fichiers. Cependant il est possible de créer un LISP pour 1 fichier DWG et d'ouvrir puis lancer le LISP dans chacun des 8 fichiers en utilisant un script et l'outil SuperAutoScript. Je ne maîtrise pas les scripts mais @Eric devrait pouvoir apporter plus de détails. Mais si le programme doit avoir un fonctionnement de liaison entre les différents DWG alors...je ne saurais dire ce qu'il est possible de faire. Cela dépendra vraiment du besoin spécifique je pense. Bisous, Luna -
Coucou, Je te conseille de consulter ces 2 sites francophones qui sont très bien fait et très intéressant : • https://www.da-code.fr/ par Didier • https://programmation.developpez.com/tutoriels/autolisp/introduction-autolisp/ par Gilles Chanteau Déjà avec chat tu pourras beaucoup apprendre ! Ensuite, rien de mieux que d'ouvrir un AutoCAD, l'aide AutoCAD également et de tester les fonctions que tu apprends au fur et à mesure. Toujours y aller étape par étape, à la vitesse qui te convient et éviter de voir trop gros dès le début 😉 Bisous, Luna
-
Coucou @CT_Ko, Le Z correspond ici à (caddr) ou bien (last). Pour l'explication (car) récupère le premier élément d'une liste et (cdr) renvoie la liste sans le premier élément. Par exemple (setq pt '(12.5 16.8 11.7)) (car pt) -> 12.5 (cdr pt) -> (16.8 11.7) On peut ensuite combiner ces deux fonctions (jusqu'à 4 combinaisons max) en utilisant le 'a' pour (car) et le 'd' pour (cdr). Les caractères 'c' et 'r' respectivement au début et la fin restent inchangés et uniques : (cadr) -> (car) + (cdr) : Donc le premier élément de la liste sans le premier élément (= le second élément) (cdar) -> (cdr) + (car) : Donc la liste sans le premier élément du premier élément de la liste (= si le premier élément est une liste, alors retourne cette liste sans le premier élément de celle-ci, sinon retourne rien) (caddr) -> (car) + (cdr) + (cdr) : Donc le premier élément de la liste sans le premier élément de la liste sans le premier élément (= le troisième élément) (cddddr) -> (cdr) + (cdr) + (cdr) + (cdr) : Donc la liste sans les 4 premiers éléments ... L'ordre des lettres est important donc. Mais pour ce qui te concerne : (car) -> Premier élément de la liste des coordonnées d'un point (= X) (cadr) -> Second élément de la liste des coordonnées d'un point (= Y) (caddr) -> Troisième élément de la liste des coordonnées d'un point (= Z) (last) -> Dernier élément de la liste des coordonnées d'un point (= Z si coordonnées 3D, Y si coordonnées 2D) Comme ta liste représente ici un point 3D, tu as 3 éléments uniquement dans la liste, c'est pourquoi (caddr) ET (last) renvoient toutes deux le même résultat En espérant que cela aura pu t'aider 🙂 Bisous, Luna
-
Joyeuses fêtes tout le monde ! 🥳 Bisous, Luna
-
C'est très gentil mais franchement le rendu est loin d'être impeccable (en tous cas à mes yeux). Pour la compréhension tu peux t'aider de ce site sur lequel je me suis moi-même appuyé pour la théorie mathématique par rapport au fameux code DXF 42 des polylignes (pour la prise en compte des rayons demandée par ton collègue) : https://www.afralisp.net/autolisp/tutorials/polyline-bulges-part-1.php Pour le reste du programme, c'est de la géométrie à base de (polar) et pour la logique c'est uniquement basé sur la présence ou non d'arcs au sein de la polyligne donc il faut forcément prendre en compte ces "bulges" et donc étudier la polyligne sous forme de segments, et non sous forme de points. C'est pour cela que la fonction (foo), désolée pour le nom je n'avais pas d'inspi, permet de donner la distance d'un point par rapport au premier sommet et de donner l'info requise en cas de code DXF 42 différent de 0.0, soit le rayon de l'arc ainsi que son signe. Le site est en anglais mais vraiment passionnant ! Et pour d'autres questions, surtout n'hésite pas, c'est toujours un plaisir d'aider :3 Bisous, Luna
-
Coucou @DenisHen, Je ne maîtrise pas encore bien les créations d'objets donc je n'ai pas intégré les cotations et corrigé la position du texte, mais la forme est tracée en tous cas : (defun c:CP2DV (/ foo polymake textmake name lst pt ep osm a p1 p2 p3 p4) (defun foo (name / bulge->radius entlist blst i d r lst) (defun bulge->radius (pt1 b pt2 / c s r) (setq c (distance pt1 pt2) s (* (/ c 2.0) (* -1 b)) r (/ (+ (expt (/ c 2.0) 2) (expt s 2)) (* s 2.0)) ) ) (and (setq entlist (entget name)) (= "LWPOLYLINE" (cdr (assoc 0 entlist))) (setq blst (reverse (vl-remove-if-not '(lambda (x) (= (car x) 42)) entlist))) (setq blst (cdr (mapcar 'cdr blst))) (repeat (setq i (fix (vlax-curve-getEndParam name))) (setq d (vlax-curve-getDistAtParam name i) r (if (or (= i (1+ (fix (vlax-curve-getEndParam name)))) (= 0.0 (car blst))) 0.0 (bulge->radius (vlax-curve-getPointAtParam name i) (car blst) (vlax-curve-getPointAtParam name (1- i))) ) i (1- i) blst (cdr blst) lst (cons (list d r) lst) ) ) ) lst ) (defun polymake (plist c) (entmakex (append (vl-remove nil (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length plist)) (if c '(70 . 1)) ) ) (mapcar '(lambda (p) (cons 10 p)) plist) ) ) ) (defun textmake (pt str / txt) (setq txt (entmakex (list '(0 . "TEXT") '(100 . "AcDbEntity") '(100 . "AcDbText") (cons 10 pt) (cons 1 str) (cons 40 (getvar 'textsize)) '(72 . 4) '(73 . 2) ) ) ) (setq txt (vlax-ename->vla-object txt)) (vla-move txt (vlax-3D-point (vlax-get txt 'InsertionPoint)) (vlax-3D-point pt)) ) (and (setq name (car (entsel "\nSélectionner une coupe : "))) (setq lst (foo name)) (setq pt (getpoint "\nChoisir un point d'insertion : ")) (setq ep (getdist pt "\nDéfinir une épaisseur : ")) (setq osm (getvar 'osmode)) (setvar 'osmode 0) (setq a (/ pi 2.)) (setq p0 (polar pt a ep) p1 pt p2 p0) (mapcar '(lambda (x / d r) (setq d (car x) r (cadr x) p3 (polar p0 0.0 d) p4 (polar pt 0.0 d) ) (polymake (list p1 p2 p3 p4) T) (if (not (zerop r)) (progn (polymake (list p1 p3) nil) (polymake (list p2 p4) nil) (textmake (mapcar '(lambda (a b) (/ (+ a b) 2.)) p1 p3) (strcat "R: " (rtos r 2 2))) ) ) (setq p1 p4 p2 p3 ) ) lst ) (setvar 'osmode osm) ) (princ) ) Désolée pour le rendu un peu brouillon >w< Bisous, Luna
-
Coucou @lecrabe, Alors il me semble que NCOPIE (tout comme (nentsel) d'ailleurs) creusent aussi loin qu'elles peuvent. Autrement dit, si ici le but est de récupérer le bloc d'une XREF et de copier le BLOC de l'XREF directement dans le dessin, alors ni NCOPIE ni NCOPY_Multiple fonctionnent.. Car elle iront copier l'entité sélectionnée dans le bloc et vont donc copier un objet (ligne, texte, etc...) mais pas le bloc... Pour accéder aux informations du bloc, il faut vérifier la longueur de (nentsel) car si elle mesure 4, cela signifie que l'entité sélectionnée appartient à un bloc. Et le détail des nested blocks est donné dans (last (nentsel)) J'avais un programme pour vérifier le calque et nom de bloc des objets d'un (nentsel) donc globalement par exemple cela permet d'avoir la liste des blocs/XREF avec une liste d'association correspondant à l'EffectiveName du bloc/XREF suivi du nom d'entité de la référence de bloc: (setq nlst (nentsel)) (setq name (car nlst)) (if (= 4 (length nlst)) ;; entity is inside a block/XREF (mapcar '(lambda (e) (cons (vla-get-EffectiveName (vlax-ename->vla-object e)) e)) blst) ) Je ne maîtrise pas suffisamment les matrices de transformation pour savoir s'il est possible d'insérer un bloc avec ses attributs correctement. Mais en tout cas il faut utiliser la dernière liste d'entité fournie par (nentsel) pour avoir la liste des blocs/XREF liés à l'objet sélectionné. A savoir que la première entité est le bloc/XREF contenant directement le sous-objet sélectionné, et le dernier nom d'entité correspond donc au bloc/XREF directement implanté dans notre dessin. Bisous, Luna
-
Coucou, Dans ton programme, tu utilises (foreach) sur un jeu de sélection, or cela ne fonctionne qu'avec les listes.. Pour faire une boucle sur ton jeu de sélection je te suggère ceci : (defun c:AlignBlocks (/ start-point spacing current-point jsel i) (setq start-point (getpoint "\nSélectionnez le point de départ de la colonne : ")) (setq spacing (getdist "\nEntrez l'espacement entre les blocs : ")) (setq current-point start-point) (repeat (setq i (sslength (setq jsel (ssget '((0 . "INSERT")))))) (command "._move" (cdr (assoc 10 (entget (ssname jsel (setq i (1- i)))))) current-point) (setq current-point (polar current-point (/ pi -2.) spacing)) ) (princ "\nBloc aligné en colonne avec succès.") ) Je n'ai pas testé le programme et j'ai fait en sorte de rester au plus proche de ce que tu as déjà développé. Je n'ai fait que corriger certaines erreurs : - déclaration des variables locales - utilisation d'une boucle (repeat) pour parcourir le jeu de sélection - ajout d'un filtre sur le jeu de sélection pour ne sélectionner que les références de bloc - modification de l'angle pour (polar), car si tu veux aligner tes blocs en colonne, on est d'accord que cela signifie que tu veux qu'ils soient tous alignés sur un même axe vertical ? Si c'est bien le cas, alors l'angle est -pi/2 (donc une colonne avec les insertions vers le bas). Autrement, tu peux éventuellement regarder certains lisps existants comme celui de Lee-Mac : http://www.lee-mac.com/blockcounter.html Je ne suis pas une experte pour retrouver les lisps déjà existants pour correspondre à ton besoin, peut-être que @lecrabe aura plus d'infos pour toi. Bisous, Luna
