-
Compteur de contenus
95 -
Inscription
-
Dernière visite
-
Jours gagnés
6
Tout ce qui a été posté par >>NicoM
-
Optimisation de l'insertion de blocs avec des attributs
>>NicoM a répondu à un(e) sujet de >>NicoM dans Routines LISP
J'ai finis par y arriver avec cette fonction : (defun SetAttributeRotationAndValue (blockEnt pair rotation / tag value attrib attribs) (setq tag (car pair)) ;; Le tag de l'attribut (setq value (cdr pair)) ;; La valeur associée (setq attribs (vlax-safearray->list (vlax-variant-value (vla-getattributes (vlax-ename->vla-object blockEnt))))) ;; Récupère les attributs du bloc ;; Parcours des attributs pour trouver le bon et appliquer les modifications (foreach attrib attribs (if (eq tag (vla-get-tagstring attrib)) ;; Vérifie si le tag correspond (progn (vla-put-rotation attrib rotation) (vla-put-textstring attrib value) ) ) ) ) que j'appel comme ceci : (setq blockEnt (entlast)) (SetAttributeRotationAndValue blockEnt pair90 1.5708) -
Optimisation de l'insertion de blocs avec des attributs
>>NicoM a répondu à un(e) sujet de >>NicoM dans Routines LISP
Voici la boucle actuelle. Elle fonctionne bien en l'état, mais j'ai un attribut, stocké dans la pair90 qui doit avoir une rotation de 90°. la fonction "gc:SetAttributeValue" fonctionne très bien mais je ne parviens pas a rajouter le paramètre de rotation. J'ai parcouru tous les outils disponible dans la code "block" mais je n'y arrive pas. Pouvez-vous m'aider ? ;; --- BOUCLE POUR LES POTEAUX --- (setq row 0) (while (< row nb-row) ;; Récupération de la liste courante (setq lst (nth row data-list)) ;; Liste d'association des noms de propriété dynamique aux valeurs récupérées (setq pairs (mapcar '(lambda (tag index) (cons tag (vl-princ-to-string (vlax-variant-value (nth index lst))))) ; Convertir la valeur en chaîne '("ID" "AXB" "H" "D" "C" "S1" "L1" "S2" "L2" "fX2" "fY2" "S31" "L31" "fY31" "BETON" "POIDS" "RATIO" "NB") '(0 1 2 3 4 5 6 9 10 11 12 13 14 15 19 20 21 22) ) ) ;; Liste d'association des noms de propriété dynamique aux valeurs récupérées (setq pair90 (cons "FL11" (vl-princ-to-string (vlax-variant-value (nth 7 lst))))) (setq pair63 (cons "FL12" (vl-princ-to-string (vlax-variant-value (nth 8 lst))))) ;; Conversion explicite des coordonnées en réel (setq pos_X (vlax-variant-value (nth 23 lst))) (setq pos_Y (vlax-variant-value (nth 24 lst))) ;; insertion du poteau (setq insertion-point (list pos_X pos_Y 0)) (if (setq ent (gc:InsertBlockReference "# ptx 2 rangs - Barre droite" insertion-point 0. 1. nil)) (foreach pair pairs (gc:SetAttributeValue ent (car pair) (cdr pair)) ) ) ;; Incrémentation de l'index pour passer à l'itération suivante (setq row (1+ row)) ) -
Optimisation de l'insertion de blocs avec des attributs
>>NicoM a répondu à un(e) sujet de >>NicoM dans Routines LISP
Merci ! C'est exactement ce qu'il me fallait ! J'avais bien cherché sur la page en question, mais je n'avais pas trouvé le "block". Je suis admiratif de tout le travail qui a été fait, c'est impressionnant ! J'ai testé en corrigeant certaines choses et ça fonctionne en l'état. Je vais néanmoins faire une autre version en passant par "gc:SetAttributeValue" au lieu de "gc:SetDynPropValue" et je la partagerais ici. Petite question bonus, maintenant lors de l'exécution de la commande, mon espace Autocad se fige jusqu'à la fin de l'exécution. N'y a t-il pas moyen de visualiser l'insertion des blocs en temps réel, ou au moins avoir une petite idée de l'avancement via la console ? -
Optimisation de l'insertion de blocs avec des attributs
>>NicoM a répondu à un(e) sujet de >>NicoM dans Routines LISP
Grace à ce sujet, https://cadxp.com/topic/54262-lire-la-valeur-dun-attribut-de-bloc/ j'ai enfin réussi à trouver par ou passer pour accéder aux attributs du bloc. Ce n'est encore ni optimisé, ni adapté a mon cas, mais ça fonctionne : (defun modify-attributes (blk) (if (and blk (eq (cdr (assoc 0 (entget blk))) "INSERT")) ; Vérifie que c'est un bloc (progn ;; Vérifie si le bloc contient des attributs (if (assoc 66 (entget blk)) (progn (setq textattrib (entnext blk)) ; Première entité suivante ;; Parcourt les attributs du bloc (while (= (cdr (assoc 0 (entget textattrib))) "ATTRIB") (setq attrib-data (entget textattrib)) ; Récupère les données DXF de l'attribut ;; Si l'attribut a pour tag "ID", on modifie sa valeur (if (= (cdr (assoc 2 attrib-data)) "ID") (progn (setq new-attrib (subst (cons 1 "P66") (assoc 1 attrib-data) attrib-data)) ; Changer la valeur de l'attribut "ID" (entmod new-attrib) ; Appliquer la modification ) ) ;; Si l'attribut a pour tag "AXB", on modifie sa valeur (if (= (cdr (assoc 2 attrib-data)) "AXB") (progn (setq new-attrib (subst (cons 1 "20x50") (assoc 1 attrib-data) attrib-data)) ; Changer la valeur de l'attribut "AXB" (entmod new-attrib) ; Appliquer la modification ) ) (setq textattrib (entnext textattrib)) ; Prochaine entité ) ) ) ) (princ "\nL'entité sélectionnée n'est pas un bloc ou n'a pas d'attributs.") ) (princ) ) (defun c:ModifyAttribs () (setq blk (car (entsel "\nSélectionnez un bloc : "))) ; Sélection du bloc (if blk (progn (modify-attributes blk) (princ "\nAttributs modifiés.") ) (princ "\nAucun bloc sélectionné.") ) (princ) ) -
Bonjour, Cela fait un moment que je n'ai pas posé de question sur ce forum, mais je suis bloqué sur un problème et j'aimerais obtenir des conseils. Je cherche à insérer un bloc comportant plusieurs attributs dans AutoCAD, en affectant leurs valeurs directement depuis une feuille Excel. Actuellement, j'ai une version fonctionnelle qui affecte les propriétés au dernier bloc inséré, et les attributs récupèrent et compilent ces propriétés. Cependant, le temps d'exécution est assez long, et j'aimerais optimiser ce processus (voir code ci-dessous). Mon objectif serait de sauter l'étape intermédiaire des propriétés et d'intégrer directement les attributs dans le bloc. Il me semblait qu'avec Entmake, Attdef et Attrib, c'était plus rapide et relativement simple, mais je n'arrive pas à comprendre leur fonctionnement. En parcourant le code Edit_bloc3.5 de (gile), j'ai l'impression d'être encore plus perdu qu'au départ. Auriez-vous des suggestions pour optimiser le temps d'exécution et simplifier ce processus ? Merci d'avance pour votre aide ! ;; BOUCLE POUR LES POTEAUX (setq index 0) (while (< index nb-row) ;; Récupération de la liste courante (setq lst (nth index data-list)) ;; Liste des variables à définir (setq var1 '(ID A B phi H D C Nb N1 N1_larg N1_long S1 L1 fL1 fL2 N2 S2 E2 L2 fX2 fY2 N31 N312 S31 E31 L31 fY31 N32 N322 S32 E32 L32 fX32 V_béton P_tot Ratio pos_X pos_Y visi_sch)) ;; Liste des indices correspondants dans lst (setq ind1 '(6 7 8 9 10 11 12 15 16 17 18 19 20 21 22 24 25 26 27 28 29 32 33 34 35 36 37 40 41 42 43 44 45 50 51 52 61 62 63)) ;; Association des variables aux valeurs récupérées (mapcar '(lambda (var index) (set var (vlax-variant-value (nth index lst)))) var1 ind1) ;; Conversion explicite des coordonnées en réel (setq pos_X (if (numberp pos_X) pos_X (atof pos_X))) (setq pos_Y (if (numberp pos_Y) pos_Y (atof pos_Y))) ; insertion du poteau (setq insertion-point (list pos_X pos_Y 0)) (command "_-insert" "# ptx 2 rangs - Barre droite" insertion-point 1 1 0) (setq ent (entlast)) ; attribution des propriétés (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "ID") ID) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "A") A) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "B") B) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "phi") phi) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "H") H) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "D") D) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "C") C) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "Nb") Nb) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "N1") N1) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "S1") S1) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "L1") L1) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "fL1") fL1) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "fL2") fL2) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "N2") N2) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "S2") S2) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "E2") E2) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "L2") L2) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "fX2") fX2) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "fY2") fY2) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "N31") N31) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "N312") N312) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "S31") S31) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "E31") E31) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "L31") L31) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "fY31") fY31) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "N32") N32) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "N322") N322) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "S32") S32) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "E32") E32) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "L32") L32) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "fX32") fX32) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "N312") N312) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "V_béton") V_béton) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "P_tot") P_tot) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "Ratio") Ratio) ; insertion du schéma (setq insertion-point (list (+ 454 pos_X) (- pos_Y 17) 0)) (command "_insert" "# Schéma ptx Y2" insertion-point 1 1 0) (setq ent (entlast)) ;; Liste des variables à définir (setq variables3 '(N1_larg N1_long visi_sch)) ;; Liste des indices correspondants dans lst (setq propriétés3 '("X" "Y" "Visibilité1")) ;; Association des variables aux valeurs récupérées (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "Y") N1_larg) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "X") N1_long) (setpropertyvalue ent (strcat "AcDbDynBlockProperty" "Visibilité1") visi_sch) ;; Incrémentation de l'index pour passer à l'itération suivante (setq index (1+ index)))
-
Personnellement je me sers d'une famille de "Symbole de sens de portée" pour la bulle et d'un élément de détail pour y ajouter le sens de portée. Tu peux ainsi facilement choisir la direction, la longueur et la visibilité.
-
Oui j'ai vu ça ! Mais j'ai l'impression que ce n'est que la page d'acceuil. Par ce lien ça marche : https://www.da-code.fr/vs-code-le-debut/#
-
Dessinateur (salaire / opinion)
>>NicoM a répondu à un(e) sujet de Nico59 dans Emploi, monde du travail
Dessinateur projeteur béton Diplôme : DUT GC (bac+2) Exp : 9 ans Salaire : 45k€ brut annuel (2.6 BTC 😁) pour 39h/semaine. Ca peut paraitre élevé, mais je maitrise bien Revit et d'Autocad. Grosse plus value en terme de productivité. Peu importe le métier, la seule question à se poser est : "Suis-je facilement remplaçable ?" -
Personnellement pour ça je passe par les propriétés personnalisés du document. Par contre j'utilise les champs, pas les attributs.
-
Je suis loin d'être un expert, mais essai avec "alert" à la place de "print" a la fin de ton code.
-
Et il ne peut pas rentrer en conflit avec un autre filtre ? Les filtres les plus haut dans la liste remplacerons ceux qui sont plus bas. Si un seul des filtres concernant le même type d'objet vient appliqué un masquage, peut importe les autres filtres. Aucun conflit ?
-
Non effectivement ça a l'air bien construit. Et dans les filtres en eux même tu as bien décoché la visibilité ? Ce n'est pas normal que ton "n'est pas égal" affiche les ventouses et gâche.
-
Je pense qu'il s'agit plus de tes paramètres, que de tes filtres. De quel type de paramètre s'agit t'il ? Pour ma part, je préfère passer par des paramètres type "oui/non" pour ce genre de règles de filtrage. Voici un exemple de filtre que j'avais réalisé pour contourner le phasage Revit était trop rigide à mon gout: Commence par regarder les paramètres de ta famille, je pense vraiment que le souci vient de là.
-
Problème affichage contextuel du ruban
>>NicoM a répondu à un(e) sujet de >>NicoM dans AutoCAD LT 2017
Super merci beaucoup ! Tout fonctionne ! Même en ayant parcouru toute les commandes de ta liste j'avais pas trouvé. C'était pas évident avec la description. "Contrôle si la sélection d'objet s'effectue avant ou après l'émission d'une commande. Mettre à 1 lorsque la touche SUPPR ne fonctionne plus." C'est pour ça qu'il faut toujours un vrai expert pour nos dépatouiller de ce genre de souci ! Encore Merci ! -
Bonjour à tous, Un de mes collègue de bureau à un problème que je ne parviens pas à résoudre... <_< Il s'agit de l'affichage contexte des propriété d'objet du ruban: Rien n'est selectionné, le calque courant s'affiche: Un objet est seléctionné, le calque de l'objet s'affiche: Le problème vient du fait que même en ayant des objets sélectionnés, le calque courant reste affiché, pas celui de l'objet... J'ai cherché dans les variable système et la seule qui semble correspondre à peu pret c'est "RIBBONCONTEXTESELECT" mais qui est obsolète depuis autocad 2015. (petite erreur sur la liste de REBCAO, qui est d'une grande aide au passage) Je ne sais plus comment faire pour l'aider... J'ai pas envi d'en arrivé à ré-instaler autocad... Quelqu'un a une idée ?
-
Ah ok, après une repas d'entreprise, je fais plus trop attention en fait ! x)
-
[Sondage] Votre opinion est importante pour Autodesk, participez au sondage
>>NicoM a répondu à un sujet dans CAO, généralités
j'ai également la sensation de ne pas être écouté... Je suis armé de patience, attendant que les bétonneux soient entendu ! -
Bonjour, Quand est-ce que sera corrigé le volume de voile dans la hauteur revêtement ? (quand le voile est attaché "haut / bas" aux dalles). actuellement il est encore compté dans les dalles et ça pose problèmes... Quand est-ce que sera corrigé les étiquettes de semelles qui ne s'aligne pas ? Peut-on modifier les style de traits , même si on a attaché les éléments entre eux ? Pour le moment on doit choisir entre une bonne représentation en coupe ou en plan... La possibilité de rajouter du gros béton sous les semelles filantes, c'est prévu ? Pour afficher les arases inf. de linteaux (familles de porte) comment doit-on s'y prendre ? Bref, beaucoup trop de question...
-
Tu as essayé "F9" ?
-
Je suis heureux d'avoir pu appuyer tes explications, j'aime bien ces petites anecdotes :) Merci pour cette routine qui a l'air très complète et bien commentée. Si j'arrive à bien comprendre son écriture, je pense que j'aurais fait un grand pas !
-
Graphiquement c'est exactement la même chose. Les différences se situent dans la manières de les mettre en place: Les coupes se génère avec 2 points et la profondeur de vue et plus ou moins aléatoire. Les élévations se génère en s'alignant sur un mur et sa profondeur de vue sera calée automatiquement une cinquantaine de centimètres derrière. C'est plus rapide quand on veux traiter d'un pan de façade. Le cadre de vue sera également défini automatiquement sur l'emprise global du bâtiment. Les options qui découle de ces deux type de vue sont identique.
-
Pour ma part, je ne me sert pas des élévations que Revit propose. Concrètement, il n'y a aucune différence !
-
S'agissant d'une famille de linteau (qui sont toujours au dessus d'une porte ou d'une fenêtre), l'intégrer à la famille de la porte permet d'insérer une famille au lieu de deux. Je propose juste une optimisation, aucune bidouille la dedans...
-
La solution du paramètre de rapport fonctionne très bien et devrait répondre à ta demande. Mais je te propose une solution alternative : Tu peux également charger ta famille d'ossature dans une famille de porte (qui est donc hébergée par un mur), faire correspondre les propriétés (me demander si besoin d'explication), cocher la case "partagé" dans le paramétrage du type de famille, puis charger le tout dans ton projet. Le fait de cocher la case partagée te permettras d'étiqueter l'ossature directement (grace à la touche TAB) bien qu'elle soit intégrée à la famille de porte.
-
Définir le paramétre d'inversion d'un bloc
>>NicoM a répondu à un(e) sujet de >>NicoM dans Débuter en LISP
Merci pour ce complément d'information, je ne connaissais pas cette commande qui peut m'éviter bien des soucis :D