Aller au contenu

Luna

Membres
  • Compteur de contenus

    1 113
  • Inscription

  • Dernière visite

  • Jours gagnés

    42

Tout ce qui a été posté par Luna

  1. Coucou @Steven, Il existe les programmes CBPR (Change Base Point retain Reference position) et CBP (Change Base Point) développés par LeeMac qui, je trouve, sont excellents ! Tu pourras ainsi modifier les points d'insertions de tes blocs sans modifier la position des références de blocs. Personnellement je m'en sers régulièrement : http://www.lee-mac.com/changeblockinsertion.html. La commande qui t'intéresse donc est CBPR. En espérant que cela puisse t'aider à retrouver le sourire :3 Bisous, Luna
  2. Coucou, Il va falloir être un peu plus clair avec les termes utilisés car j'ai bien peur de ne pas tout avoir compris... Qu'est-ce que tu veux dire par là ? Faut-il que les valeurs que tu affectes à une variable soient conservées dans le dessin en cours pour la session actuelle (et donc même une fois l'exécution du programme terminée, tu puisses accéder à leur valeur) ou bien également pour les sessions prochaines ? Qu'entends-tu par "quantité fixe" exactement ? Car il n'y a (à ma connaissance) pas de limitation en terme de nombre de variables par programmes. Ou bien tu voulais dire que tu ne savais que affecter des valeurs constantes à tes variables (donc par exemple 7, "ceci est un texte", ...) ? Si c'est cela, sache que tu peux affecter n'importe quelle valeur à une variable sans forcément que celle-ci soit fixe. Par exemple : (setq dernier_objet (entlast)) ;; Affecte à la variable 'dernier_objet' le nom d'entité du dernier objet créé dans le dessin (setq point (getpoint "\nPoint : ")) ;; Affecte à la variable 'point' les coordonnées 3D du point (sous forme de liste) sélectionné par l'utilisateur (setq valeur_A (+ 8 2)) ;; Affecte à la variable 'valeur_A' le résultat de l'addition 8+2 soit 10 (setq valeur_B (* valeur_A 2)) ;; Affecte à la variable 'valeur_B' le résultat de la multiplication 2x valeur_A soit 2x10 donc 20 Pour réaliser un jeu de sélection, il faut utiliser la fonction (ssget) dans le cas de sélection d'objets multiples ou complexe, sinon la fonction (entsel) qui permet de sélectionner un seul objet. Cependant, la fonction (ssget) me semble peut-être un peu trop complexe pour toi pour l'instant et si je comprends bien le but ultime de ton programme, (entsel) devrait être plus adapté pour toi puisqu'il faut que l'utilisateur détermine un ordre de sélection afin de tracer la ligne correctement entre les différents points (autrement si tu fais une sélection de tous les points d'un coup, comment le programme est-il supposé connaître l'ordre des points ?). Evidemment, je pourrais te proposer des programmes tout fait pour répondre à ton besoin mais je n'ai pas l'impression que c'est ce que tu souhaites ici (peut-être que je fais fausse route cependant). J'ai plutôt la sensation que tu aimerais avoir juste des pistes afin de te guider et t'aider à réaliser ce programme par toi-même. J'ai un peu peur que tu t'attaques à un programme un peu complexe pour débuter mais on va faire au mieux pour t'épauler 🙂 Dans un premier temps, afin de ne pas te perdre dans les étapes cruciale de ton programme, je te conseille vivement de réaliser un logigramme du programme afin d'identifier clairement les étapes clés du programme mais également d'identifier l'ensemble des données nécessaires à la bonne exécution du programme tout en respectant les contraintes que tu t'imposes (et les contraintes du logiciel évidemment). Tu peux également t'appuyer sur les cours d'apprentissage de l'AutoLISP de (gile) ainsi que le site de didier qui sont d'une aide précieuse pour tout niveau confondu. Aux vues du programme que tu désires réaliser, voici une liste non exhaustive de fonctions qui pourront t'être utile et qui pourra ainsi te donner quelques pistes de recherches : - (setq) -> affecte une valeur à une variable - (entsel) -> demande à l'utilisateur de sélectionner un objet unique - (ssget) -> permet de réaliser ou demander à l'utilisateur de sélectionner un ensemble d'objets ou un seul en filtrant la sélection si besoin en fonction des arguments spécifiés - (car) -> renvoie le premier élément d'une liste - (cdr) -> renvoie la liste moins le premier élément de la liste - (while) -> effectue une boucle Tant Que... - (if) -> fonction SI... - (command) -> permet de faire appel à une commande AutoCAD Je t'invite grandement à consulter l'aide AutoCAD sur chacune de ces fonctions pour comprendre plus précisément leur rôle et également avoir un exemple d'utilisation. Il s'agit, encore une fois, d'une liste non exhaustive donc il y aura d'autres fonctions qui seront nécessaire au programme. Si jamais tu as également besoin d'exemple plus concrets ou de bouts de codes pour certaines parties de ton programme (notamment lorsque tu devras consulter les attributs de tes blocs par exemple), n'hésites pas ! On s'adaptera à tes besoins. Bisous, Luna
  3. Coucou @(gile), Une petite précision car j'avais pour habitude de travailler avec les fonctions (getpropertyvalue) et (setpropertyvalue) mais également avec des entités réseaux. Il faut se méfier de ces entités réseaux car elles sont sélectionnées par un simple (ssget '((0 . "INSERT") (2 . "`*U*"))) et génère une erreur lors de l'utilisation de (getpropertyvalue ent "BlockTableRecord/Name") car cette propriété existe bel et bien pour les références de blocs standards et dynamiques mais pas pour les entités réseaux. J'avais donc tendance soit à vérifier la propriété ClassName (if (wcmatch (getpropertyvalue ent "ClassName") "*Array*") ... ) soit d'ignorer l'erreur via (if (not (vl-catch-all-error-p (setq val (vl-catch-all-apply 'getpropertyvalue (list ent "BlockTableRecord/Name"))))) ... ) afin d'éviter toutes erreurs possibles en raison de ces entités délicates. Évidemment ces entités ne sont pas courantes dans tous les cœurs de métier, mais il me semblait important de préciser ce que j'ai pu apprendre à mes dépends. Bisous, Luna
  4. Coucou, Es-tu certain que les attributs étaient transférés dans un autre calque et ce sans supprimer le précédent calque et sans modifier le calque d'éventuel autres type d'objets ? Car si le calque précédent était conservé, cela peut éventuellement faire penser à la commande FUSCALQUE qui permet de faire fusionner des calques dans un calque cible, faisant alors disparaître les calques fusionner (globalement tu déplaces tous les objets d'un ou plusieurs calques obsolètes vers un autre en quelque clics à peine). Sinon on peut réfléchir à un programme pour modifier uniquement les attributs nommés "ALT" et changer leur calque. Bisous, Luna
  5. Ohh, je vois ! Mais n'ayant fait que modifier le programme RENAMETAG, si le programme RENAMETAGNEN supprime l'invite alors RENAMETAG avait alors le même problème déjà, n'est-ce pas ? J'avoue ne jamais avoir eu à renommer les étiquettes donc je ne sais pas trop à quoi est liée l'invite d'un attribut. Je verrai ce que je peux faire et s'il y a moyen d'éviter ce genre de soucis. Bisous, Luna
  6. Coucou, alors je ne suis pas une pro mais je dirais que tu as une erreur sur le texte "Point de d'insertion" 😉 Bisous, Luna
  7. Coucou @nen, Qu'entends-tu par Quel texte de l'invite ? Veux-tu parler de ceci ? (/= (setq old (strcase (getstring "\nAncienne étiquette: "))) "") (/= (setq new (strcase (getstring "\nNouvelle étiquette: "))) "") Si c'est le cas, comment dois-je l'intégrer pour que cela réponde bien à tes besoins ? Bisous, Luna
  8. Coucou, Ce que (gile) cherchait à te faire comprendre ici c'est que faire une validation à vide avec un (getkword), et c'est de même avec la plupart des fonctions (get-) en général, retourne nil ! Autrement dit cela te retourne une entrée vide. Il faut savoir que la manière dont on écrit le texte d'un (getkword) n'est que pure syntaxe, mais cela ne signifie aucunement que c'est programmé nativement pour fonctionner ainsi. C'est simplement ainsi que AutoCAD fait la séparation entre simple texte, options et valeurs par défaut donc pour ne pas perdre l'utilisateur on copie cette syntaxe. Un simple exemple, sur ton (initget "Oui Non") (setq rep1 (getkword "\nContinuer ? [Oui/Non] <Oui>: ")) Écrire les options entre crochets et séparées par un slash est une simple écriture autocadienne vis-à-vis des options. Car en effet si tu écris juste cette ligne (setq rep1 (getkword "\nContinuer ? [Oui/Non] <Oui>: ")) les options vont-elles apparaître comme des options ? Non et ce malgré le fait que la syntaxe soit celle d'AutoCAD, n'est-ce pas ? Donc pour que le programme comprenne que la syntaxe [Oui/Non] doit être un ensemble d'options composé de Oui et Non, il y a besoin de le signifier nous même par de la programmation via (initget "Oui Non") Et bien pour les valeurs par défaut c'est pareil, si on ne programme pas une valeur par défaut, alors le programme ne pourra pas interpréter correctement ta syntaxe pour faire fonctionner ton programme comme souhaité. Or pour cela, il ne faut pas passer par (initget) mais justement comprendre ce que signifie réellement l'action de faire une validation à vide. Car pour (getkword), soit on répond via les options (et cela retourne donc l'option choisie), soit on rentre une chaîne de caractères arbitraire (et cela retourne donc une chaîne de caractères), soit on répond juste entrée (et cela retourne nil). Autrement dit, dans tous les cas un (getkword) retourne une chaîne de caractères SAUF si on fait une validation à vide (équivalent à choisir la valeur par défaut). En comprenant alors cette subtilité, tu peux donc mieux comprendre la réponse de VDH-Bruno : (initget "Oui Non") (setq rep1 (cond ((getkword "\nContinuer ? [Oui/Non] <Oui>: ")) ("Oui"))) impliquant ainsi d'affecter à la variable 'rep1', soit n'importe quelle chaîne de caractères retournée par (getkword) soit la chaîne de caractères "Oui" dans le cas où le (getkword) retourne nil (correspondant à un utilisateur ayant souhaité choisir la valeur par défaut). A titre d'exemple, cela fonctionne également (initget "Oui Non") (setq rep1 (cond ((getkword "\nContinuer ? [Oui/Non] <?>: ")) ("?"))) ici la valeur par défaut "?" n'apparaît pas dans le (initget) et pourtant elle fonctionne et remplie parfaitement sont rôle de valeur par défaut. Bisous, Luna
  9. Coucou, Ceci n'est pas une amélioration mais une adaptation spécifique à ton besoin 😜 Essaye ceci (je ne l'ai pas testé) : (defun c:RENAMETAGNEN (/ lst old new ss) (vl-load-com) (or *acad* (setq *acad* (vlax-get-acad-object))) (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*))) (setq lst '(("XXXXXXXXXXXXXX" . "DESIGNATION") ("XX-X-XXXX" . "NUMERO") ("XXXX" . "SURFACE") ("XX-XX" . "DIVERS"))) (if (ssget '((0 . "INSERT") (66 . 1))) (progn (vlax-for blk (setq ss (vla-get-ActiveSelectionSet *acdoc*)) (foreach att (vlax-invoke blk 'GetAttributes) (if (setq old (assoc (strcase (vla-get-TagString att)) lst)) (vla-put-TagString att (cdr old)) ) ) ) (vla-Delete ss) ) ) (princ) ) Bisous, Luna
  10. Coucou, Peut-être que je dis des bêtises mais un simple champ dynamique pointant sur la valeur de l'attribut souhaité n'est-il pas possible ? D'autant plus que si je comprends bien ceci la valeur de tes attributs peut changer après que la valeur ait été copiée dans un texte. Donc le plus sage serait d'insérer un champ dans ton texte pour conserver cet aspect "changeant" de ton attribut. Donc TEXTE > Insérer un champ > Objet > Sélection du bloc désiré > [Nom de l'attribut dans la liste des propriétés visibles] Bisous, Luna
  11. Coucou, Je pense surtout vient du fait qu'une ligne de repère multiple (comme son nom l'indique) est en mesure de posséder de multiple flèches pour un seul champ texte. Donc peut-être n'ont-ils pas trouvé de solutions simples/viables à intégrer à AutoCAD. Ceci n'est qu'une supposition 🙂 Bisous, Luna
  12. Coucou @THBDM, Pas testé mais cela convient-il à la demande ? (defun c:ROT180TXT (/ jsel i name n a) (if (setq jsel (ssget '((0 . "MTEXT,TEXT")))) (progn (repeat (setq i (sslength jsel) n i) (setq name (ssname jsel (setq i (1- i))) a (cdr (assoc 50 (entget name))) ) (or (entmod (subst (cons 50 (+ a pi)) (assoc 50 (entget name)) (entget name) ) ) (ssdel name jsel) ) ) (sssetfirst) (sssetfirst nil jsel) (prompt (strcat "\nSuccessfully rotated " (itoa (sslength jsel)) "/" (itoa n) " text(s)")) ) ) (princ) ) Une variante ci-dessous pour permettre à l'utilisateur de choisir la valeur de l'angle de rotation : (defun c:ROTANGTXT (/ val jsel i name n a) (if (setq jsel (ssget '((0 . "MTEXT,TEXT")))) (progn (or (setq val (getreal "\nEnter the rotation angle (°) or <180> : ")) (setq val 180) ) (setq val (/ (* val pi) 180.)) (repeat (setq i (sslength jsel) n i) (setq name (ssname jsel (setq i (1- i))) a (cdr (assoc 50 (entget name))) ) (or (entmod (subst (cons 50 (+ a val)) (assoc 50 (entget name)) (entget name) ) ) (ssdel name jsel) ) ) (sssetfirst) (sssetfirst nil jsel) (prompt (strcat "\nSuccessfully rotated " (itoa (sslength jsel)) "/" (itoa n) " text(s) with an angle of " (rtos (/ (* val 180) pi) 2 2) "°")) ) ) (princ) ) Pas testé non plus... Bisous, Luna
  13. Coucou, Dans ce cas faut-il considérer de mettre en rouge uniquement si 2 (ou plus) segments ont un sommet commun et sont colinéaires, autrement dit si le segment 1 était au niveau du point bas de la polyligne 5, tu aurais 4 segments en rouge, c'est bien cela ? Que se passe-t-il en cas de chevauchement entre les segments ? Ou en cas de doublon des segments ? Ensuite tu suggères de décomposer les polylignes en lignes, cela signifie qu'à la fin du programme tu acceptes le fait que tes objets aient été modifiés (polylignes > lignes) ou bien il faut que le programme reste transparent et donc "recompose" tes polylignes à la fin ? S'il faut recomposer, comment peut-on passer des segments spécifiques d'une polyligne en rouge ? Bisous, Luna
  14. Coucou, Il existe également la possibilité de travailler avec des MLINE mais d'un point de vue prise en main/modification, cet outil est totalement archaïque...Mais cela te permettrait de dessiner des murs avec certaines épaisseurs, à partir de l'axe et donc d'avoir à la fois le métré des murs et les cotations juste en ne dessinant les murs qu'une fois. Il existe également les mathématiques, après tout si tu utilises une polyligne fermée pour tes murs, que les murs ont une épaisseur constante, alors la longueur du mur à l'axe sera égale au périmètre de la polyligne moins 2 fois l'épaisseur du mur, me tout divisé par 2. Et chat c'est vrai tout le temps à partir du moment où tes polylignes sont fermées avec un décalage constant. Bisous, Luna
  15. Coucou, @dc01, la dénomination des références de blocs ayant un *U--- c'est lorsque les blocs possèdent des propriétés dynamiques. Or ici le bloc créé n'est pas dynamique si mes souvenirs sont bons via la commande TotalArea. @Dersou Je ne connais pas par cœur la structure du programme de Pline_Block et TotalArea mais il peut y avoir plusieurs solutions à ton problème. Cependant tout va dépendre de ce dont tu as réellement besoin de faire EN PLUS de ces programmes. Ce que je suggère c'est de laisser ces programmes intacts et de créer un autre programme pour gérer ce que tu souhaites faire en plus (cela permet que si tu as un problème de fonctionnement sur le programme TotalArea par exemple, l'auteur pourra plus facilement corriger le soucis car tout le monde aura le même). Normalement TotalArea créé un bloc avec un attribut dont sa valeur est un champ dynamique objet. Ce champs utilise donc l'ID de la polyligne que tu as dû sélectionner et affiche la propriété "Aire". Cela se traduit par une chaîne de caractère un peu spéciale qu'AutoCAD est capable de lire (ex: %<\AcObjProp Object(%<\_ObjId 2294000122144>%).Area \f "%lu2">% ). Il existe donc plusieurs façons de retrouver le calque de la polyligne à partir du bloc, notamment en utilisant l'ID de la polyligne apparaissant dans le champ dynamique. Le plus simple serait d'avoir un .dwg d'exemple affichant clairement les données de base ainsi que le résultat final (et si possible les étapes souhaitées pour y parvenir). Evidemment si tu as besoin que l'on t'aide à développer un programme il nous faut un maximum d'infos sur ce que tu souhaites au final. Bisous, Luna
  16. Coucou @drault, La routine de @didier ci-dessus permet de conserver le zoom actuel lors d'un changement de SCU. Car actuellement le fonctionnement d'AutoCAD veut que avec UCSFOLLOW = 1, un changement de SCU applique automatiquement une rotation du dessin pour aligner les axes X, Y, Z aux axes horizontal, vertical, altitude mais cela effectue également un ZOOMTOUT (affichant l'origine SCG du dessin), posant ainsi de très gros problème lors de plans géolocalisés ou tout simplement lorsqu'on travail en détail et que l'on change le SCU momentanément pour mieux tracer un détail. Ce programme nécessite donc d'avoir UCSFOLLOW = 0, dissociant ainsi le changement de SCU avec la "rotation" du dessin mais à mes yeux, c'est tout bonnement un must have car il est primordial de conserver l'état de zoom actuel lorsqu'on dessine :3 Concernant ta demande pour le changement du UCSFOLLOW, tu peux te baser sur ce programme que j'avais fait pour modifier/harmoniser la valeur de PSLTSCALE sur l'ensemble des onglets de présentations : Car comme PSLTSCALE, la variable UCSFOLLOW est indépendante pour chaque présentation. Cependant cela ne modifiera pas la valeur de UCSFOLLOW pour les fenêtres de présentations affichant l'espace objet. Si cela doit également être modifié, je verrais ce que je peux faire. Bisous, Luna
  17. Luna

    3D Orbit

    Coucou, Il me semble que les versions LT ne supportent pas les objets 3D, je suppose donc que l'orbite 3D n'existe pas non plus. De ce fait il serait impossible de créer cette commande pour LT (mais peut-être que je me trompe pour le coup). Bisous, Luna
  18. Coucou, C'est théoriquement possible mais comme tes 2 tableaux sont dans 2 présentations différentes, il faut triffouiller un peu. Pour y parvenir il faut insérer un champ dynamique (formule) dans le tableau cible et connaître l'ID de ton tableau source. Pour connaître l'ID de ton tableau je te suggère de simplement créer un objet texte > faire un clic droit dans l'éditeur de texte > insérer un champ > Formule > Cellule > Cliquer sur la cellule du tableau source que tu souhaites lier à ton second tableau. Tu devrais obtenir une ligne comme ceci : La ligne qui nous intéresse est celle surlignée ci-dessus en jaune. Tu fais un CTRL+C de cette ligne, puis tu peux fermer la fenêtre et supprimer l'objet texte (il était juste temporaire pour récupérer l'ID du tableau). Tu prends ensuite ton second tableau et tu insères un champs dans la cellule de ton choix (encore une fois il s'agit d'une formule) en collant la valeur précédemment copiée dans l'expression de formule. Tu peux fermer la fenêtre en appuyant sur OK et tes deux tableaux sont liés (si tu modifies la valeur dans le tableau source, la valeur dans le tableau cible se met à jour après un REGEN) 😛 Tu remarqueras d'ailleurs que l'expression de la formule est en fait l'ID du tableau "Table(2410179017920)" suivi des coordonnées de la cellule "B2", séparé par un point "." Tu peux donc changer facilement les coordonnées de la cellule si besoin sans repasser par un texte temporaire ! Attention tout de même, car il se peut que le lien casse (mais cela m'est arrivé assez rarement). Bisous, Luna
  19. Coucou @sylarr, Aurais-tu ce petit lisp sous la main à distribuer ? 😄 On est d'accord que psltscale est propre à chaque fichier et même chaque onglet objet/presentation1/presentation2 ? En effet la variable PSLTSCALE est indépendante entre chaque présentation (mais hérite de la valeur de la présentation parent lors d'une duplication d'onglet de présentation). J'ai pour habitude d'utiliser une commande pour harmoniser la valeur de PSLTSCALE dans l'ensemble du dessin. Je préfère avoir une commande LISP pour permettre aux gens de choisir la valeur plutôt que de forcer 0 ou 1, car selon les habitudes de chacun chat peut changer. Ci-dessous un exemple de code pouvant répondre à ta demande (je n'ai pas trouver d'autre moyen que de charger chaque présentation pour en changer la valeur, donc cela peut prendre quelque temps parfois..). Je n'ai pas vraiment eut le temps de le tester : (defun c:PSLTSCALECHANGE (/ layouts layout i) (setq layouts (layoutlist) layout (getvar "CTAB") ) (initget "0 1") (if (null (setq i (getkword "\nNouvelle valeur de PSLTSCALE [0 1] <0> : "))) (setq i 0) (setq i (atoi i)) ) (foreach l layouts (setvar "CTAB" l) (setvar "PSLTSCALE" i) ) (setvar "CTAB" layout) (princ (strcat "\nLa variable PSLTSCALE a été définie sur " (itoa i) " pour les " (itoa (vl-list-length layouts)) " présentations.")) (princ) ) Pour changer la valeur d'une variable à chaque ouverture de dessin, il suffit d'ajouter les lignes suivantes en dehors d'un (defun) et de charger le fichier .lsp en automatique pour chaque ouverture de dessin : (setvar "ECHLTP" 1) (setvar "MSLTSCALE" 0) Voir ce >>sujet<< pour le chargement automatique d'un LISP à chaque ouverture de dessin. Bisous, Luna
  20. Coucou, @Apertolibro57, j'insiste sur le fait qu'un DWG d'exemple permettrait de t'aider au mieux et plus efficacement (pour les phases de tests, mais aussi pour mieux adapter le programme à tes besoins). Concernant le (ssget), c'est difficile de t'expliquer comme chat, mais dit toi que c'est le même principe que si tu sélectionnes plusieurs références de blocs dans ton espace objet : tu peux modifier leurs attributs, visibilités, propriétés en une seule fois via la palette propriétés. Après c'est un simple jeu de sélection/désélection pour affecter les propriétés communes aux bonnes références et isoler les références qui doivent être modifiées individuellement. @Curlygoth, pour le coup je ne dirais pas que le VBA et plus simple que le LISP ou inversement. Tout dépends de notre logique de réflexion et de notre compréhension du langage. Car pour le coup le LISP c'est aussi de l'anglais ^^ Pour ma part, je n'ai eut aucune difficultés à apprendre le LISP et faire ce que je souhaitais avec en peu de temps tandis que le VBA me pose encore et toujours des migraines. La vrai différence notable entre le VBA et le LISP c'est la simplicité de création d'une boîte de dialogue en VBA comparé au DCL+LISP 😜 Bisous, Luna
  21. Coucou, Je n'ai pas de dispo aujourd'hui pour te fournir des exemples concrets de programmation mais la manière dont le LISP GEF est présenté diffère de ta version : Le LISP GEF utilise ce qu'on appelle une (list_box) en langage DCL (c'est le langage utilisé pour créer les boîte de dialogue en LISP). Une (list_box) permet en effet d'avoir une liste d'éléments avec une barre de défilement si le nombre de lignes dépasse la hauteur maximale autorisée pour la (list_box). Or ce que tu cherches à faire, c'est d'avoir pour chaque ligne (= présentations), une case à cocher (ce qui correspond à un (toggle) en DCL) et d'une liste déroulante (list_box) pour les visibilités. Bien que l'utilisation de la case à cocher peut être évitée en utilisant le fonctionnement de GEF, tu n'auras pas moyen de choisir la visibilité pour chacune des présentations sélectionnées. On pourrait cependant envisager de définir une visibilité commune pour les présentations sélectionnées mais du coup cela serait moins intuitif. On pourrait également prévoir d'afficher plus de lignes en affichant le nom de présentation + nom de visibilité et donc décliner pour chaque présentation toutes les visibilités possible pour le bloc (mais du coup, si le bloc possède 4 visibilités par exemple, et que tu as 10 présentations, alors la liste possèdera 40 lignes, 4 pour chaque présentations). Bref, il faudra trouver des compromis par rapport à ton exemple de DCL 🙂 Concernant le (ssget), je pourrais te proposer quelques exemples demain, mais cela serait plus simple d'avoir un .dwg d'exemple pour tester et te montrer ce qui pourrait être faisable. Un simple (ssget) ne fonctionnera évidemment pas car tu as des blocs dynamiques mais j'avais développé une fonction que j'utilise tous les jours pour filtrer mes sélections (cependant elle n'est pas facile d'utilisation et encore bien incomplète par rapport au fonctionnement souhaitée). Bisous, Luna
  22. Coucou, Question bête mais, la plage de cellule que tu souhaites insérer est-elle nommée (dans Excel) ? La liaison de données ne peut se faire sur une plage spécifique si elle ne possède pas un nom. Pour définir un nom à une plage de données, regarde >>ici<<. Bisous, Luna
  23. Coucou, Lorsque je faisais allusion aux listes déroulantes pour l'affichage des présentations, je faisais référence à celle-ci : Autrement dit, si tu as 10 présentations dans ton dessin, ta boîte de dialogue aura 10 lignes. Si tu as 30 présentations, 30 lignes, etc... Cela signifie que à partir d'un certain nombre de présentations, ta boîte de dialogue aura une hauteur supérieure à la hauteur d'affichage de ton écran, d'où ma remarque sur les problèmes que cela peut engendrer (aussi bien côté utilisation que programmation). Ensuite, si je comprends bien la colonne de droite correspond à la liste de l'ensemble des attributs en commun dans ta définition de bloc, c'est bien cela ? Autrement dit, si plusieurs présentations sont cochées, la valeur de l'attribut correspondra soit à la même valeur actuelle (dans le cas où l'ensemble des présentations cochées possèdent la même valeur) sinon, à une valeur arbitraire (comme *VARIEES*) dans le cas où au moins l'une des valeurs est différentes. Car en me basant sur mon expérience personnelle, j'ai tendance personnellement à passer par un filtre de sélection et à gérer ces valeurs d'attributs communs via la fenêtre de propriétés (idem pour les visibilités). En effet, bien qu'il ne soit pas possible de sélectionner manuellement des blocs appartenant à des espaces de présentations différents, cela est possible via la programmation (via la fonction (ssget) notamment). Et en conservant le jeu de sélection ainsi créé, la palette de propriété affiche les propriétés du jeu de sélection (autrement dit, l'ensemble des blocs sur les présentations différentes). Modifier ensuite les valeurs communes d'attributs, les visibilités ou lancer une commande sur le jeu de sélection (dans la limite d'AutoCAD, certaines commande ne fonctionneront pas si la présentation n'est pas courante) est tout à fait faisable en un seul clic. Bisous, Luna
  24. Coucou, En un sens, cela me semble réalisable (dans les grandes lignes et en théorie) cependant cela représente un programme complexe. Habituellement une demande comme celle-ci ne devrait pas être quémandée sur des forums bénévoles... En me basant simplement sur ton image (je tiens à souligner tout de même que tu as fait l'effort de fournir toutes les données d'entrées d'emblée, c'est rare !), je dirais que ce qui ne sera pas forcément faisable c'est l'aspect "liste déroulante" pour afficher l'ensemble des présentations. A mes yeux il n'est pas faisable de faire cela et donc plus le nombre de présentations sera important, plus le nombre de lignes sera important et donc par extension, la hauteur de la boîte de dialogue. Bisous, Luna
  25. Coucou, Je pense qu'il y a une erreur de vocabulaire (soit dans ton explication, soit dans ton programme), car tu as (defun c:BOUCLE() donc il s'agit d'une commande, et non d'une fonction étant donné que le nom est précédé d'un c: Je n'ai pas vraiment lu ton programme dans sa globalité, mais je ne pense pas que l'écriture soit des plus optimisée... La commande BOUCLE exécute ceci : (progn (while (< (getvar "cmdactive") 0) (Command pause) ) (FISS) (princ) ) mais si l'on regarde la fonction FISS, tu exécutes ceci au niveau de la seule utilisation de (BOUCLE) : (progn (while (< (getvar "cmdactive") 0) (Command pause) ) (BOUCLE) ;la commande est renouvelée (princ) ) Donc je ne comprends pas bien à quoi sert la commande/fonction BOUCLE étant donné que si tu peux sortir du (while) de FISS avant l'exécution de (BOUCLE), alors tu n'entreras même pas dans le (while) situé dans (BOUCLE).... et autrement dit cela reviendrait à juste exécuter (FISS) de nouveau ! Et pour cela rien de plus simple, tu supprimes le (defun c:BOUCLE ...) et tu remplaces le (BOUCLE) par (FISS) dans ta fonction FISS ^^ Je n'ai pas testé mais cela peut être une piste de recherche, car j'ai comme l'impression que tu te compliques un peu trop la vie 😉 Bisous, Luna
×
×
  • 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é