-
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
-
La seule solution envisageable à mes yeux serait, comme le souligne @Fraid, de passer par un réacteur en lisp. Mais évidemment, si le fichier LISP n'est pas installé, le réacteur ne sera pas présent ! Donc vraiment très peu utile quand on y pense, car tes clients auront plutôt tendance à oublier d'installer le fichier LISP plutôt que l'inverse. Ensuite, même si c'était envisageable, comment le réacteur est-il supposé vérifier que des objets situé dans l'éditeur de bloc ont été modifié ? Comme je l'ai dit, la programmation permet de copier des fonctionnements de base d'AutoCAD. Donc encore une fois, cela est très compliqué manuellement d'empêcher un utilisateur d'utiliser une commande native d'AutoCAD. Donc cela sera tout aussi complexe par programmation... Il n'existe pas vraiment de gestion de confidentialité au sein même d'un .dwg ! Il me semble que l'on peut par exemple protéger un fichier .dwg dans son ensemble par un mdp, mais on ne peut pas protéger certains objets d'un .dwg... Donc il n'existera pas vraiment de méthode efficace pour palier à ton problème, juste de la bidouille. Pour les blocs anonymes et la protection des DWG, peut-être que cet article sera plus explicite >>ici<< Bisous, Luna
-
Coucou, Etant donné que tu as chaque dimension de chambre dans un état de visibilité, avec le nom de la dimension affiche pour chaque visibilité, pourquoi passer par un attribut ? Après tout il ne va pas changer de valeur, si ? Donc si j'étais toi, je ne mettrai pas d'attribut et je mettrai un texte à la place (1 pour chaque visibilité) ! Bisous, Luna
-
Parcourir un jeu de sélection pour modifier un attribut DXF
Luna a répondu à un(e) sujet de OrionLG dans AutoCAD 2020-2024
Coucou, Le problème vient du (entnext), qui n'a pas lieu d'être... Il faudrait quelque chose comme ceci : (setq nomcalc (getstring T "\nNom du calque : ")) (setq ss (ssget "_X" (list (cons 8 nomcalc)))) (sssetfirst nil ss) ; Pour afficher le jeu de sélection ; Si ss non nil (if ss (repeat (sslength ss) ; Répéter autant de fois que d'entité dans ss (setq ent (ssname ss 0)) ; ent = nom de la première entité de ss (setq en (entget ent)) ; en = liste DXF de l'entité (setq en (vl-remove-if '(lambda (x) (member (car x) '(420 430))) en)) ; Suppression des codes DXF facultatifs 420 et 430 pour les couleurs non ACI (if (assoc 62 en) ; Vérification si couleur forcée (code DXF 62) (entmod (subst (cons 62 256) (assoc 62 en) en)) ; Modification de la liste DXF de l'entité ) (ssdel ent ss) ; Suppression de la première entité de ss ) ) Une autre remarque : Pour parcourir un jeu de sélection il est préférable d'utiliser une variable que l'on incrémente pour à la place de l'index 0 de (ssname). Cela évite de devoir supprimer l'entité du jeu de sélection et donc de se réserver le droit d'utiliser (ssdel) pour une autre raison. Donc on utilise par exemple l'écriture ci-dessous : (repeat (setq i (sslength ss)) (setq ent (ssname ss (setq i (1- i)))) ... ) Ensuite, pourquoi as-tu utilisé (entnext) pour modifier la couleur de tes objets alors qu'ils sont sélectionnés par ton (ssget) ? Bisous, Luna -
Retour d'une valeur d'une list_box dans un DCL.
Luna a répondu à un(e) sujet de DenisHen dans Débuter en LISP
Coucou, J'ai un petit soucis avec l'utilisation des list_box et notamment avec l'attribut multiple_select = true. J'ai remarqué avec l'utilisation de la fonction (ListBox) de @(gile) (un peu remaniée), le nombre de valeurs que l'on peut pré-sélectionner semble limité à 256. Dans l'aide AutoCAD concernant list_box, ils ne font référence qu'à la limite de 32 768 valeurs pour la liste en entrée mais ils ne font pas référence à la limite de l'attribut Value permettant de sélectionner une liste de valeur au lancement de la boîte de dialogue. Or avec ma version de (ListBox), j'ai affiché le nombre d'élément dans la liste ainsi que le nombre d'éléments sélectionnés. Et le compteur d'élément sélectionnés reste bloqué à 256 malgré le fait que si je ferme la boîte de dialogue, le nombre max de valeur retournées autorisées est 530 (au delà le programme renvoie nil). J'ai simplement créé une liste de strings allant de 0 à 32 767 et j'ai fait quelques essais pour avoir les éléments ci-dessus. Ma question est donc la suivante : Avez-vous déjà été confronté à ce problème avec les list_box tile ? Et si oui, comment faire pour se permettre de pré-sélectionner plus de 256 valeurs ? Et sélectionner plus de 530 valeurs ? PS: je suis tombée sur ce >>sujet<< AutoDesk avec une personne ayant le même soucis apparemment. Bisous, Luna -
Coucou, Le problème n'est pas qu'il n'y ait personne sur ce forum, au contraire ! Ce que tu demandes n'est pas possible à mes yeux ! On ne peut pas empêcher AutoCAD de fonctionner avec ses propres outils...Ou du moins je n'ai aucune connaissance dans ce domaine. Le LISP que tu as cité ne protège aucunement les blocs d'être modifiés, uniquement d'être décomposés. Or cela est une simple propriété naturelle d'un bloc. Il faut penser que le LISP n'est qu'un outil capable de faire automatiquement des choses que l'on peut faire à la main. Or je n'arrive même pas à concevoir comment faire manuellement pour répondre à ta demande... Bref. Le souci n'est pas le manque de bénévoles, c'est juste que la demande est très complexe donc probablement que certains se sont penchés sur la question mais une chose est sûre : si jamais cela est réellement possible, on ne va pas trouver une solution en deux jours ! Bisous, Luna
-
Coucou, J'ai modifié le code ci-dessus pour intégrer ta demande. J'ai remplacé (setq jsel (ssget '((0 . "POLYLINE")))) par (or (setq jsel (ssget '((0 . "POLYLINE")))) (setq jsel (ssget "_X" (list '(0 . "POLYLINE") (cons 410 (getvar "CTAB")))))) Donc si tu as une pré-sélection d'objet, le programme utilisera la pré-sélection, sinon tu devras sélectionner manuellement les objets. Et si tu skip la sélection (pas de pré-sélection et pas de sélection manuelle), le programme sélectionnera toutes les polylignes 3D de l'espace courant (pour se limiter à l'espace Objet si tu es dans l'espace objet, etc...). Bisous, Luna
-
Coucou, Rapidement, sur la base de la proposition de Curlygoth on peut essayer ceci : (defun c:CheckZ (/ get-pt-list jsel ray i name pts csel n) (defun get-pt-list (lst) (if (and lst (zerop (rem (length lst) 3))) (cons (list (car lst) (cadr lst) (caddr lst)) (get-pt-list (cdddr lst))) ) ) (and (or (setq jsel (ssget '((0 . "POLYLINE")))) (setq jsel (ssget "_X" (list '(0 . "POLYLINE") (cons 410 (getvar "CTAB")))))) (null (initget 6)) (or (setq ray (getdist "\nRayon des cercles <1.0> : ")) (setq ray 1.0)) (repeat (setq csel (ssadd) n 0 i (sslength jsel)) (setq name (ssname jsel (setq i (1- i)))) (setq pts (get-pt-list (vlax-get (vlax-ename->vla-object name) 'Coordinates))) (setq pts (vl-remove-if-not '(lambda (p) (equal (last p) 0 1E-6)) pts)) (foreach pt pts (setq ent (entmakex (list '(0 . "CIRCLE") '(100 . "AcDbEntity") '(100 . "AcDbCircle") '(62 . 1) ; (cons 8 "...") ;; Remplacer "..." par le nom du calque désiré si besoin et supprimer le ; devant (cons 10 pt) (cons 40 ray) ) ) ) (ssadd ent csel) ) (if pts (setq n (+ n (length pts))) T) ) (null (sssetfirst)) (sssetfirst nil csel) ) ) Les cercles nouvellement créés sont conservés comme sélection active (pour les supprimer plus facilement). Il serait également judicieux de leur affecter un calque spécifique si besoin. Pour cela j'ai laissé la ligne ; (cons 8 "...") ;; Remplacer "..." par le nom du calque désiré si besoin et supprimer le ; devant mais elle est actuellement en commentaire (car il y a un point-virgule devant) donc tu fais comme tu veux. Si tu veux changer la couleur, il suffit de modifier la valeur du code DXF 62 (actuellement à 1 = rouge). Les valeurs autorisées sont comprises entre 0 et 256 (0 = DuBloc et 256 = DuCalque) Une autre méthode consisterait à laisser la vérification directement dans le programme, afin de supprimer les cercles une fois le programme terminé. Bisous, Luna
-
Coucou, Essaye avec ceci : (defun c:toto (/ *error* doc opt del ss alt zlst pl) (vl-load-com) (defun *error* (msg) (and (/= msg "Fonction annulée") (princ (strcat "\nErreur: " msg)) ) (and ss (vla-delete ss)) (vla-EndUndoMark doc) (princ) ) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) (if (ssget '((0 . "POLYLINE") (-4 . "&") (70 . 8))) (progn (vla-StartUndoMark doc) (initget "maXimum miNimum moYenne Zéro") (or (setq opt (getkword "\Altitude de la polyligne plane [maXimum/miNimum/Zéro/moYenne] <moYenne> : " ) ) (setq opt "moYenne") ) (initget "Oui Non") (or (setq del (getkword "\nSupprimer la polyligne 3d source ? [Oui/Non] <Non> : ") ) (setq del "Non") ) (vlax-for p (setq ss (vla-get-ActiveSelectionSet doc)) (setq pts (3d-coord->pt-lst (vlax-get p 'Coordinates)) zlst (mapcar 'caddr pts) alt (cond ((= opt "maXimum") (apply 'max zlst) ) ((= opt "miNimum") (apply 'min zlst) ) ((= opt "Zéro") (apply '- '(1 1)) ) (T (/ (apply '+ zlst) (float (length pts)))) ) pl (vlax-invoke (vla-get-ModelSpace doc) 'addLightWeightPolyline (apply 'append (mapcar '(lambda (p) (setq p (trans p 0 (trans '(0 0 1) 1 0 T))) (list (car p) (cadr p)) ) pts ) ) ) ) (vla-put-elevation pl alt) (vla-put-Closed pl (vla-get-Closed p)) ;;; Ajouter un point-virgule ; devant les lignes ci-dessous si l'on ne désire pas conserver la propriété de l'objet initial (vla-put-EntityTransparency pl (vla-get-EntityTransparency p)) ; Conserve la propriété d'échelle de type de ligne de l'objet initial (vla-put-Layer pl (vla-get-Layer p)) ; Conserve la propriété de calque de l'objet initial (vla-put-Linetype pl (vla-get-Linetype p)) ; Conserve la propriété de type de ligne de l'objet initial (vla-put-LinetypeScale pl (vla-get-LinetypeScale p)) ; Conserve la propriété d'échelle de type de ligne de l'objet initial (vla-put-LineWeight pl (vla-get-LineWeight p)) ; Conserve la propriété d'épaisseur de ligne de l'objet initial (vla-put-Material pl (vla-get-Material p)) ; Conserve la propriété de matériau de l'objet initial (vla-put-TrueColor pl (vla-get-TrueColor p)) ; Conserve la propriété de couleur de l'objet initial ;;; Ajouter un point-virgule ; devant les lignes ci-dessus si l'on ne désire pas conserver la propriété de l'objet initial (if (= del "Oui") (vla-delete p) ) ) (vla-delete ss) (vla-EndUndoMark doc) ) ) (princ) ) ;;; 3d-coord->pt-lst Convertit une liste de coordonnées 3D en liste de points ;;; (3d-coord->pt-lst '(1.0 2.0 3.0 4.0 5.0 6.0)) -> ((1.0 2.0 3.0) (4.0 5.0 6.0)) (defun 3d-coord->pt-lst (lst) (if lst (cons (list (car lst) (cadr lst) (caddr lst)) (3d-coord->pt-lst (cdddr lst)) ) ) ) J'ai ajouté les lignes ;;; Ajouter un point-virgule ; devant les lignes ci-dessous si l'on ne désire pas conserver la propriété de l'objet initial (vla-put-EntityTransparency pl (vla-get-EntityTransparency p)) ; Conserve la propriété d'échelle de type de ligne de l'objet initial (vla-put-Layer pl (vla-get-Layer p)) ; Conserve la propriété de calque de l'objet initial (vla-put-Linetype pl (vla-get-Linetype p)) ; Conserve la propriété de type de ligne de l'objet initial (vla-put-LinetypeScale pl (vla-get-LinetypeScale p)) ; Conserve la propriété d'échelle de type de ligne de l'objet initial (vla-put-LineWeight pl (vla-get-LineWeight p)) ; Conserve la propriété d'épaisseur de ligne de l'objet initial (vla-put-Material pl (vla-get-Material p)) ; Conserve la propriété de matériau de l'objet initial (vla-put-TrueColor pl (vla-get-TrueColor p)) ; Conserve la propriété de couleur de l'objet initial ;;; Ajouter un point-virgule ; devant les lignes ci-dessus si l'on ne désire pas conserver la propriété de l'objet initial dans le code donné ci-dessus par @La Lozère (et j'ai juste rajouté un (float) pour l'élévation moyenne pour faire une division décimale et non euclidienne ^^"). Comme je l'ai indiqué, j'ai mis toutes les propriétés qui semblent exportables entre les deux objets, et si jamais tu ne veux pas conserver certaines propriétés, il suffit de rajouter un point-virgule ; devant la ligne concernée 😉 Bisous, Luna
-
J'ai en effet oublié de parler de RGT pour mettre à jour l'affichage, désolée... ^^" Bisous, Luna
-
Coucou, As-tu essayé mon programme ? Je viens de passer sur tes deux présentations la variable PSTLSCALE à 0 (elles étaient à 1 initialement) et le problème est résolu donc je ne sais pas comment t'aider plus que cela malheureusement... Bisous, Luna
-
Concaténer valeur de attribut suivant une sélection manual
Luna a répondu à un(e) sujet de yann69690 dans AutoCAD 2020-2024
Je n'ai en effet pas de programmes sous la main capable de supprimer les attributs en doublons d'une définition de bloc et encore moins de réimplanter des attributs manquants dans la définition de bloc mais apparaissant dans les propriétés d'une référence de bloc ^^" J'ai pas les compétences pour ces tours de magie (même si théoriquement la première semble faisable), désolée >w< Bisous, Luna -
Coucou, Juste pour bien comprendre, tu modifies le gel/dégel des calques dans chaque référence externe et tu voudrais que ces modifications se répercute dans ton dessin ? Car si c'est bien cela c'est VISRETAIN = 0 et non 1 si je ne dis pas de bêtises... ^^" Tu peux également regarder la variable VISRETAINMODE comme le suggère l'aide AutoCAD ci-dessus car j'ai l'impression que le problème vient de là ! 😉 Bisous, Luna
-
lisp erreur: 0xC0000005 (Violation d'accès)
Luna a répondu à un(e) sujet de iowa13 dans Routines LISP
Coucou, Je viens de le tester sur mon AutoCAD 2022 1.2 (dessin vierge) et je n'ai pas eut de soucis (aussi bien pour la commande 3PR que 3PRD).. Peux-tu dire à quel moment tu obtiens une erreur ? As-tu le problème indépendamment du .dwg ou pas ? Bisous, Luna -
En gros si PSLTSCALE = 1 alors AutoCAD va calculer un coefficient de changement d'échelle lorsque l'échelle de l'espace objet de la présentation est différente de l'échelle de l'onglet Objet. Ce coefficient sera ensuite appliqué aux échelles de type de ligne. Par exemple si un objet possède une échelle de type de ligne à 1 dans l'onglet Objet, qui a une échelle de 1/1 ; alors dans une présentation ayant une échelle de 1/50 alors il va calculer un coefficient de 1/1 x 1/50 = 0,02 et l'appliquer à l'échelle de type de ligne dans la fenêtre uniquement. Donc dans la fenêtre ton objet aura une échelle de type de ligne à 0.02 au lieu de 1 comme dans l'onglet Objet (le but étant de théoriquement conserver l'échelle d'affichage de l'objet quelque soit l'échelle de la fenêtre). Bisous, Luna
-
Coucou, Attention à la variable PLSTSCALE, car elle est indépendante pour chaque présentation !! Donc si tu l'as définis sur la présentation1 à 0, elle ne sera pas redéfinie à 0 sur toutes les autres... J'avais un petit programme à l'époque pour faire cela histoire d'harmoniser la valeur dans toutes les présentations : (defun c:FIXPSLTSCALE (/ ini lay val) (setq ini (getvar "CTAB") lay (layoutlist) ) (initget 4) (if (not (member (setq val (getint (strcat "\nSpécifiez la nouvelle valeur pour PSLTSCALE <" (itoa (getvar "PSLTSCALE")) "> : "))) '(0 1))) (setq val (getvar "PSLTSCALE")) val ) (foreach layout lay (setvar "CTAB" layout) (setvar "PSLTSCALE" val) ) (setvar "CTAB" ini) (princ (strcat "\nLes " (itoa (length lay)) " présentations ont désormais PSLTSCALE = " (itoa val))) (princ) ) Si cela ne correspond pas à ton soucis, alors peut-être qu'un .dwg d'exemple où tu rencontres le soucis pourrait nous aider pour t'aiguiller 😉 Bisous, Luna
-
nan, je pense que tu es trop habitué aux extractions de données réalisées par des programmes xD Je n'ai pas vu de propriété correspondant au handle dans l'assistant d'extraction de données. Mais comme beaucoup de programmes LISP, etc.. font l'extraction de cette propriété, peut-être as-tu confondu avec toutes tes routines 🙂 Bisous, Luna
-
Detection portrait/paysage dans presentation.
Luna a répondu à un(e) sujet de phil 54 dans Débuter en LISP
Coucou, Bon à priori mes explications manquent un peu de clarté ^^" (defun PayOrPor (lst / ctb nam ent box DIx DIy fmt ort layouts) (setq lst (mapcar 'strcase lst) ctb (getvar "CTAB") ) (vlax-for lay (vla-get-layouts (vla-get-ActiveDocument (vlax-get-acad-object))) (and (setq nam (vla-get-Name lay)) (member (strcase nam) lst) (setvar "CTAB" nam) (setq ent (vlax-vla-object->ename lay)) (setq box (cons (cdr (assoc 15 (entget ent))) (list (cdr (assoc 14 (entget ent)))))) (setq DIx (abs (apply '- (mapcar 'car box)))) (setq DIy (abs (apply '- (mapcar 'cadr box)))) (not (zerop DIx)) (not (zerop DIy)) (cond ( (and (< DIy DIx) (<= DIx 210) (<= DIy 148)) (setq fmt "A5" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 148) (<= DIy 210)) (setq fmt "A5" ort "Portrait")) ( (and (< DIy DIx) (<= DIx 297) (<= DIy 210)) (setq fmt "A4" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 210) (<= DIy 297)) (setq fmt "A4" ort "Portrait")) ( (and (< DIy DIx) (<= DIx 420) (<= DIy 297)) (setq fmt "A3" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 297) (<= DIy 420)) (setq fmt "A3" ort "Portrait")) ( (and (< DIy DIx) (<= DIx 594) (<= DIy 420)) (setq fmt "A2" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 420) (<= DIy 594)) (setq fmt "A2" ort "Portrait")) ( (and (< DIy DIx) (<= DIx 841) (<= DIy 594)) (setq fmt "A1" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 594) (<= DIy 841)) (setq fmt "A1" ort "Portrait")) ( (and (< DIy DIx) (<= DIx 1189) (<= DIy 841)) (setq fmt "A0" ort "Paysage")) ( (and (> DIy DIx) (<= DIx 841) (<= DIy 1189)) (setq fmt "A0" ort "Portrait")) ) (setq layouts (cons (cons nam (list ort fmt DIx DIy)) layouts)) ) ) (setvar "CTAB" ctb) (reverse layouts) ) Pour me faire pardonner, rentre en ligne de commande (PayOrPor (layoutlist)) Le but du (setvar "CTAB" nam) pour chaque présentation c'est uniquement dans le but de s'assurer que les codes DXF 14 et 15 ont été mis à jour (car si on dessine une entité dans une présentation et que l'on étudie les codes DXF 14 et 15 de cette même présentation sans qu'il y ait eut un régénération de la présentation en question, ils seront faux) Normalement cela devrait te renvoyer une liste de ce genre là : (("Présentation1" "Paysage" "A4" 245.093 179.28) ("Présentation2" "Paysage" "A3" 370.706 285.048)) Avec du coup pour chaque élément de la liste : Si x = ("Présentation1" "Paysage" "A4" 245.093 179.28) Alors on a : (car x) = "Présentation1" (cdr x) = ("Paysage" "A4" 245.093 179.28) (cadr x) = "Paysage" (caddr x) = "A4" (cadddr x) = 245.093 (last (cdr x)) = 179.28 Sur ton .dwg d'exemple on obtient (après avoir supprimé les textes indiquant le résultat désiré) : ( ("Présentation1" "Paysage" "A2" 400.0 300.0) ("Présentation1 (2)" "Paysage" "A2" 400.0 300.0) ("Présentation1 (3)" "Portrait" "A2" 300.0 400.0) ("Présentation1 (4)" "Portrait" "A2" 300.0 369.132) ) Donc il me semble que tu n'as pas le bon format dans ton .dwg d'exemple ou alors mes souvenirs en matière de format de papier sont faux... Bisous, Luna -
Je n'ai pas trouvé la propriété Handle dans l'extraction de données ^^" j'ai dû passer à côté Bisous, Luna
-
Euhhh... c'est pas ce que j'ai dit il me semble...^^" Bisous, Luna
-
Alors vui, le programme permet uniquement de corriger les références de blocs qui ne sont pas bonnes, par contre je ne vois absolument pas comment faire l'inverse : corriger les définitions de blocs qui ne correspondent pas à leur références ! Pour moi les attributs en rouges signifie qu'ils sont en doublon (voire plus) dans la définition de bloc (enfin du moins qu'il y a plusieurs attributs d'une même définition de bloc qui possèdent la même étiquette)... Bisous, Luna
-
Coucou, Nan c'est un bug AutoCAD...J'ai déjà eu ce soucis auparavant ^^" En clair cela peut arriver lorsque tu supprimes tous les attributs de ton bloc, mais comme tu as des références de bloc insérées dans le dessin et qu'il faut toujours faire un ATTSYNC sur les références de blocs si on modifie les définitions d'attribut...bah ATTSYNC refuse de fonctionner car la définition de bloc ne possède plus d'attributs ! Donc en clair ton bloc ne devrait pas posséder d'attributs mais comme ATTSYNC ne fonctionne pas sur ces blocs, c'est un peu complexe... Si tu as un AutoCAD full (pas LT), tu peux essayer ce programme (j'ai testé sur ton .dwg et cela fonctionne parfaitement !) : (defun c:FixBadAttBlocks ( / gettags bkc bln doc lst tmp ) (defun gettags ( def / rtn ) (vlax-for obj def (if (= "AcDbAttributeDefinition" (vla-get-objectname obj)) (setq rtn (cons (strcase (vla-get-tagstring obj)) rtn)) ) ) rtn ) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object)) bkc (vla-get-blocks doc) ) (vlax-for blk bkc (if (= :vlax-false (vla-get-isxref blk)) (vlax-for obj blk (if (and (= "AcDbBlockReference" (vla-get-objectname obj)) (= :vlax-true (vla-get-hasattributes obj)) (or (setq tmp (assoc (setq bln (vla-get-name obj)) lst)) (and (setq tmp (cons bln (gettags (vla-item bkc bln)))) (setq lst (cons tmp lst)) ) ) ) (foreach att (vlax-invoke obj 'getattributes) (or (member (strcase (vla-get-tagstring att)) (cdr tmp)) (and (vlax-write-enabled-p att) (vla-delete att) ) ) ) ) ) ) ) (vla-regen doc acallviewports) (princ) ) Je l'ai récupéré sur ce fil de discussion >>ici<< donc je suppose que l'auteur est BeekeeCZ mais @lecrabe a peut-être plus d'infos s'il possède ce programme dans sa bibliothèque de 3001 routines 😉 Bisous, Luna
-
Detection portrait/paysage dans presentation.
Luna a répondu à un(e) sujet de phil 54 dans Débuter en LISP
@phil 54, Si jamais tu as besoin de tester rapidement la représentation du (LM:ssboundingbox), je te suggère d'utiliser la commande d'exemple de LeeMac située en bas de la page de cette fonction. Si besoin, je l'ai passée sous forme de fonction pour pouvoir récupérer le VLA-Object créé et le retour de (LM:ssboundingbox) afin de pouvoir supprimer l'objet facilement ou modifier ses propriétés et également avoir les corner : ; +-----------------------------------------------------------------------------------------------------------------------------------------------+ ; ; | | ; ; | HISTORICAL TRACKING FILE OF THE FUNCTION | ; ; | --{ PVBB-Draw }-- | ; ; | | ; ; +-----------------------------------------------------------------------------------------------------------------------------------------------+ ; ; []-----------------------[] PVBB-Draw []-----------------------[] ; ;--- Date of creation > 04/01/2017 ; ;--- Last modification date > 04/07/2022 ; ;--- Author > LeeMac ; ;--- Version > 1.3.0 ; ;--- Class > "DtSel" ; ;--- Goal and utility of the main function ; ; For a selection set, it will construct a bounding box surrounding all objects in the selection. ; ; If all objects in the selection are coplanar and reside in a plane parallel to the WCS plane, the following program will construct the 2D ; ; rectangular bounding box in the form of a 2D LWPolyline. ; ; If any object in the selection resides in a different construction plane, the program will construct the 3D cuboid bounding box in the form of ; ; a 3D solid. ; ; ; ;--- Declaration of the arguments ; ; The function (PVBB-Draw) have 1 argument(s) : ; ; --• sel > corresponds to the selection set you want to see its bounding box ; ; (type sel) = 'PICKSET | Ex. : (ssget), (ssget "_I"), ... ; ; ; ;--- List of dependent's functions ; ; --• "DtSel" ---> LM:ssBoundingBox | v1.2.0 - 04/01/2017 (LeeMac) ; ; ; ;--- Return ; ; The function (PVBB-Draw) returns a dotted pair list with the VLA-Object of the new created object representing the bounding box as the key, and ; ; the bottom left and upper right corners coordinates as the value of the dotted pair, nil otherwise. ; ; Ex. : (PVBB-Draw (ssget)) returns (#<VLA-OBJECT IAcad3DSolid 0000024ea35f9428> (-20.7107 -20.7107 0.0) (120.711 120.711 50.0)) or nil ; ; ; ;--- Historic list of the version with their modification status ; ; +------------+----------------------------------------------------------------------------------------------------------------------------------+ ; ; | v1.3.0 | Adapt the command example from LeeMac site (Selection set Bounding Box) into a function | ; ; +------------+----------------------------------------------------------------------------------------------------------------------------------+ ; ; | v1.2.0 | Creation of the function | ; ; +------------+----------------------------------------------------------------------------------------------------------------------------------+ ; ; ; (defun PVBB-Draw ( sel / box obj spc ) (if (and (setq box (LM:ssboundingbox sel)) (setq spc (vlax-get-property (vla-get-activedocument (vlax-get-acad-object)) (if (= 1 (getvar 'cvport)) 'paperspace 'modelspace ) ) ) (if (equal 0.0 (apply '- (mapcar 'caddr box)) 1e-6) (progn (setq obj (vlax-invoke spc 'addlightweightpolyline (apply 'append (mapcar '(lambda ( x ) (mapcar '(lambda ( y ) ((eval y) box)) x)) '( (caar cadar) (caadr cadar) (caadr cadadr) (caar cadadr) ) ) ) ) ) (vla-put-closed obj :vlax-true) (vla-put-elevation obj (caddar box)) obj ) (setq obj (apply 'vlax-invoke (vl-list* spc 'addbox (apply 'mapcar (cons '(lambda ( a b ) (/ (+ a b) 2.0)) box)) (apply 'mapcar (cons '- (reverse box))) ) ) ) ) ) (cons obj box) ) ) @Olivier Eckmann, J'avais aussi pensé au code DXF 68 mais je n'ai pas pris le temps de vérifier si cela est une généralité ou s'il existe des exceptions à la règle... Filtrer la sélection pour ignorer certaines entités sans valeur graphique serait en effet judicieux (car bien souvent, même un texte utile mais avec une largeur/hauteur totalement démesurée par rapport au texte saisi, c'est une erreur récurrente ...) ! Le problème viendrait dans ce cas de la présentation "Présentation1 (2)" car il n'y a pas d'entités graphiques qui englobent les VIEWPORT, c'est pour cela que l'on est un peu contraint d'accepter les VIEWPORT dans la sélection des entités... Je viens de remarquer également autre chose de VRAIMENT intéressant ! Les codes DXF 14 et 15 des entités LAYOUT 😉 En regardant rapidement si les LAYOUT avait des infos utiles, dans la liste DXF ces deux codes représentent tout simplement les coordonnées des corners bas gauche (DXF 14) et haut droit (DXF 15) de la bounding box de la présentation : Donc reprendre mes exemples de prog pour la propriété "CanonicalMediaName" pour récupérer la liste des VLA-Object des LAYOUT et faire un (enget) sur leur ename (vlax-vla-object->ename) pour récupérer ces valeurs. Pas besoin de passer par (LM:ssboundingbox) ou de filtrer les entités finalement ^^ Bon sur ce, je retourne me coucher je suis épuisée -_- Bisous, Luna -
Coucou Il suffit de décocher la case "Combiner les rangées identiques" et il fera 1 ligne par entité Bisous, Luna
-
Coucou, Nan désolée je n'avais pas trop le temps... J'ai jeté un oeil rapidement à ton .dwg et...je ne vois pas un seul attribut dans tes définitions de bloc...tout ce qu'il y a dans l'encadré c'est les références de bloc pour chaque plaque avec un texte à côté pour les différentes valeur de puissance FR/CH et de débit FR/CH... Or depuis le début tu me parles de blocs avec attributs...Donc la réponse est "non, mon programme ne peut pas sélectionner ces blocs, car ils doivent impérativement avoir des attributs !" En fait, il faut que tes textes à gauche de tes références, tu intègres dans chaque définition de bloc des attributs qui correspondent pour chaque valeur ! Autre remarque : pourquoi dans tes définitions de bloc, l'intégralité des objets qui les composent sont des références de bloc ?! Même les textes sont des références de blocs !! J'ai retravaillé ton .dwg pour avoir des attributs dans tes plaques avec les bonnes valeurs et la bonne dénomination (j'ai également décomposer les références de blocs situées dans tes définitions de bloc de tes plaques !). Cependant, il n'est pas possible d'avoir la propriété "Constant" sur les attributs (évitant ainsi la modification des valeurs) car cela supprime les attributs de la liste des attributs des références de blocs, et donc cela complexifie un peu trop la chose (et je n'ai pas le temps pour cela)...Donc il faudra faire avec, les attributs apparaissent dans les propriétés du bloc mais sont invisibles dans le dessin. J'ai réécrit mon code pour qu'il puisse s'adapter au .dwg en PJ, permettant par exemple de remplir directement les blocs étiquette (la première sélection correspond à la sélection des plaques, la seconde demande à sélectionner un seul et unique bloc étiquette et si la seconde ne correspond pas au filtre de recherche donc un bloc ayant des attributs alors le programme va insérer le texte comme précédemment). Ci-dessous le LISP corrigé et remanié : (defun c:SumAtt (/ foo checkblock set-att-list subreal PreIntSuf param bname jsel i name vnam att lst ent) (defun foo (x f) (if f (if (listp x) (mapcar f x) ((eval f) x) ) x ) ) (defun checkblock ( ent blk lst fun / vla att ) (and (setq vla (vlax-ename->vla-object ent)) (vlax-property-available-p vla 'EffectiveName) (wcmatch (foo (vla-get-EffectiveName vla) fun) (foo blk fun)) (setq att (mapcar '(lambda (a) (cons (vla-get-tagstring a) (vla-get-textstring a))) (vlax-invoke vla 'getAttributes))) (setq att (vl-remove-if-not '(lambda (a) (member (foo (car a) fun) (foo lst fun))) att)) ) att ) (defun set-att-list (blk lst / itm tmp) (foreach att (vlax-invoke blk 'getAttributes) (if (setq itm (assoc (vla-get-tagstring att) lst)) (progn (vla-put-textstring att (cdr itm)) (setq tmp (cons itm tmp))) ) ) tmp ) (defun subreal (str num) (setq str (PreIntSuf str)) (apply 'strcat (subst num (cadr str) str)) ) (defun PreIntSuf (str / l x n p i s) (repeat (length (setq l (vl-string->list str))) (setq x (car l)) (cond ( (and p s) (setq s (cons x s))) ( (and (distof (chr x)) n (= "-" (chr n)) ) (setq i (append (list n) i) i (cons x i) ) ) ( (or (distof (chr x)) (and (= "." (chr x)) n (distof (chr n)) ) ) (setq i (cons x i)) ) ( (null i) (setq p (cons x p))) ( i (setq s (cons x s))) ) (setq l (cdr l) n x ) ) (mapcar '(lambda (l) (set (read (vl-symbol-name l)) (reverse (vl-symbol-value l)))) (list 'p 'i 's)) (if (and i (= "-" (chr (car i))) p (= "-" (chr (last p))) ) (setq p (reverse (cdr (reverse p)))) ) (list (vl-list->string p) (vl-list->string i) (vl-list->string s) ) ) (setq param (list "PUISSANCE" "DEBIT" "PUISS_CH" "PUISS_FR" "DEB_CH" "DEB_FR") ; Liste des noms d'attribut bname "*" ; Liste des noms de blocs (séparer les noms par des virgules, sans espaces !) ) (if (setq jsel (ssget (list '(0 . "INSERT") '(66 . 1) (cons 2 bname)))) (progn (repeat (setq i (sslength jsel)) (and (setq name (ssname jsel (setq i (1- i)))) (setq att (checkblock name bname param 'strcase)) (mapcar '(lambda (a / s v) (setq s (strcase (car a))) (setq v (cond ((distof (cdr a))) (0.0))) (setq lst (if (assoc s lst) (subst (cons s (+ (cdr (assoc s lst)) v)) (assoc s lst) lst ) (append lst (list (cons s v))) ) ) ) att ) ) ) (princ "\nVeuillez sélectionner un bloc étiquette...") (if (setq jsel (ssget "_+.:E:S" '((0 . "INSERT") (66 . 1)))) (progn (and (setq name (ssname jsel 0)) (setq att (checkblock name bname param 'strcase)) (set-att-list (vlax-ename->vla-object name) (vl-remove nil (mapcar '(lambda (a) (if (setq b (assoc (car a) lst)) (progn (setq str (cdr a)) (if (distof str) (cons (car a) (rtos (cdr b) 2 2)) (cons (car a) (subreal (cdr a) (rtos (cdr b) 2 2))) ) ) ) ) att ) ) ) ) ) (entmakex (list '(0 . "MTEXT") '(100 . "AcDbEntity") '(100 . "AcDbMText") (cons 10 (getpoint "\nVeuillez spécifier un point d'insertion (MText) : ")) (cons 1 (apply 'strcat (mapcar '(lambda (x) (strcat (car x) " = " (rtos (cdr x) 2 2) "\\P")) lst))) ) ) ) ) ) (princ) ) Bisous, Luna exemple_remplir_etiquette.dwg
-
Detection portrait/paysage dans presentation.
Luna a répondu à un(e) sujet de phil 54 dans Débuter en LISP
@Olivier Eckmann, Pourquoi ne pas faire un traitement post-sélection (à priori le nombre d'objets n'est pas démentiel sur chaque présentation) pour filtrer par rapport aux codes DXF 40 et 41 ? Certes dans un cas général, cela ne servirait absolument à rien et je ne vois pas non plus comment la filtrer de la sélection, mais dans ce cas spécifique on a comme donnée d'entrée : Donc on peut vérifier pour chaque entité de type VIEWPORT si ses propriétés de hauteur (DXF 41) et/ou de largeur (DXF 40) sont supérieures aux propriétés ISO d'un format A3 et supprimer l'entité du jeu de sélection avant l'utilisation de (LM:ssboundingbox) sur le jeu de sélection si c'est le cas... Enfin bon, je ne me suis pas amusé à tester un programme pour voir si cela peut fonctionner ou pas, donc je te laisse voir si chat fonctionne pour toi @phil 54 je n'ai pas trop le temps de vérifier par moi même ^^" Bisous, Luna
